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 | +}
|