blackbox/interrupts.c

Fri, 09 Dec 2011 09:40:15 +0100

author
Malte Bayer <mbayer@neo-soft.org>
date
Fri, 09 Dec 2011 09:40:15 +0100
changeset 53
f659e6faf18f
child 56
a20f59a3016c
permissions
-rw-r--r--

moved ISRs from main.c to interrupts.c

53
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
1 ISR ( TIMER1_COMPA_vect ) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
2 //PORTC ^= _BV(PC0); // DEBUG OUTPUT SYSTEM CLOCK
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
3
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
4 // trigger packet transfer:
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
5 if (sysclk_packettimer == 14) { // 15*500 = 7500 NS
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
6 transmit_len = transmit_len_next;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
7 sysclk_packettimer = 0;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
8 } else sysclk_packettimer++;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
9 // here is some more time to do something else...
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
10
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
11 // reset both car counters to overflow
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
12 car0_old = TIMER1_500NS;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
13 car1_old = TIMER1_500NS;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
14
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
15 sysclk.value++; // increment 500ns timer
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
16 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
17
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
18 ISR ( TIMER2_COMP_vect ) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
19 //OCR2 = TIMER2_50US; // make sure that timer2 is 50µs !!!
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
20 // data packet timer 100µs pro bit...
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
21 if (transmit_len >= 0xFE) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
22 if (transmit_len != 0xFF) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
23 RAIL_POWER_PORT |= _BV(RAIL_POWER); // end of transmission
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
24 transmit_len = 0xFF;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
25 transmit_buffer = transmit_buffer_queue;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
26 transmit_buffer_queue = 0;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
27 transmit_len_next = transmit_len_queue;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
28
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
29 // start the response receiver timer
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
30 // TODO: only on 8 timeslots, not on every transmission
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
31 // TODO: give slot number to timer - then store the transmission to 8 slots array
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
32 TCNT0 = TIMER0_250US;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
33 timer0_delay = TIMER0_2300NS;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
34 response = 0;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
35 response_len = 0;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
36 TIMSK |= _BV(TOIE0);
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
37
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
38 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
39 } else {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
40 uint16_t bit = (1<<(transmit_len & 0b01111111));
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
41 uint16_t clock;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
42 if ((transmit_len & 0b10000000) == 0) clock = 0; else clock = 0xffff;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
43 if ( ((transmit_buffer ^ clock) & bit) != 0 )
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
44 RAIL_POWER_PORT |= _BV(RAIL_POWER); else
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
45 RAIL_POWER_PORT &= ~_BV(RAIL_POWER);
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
46 if ( (transmit_len & 0b10000000) == 0 ) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
47 // block 0
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
48 //if (transmit_len == 0) transmit_len = 0xFF; else transmit_len |= 0b10000000; // set clock
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
49 transmit_len |= 0b10000000; // set clock
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
50 } else {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
51 // block 1, output the current bit
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
52 transmit_len &= 0b01111111; // reset clock
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
53 //if (transmit_len != 0) transmit_len--; // next bit
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
54 if (transmit_len == 0) transmit_len = 0xFE; else transmit_len--; // next bit
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
55 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
56 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
57 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
58
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
59
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
60 ISR ( TIMER0_OVF_vect ) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
61 // TODO: last bit should be set by the sender, not from us!
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
62 TCNT0 = TIMER0_250US;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
63 if (timer0_delay == 0) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
64 RAIL_POWER_PORT &= ~_BV(RAIL_POWER); // pull rails low
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
65 _delay_us(28); // wait some cycles
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
66 if ((PIN(RAIL_DETECT_PORT) & _BV(RAIL_DETECT)) != 0) { // check for logic zero
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
67 if (response == 0) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
68 // there is no start bit, so stop the timer and cancel response receiving
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
69 TIMSK &= ~_BV(TOIE0);
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
70 } else {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
71 // we received a bit (logic low)
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
72 response = response << 1;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
73 response_len++;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
74 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
75 } else {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
76 // okay, we have logic high
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
77 response = response << 1;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
78 response |= 1;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
79 response_len++;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
80 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
81 if (response_len == 15) { // maximum response length reached
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
82 RAIL_POWER_PORT |= _BV(RAIL_POWER); // restore rails power
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
83 TIMSK &= ~_BV(TOIE0);
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
84 } else {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
85 _delay_us(20); // wait some cycles
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
86 RAIL_POWER_PORT |= _BV(RAIL_POWER); // restore rails power
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
87 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
88 } else timer0_delay--; // 2.3 ms delay not reached yet
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
89 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
90
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
91 ISR (INT0_vect) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
92 // car0 detector
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
93 uint16_t tmp = 0;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
94 car0_new = TCNT1; // get current counter
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
95 if (car0_old < car0_new) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
96 // calculate difference
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
97 if (car0 == 0) tmp = car0_new-car0_old;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
98 if ( (tmp > 54) && (tmp < 74) ) car0 = 1;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
99 if ( (tmp > 118) && (tmp < 138) ) car0 = 2;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
100 if ( (tmp > 186) && (tmp < 206) ) car0 = 3;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
101 if ( (tmp > 246) && (tmp < 266) ) car0 = 4;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
102 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
103 car0_old = car0_new;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
104 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
105
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
106 ISR (INT1_vect) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
107 // car1 detector
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
108 uint16_t tmp = 0;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
109 car1_new = TCNT1; // get current counter
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
110 if (car1_old < car1_new) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
111 // calculate difference
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
112 if (car1 == 0) tmp = car1_new-car1_old;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
113 if ( (tmp > 54) && (tmp < 74) ) car1 = 1;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
114 if ( (tmp > 118) && (tmp < 138) ) car1 = 2;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
115 if ( (tmp > 186) && (tmp < 206) ) car1 = 3;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
116 if ( (tmp > 246) && (tmp < 266) ) car1 = 4;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
117 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
118 car1_old = car1_new;
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
119 }
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
120
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
121
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
122 ISR (INT2_vect) {
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
123 // Lap counter Interrupt
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
124 // do not know if this ever occurs ?! this is normally an output pin to trigger the counter start
f659e6faf18f moved ISRs from main.c to interrupts.c
Malte Bayer <mbayer@neo-soft.org>
parents:
diff changeset
125 }

mercurial