PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer Overflow funktioniert nicht [erledigt]



robo junior
23.01.2007, 17:20
Hallo

Ich hab das RN Mega2560 Modul. Ich möchte, dass ein Interrupt ausgelöst wird, wenn der Timer an der oberen Grenze angekommen ist. (16Bit Timer = 65536)
Allerdings wird die ISR nicht ausgeführt. Hab auch schon im Forum gesucht aber ich finde meinen Fehler einfach nicht.

Hier ist mal der Code:


#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t zaehler=0;

void start_timer(void) {
TCCR5B |= (1<<CS02) | (1<<CS00); //Prescaler für Timer0 auf 1024
TCNT5 = 0;
TIMSK5 |= (1<<TOIE5); //Timer Overflow Interrupt Enable
zaehler=0;
sei();
}


ISR(TIMER5_OVF_vect) {
if(zaehler<10) zaehler++;
else {
zaehler=0;
lcd_clrscr();
lcd_puts("Timer");
PORTC ^= (1<<7);
}
}

coCo
23.01.2007, 17:45
Hi,
ist das der komplette Code oder nur ein Auszug? Weil wenn es der komplette Code ist, kann es gar nicht funktionieren, da du die Funktion zur Initialisierung des Timers nie aufrufst.
Ob das mit den Registern richtig ist kann ich jetzt nicht genau sagen, da ich mit Bascom arbeite und es dort bissle einfacher ist.

MfG

robo junior
23.01.2007, 17:47
hallo

nein das sind nur die Funktionen für den Timer. Die Funktion start_timer() rufe ich in meiner main() Funktion auf.

robo junior
23.01.2007, 18:51
Hallo

hab den Fehler gefunden, der Timer läuft ich hab mich nur mit der Zeit verrechnet. Durch den großen Prescaler und dem Aufruf nur bei jedem 10 Overflow wird erst nach 40sek etwas ausgegeben. Hab mich schon die ganze Zeit gewundert, warum nichts passiert ;-)

T.J.
19.11.2008, 13:49
Hallo, ich habe auch ein Problem mit dem 16Bit Timer, daher nutze ich einfach mal diesen Thread.

Und zwar soll durch Overflow einfach eine Variable erhöht werden. Das funktioniert mit dem 8bit Timer 2 super, aber der 16Bit Timer 3 will einfach nicht laufen obwohl ich vom Prinzip her die gleichen Einstellungen habe.

Hier das Init:

TCCR3B |= _BV(CS32);
//TCCR3B |= _BV(CS31);
TCCR3B |= _BV(CS30);
TCNT3H = 0xF0;

//OCR3AL = 0xF8;
//OCR3AH = 0x00;

TIMSK3 |= _BV(TOIE3);

Ich nutze die SIG_OVERFLOW3, das ist doch richtig oder?

Es geht um den AT90CAN128, Timer 2 (8bit) läuft (mit SIG_OVERFLOW2) aber Timer 3 (16bit mit SIG_OVERFLOW3) nicht. Ich will nicht beide parallel betreiben den 8bit habe ich nur zum Test benutzt um zu sehen ob das Prinzip richtig ist.

Weiß einer ob da was fehlt, falsch oder gesondert zu beachten ist?

Hubert.G
19.11.2008, 15:42
An dem geschriebenen sehe ich keinen Fehler, weiss allerdings nicht was du mit TCNT3H = 0xF0; meinst, sollte aber nicht relevant sein.
Das SIG_OVERFLOW3 ist schon veraltet, es würde aber dein Compiler anmeckern, neu ISR(TIMER3_OVF_vect).
Zeig mal den ganzen Code, der Fehler muss ja nicht in den fünf Zeilen liegen, da hättest du ihn doch schon selbst gefunden.

T.J.
19.11.2008, 16:24
Hallo, schon mal vielen Dank. Ist schwierig dir den ganzen Code zu schicken. Ich fang mal mit der main an.

Komisch ist, dass es mit dem 8Bit geht...

Hubert.G
19.11.2008, 17:15
Ich würde mal vorschlagen das du nur den Timer alleine probierst, ohne dem ganzen rundherum.
Ich kann es nicht simulieren das mein compiler diese SIGNAL( ) nicht mag, müsste alles umschreiben.