본문 바로가기

[삽질노트][Zigbex]ADC

반응형
//-----------포트 설정


#define PORTF (*(volatile unsigned char *)0x62)
#define DDRF (*(volatile unsigned char *)0x61)

#define PORTA (*(volatile unsigned char *)0x3B)
#define DDRA (*(volatile unsigned char *)0x3A)

#define PORTE (*(volatile unsigned char *)0x23)
#define DDRE (*(volatile unsigned char *)0x22)


//-----------ADC 설정

#define ACSR (*(volatile unsigned char *)0x28)

#define ADMUX (*(volatile unsigned char *)0x27)

#define ADCSRA (*(volatile unsigned char *)0x26)

#define ADCH (*(volatile unsigned char *)0x25)

#define ADCL (*(volatile unsigned char *)0x24)

//---------USART 레지스트리 설정

   
#define UDR0 (*(volatile unsigned char *)0x2C)

#define UCSR0A (*(volatile unsigned char *)0x2B)

#define UCSR0B (*(volatile unsigned char *)0x2A)

#define UCSR0C (*(volatile unsigned char *)0x95)

#define UBRR0L (*(volatile unsigned char *)0x29)

#define UBRR0H (*(volatile unsigned char *)0x90)


   

//--------- 통신 값 설정

   

#define CPU_CLOCK 7372800

#define BAUD_RATE 57600

#define BAUD_RATE_L (CPU_CLOCK/(16l*BAUD_RATE))-1

#define BAUD_RATE_H ((CPU_CLOCK/(16l*BAUD_RATE))-1)>>8

   

//--------- 레지스트리 비트값(UCSR1C)

   

#define UPM1 5

#define UPM0 4

#define USBS 3

#define UCSZ1 2

#define UCSZ0 1

   

//--------- 레지스트리 비트값(UCSR1B)

   

#define TXEN 3

#define RXEN 4

#define UCSZ2 2

#define NOP() asm volatile ("nop");

   

   

//--------- 레지스트리 비트값(UCSR1A)

   

void ADC_Init()
{
  ADMUX = 0x00;  //기준전압 설정.(오르쪽 정렬 , 외부전압 사용)
  ADCSRA = 1<<0 | 1<<1 | 1<<2 | 1<<7//0b10000111;
}

unsigned int ADConversion(char i)
{
  ADMUX = ADMUX | i;             //ADC0을 선택하기 위해 ADMUX를 사용.
    ADCSRA = ADCSRA | 1<<6;
  
  while((ADCSRA&0x10)==0);//while((ADCSRA & 0x10)!=0x10)
  

  return( ADCL | ADCH<<8 );
        


void delay_us(unsigned int us)
{
  unsigned int i;
  for(i = 0; i < us; i++) //4
  {   
    NOP(); NOP(); NOP(); NOP(); //4
    NOP(); NOP(); NOP(); NOP(); //4
    NOP(); NOP(); NOP(); NOP(); //4 = 16
  }  
}

void delay_ms(unsigned int ms)
{
  unsigned int i;
  for(i = 0; i < ms; i++)
  {
    delay_us(200);
  }
}


   

int main(void)

{
  unsigned int val;

  DDRA = 1<<0 | 1<<1 | 1<<2;
  PORTA = 0xFF;
  DDRE = 1<<4;  //INT01 이라는 값 입력됨.
  PORTE = 1<<4;

  //PORTA=0b00000110;

  ADC_Init();

  while(1)
  {
    val = ADConversion(0);

    if(0<=val&& val <=350 )
    {
      PORTA=0b11111110;
      

    }

    else if(350 <= val && val <= 700 )
    {
      PORTA=0b11111101;
    
    }

    else
    {
      PORTA=0b11111011;
      
    }

  }

    
  return 0;

}


1. AVR Studio에서 엄한 파일을 계속 컴파일했음. 어떤 hex 파일인지 확인하기
2. 이거는 쫌 이해가 안가는 부분

while((ADCSRA&0x10)==0)//while((ADCSRA & 0x10)!=0x10)
{


}

>>>요렇게 해놓으면 안된다.

그런데

 
while((ADCSRA&0x10)==0);//while((ADCSRA & 0x10)!=0x10)

요렇게 해놓으면 된다.
   
반응형
-->