attiny25 Interrupt

Gast #1160391
Lesenswert?

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
Gast #1160583
Lesenswert?

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?
Gast #1160593
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren