Ich versuche seit Stunden verzweifelt folgenden, kleinen
Programmabschnitt mit avr-gcc unter Windows auf einem ATtiny24V zum
laufen zu kriegen:
1 | #include <avr/interrupt.h>
|
2 | #include <avr/io.h>
|
3 | #include "Tools.h"
|
4 |
|
5 | ///<summary>ADC Interrupt</summary>
|
6 | ISR(ADC_vect)
|
7 | {
|
8 | volatile unsigned char ucDummy;
|
9 | BIT_SET(PINB, PB0);
|
10 |
|
11 | //-- ADCH immer auslesen, damit der AD-Wandler wieder bereit ist
|
12 | ucDummy=ADCH;
|
13 | }
|
14 |
|
15 | ///<summary>Hauptprogramm</summary>
|
16 | __attribute__((noreturn)) void main ()
|
17 | {
|
18 | //! DEBUG
|
19 | BIT_SET(DDRB, PB0);
|
20 | BIT_CLEAR(PORTB, PB0);
|
21 |
|
22 | //-- ADC konfigurieren
|
23 | ADMUX=0; //Eingangskanal 0
|
24 | BIT_SET(ADMUX, REFS1); //1,1V
|
25 | BIT_SET2(ADCSRA, ADPS1, ADPS2); //Prescaler /64
|
26 | BIT_SET2(ADCSRA, ADIE, ADEN); //Interrupt Enable und ADC Enable
|
27 |
|
28 | //-- Interrupts freigeben
|
29 | sei();
|
30 |
|
31 | //-- AD-Wandler anwerfen
|
32 | BIT_SET(ADCSRA, ADSC);
|
33 | }
|
Das Problem ist, das der Interrupt nie aufgerufen wird (die LED an PB0
bleibt aus). Nun habe ich mir die disassembly des Compileroutputs
angesehen und bin etwas stutzig geworden:
1 | Disassembly of section .text:
|
2 |
|
3 | 00000000 <__vectors>:
|
4 | 0: 0c c0 rjmp .+24 ; 0x1a <__ctors_end>
|
5 | 2: 27 c0 rjmp .+78 ; 0x52 <__bad_interrupt>
|
6 | 4: 26 c0 rjmp .+76 ; 0x52 <__bad_interrupt>
|
7 | 6: 25 c0 rjmp .+74 ; 0x52 <__bad_interrupt>
|
8 | 8: 24 c0 rjmp .+72 ; 0x52 <__bad_interrupt>
|
9 | a: 23 c0 rjmp .+70 ; 0x52 <__bad_interrupt>
|
10 | c: 22 c0 rjmp .+68 ; 0x52 <__bad_interrupt>
|
11 | e: 21 c0 rjmp .+66 ; 0x52 <__bad_interrupt>
|
12 | 10: 20 c0 rjmp .+64 ; 0x52 <__bad_interrupt>
|
13 | 12: 1f c0 rjmp .+62 ; 0x52 <__bad_interrupt>
|
14 | 14: 1e c0 rjmp .+60 ; 0x52 <__bad_interrupt>
|
15 | 16: 1d c0 rjmp .+58 ; 0x52 <__bad_interrupt>
|
16 | 18: 1c c0 rjmp .+56 ; 0x52 <__bad_interrupt>
|
17 |
|
18 | 0000001a <__ctors_end>:
|
19 | 1a: 11 24 eor r1, r1
|
20 | 1c: 1f be out 0x3f, r1 ; 63
|
21 | 1e: cf e5 ldi r28, 0x5F ; 95
|
22 | 20: d2 e0 ldi r29, 0x02 ; 2
|
23 | 22: de bf out 0x3e, r29 ; 62
|
24 | 24: cd bf out 0x3d, r28 ; 61
|
Kann es sein, dass hier für meine ISR kein rjmp eingetragen ist.
Ausserdem sind es viel zu wenig Interruptvektoren da der ATtiny24 17
Interrupts hat und hier nur 13 vorhanden sind. Dafür fängt der Abschnitt
__ctors_end zu früh an und belegt einen teil der Interrupttabelle.
Kann jemand das Problem nachvollziehen? Woran könnte das liegen? Mir
fällt echt nichts mehr ein und ich bin für jeden Tip dankbar...