www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega16 & INT2 mit avrgcc


Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel M. (usul27)
Datum:

Bewertung
0 lesenswert
nicht 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 
:)

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.