www.mikrocontroller.net

Forum: Compiler & IDEs ISR() ->error: redefinition of 'ISR'


Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe mehrere Interrupt Routinen im Einsatz und diese wie im 
Toutorial alle mit ISR(Vektor) definiert. Für Vektor habe ich natürlich 
den jeweiligen Vektor eingesetzt. Beim kompilieren erhalte ich die im 
Betreff angegebene Fehlermeldung.

error: redefinition of 'ISR'

Nun meine Frage, müssen die Bezeichner unterschiedlich gewählt werden? 
Natürlich hab ich das schon ausprobiert, mit dem Ergebnis, dass das 
kompilieren erfolgreich war, allerdings wurde die 
Interruptserviceroutine nicht ausgeführt :(.

Danke

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du aus versehen 2 mal den selben vektor verwendet?

grüße danie

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Daniel,

definitiv nein, ich verwende:

ISR(USART1_UDRE_vect){}
ISR(USART1_RX_vect){}
ISR(USART1_TX_vect){}

beim ATMEGA128.

Gruß

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht mir eher so aus, als hättest du das Makro "ISR(..)" mehrmals 
definiert.

Welche Header-Dateien hast du denn eingebubnden?

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hall Daniel,

Ich hab mal zwischen den Zeilen gelesen, also ist es richtig, alle 
Interrupt Service Routinen mit dem Bezeichner "ISR" zu versehen?

Warum dann aber dieser Fehler?


Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Simon

#include <avr/pgmspace.h>
#include <avr/io.h>
#include <stdio.h>
#include "uart.h"

in die uart.c

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst schon ein
#include<avr/interrupt.h>
einbauen. Sonst kennt er das ISR-Makro nicht...

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja jede interrupt-routine ist mit ISR(..) aufgebaut.

du brauchst aber auch noch:
#include <avr/interrupt.h>


dennoch seltsam.

du könntest jedoch code posten....



danie

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
johnny.m:
ggg
warst schneller lach

Autor: Quacks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wars!!
ich war nur verwirrt, weil eine ISR() lief, mehrere nicht!??

und es steht ja auch deutlich im Tutorial Schäm

Vielen Dank

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gerne geschehn.
viel erfolg beim projekt!

grüße danie

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

Bewertung
0 lesenswert
nicht lesenswert
Quacks wrote:

> ich war nur verwirrt, weil eine ISR() lief, mehrere nicht!??

Lief die wirklich?  Es ist ja schon einmal nicht ganz klar, wie du
überhaupt die Interrupts zugelassen hast (sei()), ohne
<avr/interrupt.h> einzubinden.  Aber nehmen wir mal an, du hättest
dafür
asm("sei");
geschrieben, dann hagelt es bei folgendem einfachen Beispiel:
#include <avr/io.h>

ISR(INT0_vect)
{
  PORTB = 0;
}

int
main(void)
{
  DDRB = 255;
  EIMSK = 1;
  asm("sei");

  for (;;) ;

}
erstmal massig Warnungen, die du alle ignoriert haben musst:
% avr-gcc -Wall -Wextra -Os -mmcu=atmega88 -o foo.elf foo.c
foo.c:4: warning: return type defaults to 'int'
foo.c: In function 'ISR':
foo.c:4: warning: type of '__vector_1' defaults to 'int'
foo.c:4: warning: unused parameter '__vector_1'
foo.c:6: warning: control reaches end of non-void function
Wenn ich mir das Disassembler-Listing dann ansehe, finde ich auch
(erwarteterweise) keinen einzigen wirklichen Interruptvektor
eingetragen:
% avr-objdump -d foo.elf

foo.elf:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:   19 c0           rjmp    .+50            ; 0x34 <__ctors_end>
   2:   32 c0           rjmp    .+100           ; 0x68 <__bad_interrupt>
   4:   31 c0           rjmp    .+98            ; 0x68 <__bad_interrupt>
   6:   30 c0           rjmp    .+96            ; 0x68 <__bad_interrupt>
   8:   2f c0           rjmp    .+94            ; 0x68 <__bad_interrupt>
   a:   2e c0           rjmp    .+92            ; 0x68 <__bad_interrupt>
   c:   2d c0           rjmp    .+90            ; 0x68 <__bad_interrupt>
   e:   2c c0           rjmp    .+88            ; 0x68 <__bad_interrupt>
  10:   2b c0           rjmp    .+86            ; 0x68 <__bad_interrupt>
  12:   2a c0           rjmp    .+84            ; 0x68 <__bad_interrupt>
  14:   29 c0           rjmp    .+82            ; 0x68 <__bad_interrupt>
  16:   28 c0           rjmp    .+80            ; 0x68 <__bad_interrupt>
  18:   27 c0           rjmp    .+78            ; 0x68 <__bad_interrupt>
  1a:   26 c0           rjmp    .+76            ; 0x68 <__bad_interrupt>
  1c:   25 c0           rjmp    .+74            ; 0x68 <__bad_interrupt>
  1e:   24 c0           rjmp    .+72            ; 0x68 <__bad_interrupt>
  20:   23 c0           rjmp    .+70            ; 0x68 <__bad_interrupt>
  22:   22 c0           rjmp    .+68            ; 0x68 <__bad_interrupt>
  24:   21 c0           rjmp    .+66            ; 0x68 <__bad_interrupt>
  26:   20 c0           rjmp    .+64            ; 0x68 <__bad_interrupt>
  28:   1f c0           rjmp    .+62            ; 0x68 <__bad_interrupt>
  2a:   1e c0           rjmp    .+60            ; 0x68 <__bad_interrupt>
  2c:   1d c0           rjmp    .+58            ; 0x68 <__bad_interrupt>
  2e:   1c c0           rjmp    .+56            ; 0x68 <__bad_interrupt>
  30:   1b c0           rjmp    .+54            ; 0x68 <__bad_interrupt>
  32:   1a c0           rjmp    .+52            ; 0x68 <__bad_interrupt>

00000034 <__ctors_end>:
  34:   11 24           eor     r1, r1
  36:   1f be           out     0x3f, r1        ; 63
  38:   cf ef           ldi     r28, 0xFF       ; 255
  3a:   d4 e0           ldi     r29, 0x04       ; 4
  3c:   de bf           out     0x3e, r29       ; 62
  3e:   cd bf           out     0x3d, r28       ; 61

00000040 <__do_copy_data>:
  40:   11 e0           ldi     r17, 0x01       ; 1
  42:   a0 e0           ldi     r26, 0x00       ; 0
  44:   b1 e0           ldi     r27, 0x01       ; 1
  46:   ea e7           ldi     r30, 0x7A       ; 122
  48:   f0 e0           ldi     r31, 0x00       ; 0
  4a:   02 c0           rjmp    .+4             ; 0x50 <.do_copy_data_start>

0000004c <.do_copy_data_loop>:
  4c:   05 90           lpm     r0, Z+
  4e:   0d 92           st      X+, r0

00000050 <.do_copy_data_start>:
  50:   a0 30           cpi     r26, 0x00       ; 0
  52:   b1 07           cpc     r27, r17
  54:   d9 f7           brne    .-10            ; 0x4c <.do_copy_data_loop>

00000056 <__do_clear_bss>:
  56:   11 e0           ldi     r17, 0x01       ; 1
  58:   a0 e0           ldi     r26, 0x00       ; 0
  5a:   b1 e0           ldi     r27, 0x01       ; 1
  5c:   01 c0           rjmp    .+2             ; 0x60 <.do_clear_bss_start>

0000005e <.do_clear_bss_loop>:
  5e:   1d 92           st      X+, r1

00000060 <.do_clear_bss_start>:
  60:   a0 30           cpi     r26, 0x00       ; 0
  62:   b1 07           cpc     r27, r17
  64:   e1 f7           brne    .-8             ; 0x5e <.do_clear_bss_loop>
  66:   03 c0           rjmp    .+6             ; 0x6e <main>

00000068 <__bad_interrupt>:
  68:   cb cf           rjmp    .-106           ; 0x0 <__heap_end>

0000006a <ISR>:
  6a:   15 b8           out     0x05, r1        ; 5
  6c:   08 95           ret

0000006e <main>:
  6e:   8f ef           ldi     r24, 0xFF       ; 255
  70:   84 b9           out     0x04, r24       ; 4
  72:   81 e0           ldi     r24, 0x01       ; 1
  74:   8d bb           out     0x1d, r24       ; 29
  76:   78 94           sei
  78:   ff cf           rjmp    .-2             ; 0x78 <main+0xa>

Also ich kauf dir nicht ab, dass deine eine ISR wirklich lief, und
guck bitte auch auf die Compilerwarnungen.

Autor: Bernd Klein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also ich hab den gleichen Fehler (avr-gcc 4.0.2) sobald ich zwei 
ISR(...) einbinde bekomme ich den Fehler.

Eigenartigerweise unter avr-gcc 3.4.2 funktioniert der gleiche Code 
einwandfrei.

#include <avr/interrupt.h>

hab ich natürlich drin.

mhm, wahrscheinlich mal wieder ein totaler Anfängerfehler :-(

Hat jemand eine Idee?

Gruß
Bernd

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

Bewertung
0 lesenswert
nicht lesenswert
Hast du mit dem neuen Compiler eventuell auch eine andere Version
der Library gebaut?

Autor: Bernd Klein (berndklein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hoffe nicht. Ich nutze Ubuntu 6.06 und über Synaptic hab ich den 
4.0.2 installiert.

Mhm, mal ne blöde Frage, wie kann ich denn am schnellsten die aktuelle 
Versionsnummer der installierten library herausfinden

cu
Bernd

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

Bewertung
0 lesenswert
nicht lesenswert
Bernd Klein wrote:

> ... wie kann ich denn am schnellsten die aktuelle
> Versionsnummer der installierten library herausfinden

Für die aktuellen Versionen steht sie in <avr/version.h>.  Wenn du
diese Datei nicht hast, ist deine Version noch 1.2.x, da gab es
keine interne Kennung für die Version.  Könnte man dann höchstens
an Hand der CVS $Id$ nachvollziehen.

Autor: Bernd Klein (berndklein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhm, alles etwas dubios bei mir. Also ich hab mal überprüft

unter
/usr/avr/avr/include/avr
finde ich die Datei version.h. Installiert habe ich demnach 1.4.5, das 
sollte wohl ok sein.

Trotzdem verweigert mir mein avr-gcc 4.0.2 das compilieren wie schon 
beschrieben. Ich werde mich mal auf "den Weg machen" und überprüfen ob 
es evel. noch irgendwo ne Installation der library von ubuntu gibt und 
diese dann beim compilieren herangezogen wird.

Keine Ahnung was es sonst noch sein kann. Schaun wir mal. Aber 
vielleicht hast du ja noch Ideen.

Gruß
Bernd

Autor: Bernd Klein (berndklein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uaaaahhh,

ich Depp. Es war tatsächlich noch ne 1.2.x Version von Ubuntu auf meinem 
Rechner und die wurde beim compilieren herangezogen !

Nun läufts auch mit mehreren ISR(...) Funktionen !

Danke für den "Versionstipp" - hat mir letztendlich auf die Sprünge 
geholfen

Gruß
Bernd

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.