mikrocontroller.net

Forum: Compiler & IDEs GCC erzeugt zu kurze Interrupttabelle auf ATTiny24


Autor: Daniel G. (sh0dan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche seit Stunden verzweifelt folgenden, kleinen 
Programmabschnitt mit avr-gcc unter Windows auf einem ATtiny24V zum 
laufen zu kriegen:
#include <avr/interrupt.h>
#include <avr/io.h>
#include "Tools.h"

///<summary>ADC Interrupt</summary>
ISR(ADC_vect)
{
  volatile unsigned char ucDummy;
  BIT_SET(PINB, PB0);

  //-- ADCH immer auslesen, damit der AD-Wandler wieder bereit ist
  ucDummy=ADCH;      
}

///<summary>Hauptprogramm</summary>
__attribute__((noreturn)) void main ()
{
  //! DEBUG
  BIT_SET(DDRB, PB0);
  BIT_CLEAR(PORTB, PB0);

  //-- ADC konfigurieren
  ADMUX=0;                        //Eingangskanal 0  
  BIT_SET(ADMUX, REFS1);          //1,1V
  BIT_SET2(ADCSRA, ADPS1, ADPS2); //Prescaler /64
  BIT_SET2(ADCSRA, ADIE, ADEN);   //Interrupt Enable und ADC Enable
  
  //-- Interrupts freigeben
  sei();

  //-- AD-Wandler anwerfen
  BIT_SET(ADCSRA, ADSC);
}

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:
Disassembly of section .text:

00000000 <__vectors>:
   0:  0c c0         rjmp  .+24       ; 0x1a <__ctors_end>
   2:  27 c0         rjmp  .+78       ; 0x52 <__bad_interrupt>
   4:  26 c0         rjmp  .+76       ; 0x52 <__bad_interrupt>
   6:  25 c0         rjmp  .+74       ; 0x52 <__bad_interrupt>
   8:  24 c0         rjmp  .+72       ; 0x52 <__bad_interrupt>
   a:  23 c0         rjmp  .+70       ; 0x52 <__bad_interrupt>
   c:  22 c0         rjmp  .+68       ; 0x52 <__bad_interrupt>
   e:  21 c0         rjmp  .+66       ; 0x52 <__bad_interrupt>
  10:  20 c0         rjmp  .+64       ; 0x52 <__bad_interrupt>
  12:  1f c0         rjmp  .+62       ; 0x52 <__bad_interrupt>
  14:  1e c0         rjmp  .+60       ; 0x52 <__bad_interrupt>
  16:  1d c0         rjmp  .+58       ; 0x52 <__bad_interrupt>
  18:  1c c0         rjmp  .+56       ; 0x52 <__bad_interrupt>

0000001a <__ctors_end>:
  1a:  11 24         eor  r1, r1
  1c:  1f be         out  0x3f, r1  ; 63
  1e:  cf e5         ldi  r28, 0x5F  ; 95
  20:  d2 e0         ldi  r29, 0x02  ; 2
  22:  de bf         out  0x3e, r29  ; 62
  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...

Autor: Daniel G. (sh0dan)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier die Datei Tools.h zum Nachvollziehen. Irgendwie kann ich beim 
Bearbeiten eines Postings keine Datei anhängen.

(Scheint heute irgendwie nicht mein Tag zu sein)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falschen Controllertyp angegeben? Mit -mmcu=attiny24 sieht bei mir die
Tabelle so aus:
00000000 <__vectors>:
   0:  10 c0         rjmp  .+32       ; 0x22 <__ctors_end>
   2:  28 c0         rjmp  .+80       ; 0x54 <__bad_interrupt>
   4:  27 c0         rjmp  .+78       ; 0x54 <__bad_interrupt>
   6:  26 c0         rjmp  .+76       ; 0x54 <__bad_interrupt>
   8:  25 c0         rjmp  .+74       ; 0x54 <__bad_interrupt>
   a:  24 c0         rjmp  .+72       ; 0x54 <__bad_interrupt>
   c:  23 c0         rjmp  .+70       ; 0x54 <__bad_interrupt>
   e:  22 c0         rjmp  .+68       ; 0x54 <__bad_interrupt>
  10:  21 c0         rjmp  .+66       ; 0x54 <__bad_interrupt>
  12:  20 c0         rjmp  .+64       ; 0x54 <__bad_interrupt>
  14:  1f c0         rjmp  .+62       ; 0x54 <__bad_interrupt>
  16:  1e c0         rjmp  .+60       ; 0x54 <__bad_interrupt>
  18:  1d c0         rjmp  .+58       ; 0x54 <__bad_interrupt>
  1a:  1d c0         rjmp  .+58       ; 0x56 <__vector_13>
  1c:  1b c0         rjmp  .+54       ; 0x54 <__bad_interrupt>
  1e:  1a c0         rjmp  .+52       ; 0x54 <__bad_interrupt>
  20:  19 c0         rjmp  .+50       ; 0x54 <__bad_interrupt>

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mal eben deinen Code durch den GCC gejagt (da du weder die 
verwendete GCC-Version noch dein Makefile beigelegt hast hab ich die 
Defaults von Code::Blocks+GCC V4.2.2 im debug-Build benutzt).
00000000 <__vectors>:
   0:  10 c0         rjmp  .+32       ; 0x22 <__ctors_end>
   2:  28 c0         rjmp  .+80       ; 0x54 <__bad_interrupt>
   4:  27 c0         rjmp  .+78       ; 0x54 <__bad_interrupt>
   6:  26 c0         rjmp  .+76       ; 0x54 <__bad_interrupt>
   8:  25 c0         rjmp  .+74       ; 0x54 <__bad_interrupt>
   a:  24 c0         rjmp  .+72       ; 0x54 <__bad_interrupt>
   c:  23 c0         rjmp  .+70       ; 0x54 <__bad_interrupt>
   e:  22 c0         rjmp  .+68       ; 0x54 <__bad_interrupt>
  10:  21 c0         rjmp  .+66       ; 0x54 <__bad_interrupt>
  12:  20 c0         rjmp  .+64       ; 0x54 <__bad_interrupt>
  14:  1f c0         rjmp  .+62       ; 0x54 <__bad_interrupt>
  16:  1e c0         rjmp  .+60       ; 0x54 <__bad_interrupt>
  18:  1d c0         rjmp  .+58       ; 0x54 <__bad_interrupt>
  1a:  1d c0         rjmp  .+58       ; 0x56 <__vector_13>
  1c:  1b c0         rjmp  .+54       ; 0x54 <__bad_interrupt>
  1e:  1a c0         rjmp  .+52       ; 0x54 <__bad_interrupt>
  20:  19 c0         rjmp  .+50       ; 0x54 <__bad_interrupt>

Hier sind alle 17 Vektoren drin. Und der Vektor für den ADC-Interrupt 
scheint auch an der richtigen Stelle zu sein.

Wie rufst du den GCC den auf?

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@yalu:

Mist, zu langsam gewesen ;)

