본문 바로가기

정리중인 카테고리/전공 기술

ATmega128 - 적외선 신호(리모콘 신호) 수신 동작 소스.

// 일반 송신 함수

void usart_tx_byte(u08 tx_data){

 while(!(UCSRA&0x20));

 UDR=tx_data;

 UCSRA|=0x20;

}


// 송신할 데이터를 16진 데이터로 변형후 송신

void usart_tx_byte_hex(u08 tx_hex_data){

 unsigned char h_data, l_data;


 l_data=tx_hex_data&0x0f; h_data=tx_hex_data>>4;


 if(h_data<0x0a) h_data=h_data+0x30;

 else h_data=h_data+0x37;

 usart_tx_byte(h_data);


 if(l_data<0x0a) l_data=l_data+0x30;

 else l_data=l_data+0x37;

 usart_tx_byte(l_data);

}


// 일반 패킷 단위 송신 함수

void usart_tx_bytes(u08 *tx_data) {

 while(*tx_data != '\0'){

  usart_tx_byte(*tx_data);

  tx_data++;

 }

}



------------------------------------------------------------------------------------------------


char _remocon_counter,_save_remocon,_flg_remocon;

char bit_input;


int _counter_remocon;


u08 _remocon_custom,_remocon_custom_2;

u08 _remocon_data,_remocon_data_2;


ISR(SIG_INTERRUPT0){

 if(_flg_remocon){

  // 0 비트 데이터를 확인

  if((_counter_remocon>=20)&&(_counter_remocon<=48)) bit_input=0;

  // 1 비트 데이터를 확인

  else if((_counter_remocon>=60)&&(_counter_remocon<=112)) bit_input=1;


  switch(_save_remocon){

   case 1: // 커스텀 코드1 을 저장한다

    _remocon_custom<<=1; _remocon_custom|=bit_input;

    break;

   case 2: // 커스텀 코드2 을 저장한다

    _remocon_custom_2<<=1; _remocon_custom_2|=bit_input;

    break;

   case 3: // 데이터 코드1 을 저장한다

    _remocon_data<<=1; _remocon_data|=bit_input;

    break;

   case 4: // 데이터 코드2 을 저장한다

    _remocon_data_2<<=1; _remocon_data_2|=bit_input;

    break;

  }

  _remocon_counter++;


  if(_remocon_counter>=8){

   _save_remocon++; _remocon_counter=0;

  }


  // 수신 완료

  if(_save_remocon>=5){

   usart_tx_bytes("C1: 0x");

   usart_tx_byte_hex(_remocon_custom);

   usart_tx_bytes("  C2: 0x");

   usart_tx_byte_hex(_remocon_custom_2);

   usart_tx_bytes("  D1: 0x");

   usart_tx_byte_hex(_remocon_data);

   usart_tx_bytes("  D2: 0x");

   usart_tx_byte_hex(_remocon_data_2);

   usart_tx_bytes("\r\n");

  }

 }

 // 리모콘 신호가 휴지 상태일 경우 플래그 변수들 초기화

 else if((_counter_remocon>=480)&&(_counter_remocon<=600)){

  if(!_flg_remocon){

   _flg_remocon=1;

   _save_remocon=1;

  }

 }

 _counter_remocon=0;

}


ISR(SIG_OVERFLOW0){

 TCNT0=0xff-TIMER0_CNT; _counter_remocon++;


 // 리모콘 신호가 감지되지 않을 경우, 플래그 변수들을 초기화 한다

 if(_counter_remocon>=200){

  _flg_remocon=0; _save_remocon=0; _remocon_counter=0;

 }

}