Witam!
Napisałem na szybko taki oto kod:
Procek chodzi na wewnętrznym 9.6 MHz. TSOP31236 Podłączony do PB0 (Wykrywanie startu przez PCINT (Zmianę stanu)).
Po odebraniu kodu 1 na pinie pb4 miałby zostać ustawiony stan wysoki do następnego naciśnięcia (wyłączenie poprzez naciśnięcie dowolnego innego przycisku). Niestety to co tu nabazgrałem nie działa
. Proszę o wytłumaczenie co robię źle i co robić żeby było dobrze ;p . Jednocześnie proszę o nie podawanie rozwiązań opartych o Timer i/lub INT0 bo te będą niestety w tym projekcie dla RC5 niedostępne (Pin Int0 jest jednocześnie jednym z dwóch dostępnych/w projekcie potrzebnych kanałów PWM).
Tak, wiem że temat był poruszany wielokrotnie, ale proszę o nieodsyłanie mnie z kwitkiem do innych tematów - wszystko o RC5 na 5 pierwszych stronach Google'a mam obejrzane i nie rozumiem dlaczego tak prosty kod nie chce działać.
Proszę o pomoc.
RMB13
Napisałem na szybko taki oto kod:
;Cała Ramka w R26:R27
.include "tn13adef.inc"
.cseg
.org 0
rjmp Init
.org 2
rjmp PCINT
.org 10
Init:
cli
ldi r16,ramend
out spl,r16 ;Stos
ldi r16,32
out GIMSK,r16
ldi r16,1
out PCMSK,r16 ;Ustawienie Przerwania PCINT0
sbi ddrb,pb2
sbi ddrb,pb1
sbi portb,pb2
cbi portb,pb1
sei
Main: ;Pętla główna
rjmp Main
PCINT: ;Przerwanie PCINT0
ldi r16,0
out GIMSK,r16 ;Wyłącz przerwanie PCINT
ldi r20,$80
nop
sbis pinb,pb0
add r26,r20 ;Jeżeli stan niski na pb0 to ustaw bit w r26
lsr r20
Rec_1:
rcall Op_1778us ;Opóźnienie ~1.778ms (~1779.06us wg AVR Studio)
sbis pinb,pb0
add r26,r20 ;jeżeli stan niski na pb0 to ustaw bit w rejestrze r26(operacja na całym rejestrze)
lsr r20
cpi r20,0
brne Rec_1 ;jeżeli jeszcze nie wszystkie bity sprawdzone to skok do Rec_1
ldi r20,$20
Rec_2:
rcall Op_1778us ;Opóźnienie ~1.778ms
sbis pinb,pb0
add r27,r20 ;jeżeli stan niski na pb0 to ustaw bit w rejestrze r27 (operacja na R26[5:0])
lsr r20
cpi r20,0
brne Rec_2 ;jeżeli jeszcze nie wszystkie bity sprawdzone to skok do Rec_2
rjmp Dane
Dane:
cbi portb,pb4 ;Zeruj pb4
cpi r27,1
breq ustaw ;jeżeli Komenda=1 to skok do ustaw
rcall Op_889us ;Opóźnienie 0.889ms (dla powrotu stanu wysokiego na lini)
ldi r16,32
out GIMSK,r16 ;włącze przerwanie PCINT
reti ;wróć z przerwania
ustaw:
sbi portb,pb4 ;Ustaw pb4
rcall Op_889us ;Opóźnienie 0.889ms (dla powrotu stanu wysokiego na lini)
ldi r16,32
out GIMSK,r16 ;Włącz PCINT
reti
Op_1778us: ;Opóźnienie ~1.778ms(~1779.06us wg AVR Studio)
inc r24
cpi r24,44
brne Op_1778us
clr r24
inc r25
cpi r25,100
brne Op_1778us
clr r25
ret
Op_889us: ;opóźnienie ~0.889ms(~889.9us wg AVR Studio)
inc r24
cpi r24,21
brne Op_889us
clr r24
inc r25
cpi r25,98
brne Op_889us
clr r25
ret
Procek chodzi na wewnętrznym 9.6 MHz. TSOP31236 Podłączony do PB0 (Wykrywanie startu przez PCINT (Zmianę stanu)).
Po odebraniu kodu 1 na pinie pb4 miałby zostać ustawiony stan wysoki do następnego naciśnięcia (wyłączenie poprzez naciśnięcie dowolnego innego przycisku). Niestety to co tu nabazgrałem nie działa
Tak, wiem że temat był poruszany wielokrotnie, ale proszę o nieodsyłanie mnie z kwitkiem do innych tematów - wszystko o RC5 na 5 pierwszych stronach Google'a mam obejrzane i nie rozumiem dlaczego tak prosty kod nie chce działać.
Proszę o pomoc.
RMB13