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.

Edsim51 licznik hex, na wyświetlaczu LCD.

03 Wrz 2011 09:20 3998 11
  • Poziom 9  
    Witam,
    mam do zrobienia licznik hex z poczwórną precyzją _0000_, jak widać kod nie jest skończony szczerze mówiąc próbuje za pomocą prób i błędów.
    Problem tkwi w tym, że nie wiem jak zrobić żeby emulator edsim51 brał ciąg znaków jako jedną liczbę i przy okazji inkrementował w trybie 16. Proszę o pomoc w rozwiązaniu problemu.
    Pzdr.
    B.W


    Kod: asm
    Zaloguj się, aby zobaczyć kod
  • Poziom 34  
    Symulatora Edsim51 nie znam. Jednak, aby zrobić taki licznik trzeba się zastanowić co on ma liczyć. Mogą to być impulsy zewnętrzne, wciśnięcia klawisza, albo co innego (tzw. zdarzenia zewnętrzne). Można też zrobić licznik który zlicza coś tam autonomicznie np. inkrementuje wartość wyświetlaną na LCD co 1s.

    Inkrementowanie 16-bitowe:
    Załóżmy, że:
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Inkrementowanie LH:LL
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Potem wartość w LH:LL trzeba przetworzyć na cztery znaki ASCII, które to będą reprezentowały wartość 16-bitową w kodzie szesnastkowym. Taka konwersja jest akurat bardzo prosta.

    Załóżmy, że:
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Na początek zróbmy procedurę dodawania do A 48d dla A<10 i dodawanie 65 dla pozostałych przypadków:
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Właściwa konwersja:
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Teraz wystarczy po każdej inkrementacji wywołać to co powyżej i wyświetlić znaki w kolejności W3...W0. Obsługa LCD, opartego na HD44780 jest łatwa. Nie wiem jak ją się robi w tym środowisku. W sprawie obsługi fizycznego LCD mogę pomóc.
  • Poziom 9  
    Zgodnie z tablicą ASCII nadajemy poszczególnym zmiennym, wartości tak aby były inkrementowane od zera.

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Następnie przypisujemy zmienne odpowiednim adresom pamięci na wyświetlaczu LCD. Obok druga możliwość.
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Tylko nie wiem, jak tą pamięć przypisać do LCD bo skoro on już bierze od adresu 30H na wyświetlacz to takie wywołanie powoduje wypisanie na nim ciągu od 0...F, przydało by się przypisać aby to było, że 30H(W00)=36H...40H.

    Dalsza część kodu

    Kod: asm
    Zaloguj się, aby zobaczyć kod



    Tutaj jest Twój kod tak do końca nie wiem gdzie go wkomponować, żeby działał a próbowałem kilka miejsc ale efekt nie zadowalający. Aha zamieniłem liczby dziesiętne na hex bo te pierwsze coś inaczej oznaczone są pod tym emulatorem. Spróbuje jeszcze z rana bo nie myślę tak trzeźwo o tej porze.


    Kod: asm
    Zaloguj się, aby zobaczyć kod
  • Poziom 34  
    Zróbmy program w którym wyświetlana liczba na LCD (jako HEX) będzie inkrementowana co 1s. Do tego potrzebujemy Timer. Wykorzystamy T0 ze zgłaszaniem przerwania przy przepełnieniu.

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Wysyłanie 0 i x można zrobić przed pętlą główną. Coś mi się wydaje, że nie wiesz jak obsługiwać LCD.
  • Poziom 9  
    Niestety program, w nie których miejscach mi utyka. Poniżej błędne linijki:
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Pzdr
  • Poziom 34  
    Poprawiłem drobiazgi, o które czepiał się mój kompilator. U mnie zapis liczby hex nie może zaczynać się od "litery" tzn. zamiast AB trzeba zapisać 0AB.

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Jak rozwiązać takie problemy musisz już sam wiedzieć. Trzeba przeczytać jakąś dokumentację Edsim'a. Potem coś tam poszukam, jak znajdę czas.
  • Poziom 37  
    Ogółem widzę, że w wielu miejscach jest to trochę przekombinowane. Jutro podam może więcej szczegółów natomiast dziś radzę się zastanowić nad instrukcją SWAP oraz wykorzystaniem tablicy znaków 0-9 oraz A-F w kodzie ASCII oraz rejestru DPTR i instrukcji movc a,@a+dptr.
  • Pomocny post
    Poziom 37  
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Tu aż się prosi o procedurę wystawienia na P1.4-P1.7 danych do LCD z użyciem SWAP
    O ile jeszcze coś pamiętam można to zrobić tak...
    Do R0 zapisujemy kod znaku/rozkazu LCD, wywołujemy procedurę wysyłania do LCD, w niej kopiujemy R0 do A, robimy logiczny and z 0F0h, kopiujemy A do P1 i dopiero bawimy się clr/setb dla E i RS. Pół bajtu wysłane? To kopiujemy znowu R0 do A, dajemy SWAP i znowu and z 0F0h i kopiowanie do R0. Przy odrobinie chęci można to zoptymalizować i zmieścić w kilku linijkach kodu - a używać uniwersalnie do znaków, tekstów i rozkazów LCD. Nie trzeba robić wszędzie manualnie clr/setb do wszystkiego, ani tym bardziej
    Code:

    MOV C, ACC.7      
    MOV P1.7, C         
    MOV C, ACC.6      
    MOV P1.6, C         
    MOV C, ACC.5      
    MOV P1.5, C         
    MOV C, ACC.4      
    MOV P1.4, C   

    Tablicę znaków można zadeklarować jako
    tablica: .db 30h
    .db 31h
    .db 32h
    itd. aż do 39h, a później kolejne 6 znaków to 41-46h. Jeśli w A znajdzie się liczba od 0 do 15 (czyli pojedyncza cyfra 16 bitowa) to na podstawie jej wartości w A można przypisać jej wartość ASCII którą z kolei można będzie wysłać na wyświetlacz (właśnie movc a,@a+dptr gdzie wcześniej było mov dptr,#tablica). Nie chcę napisać za dużo, bo to ma być jakby nie było praca własna, ale myślę, że wskazówki o których pisałem mogą zadanie uprościć i może także nauczyć jak sobie w asm życie ułatwiać :)
  • Poziom 9  
    Dzięki za podpowiedzi, ale nie wiele z tego rozumiem. To tak jak z książką Stareckiego '8051 w praktyce' są przykłady ale nie zastosujesz ich w edsimie.

    Pzdr
  • Poziom 34  
    blazeyos napisał:
    Dzięki za podpowiedzi, ale nie wiele z tego rozumiem. To tak jak z książką Stareckiego '8051 w praktyce' są przykłady ale nie zastosujesz ich w edsimie.

    Pzdr


    Mocno przesadzasz. Edsim51 może nie jest najlepszy na świecie, ale z pewnością lepszy o niebo od np. Jagody. Poprawiłem Ci kod. Musi teraz działać w Edsimie, co zresztą sprawdzałem. Wykonałem symulację, wszystko działało poprawnie. Wklej to do Edsim'a i wykonaj obsługę LCD we właściwych miejscach i właściwy sposób.

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Większość przykładów z podanej książki da się zastosować w Edsimie, tylko trzeba do tego właściwie podejść. Dalej już powinieneś zrobić coś sam.
  • Poziom 9  
    Problem rozwiązano:
    Kod: asm
    Zaloguj się, aby zobaczyć kod