-
Timer Interrupt Versuche
Hallo,
ich bin ein Neueinsteiger und möchte erste Versuche mit einem Timer Interrupt machen.
Ich benutze ein STK 500 mit einem ATmega168.
Code:
#include <avr/io.h>
#include "lcd-routines.h"
#include <stdlib.h>
#include <avr/interrupt.h>
volatile int i;
int main(void)
{
DDRB = 0x00; //PortB als Eingang
PORTB = 0xFF; //Port B auf 0xFF setzen
lcd_init(); //LCD Initialsieren
TCCR0B = (1<<CS02); //TIMER definieren
TIMSK0 |= (1<<TOIE0);
sei(); //Interrupt aktivieren
while(1)
{
{
char Buffer[20];
itoa( i, Buffer, 10 );
lcd_string( Buffer ); //Ausgabe LCD
lcd_setcursor( 0, 2 );
lcd_string("uSiemens"); //Ausgabe LCD
}
}
}
ISR (TIMER0_OVF_vect) //Interrupt
{lcd_clear();} //Display löschen
Leider funktioniert die Interrupt Routine anscheinend nicht, da kein Ergebnis am Display zu sehen ist.
-
Was für ein Ergebnis erwartest du?
- - - Aktualisiert - - -
Um dir die Sache leichter zu machen.
Du schreibst in deiner while-Schleife so schnell ins Display das du das clear aus der ISR bestenfalls als flimmern wahrnimmst.
-
Mein Ziel wäre es hauptsächlich, das die Interrupt Routine funktioniert.
Habe auch schon versucht die angezeigt Variable i im Interrupt zu inkrementieren.
Und dadurch zählen zu lassen.
Doch das funktioniert leider auch nicht.
-
Einen Breakpoint in den Interrupthandler setzen und schauen, ob er kommt.
MfG Klebwax
-
Beim Hochzählen einer Variable in der ISR muss man an das VOLATILE bei der Deklaration denken. Der Compiler optimiert sonst ggf. den Zugriff weg und man sieht nichts.
Der einfachste Weg zur Fehlersuche wäre wohl der Simulation im AVRstudio.
Die Ausgabe auf das LCD gehört leider auch noch zu den langsamen Funktionen. Im Normalfall sollte man das in der ISR Vermeiden. Es kann hier auch noch das Problem geben wenn die LCD Ausgabe aus dem Hauptprogramm von einer anderen LCD Funktion in der ISR unterbrochen wird.
-
Habe eine Lösung für das Problem gefunden.
Lag irgendwie an der zweiten Ausgabe lcd_string()
Danke für die Hilfe