Hallo! Ich bastele seit einigen tagen mit einem Mega8 rum und will nun mal die Interrupts ausprobieren. Das folgende Programm soll eigentlich nur eine LED zum blinken bringen: #include <avr/io.h> #include <stdint.h> #include <avr/interrupt.h> int main (void) { uint8_t zahl = 0; DDRD = 0xFF; // Port D nur Ausgang! TCCR1A = 0x00; // stetzt Statusregiser A Vom Timer eins auf null TCCR1B = 0x00; // stetzt Statusregiser B Vom Timer eins auf null TCCR1B |= (1<<CS12) ; //timer läuft mit 1/256 der CPU Geschwind. TIMSK |= (1<<TOIE1); //Aktiviert Interrupt beim Overflow des Timers 1 sei(); while(1) { ISR (TIMER1_OVF_vect) { if (zahl == 0) { PORTD|= (1<<PORTD3); zahl ++; }else{ PORTD &= ~(1<<PORTD3); zahl = 0; } } } Dabei erzeugt der Compiler folgenden Fehler: ompiling: servo.c avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=servo.lst -If:/Programme/AVRlib -std=gnu99 -MD -MP -MF .dep/servo.o.d servo.c -o servo.o servo.c: In function 'main': servo.c:79: error: static declaration of '__vector_8' follows non-static declaration servo.c:78: error: previous declaration of '__vector_8' was here servo.c:91:2: warning: no newline at end of file servo.c:91: error: expected declaration or statement at end of input make.exe: *** [servo.o] Error 1 > Process Exit Code: 2 > Time Taken: 00:00 Habe heute erst die aktuellsten Programmversionen installiert (AVRStudio mit den beiden Service packs und WINAvr) hat jemand eine Idee woran das liegt?
Eine ISR ist im Prinzip eine Funktion und hat innerhalb von main() nichts zu suchen!
> hat jemand eine Idee woran das liegt?
Du kannst nicht mitten in main() plötzlich eine ISR implantieren.
Kann es sein, dass du dich erstmal mit dem grundlegenden Aufbau
eines C-Programmes vertraut machen solltest?
ISR definiert eine separate Funktion, eben jene, die beim Interrupt ausgeführt wird. Also so: int main (void) { ... } ISR (TIMER1_OVF_vect) { ... }
So gehts: #include <avr/io.h> #include <stdint.h> #include <avr/interrupt.h> uint8_t zahl = 0; int main (void) { DDRD = 0xFF; // Port D nur Ausgang! TCCR1A = 0x00; // stetzt Statusregiser A Vom Timer eins auf null TCCR1B = 0x00; // stetzt Statusregiser B Vom Timer eins auf null TCCR1B |= (1<<CS12) ; //timer läuft mit 1/256 der CPU Geschwind. TIMSK |= (1<<TOIE1); //Aktiviert Interrupt beim Overflow des Timers 1 sei(); while(1) { } } ISR (TIMER1_OVF_vect) { if (zahl == 0) { PORTD|= (1<<PORTD3); zahl ++; }else{ PORTD &= ~(1<<PORTD3); zahl = 0; } }
Jörg Wunsch wrote: > Kann es sein, dass du dich erstmal mit dem grundlegenden Aufbau > eines C-Programmes vertraut machen solltest? ...und mit der Funktionsweise eines Interrupts... Immer wieder gerne empfohlen: AVR-GCC-Tutorial...
Hallo, ISR (TIMER1_OVF_vect) ist eine Funktion, die außerhalb der Funktion main liegen muß. Bitte unbedingt die einschlägigen Tutorials durcharbeiten. Gast
Hallo! Danke für die Hile, jetzt funktioniert es :D Der Tipp mit dem Tutorial und dem in die Grundlagen einarbeiten ist auch gut, nur ist es so, dass ich als Student momentan sehr viel Theorie um die Ohren habe und nun in den Semesterferien was "mehr praktisches" machen möchte. Daher arbeite ich mich momentan ein bisschen in die Mikrocontrollerprogrammierung ein und zwar mit Tutorials wie dem hier empfohlenen. Ich habe diesen Fehler aber trotz des Tutorials gemacht.... Ich danke also für die Hilfe und verbleibe mit funktionierenden Grüßen Ingo
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.