PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehlerhaftes Programm >>> Timer-Interrupt oder glabale Variable



frabe
18.06.2019, 11:02
Hallo zusammen.

Derzeit beschäftige ich mich mit Timer-Interrupts.
Dazu wurde ein Prog geschrieben - läuft nicht richtig - Fehlerursache erkenne ich leider nicht.

Ablauf:
Interrupt löst nach jeder 1ms aus.
LED schaltet nach 100ms für 400ms ein und dann wieder aus.
Danach startet die LED-Routine erneut.
Für >= habe ich mich entschieden, damit der ungefähre Zeitablauf, beim "verschlucken" eines Interrupts, erhalten bleibt.

Fehler:
LED schaltet nach 100ms ein und bleibt dauerhaft eingeschaltet.



#define F_CPU 1000000UL
#include <avr/interrupt.h>

volatile uint8_t OverflowZaehler=0;

ISR(TIM1_COMPA_vect)
{
OverflowZaehler++;
}

void OverflowZaehlerReset(void)
{
OverflowZaehler=0;
}

void LEDein(void)
{
PORTB |= (1<<PB0);
}

void LEDaus(void)
{
PORTB &= ~(1<<PB0);
}

int main(void)
{
DDRB |= (1<<PB0);

TCCR1B |= (1<<WGM12) | (1<<CS11);
TIMSK1 |= (1<<OCIE1A);
OCR1A = 124;
sei();

LEDaus();

while(1)
{
if (OverflowZaehler >= 100)
LEDein();
{
if(OverflowZaehler >= 500)
{
LEDaus();
OverflowZaehlerReset();
}

}
}
}

Holomino
18.06.2019, 11:33
Mehr als 255 passen nun mal in ein Byte nicht rein.
Nimm also ein uint16_t in der Definition.

frabe
18.06.2019, 11:53
Hey Holomino - DANKE!
Das war der Fehler - Thema "Bäume und Wald"...

Im Anschluss "verschluckte" sich die Aus-Anweisung regelmäßig.
Nach 2 korrekten Durchläufen, kam einmaling der LED-Takt, AUS für ~20ms/EIN für ~480ms - danach wieder 2* korrekter Takt, etc.
Nachdem ich beide >= gegen == ausgetauscht habe, hats auch hier geklappt.