| 1 | +//*****************************************************************************
 | 
| 2 | +//* Project: RF-Firmware for ISM                                              *
 | 
| 3 | +//* Function: UART RECV                                                       *
 | 
| 4 | +//* Parameters: None                                                          *
 | 
| 5 | +//* Returns: None                                                             *
 | 
| 6 | +//* Action: RX_Data                                                           *
 | 
| 7 | +//* Duration: tbd                                                             *
 | 
| 8 | +//* Size: tbd                                                                 *
 | 
| 9 | +//* Date:                                                                     *
 | 
| 10 | +//*---------------------C-Source Code-----------------------------------------*
 | 
| 11 | +//*SIGNAL_NAKED (SIG_USART_RECV)                        *
 | 
| 12 | +//*{                                      *
 | 
| 13 | +//*    uc_8 data,tmp;                                *
 | 
| 14 | +//*    uc_8 *ptr;                                *
 | 
| 15 | +//*     if(rf_rx_state==0x04){//receive                      *
 | 
| 16 | +//*      data = input(UDR0);                          *
 | 
| 17 | +//*      ptr = &rf_rx_buffer[0];                                           *
 | 
| 18 | +//*         ptr += rf_rx_counter;                                             *
 | 
| 19 | +//*         *ptr = data;                            *
 | 
| 20 | +//*         rf_rx_counter = (rf_rx_counter + 1)&0x1F;                         *
 | 
| 21 | +//*         checksum ^= data;                          *
 | 
| 22 | +//*         if(rf_rx_counter==rf_rx_buffer[0]){                  *
 | 
| 23 | +//*            rf_rx_state = 0xFF;                       *
 | 
| 24 | +//*        output(UCSR0A,0x00);                      *
 | 
| 25 | +//*        output(UCSR0B,0x00);                      *
 | 
| 26 | +//*        output(UCSR0C,0x00);                      *
 | 
| 27 | +//*        PU_PWR = 0;                            *
 | 
| 28 | +//*        RXON = 0;                            *
 | 
| 29 | +//*        ENABLE = 0;                            *         
 | 
| 30 | +//*    }                                    *
 | 
| 31 | +//*    else{//check for SOF                          *
 | 
| 32 | +//*      ptr = &sof_ary[0];                          *
 | 
| 33 | +//*         ptr += rf_rx_state;                                               *
 | 
| 34 | +//*         data = input(UDR0);                                               *
 | 
| 35 | +//*         if(data == *ptr){                                                 *
 | 
| 36 | +//*           rf_rx_state++;                                                *
 | 
| 37 | +//*        if(rf_rx_state==0x04){                      *
 | 
| 38 | +//*          ts = input(TCNT1);                             *
 | 
| 39 | +//*        }                                *
 | 
| 40 | +//*         }                                                                 *
 | 
| 41 | +//*         else{                                                             *
 | 
| 42 | +//*           rf_rx_state = 0x00;                                           *
 | 
| 43 | +//*         }                                                                 *         
 | 
| 44 | +//*    }                                    *
 | 
| 45 | +//*                                           *
 | 
| 46 | +//*}                                      *
 | 
| 47 | +//*****************************************************************************
 | 
| 48 | +SIGNAL_NAKED (SIG_USART_RECV)
 | 