Autor: Daniel G. (sh0dan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zuerst einmal vielen Dank für eure Mühe.

Jetzt weiß ich wenigstens, dass es an den Paramtern (also an mir) und 
nicht am GCC liegt.

Die GCC Version ist gcc version 4.3.2 (WinAVR 20081205). Also der 
aktuellste WinAVR.

Nachfolgend mal die einzelnen Aufrufe, so wie sie das Makefile absetzt:
avr-gcc -c -mmcu=attiny24 -I. -gstabs -Os -DF_CPU=8000000UL -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=./BUILD/test.lst  -std=gnu99 -MMD -MP -MF ./BUILD/test.o.d test.c -o BUILD/test.o 
test.c:28: warning: function declaration isn't a prototype
test.c:27: warning: return type of 'main' is not 'int'
avr-gcc -Wl,-Map=./BUILD/main.map,--cref      ./BUILD/test.o      -o ./BUILD/main.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock BUILD/main.elf BUILD/main.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex BUILD/main.elf BUILD/main.eep || exit 0
avr-objdump -h -S -z BUILD/main.elf > BUILD/main.lss
avr-nm -n BUILD/main.elf > BUILD/main.sym

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Linken, nämlich in dieser Zeile
avr-gcc -Wl,-Map=./BUILD/main.map,--cref      ./BUILD/test.o      -o ./BUILD/main.elf

fehlt -mmcu=attiny24

Wahrscheinlich hat dein Makefile einen Fehler.

Autor: Daniel G. (sh0dan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo yalu,

danke für den Tip. Manchmal sieht man den Wald vor lauter Bäumen nicht. 
Ich hab immer die Compilerparameter überprüft und den Linker ganz 
übersehen. Werd gleich mal das Makefile anpassen und nochmal Bescheid 
geben.

Autor: Daniel G. (sh0dan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

kaum macht mann's richtig, schon geht's. Es lag tatsächlich am Fehlenden 
mmcu-Parameter beim Linken.

Vielen Dank fürs Weiterhelfen.

Schönes Restwochenende.

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.