Hallo Forum, Ich habe den 8Bit Timer0 wie folgt in C initialisiert: TCCR0 |= (1<<CS00)|(1<<CS02); // CPU-Takt/1024 TIMSK |= (1<<TOIE0); // Timer0 Inetrrupt enable sei(); // Global Interrupt enable ISR(TIMER0_OVF_vect) // Interrupt Funktion { //Interrupt code } Mein Problem ist jetzt, dass die zugehörige Interrupt Funktion nicht ausgeführt wird (Compalierung erfolgreich). Mfg und danke für alle Beiträge!
Und was verleitet Dich zu der Annahme, dass die ISR nicht ausgeführt wird? Hast Du das in Hardware oder nur im Simulator getestet?
Die Hardware (LED) zeigt keine Reaktion. Sobald die Interrupt Funktion aufgerufen wird soll dies eine LED anzeigen (bleibt aber dunkel).
Schick doch bitte mal das komplette Programm und die Information, welchen µC Du verwendest, wie die LED angeschlossen ist usw. Weiß echt nicht, warum man das immer wieder sagen muss...
RISC AVR-Mikrocontroller (ATmega8) der Firma ATMEL Test LED wird von Port B PIN 2 angesteuert Das Programm läuft bis zur ersten "while(flag_1==0)" Schleife und sitzt dann fest, d.h. die rote LED leuchtet. Würde ISR ausgeführt werden müsste die gelbe LED nach einiger Zeit leuchten... Danke schon mal für Deine Mühen, Programm im Anhang.
Das ist doch schon viel besser. Warum nicht gleich so? Da sieht man doch sofort den Fehler. Variablen, die sowohl im Hauptprogramm als auch in Interrupt Handlern verwendet werden, müssen volatile deklariert werden! Also "volatile unsigned int flag;" Abgesehen davon ist es eine ziemliche Speicherverschwendung, für eine Variable, die nur 0 oder 1 sein kann, einen int zu verwenden. Da tuts auch ein char.
@Rolf: counter wird nur in der ISR verwendet, muss also nicht volatile sein!
Hallo, hab meine Variable flag_1 jetzt volatile gemacht. Dies hat aber mein Problem, dass die Intterrupt Funktion nicht ausgeführt wird, leider nicht behoben. Hab auch schon versucht das Timer overflow flag TOV0 im Register TIFR manuell zu setzen, was aber auch nicht zur Verzweigung in ISR geführt hat. Eigentlich kann es doch nur noch am Funktionsrumpf "ISR(TIMER0_OVF_vect)" liegen? Danke für alle Beiträge (Code weiter oben)
Kann das jetzt grad leider nicht überprüfen, aber schau mal nach, ob der Vektor nicht "TIMER0_OVF0_vect" heißt, also mit ner '0' hinter dem OVF. Ich meine, mich erinnern zu können, dass es da in der libc bei bestimmten Controllern diese (zugegebenermaßen nicht sonderlich logische) Bezeichnung gab.
Hab dein Prog in mein Testboard geladen, die ISR funktioniert. Dein Testled solltes du auf PINB3 geben nicht PINB2 dann siehst du es auch flimmern. Mit deinem while Konstrukt im main komme ich allerdings nicht zurecht, das solltest du mal überdenken.
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.