1 | ISR ( USART1_RX_vect )
|
2 | {
|
3 | uint8_t temp;
|
4 | //-- fetch receiced data & store --------------------------------
|
5 | temp = UDR1;
|
6 | switch ( rx_state )
|
7 | {
|
8 | //-- address received -------------------------------------------
|
9 | case ( rx_state_idle ):
|
10 | //-- address match? ---------------------
|
11 | if ( ( temp == cluster_address )
|
12 | || ( temp == 0xFF ) ) // broadcast address
|
13 | {
|
14 | //-- start timing surveilance -------
|
15 | TIFR |= (1<<TOV0); // clear overflow flag
|
16 | TCNT0 = 0x00; // preload timer
|
17 | TCCR0 = (3<<CS00); // clk/32
|
18 | //-- data receive -------------------
|
19 | UCSR1A &= ~(1<<MPCM); // switch off mcpm
|
20 | //-- data counter & storage ---------
|
21 | rx_data_counter = 0x00;
|
22 | rx_data_sum = temp;
|
23 | rx_data_buffer[rx_data_counter] = temp;
|
24 | //-- state led: receive data --------
|
25 | PORTB &= ~(1<<PB4); // switch on recv-led
|
26 | //-- next state in state maschine ---
|
27 | rx_state = rx_state_receving;
|
28 | }
|
29 | break;
|
30 | //-- data received ------------------------------------------
|
31 | case ( rx_state_receving ):
|
32 | //-- restart timing surveilance ---------
|
33 | TIFR |= (1<<TOV0); // clear overflow flag
|
34 | TCNT0 = 0x00; // preload timer
|
35 | TCCR0 = (3<<CS00); // clk/32
|
36 | //-- data counter & storage -------------
|
37 | if ( rx_data_counter == 255 ) // packet overlength
|
38 | {
|
39 | //-- stopp timing surveilance -------
|
40 | TCCR0 = 0x00;
|
41 | //-- state led: receive data --------
|
42 | PORTB |= (1<<PB4); // switch off recv-led
|
43 | //-- prepare for new address --------
|
44 | UCSR1A = (1<<MPCM); // switch on mcpm
|
45 | rx_state = rx_state_idle;
|
46 | }
|
47 | else
|
48 | {
|
49 | rx_data_buffer[++rx_data_counter] = temp;
|
50 | rx_data_sum += temp;
|
51 | }
|
52 | break;
|
53 | }
|
54 | }
|
55 | ISR ( TIMER0_OVF_vect )
|
56 | {
|
57 | uint8_t loop_counter = 0x00;
|
58 | //-- stopp timing surveilance -----------------------------------
|
59 | TCCR0 = 0x00;
|
60 | //-- state led: receive data ------------------------------------
|
61 | PORTB |= (1<<PB4); // switch off recv-led
|
62 | //-- prepare for new address ------------------------------------
|
63 | UCSR1A = (1<<MPCM); // switch on mcpm
|
64 | rx_state = rx_state_idle; // reset state maschine
|
65 | //-- test recvd data for errors ---------------------------------
|
66 | if ( ( rx_data_buffer[2] + 3 == rx_data_counter ) // no data missing?,
|
67 | && ( (uint8_t) rx_data_sum == 0x00 ) )// checksum ok
|
68 | {
|
69 | //-- do public for application ----------
|
70 | for ( loop_counter = 0x00; loop_counter != rx_data_counter; loop_counter++)
|
71 | {
|
72 | rx_data_valid[loop_counter] = rx_data_buffer[loop_counter];
|
73 | }
|
74 | }
|
75 | }
|