logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATTiny13A[ASM] RC5 - Dekodowanie

RMB13 01 Lip 2011 21:42 2112 5
REKLAMA
  • #1 9671187
    RMB13
    Poziom 10  
    Witam!
    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 :cry: . 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
  • REKLAMA
  • Pomocny post
    #2 9672201
    LordBlick
    VIP Zasłużony dla elektroda
    Dlaczego nie Timer ? Obsługa przerwania TIMER0_OVR w niczym nie przeszkadza w działaniu PWM, a mamy w ten sposób jakąś podstawę czasu, który można sobie odliczać w tym przerwaniu.
    Dokładność co do 3 miejsc po przecinku nie jest taka istotna przy dekodowaniu RC5...
    Co do kodu - to nie ma prawa tak działać, obsługa przerwania powinna być jak najkrótsza, a gross problemu powinien być rozwiązany w pętli głównej (można nawet usypiać pomiędzy przerwaniami, gdy "nie ma roboty").
    Nie ma sensu wyłączać przerwanie i włączać ponownie, bo to załatwia sprzętowo sama obsługa przerwania wyłączając bit I w SREG przed wejściem w przerwanie i włączając go po wyjściu z przerwania.
  • REKLAMA
  • #3 9672425
    RMB13
    Poziom 10  
    No dobrze, ale nawet gdy zaprzęgnę TIMER0_OVF do roboty to chyba aż tak dużo nie zmieni... Sory za lamerstwo, ale co masz na myśli mówiąc "gross problemu"?.
  • REKLAMA
  • Pomocny post
    #4 9672719
    nsvinc
    Poziom 35  
    Chodzi o to, że przerwanie powinno tylko być małym produktorem (lub konsumentem) informacji, i popychać/czytac te informacje z/do jakiegoś bufora (kołowego lub nie), a interpretacja/składanie danych z bufora powinna byc w petli głównej. Doszczętne przetwarzanie danych w samym przerwaniu to śmierć kliniczna procesora. Mam rozne kody do obsługi różnych rzeczy, które są napisane w całości wokół przerwania (obsluga HD44780, 1wire, rc5, tx wiegand-a,rozne interpretery mikrokodów) i to raczy działać szybko. Ale jak bierzesz się za tego typu rozwiązanie koniecznie trzeba conajmniej oszacować użycie procesora na obsługę takiego przerwania...

    Kod: text
    Zaloguj się, aby zobaczyć kod

    To jest obsługa popychania bitów w formacie wiegand, autonomiczna i napisana wyłącznie wokół przerwania. Konsumuje informacje z gotowego już bufora wij.bitz.
    W pętli głównej jest przygotowywany ten bufor, i jak dane w nim są gotowe do tx, aktywuje się powyższa maszynka.
    Wyobraź sobie teraz, jak czułby się procek, jakby ten kod
    Kod: text
    Zaloguj się, aby zobaczyć kod

    przygotowujący bufor z bitami do wysylki (dla pierwszego kodu) był w tym przerwaniu? Zajezdziłbym procka do cna ;]

    Widzisz już ideologię?
  • REKLAMA
  • #5 9672845
    RMB13
    Poziom 10  
    No ok, chyba zrozumiałem wasze przesłanie panowie :D, spróbuje coś sklecić na tej podstawie. Dzięki za zainteresowanie

    <Edit>
    Skróciłem procedurę przerwania do maksymalnego minimum ;p
    Napisałem wszystko od początku i zanim sprawdzę czy działa, proszę by ktoś, kto się zna na rzeczy (jam jest początkujący ;p) sprawdził czy to jest poprawne:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Tu skleciłem w paincie szkic obrazujący idee jaką się kierowałem przy pisaniu:
    ATTiny13A[ASM] RC5 - Dekodowanie

    Proszę byście wytknęli mi ewentualne błędy i sprowadzili na dobrą drogę w przypadku problemów ;D

    Z góry dziękuję ;D
  • #6 9676570
    RMB13
    Poziom 10  
    Dobra, problem rozwiązany :D Działa :p
    Między linijki 'Ldi R16,32' I 'Out GIMSK,R16' Trzeba podopisywać 'Out GIFR,R16'
    Problem z powyższym kodem polegał na tym że Komendę otrzymuje w stanie zanegowanym,
    i aby układ reagował na określony klawisz to trzeba porównać R27 z (63-Kod klawisza).

    Rozwiązane. Zamykam Temat. Dziękuje panowie za pomoc :D
REKLAMA