Klasischer Fehler:
Deklariere mal t als volatile
Gruß Sebastian
Hallo
Ich habe leider noch ein Problem mit dem Timer0 meines AtMega8. Ich bekomme den Timer zum laufen. In die ISR geht er auch. Dort möchte ich eine Variable hochzählen... Also soetwas wie einen verschachtelten Timer. Das benötige ich um ein großes Zeitfenster zu bekommen. Mir schwebt da soetwas vor wie while(t<50)... in der Zeit wird im Hauptprogramm etwas ausgeführt. Und "Zwischendurch" wird in der ISR immer wieder die Variable t hochgezählt. Das scheint aber nicht zu funktionieren.... Dass ich die Variable auch irgendwann wieder zurücksetzten muss weiß ich auch... mir geht`s im Moment ersteinmal überhaupt einen Durchlauf hin zu bekommen... Hier mal mein Code:
Und hier die ISR:Code:#include <avr/io.h> #include <inttypes.h> #include <avr/interrupt.h> #include <stdlib.h> #include <util/delay.h> #define F_CPU = 12000000L int t=0; //Variable t für Timer anlegen int main(void) { DDRD &= ~(1<<DDD2); //Pin D2 (INT0) als Eingang deklarieren PORTD |= (1<<PD2); //Pull Up für D2 einschalten DDRB = (1<<DDB0); //Port B0 als Ausgang definieren (LED) PORTB |= (1<<PB0); //LED aussschalten TCCR0 |= (1<<CS00)|(1<<CS02); //Timer initialisieren und einschalten TIMSK |= (1<<TOIE0); //TimerOverflow Interrupt freigeben?? sei(); //Interrupts freigeben while(t<10) { PORTB &= ~(1<<PB0); //Einschalten der LED } while(1); }
Vielleicht könnt ihr mir ja auch sagen dass das so gar nicht möglich ist und ich das anders versuchen muss... Vielen Dank schonmal...Code:ISR(TIMER0_OVF_vect) { t++; }
Grüße!!
Bean
Klasischer Fehler:
Deklariere mal t als volatile
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Mhh Danke... muss zugeben das mit dem volatile hab ich noch nicht so ganz verstanden hab das jetz mal in "volatile int t=0;" geändert. Hab aber leider nichts gebracht... Brauch ich einen Return aus der ISR?
Grüße!!
Bean
Nein return brauchst Du nicht, woran erkennst Du daß Dein Programm nicht klappt ?
geht die LED nicht an ?
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Doch, bei while(t<10) geht die LED an. Aber ich bin Meinung dass Sie nur so lange an sein sollte wie t<10... sobald t>10 sollte Sie aus gehen.. aber kann auch sein dass da mein Denkfehler liegt... Jetzt wo ich näher drüber nachdenk...
Grüße
Bean
warum soll sie dann ausgehen ?Aber ich bin Meinung dass Sie nur so lange an sein sollte wie t<10... sobald t>10 sollte Sie aus gehen.
Nachdem die while Schleife verlassen wird ist das Programm auch zu Ende,
kommt nur noch eine Endlosschleife...
irgendwo mußt Du sie ja noch ausschalten...
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Ja Ich hab es jetzt grad mal mit einem Blinklicht innerhalb der Schleife versucht... Das scheint zu funktionieren...
Grüße!!
Bean
Schau mal hier (klicken) im C-Tutorial nach und Suche dort nach volatile.Zitat von Mr Bean
Oder in anderen Tutorials.
http://www.mikrocontroller.net/artic...R-GCC-Tutorial
http://www.schellong.de/c.htm
http://www.galileocomputing.de/openbook/c_von_a_bis_z/ in einem Unerpunkt ist hier volatile
recht gut erklärt http://www.galileocomputing.de/openb...0027701F02618E
Ciao sagt der JoeamBerg
Ja siehst Du, alles wird gutJa Ich hab es jetzt grad mal mit einem Blinklicht innerhalb der Schleife versucht... Das scheint zu funktionieren...
@Joe, wie ich sehe hast Du Dir eine gute Samlung an Links angelegt...
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Hallo Sebastian,
wenn ich das wüsste, was ich nicht weiß, und das nicht wüsste was ich weiß - dann wäre ich (in C) VIEL besser
Ciao sagt der JoeamBerg
Lesezeichen