Hallo, ich versuche gerade ein Programm zur auswertung van Drehencodern (asm, AVR Studio) und ansteuerung eines displays zu schreiben. Dafür werden 2 Interrupts benutzt (e_int0+e_int1). Am anfang stehen die interruptvektoren und dann eine interruptrutine. Bei der simulation springt e_int1 immer in die interruprutine mitten rein (0x004) wenn ich die .org direktive nehme und 0x004 vor e_int1 schreibe, springt er dahin. Ist das nurmal und macht der echte AtMega das auch so? bug? Normal sollte der doch nach 0x002 springen, ich habe jetzt schon 2 stunden etliche Fehler entfernt, auf dem controller läuft das programm trotzdem noch nicht. Bin langsam am Verzweifeln.
Ich hab jetzt nicht durch das Programm geschaut. Wenn du schon jeden Interrupt Vektor mit .org auf seine Position nageln willst, dann mach das nicht mit Zahlenwerten! Denn das bringt keine Sicherheit. Hier ist zb der entsprechende Abschnitt aus dem Tut für einen Mega8
1 | .include "m8def.inc" |
2 | |
3 | .org 0x000 |
4 | rjmp RESET |
5 | .org INT0addr ; External Interrupt0 Vector Address |
6 | reti |
7 | .org INT1addr ; External Interrupt1 Vector Address |
8 | reti |
9 | .org OC2addr ; Output Compare2 Interrupt Vector Address |
10 | reti |
11 | .org OVF2addr ; Overflow2 Interrupt Vector Address |
12 | reti |
13 | .org ICP1addr ; Input Capture1 Interrupt Vector Address |
14 | reti |
15 | .org OC1Aaddr ; Output Compare1A Interrupt Vector Address |
16 | reti |
17 | .org OC1Baddr ; Output Compare1B Interrupt Vector Address |
18 | reti |
19 | .org OVF1addr ; Overflow1 Interrupt Vector Address |
20 | reti |
21 | .org OVF0addr ; Overflow0 Interrupt Vector Address |
22 | reti |
23 | .org SPIaddr ; SPI Interrupt Vector Address |
24 | reti |
25 | .org URXCaddr ; USART Receive Complete Interrupt Vector Address |
26 | reti |
27 | .org UDREaddr ; USART Data Register Empty Interrupt Vector Address |
28 | reti |
29 | .org UTXCaddr ; USART Transmit Complete Interrupt Vector Address |
30 | reti |
31 | .org ADCCaddr ; ADC Interrupt Vector Address |
32 | reti |
33 | .org ERDYaddr ; EEPROM Interrupt Vector Address |
34 | reti |
35 | .org ACIaddr ; Analog Comparator Interrupt Vector Address |
36 | reti |
37 | .org TWIaddr ; Irq. vector address for Two-Wire Interface |
38 | reti |
39 | .org SPMaddr ; SPM complete Interrupt Vector Address |
40 | reti |
41 | .org SPMRaddr ; SPM complete Interrupt Vector Address |
42 | reti |
43 | |
44 | .org INT_VECTORS_SIZE |
45 | RESET: ; hier beginnt das Hauptprogramm |
Für die Lage des Vektoren gibt es Konstanten! Benutze sie. Den Rest hab ich (noch) nicht durchgesehen.
Hi Der Atmega hat 2 Word pro Eintrag in der Sprungtabelle (passend für 'jmp Label'). Die Adressen stehen im Datenblatt. Noch leichter ist es, wenn du '.org INT0addr' bzw '.org INT1addr' schreibst. Dann setzt der Assembler die richtigen Werte aus der m16def.inc ein. Übrigens ist Drehencoder+Interrupt eine dumme Idee. MfG Spess
Philipp Bigott schrieb: > interruptvektoren und dann eine interruptrutine. Bei der simulation > springt e_int1 immer in die interruprutine mitten rein (0x004) wenn ich > die .org direktive nehme und 0x004 vor e_int1 schreibe, springt er > dahin. Ist das nurmal Ja das ist normal. Bei solchen Fällen ist das Datenblatt dein bester Ratgeber. Da gibt es eine wunderbare Tabelle mit den Einsprungadresse aller Vektoren. Aber wie gesagt: wenn du die Konstanten in Textform benutzt, musst du die Adressen zahlenmässig ja gar nicht wissen und kannst daher da gar keinen Fehler machen. > und macht der echte AtMega das auch so? Ja > bug? Ja, bug bei dir. Du hast nicht ins Datenblatt gesehen, sondern etwas angenommen. > Normal sollte der doch nach 0x002 springen, nein, sollte er nicht. interrupt 0 $002 interrupt 1 $004 die 4 stimmen, aber deine 1 für int 0 stimmen nicht :-)
Danke so Klappt es jetzt auch auf dem Controller. (war noch ein kleiner fehler bei int0) Und der Code ist ohne die Zahlenwerte echt "clean". Ich habe im Tut jedoch gerade bemerkt, dass die dortige Liste keinen vermerk ala gilt nur für mega8 o.ä. hat. Der Blick ins datenblatt hätte mich auch sicher schlauer machen können. Philipp
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.