Forum: Compiler & IDEs Interrupt Befehl mittels ISR nicht kompilierbar


von Ingo F. (ingolo)


Lesenswert?

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?

von Johannes M. (johnny-m)


Lesenswert?

Eine ISR ist im Prinzip eine Funktion und hat innerhalb von main() 
nichts zu suchen!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> 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?

von Stefan E. (sternst)


Lesenswert?

ISR definiert eine separate Funktion, eben jene, die beim Interrupt 
ausgeführt wird.

Also so:

int main (void)
{
...
}

ISR (TIMER1_OVF_vect)
{
...
}

von X. Y. (jtr)


Lesenswert?

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;
   }
  }

von Johannes M. (johnny-m)


Lesenswert?

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...

von Gast (Gast)


Lesenswert?

Hallo,

ISR (TIMER1_OVF_vect) ist eine Funktion, die außerhalb der Funktion main 
liegen muß.

Bitte unbedingt die einschlägigen Tutorials durcharbeiten.

Gast

von Ingo F. (ingolo)


Lesenswert?

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
Noch kein Account? Hier anmelden.