Hallo Kann mir jemand sagen warum im folgenden Testprogramm der Rücksprung aus der Interruptroutine wieder zu RJMP loop und nicht zu dem darauf folgenden NOP erfolgt. reset: rjmp start reti rjmp intr ; Addr $02 reti ; Addr $03 reti ; Addr $04 reti ; Addr $05 reti ; Addr $06 reti ; Addr $07 reti ; Addr $08 reti ; Addr $09 reti ; Addr $0A reti ; Addr $0B reti ; Addr $0C reti ; Addr $0D reti ; Addr $0E start: ldi r16,$69 ;stackstart out $3d,r16 ldi r16,0b00111111 ;pulup on out $18,r16 ldi r16,0b00111110 ;pb0 eingang out $17,r16 ldi r16,0b00100000 ;gimsk pcint ein interrupt out $3b,r16 ldi r16,0b00000001 ;pcint maskenregister out $15,r16 sei loop: rjmp 1oop nop nop intr: reti
Warum sollte auch aus der Entlosschleife denn rausspringen, der interrupt ändert doch nicht an der schleife? Es wird NIE bei dem NOP vorbeikommen.
Zu dem nop kann er nicht kommen, weil der PC beim Auftreten eines Interrupts immer auf loop zeigt.
Da die beiden "nop"s bei diesem Programm niemals ausgeführt werden, kann
dort auch kein Interrupt auftreten.
>out $18,r16
Hat es einen bestimmten Grund, warum Du I/O-Register mit Hexwerten
("$18") ansprichst, statt mit ihren Namen?
Wenn während des Befehls rjmp loop der Interrupt eintritt, wird der Befehl nicht nur gelesen, sondern auch AUSGEFÜHRT. Der PC wird also auf die Adresse von "loop" gestellt, dann dieser Wert auf dem Stack abgelegt und zu "intr" gesprungen. Das "reti" holt dann die Adresse von "loop" wieder vom Stack, schreibt sie in den PC und da gehts dann weiter.
Beim Z80 gabs den HALT Befehl. Da hat die CPU nach dem Interrupt mit dem Befahl nach HALT weitergemacht. Vielleicht ist das Dein Missverständnis?
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.