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
Funktionieren denn die anderen Interrupts???
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...
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. ...
Hallo, danke daran lags, jetzt springt er die richtige stelle an.
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
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).
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.