Forum: Mikrocontroller und Digitale Elektronik AVR Atmega88PA Interrupts werden nich ausgeführt, sondern "soft"-Reset


von Laurens M. (fr34k1)


Lesenswert?

Hallo,
meine AVR Atmega88PA Interrupts werden nich ausgeführt, sondern es wird 
ein "soft"-Reset ausgelöst.
Danach sind alle Bits im MCUSR 0.

Erwartet: LED geht an und bleibt an.
Was passiert: LED geht kurz an bis Timer bei "20"<<8 und danach blinkt 
danach langsam. Im Takt des Timers (Overflow)

Immer wenn ein Interupt ausgeführt werden sollte springt es zum Anfang. 
Die Interruptroutine wird nicht ausgeführt.
Wo könnte das Problem liegen?

Habe den Code für atmega88 und atmega88p compiliert. Immer das gleiche, 
auch auf anderer Hardware.

Bad Interrupt Routine wird auch nicht ausgeführt. Bei anderen Interupts 
passiert auch das gleiche.

Eclipse CDT mit AVR Plugin
avr-libc avrdude avr-gcc
gcc version 4.3.3 (GCC)
Ubuntu 9.10

Hier der Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
ISR(TIMER1_COMPA_vect)
4
{
5
  TCNT1H = 0;
6
  TCNT1L = 0;
7
  //  if (PORTD & (1 << PORTD7)) {
8
  //    PORTD &= ~(1 << PORTD7); ///LED off
9
  //  } else {
10
  //    PORTD |= (1 << PORTD7); ///LED on
11
  //  }
12
}
13
int main() {
14
  DDRD = (1 << PORTD7);
15
16
  if (PORTD & (1 << PORTD7)) { //if on
17
    PORTD &= ~(1 << PORTD7); ///LED off
18
  } else {
19
    PORTD |= (1 << PORTD7); ///LED on
20
  }
21
22
  OCR1AH = 20;
23
  OCR1AL = 0;
24
  TIMSK1 = (1 << OCIE1A);
25
  TCCR1B = (1 << CS12);
26
  //  TCNT1H = 0;
27
  //  TCNT1L = 0;
28
  sei();
29
  while (1) {
30
  }
31
  return 0;
32
}
Danke für eure Hilfe.

von Hc Z. (mizch)


Lesenswert?

Ich kenne die Eclipse-Umgebung nicht.  Kann es sein, dass Du dort den 
falschen MCU-Typ eingestellt hast, so dass der falsche Interrupt-Vektor 
gesetzt wird oder dein ISR gar nicht als Interrupt-Routine erkannt wird?

Steht im Code auf Byte-Adresse 0x2c (Wort: 0x16) ein Sprung zu Deiner 
Interrupt-Routine?  (Ggfs. die ersten 3 Zeilen der .hex mitliefern.) 
Oder steht da derselbe Sprung wie direkt davor und danach?

von Laurens M. (fr34k1)


Lesenswert?

Hazeh danke für die Antwort.
Haben das Problem gefunden. Lag bei den Standardeinstellungen vom 
AVR-Plugin für Eclipse.
Da beim Compilieren keine .hex Datei, sondern nur ein .elf Datei 
erstellt wurde, hatten wir den MC mit der .elf programmiert. Lief alles 
wunderbar abgesehen von den Interrupts.
Im Assembler Code war natürlich alles richtig...
Nach 25 Std. Suche...
Häkchen bei "Generate Hexfile for Flash memory" in Project -> Properties 
-> Build -> Settings -> Tool Settings -> Additional Tools in Toolchain 
setzten und es funktioniert. :)
Schönen Abend noch!

von Matthias (Gast)


Lesenswert?

Hallo,

ich habe so ziemlich das gleiche Problem. Ein Interrupt fuehrt immer 
dazu, dass der Code von neuem ausgefuehrt wird.

Ich benutze avr-gcc 4.1.2 und schreibe die .hex Datei mit avrdude ins 
Flash. Als MC kommt im Moment ein atmega8 zum Einsatz. Zur 
Vollstaendigkeit, das Programm sieht folgendermassen aus:

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
 
