Ich kann kein Fehler im Code entdecken.
Auch beim compilieren mit WinAVR kommt keine Fehlermeldung.
Gruß Stefan
Nabend,
ich habe folgendes problem. ich möchte gerne den Timer0 meines atmega8 in gang bringen. und bei einem overflow einen interrupt auslösen.
also habe ich, wie im datenblatt und in etlichen beispielen beschrieben den timer in gang gesetzt:
timer aktivieren F_CPU/1024 (TCCR0)
interrupt durch timer0 erlauben (TIMSK)
interrupts allgemein einschalten
ISR routine für timer0 overflow schreiben ISR(TIMER0_OVF_vect)
soweit von meiner seite ersichtlich, ist an dem code nichts auszusetzen![]()
da ich gehört habe, dass es da durchaus drauf ankommt, wie man seinen code compiliert, habe ich das beigefügt.
Hier das Compileren und Flashen:
Hier der Code:Code:> avr-gcc file.c -c -o file.o -Os -g -mmcu=atmega8 > avr-gcc file.o -o file.elf -mmcu=atmega8 > avr-objcopy -j .text -j .data -O ihex file.elf file.hex > avrdude -c avrispv2 -p m8 -P USB -U flash:w:file.hex:i
Ich weis, dass die Anweisung in der Interrupt-Funktionen für nen timer keinen sinn hat. es geht hier auch lediglich um den test des timersCode:#include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #define F_CPU 1000000 ISR(TIMER0_OVF_vect) { DDRB = 0xfd; // Alles ausgang ausser PB1 -> Eingang PORTB = 0x03; // Ausgang für PB0 high , Pull-Up für PB1 an } int main(void) { TCCR0 = (1<<CS02)|(1<<CS00); // TCCR0 = 0x03; TIMSK = (1<<TOIE0); sei(); while(1) { } /* Wird nie erreicht */ return 0; }
In einer fertigen beispieldatei funktioniert der timer.
suchfunktion des forums ergab für mich keine weiterhelfenden themen.
ich hoffe, dass mir jemand helfen kann.
danke schonmal im vorraus.
gruß
Krampfda
Ich kann kein Fehler im Code entdecken.
Auch beim compilieren mit WinAVR kommt keine Fehlermeldung.
Gruß Stefan
Hallo Krampfda,
bis auf 2 Dinge scheint alles ok:
1. Was hat eine DDRx-Festlegung in einer ISR zu suchen?
2. TCCR0 ist nicht 0x03 (Kommentar), sondern 0x05, aber der Code selbst ist ok.
Schreib doch mal einen Code, der wirklich etwas macht (LED einschalten o.ä.).
Gruß Dirk
habe die DDRB festlegungen aus der ISR genommen und in main() eingefügt. und die andere anweisung ssollte ja eine LED o.ä. in gang bringen (was mit genau dem code in main() auch funktioniert), aber offensichtlich klappt das auch nicht nachdem DDRB schon vorher festgelegt wird.
Was klappt nicht? Poste evtl. das ganze Programm und sag, was es machen soll.... aber offensichtlich klappt das auch nicht ...
Gruß Dirk
DDRB steht nun in main().Code:#include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #define F_CPU 1000000 ISR(TIMER0_OVF_vect) { PORTB = 0x01; } int main(void) { DDRB = 0x01; TCCR0 = (1<<CS02)|(1<<CS00); TIMSK = (1<<TOIE0); sei(); while(1) { } /* Wird nie erreicht */ return 0; }
und wenn ich nun PORTB ebenfalls in main() so belege, wie momentan in ISR, dann leuchtet die an PB0 angeschlossene LED einwandfrei.
nur so, wie es im moment ist, passiert gar nichts.
Hallo,
frag doch mal das Overflow Flag TOV0 in TIFR inerhalb der Endlosschleife ab. Dann weißt du, ob es am Timer oder am Interrupt liegt.
Gruß
Jens
Ich kann mir nicht erklären wo dein Problem liegt, sicher nicht im Programm. Die Zeile in der ISR geändert auf : PORTB ^= 0x01; und die LED flimmert munter vor sich hin.
Hallo Krampfda,
hast du eigentlich den Interrupt initialisiert?
Hier ein auszug aus meinem Code:
ISR Initialisierung:
und hier meine ISR Schleife:Code:void init_ISR(void) { sei(); // Globalen Interrupt aktivieren TIMSK |= ( 0x01 << TOIE0 ) ; // Timer0 Overfloe Interrupt aktivieren TCCR0 |= ( 0x01 << CS02 | 0x00 << CS01 | 0x01 << CS00 ) ; // Prescaler 1024 / Clock <- CPU TCNT0 = 0x64; // Timer0 Counter mit 0x64 laden für 20ms bei 8Mhz }
Ich hoffe, ich konnt dir weiterhelfenCode:ISR(TIMER0_OVF_vect) { Counter_X_20ms++; TCNT0 = 0x64; // Timer0 Counter mit 0x64 laden TIFR |= ( 0x01 << TOV0 ) ; // das Interruptflag sicher zurücksetzen }
Michael
ich habe mal deinen rat befolgt und das noch etwas ausgebaut:
die LED an PortB leuchtet. PORTC bleibt aus. da der timer hochzählt, scheint es nicht an diesem zu liegen, aber wo ist der fehler in meiner interrupt geschichte ?Code:while(1) { if(TIFR==(1<<TOV0)) { PORTC = (1<<PC5); } if(TCNT0==0xff) { PORTB = 0x02; } }
komischerweise ergab
nicht das gewünschte ergebnis, auch hier blieb PB5 aus.Code:TIFR = (1<<TOV0); if(TIFR==(1<<TOV0)) { PORTC = (1<<PC5); }
die codeabschnitte sind jeweils in die endlosschleife meines codes eingebaut worden, den ich oben erwähnt habe.
Lesezeichen