반응형

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

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

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



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

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



/*
* atmega128-adc-example.c
*
* Created: 2015-12-15 오후 1:37:05
* Author : webnautes
*/  
 
#define F_CPU 16000000UL 
 
//1. baud rate를 선택 
#define USART_BAUDRATE 9600 
 
//2.시스템 클록과 원하는 baud rate를 이용하여 UBRR 값을 계산한다. 
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 
 
#include <avr/io.h> 
#include <util/delay.h> 
#include <stdio.h> 
 
 
void usartInit() 

    //3. UBRR0은 16비트 레지스터이기 때문에 8비트씩 나누어서 넣어야 한다. 
    UBRR0H = (uint8_t)(UBRR_VALUE>>8); 
    UBRR0L = (uint8_t) UBRR_VALUE; 
     
    //4. USART 설정 
    UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); //Charecter size : 8비트 
    UCSR0C &= ~(1<<USBS0); //stop  bit : 1비트 
    UCSR0C &= ~((1<<UPM01)|(1<<UPM00)); // no parity mode 
     
    //5. 송수신을 가능하게 한다. 
    UCSR0B=(1<<RXEN0)|(1<<TXEN0); 

 
 
void uart_putchar(uint8_t u8Data, FILE *stream ) 

    //이전 전송이 끝나기를 기다림 
    while(!(UCSR0A&(1<<UDRE0))){}; 
     
    UDR0 = u8Data; 

 
uint8_t uart_getchar( FILE *stream) 

    // 수신 되기를 기다림 
    while(!(UCSR0A&(1<<RXC0))){}; 
     
    return UDR0; 

 
//http://www.appelsiini.net/2011/simple-usart-with-avr-libc 
FILE uart_output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); 
FILE uart_input = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ); 
 
 
 
 
int main(void

    //ADC init 
    ADMUX |= (0<<REFS1 | 1<<REFS0); //기준전압으로 AVCC 사용 
     
    //ADC 입력채널 선택  ADC0(PF0) 
    ADMUX &= ~( (1<<MUX4) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0) );   
         
         
    ADCSRA |= (1<<ADEN); //ADC 기능 활성화 
     
    // 16Mhz/128 = 125Khz, ADC의 입력 클록 주파수  
    ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0));    
     
         
         
    usartInit(); 
    stdout = &uart_output; 
    stdin  = &uart_input; 
 
    while (1)  
    {        
        ADCSRA |= (1<<ADSC); //ADC 변환 시작 
         
        //ADC 변환이 완료되면 자동으로 ADSC는 0이 되기 때문에 이렇게 대기한다. 
        while(ADCSRA & (1<<ADSC));  
             
        unsigned char low  = ADCL; 
        unsigned char high = ADCH; 
        int temperature = (high << 8) | low;   
         
        float result = temperature * 5.0/1024*100
         
        char str[256]; 
        sprintf( str, "temperature %4.2f\r\n", result ); 
        printf( str ); 
        _delay_ms(100);      
         
    } 




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



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



2015. 12. 17 최초작성



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


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

+ Recent posts