Forum: Mikrocontroller und Digitale Elektronik Ausschaltverzöergung mit INT0 und TIMER0


von Tobi (Gast)


Lesenswert?

Hi
versuche eben eine einfache Ausschaltverzögerung hinzubekommen, die 
jedoch komplett interruptgesteuert funktioniert. Der Timer einzeln 
getestet funktioniert. Ebenso die Triggerung bei steigender Flanke auf 
INT0. Aber beides zusammen will nicht so ganz.
1
ISR(INT0_vect)
2
{
3
   TCNT0 = 0;            //Zähler zurücksetzen
4
   TIMSK |= (1<<TOIE0);  //Timer aktivieren
5
   PORTC=0xff;           //Mal zum testen gesammten Port auf 1
6
}
7
8
ISR(TIMER0_OVF_vect)
9
{
10
   PORTC=0;              //zum test wieder alles aus
11
   TIMSK &= ~(1<<TOIE0); //Timer deaktivieren
12
}
13
int main()
14
{
15
   ...
16
   MCUCR |= 0x0f; //INT0 und INT sollen bei steigender Flanke triggern
17
   GIMSK |= 0x40; //INT0 aktivieren
18
  
19
   TCCR0 = 0x03;  //Vorteiler 64 Systemtakt 4Mhz
20
   ...
21
}
Int0 kriegt alle 20ms nen Impuls mit ein paar µs-Breite. Der Timer 
müsste nach meiner Berechnung eine Verzögerung von ca 4ms auslösen. Was 
nun passiert ist, dass er immer wieder mal alle 20ms auslöst (nicht 
immer) und wenn, dann fällt das Signal nach 5µs wieder ab. Jemand eine 
Idee, warum dieses interrupt gesteuerte starten eines Timers nicht auf 
diese Weise funktioniert?

von MWS (Gast)


Lesenswert?

Aber klar doch :D

Da der Timer nicht angehalten wird, läuft er auch ohne enabelte ISR über 
und setzt dabei das OVF Flag. Sobald in der Int0 ISR der Timer0 
Interrupt erlaubt wird, wird dieser sofort ausgeführt.

Also: Timer erst starten in Int0 ISR (Prescaler vorher auf 0), oder TOV0 
Flag dort auf 1 schreiben und damit löschen.

von Tobi (Gast)


Lesenswert?

funktioniert :D
Danke

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
Noch kein Account? Hier anmelden.