회원가입 ID/PW 찾기

1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.

콘텐츠 수 739
판매자 바람을본소년 판매 납포인트 무료 평점 0점 / 총 0명 참여
예전에 만들었던 인디케이터용 소스입니다.
소스중에 자동으로 시리얼통신 접속하는 코드가 있습니다.
직접 짠 프로그램이라 허접합니다만
혹시 자동으로 시리얼 통신접속 기능을 사용해야 하시는분은
참고하세요~

보레이트만 자동으로 찾아서 접속해줍니다. 다른부분은 고정되어있습니다.

//-------------------header file---------------------------------------
#include<avr/io.h>
#include "delay.h"
#include "global.h"
#include <avr/interrupt.h>


//-------------------definition---------------------------------------
#define SEG_SEL   PORTB //세그먼트 선택 0~6 
#define SEG_DATA   PORTD //세그먼터에 숫자 출력 데이터

#define ST_LED 0x40  //안정일때 출력할 LED 
#define US_LED 0x80  //불안정일때 출력할 LED 

#define SEGMENT_CLEAR 0x00
#define SEGMENT_ON  0xFF
#define SEGMENT_A  0x01
#define SEGMENT_B  0x02
#define SEGMENT_C  0x04
#define SEGMENT_D  0x08
#define SEGMENT_E  0x10
#define SEGMENT_F  0x20
#define SEGMENT_G  0x40  //'-'
#define SEGMENT_DP  0x80  //'.'

#define MAXBUF   22  // 전체 패킷수신 버퍼 갯수 stx, status, type, data_length, checksum,etx

#define TRUE  1
#define FALSE  0

#define   SYSTEM_CLOCK  16000000    // CLOCK (X-tal frequency)


//------------------variables---------------------------------------------
u08 i,j,k,temp;

u08 rx_buf[MAXBUF];    //전체 수신버퍼

u08 data = 0;
u08 count=0;  //수신버퍼에서 배열에 저장하기위한 카운터변수

//u16 tick_count1=0,tick_count2=0,tick_count3=0;  //오버플로우 인터럽트 자장 카운터변수
u08 count1=0;
u08 rx_byte;  //한문자를 수신받아 저장하기위한 변수

const char SELECT_SEG[]={0x01,0x02,0x04,0x08,0x10,0x20};  //세그먼터 선택용

