|
글쓴이 :
이주엽
작성일 : 18-03-20 14:12
조회 : 9,546
|
#include <avr/io.h>
#define F_CPU 8000000UL
#include <avr/interrupt.h>
#include <avr/iom8a.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
int main(void)
{
int al, ah;
int ad_val = 0;
DDRB = 0xff; //port B를 전부다 출력으로 씀
DDRC = 0x00; //port C를 전부다 입력으로 씀
PORTB = 0xff;//포트b첫출력 ff로 LED꺼짐
UCSRA = 0x00;//통신설정
UCSRB = 0x18;//수신 및 송신 인에이블
UCSRC = 0x06;//비동기모드 및 전송비트수 8비트 설정
UBRRH = 0;
UBRRL = 25; //8mhz크리스탈 보레이트 19200
//----------------------AD변환설정----------------------
ADMUX = 0x40;//단극성 PC0입력 및 외부의 AVCC단자로 입력된 전압을 사용
ADCSRA = 0x87;//변환대기 10000111(맨 앞의 1비트는 ADEN으로 1이면 동작허용 0이면 동작정지 / 마지막111은 분주비 결정 111의 분주비는 128)
//------------------------------------------------------------------
str[0] = 0x05;
str[1] = 0x52;
str[2] = 0x04;
/* Replace with your application code */
while (1)
{
for(int i=0; i<3; i++)
{
while((UCSRA & 0x80) == 0);
ch_str[i] = UDR;
if(ch_str[i] != str[i])
{
break;
}
else
{
if(i==2)
{
ADCSRA = 0xc7;//변환시작
while((ADCSRA & 0x10) == 0);
ad_val = (int)ADCL;
ad_val |= ((int)ADCH << 8);
ah = ad_val >> 8;
al = ad_val % 256;
while((UCSRA & 0x20) == 0);
UDR = 0x06;
while((UCSRA & 0x20) == 0);
UDR = 0x44;
while((UCSRA & 0x20) == 0);
UDR = ah;
while((UCSRA & 0x20) == 0);
UDR = al;
while((UCSRA & 0x20) == 0);
UDR = 0x04;
}
}
}
}
}
atmega8a 사용중입니다.
코드는 위와 같구요. 가변저항값을 받아서 통신으로 뿌려주는 코드입니다.
통신으로 0x05 0x52 0x04 3바이트를 받으면 0x06 0x44 0x??(변환값상위비트) 0x??(변환값하위비트) 0x04 5바이트를 보내는 코드입니다.
다 정상적으로 동작하는데 한가지 문제가 있습니다.
예를들어 처음 통신을 했을떄 가변저항값이 03aa였습니다.
가변저항을 02aa로 변경후 통신을하면 03aa가 들어오고
이상태에서 가변저항을 한번더 01aa로 변경하고 통신을 하면 그제서야 02aa가 들어옵니다.
가변저항 변화없이 한번더 보내면 01aa가 들어옵니다.
이런식으로 한단계씩 이전 데이터가 들어오는데
이유가 뭘까요?
알고리즘이 돌아가는 순서는 중간중간 통신을 넣어서 확인해보았는데 순서대로 잘돌아가는데.... 이유를 도통 모르겠습니다.
|
|