Forum: Mikrocontroller und Digitale Elektronik ATMega16 & INT2 mit avrgcc


von Daniel M. (usul27)


Lesenswert?

Ich versuche gerade eine Interrupt-Routine für INT2 auf dem avrgcc zu 
compilieren. Leider klappt es nicht.


ISR(INT2_vect) {
 blub=1;
}

Der Code wird auch als "<__vector_18>" erzeugt.

Die erzeugte Interrupt-Tabelle ist aber einfach zu kurz:
00000000 <__vectors>:
   0:  13 c0         rjmp  .+38       ; 0x28 <__init>
   2:  2d c0         rjmp  .+90       ; 0x5e <__bad_interrupt>
   4:  2c c0         rjmp  .+88       ; 0x5e <__bad_interrupt>
   6:  2b c0         rjmp  .+86       ; 0x5e <__bad_interrupt>
   8:  2a c0         rjmp  .+84       ; 0x5e <__bad_interrupt>
   a:  29 c0         rjmp  .+82       ; 0x5e <__bad_interrupt>
   c:  28 c0         rjmp  .+80       ; 0x5e <__bad_interrupt>
   e:  27 c0         rjmp  .+78       ; 0x5e <__bad_interrupt>
  10:  26 c0         rjmp  .+76       ; 0x5e <__bad_interrupt>
  12:  25 c0         rjmp  .+74       ; 0x5e <__bad_interrupt>
  14:  24 c0         rjmp  .+72       ; 0x5e <__bad_interrupt>
  16:  23 c0         rjmp  .+70       ; 0x5e <__bad_interrupt>
  18:  22 c0         rjmp  .+68       ; 0x5e <__bad_interrupt>

0000001a <__ctors_end>:

Am Ende fehlen 3 Interrupt-Einsprungpunkte, unter anderem der für INT2

Wenn ich als MCU "ATMega32" wähle, ist die Tabelle gross genug, 
allerdings liegen die Interrupts dort anders, weshalb der Code für den 
Mega16 nicht brauchbar ist.
Hat irgendwer eine Ahnung, wie ich den AVRGCC dazu bringe eine 
Interrupttabelle der richtigen Grösse zu erzeugen?

von Daniel M. (usul27)


Lesenswert?

Ich hab nochmal weitergeschaut. Es scheint, als ob der AVRGCC generell 
nach 12 Interrupt-Einträgen den Code legt (ist auch so, wenn man den 
Mega32 wählt). Ich vermute also, dass er den Interrupt-Vektor mit 
anderem Code überschreibt. Ist das ein bekannter Bug?

von Heiko (Gast)


Lesenswert?

Moin,

vielleicht schaust du mal, ob es eine neuere Version des AVR-GCC und der 
Include-Files (soweit ich weiß bei der avr-libc dabei) gibt.

Meine Versionen laufen problemlos - das sind:
avr-gcc (GCC) 3.4.6 (Gentoo 3.4.6, ssp-3.4.5-1.0, pie-8.7.9)
Binutils: Version 2.15.94
avr-libc: 1.4.4

Beispiel auf einem ATMega16:

Disassembly of section .text:

00000000 <__vectors>:
       0:       0c 94 74 00     jmp     0xe8 <__init>
       4:       0c 94 48 09     jmp     0x1290 <__vector_1>
       8:       0c 94 71 09     jmp     0x12e2 <__vector_2>
       c:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      10:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      14:       0c 94 c8 08     jmp     0x1190 <__vector_5>
      18:       0c 94 b3 08     jmp     0x1166 <__vector_6>
      1c:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      20:       0c 94 69 08     jmp     0x10d2 <__vector_8>
      24:       0c 94 45 08     jmp     0x108a <__vector_9>
      28:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      2c:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      30:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      34:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      38:       0c 94 02 09     jmp     0x1204 <__vector_14>
      3c:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      40:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      44:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      48:       0c 94 91 09     jmp     0x1322 <__vector_18>
      4c:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>
      50:       0c 94 8f 00     jmp     0x11e <__bad_interrupt>

MfG, Heiko

