Hallo, ich arbeite gerade mit einem Windsensor und muss die Zeit messen die für eine Umdrehung gebraucht wird. Dafür läuft der Timer0 und liefert alle 1ms einen interrupt. In der ISR zähle ich eine Varible hoch. Der windsensor löst bei jeder Umdrehung einen Interrupt aus. In dieser ISR möchte ich dann die verstrichene Zeit in eine andere Varible retten und die zählvariable auf null setzen. Das funktioniert auch alles und die Variablen haben auch in den ISRs ihre werte. Aber sobald ich im Main die Dauer auswerten möchte ist sie dort immer 0. Trotz volatile bei der Variable ;-)
1 | /************************************************
|
2 | |
3 | Wetterstation
|
4 | ATmega8 XTAKL 4Mhz
|
5 | 22.08.2009
|
6 | |
7 | ************************************************/
|
8 | |
9 | |
10 | volatile unsigned int zeit = 0; |
11 | volatile unsigned int dauer = 0; |
12 | |
13 | |
14 | #define F_CPU 4000000UL
|
15 | |
16 | #include <avr/io.h> |
17 | #include <avr/interrupt.h> |
18 | #include <stdlib.h> |
19 | #include <util/delay.h> |
20 | |
21 | #include "uartsubs.h" |
22 | |
23 | |
24 | |
25 | int main (void) |
26 | {
|
27 | char buffer2[16]; |
28 | |
29 | uartinit(9600); |
30 | |
31 | // Port Init
|
32 | PORTD |= (1<<PD2); // Pullup für Windsensor |
33 | |
34 | |
35 | // Timer init
|
36 | TCCR0 |= (1<<CS01) | (1<<CS00); |
37 | TIMSK |= (1<<TOIE0); |
38 | |
39 | // Interrupt
|
40 | GICR |= (1<<INT0); // INT0 frei |
41 | MCUCR |= (1<<ISC01); // Fallende Flanke |
42 | sei(); |
43 | |
44 | |
45 | |
46 | for(;;) |
47 | {
|
48 | |
49 | putbyte('#'); |
50 | |
51 | itoa(dauer,buffer2,10); |
52 | uart_puts(buffer2); |
53 | |
54 | putbyte('\r'); |
55 | putbyte('\n'); |
56 | |
57 | for(unsigned char i=0;i<100;i++) |
58 | _delay_ms(10); |
59 | }
|
60 | }
|
61 | |
62 | ISR(INT0_vect) |
63 | {
|
64 | cli(); |
65 | dauer = zeit; // Zeit speichern |
66 | zeit = 0; |
67 | |
68 | for(unsigned char i=0;i<15;i++) // Prellen abwarten, dauert 150 us Maximal |
69 | _delay_us(10); |
70 | |
71 | sei(); |
72 | }
|
73 | |
74 | |
75 | ISR(TIMER0_OVF_vect) // alle 1,008ms |
76 | {
|
77 | zeit++; |
78 | TCNT0 = 192; |
79 | }
|
Ich wäre sehr dankbar wenn mir jemand sagen/ helfen könnte warum die variable "dauer" im main immer 0 ist. Danke