AVR/Atmega128 강좌
avr - ADC : 조도센서로 밝기를 측정해보자
webnautes
2015. 3. 3. 16:53
반응형
- /*
- * ADC.c
- *
- * Created: 2015-03-03 오전 12:37:57
- * 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 <stdio.h>
- void adcInit(void) //ADC 초기화 함수
- {
- ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)); //16Mhz/128 = 125Khz
- ADMUX |= (1<<REFS0); //AVCC(5V)
- ADCSRA |= (1<<ADEN); //ADC 인에이블
- }
- uint16_t readAdc(uint8_t channel) //값을 읽어오는 함수
- {
- ADMUX &= 0xF0;
- ADMUX |= channel;
- ADCSRA |= (1<<ADSC); //변환 시작
- while(ADCSRA&(1<<ADSC));//변환 완료되기를 기다림.
- return ADCW; //ADC값 반환
- }
- 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)
- {
- usartInit();
- stdout = &uart_output;
- stdin = &uart_input;
- adcInit();
- while(1)
- {
- int value = readAdc(0);
- printf( "%d \r\n", value );
- }
- }
반응형