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

Problem z prostym zadaniem MDS 51

02 Lis 2009 14:08 1145 5
  • Poziom 9  
    Cześć!

    Mam zrobić program który wyświetla na wyświetlaczu LED pokoleji cyfry w ten sposób (1234). Moje umiejętności są za małe i program który zrobiłem wyświetla tylko cztery jedynki. Kiedy próbuje zmienić stan diod na poszczególnym wyświetlaczu zmieniają mi się wszystkie pozostałe. Nie wiem czy brakuje mi opużnień czy dodatkowych pętli.
    Oto program:

    org 0000h

    loop:
    setb p1.0
    setb p1.1
    mov a,#00000110b
    mov dptr,#1000000000011000b
    movx @dptr,a

    clr p1.1
    mov a,#01000110b
    mov dptr,#1000000000011000b
    movx @dptr,a

    setb p1.1
    clr p1.0
    mov a,#00000110b
    mov dptr,#1000000000011000b
    movx @dptr,a

    clr p1.1
    mov a,#01100110b
    mov dptr,#1000000000011000b
    movx @dptr,a

    sjmp loop
    end


    a tu link do schematu: http://img40.imageshack.us/img40/2015/schematv.jpg

    Proszę o pomoc.
  • Pomocny dla użytkowników
    A co wysyłasz do portu sterującego segmentami wyświetlacza, bo coś te kody ładowane do akumulatora są jakieś dziwne ??

    Sądząc z układu wyświetlanie cyfr odbywa się kolejno (multipleksowanie).
    Aby wyświetlacz nie migotał pełna sekwencja 4 cyfr musi być powtarzana nie rzadziej niż co 20 ms (50 razy na sekundę) czyli każda cyfra powinna być wyświetlana 5ms

    Czyli ogólnie:

    loop:
    Wysyłasz_1 cyfrę na pierwszy wyświetlacz,
    Odmierzasz 5ms
    Wysyłasz_2 cyfrę na drugi wyświetlacz,
    Odmierzasz 5ms
    Wysyłasz_3 cyfrę na trzeci wyświetlacz,
    Odmierzasz 5ms
    Wysyłasz_4 cyfrę na czwarty wyświetlacz,
    Odmierzasz 5ms
    sjmp loop

    To jest najprostsza realizacja jednak powodująca, że procesor na nic innego niż obsługę wyświetlacza i odmierzanie opóźnienia nie ma czasu.

    Odmierzanie_5ms najlepiej zrobić w podprogramie i tylko wywoływać przez lcall, zamiast powtarzać tę samą sekwencję rozkazów za każdym razem.


    Zwykle taką obsługę wyświetlaczy realizuje się w przerwaniach np. od timera wewnętrznego lub przez generowane zewnętrznym generatorem przerwanie INTx

    Przerwania muszą występować co 5ms (lub częściej ale nie za często, by procesor miał czas na inne zajęcia) i co przerwanie wysyłasz 1 cyfrę na wyświetlacz (kolejny). Dzięki temu w czasie pomiędzy obsługą przerwań procesor ma możliwość wykonywania innych czynności (obsługa klawiatury, obliczenia, itp)

    A propos, na schemacie tego modułu mikroprocesorowego jest błąd schematowy, tranzystory T0, T1, T2 i T3 powinny być typu PNP (ktoś pokręcił), bo one są włączane stanem niskim z dekodera LS145 i podają + zasilania na anodę odpowiedniego wyświetlacza.

    Aby dany segment świecił musisz ustawić 1 i wysłać ją do rejestru LS574 sterującego układem ULN2803 (wzmacniaczem sterującym segmentami).
  • Poziom 9  
    Czyli jak zrobiłam pętle opóźniającą (256*256 pętli) i wstawię ją to przed każdym zapaleniem poszczególnych segmentów (lcall petla:) to powinno zadziałać. Rzeczywiście te liczby do akumulatora są powpisywane w cały świat,ale to już sobie poprawie. Najgorsze,że nie mam symulatora dobrego.
    A takie schematy to dają na polibudzie niestety...
  • Pomocny dla użytkowników
    mloodzian007 napisał:
    Czyli jak zrobiłam pętle opóźniającą (256*256 pętli) i wstawię ją to przed każdym zapaleniem poszczególnych segmentów (lcall petla:) to powinno zadziałać. Rzeczywiście te liczby do akumulatora są powpisywane w cały świat,ale to już sobie poprawie. Najgorsze,że nie mam symulatora dobrego.
    A takie schematy to dają na polibudzie niestety...


    Daj je raczej po zapaleniu danego wyświetlacza, by oko miało szansę zobaczyć daną cyfrę.
  • Poziom 9  
    dzięki już wszystko działa :)