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.

DSM-51, Zegarek, przygaszony wyśwetlacz.

Sunwet 19 Sty 2015 20:15 621 6
  • #1 19 Sty 2015 20:15
    Sunwet
    Poziom 2  

    Używając assemblera i dsm-51 napisałem program imitujący zegarek. Mam jednak problem, ponieważ działający już zegarek ma przygaszony ekran (chodzi mi oczywiście o wyświetlacz 7-segmentowy).
    Świeci tak jakby o połowę słabiej niż programy kolegów.
    Nie bardzo wiem w czym może leżeć problem.
    Czy ktoś jest w stanie powiedzieć mi, co potencjalnie mógłbym sprawdzić, bez wglądu w mój kod? Czy istnieje jakiś porażający błąd, który mógłbym popełnić, a jest oczywisty?

    0 6
  • #3 19 Sty 2015 21:03
    Sunwet
    Poziom 2  

    Start:
    -nadawanie wartości stałym i bitom
    -zezwolenie na przerwania itp. (timer pierwszy ustawiony na odliczanie 1ms)

    Loop:

    -czy było przerwanie? jeśli nie, skacz do Main_loop
    jeśli było przerwanie:
    -zapomnij o przerwaniu
    zliczam 1000, przerwań (4 x po 250) w celu uzyskania 1s
    jezeli wciaz nie ma 1000, jump -> Main_loop, jeżeli jest już 1000
    skaczę do etykiety, gdzie inkrementuję sekundy, minuty itp.


    Main_Loop:

    -gaszę wyświetlacz
    - tutaj obywa się wysyłanie maski bitowej do wyświetlacza 7 segmentowego
    - sprawdzam czy zostal wcisniety jakis klawisz
    - sprawdzam czy maska bitowa nie weszla na ACC.7, jeżeli nie to pobieram wzorek do wyświetlenia i wyświetlam go na wyświetlaczu, potem jump na Loop
    -jeżeli tak, to ponownie ustawiam maskę bitową na pierwszy wyświetlacz, porównuję stan klawiatury i w razie czego przechodzę do obsługi klawiszy

    0
  • #4 20 Sty 2015 15:24
    WRadek
    Poziom 21  

    Hmmm, dawno nie siedziałem przy DSM-51, ale czy nie za często gasisz wyświtelacz?

    w pseudo-kodzie:
    trzeba rozumieć, że jak nie ma tysiąca, to nastepuje powrót z podprogramu obsługi przerwania, a nie skok na poczatek main_loop? Tak?

    Czy potrzebujesz gasić wyświetlacz jak wysyłasz na niego dane?

    1
  • #5 20 Sty 2015 15:39
    Sunwet
    Poziom 2  

    Tzn. w podprogramie przerwania mam jedynie reinicjalizacje timera do jego pożądanej wartości i ustawienie flagi przerwania, po czym wychodzę z przerwania.

    w petli "Loop" srawdzam na początku, czy przerwanie było, jeżeli nie to skaczę do pętli obsługi wyświetlaczy, a jeżeli było, to zliczam je licznikami, sprawdzam czy to już 1000, jeśli nie to również wracam do pętli wyświetlaczy

    jeżeli jednak jest to już 1000 przerwanie, skaczę do etykiety inkrementującej sekundy i w razie potrzeby minuty i godziny

    EDIT:

    zmieniłem ułożenie pętli, idąc za algorytmem pdf'u od ćwiczeniowca:

    LOOP:
    -czekaj na przerwanie:

    było przerwanie?
    -TAK: obsłuż wyświetlacze -> policz przerwania -> jeśli 1s to inkrementuj.
    -NIE: czekaj na przerwanie

    0
  • #6 21 Sty 2015 20:20
    Sunwet
    Poziom 2  

    Niestety, chyba mam błędny tok rozumowania, wyświetlanie było jeszcze słabsze

    0
  • #7 21 Sty 2015 20:48
    WRadek
    Poziom 21  

    Czyli jednak wygląda, że za często gasisz wyświetlacz. :)
    Ja bym zrobił tak:
    LOOP:
    -czekaj na przerwanie:

    było przerwanie?
    -TAK: policz przerwania -> jeśli 1s to inkrementuj - > obsłuż wyświetlacze
    -NIE: czekaj na przerwanie

    A nie możesz dokładniej opisać algorytmu? Chętnie się też pouczę, to może coś wymyślimy razem.

    0