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

[atmega8a][assembler] - inicjalizacja wyświetlacza HD44780U

htfhere 16 Maj 2014 17:31 2211 15
  • #1 13606999
    htfhere
    Poziom 9  
    Witam, chciałbym zainicjalizować wyświetlacz LCD, pisząc program w asemblerze, na podstawie ogólnodostępnego schematu blokowego w internecie napisałem program, który niestety nie działa. Czy mógłby mi ktoś pomóc znaleźć błąd?(RS-> C0, E -> C1, RW -> GND, bity odpowiedzialne za wysyłanie danych są podłączone do portu D)

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #2 13607141
    mi14chal
    Poziom 28  
    Nigdzie nie ustawiasz portu jako wyjścia. W funkcji opóźnienie zmieniasz rejestry R16-R18 po czym jak wyjdziesz z funkcji wystawiasz wartości te na porty.
  • #3 13607359
    htfhere
    Poziom 9  
    mhm czyli dopisać wyjścia na porty + zmienić rejestry w opóźnieniu?

    Dodano po 12 [minuty]:

    Naniosłem poprawki i niestety dalej nie działa.
  • #4 13607573
    mi14chal
    Poziom 28  
    A gdzie te poprawki są?
  • #5 13607643
    zumek
    Poziom 39  
    Hmmm... A dlaczego tak "namiętnie i bez opamiętania", zapisujesz do PORTC wartość 'zero' :?:
  • #6 13607645
    htfhere
    Poziom 9  
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Jak by co, to schemat blokowy tego programu wygląda tak- Link
    (punkt trzeci, inicjalizacja wyświetlacza)

    Zumek: Daję wartość 0, ponieważ pin RS wyświetlacza jest podłączony do portu c, na schemacie blokowym jest napisane, że RS podczas inicjalizacji powinno mieć zero.
  • #7 13607739
    zumek
    Poziom 39  
    htfhere napisał:
    ...Zumek: Daję wartość 0, ponieważ pin RS wyświetlacza jest podłączony do portu c, na schemacie blokowym jest napisane, że RS podczas inicjalizacji powinno mieć zero.

    Ale do PORTC, masz też podpięty sygnał 'E', a ten zdecydowanie nie może być ciągle w stanie niskim :idea:
  • #8 13608159
    htfhere
    Poziom 9  
    ok, E przerzuciłem na portb (żeby łatwiej się pisało poprawki w kodzie):
    Kod: text
    Zaloguj się, aby zobaczyć kod


    iii...teraz podświetla nie tylko 1 linię prostokątów, ale także 3 górne piksele z prostokątów drugiej linii... czy to jest prawidłowo zainicjalizowany wyświetlacz? wydaje mi się, że nie.
  • #9 13609311
    htfhere
    Poziom 9  
    Czy nie ma na tej stronie nawet jednej osoby, która potrafi zainicjalizować ten niezwykle popularny wyświetlacz w assemblerze? Ok, mogę zapłacić za ten kod! Proszę się ze mną skontaktować na priv. ps. jeżeli nie zamknąłem tego tematu, to znaczy to, że nikt się jeszcze nie zgłosił
  • #10 13609328
    dondu
    Moderator na urlopie...
    Pokaż schemat Twojego układu, tylko dokładnie taki jak masz podłączony, bo jeżeli tak jak pod wskazanym linkiem, to nie dziwię się, że nie działa.
    A na marginesie: Nie możesz jednak przejść na język C?
  • #11 13609487
    mi14chal
    Poziom 28  
    Byłoby łatwiej analizować gdybyś każdą linijkę skomentował, a najlepiej skorzystał z makr i definicji wtedy kod będzie czytelniejszy.
  • #12 13611601
    2rs232
    Poziom 18  
    Kod: text
    Zaloguj się, aby zobaczyć kod
    "out" Zmienia stan wszystkich pinów na porcie B.

    Jeśli chcesz zmienić stan jednego pinu stosuj:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Wygodniej jest korzystać z makr np.:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Procedura inicjacji portów wyświetlacza
    Kod: text
    Zaloguj się, aby zobaczyć kod


    na początku programu wywołujesz:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #13 13611653
    excray
    Poziom 41  
    2rs232 napisał:
    .MACRO RS_LCD_SET //pin RS=1
    sbi PORT_RS_LCD,RS_LCD

    Wybaczcie moje marudzenie ale takie makro wymaga co najmniej dodatkowych dwóch "difajnów". Proponowane "ułatwienie" spowodowało że musimy zamiast 11 znaków wklikać 50 i na dodatek w czasie analizowania skakać po dokumencie aby zobaczyć co oznacza makro a później co oznaczają poszczególne definicje z makra. Ból głowy gwarantowany. Nie szybciej na początku dać np:
    #define RS_0 cbi PORTB,6
    albo nawet
    #define RS PORTB,6
    a później w kodzie operować:
    cbi RS
    sbi RS
    ? Moim zdaniem szybciej. I wygodniej. Tym bardziej że linią RS operujemy w kodzie DWA razy.
  • #14 13611685
    htfhere
    Poziom 9  
    Dziękuję za odzew, jednak jeśli chodzi o programowanie w assemblerze, to dopiero raczkuję i nie znam tematyki "makr"...czy nie da się tego zrobić w sposób, który prezentuję? Kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    pozdrawiam
  • #15 13612176
    LordBlick
    VIP Zasłużony dla elektroda
    excray napisał:
    Wybaczcie moje marudzenie ale takie makro wymaga co najmniej dodatkowych dwóch "difajnów". Proponowane "ułatwienie" spowodowało że musimy zamiast 11 znaków wklikać 50 i na dodatek w czasie analizowania skakać po dokumencie aby zobaczyć co oznacza makro a później co oznaczają poszczególne definicje z makra.
    Wszystko zalezy, z jakiego edytora korzystasz, wiele dobrych ma autouzupełnianie - po wpisaniu no 3 znaków pojawia się lista wyboru. Idea polega na tym, że kod ma być czytelny, a nie napisany w sposób, który spowoduje, że sam piszący po trzech dniach się nie połapie.
    @htfhere Od opóźnien to jest timer, kod nie powinien być blokujący - sprawdzamy, czy upłynął określony czas i jeśli nie - wracamy do pętli głównej, z ktorej wskoczymy następnym razem i znowu sprawdzimy czy minął odpowiedni czas. Ja to impementuję w ten sposób, że mam stos w pamięci z elementów czterobajtowych - 2 bajty na opóźnienie i dwa bajty na adres w który trzeba skoczyć po upłynięciu danego czasu. Licznik czasu jest zmniejszany w pierwszym elemencie w przerwaniu timera, a pozostałe elementy mają ustawione różnice czasu w stosunku do elementu poprzedającego.
    Oto kod zarządcy takiego stosu:
    Kod: text
    Zaloguj się, aby zobaczyć kod
    A to jest komplementarny kod do LCD(zawiera jeszcze trochę dodatków pozwalających na jednoczesne lub alternatywne używanie tych samych linii do innych zadań, lub wręcz wyłaczenie obsługi LCD po wykryciu masy na odpowiednim pinie. Jest tu także feature polegające na reinicjalizacji LCD po odłaczeniu od działającego układu i ponownym podłaczeniu - czasem się przydaje w urządzeniach, w ktorych są wibracje na złaczach):
    Kod: text
    Zaloguj się, aby zobaczyć kod
    Kod: text
    Zaloguj się, aby zobaczyć kod
    Oczywiście nie jest to kod gotowy do uzycia przez kogoś, kto nie ma zestawu moich makr i bardziej zapadających w pamięci nazw rejestrów podzielonych na przydatność - np. dolna połówka (8 szt.) ma ograniczenia co do trybu natychmiastowego, natomiast swietnie się nadaje jako szybszy magazyn wartości uzytych w przerwaniu rejestrów niż stos.
  • #16 13613106
    maciej_333
    Poziom 38  
    Nie czytałem całej dyskusji, ale postanowiłem tu dodać moje stare sprawozdanie na ten temat. Dotyczyło to Atmegi128, ale to nie ma większego znaczenia. Z tego, co pamiętam kod był napisany dla zegara 16MHz. Trzeba brać pod uwagę, że kod nie jest idealny, było to kilkanaście lat temu. Podobnie jak u autora tematu R/W nie było dostępne, więc nie ma tu odczytu zajętości. Interfejs LCD był 8-bitowy.
REKLAMA