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

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

donkoval 09 Kwi 2011 20:45 8493 45
  • #1 9380583
    donkoval
    Poziom 10  
    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 9380768
    bogdan_p
    Poziom 39  
    Cytat:
    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 9380837
    M. S.
    Poziom 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.
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #4 9380848
    donkoval
    Poziom 10  
    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
  • #6 9380897
    donkoval
    Poziom 10  
    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 9380900
    bogdan_p
    Poziom 39  
    Instrukcje w jednej linijce , ponadto nie PIN.X tylko PORT.X
  • #8 9380935
    donkoval
    Poziom 10  
    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 9380982
    donkoval
    Poziom 10  
    Jest przecież tak napisane.
  • #12 9381053
    donkoval
    Poziom 10  
    Nic to nie zmienia, jest cały czas tak samo, nic nie wyświetla tylko te 298 lub 10.
  • #13 9381057
    bogdan_p
    Poziom 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 9381088
    donkoval
    Poziom 10  
    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 9381164
    bogdan_p
    Poziom 39  
    Kolego M.S. masz rację M8 nie ma dzielnika mój błąd .
    Cytat:
    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 9382327
    donkoval
    Poziom 10  
    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 9383595
    piotrva
    VIP Zasłużony dla elektroda
    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 9383600
    donkoval
    Poziom 10  
    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 9384209
    Konto nie istnieje
    Poziom 1  
  • #21 9384259
    donkoval
    Poziom 10  
    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 9386728
    M. S.
    Poziom 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 9388616
    donkoval
    Poziom 10  
    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 9388822
    bogdan_p
    Poziom 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 9389350
    donkoval
    Poziom 10  
    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 9389965
    nsvinc
    Poziom 35  
    donkoval napisał:
    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 9391948
    donkoval
    Poziom 10  
    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 9391992
    nsvinc
    Poziom 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 9392034
    donkoval
    Poziom 10  
    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.
REKLAMA