www.mikrocontroller.net

Forum: Compiler & IDEs Interrupt Befehl mittels ISR nicht kompilierbar


Autor: Ingo Fehr (ingolo)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Ernst (sternst)
Datum:

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

Also so:

int main (void)
{
...
}

ISR (TIMER1_OVF_vect)
{
...
}

Autor: Jurij G. (jtr)
Datum:

Bewertung
0 lesenswert
nicht 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;
   }
  }

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo Fehr (ingolo)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.