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
hast du aus versehen 2 mal den selben vektor verwendet? grüße danie
Hallo Daniel, definitiv nein, ich verwende: ISR(USART1_UDRE_vect){} ISR(USART1_RX_vect){} ISR(USART1_TX_vect){} beim ATMEGA128. Gruß
Sieht mir eher so aus, als hättest du das Makro "ISR(..)" mehrmals definiert. Welche Header-Dateien hast du denn eingebubnden?
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?
@Simon #include <avr/pgmspace.h> #include <avr/io.h> #include <stdio.h> #include "uart.h" in die uart.c
Du musst schon ein
1 | #include<avr/interrupt.h> |
einbauen. Sonst kennt er das ISR-Makro nicht...
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
Das wars!! ich war nur verwirrt, weil eine ISR() lief, mehrere nicht!?? und es steht ja auch deutlich im Tutorial Schäm Vielen Dank
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
1 | asm("sei"); |
geschrieben, dann hagelt es bei folgendem einfachen Beispiel:
1 | #include <avr/io.h> |
2 | |
3 | ISR(INT0_vect) |
4 | {
|
5 | PORTB = 0; |
6 | }
|
7 | |
8 | int
|
9 | main(void) |
10 | {
|
11 | DDRB = 255; |
12 | EIMSK = 1; |
13 | asm("sei"); |
14 | |
15 | for (;;) ; |
16 | |
17 | }
|
erstmal massig Warnungen, die du alle ignoriert haben musst:
1 | % avr-gcc -Wall -Wextra -Os -mmcu=atmega88 -o foo.elf foo.c |
2 | foo.c:4: warning: return type defaults to 'int' |
3 | foo.c: In function 'ISR': |
4 | foo.c:4: warning: type of '__vector_1' defaults to 'int' |
5 | foo.c:4: warning: unused parameter '__vector_1' |
6 | 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:
1 | % avr-objdump -d foo.elf |
2 | |
3 | foo.elf: file format elf32-avr |
4 | |
5 | Disassembly of section .text: |
6 | |
7 | 00000000 <__vectors>: |
8 | 0: 19 c0 rjmp .+50 ; 0x34 <__ctors_end> |
9 | 2: 32 c0 rjmp .+100 ; 0x68 <__bad_interrupt> |
10 | 4: 31 c0 rjmp .+98 ; 0x68 <__bad_interrupt> |
11 | 6: 30 c0 rjmp .+96 ; 0x68 <__bad_interrupt> |
12 | 8: 2f c0 rjmp .+94 ; 0x68 <__bad_interrupt> |
13 | a: 2e c0 rjmp .+92 ; 0x68 <__bad_interrupt> |
14 | c: 2d c0 rjmp .+90 ; 0x68 <__bad_interrupt> |
15 | e: 2c c0 rjmp .+88 ; 0x68 <__bad_interrupt> |
16 | 10: 2b c0 rjmp .+86 ; 0x68 <__bad_interrupt> |
17 | 12: 2a c0 rjmp .+84 ; 0x68 <__bad_interrupt> |
18 | 14: 29 c0 rjmp .+82 ; 0x68 <__bad_interrupt> |
19 | 16: 28 c0 rjmp .+80 ; 0x68 <__bad_interrupt> |
20 | 18: 27 c0 rjmp .+78 ; 0x68 <__bad_interrupt> |
21 | 1a: 26 c0 rjmp .+76 ; 0x68 <__bad_interrupt> |
22 | 1c: 25 c0 rjmp .+74 ; 0x68 <__bad_interrupt> |
23 | 1e: 24 c0 rjmp .+72 ; 0x68 <__bad_interrupt> |
24 | 20: 23 c0 rjmp .+70 ; 0x68 <__bad_interrupt> |
25 | 22: 22 c0 rjmp .+68 ; 0x68 <__bad_interrupt> |
26 | 24: 21 c0 rjmp .+66 ; 0x68 <__bad_interrupt> |
27 | 26: 20 c0 rjmp .+64 ; 0x68 <__bad_interrupt> |
28 | 28: 1f c0 rjmp .+62 ; 0x68 <__bad_interrupt> |
29 | 2a: 1e c0 rjmp .+60 ; 0x68 <__bad_interrupt> |
30 | 2c: 1d c0 rjmp .+58 ; 0x68 <__bad_interrupt> |
31 | 2e: 1c c0 rjmp .+56 ; 0x68 <__bad_interrupt> |
32 | 30: 1b c0 rjmp .+54 ; 0x68 <__bad_interrupt> |
33 | 32: 1a c0 rjmp .+52 ; 0x68 <__bad_interrupt> |
34 | |
35 | 00000034 <__ctors_end>: |
36 | 34: 11 24 eor r1, r1 |
37 | 36: 1f be out 0x3f, r1 ; 63 |
38 | 38: cf ef ldi r28, 0xFF ; 255 |
39 | 3a: d4 e0 ldi r29, 0x04 ; 4 |
40 | 3c: de bf out 0x3e, r29 ; 62 |
41 | 3e: cd bf out 0x3d, r28 ; 61 |
42 | |
43 | 00000040 <__do_copy_data>: |
44 | 40: 11 e0 ldi r17, 0x01 ; 1 |
45 | 42: a0 e0 ldi r26, 0x00 ; 0 |
46 | 44: b1 e0 ldi r27, 0x01 ; 1 |
47 | 46: ea e7 ldi r30, 0x7A ; 122 |
48 | 48: f0 e0 ldi r31, 0x00 ; 0 |
49 | 4a: 02 c0 rjmp .+4 ; 0x50 <.do_copy_data_start> |
50 | |
51 | 0000004c <.do_copy_data_loop>: |
52 | 4c: 05 90 lpm r0, Z+ |
53 | 4e: 0d 92 st X+, r0 |
54 | |
55 | 00000050 <.do_copy_data_start>: |
56 | 50: a0 30 cpi r26, 0x00 ; 0 |
57 | 52: b1 07 cpc r27, r17 |
58 | 54: d9 f7 brne .-10 ; 0x4c <.do_copy_data_loop> |
59 | |
60 | 00000056 <__do_clear_bss>: |
61 | 56: 11 e0 ldi r17, 0x01 ; 1 |
62 | 58: a0 e0 ldi r26, 0x00 ; 0 |
63 | 5a: b1 e0 ldi r27, 0x01 ; 1 |
64 | 5c: 01 c0 rjmp .+2 ; 0x60 <.do_clear_bss_start> |
65 | |
66 | 0000005e <.do_clear_bss_loop>: |
67 | 5e: 1d 92 st X+, r1 |
68 | |
69 | 00000060 <.do_clear_bss_start>: |
70 | 60: a0 30 cpi r26, 0x00 ; 0 |
71 | 62: b1 07 cpc r27, r17 |
72 | 64: e1 f7 brne .-8 ; 0x5e <.do_clear_bss_loop> |
73 | 66: 03 c0 rjmp .+6 ; 0x6e <main> |
74 | |
75 | 00000068 <__bad_interrupt>: |
76 | 68: cb cf rjmp .-106 ; 0x0 <__heap_end> |
77 | |
78 | 0000006a <ISR>: |
79 | 6a: 15 b8 out 0x05, r1 ; 5 |
80 | 6c: 08 95 ret |
81 | |
82 | 0000006e <main>: |
83 | 6e: 8f ef ldi r24, 0xFF ; 255 |
84 | 70: 84 b9 out 0x04, r24 ; 4 |
85 | 72: 81 e0 ldi r24, 0x01 ; 1 |
86 | 74: 8d bb out 0x1d, r24 ; 29 |
87 | 76: 78 94 sei |
88 | 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.
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
Hast du mit dem neuen Compiler eventuell auch eine andere Version der Library gebaut?
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
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.
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
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
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.