PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Timer Interrupt Versuche



PloechingerD
12.11.2013, 07:52
Hallo,

ich bin ein Neueinsteiger und möchte erste Versuche mit einem Timer Interrupt machen.
Ich benutze ein STK 500 mit einem ATmega168.


#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.

Hubert.G
12.11.2013, 10:09
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.

PloechingerD
12.11.2013, 10:25
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.

Klebwax
12.11.2013, 11:12
Einen Breakpoint in den Interrupthandler setzen und schauen, ob er kommt.

MfG Klebwax

Besserwessi
12.11.2013, 11:18
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.

PloechingerD
12.11.2013, 12:03
Habe eine Lösung für das Problem gefunden.
Lag irgendwie an der zweiten Ausgabe lcd_string()
Danke für die Hilfe