Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[bascom][ATmega8] Obsługa wyświetlacza.

donkoval 09 Apr 2011 20:45 8310 45
  • #1
    donkoval
    Level 9  
    Witam!

    Zakupiłem wyświetlacz LCD WC1602A 16x2. Po wgraniu standardowego programu na µP pojawiają się do góry kwadraciki czarne co jest dobrą oznaką i po jakimś czasie pojawi się na wyświetlaczu ,, 10 " po lewej stronie do góry wyświetlacza.

    Po wielogodzinnym szukaniu jak obsłużyć taki oto LCD znalazłem tylko takie info:



    -> zmiana fuse bit'ów aby µP nie był zbyt szybki do obsługi tego oto wyświetlacza
    (skończyło się to zablokowaniem megi)

    ->Podłączenie wyświetlacza (jest na 100% poprawnie połączony)

    Posprawdzałem czy jest przewodzenie piszczykiem - jest
    luty - są dobre
    taśma którą łączę wyświetlacz - jest dobra

    Po konsultacji z nauczycielem, znajomymi (zajmującymi się programowaniem) i elektronikami doszliśmy do wniosku, że wyświetlacz jest w 100% sprawny (zamieniłem poprzedni taki sam na nowy i dzieje się to samo) i rozwiązany problem może być tylko wtedy gdy napisze się dobrze program.

    Pytanie czy ktoś już sobie z takim oto ustrojstwem dał rade i obsłużył taki LCD??
  • #2
    bogdan_p
    Level 39  
    Quote:
    Po wgraniu standardowego programu na µP pojawiają się do góry kwadraciki czarne

    Pokaż ten standardowy program i napisz jak podłączyłeś LCD > Atmega 8 .
  • #3
    M. S.
    Level 34  
    Miałem a wyświetlaczem niedawno problem na M16, mimo że wyświetlacz podłączałem nie raz. Pomogła ponowna inicjalizacja LCD'ka.
    Code: basic4gl
    Log in, to see the code
  • #4
    donkoval
    Level 9  
    program np taki:

    $regfile = "m8def.DAT"
    $crystal = 8000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.3 , Db5 = Pinc.2 , Db6 = Pinc.1 , Db7 = Pinc.0
    Config Lcdpin = Pin , E = Pind.1 , Rs = Pind.0

    cls
    locate 1,1
    lcd "cos tam"
    end



    A podłączenie zgodne z wyżej wymienionym programem co do megi, a reszta to:

    DB0 - BB3 - masa
    V0 - kontrast na potencjometrze 10k
  • #5
    M. S.
    Level 34  
    Code:
    Config Lcdpin = PIN , DB4=PORTB.1, DB5=PORTB.2 , DB6=PORTB.3 , DB7=PORTB.4 , E=PORTB.5 , RS=PORTB.6

    ' instrukcja musi być umieszczona w jednej linii - tak rzecze help.
  • #6
    donkoval
    Level 9  
    Zrobiłem to w dwóch liniach dzisiaj i kompiluje się, a LCD świeci tak samo.

    Jak wstawię ,, initlcd " to pojawi się ,, 298 "

    [bascom][ATmega8] Obsługa wyświetlacza.
  • #7
    bogdan_p
    Level 39  
    Instrukcje w jednej linijce , ponadto nie PIN.X tylko PORT.X
  • #8
    donkoval
    Level 9  
    To jest program który ma obsługiwać mi dwa termometry, wgrywam i pojawia się ,, 298 " te wszystkie zmiany wprowadzałem aby sprawdzić czy ruszy.

    $regfile = "m8def.DAT"
    $crystal = 8000000

    Config Portb = Output
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Pind.1 , Rs = Pind.0
    Initlcd
    Wait 1
    Initlcd
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
    Config Adc = Single , Prescaler = Auto , Reference = Internal ' ustawienie przetwornika analogowego Prescaler-taktowanie zegara Reference Vf
    Start Adc
    Config 1wire = Portb.0
    Config Portd.2 = Input
    Config Portd.3 = Input
    Config Portd.4 = Input

    Set Portb.3
    Set Portb.5
    Set Portd.2
    Set Portd.3
    Set Portd.4


    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim B As Byte
    Dim W As Byte
    Dim Ix As Integer
    Dim P As Integer
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    Dim Snieg As String * 2
    Dim Analog As Word
    Dim Pods As Word
    Dim Zfoto As Bit
    Dim Przes As Byte
    Declare Sub Odczyt
    Declare Sub Podsw
    Declare Sub Petlaglowna
    Declare Sub Foto

    S1 Alias Pind.2
    S2 Alias Pind.3
    S3 Alias Pind.4
    Zielona Alias Portb.3
    Zolta Alias Portb.5
    Snieg = " "


    P = 100
    Pwm1a = P
    Pwm1b = 255 - P

    Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32
    Deflcdchar 1 , 32 , 32 , 21 , 14 , 31 , 14 , 21 , 32


    Cursor Off
    Cls
    Lcd " TERMOMETR " ;
    Lowerline
    Lcd " KOVAL "
    Wait 3
    Cls
    W = 1wirecount()
    Lcd "Ilosc czujnikow:"
    Wait 1
    Lcd W
    Wait 1
    Cls
    Dsid1(1) = 1wsearchfirst()
    Dsid2(1) = 1wsearchnext()

    If Dsid1(8) = Crc8(dsid1(1) , 7) Then
    Locate 1 , 1
    Lcd "Czujnik 1 ID: "
    Wait 1
    Locate 1 , 1
    For B = 1 To 8
    Lcd Hex(dsid1(b))
    Next
    End If
    Wait 1

    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
    Locate 2 , 1
    Lcd "Czujnik 2 ID: "
    Wait 1
    Locate 2 , 1
    For B = 1 To 8
    Lcd Hex(dsid2(b))
    Next
    End If
    Wait 1

    Zfoto = 1

    Sub Petlaglowna
    Cls
    Do
    If Zfoto = 1 Then
    Analog = Getadc(5)
    Analog = Analog / 4
    If Analog > 75 Then
    If Analog < 250 Then
    P = 256 - Analog
    End If
    End If
    If Analog =< 75 Then
    P = 254
    Elseif Analog => 250 Then
    P = 10
    End If
    End If
    Pwm1a = P
    Pwm1b = 255 - P
    If S1 = 0 Then
    Reset Zielona
    Waitms 500
    Foto
    Else
    Odczyt
    End If
    Loop

    End Sub

    'odczyt i wyswietlanie temp na lcd
    Sub Odczyt
    1wreset
    1wwrite &H55
    1wverify Dsid1(1)
    1wwrite &HBE
    I1 = 1wread(2)

    1wreset
    1wwrite &H55
    1wverify Dsid2(1)
    1wwrite &HBE
    I2 = 1wread(2)

    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1

    I1 = I1 * 10
    I1 = I1 / 16
    'If I1 < 0 Then Cls
    Ss = Str(i1)
    Ss = Format(ss , " 0.0")
    Locate 1 , 1
    Lcd " IN : " ; Ss ; Chr(0) ; "C " ; Analog ; " "

    I2 = I2 * 10
    I2 = I2 / 16
    Ix = I2 / 10
    If Ix < 0 Then
    Reset Zolta
    Snieg = Chr(1)
    Else
    Set Zolta
    Snieg = " "
    End If
    Ss = Str(i2)
    Ss = Format(ss , " 0.0")
    Locate 2 , 1
    Lcd " OUT: " ; Ss ; Chr(0) ; "C " ; P ; " " ; Snieg

    End Sub


    '=====Regulacja podswietlenia=======
    Sub Podsw
    Reset Zielona
    Cls
    Do
    If P = 256 Then
    P = 0
    End If
    If P = -1 Then
    P = 255
    End If
    Pwm1a = P
    Pwm1b = 255 - P
    Locate 1 , 1
    Lcd "poswietlenie: " ; P ; " "


    If S3 = 0 Then
    Waitms 5
    P = P - 1
    End If

    If S2 = 0 Then
    Waitms 5
    P = P + 1
    End If

    If S1 = 0 Then
    Set Zielona
    Waitms 500
    Petlaglowna
    End If
    Loop

    End Sub

    Sub Foto
    Reset Zielona
    Cls
    Do
    Locate 1 , 1
    If Zfoto = 1 Then
    Lcd "fotorezystor"
    Elseif Zfoto = 0 Then
    Lcd "reczny "
    End If

    If S3 = 0 Then
    Waitms 200
    Zfoto = Not Zfoto
    End If

    If S2 = 0 Then
    Waitms 200
    Zfoto = Not Zfoto
    End If

    If S1 = 0 Then
    Set Zielona
    Waitms 500
    Podsw
    End If
    Loop
    End Sub


    po podłączeniu innego wyświetlacza kolegi 20x2 wszystko jest w jak najlepszym porządku, wszystko wyświetla dobrze.
  • #10
    donkoval
    Level 9  
    Jest przecież tak napisane.
  • #12
    donkoval
    Level 9  
    Nic to nie zmienia, jest cały czas tak samo, nic nie wyświetla tylko te 298 lub 10.
  • #13
    bogdan_p
    Level 39  
    Kolego namieszałeś z tego wynika że nie działa program termometru a nie że wyświetlacz ! . Ustawiłeś prawidłowo fusebity częstotliwość oraz wyłączyłeś podział przez 8 http://radzio.dxp.pl/avr910.htm
  • #15
    donkoval
    Level 9  
    Program termometru działa. Jak podłącze wyświetlacz kolegi to na tym programie co wyżej wstawiłem wszystko jest prawidłowo (oczywiście z portd.x a nie pind.x, moje niedopatrzenie).
    Druga sprawa dzisiaj kolega zmontował jakiś układ wykonany przez iksińskiego (schemat, płytka i program wszystko gotowe tylko złożyć i wgrać kod) i kupił ten sam wyświetlacz co ja i też nie jest obsługiwany.

    Tak ustawiłem fusbity prawidłowo i nic. Aż wyczytałem, że po spowolnieniu procesora te wyświetlacze działają i po zabawie z fusami zablokowałem mege8.
  • #16
    bogdan_p
    Level 39  
    Kolego M.S. masz rację M8 nie ma dzielnika mój błąd .
    Quote:
    Tak ustawiłem fusbity prawidłowo i nic. Aż wyczytałem, że po spowolnieniu procesora te wyświetlacze działają i po zabawie z fusami zablokowałem mege8.

    Jak zmianą częstotliwości zablokowałeś , z jakiego korzystasz generatora RC czy kwarcowego .
  • #17
    donkoval
    Level 9  
    Korzystam z kwarcu 8Mhz.

    Odznaczyłem takie coś SPIEN - Enable serial program and data downloading

    Co wyczytałem, że to jest zablokowanie przesyłu na procka.
  • #18
    piotrva
    VIP Meritorious for electroda.pl
    ale jeśli programator czyta CI sygnaturkę to znaczy, że nic nie zablokowałeś - poza tym z tego co wiem przez ISP nie da się zmienić tego fusebitu :D
  • #19
    donkoval
    Level 9  
    To nie wiem co zrobiłem, bo mało się znam na fuse bit'ach, ale teraz nic nie mogę wgrać na mege8 ani sczytać, wyskakuje error.
  • #20
    emarcus
    Level 38  
    donkoval wrote:
    To jest program który ma obsługiwać mi dwa termometry, wgrywam i pojawia się ,, 298 " te wszystkie zmiany wprowadzałem aby sprawdzić czy ruszy.

    ...................

    po podłączeniu innego wyświetlacza kolegi 20x2 wszystko jest w jak najlepszym porządku, wszystko wyświetla dobrze.


    Nie trudno tu zauważyć że problem jest z wyświetlaczem a nie programem (!).
    Po co więc kombinacje ze zmianą częstotliwości taktowania processora, fuse bitów, komunikacji ISP itp.
    Czy dasz 1 MHZ , 8 MHz albo nawet 20 MHz to compiler dobierze odpowiedni 'prescaler' dla komunikacji LCD. Ważne jest aby podana częstotliwość w:"$ctystal=xxxxxxx" pokrywała sie z faktycznymi parametrami systemu.
    Nie wszystkie wyświetlacze LCD są równe sobie. Pomimo klauzuli "Compatible with HD44780" mogą one być budowane na innym processorze, mogą mieć nieco inne (zbliżone) timingi i z tego tytułu niekiedy może wystąpić problem w inicjacji, błędach w komunikacji. Dla ułatwienia kommunikacji z LCD, Bascom stosuje pewne skróty programowe, opiera sie na timingach podanych dla HD44780 z pewną niewielką nadwyżką i jeżęli ten 'zastępczy' LCD nie mieści się w tolerancji z tą nadyżką to mamy to co jest.
    Może dlatego te inne 'zastępcze dla hobbystów' LCD kosztuja $6.27 lub mniej; zamiast $65.00 za 1 sztukę.
    Te ostatnie są spotykane w urządzeniach przemsłowych.
    _Czy się psują? - oczywiście żę tak!, ale nie ma problemów z nimi.

    e marcus
  • #21
    donkoval
    Level 9  
    Cytat pewnego pana:

    ,,LCD kupiłem normalnie w sklepie. Ale jeśli o to chodzi sprawa już rozwiązana wyświetlacz wystartował tylko musiałem troszkę fuse bity pozmieniać a mianowicie zwolnić troszeczkę kontroler bo inaczej był za szybki do tego wyświetlacza i zanim ten zdążył coś wyświetlić to już następowała zmiana itd. W każdym bądź razie teraz wszystko działa jak powinno"

    Chciałem się zastosować do w/w rozwiązania problemu,ale to nie wyszło.
    Nie jestem bogaty więc chciałbym aby ten wyświetlacz zadziałał, bo to już jest drugi który nie działa. A jeżeli takie LCD są w sprzedaży to na pewno idzie je obsłużyć tylko jak?
  • #22
    M. S.
    Level 34  
    Jeśli są problemy z zbyt wolnym wyświetlaczem można spróbować taki oto manewr:

    $crystal = 2x rzeczywista częstotliwość taktowania.

    Wtedy transmisja do LCD odbywa się 2x wolniej.

    Jeśli obniżymy crystal i obniżymy rzeczywistą częstotliwość taktowania, tak że pozostanie $crystal = rzeczywista częstotliwość taktowania wtedy kompilator przeliczy wszystko i szybkość transmisji będzie podobna.

    Należy pamiętać też, że np Wait 1 będzie trwał 2s. ale z takimi kłopotami można sobie poradzić.
  • #23
    donkoval
    Level 9  
    Zmniejszam i zwiększam częstotliwość taktowania, wyświetlacz jak nie działa tak nie działa. Zakupiłem nową mege8 i ciągle kombinuje co może go obudzić.
  • #24
    bogdan_p
    Level 39  
    Czy próbowałeś wyświetlacz z odłączonymi liniami D0 - D3 od masy ?
    Po wgraniu programu jak go nazwałeś standardowego wyświetlacz działa czy nie , oczywiście z prawidłową linijką konfiguracji wyświetlacza .
  • #25
    donkoval
    Level 9  
    Tak. Dzisiaj jak kupiłem nową mege8 to odpaliłem LCD bez podpiętych pinów D0-D3 i bez R/W i bez zmian.

    Po ponownej inicjalizacji ,,initlcd" przy włączeniu na moment się pojawią jakieś chińskie znaczki i potem świeci się na stale na biało ,,10", a podświetlenie wyświetlacza jest przyciemnione.

    Dodano po 23 [minuty]:

    Po dopisaniu tych linijek:

    $lcd = &HC000
    $lcdrs = &H8000
    Config Lcdbus = 4

    pojawiło się takie coś:

    [bascom][ATmega8] Obsługa wyświetlacza.

    Mam wypięte piny. Jak wepnę te piny DB0-DB3 to tylko działa podświetlenie.
  • #26
    nsvinc
    Level 35  
    donkoval wrote:
    Mam wypięte piny.

    Dobrze że piny, a nie coś innego...
    Dokąd ty te piny 'wpinasz'?
    Dla 4bitowej magistrali do kontrolera (zgodnego z) HD44780 piny D3..D0 podłącza się do masy, a gdy nie korzystasz z odczytów, to pin R/W ma obowiązek być podłączony na stałe również do masy

    Skoro wyświetlacz wogóle cokolwiek wyświetla, to znaczy, że inicjalizacja przebiega prawidłowo. W przeciwnym przypadku widziałbyś same kwadraciki w pierwszej linii lub pusty ekran.

    Nie istnieje "za wolny" wyświetlacz. Miałem już w ręku dziesiątki wyświetlaczy (zgodnych z) HD44780 różnych producentów (od 'chińskich' po 'quality'), i nie ma szopki. Bascom przyjmuje timingi 'worst case', a takie akceptuje (i musi akceptować) każdy wyświetlacz (zgodny z) HD44780.
  • #27
    donkoval
    Level 9  
    Dobrze że piny, a nie coś innego...
    Dokąd ty te piny 'wpinasz'?

    W wyświetlaczu który mam jest 16 otworów do, których mam wlutowane ,,golpiny" (takie złote szpileczki) Dzięki taśmie (takiej jak spotykamy od dysku twardego) łączę układ z wyświetlaczem. Na tej taśmie oczywiście mam zaciśnięte piny (żeńskie), które mają swoje obudowy plastikowe nazywane złączami (w moim przypadku jest to 2 x po 8 pinów z rządku i do płytki pcb wchodzą takie podwójne 8).

    Co do wyjaśnienia kolegi pytania myślę, że się zrozumieliśmy.[/quote]
  • #28
    nsvinc
    Level 35  
    Mam głupie wrażenie że robisz ze mnie idiotę :]

    Zamiast udowadniać swoją urojoną wyższość, zastosuj się do tego co poprzednio napisałem, a wyświetlacz raczy zadziałać :] (o ile twoja jaśniepańska mość nie popełniła babola w kodzie :D:D )

    PS
    popraw tagi :]
  • #29
    donkoval
    Level 9  
    Uprzejmość działa w dwie strony :D

    Co mam poprawiać w kodzie jeżeli na podłączonym innym wyświetlaczu on działa. Zmieniałem już wiele razy kod na wiele kombinacji, niektórych magików i nic z tego nie ma.