Czy jakiś obeznany bywalec mógłby wytknąć mi błędy w tym kodzie i pomóc go "naprostować":
Kod: Zaznacz cały
.include "tn13adef.inc"
.cseg
.org 0
rjmp Init
.org 2
rjmp PCINT
.org 10
Init:
cli
ldi r16,ramend
out spl,r16 ;konf. stosu
ldi r16,32
out GIMSK,r16
ldi r16,1
out PCMSK,r16 ;włączenie PCINT0
sbi ddrb,pb3
sbi ddrb,pb4
ldi r20,$40 ;Rejestr pomocniczy - kontrola liczby odebranych bitów st2,ctrl,addr[4:0]
ldi r21,$20 ;Rejestr pomocniczy - kontrola liczby odebranych bitów com[5:0]
sei
oczekuj:
cpi r21,0 ;jeżeli odebrano wszystkie bity
breq dane ;skok do dane
brts odbior ;jeżeli zaszło przerwanie (Zmaian stanu na porcie - wykrycie zbocza w ;czasie trwania bitu) to skocz do odbior
rjmp oczekuj
odbior:
clt ;zeruj T
ldi r16,0
out GIMSK,r16 ;Wyłącz PCINT
rcall delay3_4_T ;Odczekaj 3/4 czasu trwania bitu
cpi r20,0 ;Jeżeli pierwsze 7 bitów odebrane
breq odbior2 ;skok do odbior2
sbis pinb,pb0 ;jeżeli bit=1 (zero na lini):
add r26,r20 ;Ustaw ten bit w R26
lsr r20 ;przesunięcie bitowe w prawo R20
ldi r16,32
out GIMSK,r16 ;Włącz PCINT
rjmp oczekuj ;skok do oczekuj
odbior2:
sbis pinb,pb0 ;jeżeli bit=1 (stan niski na lini):
add r27,r21 ;Ustaw ten bit w R27
lsr r21 ;przesunięcie bitowe w prawo R21
ldi r16,32
out GIMSK,r16 ;Włącz PCINT
rjmp oczekuj ;skok do oczekuj
dane:
ldi r20,$40
ldi r21,$20
cpi r27,1 ;jeżeli Komenda=1
breq change ;skok do change
clr r26 ;w przeciwnym razie zeruj rejestr adresu i komendy
clr r27
rjmp oczekuj ;Oczekuj na wiadomość
change: ;Zmień stan na pb4 za każdym razem gdy Komenda=1
in r16,portb
sbrc r16,4
cbi portb,pb4
sbrs r16,4
sbi portb,pb4
clr r26
clr r27
rjmp Oczekuj
PCINT: ;Obsługa Przerwania PCINT
set ;Ustaw flagę T
reti ;powrót z przerwania
delay3_4_T: ;Procedura opóźniająca - 1.8ms*3/4
inc r24
cpi r24,31
brne delay3_4_T
clr r24
inc r25
cpi r25,100
brne delay3_4_T
clr r25
ret