von Daniel M. (usul27)


Lesenswert?

Hmm:

avr-gcc: 3.4.6
Binutils: 2.16.1 + coff-avr-patch (20050630)
avr-libc: 1.4.5

Sieht eigentlich so aus, als hätte ich überall die aktuellen Versionen.

Hat noch jemand eine Idee?

von Daniel M. (usul27)


Lesenswert?

Ich schaffe es nicht :(

Kann jemand mal folgendes nachvollziehen:

C-Source:
---main.c---
#include <avr/interrupt.h>
#include <stdint.h>
#include <avr/io.h>

ISR(INT2_vect) {
  // do something
}

int main(void) {
}
-------------

Compilieren:

avr-gcc -c -mmcu=atmega16 -o main.o main.c
avr-gcc -o  "main.elf"  ./main.o
avr-objdump  -d main.elf >main.lss

Und raus kommt bei mir folgendes:

---------------------------------------------------------------------
main.elf:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:  0c c0         rjmp  .+24       ; 0x1a <__ctors_end>
   2:  26 c0         rjmp  .+76       ; 0x50 <__bad_interrupt>
   4:  25 c0         rjmp  .+74       ; 0x50 <__bad_interrupt>
   6:  24 c0         rjmp  .+72       ; 0x50 <__bad_interrupt>
   8:  23 c0         rjmp  .+70       ; 0x50 <__bad_interrupt>
   a:  22 c0         rjmp  .+68       ; 0x50 <__bad_interrupt>
   c:  21 c0         rjmp  .+66       ; 0x50 <__bad_interrupt>
   e:  20 c0         rjmp  .+64       ; 0x50 <__bad_interrupt>
  10:  1f c0         rjmp  .+62       ; 0x50 <__bad_interrupt>
  12:  1e c0         rjmp  .+60       ; 0x50 <__bad_interrupt>
  14:  1d c0         rjmp  .+58       ; 0x50 <__bad_interrupt>
  16:  1c c0         rjmp  .+56       ; 0x50 <__bad_interrupt>
  18:  1b c0         rjmp  .+54       ; 0x50 <__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

00000026 <__do_copy_data>:
  26:  10 e0         ldi  r17, 0x00  ; 0
  28:  a0 e6         ldi  r26, 0x60  ; 96
  2a:  b0 e0         ldi  r27, 0x00  ; 0
  2c:  e0 e8         ldi  r30, 0x80  ; 128
  2e:  f0 e0         ldi  r31, 0x00  ; 0
  30:  03 c0         rjmp  .+6        ; 0x38 <.do_copy_data_start>


Irgendwo gibt e wohl beim Linken ein Problem. Aber wo? Brauch ich noch 
irgendwelche speziellen Linker-Optionen?

von Daniel M. (usul27)


Lesenswert?

Interessant: Wenn ich in einem Schritt compilieren und linken lasse, 
funktioniert es:

avr-gcc -mmcu=atmega16 -o main.out main.c
avr-objdump -d main.out >main.lss

main.out:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:  0c 94 2a 00   jmp  0x54 <__ctors_end>
   4:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
   8:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
   c:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  10:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  14:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  18:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  1c:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  20:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  24:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  28:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  2c:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  30:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  34:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  38:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  3c:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  40:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  44:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  48:  0c 94 47 00   jmp  0x8e <__vector_18>
  4c:  0c 94 45 00   jmp  0x8a <__bad_interrupt>
  50:  0c 94 45 00   jmp  0x8a <__bad_interrupt>

Also ist wohl irgendwas an meinem Linker-Aufruf falsch. Aber was?

von Daniel M. (usul27)


Lesenswert?

Geschafft: Der Linker braucht auch nochmal eine Info, für welche 
Architektur gelinkt werden soll. Also noch "-mmcu=atmega16".
Interessanterweise bietet das Eclipse-Plugin die Auswahl des Prozessers 
für Assembler und C-Compiler, aber nicht für den Linker. Nachdem ich sie 
dort von Hand nachgetragen habe, scheint der Code jetzt richtig zu sein 
:)

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.