그 순서에 따라 data를 표시합니다. 전송중 에러가 발생하면 체크섬을 하고 이상없이 수신시 data로 인정합니다. 이 프로그램은 확실히 제가 시험하였고 체크섬 때문에 고생 좀 했습니다. -메인에서 키를 누르면 그 키를 시리얼로 전송하여 리모트 cpu에 날라감니다 예를 면 1key를 누르면 리모트에서는 001 12key를 누르면 리모트에서는 012 123key를 누르면 리모트에서는 123 다음으로 1234key를 누르면 004로 표시됩니다 따라서 3개 버턴을 누르면 다음4번째 부터는 리셋이 되게 되는거지요 직접 사용해보세요.
outp(0x80,SREG); } //------------------------------------------------------------------------------ SIGNAL(SIG_OVERFLOW0) // SIG_OUTPUT_COMPARE0 signal handler for tcnt0 overflow interrupt SIGNAL { key_push=1; outp(0, TCNT0); /* reset counter to get this interrupt again */ } //------------------------------------------------------------------------------ void check_sum(void) { //------------CHECK SUM exor계산 -------- check_temp=0; for(i=0;i<5;i++)//check sum 1~6까지 exor { check_temp=check_temp^fnd_ValueBuff[i]; wdt_reset(); } fnd_ValueBuff[5]=check_temp;
#include <interrupt.h>
#include <sig-avr.h>
#include <wdt.h>
#include <progmem.h>
#include <io.h>
//Key Use Port: PORTB HI=Write,LOW=Read
//LCD Use Port(DATA): PORTC Write
//LCD Use Port(Control):PORTC Write(pin5,6,7)
//CPU Type: Atmel AVR8535,8515,103
//Clock Frequency: 4.9152Mhz
//Comfiler: AvrEdit3.1(AVRGCC)
//Date: 2001/08/05
//Author: hwang hae kwon
//#include <io.h>
//#include <interrupt.h>
//#include <sig-avr.h>
//#include <progmem.h>
//#include <wdt.h>
void delay( int del);
void Serial_Work(void);
extern void serial_init(void); //초기화 한다
extern void Send_Char(unsigned char data); //윽牡鉗?보내기
extern unsigned char Recv_Char(void); //바이트 받기
extern void Send_String(unsigned char* pdata); //문자열 보내기
volatile unsigned char TimeCount;
unsigned char fnd_outtime;
//---------------------------
#define true 1
#define false 0
//------------------------------------------------------------------------------
#define FREQUENCY 4000000 //
#define BAUDRATE 9600 //
#define PikaUBRR FREQUENCY/(16l*BAUDRATE)-1
#define EOL(); SendString(EndOfLine);
#define STX 0x02
#define ETX 0x05
#define ENT 0x1d
#define KEY_INPUT 0x61
#define KEY_ENTER 0x71
//----------------fnd---------
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
const unsigned char fnd_font[16] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1b,0x01,0x09,0x11,0xc1,0xe5,0x85,0x61,0x71};//+공통
const unsigned char fnd_number[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
const unsigned char fnd_select[3]={0xfe,0xfd,0xfb};
unsigned char HexToAsiic_Map[16] = {"0123456789ABCDEF"};
unsigned char Fnd_Count;
//------------------------------------------------------------------------------
unsigned char fnd_ValueBuff[8];
unsigned char Fnd_FontOutBuff[3];
unsigned char SerialFndData;
//------------------------------------------------------------------------------
unsigned char count_temp;
unsigned char key_disable;
unsigned char Check_AddSum;
unsigned char Check_ExorSum;
unsigned char Read_i;
unsigned char Read_Count;
unsigned char i;
//------------------------------------------------------------------------------
void delay(int del)
{
while ( del--);
}
#include "serial.h"
//-----------------------
void port_init(void)
{
Read_i=0;
Read_Count=0;
i=0;
wdt_enable(0x04);//60ms
TimeCount=0;
outp(0xff,DDRA);
outp(0xff,DDRC);
//outp(0x00,MCUCR);
outp((1<<TOIE0), TIMSK); // enable TCNT0 overflow
outp(0x00, TCNT0); // reset TCNT0
outp(0x02, TCCR0); // count with cpu clock/1024
outp(0x80,SREG);
Fnd_FontOutBuff[0]=0xff; //1번fnd 클리어
Fnd_FontOutBuff[1]=0xff; //2번fnd 클리어
Fnd_FontOutBuff[2]=0x03; //3번fnd 클리어
key_disable=1; //키 사용 허가
Fnd_Count=2;
}
//------------------------------------
SIGNAL(SIG_OVERFLOW0)//tcnt0 overflow interrupt
{
TimeCount=1;
outp(0x00, TCNT0); // reset counter
}
//------------------------------------------------------------------------------
void check_sum(void)
{
//------------CHECK SUM exor계산 --------
Check_AddSum=0;
for(i=0;i<5;i++)//check sum 1~6까지 exor
{
Check_AddSum=Check_AddSum^fnd_ValueBuff[i];
wdt_reset();
}
//------------CHECK SUM ADD계산 --------
Check_ExorSum=0;
for(i=0;i<5;i++)//check sum 1~6까지
{
Check_ExorSum=Check_ExorSum+fnd_ValueBuff[i];
wdt_reset();
}
}
//------------------------------------------------------------------------------
void FND_Display(void)
{
check_sum();
if((Check_AddSum==fnd_ValueBuff[5])&(Check_ExorSum==fnd_ValueBuff[6]))
for(i=1;i<4;i++)
{
Fnd_FontOutBuff[i-1]=fnd_ValueBuff[i];
wdt_reset();
//Fnd_FontOutBuff[i-1]=fnd_font[0x30-Fnd_FontOutBuff[i-1]];
}
}
//------------------------------------------------------------------------------
void Serial_Work(void)
{
switch (SerialFndData)
{
case STX:
Read_i=1;
Read_Count=1;
fnd_ValueBuff[0]=STX;
break;
//case ETX:
// break;
case ENT:
FND_Display();
Read_i=1;
break;
default:
if(Read_i==1)
{
fnd_ValueBuff[Read_Count]=SerialFndData;
Read_Count++;
}
break;
wdt_reset();
}
}
//------------------------------------------------------------------------------
void Fnd_out(void)
{
outp(~fnd_select[fnd_outtime],PORTA); // -로보냄
outp(~Fnd_FontOutBuff[fnd_outtime],PORTC);//- 로보냄
fnd_outtime++;
if(fnd_outtime==3)
{
fnd_outtime=0;
}
}
//------------------------------------------------------------------------------
int main( void )
{
port_init();
serial_init();
fnd_outtime=0;
sei();
do
{
if(TimeCount==1)//현재 1.0ms
{
Fnd_out();
TimeCount=0;//타이머 인터럽트 클리어
}
wdt_reset();
}while(1);
}
작성자: 픽하튜
안녕하세요? 연세대학교 전기랑 01학번 조지현입니당~!
이번에 Hand Motion Capture Device를 만들면서 AVR을 공부했습니다.
요기 강좌에 없길래.. 제가 한번 주제넘게 올려봅니다~
저는 gcc를 사용했으며.. Datasheet와 gccdemo7이라는 예제를 참고 했습니다(하다보니 예제와 너무 똑같이 되었군요..--)
먼저 하드웨어 부분은..
MAX어쩌구 칩으로 시리얼 케이블과 연결하구..
캐패시터 붙이구 ....
줄 4개 뽑아서... 하나는 VCC하나는 GND
둘은 RXD와 TXD에 연결하면 되죠..
(제가 만든적은 없으니.. 알아서들 만드세요)
저는 MTerm에서 테스트 했습니다..*/
//serial.h//
//------------
// 8535
unsigned char RecvData;
volatile unsigned char TransReady;
volatile unsigned char Recved;
unsigned char* pStr;
prog_char EndOfLine[3]={0x0d,0x0a,0}; //롬에 할당
//------------------------------------------------------------------------------
SIGNAL(SIG_UART_TRANS)
{
if(pStr!=0) //문자열 전송중이면
{
pStr++; //이미 한문자 전송했음
if(PRG_RDB(pStr)==0) //문자열의 끝이라면
{
pStr=0; //pStr = NULL;
TransReady=1;
return;
}
outp(PRG_RDB(pStr),UDR);
return;
}
TransReady=1;
}
//------------------------------------------------------------------------------
SIGNAL(SIG_UART_RECV)
{
Recved=1;
RecvData = inp(UDR); //데이터 읽기
//outp(fnd_font[RecvData],PORTC);
}
//------------------------------------------------------------------------------
void serial_init(void)
{
TransReady=1;
Recved=0;
pStr=0;
outp(BV(RXCIE)|BV(TXCIE)|BV(RXEN)|BV(TXEN),UCR);
//UART Control Register에 인터럽트 인에이블 그리고
//각 기능 인테이블
outp(PikaUBRR,UBRR);
//header 에 디파인된것으로 결정되는 수치..
}
//------------------------------------------------------------------------------
void Send_Char(unsigned char data)
{
while(!TransReady);
TransReady=0;
outp(data,UDR);
}
//------------------------------------------------------------------------------
unsigned char Recv_Char(void)
{
while(!Recved);
Recved=0;
return RecvData;
}
//------------------------------------------------------------------------------
extern void Send_String(unsigned char* pdata)
{
while(!TransReady);
pStr = pdata;
TransReady=0;
outp(PRG_RDB(pStr),UDR);
}