4
volatile uint8_t flag;
5
6
ISR( TIMER2_OVF_vect ) {
7
    flag = 1;
8
}
9
10
int main(void) {
11
 
12
    DDRD = 0xFF;
13
 
14
// Timer2 konfigurieren
15
    TCCR2 = (1 << CS22) | (1 << CS21);
16
    TIMSK |= (1 << TOIE2);
17
18
    sei();
19
20
    while(1) {
21
        if (flag == 1) {
22
            flag = 0;
23
            PORTD ^= (1 << PD0);    // LED toggeln
24
        }
25
    }
26
}

Nun wollte ich, wie <HC Zimmerer> vorschlug, im .hex file nachschauen, 
ob an der richtigen Stelle auch die Sprungadresse zu meiner ISR Funktion 
steht.

Die Sprungadresse fuer den Interrupt TIMER2_OVF muss an 0x004 im 
Programm Code stehen - dem Handbuch entnommen. Nun bin ich mir nicht 
sicher, wie ich das hex-file in kate lesen soll:
1
:1000000012C02CC02BC02AC029C028C027C026C0BF
2
:1000100025C024C023C022C021C020C01FC01EC0D4
3
:100020001DC01CC01BC011241FBECFE5D4E0DEBF25

Ich suche also das 5.Bit in der ersten Zeile was sagt "2B" also 43. Dann 
sollte meine Interrupt Funktion bei Bit 43 beginnen. Allerdings macht 
mich stutzig, dass die ersten 3 Zeilen bei allen meinen hex Files von 
verschiedenen Programmen immer gleich aussehen. Was mache ich falsch?

Danke schon mal fuer die Hilfe.

von Oliver (Gast)


Lesenswert?

>Nun bin ich mir nicht
>sicher, wie ich das hex-file in kate lesen soll:

Dann schau doch in der .lss-datei nach. Da steht die Sprungtabelle im 
Klartext.

Bleibt die Frage, woran du erkennst, daß das Programm immer wieder von 
vorne losläuft.

Oliver

von Matthias (Gast)


Lesenswert?

Das Programm wie oben abgedruckt bringt die LED nicht zum leuchten. 
Toggle ich aber den Ausgang mit der LED vor dem sei() und fuege auch 
noch ein delay vor dem sei() ein, dann blinkt die LED.

Daraus habe ich geschlossen, dass der Aufruf sei() den Interrupt 
TIMER2_OVF aktiviert und ausfuehren will, aber an die falsche Stelle 
springt naemlich an den Anfang vom Programm. Dadurch wird die LED wieder 
ausgeschaltet und alles geht wieder von vorne los. Vielleicht habe ich 
hier auch etwas uebersehen.

Leider weiss ich nicht, wonach ich in der main.lss suchen soll, daher 
einfach die ganze Datei:
1
main.elf:     file format elf32-avr
2
3
Sections:
4
Idx Name          Size      VMA       LMA       File off  Algn
5
  0 .text         000000a0  00000000  00000000  00000074  2**1
6
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
7
  1 .bss          00000001  00800060  00800060  00000114  2**0
8
                  ALLOC
9
  2 .stab         00000378  00000000  00000000  00000114  2**2
10
                  CONTENTS, READONLY, DEBUGGING
11
  3 .stabstr      00000054  00000000  00000000  0000048c  2**0
12
                  CONTENTS, READONLY, DEBUGGING
13
  4 .debug_aranges 00000014  00000000  00000000  000004e0  2**0
14
                  CONTENTS, READONLY, DEBUGGING
15
  5 .debug_pubnames 0000001b  00000000  00000000  000004f4  2**0
16
                  CONTENTS, READONLY, DEBUGGING
17
  6 .debug_info   0000009c  00000000  00000000  0000050f  2**0
18
                  CONTENTS, READONLY, DEBUGGING
19
  7 .debug_abbrev 00000077  00000000  00000000  000005ab  2**0
20
                  CONTENTS, READONLY, DEBUGGING
21
  8 .debug_line   000000e6  00000000  00000000  00000622  2**0
22
                  CONTENTS, READONLY, DEBUGGING
23
  9 .debug_frame  00000028  00000000  00000000  00000708  2**0
24
                  CONTENTS, READONLY, DEBUGGING
25
 10 .debug_str    000000b1  00000000  00000000  00000730  2**0
26
                  CONTENTS, READONLY, DEBUGGING
27
28
Disassembly of section .text:
29
30
00000000 <__vectors>:
31
   0:  12 c0         rjmp  .+36       ; 0x26 <__ctors_end>
