PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega 32 8-Bit Timer Interrupt



Benni
19.07.2007, 14:14
Hallo Zusammen,
ich bin relativ neu in der Mikrocontroller-Welt und wollte deswegen ein
kleines Programm zum Verständnis der Timer und Interrupts schreiben.
Nach intensivem Studium des Datasheets komme ich aber hier leider nicht
weiter. Das Problem:
Am gesammten Port C meines Atmega32 hängen 8 LEDs (LOW Aktiv PC0-PC7):
Der Sinn des folgenden Programms sollte einfach sein die LED an PC0
mithilfe des 8-Bit Counters im CTC-Mode zum Blinken zu
bringen.(Geschwindigkeit war mir erstmal egal).
Wenn ich das Programm jedoch starte leuchten alle LEDs an Port C auf und
blinken auch nicht. Was mache ich falsch? Ich vermute, dass das Programm
erst gar nicht in die ISR springt. Ist die Timer Initialisierung falsch?
Gruß

Benni




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

//Interrupt Service Routine
ISR(TIMER0_COMP_vect)
{
static uint8_t c=0;
c=~c;
if (c==0){PORTC |= (1<<PC0);}

if (c==1){PORTC &= ~(1<<PC0);}

}

//Hauptprogramm

int main(int argc, char **argv) {

//Pin Konfiguration
DDRC = 0xFF; //PORT C als Ausgang

//Timer 0 initialisieren
TCNT0 = 0x00; //Timer 0 mit Null initialisieren
OCR0 = 0xFE; //Vergleichsregister initialisieren
TIMSK = (1<<OCIE0); //Output Compare interrupt enable
sei(); //Enable Global Interrupt

//Timer Start
TCCR0 = ((1<<WGM01) | (1<<COM00) | (1<<CS02) | (1<<CS00));
// CTC Mode | Toggle OC0 | Prescaler clk/1024

while(1){};

}


[/code]

franzl
19.07.2007, 16:32
Hi Benni,
also wenn du in der ISR die Variable c invertierst wenn sie den Wert 0 hat dann wird sie zu 255. Da du allerdings auf 1 abfrägst wird das schon mal nicht erreicht. Änder das mal ab und versuchs nochmal.
mfg franz

Benni
20.07.2007, 14:37
Hallo Franz,
danke für die schnelle Antwort! Du hattest volkommen Recht. Habe die zweite If Abfrage abgeändert, aber leider bleibt das Problem weiterhin das selbe: Alle LEDs leuchten konstant: :-(
Habe schon weiter daran rumprobiert, aber finde den Fehler einfach nicht.
Gruß Benni

franzl
20.07.2007, 15:25
Hi,
du könntest mal deine ISR in ISR(TIMER0_OVF_vect) umbenennen vielleicht hilft das weiter. Ich kapier auch nicht so ganz was du in der main Schleife übergiebst.
mfg franz

Benni
20.07.2007, 18:29
Achso...das mit der main Schleife ist nur ein Überbleibsel aus der Auto-Vervollständigen-Funktion von eclipse und ist natürlich völliger Blödsinn.
Es müsste natürlich ganz einfach "int main (void)" heißen! Hat aber leider auch keinen Einfluss(Schon ausprobiert)! Das mit dem anderen Interrupt -Vector probier ich auch nochmal aus, wobei ich der Meinung bin, dass ich schon den jetzigen nehmen müsste, wenn ich den Timer im CTC Mode benutzen möchte...
Danke aber trotzdem

Gruß


Benni

Benni
23.07.2007, 21:08
Hallo Franz,
danke für deine Hilfen! Ich habe das Problem endlich gelöst.
Es lag alles nur an der von mir verwendeten Enwicklungsumgebung!
Ich benutzte das auf www.mikrocontroller.net vorgestellte AVR-Plugin für Eclipse
http://www.mikrocontroller.net/articles/AVR_Eclipse
den folgenden Hinweis habe ich jedoch übersehen:

WARNUNG: Bei mir funktionierten Timer-Interrupts mit dem Plugin nicht
(die jedoch tadellos mit der WinAVR Makefile fuktionierten). Vielleicht
habe ich nur eine Option übersehen, seid aber auf der Hut. Wenn ihr
Unregelmäßigkeiten bei IRQs feststellt, versucht's erstmal ohne das
Eclipse-Plugin (bevor ihr stundenlang an eurem Code und euch selbst
zweifelt :-) ).

Habe mich dann nach Alternativen umgeguckt und bin hier fündig geworden:
http://sourceforge.net/projects/avr-eclipse

Damit funktioniert alles einwandfrei!

Gruß

Benni