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
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
Code:#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]
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
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
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
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
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
Lesezeichen