Elektroda.pl
Elektroda.pl
X
Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

09 Kwi 2011 20:45 8010 45
  • Poziom 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??
  • Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
  • 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 .
  • Banner Multimetr Fluke 87VBanner Multimetr Fluke 87V
  • 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: basic4gl
    Zaloguj się, aby zobaczyć kod
  • Poziom 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
  • Poziom 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.
  • Poziom 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.
  • Poziom 39  
    Instrukcje w jednej linijce , ponadto nie PIN.X tylko PORT.X
  • Poziom 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.
  • Poziom 34  
    Człowieku napisz:

    Code:
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portd.1 , Rs = Portd.0
  • Poziom 9  
    Jest przecież tak napisane.
  • Poziom 34  
    Nie jest.

    Jest tak:

    Code:
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Pind.1 , Rs = Pind.0
  • Poziom 9  
    Nic to nie zmienia, jest cały czas tak samo, nic nie wyświetla tylko te 298 lub 10.
  • 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
  • Poziom 34  
    Cytat:
    wyłączyłeś podział przez 8


    M8 nie ma dzielnika zegara.
  • Poziom 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.
  • 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 .
  • Poziom 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.
  • Moderator na urlopie...
    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
  • Poziom 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.
  • Poziom 36  
    donkoval napisał:
    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
  • Poziom 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?
  • 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ć.
  • Poziom 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ć.
  • 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 .
  • Poziom 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.
  • 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.
  • Poziom 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]
  • 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 :]
  • Poziom 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.