PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kein Overflow Interrupt für Timer0



eli45
05.06.2007, 20:13
Hi!

Ich arbeite gerade an meinem ersten Timer/Interrupt Programm. Ich bin ja eigentlich der Meinung, dass es läuft, nur der AVR eben nicht! ;-)


Es soll einfach eine LED an PB0 blinken...

LED1 und LED2 sind nur zum Test drin, wobei LED1 leuchtet, LED2 aber nicht. Scheinbar wird nicht ein einziger Interrupt ausgelöst...

Ich wäre mal dankbar, wenn jemand mal drüber schauen könnte.


Hier mal der Code:

/*Programm zur Ausgabe von PWM Signalen v070605
*fuer Atmega8 @ 3.6864 MHz
*/


#define F_CPU 3686400

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

volatile uint8_t NumberOverflow0; /*Zaehlt die Ueberlaeufe des Timer0*/




ISR(TIMER0_OVF_vect) /*Interrupt Timer0 Overflow*/

{
/*
*Check
*/
PORTB |= (1<<PB2); /*LED2 fuer Test*/
/*
*Check
*/

NumberOverflow0++; /*NumberOverflow0 hochzaehlen*/

if(NumberOverflow0==15) /*beim 15. Overflow PB0 auf high, 3686400/1024 = 3600,3600/256 = 14.0625, 15 Ueberlaefe ~1 sek*/
{
PORTB |= (1<<PB0);
}

if(NumberOverflow0==30) /*beim 30. Overflow PB0 auf low*/
{
PORTB &= ~(1<<PB0);

NumberOverflow0 = 0; /*NumberOverflow0 zurÃŒcksetzen*/
}
}



int main(void)

{
TCCR0 |= (1<<CS00) | (1<<CS02); /*Prescaling /1024*/
TIMSK |= (1<<TOIE0); /*Overflowinterrupt aktivieren*/

sei(); /*globale Interrupts aktivieren*/

DDRB = 0xff; /*PortB als Ausgang*/

NumberOverflow0 = 0;

/*
*Check
*/
if((SREG & (1<<7)) && (TCCR0 & (1<<CS00)) && (TCCR0 & (1<<CS02)) && (TIMSK & (1<<TOIE0))) /*Einstellungen testen*/
{
PORTB |= (1<<PB1); /*LED1 fuer Test*/
}
/*
*Check
*/

while(1)
{
;
}
}



Gruß Elias

izaseba
05.06.2007, 20:28
Hm,
soltte funktionieren :-k
Zwei Anmerkungen:
1.Numberoverflow0 brauch nicht volatile und global den kannst Du lieber als static in der ISR deklarieren
2. TCCR0 und TIMSK kannst Du auch direkt zuweisen, brauchst nicht verodern

Aber wie gesagt, es müßte funktionieren...
Was ist das für ein Controller nochmal ?

Gruß Sebastian

EDIT: Habe gerade Deim Programm 1:1 auf einem Mega 16 aufgespielt, blinkt was das Zeug hält ;-)

eli45
05.06.2007, 20:38
Hi!

Das Programm ist für einen Atmega8.

Ich meine im Forum gibt es schon viele Beispiele zum Thema Timer und Interrupt, aber ich habe das nicht hin bekommen...

Wenn ich NumberOverflow in der ISR deklariere, kann ich dann den Wert in main() setzen? Mir ist die Handhabung der ISR noch nicht soo vertraut... ne Funktion ist es ja in dem Sinne nicht...

Elias

izaseba
05.06.2007, 20:45
Hallo, ich habe meinen Beitrag oben Editiert, nochmal:
Ich habe Dein Programm 1:1 übernommen und in eine M16 gebrannt, es klappt PB0 blinkt...
Vielleicht stimmt was mit der Hardware bei Dir nicht ?

Was Deine Frage mit NumberOverflow angeht, klar, wenn Du den von außerhalb verändern willst mußt Du den schon global deklarieren, meine Anmerkung bezog sich auf dieses Beispiel hier ;-)

Gruß Sebastian

eli45
05.06.2007, 20:56
Hi!

Ja danke... dann werde ich mir mal die hardware vorknöpfen. Ich habe auch irgendwo noch einen Atmega32 auf dem ich das mal ausprobiere.

Elias


EDIT: Mmh... Das Programm läuft nach wie vor nicht... Dann muss ich doch noch mal unter Windows mit Basic da dran (da habe ich ein paar Beispielprogramme). Ich hoffte das hätte ich hinter mir :-/

Ok...Die hex Datei aus den Basiccode geht...Hardwarefehler ist somit ausgeschlossen. Dann liegt der Fehler im Compiler

EDIT2: Tippfehler in meinem Compiler Script... 8-[
Jetzt gehts!