AVR
작성자 임베디드코리아
작성일17-09-27 17:36
조회2,701회
댓글0건
/*
* ADC.c
*
* Created: 2017-09-27 오후 3:20:34
* Author : EMBEDDED-000
*/
//#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
//1. baud rate를 선택
#define USART_BAUDRATE 115200
//2.시스템 클록과 원하는 baud rate를 이용하여 UBRR 값을 계산한다.
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
void usartInit0()
{
//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 transmitByte(uint8_t data) {
//이전 전송이 끝나기를 기다림
while(!(UCSR0A&(1<<UDRE0))){};
UDR0 = data; /* send data */
}
uint8_t receiveByte(void) {
// 수신 되기를 기다림
while(!(UCSR0A&(1<<RXC0))){};
return UDR0; /* return register value */
}
void printString(const char str[]) {
uint8_t i = 0;
while (str[i]) {
transmitByte(str[i]);
i++;
}
}
void readString(char str[], uint8_t maxLength) {
char response;
uint8_t i;
i = 0;
while (i < (maxLength - 1)) { // prevent over-runs
response = receiveByte();
transmitByte(response); // echo
if (response == '\r') { // enter marks the end
break;
}
else {
str[i] = response; // add in a letter
i++;
}
}
str[i] = 0; //terminal NULL character
}
int main(void)
{
/* Replace with your application code */
unsigned int ADData=0; //10bit값 저장 변수
float v_Temp;
usartInit0();
char ch[32];
ADMUX=0x01; //adc1선택
ADCSRA=0x87;//10000111 싱글모드, 1번채널 3.3v외부전압 adc허가 128분주
while (1)
{
ADCSRA |= 0x40; //adsc ad개시
while((ADCSRA&0x10)==0x00);//adif ad다 될때까지 기다림
ADData=ADC; //전압이 디지털로 변환된 값 읽어옴
v_Temp=(float)(ADData)*33/1023;
sprintf(ch, "v_Temp: %7.2f\r\n", v_Temp);
printString(ch);
_delay_ms(500);
}
}