메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

묻고 답하기
WhiteAT2008.01.25 10:11

1.
네이버에서 검색해보니 http://krdic.naver.com/search.nhn?query_euckr=%C0%C0%B4%E4%BD%C3%B0%A3

응답이 시작되기까지 걸리는 시간이라고 하네요.^^.
50mS 면 충분한 시간일듯 합니다..

2. TX함수에서 송신시에는 그냥 연속으로 데이터를 보내세요.
     TX 인터럽트를 사용하지 않고 한 바이트씩 나눠서 보내면, 수신측에서 연속으로 오는 데이터가 아니라서 노이즈로 판단할수도 있습니다.
    ( 저도 개인적으로 이 부분(TX)을 인터럽트로 처리하는 방법으로 변경해야 하는데, 아직 별 문제가 없고, 귀차니즘 때문에 그냥 사용합니다.^^)

void Tx(void) {

  if(tx_step ==0) {
    //통신칩 register 세팅
   write_reg(xxxx);
   tx_step++;
  }
 else if(tx_step==1) {
     // Main while에서 받은 값을 tx 버퍼 큐에 쓴다.
    Write_Data(ui8Z85_TBuf[tx_data_cnt]); 
       tx_data_cnt++;
       if(tx_data_cnt >= 14){u8tx_step = 3;}
 
    for(i = 0;i<14;i++)   //  데이터는 연속으로 보내야....
          Send Data;
    tx_step = 3;
    timer = 1900;;  // 딜레이도 여기에 주는게...

   }
  else if(tx_step==3) { //Rx 를 위한 세팅..
      
      delay(1900);  // 여기도 delay가 있었네요. -.-'
      
      tx_data_cnt  = 0;
      tx_step =0;
    
      Write_reg(0x21); //Rx 수신대기를 위한 칩 세팅 -- 그렇다면 이 부분도 인터럽트 루틴에 넣는 것이 좋을까요?..
      Write_reg(0x3e);
      Write_reg(0x92);
      Write_reg(0x23);
      ...........................
      Write_reg(0x02);
    }
}

3.
PC 와 통신을 해보라고 말한거는, 꼭 PC와 통신 하라는 뜻이 아니고요^^
AVR이 8Mhz일 때 9600bps 이상일 경우 통신이 잘 안되기 때문에 그 보레이트에서 에러가 없는지 확인해보시라는 뜻이었습니다.^^ (이건 괜히 급하게 언급했나 보네요ㅡㅡ;)


4.
RX 인터럽트는 주기가 필요하지 않습니다.
데이터가 수신되는 즉시 걸리는 루틴입니다.

RX 인터럽트 루틴에서는 큐에 데이터를 넣기만 하고요

interrupt [USART0_RXC] void usart0_rx_isr(void)
{
 char status,uart_data;
 status=UCSR0A;
 uart_data = UDR0;   /* Read receive data */
 //  putchar1('4');
 if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
 {          
  if (structRX0Info.rx_wr_index1 >= RX_BUFFER_SIZE1-1) structRX0Info.rx_wr_index1=0;
  structRX0Info.rx_buffer[structRX0Info.rx_wr_index1]=uart_data;
  structRX0Info.rx_wr_index1++; 
 };
}



데이터 분석 함수에서는 데이터를 분석만 하면 됩니다.
TX()// 즉 데이터 분석 함수에서는
큐에 저장된 데이터를 하나씩 꺼내와서 분석만 하면 될겁니다.

INT16S getchar0(void){
 INT16S iReturnValue = -1;
 #asm("cli")
 if( structRX0Info.rx_rd_index1 >= structRX0Info.rx_wr_index1){
   structRX0Info.rx_rd_index1 = 0;
   structRX0Info.rx_wr_index1 = 0;
  iReturnValue = -1;
 }else{
  if(structRX0Info.rx_rd_index1 >= RX_BUFFER_SIZE1-1){
   structRX0Info.rx_rd_index1 = 0;
  }
  iReturnValue = structRX0Info.rx_buffer[structRX0Info.rx_rd_index1];
  structRX0Info.rx_rd_index1++;
 }
 return iReturnValue;
}



Tx(){ 
 iRxData=getchar0(); // 큐에 데이터가 있는지 확인
while (0<= iRxData && iRxData<=255 )  // 
 {
      하나씩 꺼내서 분석...
      패킷이 일치하면 tx_flag = on;
        
 }

}




 

사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )