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

[BASCOM] Nie działa wyświetlacz LCD 128x64 KS108 z Atmega328p - BASCOM, Kamami abg128064a-05

UKey 06 Sty 2018 16:32 2310 22
  • #1 16940512
    UKey
    Poziom 15  
    Witam. Wiem że temat był już wałkowany ale nie odnalazłem tematu w którym znalazł bym rozwiązanie mojego problemu. Przyznam że mikrokontrolery programuję dość rzadko ale wszystkie moje poprzednie projekty ruszały. Do teraz. Mam problem z uruchomienie wyświetlacza LCD 128x64 ze sterownikiem KS108 ze sklepu Kamami o oznaczeniu abg128064a-05 z układem atmega328p. Opis sytuacji:
    - port DATA D0-D7 jest podpięty do portu PD mikrokontrolera
    - PB0 mikrokontrolera podłączone do RS (4) wyświetlacza
    - PB1 mikrokontrolera podłączone do R/W (5) wyświetlacza
    - PB2 mikrokontrolera podłączone do E (6) wyświetlacza
    - PB4 i 5 mikrokontrolera podłączone do CS1 (15) i CS2 (16) wyświetlacza
    - reset wyświetlacza (17) do PB5 mikrokontrolera i do Ucc przez rezystor 10k
    - wszystkie połączenia elektryczne są sprawdzone i poprawne
    - regulacja kontrastu działa
    - program kompiluje się bez błędów, po uruchomieniu:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Na wyświetlaczu jest "śnieg", kilka pikseli mruga. Generalnie nie działa...
    Jak rozumiem wrzuciłem w pogram wyłączenie SPI przez które programuje układ żeby móc użyć portu PB do sterowania ale to nic nie dało.
    Po wymianie na atmege8 to samo - śnieg ale nie dokładnie takie sam.
    Trochę nie mam już pomysłów na to. Proszę o wsparcie kolegów bardziej rozeznanych w tym temacie, dzięki z góry.
  • #2 16943582
    pablo666gliwice
    Poziom 14  
    Miałem tak samo jak nie odpiąłem programatora od układu. Rozwiązaniem było w ogóle zrezygnowanie z uzycia portu B (mega128 także duzo wolnych pinów) Sprawdź jeszcze fusy czy nie masz JTAG włączony

    A i jeszcze popraw piny LCD=Procesor
    CS1=Ce, CS2=Ce2, D/I=Cd, R/W=Rd, E=Enable, RES=Reset
  • #3 16943736
    Konto nie istnieje
    Konto nie istnieje  
  • #4 16943962
    UKey
    Poziom 15  
    Ja programuje układ i wkładam w miejsce docelowe. Co prawda to układ prototypowy ale płytkę mam w miarę logicznie zaprojektowaną i zmiana portu nie wchodzi w grę. Poza tym 328 ma budę jak 8'ka. Port PC mi potrzebny (ADC), zostaje PD (LCD data bus) i PB (LCD control bus).
    Co mam poprawić w połączeniach?
    Bascom - Ce = 3, atmega PB3, LCD - CS1 (15)
    Bascom - Ce2 = 4, atmega PB4, LCD - CS2 (16)
    Bascom - Cd = 0, atmega PB0, LCD - RS (data/instructions) (4)
    Bascom - Rd = 1, atmega PB1, LCD - R/W (5)
    Bascom Reset = 5, atmega PB5, LCD - reset (oraz do +Ucc przez 10K) (17)
    Bascom Enable = 2, atmega PB2, LCD Enable (6)

    O ile doczytałem to AT328 nie posiada JTAG.
  • #6 16945625
    UKey
    Poziom 15  
    Wgrałem Twoj program. Efekt jest jak ja zdjeciu. Jest to cos innego niz wczesniej. Jak wgrywalem obrazek ale szalu nadal niema... Dodatkowo bez procka wyswietlacz zapala wszystkie pixele. Obraz jest statyczny, nic nie mruga.
  • #10 16946591
    KrisH
    Poziom 14  
    Z tego co widziałem w różnych DS-ach są 2 wersje sterowania takich wyświetlaczy za pomocą sygnałów CSx;
    Wybór stanem CSx=L lub w innych wersjach wybór stanem CSx=H.
    Wg. DS z Kamami Twój wyświetlacz aktywuje się stanem H i być może w tym jest problem.
  • #11 16948726
    UKey
    Poziom 15  
    Załączam podłączenie wyświetlacza oraz fragment schematu - sory za jakość ale na tym kompie nie mam dostępu do wersji elektronicznej.
    Czy mam przez to rozumieć że po drodze pomiędzy 328 a LCD dla CS1 i 2 powinno być coś na wzór inwerterów?
  • #12 16948972
    KrisH
    Poziom 14  
    Właściwą metodą byłoby poprawienie fragmentu kodu dotyczącego tych sygnałów, czyli napisanie własnego "drivera" i zarazem sprawdzenie czy to jest powód złego działania LCD ( nie znam Bascoma, ale z tego co przed chwilą widziałem w sieci, "Config Graphlcd" steruje CSx stanem "L". Na schematach i w DS-ach jest to(powinno być) oznaczane: /CSx , sterowanie stanem "H" jest oznaczane: CSx ). Dodanie inwerterów powinno pomóc, jest to jednak rozwiązanie nieeleganckie ( od takiej błahostki jest program kontrolera).
  • #13 16958076
    UKey
    Poziom 15  
    Zmodyfikowałem troche program żeby dane do wyświetlenia nie były statyczne :
    
    $regfile = "m328pdef.dat"
    $prog &HFF , &H62 , &HD9 , &HFF ' generated. Take care that the chip supports all fuse bytes.
    $crystal = 1000000
    $baud = 1200
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    $lib "glcdKS108.lbx"
    
    Config Graphlcd = 128 * 64sed , Dataport = Portd , Controlport = Portb , Ce = 3 , Ce2 = 4 , Cd = 0 , Rd = 1 , Reset = 5 , Enable = 2
    
    Do
    Cls
    Wait 1
    Setfont Font8x8
    Lcdat 1 , 1 , "123"
    Cls
    Loop
    
    End
    
    $include "font8x8.font"


    Bo liczyłem na to że w takim przypadku na porcie DATA powinny być jakieś zmienne sygnały logiczne które wyłapie oscyloskopem. Niestety przy w/w kodzie jedynie na D1 jest stan wysoki reszta D.. stan niski. Na pinie R/S, reset stan wysoki. A na ekranie:
    Po wgraniu tego samego programu do 8'ki widać na oscyloskopie że chip wysyła coś na LCD ale na wyświetlaczu jest czysto. Przy tym na RS jest cały czas stan niski :/
  • #14 16964329
    karlos79
    Poziom 33  
    Witam

    Mi wygląda na to że zrobiłeś zwarcie miedzy 5 a 6 nogą LCD...
    Zobacz na to co napisałeś w do loop
    1. wyczyść LCD
    2. zaczekaj sekundę
    3. ustaw czcionkę
    4. wyświetl tekst
    5. wyczyść LCD
    Ja bym się nie dziwił, że nic nie widać na LCD.

    Napisz coś takiego
    config graphlcd
    cls

    setfont
    lcdat
    do
    loop

    Jak to zadziała, spróbuj pobawić się pętlą.
  • #15 16969959
    UKey
    Poziom 15  
    Zwarcia niema.
    Masz rację poprawiłem program tak żeby było widać migający tekst. I po uruchomieniu mam śnieg (przypadkowe pixele są zał) na lcd ale widać w jednym miejscu trzy znaki (nie są to cyfry jak w kodzie 1 2 3 tylko np. "podkreślinik") które migają więc na AT8 coś tam działa.
    Pytanie jak sprawdzić czy LCD jest sprawny?
    Drugie pytanie a w zasadzie potwierdzenie. Jeżeli korzystam z portu control który jest współdzielony z SPI i używam go do programowania to SPI w programie muszę wyłączyć ? Bo czy wrzucam tą linijkę z wyłączeniem SPI czy nie efekt jest taki sam.
  • #16 16969990
    es2
    Poziom 16  
    Zacznij od wyeliminowania błędu sprzętowego. Niestety Bascom więc nie masz debugera sprzętowego, którego zalety teraz byś docenił. Napisz program, który ustawi 0 na linii np CS1 na pozostałych 1, uruchom, sprawdź czy na samym LCD na CS1 masz 0 na pozostałych 1. To samo dla CS2, RW, RS, D0.....D7. Sprawdzisz wszystkie linie i będziesz miał pewność, że procek nie jest uszkodzony, wszystko ma styk czyli sprzęt ok. W praktyce właśnie tu często pojawiają się błędy.
    Trochę roboty będziesz miał, pod debugerem 100 razy mniej bo jest praca krokowa.

    Naturalnie, gdy RW=L to na D0...D7 pojawi sie jakaś dana, więc sprawdzanie ich w tym przypadku nie ma sensu.
  • #17 16973642
    UKey
    Poziom 15  
    Zrobiłem prosty test, wyłączyłem zasilanie lcd i napisałem programik:
    
    $regfile = "m328pdef.dat"
    
    $crystal = 1000000
    
    $baud = 1200
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    Config Portb = Output : Config Portd = Output
    
    Do
    Set Portd.0 : Waitms 500 : Reset Portd.0 : Waitms 500
    Set Portd.1 : Waitms 500 : Reset Portd.1 : Waitms 500
    Set Portd.2 : Waitms 500 : Reset Portd.2 : Waitms 500
    Set Portd.3 : Waitms 500 : Reset Portd.3 : Waitms 500
    Set Portd.4 : Waitms 500 : Reset Portd.4 : Waitms 500
    Set Portd.5 : Waitms 500 : Reset Portd.5 : Waitms 500
    Set Portd.6 : Waitms 500 : Reset Portd.6 : Waitms 500
    Set Portd.7 : Waitms 500 : Reset Portd.7 : Waitms 500
    
    Set Portb.0 : Waitms 500 : Reset Portb.0 : Waitms 500
    Set Portb.1 : Waitms 500 : Reset Portb.1 : Waitms 500
    Set Portb.2 : Waitms 500 : Reset Portb.2 : Waitms 500
    Set Portb.3 : Waitms 500 : Reset Portb.3 : Waitms 500
    Set Portb.4 : Waitms 500 : Reset Portb.4 : Waitms 500
    
    
    Loop
    End
    


    Efekt jest taki że wszystkie piny działają oprócz PD0 i PD1 - na nich jest cały czas stan wysoki. Sprowadzałem tak dwa procki i efekt jest ten sam. Przy usunięciu układu z podstawki na niema zwarci z Ucc na tych pinach.
  • #18 16981292
    karlos79
    Poziom 33  
    Witam

    To odłącz te linie od LCD i zobacz co się stanie jak zapuścisz twój program testowy.
    Przynajmniej na 100% będziesz wiedzieć czy masz sprawne mikrokontrolery.

    Pozdrawiam
  • #20 16993314
    UKey
    Poziom 15  
    Odłączyłem lcd całkowicie. Problem chyba jest chyba po stronie procesora/programatora (?) a nie lcd. Usunąłem $baud z programu - bez różnicy.
    Sprawdzałem dwa procki 328 i za każdym razem wszystko działa dobrze oprócz dwóch pinów:
    PD0 - tam jest stan 0,3-0,4V - nie mam pojęcia dlaczego, po wyjęciu układu z podstawki jest 0V
    PD1 - tam jest cały czas stan wysoki, po wyjęciu z podstawki jest 0V
    reszta pinów działa zgodnie z programem.

    I teraz trzy przypuszczalne przyczyny:
    - UART - domyślnie włączony - przejrzałem fusy w Bascom AVR i nie widzę nigdzie wyłączenia UART
    - moj bascom avr (2.0.7.1.) jest stary - nie wiem czy może to mieć jakieś znaczenie
    - mój programator - kilku letni taki na USB i z tymi "małymi switchami" i tasiemką z płytką z podstawkami nie obsługuje 328 (w wykazie procesorów nie widzę tego układu) ale Bascom avr wykrywa poprawnie układ, programuje bez błędów.

    Ma ktoś jakis pomysł na to g.?
  • #22 17835253
    serwvus
    Poziom 9  
    Witam. Według mnie, brakuje Setfont Font8x8.font (np. po Cls) oraz spowolnienia pętli np. Waitms 100, bo wyświetlacz jest zbyt często odświeżany. U mnie w działającym teście wyświetlacza jest użyta biblioteka glcdKS108.lbx, a BASCOM 1.11.9.8. Przy uruchamianiu wyświetlacza korzystałem z https://ep.com.pl/files/4215.pdf
  • #23 17847994
    UKey
    Poziom 15  
    Hej dzięki za odpowiedź i sugestie. Ale to nie to... Muszę iść innym tropem bo mam wrażenie że ten układ jest jakiś "niestabilny" np. zmiana portu sterującego np na C, przeprogramowanie i późniejszy powrót do portu B, przeprogramowanie nie powoduje efektu sprzed programowania portu C... Kupię jeszcze Mege32 i sprawdzę na niej...
REKLAMA