| 49 | +{
 | 
| 50 | +  __asm__ __volatile__ (
 | 
| 51 | +  "  .EQU UDR0,0xC6        ;Assembler defines          \n"
 | 
| 52 | +  "  .EQU PORTB,0x05        ;Assembler defines          \n"
 | 
| 53 | +  "  .EQU PORTD,0x0B        ;Assembler defines          \n"
 | 
| 54 | +  "  .EQU PORTC,0x08        ;Assembler defines          \n"
 | 
| 55 | +  "  .EQU TCNT1L,0x84      ;Assembler defines          \n"
 | 
| 56 | +  "  .EQU TCNT1H,0x85      ;Assembler defines          \n"
 | 
| 57 | +  "  .EQU UCSR0C,0xC2      ;Assembler defines          \n"
 | 
| 58 | +  "  .EQU UCSR0A,0xC0      ;Assembler defines          \n"
 | 
| 59 | +  "  .EQU UCSR0B,0xC1      ;Assembler defines          \n"
 | 
| 60 | +  "  .EQU TMP_REG0,0x1E      ;Assembler defines          \n"
 | 
| 61 | +  "  .EQU TMP_REG1,0x2A      ;Assembler defines          \n"
 | 
| 62 | +  "  .EQU TMP_REG2,0x2B      ;Assembler defines          \n"
 | 
| 63 | +  "  .EQU TMP_REG3,0x28      ;Assembler defines          \n"
 | 
| 64 | +  "  /****************/                        \n"
 | 
| 65 | +  "  /*Save Registers*/                        \n"
 | 
| 66 | +  "  /****************/                        \n"
 | 
| 67 | +  "   OUT  TMP_REG0,R25        ;12 Store R25            \n"
 | 
| 68 | +  "  OUT  TMP_REG1,R30      ;13Store R30            \n"
 | 
| 69 | +  "  OUT  TMP_REG2,R31      ;14 Store R31            \n"
 | 
| 70 | +  "  IN   R31,__SREG__      ;15 Load SREG into R31        \n"
 | 
| 71 | +  "  OUT  TMP_REG3,R31      ;16 Store R31            \n"
 | 
| 72 | +  "  LDS  R25,rf_rx_state    ;18 Load rf_rx_state into R25    \n"
 | 
| 73 | +  "  CPI   R25,0x04        ;19 Compare rf_rx_state to 0x04    \n"
 | 
| 74 | +  "  /****************/                        \n"
 | 
| 75 | +  "  /*Check SOFs    */                        \n"
 | 
| 76 | +  "  /****************/                        \n"
 | 
| 77 | +  "  BREQ RX_PAYLOAD        ;20 If not equal check SOF      \n"
 | 
| 78 | +  "  LDI  R30,lo8(sof_ary)    ;21 Setup pointer          \n"
 | 
| 79 | +  "  LDI  R31,hi8(sof_ary)    ;22 Setup pointer to sof_ary    \n"
 | 
| 80 | +  "  ADD  R30,R25        ;23 Adjust pointer offset      \n"
 | 
| 81 | +  "  LD   R31,Z          ;25 Load value pointed to      \n"
 | 
| 82 | +  "  LDS  R30,UDR0        ;27 Load data received by the USART  \n"
 | 
| 83 | +  "  CP   R31,R30        ;28 Compare usart data and sof_ary[n]\n"
 | 
| 84 | +  "  BRNE RESET_RX        ;29 If not equal Jump        \n"
 | 
| 85 | +  "  INC  R25          ;30 Increment rf_rx_state      \n"
 | 
| 86 | +  "  STS   rf_rx_state,R25    ;32 Increment rf_rx_state      \n"
 | 
| 87 | +  "  CPI   R25,0x04        ;33 Compare rf_rx_state to 0x04    \n"
 | 
| 88 | +  "  BRNE END_RX_IRQ        ;34 IF not equal Jump        \n"
 | 
| 89 | +  "  /*****************/                        \n"
 | 
| 90 | +  "  /*     SYNC      */                        \n"
 | 
| 91 | +  "  /*****************/                        \n"
 | 
| 92 | +  "  LDS R30,TCNT1L        ;36 Take Timestamp from TCNT1    \n"
 | 
| 93 | +  "  STS ts,R30          ;38 and store it to the global variable\n"
 | 
| 94 | +  "  LDS R30,TCNT1H        ;40 called ts            \n"
 | 
| 95 | +  "  STS ts+1,R30        ;42                  \n"
 | 
| 96 | +  "  RJMP END_RX_IRQ        ;44                  \n"
 | 
| 97 | +  "  /****************/                        \n"
 | 
| 98 | +  "  /*RX RF - Data  */                        \n"
 | 
| 99 | +  "  /****************/                        \n"
 | 
| 100 | +  "  RX_PAYLOAD:          ;22 If equal receive the RF data  \n"
 | 
| 101 | +  "  LDS  R25,UDR0        ;24 Load data received by the USART \n"
 | 
| 102 | +  "  LDI  R31,hi8(rf_buffer_rx)  ;25 Setup pointer to rf_buffer_rx  \n"
 | 
| 103 | +  "  LDS  R30,rf_rx_counter    ;27 Setup pointer to rf_buffer_rx  \n"
 | 
| 104 | +  "  ST   Z,R25          ;29 Store rxed value to location pointed\n"
 | 
| 105 | +  "  INC  R30          ;30 Increment rf_rx_counter      \n"
 | 
| 106 | +  "  ANDI R30,0x3F        ;31 Adjust rf_rx_counter      \n"
 | 
| 107 | +  "  STS  rf_rx_counter,R30    ;33 Store back rf_rx_counter    \n"
 | 
| 108 | +  "  LDS   R31,checksum      ;35 Load checksum          \n"
 | 
| 109 | +  "  EOR  R31,R25        ;36 Xor received byte to checksum  \n"
 | 
| 110 | +  "  STS   checksum,R31      ;38 Store back checksum        \n"
 | 
| 111 | +  "  LDS   R25,rf_buffer_rx    ;40 Load packet length byte      \n"
 | 
| 112 | +  "  CP   R25,R30        ;41 Compare length byte to rf_rx_counter\n"
 | 
| 113 | +  "  BRNE END_RX_IRQ        ;42 If not equal Jump        \n"
 | 
| 114 | +  "  /******************/                      \n"
 | 
| 115 | +  "  /*Finish reception*/                      \n"
 | 
| 116 | +  "  /******************/                      \n"
 | 
| 117 | +  "  LDI   R25,0xFF        ;44 Set rf_rx_state to 0xFF      \n"
 | 
| 118 | +  "  STS  rf_rx_state,R25    ;46 indicating a complete RX cycle  \n"
 | 
| 119 | +  "  LDI  R25,0x00        ;47 Disable USART interface      \n"
 | 
| 120 | +  "  STS UCSR0B,R25        ;49 Disable USART interface      \n"
 | 
| 121 | +  "  STS UCSR0C,R25        ;51 Disable USART interface      \n"
 | 
| 122 | +  "  CBI PORTD,2           ;53 Power down the RF - Chip    \n"
 | 
| 123 | +  "  CBI PORTD,5          ;55 Power down the RF - Chip    \n"
 | 
| 124 | +  "  CBI PORTC,1          ;57 Power down the RF - Chip    \n"
 | 
| 125 | +  "  CBI PORTB,1          ;59 Power down the RF - Chip    \n"
 | 
| 126 | +  "  RJMP END_RX_IRQ        ;61 Jump to end of ISR        \n"
 | 
| 127 | +  "  RESET_RX:          ;                  \n"
 | 
| 128 | +  "  STS  rf_rx_state,R1      ;33Set rf_rx_state to zero      \n"
 | 
| 129 | +  "  /****************/                        \n"
 | 
| 130 | +  "  /*Load Registers*/                        \n"
 | 
| 131 | +  "  /****************/                        \n"
 | 
| 132 | +  "  END_RX_IRQ:                            \n"
 | 
| 133 | +  "  IN    R31,TMP_REG3      ;62 Restore R31            \n"
 | 
| 134 | +  "  OUT   __SREG__,R31      ;63 Restore SREG          \n"
 | 
| 135 | +  "  IN    R31,TMP_REG2      ;64 Restore R31            \n"
 | 
| 136 | +  "  IN    R30,TMP_REG1      ;65 Restore R30            \n"
 | 
| 137 | +  "  IN    R25,TMP_REG0      ;66 Restore R25            \n"
 | 
| 138 | +  "   RETI                   ;70 Return from ISR          \n"
 | 
| 139 | +  : : );
 | 
| 140 | +}
 |