32
   2:  2c c0         rjmp  .+88       ; 0x5c <__bad_interrupt>
33
   4:  2b c0         rjmp  .+86       ; 0x5c <__bad_interrupt>
34
   6:  2a c0         rjmp  .+84       ; 0x5c <__bad_interrupt>
35
   8:  29 c0         rjmp  .+82       ; 0x5c <__bad_interrupt>
36
   a:  28 c0         rjmp  .+80       ; 0x5c <__bad_interrupt>
37
   c:  27 c0         rjmp  .+78       ; 0x5c <__bad_interrupt>
38
   e:  26 c0         rjmp  .+76       ; 0x5c <__bad_interrupt>
39
  10:  25 c0         rjmp  .+74       ; 0x5c <__bad_interrupt>
40
  12:  24 c0         rjmp  .+72       ; 0x5c <__bad_interrupt>
41
  14:  23 c0         rjmp  .+70       ; 0x5c <__bad_interrupt>
42
  16:  22 c0         rjmp  .+68       ; 0x5c <__bad_interrupt>
43
  18:  21 c0         rjmp  .+66       ; 0x5c <__bad_interrupt>
44
  1a:  20 c0         rjmp  .+64       ; 0x5c <__bad_interrupt>
45
  1c:  1f c0         rjmp  .+62       ; 0x5c <__bad_interrupt>
46
  1e:  1e c0         rjmp  .+60       ; 0x5c <__bad_interrupt>
47
  20:  1d c0         rjmp  .+58       ; 0x5c <__bad_interrupt>
48
  22:  1c c0         rjmp  .+56       ; 0x5c <__bad_interrupt>
49
  24:  1b c0         rjmp  .+54       ; 0x5c <__bad_interrupt>
50
51
00000026 <__ctors_end>:
52
  26:  11 24         eor  r1, r1
53
  28:  1f be         out  0x3f, r1  ; 63
54
  2a:  cf e5         ldi  r28, 0x5F  ; 95
55
  2c:  d4 e0         ldi  r29, 0x04  ; 4
56
  2e:  de bf         out  0x3e, r29  ; 62
57
  30:  cd bf         out  0x3d, r28  ; 61
58
59
00000032 <__do_copy_data>:
60
  32:  10 e0         ldi  r17, 0x00  ; 0
61
  34:  a0 e6         ldi  r26, 0x60  ; 96
62
  36:  b0 e0         ldi  r27, 0x00  ; 0
63
  38:  e0 ea         ldi  r30, 0xA0  ; 160
64
  3a:  f0 e0         ldi  r31, 0x00  ; 0
65
  3c:  02 c0         rjmp  .+4        ; 0x42 <.do_copy_data_start>
66
67
0000003e <.do_copy_data_loop>:
68
  3e:  05 90         lpm  r0, Z+
69
  40:  0d 92         st  X+, r0
70
71
00000042 <.do_copy_data_start>:
72
  42:  a0 36         cpi  r26, 0x60  ; 96
73
  44:  b1 07         cpc  r27, r17
74
  46:  d9 f7         brne  .-10       ; 0x3e <.do_copy_data_loop>
75
76
00000048 <__do_clear_bss>:
77
  48:  10 e0         ldi  r17, 0x00  ; 0
78
  4a:  a0 e6         ldi  r26, 0x60  ; 96
79
  4c:  b0 e0         ldi  r27, 0x00  ; 0
80
  4e:  01 c0         rjmp  .+2        ; 0x52 <.do_clear_bss_start>
81
82
00000050 <.do_clear_bss_loop>:
83
  50:  1d 92         st  X+, r1
84
85
00000052 <.do_clear_bss_start>:
86
  52:  a1 36         cpi  r26, 0x61  ; 97
87
  54:  b1 07         cpc  r27, r17
88
  56:  e1 f7         brne  .-8        ; 0x50 <.do_clear_bss_loop>
89
  58:  11 d0         rcall  .+34       ; 0x7c <main>
90
  5a:  21 c0         rjmp  .+66       ; 0x9e <_exit>
91
92
0000005c <__bad_interrupt>:
93
  5c:  d1 cf         rjmp  .-94       ; 0x0 <__vectors>
94
95
0000005e <__vector_4>:
96
volatile uint8_t flag;
97
98
 
