Re: Timer und innterrupt??
Zitat:
Zitat von Crocodile
Hallo,
Kann mir jemand sagen wo der Fehler im Code liegt?Anstatt zu blinken leuchtet LED.
Das liegt daran, daß du keine ISR (Interupt Serice Routine) für den Timer1Overflow implementiert hast. Wenn dann ein Interrupt (IRQ) auftaucht, landest du im Reset und fängt wieder alles von vorne an.
Du musst dich entscheiden, ob du mit Timer1 Overflow Interrupt arbeiten willst oder nicht.
Code mit Interrupt:
Code:
//Code mit Interrupt
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
int main()
{
// PORTD.6 ist Ausgang
DDRD |= (1<<PD6);
// PORTD.6 ist HIGH
PORTD |= (1<<PD6);
// Timer1 zurücksetzen
TCNT1 = 0;
// TOV1-Flag löschen
TIFR = (1<<TOV1);
// Timer1 starten in Mode ???
TCCR1B = (1<<CS11)|(1<<CS10);
// Aktiviert Timer1 Overflow IRQ
TIMSK = (1<<TOIE1);
// Interrupts aktivieren
sei();
while (1)
{
// Interrupt macht den Rest
}
}
// Implementierung der ISR für Timer1 Overflow
SIGNAL(SIG_OVERFLOW1)
{
// PORTD.6 Toggeln
PORTD ^= (1<<PD6);
// TOV1-Flag wird durch die IRQ automatisch gelöscht
}
Code ohne Interrupts:
Code:
// Code ohne Interrupts
#include <avr/io.h>
int main()
{
// PORTD.6 ist Ausgang
DDRD |= (1<<PD6);
// PORTD.6 ist HIGH
PORTD |= (1<<PD6);
// Timer1 zurücksetzen
TCNT1 = 0;
// Timer1 starten in Mode ???
TCCR1B = (1<<CS11)|(1<<CS10);
while (1)
{
// TOV1-Flag löschen
TIFR = (1<<TOV1);
// Warten bis Flag auf 1
while (!(TIFR & (1<<TOV1))
{
}
// PORTD.6 Toggeln
PORTD ^= (1<<PD6);
}
}