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

[Atmega328p] [C] lcd[RC1602B5-LLH-JWV]wyświetla tylko kwadraty pomocy potrzebuje.

przem13 04 Lut 2023 21:31 498 11
REKLAMA
  • #1 20422573
    przem13
    Poziom 10  
    Witam próbowałem wgrywać różne kody do obsługi i2c i lcd
    zmieniałem adresy, częstotliwość transmisji scl ,w lcd podłączyłem SA0 i SA1 do masy.
    Ten wyświetlacz jest skomplikowany do obsługi nie wiadomo jaki moduł nim steruje, bibliotek do niego brak inne ciężko przerobić nie wymagam wielkiej pomocy może ktoś mnie naprowadzi .
    Atmega ustawiona na 1MH
    main.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i2c.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    lcd_i2c.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 20422738
    bart-projects
    Poziom 29  
    Sam scalak w module potrafi się komunikować po TWI, SPI, 6800 8bit i 4bit ale producent wyswietlacza chyba na stałe wybrał komunikację po TWI/I2C.
    Natomiast Ty tu pokazujesz bibliotekę której używa się do sterowania "zwykłym" wyświetlaczem 6800 4bit poprzez ekspander I2C na PCF8574.
    Taki zwykły wyświetlacz ma piny RW, EN, RS i D4-D7 a Ty ich chyba tam nie masz.
    Musisz albo poszukać pasującej biblioteki albo napisac ją sobie sam.

    Po drugie masz strasznie niską prędkość tej magistrali TWI. Wyswietlacz będzie chodził jak zółw.

    1MHz/(16 + (2* 0x62) *1) = 1MHz/212 = 4716Hz

    Proponuję przynajmniej wyłączyć wewnętrzny podzielnik zegara uC i ustawić jakąś "ludzką" standardową prędkość ahahahaha :D
  • REKLAMA
  • #3 20423100
    przem13
    Poziom 10  
    Witam. prędkość ustawił bym potem gdyby wszystko działało chyba tak można . :?:
    Nic w necie nie moge znależć właściwej bibloteki ,jak się steruje tym modułem od czego zacząć. :roll:
    Tu widze że trzeba wysyłać dane do odpowiednich adresów aby wyświetlić znak.
    z tej bibloteki co mam zmienić od czegoś trzeba zacząć ??

    Dodano po 41 [minuty]:

    Umnie B5 ja w nocie nie zauważyłem różnicy czym się interesować wyjścia modułu takie same
    [Atmega328p] [C] lcd[RC1602B5-LLH-JWV]wyświetla tylko kwadraty pomocy potrzebuje.
  • REKLAMA
  • #4 20423357
    bart-projects
    Poziom 29  
    No ta wersja B5 to chyba rzeczywiście na I2C i faktycznie trudniej o gotowy przykład w C choć może nie szukałem jakoś intensywnie.
    Normalnie to jednostkowo taka sprawa jest nieopłacalna bo inny wyswietlacz kupisz za 20zł, ale... jeśli ktoś chce się czegoś nauczyć to może walczyć dalej.
    Można posiłkować się biblioteką Arduino i przetłumaczyć potrzebne elementy do C.

    https://github.com/duinoWitchery/hd44780 (można ją też chyba zainstalować prosto z IDE Arduino).
    Najczęściej potrzebne są tylko funkcje Write_command i Write_data to pewnie reszta funkcji będzie pasować.
    Tutaj zacząłbym od ustawienia w uC 8MHz i skonfigurowania I2C.
  • #5 20423548
    przem13
    Poziom 10  
    trudna sprawa z tym przerabianiem arduino na zwykły kod, może zrezygnuje z tego wyświetlacza
    jeszcze nie wiem.
    To nie jest tak że ten wyświetlacz ma wbudowany expander tylko jaki może to być mcp23008?[/syntax]
  • #6 20423572
    bart-projects
    Poziom 29  
    MCP23008 to chyba taki ekspander I2C jak PCF8574. Tutaj masz inny układ:
    Cytat:
    // Raystar RC1602B5-LLH-JWV is jumper settable to 0x3c, 0x3d, 0x3e, 0x3f
    // and appears to only be able to be written to.
    // It overlaps with the addresses for the PCF8574A
    //
    // Known addresses for this type of device:
    // 0x3a PCF2116/PCF2119x
    // 0x3b PCF2116/PCF2119x
    // 0x3c Raystar
    // 0x3d Raystar
    // 0x3e Raystar
    // 0x3f Raystar
    //
    // The interface consists of sending 2 bytes over I2C for each hd44780
    // data/cmd.
    // The first byte is a control byte which sets the RS signal
    // The second byte is the data.
    //
    // The I2C can only control the LCD and does not have the capability
    // to control the backlight so the backlight will always remain on.


    Kolego sterowanie tym wyswietlaczem wygląda na bardzo łatwe.
    Nie mozna z niego czytać w trybie I2C więc odpada sterowanie pinem RW i posługujemy się tylko adresem do zapisu.
    Chcąc wysłac komendę wysyłamy najpierw bajt z wyzerowanym bitem RS czyli tutaj bit 6. Bit 7 jest bitem kontynuacji i wskazuje czy będzie następna komenda czy tylko dane. Reszta bitów z Control_byte" to zera. Można więc śmiało wysłać 0x0 jak wstęp do komendy i potem co od niego chcesz. Na przykład żeby wyczyścił ekran to ta komenda jest zgodna z tą z normalnych wyświetlaczy.
    Możesz chcieć ustawić kursor na pierwszym miejscu to wysyłasz po kolei Adres wyswietlacza i czekasz na ACK, rozkaz komendy i czekasz na ACK i wysyłasz adres w RAM. Teraz ustawiasz bit RS że niby będziesz wysyłał dane i czyli ustawiasz bit 6 (0x40) po czym zapodajesz znaki.
    Przed tym wszystkim musisz go tylko zainicjalizować.
    [Atmega328p] [C] lcd[RC1602B5-LLH-JWV]wyświetla tylko kwadraty pomocy potrzebuje. [Atmega328p] [C] lcd[RC1602B5-LLH-JWV]wyświetla tylko kwadraty pomocy potrzebuje.
  • #7 20424454
    przem13
    Poziom 10  
    Wielkie dzięki za pomoc
    nadzieja wróciła , adres wyświetlacza 0x3c Raystar
    pozostaje wysłać do lcd ten adres
    znalazłem w necie następny kod Spróbuję go dostosować zerknij czy sie nada do zmian
    i2cmaster.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i2cmaster.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    main
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]
  • #8 20424631
    bart-projects
    Poziom 29  
    Tu chyba nie ma czego dostosowywać. Wrzuć jeszcze raz ten kod obsługi do adaptera na PCF8574 który miałeś w pierwszym poście. Ten trzeba dostaosować.

    Najpiew zmienić funkcje które powinny mieć nazwy coś na wzór "Write_cmd" i "Write_data" i jak to będzie gotowe to napisać "Init_lcd" zgodnie z tym diagramem z noty. Wtedy kwadraty na LCD powinny zniknąć. Potem to juz bułka z masłem.
  • REKLAMA
  • #9 20427515
    przem13
    Poziom 10  
    Czytam te noty ,tłumacze na polski ,próbuje widze że nieda się zrozumieć kody które ktoś
    napisał bo każdy jest inaczej napisany .
    żeby zrozumieć musze pisać od nowa niema wyjścia.
  • #10 20427546
    bart-projects
    Poziom 29  
    Umieść jeszcze raz te funkcje od przejściówki na PCF8574 które były w pierwszym poście (trzeci kod) to może w wolnej chwili coś pomoge chociaż zarobiony jestem na maksa więc nie obiecuję.
    Wydaje mi się, że trzy funkcje tam trzeba tylko zmodować i będzie działało.
  • #11 20427624
    przem13
    Poziom 10  
    Mi się nie śpieszy ,próbuje w symulatorze to zrozumieć te przebiegi napięcia



    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #12 20427670
    bart-projects
    Poziom 29  
    No jak byś znał zasadę działania zwykłego wyświetlacza hd44780 to byłoby Ci łatwiej zrozumieć że z tym Twoim to wszystko jest niepotrzebne ahahahahaha.

    Normalny wyświetlacz ma piny RS,EN i D0, D1, D2 ..do D7.
    Jest też pin RW, ale użytkowo jest opcjonalny więc go pominę.
    Pin RS słuzy do wyboru czy przesyłane dane to komenda czy znaki.
    Pin EN służy do zatwierdzania przesłanych danych.
    Natomiast osiem pinów to jakby port na którym mozesz wpisać wartość 0-255.
    Osiem pinów to jednak dużo dla mikrokontrolera więc wymyślono ze można dane przesyłać tylko czterema pinami danych D4-D7. Czyli wyświetlacz moze pracować w trybie ośmio lub czterobitowym. Trzeba go jednak o tym poinformować przy inicjalizacji. Potem każdy bajt danych trzeba dzielić na pół i wysyłać dwa razy na jeden bajt.

    Ciebie jednak te wszystkie zabawy z przestawianiem na tryb czterobitowy, dzielenie bajtów i machanie pinem EN nie powinny interesować ponieważ przesyłasz dane interfejsem szeregowym a nie równoległym.

    Mógłbym przerobić ten Twój kod ale on nie jest dobrym kandydatem a nie lubie robić czegoś dwa razy bo za pierwszym razem bez sensu.
    Kandydatem jest złym bo nie ma tu funkcji ustawiania kursora na pozycji ani czyszczenia wyświetlacza.

    Tutaj trzeba przerobić lcd_cmd, lcd_dwr (pewnie od data write) i lcd_init. Tylko od razu skorzystałbym z funkcji poprzednich i2c_master bo tam w I2c_start już masz wybieranie adresu i sprawdzanie ack.

    Poszukaj jakiegoś lepszego kandydata :D ahahahaha

    [EDIT 1] Popatrz jakie to powinno być proste z ta biblioteką I2c_master

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Teraz Init to wysłanie czterech komend w sekwencji czasowej z diagramu z szóstego postu.
    To taki teoretyczny kod który pisałem tu w edytorze na forum. Do niego warto by dodać cos mądrzejszego wykorzystującego bit kontynuacji. Czyli po ustawieniu kursora wysyłasz cały ciąg i dopiero przy ostatnim znaku kasujesz kontynuację.

Podsumowanie tematu

Użytkownik ma problem z wyświetlaczem LCD RC1602B5-LLH-JWV, który wyświetla jedynie kwadraty. Próbował różnych kodów do obsługi I2C i LCD, zmieniając adresy oraz częstotliwość transmisji, ale nie znalazł odpowiedniej biblioteki. Odpowiedzi sugerują, że wyświetlacz komunikuje się przez I2C, a użytkownik powinien dostosować istniejące biblioteki do swojego modułu. Wskazano na potrzebę zmiany prędkości magistrali TWI oraz na konieczność zrozumienia zasad działania wyświetlaczy HD44780. Użytkownik został również zachęcony do przetłumaczenia funkcji z biblioteki Arduino na C oraz do zainicjowania wyświetlacza zgodnie z dokumentacją.
Podsumowanie wygenerowane przez model językowy.
REKLAMA