Potrzebuje dwa przyciski i postanowilem wykorzystać w tym celu przerwania zewnętrzne int0 i int1. Napisalem programik ale chyba coś poplątałem bo zwarcie do masy (przez przycisk) portu int0 nie powoduje uruchmienia podprogramu przerwania. Program wygląda następująco, jeśli ktoś ma chwilkę to proszę o podpowiedzenie czy procedura obsługi int0 jest poprawna. Do portu int0 mam dołączony przycisk a ten z kolei do masy. W podprogramie obsługi przerwania jest gaszenie i zapalanie diody.
.INCLUDE "M8DEF.INC"
.CSEG
.org INT0addr
rjmp klawiatura
.ORG $000
rjmp reset
reset:
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16
;sbi ddrd,ddd0 ;tryb wyjsciowy pd0 stan wysoki
;cbi portd,portd0
;sbi pind,pind0
;cbi ddrd,ddd2
;cbi portd,pd2
;ldi r16, 0b11111111
;out ddrd, r16
;ldi r16, 0b11111111
;out portd, r16
;ldi r16,
sbi portd,2
cbi ddrd,2 ;pd2 jako wejsciowy z podlaczonym podciaganiem
sbi portd,2
in r16,mcucr
cbr r16,1<<isc00
cbr r16,1<<isc11
out mcucr,r16 ; przerwanie int0 dowolnym zboczem
ldi r16,1<<intf0
out gifr, r16 ; zeruj znacznik żądania przerwania int0
in r16,gicr
sbr r16,1<<int0
out gicr,r16 ;włącz przerwanie int0
sei
skok:
rjmp skok
klawiatura:
petla:
ldi r16, 0b11111111
out ddrb, r16
wmiejscu:
ldi r16, 0b10101010
out portb, r16
rcall podprogram1
ldi r16, 0b01010101
out portb, r16
rcall podprogram1
rjmp wmiejscu
;__________________
podprogram1:
ldi r18,255
petla1:
ldi r17,255
petla2:
dec r18
cpi r18,0
brne petla2
ldi r18,255
dec r17
cpi r17,0
brne petla2
ret
.INCLUDE "M8DEF.INC"
.CSEG
.org INT0addr
rjmp klawiatura
.ORG $000
rjmp reset
reset:
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16
;sbi ddrd,ddd0 ;tryb wyjsciowy pd0 stan wysoki
;cbi portd,portd0
;sbi pind,pind0
;cbi ddrd,ddd2
;cbi portd,pd2
;ldi r16, 0b11111111
;out ddrd, r16
;ldi r16, 0b11111111
;out portd, r16
;ldi r16,
sbi portd,2
cbi ddrd,2 ;pd2 jako wejsciowy z podlaczonym podciaganiem
sbi portd,2
in r16,mcucr
cbr r16,1<<isc00
cbr r16,1<<isc11
out mcucr,r16 ; przerwanie int0 dowolnym zboczem
ldi r16,1<<intf0
out gifr, r16 ; zeruj znacznik żądania przerwania int0
in r16,gicr
sbr r16,1<<int0
out gicr,r16 ;włącz przerwanie int0
sei
skok:
rjmp skok
klawiatura:
petla:
ldi r16, 0b11111111
out ddrb, r16
wmiejscu:
ldi r16, 0b10101010
out portb, r16
rcall podprogram1
ldi r16, 0b01010101
out portb, r16
rcall podprogram1
rjmp wmiejscu
;__________________
podprogram1:
ldi r18,255
petla1:
ldi r17,255
petla2:
dec r18
cpi r18,0
brne petla2
ldi r18,255
dec r17
cpi r17,0
brne petla2
ret