----------------------------------------------------------------------------------------------------
| 1. 컴파일러등의 개발환경 : avr studio 4
| 2. 회로나 소스코드의 제어목적: 온도센서 값을 하이퍼 터미널로 출력하려고 함
| 3. 증상과 예상되는 문제점 : 터미널내 값이 제대로 출력이 안됩니다. 왜 그럴까요.
| PF7에 온도센서 V out 값을 입력시켰습니다.
----------------------------------------------------------------------------------------------------
#include<avr/io.h>
#include<stdio.h>
#include<avr/delay.h>
#include <avr/interrupt.h>
unsigned int baudrate[15] = {832, 416, 207, 138, 103, 68, 51, 34, 25, 16, 8, 7, 3, 1, 0};
unsigned char temp;
unsigned int temp00;
float adc0;
char value[32];
void serial0_init(void)
{
DDRE = 0xfE;
UBRR0H = baudrate[2]>>8;
UBRR0L = baudrate[2];
UCSR0A = 0x02;
UCSR0B = 0x18;
UCSR0C = 0x06;
temp = UDR0;
}
void adc_init() {
ADMUX= 0x01; // ADC0(PF0)핀, AVCC 단자, 단극성 입력
ADCSRA= 0x8C; // ADC Enable, ADC Interrupt Enable, 16분주(1MHz)
}
SIGNAL(SIG_ADC) { // ADC 완료 인터럽트
temp00 = ADCL; // ADCL 먼저 읽기
temp00 += (ADCH<<8);
adc0= temp00;
}
void tx_char(unsigned int tx_data)
{
//시리얼포트로 데이터 송신이 완료되고 송신버퍼가 준비되었는지 검사
while((UCSR0A&0x20) == 0x00);
UDR0 = tx_data; //시리얼 포트를 통하여 데이터 전송
}
void tx_string(unsigned char *str_data)
{
while(*str_data != 0x00){ //문자열의 끝부분이 아니라면
tx_char(*str_data); //시리얼포트로 한개의 문자를 송신한다.
str_data++;
}
}
int main(void)
{
unsigned char i;
float temperature= 0;
adc_init();
serial0_init();
//sei();
while(1)
{
temperature= 100*adc0/204.8-3;
sprintf(value,"ADC0 : %4d\n",adc0);
//sprintf(value,"temperature : %03d℃\n",temperature);
//sprintf(value,"%03d℃\n",temperature);
//printf("hello?\n");
//sprintf(value,"degree %d\n",temperature);
tx_string(value); // PC 로 송신
tx_char(0x0A);
tx_char(0x0D);
// 0.5sec 마다 실행 동작 이곳에 넣기
_delay_ms(2500);
_delay_ms(2500);
//temp = serial_rx();
//serial_tx(temp);
}
return 0;
}
어떤 온도센서인지 설명부터 해주셔야겠는데요;;
기본적으로 원하는 데이터를 하이퍼터미널로 전송하는 것은 되는건가요?
소스중에 의심구역을 하이라이트 해주시면 감사하겠습니다.
ADC interrupt가 걸리는지 확인해 보세요.
그리고 평균을 계산하는 방법이 틀린 것 같네요...
ADCH<<8이면 ADCH가 8bit이므로 그 결과가 0일텐데..
프로그램을 좀더 세밀하게 확인을 하셔야 할 듯합니다. 중간 중간에 debugging 를 넣어 확인하심이...