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

[BASCOM] LCD4BUSY z RW - jak usunąć zimny start i kwadraty na 1 linii LCD?

arktik1 05 Cze 2026 08:48 309 7
REKLAMA
  • #1 21915802
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Bascom, biblioteka LCD4BUSY.
    Dzień dobry.
    Chciał bym zadać pytanie odnoście rozwiązania problemu ze startem wyświetlaczy LCD z biblioteki LCD4Busy I podłączonym pinem RW.
    Jak wiadomo start calego układu w większości przypadków kończy się kwadratami na 1 lini LCD. Żeby zadziałało trzeba resetować zasilanie kilka razy i wtedy może załapie. Czy słyszał ktoś może o rozwiązaniu tego problemu?
    Są jakieś konkretne rozwiązania tego zimnego startu?
    Pozdrawiam
  • REKLAMA
  • #2 21915834
    sp3ots
    Poziom 38  
    Posty: 3068
    Pomógł: 523
    Ocena: 673
    Witam !
    Config Lcd = 16 * 2
    Cls 'nie działa ?
  • REKLAMA
  • #3 21915969
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    W zasadzie nic nie działa.
    Nie próbowałem tylko jeszcze
    Waitms500
    Config Lcd 40x2
    Waitms 500
    Config lcd 40x2 bo
    Modyfikacje LCD4busy.lib
    Opóźnione włączanie Uc
    Reset po włączeniu
    Start na zwartym resecie itd wszystko przerobione.
    Problem jest tylko ze startem z aktywną linią RW.
    Ale bez RW lcd jest za wolne i projekt mija sie z celem.
  • Pomocny post
    #4 21917360
    bart-projects
    Poziom 30  
    Posty: 836
    Pomógł: 200
    Ocena: 260
    Lcd nie jest inicjowane w tej linii gdzie jest konfigurowany tylko przy pierwszym użyciu czyli na przykład przy pierwszym CLS. Jak masz coś ciekawszego w programie do zrobienia zaraz po włączeniu zasilania, na przykład konfiguracja jakichs portów to to najpierw zrób a dopiero potem użj CLS.

    Drugim sposobem możesz użyć inicjalizacji wielokrotnie. To z naczy w bibliotece jest procedura o nazwie "_init_LCD"
    Mozesz u siebie w programie spróbwać ponowić inicjalizacje poprzez komendę "! call _init_LCD". Wykrzyknik jest informacją dla kompilatora że call to mnemonik assemblera.

    Nie wszystkie nowe wyświetlacze są w pełni kompatybilne z oryginalnym "HD8 cośtam". Niektóre wymagają korekty czasów. Możesz sobie otworzyć tę bibliotekę i ja edytować bo to zwykły plik tekstowy. Tam przed każdą komendą "Rcall _lcd_delay" rejestry R30 i R31 ładowane są czasem który ma odliczyć. Możesz je sobie zwiększyć. Nie zapomnij tylko po wszystkim skompilować biblioteki w Menadżerze bibliotek bo inaczej to użyje tej skompilowanej wcześniej z końcówką LBX
  • REKLAMA
  • #5 21917661
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Bardzo, bardzo dziękuję!!!
    Zmiana prędkości w bibliotece pomogła bardzo, później dopisałem jeszcze ponowną inicializacje i praktycznie dziala 45 razy na 50 uruchomień. A jeśli sie za którymś nie odpali to w pętli dałem wywołanie za pomocą przycisku dziala za każdym razem.
    Jeszcze raz dzięki i Pozdrawiam.
  • REKLAMA
  • #6 21919712
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Tak w ogóle to chciał bym to jakoś pojąć.
    Do czego jest R30 a do czego R31.
    To liczy się według jakiegoś wzoru?
    Ustawianie na oko to chyba średni pomysł....
  • Pomocny post
    #7 21919817
    bart-projects
    Poziom 30  
    Posty: 836
    Pomógł: 200
    Ocena: 260
    Nie wiem od czego zacząć bo to jest złożone zagadnienie.
    Czas jest odmierzany taktami procesora a licznik odmierzany w dół ma wartość dwubajtową czyli nie maks 255 do 0 a 65535 do 0. Do tego aby coś odjąć od wartości dwubajtowej w AVR służy rozkaz assemblera SBIW - Subtract Immediate from Word

    Dlatego jest tam procedura _lcd_delay:

    [BASCOM] LCD4BUSY z RW - jak usunąć zimny start i kwadraty na 1 linii LCD?

    Będzie odejmować od słowa czyli dwóch bajtów dopóki to nie będzie miało zera. To akurat jest tu bardzo proste bo BRNE - Branch if Not Equal każe mu z powrotem skoczyć pod adres gdzie miał na początku odjąc jeden od całej dwubajtowej wartości. Czyli kręci się w kółko dopóki wartośc będzie miała zero i wtedy warunek dla BRNE nie jest spełniony i wykona się następny rozkaz czyli RET. Tym sposobem program "czeka" a tak naprawdę to odlicza w dół kręcąc się w kółko.

    W tej bibliotece która powstała pewnie bardzo wcześnie czasy wyliczone są dla uC taktowanego 4MHz co jest w bibliotece jawnie opisane.

    Tymczasem teraz każdy goni AVR`a minimum 16MHz, nowe AVRX 24MHz a Xmega 32MHz.
    Czas wykonania jednego taktu się po prostu skraca i czasy wpisane "na sztywno" w bibliotece nie wystarczają by odczekać wymagany czas.

    Zrzut ekranu z kodem asemblera AVR z wywołaniem _lcd_delay i komentarzem „5 mS delay at 4 MHz”.


    [BASCOM] LCD4BUSY z RW - jak usunąć zimny start i kwadraty na 1 linii LCD?

    Fragment kodu asemblera AVR z komentarzem o opóźnieniu 100 µs przy 4 MHz i wywołaniu lcd_delay

    Teraz może opiszę coś co powinno być dla każdego programisty oczywiste. Jeśli odejmujemy np od wartości typu bajt to jeśli zejdziemy do zera i odejmiemy jeden to ten bajt otrzyma wartość 255... teraz jeśli używamy SBIW to odejmujemy od bajtu, ale jak ten bajt zejdzie do zera to odejmujemy jeden od tego drugiego i nasz bajt znów ma 255 do odliczenia.

    Typ WORD zapisywany może być jako Little Endian lub Big Endian. To znaczy że bardziej znaczący bajt może być zapisany jako drugi, niekoniecznie intuicyjnie dla człowieka.

    Tak więc widać na poprzednich obrazkach że dla odliczenia 5us R31 to w ogóle zero a odliczamy tylko pojedyncze takty z R30 a żeby odliczyć 20ms musimy odliczyć 78 razy 256 i jeszcze 28 razy te dwa takty :D Przecież to proste :D

    Tak więc to co jest w R30 to tylko precyzja a jeśli chcesz coś opóźnić dla uC taktowanego 16MHz to pomyśl jak zwiększyć wartośc ładowaną do R31 czterokrotnie (4x4=16) A jak trzeba to użyj _delay_LCD dwukrotnie.

    Inna sprawa jest taka że Bascom od tego czasu już ma w innych bibliotekach coś co generuje opóźnienia w zalezności ot taktowania uC. To się nazywa _genus() ale to opowieśc na innego posta
  • #8 21919969
    arktik1
    Poziom 27  
    Posty: 1281
    Pomógł: 61
    Ocena: 39
    Dziękuję za odpowiedź, faktycznie to bardzo trudny dla mnie temat i pewnie tego nie pojmuje, nie jestem programistą. Czasami buduje jakieś urządzenia aby ułatwić sobie "życie ":) Korzystam z Bascoma bo jest dla mnie najprościej i najszybciej. Problem polegał na tym, że LCD z podłączoną linią RW nie startuje prawidłowo a z normalną biblioteką bez RW jest tragicznie wolny. Zbudowałem limiter do wzmacniacza Technicsa który korzysta z wejścia BT Ldac do odtwarzania muzyki. Jeden wskażnik VU na wyświetlaczu 2x40 pokazuje procent głośności BT a 2 pokazuje głośność samego wzmacniacza jaka jest wysyłana na kolumny, pokazuje ją w Watach. LCD z połączonym RW jest na tyle szybki, że pokazuje w miarę harakterystykę muzyki.
    Jeśli głośność BT przekracza 75% to BT jest automatycznie przyciszany aby nie generować przesterowań do wzmacniacza. Jeśli wyjście wzmacniacza osiąga 60W układ też przycisza sygnał aby nie katować kolumn. Do tego to wlasnie potrzebuje.
    Skorzystałem z AI i podałem mu parametry opóźnień według katalogu LCD I wygenerował mi tabelę z opóźnieniami. Kazałem mu poszukać jakiegoś wzoru na obliczanie tego, wiem ,że jest mało mądry ale wedlug tych wzorów z LIB bascoma wygenerował mi coś takiego jak na zdjęciu. Pytanie tylko czy dobrze to policzył. Jesli mógł by Pan zerknąć to było by super. Nie chce tego zostawiać z przeświadczeniem, że może tym razem zadziałało. A grzebanie dla mnie w tych bibliotekach to czarna magia :) Ale dzięki Pana instrukcją odpala prawie zawsze...
    Obliczenia dla kwarcu 14745600.
    Tabela czasów opóźnień LCD z wierszami 100 µs–17 ms i kolumnami N, R, R31, R30 oraz t_real

Podsumowanie tematu

✨ Dyskusja dotyczy problemu zimnego startu wyświetlaczy LCD sterowanych z Bascoma przez bibliotekę LCD4BUSY z aktywną linią RW, gdzie po włączeniu zasilania pojawiają się kwadraty na pierwszej linii i LCD nie inicjuje się poprawnie. Zgłoszono, że samo ponawianie zasilania lub standardowe opóźnienia nie rozwiązywały problemu, a wyłączenie RW spowalniało pracę zbyt mocno dla zastosowania VU-metra i wskaźnika mocy w limiterze do wzmacniacza. Zaproponowano uruchamianie inicjalizacji dopiero przy pierwszym użyciu LCD, wielokrotne wywołanie procedury _init_LCD oraz ręczną korektę czasów w bibliotece poprzez zwiększenie opóźnień w procedurze _lcd_delay. Po zmianie timingów i ponownej inicjalizacji LCD problem został w dużej mierze ograniczony, a wyjaśniono też działanie opóźnień realizowanych przez rejestry R30 i R31 w AVR.
Wygenerowane przez model językowy.
REKLAMA