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

[EM78P153S/ASM] - Przesunięcie bitowe - dziwne zachowanie

maciej_333 20 Sty 2013 17:18 4050 6
REKLAMA
  • #1 11816278
    maciej_333
    Poziom 38  
    Dokumentacja mikrokontrolera EM78P153S znajduje się tutaj. Problem niby trywialny. Mam taki kod, realizowany w przerwaniu od timera:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    W1...W6 i W1_POM...W6_POM to zwykłe rejestry. Instrukcja rlc to teoretycznie zwykłe przesunięcie bitowe w lewo przez przeniesienie.

    W moim programie W1...W6 to wiersze wyświetlane na matrycy LED (wyświetlanie w pętli głównej). W1_POM...W6_POM to pomocniczy bufor potrzebny przy animacjach - przejścia. Wykonanie czegoś takiego powinno teoretycznie wpychać bity z bufora do W1...W6. Nie jest istotne, że na najmłodsze bity W1_POM...W6_POM wchodzą śmieci. W odpowiednim momencie wszystko inicjalizuję jeszcze raz. Multipleksowanie matrycy działa prawidłowo.

    Powinienem uzyskać efekt w którym jedna klatka się przesuwa i zastępuje ją inna. Problem w tym, że mimo poprawnej inicjalizacji wszystkiech zmiennych, dopiero po pięciu przesunięciach (mam matrycę 5x6) wchodzi klatka z bufora.

    O co tu chodzi ? Nie wydaje mi się, by problem leżał w innym miejscu. W liście instrukcji wyraźnie podano, że rlc R wykonuje: R(n) → R(n+1), R(7) → C, C → R(0). Typowe przesunięcie bitowe.
  • REKLAMA
  • #2 11816916
    BlueDraco
    Specjalista - Mikrokontrolery
    Co to znaczy "wchodzi klatka z bufora"?

    To, co napisałeś, powinno w każdym przejściu przesunąć W1..W6 o jeden bit w lewo, wsuwając po jednym bicie z W1_POM..W6_POM. Jeśli jest inaczej, to zapewne błąd leży w procedurze obsługi multipleksowanego wyświetlacza, co by mnie wcale nie zdziwiło - pokaż tę procedurę.
  • REKLAMA
  • #3 11817333
    maciej_333
    Poziom 38  
    Dziękuję za zaangażowanie, nie spodziewałem się odpowiedzi.

    BlueDraco napisał:
    ... To, co napisałeś, powinno w każdym przejściu przesunąć W1..W6 o jeden bit w lewo, wsuwając po jednym bicie z W1_POM..W6_POM. ...

    Tak, dokładnie tego bym oczekiwał.

    "wchodzi klatka z bufora" - pewien skrót myślowy. Chodzi o to, że aktualna klatka się przesuwa w lewo co pewien interwał. Równocześnie po prawej stronie "wchodzi klatka z bufora" tzn. pojawia się to, co mam w W1_POM...W6_POM. Może tam być identyczna klatka (tylko przewijanie), lub inna klatka (zmiana).

    Jeżeli nie ma przewijania - tzn. zwyczajnie przewanie wyłączone i do W1...W6 załadowane odpowiednie bajty, to wyświetlanie jest OK.

    Poniżej cała procedura wyświetlania:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Linie P50...P53 i P60...P61 to załączanie kolumny przez tranzystory PNP (anody). Natomiast P62...P67 to załączanie wiersza przez tranzystory NPN (katody). P63 może być tylko wejściem, więc jest pominięta.

    [EDIT]
    Chyba wiem w czym problem :D :D :D. Mam 5 kolumn, czyli tylko 5 bitów z każdego bajtu w tablicy jest wykorzystane (tablica to instrukcje retl k). Reszta to zera, które muszą być wepchnięte do W1...W6. To właśnie powoduje chyba częściowo to opóźnienie.

    Inne pytanie, to dlaczego coś takiego nie działało:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Kiedy PRZEWINIECIA=0, to zgodnie z listą rozkazów djz powinno przeskoczyć jmp.

    Musiałem to zastąpić tym:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    O dziwo to już działa prawidłowo w przerwaniu:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 11817521
    BlueDraco
    Specjalista - Mikrokontrolery
    Przecież ten uC ma timer - wyśietlanie w pętli z opóźnieniami to zbrodnia.

    Zweryfikuj też kod wyświetlania - powinieneś wyłączyć aktualnie świecącą wspólną elektrodę, potem ustawić nowe dane na tych ni-wspólnych, a potem załączyć nową wspólną - żadne dodatkowe opóźnienia na włączanie czy wyłączani tranzystorów nie powinny być wtedy potrzebne - ten procesor aż tak szybki nie jest.
  • REKLAMA
  • #5 11817905
    maciej_333
    Poziom 38  
    BlueDraco napisał:
    Przecież ten uC ma timer - wyśietlanie w pętli z opóźnieniami to zbrodnia.

    Tak mam TCC, ale wykorzystuję go do animacji. Właśnie w jego przerwaniu robię te wszystkie przesunięcia bitowe itd. Uznałem, że tak będzie prościej, jeżeli część funkcji wstawić w przerwanie, a resztę w pętli głównej. Kod wyświetlania jest skomplikowany, ale inaczej nie dało się tego podłączyć.

    Podpiąłem na przewodach EM78F661. Nie będę tracił jednego procka na jedno wgranie softu. Będę tylko potem musiał dopasować kod do EM78P153.
  • #6 11818190
    BlueDraco
    Specjalista - Mikrokontrolery
    I tam też wyświetlaj (w przerwaniu)! Inaczej nie da się tego zrobić dobrze - będziesz miał wibrujący wyświetlacz. W każdym przerwaniu wyświetlaj kolejny wiersz, a w co którymś - animuj.
REKLAMA