99
// Timer2 overflow Interrupt
100
// hier wird der Hauptschleife ein neuer Timerinterrupt signalisiert
101
ISR( TIMER2_OVF_vect ) {
102
  5e:  1f 92         push  r1
103
  60:  0f 92         push  r0
104
  62:  0f b6         in  r0, 0x3f  ; 63
105
  64:  0f 92         push  r0
106
  66:  11 24         eor  r1, r1
107
  68:  8f 93         push  r24
108
    flag = 1;
109
  6a:  81 e0         ldi  r24, 0x01  ; 1
110
  6c:  80 93 60 00   sts  0x0060, r24
111
  70:  8f 91         pop  r24
112
  72:  0f 90         pop  r0
113
  74:  0f be         out  0x3f, r0  ; 63
114
  76:  0f 90         pop  r0
115
  78:  1f 90         pop  r1
116
  7a:  18 95         reti
117
118
0000007c <main>:
119
}
120
121
int main(void) {
122
 
123
// IO konfigurieren
124
    DDRD = 0xFF;
125
  7c:  8f ef         ldi  r24, 0xFF  ; 255
126
  7e:  81 bb         out  0x11, r24  ; 17
127
 
128
// Timer2 konfigurieren
129
    TCCR2 = (1 << CS22) | (1 << CS21);
130
  80:  86 e0         ldi  r24, 0x06  ; 6
131
  82:  85 bd         out  0x25, r24  ; 37
132
    TIMSK = (1 << TOIE2);
133
  84:  80 e4         ldi  r24, 0x40  ; 64
134
  86:  89 bf         out  0x39, r24  ; 57
135
136
// Interrupts freigeben
137
    sei();
138
  88:  78 94         sei
139
140
// Endlose Hauptschleife
141
    while(1) {
142
        if (flag == 1) { // Neuer Timerzyklus ?
143
  8a:  90 91 60 00   lds  r25, 0x0060
144
  8e:  91 30         cpi  r25, 0x01  ; 1
145
  90:  e1 f7         brne  .-8        ; 0x8a <main+0xe>
146
            flag = 0;
147
  92:  10 92 60 00   sts  0x0060, r1
148
 
149
            PORTD ^= (1 << PD0);    // LED toggeln
150
  96:  82 b3         in  r24, 0x12  ; 18
151
  98:  89 27         eor  r24, r25
152
  9a:  82 bb         out  0x12, r24  ; 18
153
  9c:  f6 cf         rjmp  .-20       ; 0x8a <main+0xe>
154
155
0000009e <_exit>:
156
  9e:  ff cf         rjmp  .-2        ; 0x9e <_exit>

Ich sehe, dass an den Speicheradressen 5e-7b wohl der Code fuer meinen 
ISR steht, sehe allerdings nicht, wo der Sprung dahin definiert wird.

Danke fuer die Hilfe.

von Stefan E. (sternst)


Lesenswert?

Du hast irgendeinen elementaren Fehler gemacht. Vielleicht 
Controller-Typ beim Linken nicht mit angegeben? Poste doch mal den 
kompletten Build-Output.

von Matthias (Gast)


Lesenswert?

Der build output sieht so aus:
1
-------- begin --------
2
avr-gcc (GCC) 4.1.2 20070115 (prerelease) (SUSE Linux)
3
Copyright (C) 2006 Free Software Foundation, Inc.     
4
This is free software; see the source for copying conditions.  There is NO
5
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
6
7
8
Compiling C: main.c
9
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=1000000UL -Os
10
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
11
-Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.lst  -std=gnu99 --combine 
12
-fwhole-program -Wundef -MD -MP -MF .dep/main.o.d main.c -o 
13
obj/main.o                                                                               
14
15
Linking: main.elf
16
avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char 
17
-funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes 
18
-Wundef -Wa,-adhlns=obj/main.o  -std=gnu99 --combine -fwhole-program 
19
-Wundef -MD -MP -MF .dep/main.elf.d obj/main.o --output main.elf 
20
-Wl,-Map=main.map,--cref    -lm                                          
21
22
Creating load file for Flash: main.hex
23
avr-objcopy -O ihex -R .eeprom main.elf main.hex
24
25
Creating load file for EEPROM: main.eep
26
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
27
--change-section-lma .eeprom=0 -O ihex main.elf main.eep
28
avr-objcopy: --change-section-lma .eeprom=0x0000000000000000 never used
29
30
Creating Extended Listing: main.lss
31
avr-objdump -h -S main.elf > main.lss
32
33
Creating Symbol Table: main.sym
34
avr-nm -n main.elf > main.sym
35
36
Size after:
37
main.elf  :
38
section           size      addr
39
.text              160         0
40
.bss                 1   8388704
41
.stab              888         0
42
.stabstr            84         0
43
.debug_aranges      20         0
44
.debug_pubnames     27         0
45
.debug_info        156         0
46
.debug_abbrev      119         0
47
.debug_line        230         0
48
.debug_frame        40         0
49
.debug_str         177         0
50
Total             1902
51
52
53
54
-------- end --------

von Tim (Gast)


Lesenswert?

Prüfe mal bitte ob TIMER2_OVF_vect in den .h auch wirklich definiert
ist. Hatte hier auch schon das Problem, daß der GCC zwar die ISR
einbaut, aber nicht in der IRQ Vector Tabelle eingebunden hat.
Grund war ein Falsch geschriebener ISR Name....

Eine Fehlermeldung gab es komischerweise nicht.

von Stefan E. (sternst)


Lesenswert?

Tim schrieb:
> Prüfe mal bitte ob TIMER2_OVF_vect in den .h auch wirklich definiert
> ist. Hatte hier auch schon das Problem, daß der GCC zwar die ISR
> einbaut, aber nicht in der IRQ Vector Tabelle eingebunden hat.
> Grund war ein Falsch geschriebener ISR Name....

Unnötig. Die Funktion ist ja als Interrupt-Funktion übersetzt worden 
(und auch mit der richtigen Vektor-Nummer), also kann es das nicht sein.

@ Matthias:
Ich kann im Build-Output nichts entdecken. Ich würde es mal mit einer 
etwas aktuelleren Toolchain probieren.

von Grrrr (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Unnötig. Die Funktion ist ja als Interrupt-Funktion übersetzt worden
> (und auch mit der richtigen Vektor-Nummer), also kann es das nicht sein.

Wo siehst Du hier "die richtige Vektor-Nummer"?

von Hc Z. (mizch)


Lesenswert?

> avr-gcc -mmcu=atmega8 [...]

In der Überschrift steht aber ATmega88 (nicht ATmega8).

von Stefan E. (sternst)


Lesenswert?

Grrrr schrieb:
> Stefan Ernst schrieb:
>> Unnötig. Die Funktion ist ja als Interrupt-Funktion übersetzt worden
>> (und auch mit der richtigen Vektor-Nummer), also kann es das nicht sein.
>
> Wo siehst Du hier "die richtige Vektor-Nummer"?

1
0000005e <__vector_4>:

von Tim (Gast)


Lesenswert?

@Stefan Ernst:
Wie gesagt, gleiches Problem hatte ich hier auch schon.
Ursache war der Umstieg auf einen grösseren AVR (16 auf 64 oder so).

Und damit war ich wohl zu spät :-)
Vielleicht solltest du auch noch -mmcu= an deine Hardware anpassen.

von Stefan E. (sternst)


Lesenswert?

Hc Zimmerer schrieb:
>> avr-gcc -mmcu=atmega8 [...]
>
> In der Überschrift steht aber ATmega88 (nicht ATmega8).

Was daran liegt, dass der Frager einen alten Thread gekapert hat.

von Hc Z. (mizch)


Lesenswert?

> Was daran liegt, dass der Frager einen alten Thread gekapert hat.

Argl.

von Peter D. (peda)


Lesenswert?

Hc Zimmerer schrieb:
>> avr-gcc -mmcu=atmega8 [...]
>
> In der Überschrift steht aber ATmega88 (nicht ATmega8).

Ja, das verwirrt ungemein.

Deshalb @Matthias (Gast)

Schreib 100-mal an die Tafel:
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"
"Ich soll nicht fremde Threads hijacken!"


Peter

von Matthias (Gast)


Lesenswert?

Hallo,

ja, ich habe einen alten thread missbraucht. Meiner Ansicht nach leide 
ich an einem sehr aehnlichen Problem, wie der anfaengliche Poster. Aber 
das war wohl eine schlechte Idee.

Zurueck zu meinem Problem. In der iom8.h steht:
1
...
2
/* Timer/Counter2 Overflow */
3
#define TIMER2_OVF_vect      _VECTOR(4)
4
#define SIG_OVERFLOW2      _VECTOR(4)
5
...

Ich hoffe, dass beantwortet die Frage von Tim.

Die toolchain umfasst wohl den avr-gcc compiler und avrdude? Ich habe da 
einfach ein Paket meiner Distribution installiert und mir dazu keine 
Gedanken gemacht. Es gibt bei openSUSE ein Packet cross-avr-gcc und ein 
Paket cross-avr-gcc44 welche jeweils die Compiler und Support Files 
beinhalten. Vielleicht haette ich da die Version cross-avr-gcc44 nehmen 
sollen?


Es scheint mir aber so, als ob meine Interpretation der Dinge richtig 
liegt und meine ISR Prozedur nicht angesprungen wird. Es ist also ein 
Problem bei der Compilierung, oder?

von Stefan E. (sternst)


Lesenswert?

Matthias schrieb:
> Es scheint mir aber so, als ob meine Interpretation der Dinge richtig
> liegt und meine ISR Prozedur nicht angesprungen wird. Es ist also ein
> Problem bei der Compilierung, oder?

Genauer gesagt ein Problem beim Linken, der Vektor wird nicht 
eingetragen. Die fertigen avr-gcc-Pakete der Distributionen sind 
ziemlich bekannt dafür, häufiger mal buggy zu sein.

Schau mal bei AVR-Freaks vorbei. Dort gibt es ein Skript, mit dem man 
sich avr-gcc ziemlich einfach selbst übersetzen kann. Seit Kurzem gibt 
es dort auch fertige Deb-Pakete, es gibt dazu einen Thread mit der 
Adresse.

von Laurens M. (fr34k1)


Lesenswert?

Deine .lss-Datei muss nachher folgendes enthalten:
1
...
2
00000000 <__vectors>:
3
   0:  12 c0         rjmp  .+36       ; 0x26 <__ctors_end>
4
   2:  2c c0         rjmp  .+88       ; 0x5c <__bad_interrupt>
5
   4:  2b c0         rjmp  .+86       ; 0x5c <__bad_interrupt>
6
   6:  2a c0         rjmp  .+84       ; 0x5c <__bad_interrupt>
7
   8:  2a c0         rjmp  .+84       ; 0x5e <__vector_4>
8
   a:  28 c0         rjmp  .+80       ; 0x5c <__bad_interrupt>
9
...

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

"bad interrupt" setzt man am besten auf eine Routine, welche eine LED 
einschaltet und dann in einer Endlosschleife hängen bleibt - falls man 
noch einen Pin frei hat. Geht alles gut, sollte die LED niemals 
leuchten. Wenn doch, trat ein nicht abgefangener Interrupt auf.

von Oliver (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Der build output sieht so aus:
>
>
> -------- begin --------
>
> avr-gcc (GCC) 4.1.2 20070115 (prerelease) (SUSE Linux)
> Copyright (C) 2006 Free Software Foundation, Inc.


Also, dein Programm ist in Ordnung, der Vektor wird aber nicht in die 
Sprungtabelle eingetragen.

Wie schon gesagt wurde, besorge dir erst einmal eine aktuelle und 
nachgewiesenermassen funktionsfähige avr-gcc-Version. 3 Jahre alte 
"prereleases" sind da eher nicht vertrauenswürdig.

Oliver

von Stefan E. (sternst)


Lesenswert?

Oliver schrieb:
> Stefan Ernst schrieb:
>> Der build output sieht so aus:

Hä???

von Oliver (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Oliver schrieb:
>> Stefan Ernst schrieb:
>>> Der build output sieht so aus:
>
> Hä???

Hmpf.
Da habe ich den Zitat-Link des falschen Beitrags erwischt. Sollte 
natürlich so lauten:

Matthias schrieb:
> Der build output sieht so aus:

Ist aber schon lustig, daß man über den Zitate-Link aus anderen 
Beiträgen die Autoren beliebig zuordnen kann.

Oliver

von Иван S. (ivan)


Lesenswert?

Peter Dannegger schrieb:
>> In der Überschrift steht aber ATmega88 (nicht ATmega8).
>
> Ja, das verwirrt ungemein.

Was spricht dagegen, das Subjekt zu ändern?

Iwan

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.