땜쟁이 포럼

Hkfnd.c (serial전송 main프로그램)

테라뱅크 2 10,711

fnd 3개에 main에서 키보드를 누르면 

그 순서에 따라 data를 표시합니다. 
전송중 에러가 발생하면 체크섬을 하고 
이상없이 수신시 data로 인정합니다. 
이 프로그램은 확실히 제가 시험하였고 
체크섬 때문에 고생 좀 했습니다. 
-메인에서 키를 누르면 그 키를 시리얼로 전송하여 
리모트 cpu에 날라감니다 
예를 면 
1key를 누르면 리모트에서는 001 
12key를 누르면 리모트에서는 012 
123key를 누르면 리모트에서는 123 
다음으로 1234key를 누르면 
004로 표시됩니다 
따라서 3개 버턴을 누르면 다음4번째 부터는 
리셋이 되게 되는거지요 
직접 사용해보세요. 

포트에 따라 
===main 측======= 
4*4 key를 설치하시고 
max232c ic를 tx,rx단자에 결선합니다. 
====리모트 측==== 
fnd3개설치 하시고(scan방식) 
fnd3개에 Common단자에는 a1270 tr을 각1개식 
달아 줌 
다음으로 FND(1056) a`f까지 핀에는(data라인)저항을 47오옴을 
결선합니다 
-max232c ic를 tx,rx단자에 결선합니다. 
아주 간단하죠 

참고로max232c를 사용치 않을때에는 
tx,rx단자에  반드시 풀다운4.7k를 걸어 주세요 
감사합니다. 
//Project:              Hkfnd.c 표시장치 
//Key Use Port:        PORTB HI=Write,LOW=Read 
//serial:              PORTD Write 
//CPU Type:            Atmel AVR8535,8515,103 
//Clock Frequency:      4.9152Mhz 
//Comfiler:            AvrEdit3.1(AVRGCC) 
//Date:                2001/08/27 
//Author:              hwang hae kwon 
#include <io.h> 
#include <interrupt.h> 
#include <sig-avr.h> 
#include <progmem.h> 
#include <wdt.h> 
void  delay( int del); 
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); //문자열 보내기 
//--------------------------- 
#define true  1 
#define false  0 
#define PortB_In_Out DDRB //B 입출력 설정 
#define KEY_PORT_OUT    PORTB 
#define KEY_PORT_INPUT  PINB 
#define PORT_IN        0x00  //포트 입력 
#define PORT_OUT      0xff  //포트 출력 
#define LOW_PORT_OUT  0x0f  //하위 포트  출력 
#define HI_PORT_OUT    0xf0  //상위 포트  출력 
//------------------------------------------------------------------------------ 
#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 INPUT 0X61 
#define ENTER 0X71 

//----------------4*4 key--------- 
unsigned char KEY_SCAN_VALUE[4]={0xf7,0xfb,0xfd,0xfe}; 
                              //    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_font[16] =  {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe4,0xfe,0xf6,0xee,0x3e,0x1a,0x7a,0x9e,0x8e};//- 
const unsigned char fnd_number[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46}; 
unsigned char HexToAsiic_Map[16] = {"0123456789ABCDEF"}; 
unsigned char scan_count;      //0111,1011.1101.1110 DATA LOW 
unsigned char key_off;        //3210.3210.3210.3210 PORT LOW 
unsigned char key_enable,key_ok; 
unsigned char scan_keyold,scan_key,scan_Tempkey,key_output_value; 
unsigned char key_Temp; 
volatile unsigned char key_push; 
//------------------------------------------------------------------------------ 
unsigned char key_Clear,key_Enter; 
unsigned char fnd_ValueBuff[8];  //STX, data0,data2,data2,ENX,addcheck,exorcheck,ENT 
unsigned char check_temp; 
unsigned char i=0; 
unsigned char Buff_Count; 
unsigned char count_temp; 
unsigned char key_disable; 
unsigned char fnd_temp2=0xff; 
//------------------------------------------------------------------------------ 
void delay(int del) 

while ( del--); 

//------------------------- 
#include <key4_4.h> 
#include "serial.h" 
//----------------------- 
void port_init(void) 

wdt_enable(0x04);//60ms 
scan_key=scan_keyold=key_Temp=0; 
scan_count=0; 
key_enable=0; 
key_ok=0; 
key_push=1; 
outp(0x0f,DDRB); 
outp(0xff,DDRC); 

outp((1<<TOIE0), TIMSK); /* enable TCNT0 overflow */ 
outp(0x00,  TCNT0);        /* reset TCNT0 */ 
outp(0x02,  TCCR0);        /* count with cpu clock/1024 */ 

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; 

//------------CHECK SUM ADD계산 -------- 
check_temp=0; 
for(i=0;i<5;i++)//check sum 1~6까지 

  check_temp=check_temp+fnd_ValueBuff[i]; 
  wdt_reset(); 

fnd_ValueBuff[6]=check_temp; 

//------------------------------------------------------------------------------ 
void Send_FndData(void) 

  check_sum(); 
  for(i=0;i<8;i++) 
  { 
    Send_Char(fnd_ValueBuff[i]);//헥사로 보냄 
    wdt_reset(); 
  } 

//------------------------------------------------------------------------------ 
void fnd_clear(void) 

  outp(0xfe,PORTC);//시험 
  fnd_ValueBuff[0]=STX; 
  fnd_ValueBuff[1]=0xff; 
  fnd_ValueBuff[2]=0xff; 
  fnd_ValueBuff[3]=0x03; 
  fnd_ValueBuff[4]=ETX; 
  fnd_ValueBuff[5]=0; 
  fnd_ValueBuff[6]=0; 
  fnd_ValueBuff[7]=ENT; 
  Buff_Count=2; 
  count_temp=2; 
  key_disable=1; 
  Send_FndData(); 

//------------------------------------------------------------------------------ 
void Serial_Work(void) 

  switch (fnd_font[key_Temp]) 
  { 
      case INPUT: // E KEY(Clear) 
            fnd_clear(); 
            break; 
      //case ENTER: // F KEY (Enter) 
      //      break; 
      default:  //0~9 
            outp(fnd_font[key_Temp],PORTC); 
            if(key_disable==1) 
            { 
              if(Buff_Count==2) 
              { 
                fnd_ValueBuff[3]=0xff;// 클리어 
              } 
              fnd_temp2=fnd_font[key_Temp]; //임시저장 
              fnd_ValueBuff[1]=fnd_ValueBuff[2]; 
              fnd_ValueBuff[2]=fnd_ValueBuff[3]; 
              fnd_ValueBuff[3]=fnd_temp2; 
              count_temp=Buff_Count; 
              Buff_Count--; 
            } 

  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오스토리로 보내기
  • 네이버밴드로 보내기

Comments

테라뱅크
//Project:              HkKey.c(Remote)
#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);
}
테라뱅크
*작성일: 2001/08/10
작성자: 픽하튜


안녕하세요? 연세대학교 전기랑 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);
}
카테고리
최근통계
  • 현재 접속자 18 명
  • 오늘 방문자 606 명
  • 어제 방문자 1,074 명
  • 최대 방문자 2,440 명
  • 전체 방문자 1,331,308 명
  • 전체 회원수 478 명
  • 전체 게시물 745 개
페이스북에 공유 트위터에 공유 구글플러스에 공유 카카오스토리에 공유 네이버밴드에 공유