Coś nie bardzo wychodzi mi wywołanie przerwania INT0 po przepełnieniu Timera0.
Poniżej kod (usunąłem zbędną funkcję wyświetlającą, która działa poprawnie).
Program powinien:
- po restarcie wyświetlić korpkę (robi to poprawnie)
- po każdym przerwaniu wyświetlać kursor (i to nie działa bo nie ma przerwania).
Nie istotne jest że każde przerwanie ponownie wyświetla 9. To tylko przykład dla stwierdzenia, czy przerwanie działa czy nie.
Poniżej kod (usunąłem zbędną funkcję wyświetlającą, która działa poprawnie).
Program powinien:
- po restarcie wyświetlić korpkę (robi to poprawnie)
- po każdym przerwaniu wyświetlać kursor (i to nie działa bo nie ma przerwania).
Nie istotne jest że każde przerwanie ponownie wyświetla 9. To tylko przykład dla stwierdzenia, czy przerwanie działa czy nie.
.include "m8def.inc" ;ATMega8
.CSEG
.org $0000
rjmp Reset
.org INT0addr
rjmp przerwanie_Int0
Reset:
; ustaw stos na końcu pamięci RAM
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
;inicjuj timer 0
ldi r17, 1 << CS02
out TCCR0, r17
;włącz przerwania z timera 0
in r16, TIMSK
sbr r16, 1 << TOIE0
out TIMSK, r16
sei
ldi r16, 16 ;znak do wyświetlenia: kropka
rcall wyswietl_R16
loop:
;kręć się
rjmp loop
;-----------------------------------------------
przerwanie_Int0:
;wyświetl kursor
ldi r16, 9 ;znak do wyświetlenia: kursor
rcall wyswietl_R16
reti
;-----------------------
wyswietl_R16:
;wyswietla znak z R16
... tutaj obsługa wyświetlania (działa poprawnie)
ret