Hallo!
Ich habe mir mal folgenden code eingetippt um ein bischen mit den
Interrupts rumzuspielen (ist noch neuland für mich):
___________________________________________________________________
.include "m16def.inc"
.def temp1 = r16
.CSEG
.ORG 0000
rjmp Main ; Zum Maincode Springen
reti ; INT0
reti ; INT1
reti ; Timer1 CAPT
reti ; Timer1 COMPA
reti ; TIMER1 COMPB
reti ; TIMER1 COMP1
reti ; TIMER1 OVF
reti ; TIMER0 OVF
reti ; SPI STC
reti ; UART RX
reti ; UART UDRE
reti ; UART TX
reti ; ANA_COMP
Main:
ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten
RAM-Adresse
out SPL, temp1
ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten
RAM-Adresse
out SPH, temp1
ldi temp1, 0x00
out DDRD, temp1
sei
___________________________________________________________________
Wenn ich nun im AVR simulator den Int0 aktiviere und das Programm
durchlaufe springt er immer an die stelle, die laut meiner kommentare
eigentlich Int1 ist.
Wenn ich im simulator INT1 aktiviere springt er zu TIMER1 COMPA.
Der Int2 springt direkt auf Reset.
Aber laut datenblatt ist doch die reset adresse 0000 -0002, int0
0003-0004 etc...
Was stimmt da bei mir nicht?
Ist es überhaupt richtig das ich 13 mal reti schreibe, wenn ich den
jeweiligen Vector nicht benutze?
Hm, M16 ist eigentlich was ganz anderes (Renesas), deshalb wohl noch keine Antworten hier :-) Aber du wirst wohl den Mega16 meinen. Aufgrund der Flash-Grösse sind die Int-Vektoren im Doppelword-Abstand angeordnet, um keine Sprungverlängerung einbauen zu müssen, wenn das Sprungziel zu weit weg ist, also ljmp (2 word) statt rjmp (1 word) eingesetzt werden muss. Reti hat jedoch nur nur 1 word. entweder definierst du jeden benötigten Interrupt mit .org: .org 0 jmp reset .org 2 //ExInt0 reti .. Besser jedoch: .org 0 jmp reset jmp ex0_int jmp ex1_int . . . Und dann: ex0_int: reti ex1_int: reti . . . alle nicht benötigten Ints können auch auf die gleiche Sprungmarke gehen: ex0_int: ex1_int: t2_comp_int: . . spm_rdy_int: reti Gibt noch weitere Möglichkeiten: jmp main reti //ex0_int reti //dummy-Befehl reti //ex1_int reti //dummy-Befehl . . . Oder auch ganz weglassen geht, da nicht freigeschaltete Ints nie angesprungen werden.
noch besser man benuzt die Symbolischen Namen aus der Definitionsdatei: .org INT0addr jmp XYZ z.B. Hat den Vorteil wenn man den Code mal migriert und dort die Adressen anders sind hat man keine Probleme, und es geht nicht immer das gerate los: Hat er jezt die richtige Adresse in der Sprungtabelle...
OK, danke! Das hat jetz schonmal gut geklappt... werds wohl in Zukunft immer mit den Symbolischen Namen machen. gibts da eigentlich eine Liste in der alle drinstehen? Habe jetz jedoch noch ein kleines Problem. Habe mein Programm noch ein wenig erweitert, und will unabhängig von irgeneinem Interrupt erstmal 0 auf einem Display ausgeben. Jedoch bekomme ich statt 0 einfach nur zwei senkrechte striche nebeneinander auf dem Display. Ich mache es mit "ldi temp, '0'" was doch eigentlich gehen müsste, habe aber auch schon "ldi temp, 0x30" versucht, und ging auch nicht. Ich habe den code mal angehängt.
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.