Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Program edsim 51- co jest nie tak

MaciejEej 31 Maj 2017 19:15 1032 2
  • #1 31 Maj 2017 19:15
    MaciejEej
    Poziom 4  

    Witam,
    Mam wykonać program który będzie sterował wyświetlaczem 7-segmentowym. Ma on wyświetlać liczby od 0 do 9 z zapętleniem a po naciśnięciu przycisku od 9 do 0 także z zapętleniem. Coś udało mi się wykombinować, jednak po próbie symulacji w edsimie 51 program nie działa prawidłowo. Oddzielne części programu od 0-9 czy też od 9-0 dobrze odliczają, więc pewnie jest problem z przyciskiem. Już nie mam pomysłu jak to zrobić. Z góry dzięki za pomoc :)

    Pozdrawiam,

    Program:

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    0 2
  • Pomocny post
    #2 01 Cze 2017 15:18
    krzysiek_krm
    Poziom 31  

    Witam,
    bardzo dawno nie używałem tego procesora ale coś tam jeszcze pamiętam.
    Po pierwsze.
    Wystarczy Ci tylko jedna pętla i jedna tablica "znaki".
    W rozkazie MOVC ... rejestr DPTR trzyma adres bazowy a akumulator przesunięcie. Możesz więc jednorazowo, na początku podstawić adres tablicy do DPTR a następnie "jeździć" po niej akumulatorem (przesunięciem) zarówno w lewo jak w prawo. Nie możesz oczywiście używać bezpośrednio akumulatora bo używasz go do innych rzeczy i przesunięcie zostałoby zamazane. Musisz więc to przesunięcie "trzymać" w jakimś wolnym rejestrze, który jednorazowo, na początku zerujesz (zerowe przesunięcie czyli początek tablicy "znaki").
    Potrzebny Ci jeszcze jednobitowy znacznik określający czy pętla kręci się od 0 do 9 czy odwrotnie, załóżmy, że jednorazowo, na początku go zerujesz, czyli od 0 do 9.
    Po drugie, pętla.
    Na początku przesyłasz rejestr przesunięcia do akumulatora, następnie MOVC ... i masz w akumulatorze odpowiedni znak z tablicy.
    Nie wiem po co negujesz oddzielnie każdy z ośmiu bitów P1, możesz jedną instrukcją zanegować cały akumulator.
    Nie wiem po co jest "clr P3.5", pewnie jakieś wymaganie sprzętowe, może powinna być sekwencja "setb P3.5" - "mov P1,A" - "clr P3.5", tak czy owak masz już odpowiedni znak w P1.
    Potem czekasz opóźnienie R0 / R1 / R2.
    Teraz sprawdzasz przycisk. Jeżeli opóźnienie R0 / R1 /R2 jest stosunkowo długie, nawet nie trzeba maskować drgań styków, wystarczy sprawdzić czy puszczony czy wciśnięty. Jeżeli wciśnięty, negujesz bit "kierunek", jeżeli puszczony nie negujesz, w obu przypadkach idziesz do sprawdzenia bitu kierunek.
    Potem sprawdzasz stan bitu "kierunek", jeżeli jest ustawiony, skaczesz do etykiety 9to0, pod spodem dla lepszej czytelności dajesz etykietę 0to9.
    etykieta 0to9:
    Porównujesz rejestr przesunięcia z liczbą "9" (ostatni element tablicy), jeżeli nie jest równy to go inkrementujesz (następny), jeżeli jest równy, podstawiasz do niego liczbę "0" (powrót do pierwszego). Zawijasz pętlę.
    etykieta 9to0:
    Porównujesz rejestr przesunięcia z liczbą "0" (pierwszy element tablicy), jeżeli nie jest równy to go dekrementujesz (poprzedni) jeżeli jest równy, podstawiasz do niego liczbę "9" (powrót do ostatniego). Zawijasz pętlę.

    To wszystko
    Pozdrawiam

    0
  • #3 05 Cze 2017 20:23
    MaciejEej
    Poziom 4  

    Bardzo dziękuję za odpowiedź, wiele mi to wyjaśniło. Rzeczywiście w programie wystarczyło zastosować negację bajtu akumulatora, a komenda "clr P3.5" jest raczej nie potrzebna. Miała by ona chyba zastosowanie przy załączeniu drugiego wyświetlacza.

    0