/*
USART0 로보드의상태PC로전송
PC에서LED, BUZZER, FND 제어
AVRStudio 4.18
*/
#include
<avr/io.h>
#include
"WAT128.h"
BYTE
g_FNDData[4]={1,2,3,4};
BYTE
g_BUZZER = 0;
BYTE
g_LED = 0;
UINT16
g_adcCDS; // CDS 값보관
UINT16
g_adcVR; // 가변저항값보관
void
OperDisplayFND()
{
DisplayFND4(g_FNDData[0],g_FNDData[1],g_FNDData[2],g_FNDData[3]);
}
INT16
g_byteOperPCTXTimer = 0;
void
OperPCTX()
{
if(--g_byteOperPCTXTimer>0)
return;
PutChar0(0x02); // 0 시작신호
PutChar0(PIND); // 1 DIP SWITCH
PutChar0(GetRotaryInt()); // 2 ROTARY
PutChar0(g_adcCDS>>8); // 3 CDS 상위값
PutChar0(g_adcCDS); // 4 CDS 하위값
PutChar0((g_adcVR)>>8 &0xFF); // 5 가변저항상위값
PutChar0(g_adcVR&0xFF); // 6 가변저항하위값
PutChar0(0x03); // 7
PutChar0(0xCC); // 8 체크섬
PutChar0(0x03); // 9 끝신호
g_byteOperPCTXTimer = 20;
}
// 가변저항, CDS 값을ADC로읽기
void
OperReadADC()
{
INT16
uiTemp; // 임시변수
g_adcCDS = 0;
// 노이즈를생각해서값을번읽어평균을낸다.
for(uiTemp = 0; uiTemp<16;uiTemp++)
{
ADMUX=0x40 | 0x00;
ADCSRA = 0xD7;
while((ADCSRA & 0x10) != 0X10);
g_adcCDS += ADCL + (ADCH*256);
}
g_adcCDS>>=4;
g_adcVR = 0;
// 노이즈를생각해서값을번읽어평균을낸다.
for(uiTemp = 0; uiTemp<16;uiTemp++)
{
ADMUX=0x40 | 0x01;
ADCSRA = 0xD7;
while((ADCSRA & 0x10) != 0X10);
g_adcVR += ADCL + (ADCH*256);
}
g_adcVR>>=4;
}
int
main()
{
BUZZER_INIT; // BUZZER 초기화
OpenSCI0(115200); // USART 0 열기 InitFND4(); // FND 초기화 InitADC(); // ADC 초기화
DisplayFND4(3,4,5,6);
InitRotary();
DDRD = 0x00; // 딥스위치를입력으로설정
DDRE = 0xFE; // LED
while(1)
{
BUZZER_OFF;
OperDisplayFND();
OperReadADC();
OperPCTX();
if(0x02 ==GetByte0())
{
UINT16
uiData = 0;
uiData = GetByte0(); //1
uiData<<=8;
uiData += GetByte0(); //2
//buzzer
g_BUZZER = GetByte0();
g_LED = GetByte0(); //4
GetByte0(); //5
GetByte0(); //6
GetByte0(); //7
if(0xCC == GetByte0() && 0x03 == GetByte0() )
{
if( g_BUZZER)
{
BUZZER_ON;
DelayMS(2);
}
// PC에서받은LED 값을출력
PORTE =~((g_LED)&0xFC);
// FND 표시
g_FNDData[0]=((uiData/1000)%10);
g_FNDData[1]=((uiData/100)%10);
g_FNDData[2]=((uiData/10)%10);
g_FNDData[3]=(uiData%10);
}
}
}
} |