ATTiny13A[ASM] RC5 - Sprawdzenie programu

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Mrówa
-
Posty: 2
Rejestracja: 03 lip 2011, 10:03
Lokalizacja: Bdg

ATTiny13A[ASM] RC5 - Sprawdzenie programu

Post autor: Mrówa » 03 lip 2011, 10:28

Witam !
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 
Walczę już trochę z tym i nie chcę działać - ATTINY13A działa na wewnętrznym 9.6MHz.
Załączniki
RC5.png
Tu narysowałem sposób mojego myślenia podczas pisania kodu

keruseykaryu

Post autor: keruseykaryu » 03 lip 2011, 12:09

Mrówa pisze:Walczę już trochę z tym i nie chcę działać - ATTINY13A działa na wewnętrznym 9.6MHz.
Się nie popisałeś z opisem jak ma działać, co nie działa i jak to jest podłączone. Przydałoby się wiedzieć więcej.

Ale masz jeden błąd i to błąd myślowy. To że ty w programie wyłączysz PCIE i potem sobie delaya zrobisz to wcale nie będzie oznaczać, że PCIF się w tym czasie nie będzie zmieniać. PCINT działa w tle i po pierwszej próbce z PB0 już dostaniesz przerwanie z narastającego zbocza drugiego bitu, które się pojawiło w czasie delaya. I całe zależności czasowe szlag Ci trafia.
Przed włączeniem PCIE skasuj PCIF.
Załączniki
Bez tytułu.png

Mrówa
-
Posty: 2
Rejestracja: 03 lip 2011, 10:03
Lokalizacja: Bdg

Post autor: Mrówa » 03 lip 2011, 13:02

To są te moje zaległości:
*TSOP31236 Podłączony pod PB0
*Po odebraniu Komendy 1 Na PB4 ma się zmienić stan

Po Dodaniu Linijek 'Out GIFR,R16' Pomiędzy linijki 'Ldi R16,32' i 'Out GIMSK,R16'
Nadal miałem problem z uruchomieniem całości.
Układ działa gdy do linijki 'CPI R27,1' wpiszę 'CPI R27,63'
Nie wiem jakim cudem ale wartość KOMENDY w R27 mam zanegowaną (63-KOMENDA)

Ale układ działa (no czasami się zacina, ale dorobię watchdog'a) więc jak narazie problem rozwiązany. Dzięki wielkie keruseykaryu :D

ODPOWIEDZ