const char SEG1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80};  //아스키코드 변환용
const char SEG[]={0x40,0x80,0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //아스키코드 변환용
const char OVER[]={0x3F,0x3E,0x79,0x77};  //과부하일때 출력 메세지
const char ERROR[]={0x79,0x77,0x77,0x3F,0x77};  //에러 출력 메세지
const char HELLO[]={0x76,0x79,0x38,0x38,0x3F};  //초기화 출력메세지
const char TEST[]={0x63,0x5C};  //세그먼트6개를 검사하는 출력메세지

//통신속도 설정용
unsigned long BAUDRATE1[][4]={{1200},{2400},{4800},{9600}};
//u32 baud[4]={832,415,207,103};
const char DISP_BAUDRATE[][4]={
      {0x06,0x5B,0x3F,0x3F}, //1200
      {0x5B,0x66,0x3F,0x3F}, //2400
      {0x66,0x7F,0x3F,0x3F}, //4800
      {0x6F,0x7D,0x3F,0x3F}, //9600     
      };


//--------------------function prototype -----------------------------------
unsigned char disp_num(u08 NUMBER); //숫자-> 아스키코드로 변환  함수
//void init_serial(void);   //시리얼 통신 초기화 함수
//void init_serial(unsigned long BaudRate);
void init_serial(u32 BaudRate);
void serial_port_scan(void); //통신 속도 설정 함수


void no_sig(void);    //신호없음메세지를 출력하는 함수
void disp_error(void);   //에러메세지를 출력하는 함수
void init_segment(void);   //세그먼트 초기화 함수
void display(void);    //세그먼트에 디스플레이 해주는 함수
void disp_error(void);   //입력이 없을때 error 메세지 출력하는 함수

 


//-------------시리얼 포트로 들어오는 데이터를 순환 큐에 차곡차곡 저장하는 수신완료 인터럽트--------------------
SIGNAL(SIG_USART0_RECV)
{
 rx_byte = UDR0;

 rx_buf[count] = rx_byte;
 
 if((rx_buf[0] == 'S')|(rx_buf[0] == 'U')|(rx_buf[0] == 'O'))
 {
  count++;
  if(count == MAXBUF)  count = 0;
 }
 else return;
}

 

//--------------NUMBER to ASCII Code---------------------------------
//문자에 해당하는 아스키 코드값을 반환한다.
unsigned char disp_num(u08 NUMBER)
{
 if((NUMBER == '-') | (NUMBER == '.'))
 {
  return SEG[NUMBER - 0x2D];
 }
 else
 {      
  return  SEG1[NUMBER - 0x30];
 }
}


//---------------------시리얼 통신 초기화 함수------------------------------------------------
//시리얼 통신 인터럽트방법
//void init_serial(void)
//void init_serial(unsigned long BaudRate)
void init_serial(u32 BaudRate)
{
 // Setting BaudRate
 u16 baud = ((SYSTEM_CLOCK+(BaudRate*8L))/(BaudRate*16L)-1);
  UBRR0L= baud;
  UBRR0H = baud>>8;

 UCSR0A = 0x00;
 UCSR0B = 0x98;  //interrupt enable, 8data, no parity, 1 stop
 UCSR0C = 0x06;
}

 

//----------------세그먼트 초기화 루틴-------------------------------------------
void init_segment(void)
{
 temp = 5;
 for(i=0; i < 6; i++)
 {
  SEG_DATA = TEST[0];
  SEG_SEL = SELECT_SEG[temp];
  //if(temp == 0) temp = 0;
  temp--;
  Delay_ms(100);
 }
 temp = 0;
 for(i=0; i < 6; i++)
 {
  SEG_DATA = TEST[1];
  SEG_SEL = SELECT_SEG[temp];
   //if(temp == 5) temp = 5 ;
  temp++;
  Delay_ms(100);
 }
   
 
 for(i=0;i<250;i++)  //약 1초 출력
  for(j=0,temp = 4;j<5;j++)
  {
   SEG_DATA = HELLO[j];
   SEG_SEL = SELECT_SEG[temp];     //출력될 세그먼트 선택
   if(temp == 0) temp = 4;
   temp--;
   Delay_ms(1);
  }
 SEG_SEL = SEGMENT_CLEAR;
}


//-----------------------수신 신호가 들어오지 않을때----------------------------------
void no_sig(void)
{
 for(i=0;i<250;i++)  //약 1초 출력
 for(i=0,temp = 0; i < 6; i++)
 {
  SEG_DATA = 0x49;
  SEG_SEL = SELECT_SEG[temp];
   //if(temp == 5) temp = 5 ;
  temp++;
  Delay_ms(1);
 }
}


//-----------------데이터 입력이 없거나 정상이 아닌경우 error 출력 ---------------------------
void disp_error(void)
{
 //--------------입력데이터가 없을때 출력하는 코드-------------------------  
 for(i=0;i<250;i++)  //약 1초 출력
 for(j=0,temp = 4;j<5;j++)
 {
  SEG_DATA = ERROR[j];
  SEG_SEL = SELECT_SEG[temp];     //출력될 세그먼트 선택
  if(temp == 0) temp = 4;
  temp--;
  Delay_ms(1);
 }
 SEG_SEL = SEGMENT_CLEAR;
}

 

 

//-------------------세그먼트에 숫자를 표시해주는 함수---------------------
void display(void)
{
 u08 index;
 
 index = 0;
 //------------------안정일때 출력-------------------------------
 if(rx_buf[index] == 'S')
 {
  if(rx_buf[index+1] == 'T')
  {
   for(k=16, temp = 0; k>=9; k--)
   { 
    //-------------여기에 LED 처리코드 추가---------------   
    //sbi(SEG_SEL,ST_LED); //안정을 나타내는 LED를 켠다.
    //공백이 아닐경우만 세그먼트에 나타낸다.
    if(rx_buf[k] != 0x20)
    {
     //소수점 처리부분
     //소수점이 나타났을때는 그 다음데이터에서 오른쪽으로 하나쉬프트 한다.
     if(rx_buf[k+1] == '.')  
     {
      data = rx_buf[k];
      temp--;
     }
     else
     {
      data = rx_buf[k];
     }
     
     SEG_DATA = disp_num(data);
     SEG_SEL = SELECT_SEG[temp]^ST_LED;     //출력될 세그먼트 선택
   
     temp++;      //세그먼트를 쉬프트 시켜서 각자리마다 다른 숫자가 나타나도록 한다.
     Delay_ms(1);   
    }
   }
  }
 }
 

 //------------------불안정일때 출력 -------------------------------
 else if(rx_buf[index] == 'U')
 {
  if(rx_buf[index+1] == 'S')
  {
   //-----------불안정일때 출력 설정--------------------------
   for(k=16, temp = 0; k>=9; k--)
   {
    //-------------여기에 LED 처리코드 추가---------------   
    //sbi(SEG_SEL,US_LED); //안정을 나타내는 LED를 켠다.
    
    //공백이 아닐경우만 세그먼트에 나타낸다.
    if(rx_buf[k] != 0x20)
    {
     //소수점 처리부분
     //소수점이 나타났을때는 그 다음데이터에서 오른쪽으로 하나쉬프트 한다.
     if(rx_buf[k+1] == '.')  
     {
      data = rx_buf[k];
      temp--;
     }
     else
     {
      data = rx_buf[k];
     }
     
     SEG_DATA = disp_num(data);
     SEG_SEL = SELECT_SEG[temp]^US_LED;     //출력될 세그먼트 선택
   
     temp++;      //세그먼트를 쉬프트 시켜서 각자리마다 다른 숫자가 나타나도록 한다.
     Delay_ms(1);  
    }
   }
  }
 } 
 
 //-------------------과부하 일때 출력--------------------------------
 else if(rx_buf[index] == 'O')
 {
  if(rx_buf[index+1] == 'L')
  {
  //--------------과부하일때 OVER  출력하는 코드-------------------------  
   for(k=0, temp = 3; k<4; k++)
   { 
    
    SEG_DATA = OVER[k];
    SEG_SEL = SELECT_SEG[temp];     //출력될 세그먼트 선택
   
    if(temp == 0) temp = 3;
    temp--;
    Delay_ms(1);   
   }
//   index++;
//   if(index == MAXBUF) index = 0;   
  }
 }
 
 else if(rx_buf[index] == 0x00)
 {
  no_sig();
  return;  
 }
 
 else
 {
  disp_error();
  return;
 }
}  


void serial_port_scan(void)
{
 u08 serial_port_scan_ok = 0;
 u08 index = 0;
 i = j = 0;
 
 while(!serial_port_scan_ok)
 {
  for(i=0;i<250;i++)  //약 1.5초 출력
  for(k=0, temp = 3; k<4; k++)
  { 
   cli();
   init_serial(BAUDRATE1[j][0]);
   //init_serial(baud[j]);
   sei();
   
   SEG_DATA = DISP_BAUDRATE[j][k];
   SEG_SEL = SELECT_SEG[temp];     //출력될 세그먼트 선택
  
    //------------------속도 설정------------------------------
    if((rx_buf[index] == 'S')|(rx_buf[index] == 'U')|(rx_buf[index] == 'O'))
    {
     if((rx_buf[index+1] =='T')|(rx_buf[index+1] =='S')|(rx_buf[index+1] =='L'))
     {
      serial_port_scan_ok = TRUE;
     }
    }
    else serial_port_scan_ok = FALSE;

   if(temp == 0) temp = 3;
   temp--;
   Delay_ms(1);  
  }
  j++; 
  if(j == 4) j = 0;
  Delay_ms(1);    
 }
}

 


//--------------------메인 함수------------------------------------------------------
int main(void)
{
 DDRB = 0xFF;
 DDRD = 0xFF;

 init_segment(); //세그먼트 초기화
 serial_port_scan();  //시리얼포트에 통신속도를 찾아내서 연결함
 Delay_ms(10);
 
 while(1)
 {
  display();
 } 
}


profile
빛나는 영혼 2009.01.31 14:01
와 개념이 좋은데요. 이렇게 하면 보레이트 때문에 귀찮을 일은 없겠네요. ㅋㅋ PC에서 알아서 셋팅만 하면 되니깐.

굿 굿 굿 !!!
profile
[고니] 2009.02.27 09:40
아직 나에게는 너무 어려운 내용이네요...ㅜ.ㅜ
profile
조근조근 2010.02.08 04:37
좋은자료감사합니다.
profile
루키키 2010.02.24 18:00
네이버의 모카페에 뒤지지않는 자료들이네염
profile
혜뽕 2010.05.03 22:57
감사합니당!!
profile
치토스 2010.07.29 09:26
무자게 기네요 ㄷㄷ^^
profile
컴쟁이 2012.08.29 00:06
감사용...
profile
백곰사냥꾼 2017.02.11 06:34

좋은자료 감사합니다

search
List of Articles
번호 분류 제목 평점 포인트 판매자 등록일 구매수 조회 수
공지 공공의 목적으로 공유하고자 하는 소프트웨어는 '소프트웨어 자료실'에 업로드를 요청드립니다.
공지 구매후 평점 댓글을 남겨주시면 구매포인트의 20%를 돌려드립니다.
259 마이크로프로세서 self test 에러 문제입니다.. [2] 무료 주야 2009-06-30 0 1245
258 마이크로프로세서 at89c2051 무료 강새 2009-04-14 0 2258
257 마이크로프로세서 IAR-EWAVR_4.xx_Educational_Manual [4] 무료 용가리통뼈 2009-04-01 0 3390
256 마이크로프로세서 매뉴얼_IAR_AVR_Compiler_EWAVR_V310_13 [4] 무료 용가리통뼈 2009-04-01 0 3198
255 마이크로프로세서 RTX51-Full 메뉴얼입니다. [5] 무료 테나르 2009-03-24 0 3566
254 마이크로프로세서 파트3입니다. [3] 무료 테나르 2009-03-24 0 4868
253 마이크로프로세서 파트2입니다. [3] 무료 테나르 2009-03-24 0 5160
252 마이크로프로세서 있는지 모르지만 다른 유용한 자료 올립니다. [3] 무료 테나르 2009-03-24 0 4808
251 마이크로프로세서 part3 입니다. [7] 무료 테나르 2009-03-24 0 3287
250 마이크로프로세서 part 2입니다. [8] 무료 테나르 2009-03-24 0 3303
249 마이크로프로세서 AVR 과 관련한 유용한 자료일거 같네요... [13] 무료 테나르 2009-03-19 0 3471
248 마이크로프로세서 C FAQ 입니다.... [6] 무료 테나르 2009-03-19 0 2139
247 마이크로프로세서 괜찮은 RS232 유틸[AccessPort] [3] 무료 아크마 2009-03-03 0 4778
246 마이크로프로세서 lcd기초부터 폰트만들기까지. [20] 무료 인성 2009-02-01 0 6593
» 마이크로프로세서 AVR을 이용한 시리얼통신 자동접속 소스입니다. [8] 무료 바람을본소년 2009-01-29 0 6959
244 마이크로프로세서 uvision2 사용법 [2] 무료 닉닉 2009-01-20 0 4590
243 마이크로프로세서 타이머/카운터/인터럽트 강좌 [86] 무료 clot 2009-01-19 0 9655
242 마이크로프로세서 8051 컴파일러 프로그램 [1] 무료 닉닉 2009-01-15 0 6616
241 마이크로프로세서 신호등소스 [3] 무료 sujin20011 2008-12-18 0 4880
240 마이크로프로세서 pxa255 자료 올립니다 [4] 무료 あさひ 2008-11-25 0 5153
  • 어떤 일이건 60분을 계속 생각하면 결국 도달하는 것은 혼란과 불행이다.
    - 제임스 사버
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.