반응형




실수를 시리얼 포트를 통해 출력하려면 프로젝트를 생성하고 다음 두 가지를 변경해주어야 합니다. 

제가 사용한 버전은 Atmel Studio 7.0이지만 다른 버전에서도 비슷한 방법으로 변경하면 가능합니다.

메뉴에서 프로젝트 - 속성을 선택한 후.



Toolchain에 아래 항목에 libprintf_flt를 추가해줍니다.




그리고 General에서 다음 부분을 체크해줍니다.







  1. /* 
  2.  * atmega128-adc-example.c 
  3.  * 
  4.  * Created: 2015-12-15 오후 1:37:05 
  5.  * Author : webnautes 
  6.  */   
  7.   
  8. #define F_CPU 16000000UL  
  9.   
  10. //1. baud rate를 선택  
  11. #define USART_BAUDRATE 9600  
  12.   
  13. //2.시스템 클록과 원하는 baud rate를 이용하여 UBRR 값을 계산한다.  
  14. #define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)  
  15.   
  16. #include <avr/io.h>  
  17. #include <util/delay.h>  
  18. #include <stdio.h>  
  19.   
  20.   
  21. void usartInit()  
  22. {  
  23.     //3. UBRR0은 16비트 레지스터이기 때문에 8비트씩 나누어서 넣어야 한다.  
  24.     UBRR0H = (uint8_t)(UBRR_VALUE>>8);  
  25.     UBRR0L = (uint8_t) UBRR_VALUE;  
  26.       
  27.     //4. USART 설정  
  28.     UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); //Charecter size : 8비트  
  29.     UCSR0C &= ~(1<<USBS0); //stop  bit : 1비트  
  30.     UCSR0C &= ~((1<<UPM01)|(1<<UPM00)); // no parity mode  
  31.       
  32.     //5. 송수신을 가능하게 한다.  
  33.     UCSR0B=(1<<RXEN0)|(1<<TXEN0);  
  34. }  
  35.   
  36.   
  37. void uart_putchar(uint8_t u8Data, FILE *stream )  
  38. {  
  39.     //이전 전송이 끝나기를 기다림  
  40.     while(!(UCSR0A&(1<<UDRE0))){};  
  41.       
  42.     UDR0 = u8Data;  
  43. }  
  44.   
  45. uint8_t uart_getchar( FILE *stream)  
  46. {  
  47.     // 수신 되기를 기다림  
  48.     while(!(UCSR0A&(1<<RXC0))){};  
  49.       
  50.     return UDR0;  
  51. }  
  52.   
  53. //http://www.appelsiini.net/2011/simple-usart-with-avr-libc  
  54. FILE uart_output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);  
  55. FILE uart_input = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ);  
  56.   
  57.   
  58.   
  59.   
  60. int main(void)  
  61. {  
  62.     //ADC init  
  63.     ADMUX |= (0<<REFS1 | 1<<REFS0); //기준전압으로 AVCC 사용  
  64.       
  65.     //ADC 입력채널 선택  ADC0(PF0)  
  66.     ADMUX &= ~( (1<<MUX4) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0) );    
  67.           
  68.           
  69.     ADCSRA |= (1<<ADEN); //ADC 기능 활성화  
  70.       
  71.     // 16Mhz/128 = 125Khz, ADC의 입력 클록 주파수   
  72.     ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0));     
  73.       
  74.           
  75.           
  76.     usartInit();  
  77.     stdout = &uart_output;  
  78.     stdin  = &uart_input;  
  79.   
  80.     while (1)   
  81.     {         
  82.         ADCSRA |= (1<<ADSC); //ADC 변환 시작  
  83.           
  84.         //ADC 변환이 완료되면 자동으로 ADSC는 0이 되기 때문에 이렇게 대기한다.  
  85.         while(ADCSRA & (1<<ADSC));   
  86.               
  87.         unsigned char low  = ADCL;  
  88.         unsigned char high = ADCH;  
  89.         int temperature = (high << 8) | low;    
  90.           
  91.         float result = temperature * 5.0/1024*100;  
  92.           
  93.         char str[256];  
  94.         sprintf( str, "temperature %4.2f\r\n", result );  
  95.         printf( str );  
  96.         _delay_ms(100);       
  97.           
  98.     }  
  99. }  




실행결과가 너무 빨리나와서  100ms 정도 딜레이를 주고 출력해봤습니다.





참고로 LM35의 핀아웃은 아래와 같습니다.  Vout을 PF0에 연결해서 센서값을 얻어왔습니다.






반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요 ^^

  1. 궁금합니다 2019.12.10 18:17

    89번 줄에서 (high << 8) | low; 의 의미를 잘 이해하지 못했는데, 혹시 어떤 뜻인지 알려주실수 있나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.10 21:39 신고

      low 바이트와 high 바이트를 8비트씩 따로 가져오기 때문에 하나로 합쳐주는 겁니다.

      다음처럼 값이 대입된 16비트가 됩니다.

      high low


  2. 미니언즈 2019.12.21 07:04

    콘솔창은 어떻게 여는 건가요?? ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.21 07:29 신고

      아래 링크에서 다운로드하새요
      https://osdn.net/projects/ttssh2/releases/

  3. 2020.12.14 16:08

    비밀댓글입니다

+ Recent posts