Hallo, Ich versuche mit Timer0 und Interrupt service Routine von Atmega128 zu üben, den Quellcode befindet sich unten. Das Proramm befindet sich ständig in der ISR Routine. In der ISR soll die Variable inkremntiert und nach erreichen von 100 soll neu hochzählen. Wo liegt meine Fehler? Danke //---------------------------------- #include <avr/io.h> #include <avr/interrupt.h> unsigned int var; void init_tim0(void) { TCCR0 = (1 << WGM01) | (0 << CS02) | (1 << CS01) | (1 << CS00); OCR0 = 114; TIMSK = (1<<OCIE0); } ISR (SIG_OUTPUT_COMPARE0) { var = var + 1; } int main (void) { var = 0; init_tim0(); sei(); while(1) { if (var == 100) var = 0; } return 0; }
Dein Fehler ist, so seltsam es auch klingen mag: Du hast bei der Definition von var das volatile vergessen. Dadurch hat dir der Compiler aus der Hauptschleife alles rausgeworfen und dadurch sieht es dann im Debugger so aus, als ob nur noch die ISR laufen würde.
1 | //----------------------------------
|
2 | #include <avr/io.h> |
3 | #include <avr/interrupt.h> |
4 | |
5 | volatile unsigned int var; |
6 | |
7 | void init_tim0(void) |
8 | {
|
9 | TCCR0 = (1 << WGM01) | (0 << CS02) | (1 << CS01) | (1 << CS00); |
10 | OCR0 = 114; |
11 | TIMSK = (1<<OCIE0); |
12 | }
|
13 | |
14 | ISR (SIG_OUTPUT_COMPARE0) |
15 | {
|
16 | var = var + 1; |
17 | }
|
18 | |
19 | int main (void) |
20 | {
|
21 | |
22 | var = 0; |
23 | init_tim0(); |
24 | sei(); |
25 | |
26 | while(1) |
27 | {
|
28 | if (var == 100) var = 0; |
29 | }
|
30 | return 0; |
31 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.