Forum: Mikrocontroller und Digitale Elektronik Warum stimmen die Interrupteinsprungadressen nicht?


von Thomas (kosmos)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe da ein komisches Problem und zwar springt ein Interrupt 
beim simulieren im AVR-Studio 3.5X nicht die Adresse an wie es im 
Datenblatt des ATM16 steht. Speziell geht es im den Timr Overflow 
Interrupt wenn mein Timmer auf FF steht und dann wechselt sollte laut 
Datenblatt die 10te Stelle angesprungen werden, das Programm springt 
aber an die 17te Stelle meiner Sprungtabelle. Weiß jemand woran das 
liegt. Mein Programm funktioniert im Simulator wie es soll.

.cseg
.org 0x00
jmp reset        ;RESET
jmp ExternerInterrupt0  ;Int0
reti
reti
reti ExternerInterrupt1 ;INT1
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
jmp Timer0Overflow
reti
reti
reti
reti

von Der M. (steinadler)


Lesenswert?

Funktionieren denn die anderen Interrupts???

von Johannes M. (johnny-m)


Lesenswert?

reti ist nur ein Wort (zwei Bytes) breit, die Interrupt-Vektoren beim 
Mega16 aber 2 Worte (vier Bytes). Also entweder jedem Vektor ein 
zusätzliches "nop" verpassen oder mit .org arbeiten. Am allerbesten 
einfach die Vektortabelle aus dem jeweiligen Datenblatt übernehmen...

Aber wenigstens das "jmp" anstelle von "rjmp" stimmt schon mal...

von Hannes L. (hannes)


Lesenswert?

Alternativ geht's auch so:
1
.include"m16def.inc"
2
.cseg
3
.org 0              ;Reset- und Interrupt-Vektoren AT-Mega 16
4
 jmp RESET          ;Reset Handler
5
 jmp nix ;EXT_INT0       ;IRQ0 Handler
6
 jmp nix ;EXT_INT1       ;IRQ1 Handler
7
 jmp nix ;TIM2_COMP      ;Timer2 Compare Handler
8
 jmp nix ;TIM2_OVF       ;Timer2 Overflow Handler
9
 jmp nix ;TIM1_CAPT      ;Timer1 Capture Handler
10
 jmp nix ;TIM1_COMPA     ;Timer1 CompareA Handler
11
 jmp nix ;TIM1_COMPB     ;Timer1 CompareB Handler
12
 jmp nix ;TIM1_OVF       ;Timer1 Overflow Handler
13
 jmp nix ;TIM0_OVF       ;Timer0 Overflow Handler
14
 jmp nix ;SPI_STC        ;SPI Transfer Complete Handler
15
 jmp nix ;USART_RXC      ;USA RT RX Complete Handler
16
 jmp nix ;USART_UDRE     ;UDR Empty Handler
17
 jmp nix ;USART_TXC      ;USART TX Complete Handler
18
 jmp nix ;ADCC           ;ADC Conversion Complete Handler
19
 jmp nix ;EE_RDY         ;EEPROM Ready Handler
20
 jmp nix ;ANA_COMP       ;Analog Comparator Handler
21
 jmp nix ;TWSI           ;Two-wire Serial Interface Handler
22
 jmp nix ;EXT_INT2       ;IRQ2 Handler
23
 jmp nix ;TIM0_COMP      ;Timer0 Compare Handler
24
 jmp nix ;SPM_RDY        ;Store Program Memory Ready Handler
25
nix:                ;Interrupt nicht genutzt
26
 ;Falle zum Aufspüren von Programmierfehlern, je nach Möglichkeit mit
27
 ;einer Ausgabe (LED?) erweiterbar
28
 rjmp nix                ;Endlosschleife
29
reset:              ;Programmstart

Sowas schreibe ich ein einziges mal für jeden AVR-Typ, und zwar dann, 
wenn ich ihn zum ersten mal benutze. Der Text ist dabei aus dem 
Datenblatt kopiert und entsprechend angepasst. In einer Textdatei werden 
Kopien aller bisher verwendeten Int-Vektortabellen gesammelt, was die 
Wiederverwendung bereits erstellter Tabellen erleichtert.

Wird ein Interrupt verwendet, so wird einfach das "nix ;" aus der 
entsprechenden Zeile entfernt und die ISR mit dem entsprechenden Label 
geschrieben.

Die "Fehlerfalle" namens "nix" kann an die Gegebenheiten angepasst 
werden, z.B. Impulserzeugung an einem Portpin (LED an, Warteschleife, 
LED aus, Warteschleife, nochmal), wobei das ein "Programmteil" ist, der 
im Normalfall (Fehlerfreiheit) nie aufgerufen werden wird.

...

von Thomas (kosmos)


Lesenswert?

Hallo, danke daran lags, jetzt springt er die richtige stelle an.

von Fred (Gast)


Lesenswert?

Hi,

sagt mal bitte, warum man lieber ein "jmp" anstelle von "rjmp" verwenden 
sollte. Im Datenblatt zum Tiny26 z.B. steht die vektortabelle mit 
"rjmp".
Gruß

Fred

von Johannes M. (johnny-m)


Lesenswert?

rjmp ist ein relativer Sprung und kann maximal 8 kB Flash addressieren. 
Deshalb gibt es den jmp-Befehl auch nur bei den AVRs mit mehr als 8 kB 
Flash, was auf den Tiny nicht zutrifft. Bei den "kleinen" AVRs kann man 
eben den kompletten Programmspeicher mit dem platzsparenden rjmp 
ansprechen.

jmp hat im Unterschied zu rjmp 32 Bit und deshalb sind auch bei den AVRs 
mit mehr als 8 kB Flash die Interrupt-Vektoren 32 Bit lang (16 Bit bei 
denen mit bis zu 8 kB).

von Fred (Gast)


Lesenswert?

Hallo Johannes,

danke für die schnelle Antwort. Ich hatte mir zwar schon das 
"instruction summary" durchgelesen, aber irgendwie fehlte mir der 
Durchblick. Jetzt isses klar. Danke nochmal
Gruß

Fred

von Hannes L. (hannes)


Lesenswert?

> Ich hatte mir zwar schon das
> "instruction summary" durchgelesen,

Auch die kontextsensitive Online-Hilfe des AVR-Studios (F1-Taste) kann 
sehr hilfreich 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.