본문 바로가기
코스웨어/15년 스마트컨트롤러

20150508 -6번 -김성현 ADC차동입력, 아날로그 비교기 및 Linked list

by 알 수 없는 사용자 2015. 5. 11.
728x90
반응형




<실제 프로그램>

JTAGEN- 에뮬레이터의 접속 표준
                     체크시- 에뮬레이터에 접속가능 (ADC4번 부터 사용불가) 
                    체크 해지시- 다른 용도로 사용 가능하다
     


OCDEN - PWM 활성화 시키는 것이라고 추정
BODLEVEL  - Brown out - 프로그램 다운 감지를 활성화
WDTON - watch dog  활성화 

단일입력은 0~1023처리 됨
차동입력은 부호가 있음 -512~511가 처리가 됨


<차동입력 ADC 세팅>
     
#include "smart.h"

int main(void)
{
  unsigned char i;
  DDRF = 0xFE
  DDRC= 0xFF;
  DDRG= 0XFF;
  
  ADC_Init();
  ADCSRA = 0b10000111;  // ADEN=1, ADPS2=1, ADPS1=1, ADPS0=1, 분주비 128, 125kHz

      ADEN을 1로 설정하면 A/D컨버터의 모든 동작이 허용되고
             0로 설정하면 A/D 컨버터의 모든 동작이 금지


  ADCSRB = 0b00000000;

  //avcc-5v인가 Differential ADC3(+),ADC2(-), ADRL=0      
  ADMUX = 0b01111011// ADMUX 5번bit(ADRL=1) MUX4=1, MUX3=1 MUX2=0, MUX1=1, MUX0=1





   /*차동 입력 시 ADCH부터 읽어줌, ADRL를 set 하는 것이 데이터 처리에 유리하다
    avcc-5v인가 Differential ADC3(+),ADC2(-),Gain(1x)
  */





      
    sum =0;
    for(i=0; i<16; ++i)
    {  
      ADCSRA = ((1<<ADEN) |(1<<ADSC)| (1<<ADIF)| (1<<ADPS2)| (1<<ADPS0));//0b11010101
      // ADIF=1, A/D 변환 완료 인터럽트를 요청
      while((ADCSRA & 0X10)!=0X10);
    //ADIF=1, 이 인터럽트가 처리되기 시작하면 이 플랙 비트는 다시 자동적으로 0으로 클리어 됨
      sum += (((((int)ADCH))<<8)+(int)ADCL)>>6);


    }
      
    sum =(sum/16); //sum >>=4;
  
  return 0;
}





PAGE 296 꼭 읽어서 정리 하십시오~

<아날로그 비교기>

ACSR 5번 BIT 빼고는 우리가 인의적으로 변경가능 

#include "smart.h"

int main()
{
  DDRA = 0xFF;  //OutPut: PORTA
  ACSR  =0b01000011// +입력 =1.1v



ACBG를 set하면 양극성 입력 AIN0에는 내부 기준 전압 1.1V가 선택되고,
0으로 하면AIN0단자로 입력되는 전압이 선택됨
 
   ADCSRA=0b00000000//ADEN =0
 0로 설정하면 A/D 컨버터의 모든 동작이 금지 
  ADCSRB=0b01000000//ACME=1
  ADMUX =0b00000001//-입력 =ADC1


   while(1)
  {
    if((ACSR & 0b00100000)==0b00100000)
    {
      PORTA=0xF0;
    }
    else
    {
      PORTA=0X0F;
    }
  }
    return 0;
}



---------------------------------------------S.W-------


압축 명령어 tar
gnu에서 사용하는 것
-gzip = gnu zip

linux에서는 지울때 조심 해야 한다
rm -rf 
r는 물어 보지 않음
f는 다 지우는 것
rf/하면 다 날라감   /가 root




 #include <stdio.h>
 #include <stdlib.h>
 #pragma pack(1)

 typedef struct _node
 {
     int iNum;
     struct _node *sTnext;

 }Node;
 #pragma pack(4)

 int main()
 {
     Node * head=0;
     head=malloc(sizeof(Node));

     head->iNum=100;
     head->sTnext=malloc(sizeof(Node));

      head->sTnext->iNum=200;
      head->sTnext->sTnext=malloc(sizeof(Node));
      head->sTnext->sTnext->iNum=300;
      head->sTnext->sTnext->sTnext=0;

 //출력 방법//
      printf("%d->", head->iNum);
      printf("%d->", head->sTnext->iNum);
      printf("%d->", head->sTnext->sTnext->iNum);
      printf("NULL\n");

     free(head->sTnext->sTnext);
     free(head->sTnext);
     free(head);

    return 0;
}

코드가 계속 증가 되지 않도록 세련되게 코드 수정
코드를 보면 head->sTnext가 주로 중복 되므로 
temp라는 변수를 지정

main함수를 너덜너덜 하게 만들기

#include <stdio.h>
#include <stdlib.h>

#pragma pack (1)

typedef struct _node{
    int inum;
    struct _node * stNext;
}Node;

#pragma pack (4)

void node_print(Node * temp);
void node_free(Node * head);

int main(){
    Node * head = 0;
    head = malloc(sizeof(Node));

    head->inum = 100;
    head->stNext = malloc(sizeof(Node));
    head->stNext->inum = 200;
    head->stNext->stNext = malloc(sizeof(Node)); 
    head->stNext->stNext->inum = 300;
    head->stNext->stNext->stNext = 0;

    node_print(head);
    node_free(head);

    return 0;
}

void node_print(Node * temp)
{
     while(temp != 0)
      {
          printf("%d -> ", temp->inum);
          temp = temp->stNext;
           } 
        if(temp == 0)
  {
        printf("NULL\n");
      }
}

void node_free(Node * head)
{
   Node * temp = 0;
   
    while(head != 0)
  {
            temp = head->stNext;
            printf("[%d] Node Free\n", head->inum);
            free(head);
            head = temp;
      }
    printf("\n");








728x90