-
Interrupt Problem mit c
Hallo,
Ich brauche nun für einen bestimmten Grund in relativ großen Zeitabständen (0,5-2 sekunden) einen Interrupt.
Dafür wollte ich dann den Beispielcode hier verwenden.
Ich habe ihn noch etwas verändert und nun sieht er so aus:
Code:
#ifndef F_CPU
#define F_CPU 1000000
#endif
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <avr/interrupt.h>
volatile int stat=0;
ISR(TIMER2_OVF_vect)
{
if(stat = 0){
stat=1;
PORTB |= (1<<PB0);
}else{
stat=0;
PORTB &= ~(1<<PB0);
}
}
int main(void){
DDRB |= (1<<PB0);
sei();
TCCR2 = (1<<CS22) | (1<<CS20);
TIMSK |= (1<<TOIE2);
while(1){}
}
Ich will damit testweise eine LED an B0 zum blinken kriegen.
Es geht bloß leider nicht.
Ich verwende einen atmega32 und avr-gcc (avr studio).
Hat da irgendjemand eine Idee?
-
Versuche einmal das sei direkt vor die while Schleife.
in die ISR kannst du auch "PORTB ^= (1<<PB0);" schreiben (Invertiere PB0).
Die Einstellungen habe ich mir nicht angeschaut.
MfG Hannes
-
Nee, hat immer noch nicht funktioniert.
-
Bei dieser Zeile if(stat = 0){ sollte dir der Compiler eigentlich ein Warning ausgeben.
Richtig ist if(stat == 0){
-
Ja stimmt, hätte er gesollt.
Ich habe aber durch andre Tests herausgefunden, dass die ISR nie aufgerufen wird.
Außerdem habe ich jetzt das ganze if...else durch PORTB ^= (1<<PB0); ersetzt.
-
In der Simulation läuft es aber. Bist du sicher das da nicht ein anderer HW-Wurm drinnen ist?
-
Wenn ich das PORTB ^= (1<<PB0); in die while(true) schreibe,
dann leuchtet die LED so mittel. Das Oszi bestätigt ein sehr schnelles PWM.
Also Hardwaremäßig läuft eigentlich alles.
-
Das ist klar das dann die Led mit etwa halber Kraft leuchtet. Die Led ist so zu 50% ein und zu 50% aus => Tastgrad=50%.
Das war aber schon einmal ein guter Test, so kann man sicher sein das die Led funktioniert.
Versuche einmal ob das TOV2-Flag im Register TIFR sich ändert. Du könntest zusätzlich (damit du das siehst) eine Delay Zeit einfügen.
MfG Hannes
-
Wann soll ich das ausprobieren, zur Laufzeit?
-
Du könntest es in der while Schleife das Flag prüfen. So kannst du sicher sein das der Timer läuft.
MfG Hannes