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

[Atmega8][Bascom] nie inicjuje wyświetlacza LCD

DJ Davi 28 Wrz 2008 21:38 3716 9
  • #1 28 Wrz 2008 21:38
    DJ Davi
    Poziom 21  

    Po przeczytaniu wielu postów napisałem program który ma wyświetlać na wyświetlaczu LCD Napięcie , prąd oraz temp. Chciałem to wykorzystać do zasilacza, którego właśnie buduje. jednak po zaprogramowaniu procka wyświetlacz mi się nie inicjuje (zaświecają się kwadraty w pierwszej lini). Czy jest jakiś błąd w moim programie ? Proszę o sprawdzenie.

    Code:
    $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
    
    $crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

    Config Lcd = 20 * 2                                         'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)
                                            'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)

    '*************************************WAŻNE**********************************************
    'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
    Config 1wire = Portd.5                                      'deklaracja portu na którym będą podpięte DS18b20
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja wewnętrznego
          'przetwornika A/C
          Config Portd.0 = Output
    Dim I1 As Integer , Ss As String * 6
    Dim Dsid1(8) As Byte
    Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
    Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników
    Dim Wart_ac As Word
    Dim Wart_ac2 As Word                                        'zmienna na wartość odczytaną




          'z przetwornika
    Dim V As Single
    Dim A As Single                                             'zmienna przechowująca obliczoną
          'wartość zmierzonego napięcia
    Dim Wart_nap As String * 4
    Dim Wart_p As String * 4                                    'zmienna, do której wpisywana
          'zostaje przetworzona wartość
          'zmiennej V na tekst
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    Deflcdchar 7 , 4 , 10 , 10 , 14 , 14 , 31 , 31 , 14         'ZNAK TERMOMETRA
    Deflcdchar 1 , 32 , 32 , 2 , 20 , 14 , 5 , 8 , 32           'znak wiatraka
    Cursor Off                                                  'Wyłącza kursor
    Waitms 100
    W = 1wirecount()
    Cls
                                                       'Znajdź pierwszy czujnik podpięty do portu
    Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu

    '*******************Odczyt numerów ID czujników temperatury*********************

    If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
      For B = 1 To 8
     Next
    End If
    Cls

    '*******************koniec odczytu ID czujników temperatury*********************

    Do
    '--------konwersja temp dla wszystkich dsow
       1wreset
       1wwrite &HCC
       1wwrite &H44
    Waitms 50


       1wreset
       1wwrite &H55 2
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    '---------------------------------


    '****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********


       I1 = I1 * 10
       I1 = I1 / 16
       If I1 > 0 Then                                           'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i1)
       Ss = Format(ss , "  0.0")

       Locate 2 , 2                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "Temp =" ; Ss ; Chr(0) ;
       Else
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 2 , 2                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "Temp =" ; Ss ; Chr(0) ;
       End If

       If I1 > 45 Then
       Portd.0 = 0
       Locate 2 , 19
       Lcd Chr(1)
       End If

    Start Adc                                                   'uruchamia wbudowany przetwornik

                                                                 'początek pętli programu
     Wart_ac = Getadc(1)                                        'odczytanie wartości z wejścia
                                                                 'ADC1 mikrokontrolera



     V = Wart_ac * 0.0049                                       'zamiana odczytanej wartości
                                                         'z A/C na napięci                                                                                                    'Wart_ac * ok. 4,8 mV
     V = V * 4.8
      V = V * 2
     Wart_nap = Fusing(v , "#.&&")                              'formatowanie wartości zmiennej
          'V do do formatu x.xx i zamiana
          'tej wartości na postać tekstową

    Locate 1 , 2                                                'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd ; Wart_nap ; "V"

      Wart_ac2 = Getadc(2)                                      'odczytanie wartości z wejścia
          'ADC1 mikrokontrolera



     A = Wart_ac2 * 0.0049                                      'zamiana odczytanej wartości
                                                                'z A/C na napięcie
                                                                 'Wart_ac * ok. 4,8 mV
    A = A * 4.8
     A = A * 2
     Wart_p = Fusing(a , "#.&&")                                'formatowanie wartości zmiennej
          'V do do formatu x.xx i zamiana
          'tej wartości na postać tekstową
    Locate 1 , 10                                               'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd ; Wart_p ; "A"
     Loop
     End

    0 9
  • #2 28 Wrz 2008 22:07
    mirekk36
    Poziom 42  

    deklarację pinów wyświetlacza LCD ładnie masz w programie i dobrze. To że wyświetlacz wyświetla w pierwszej linii same kwadraciki to o tyle dobrze, że możesz być pewien, że jest on w porządku tylko nie został prawidłowo zainicjalizowany.

    a w przypadku Bascoma i tego kodu nie trzeba specjalnej inicjalizacji.

    podejrzewam, że na 100% masz jednak jakiś błąd w połączeniach wyświetlacza w porównaniu do zdefiniowanych pinów w programie

    albo co często się zdarza początkującym - nie podłączyłeś pinu R/W wyświetlacza do GND

    0
  • #3 01 Paź 2008 22:35
    DJ Davi
    Poziom 21  

    Połączenia wyświetlacza z atmega przemierzyłem kilkukrotnie. R/W podłączone do GND. Napisałem krótki program do sprawdzenia samego układu ale i na nim wyświetla tylko kwadraciki.. Sprawdzałem ten programik już na kilku AVR-ach. Jak sprawdzić wyświetlacz żeby być na 100% pewny , że jest sprawny?
    A to ten programik do sprawdzenia:

    Code:
    $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
    
    $crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

    Config Lcd = 20 * 2                                         'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)



    Do
    Lcd "sdfiso"
    Lowerline
    Lcd "dfd"

     Loop
     End

    0
  • #4 02 Paź 2008 09:18
    mirekk36
    Poziom 42  

    Spróbuj dać przed pętlą Do Loop - jeszcze polecenie initlcd, cls itp - żeby tak "ręcznie" wymusić inicjalizację

    0
  • #5 02 Paź 2008 17:24
    pio_05
    Poziom 11  

    Jeśli wszystko jest dobrze podłączone to program MUSI działać. Wniosek z tego jest taki że masz jakiś błąd w podłączeniu.

    0
  • Pomocny post
    #6 02 Paź 2008 22:15
    wojtek2112
    Poziom 12  

    Witam ! Miałem podobny efekt na LCD graf . Połączenia były prawidłowe , program napisany poprawnie fuse bity ustawione prawidłowo a wyświetlacz czysty i tylko co jakiś czas pokazywały się małe śmieci . Okazalo się że przyczyną było złe ustawienie parametrów zakładki CHIP w Kompilatorze Bascoma ( za niskie parametry HW stack , Soft stack i Framesize ). Pozdrawiam .

    Jeszcze jedna sprawa . Według twojego programu wykorzystujesz
    do podłączenia LCD porty mikrokontrolera używane do SPI . A więc po
    zaprogramowaniu układu lepiej odłączyć programator gdyż może mieć wpływ na prawidłowe działanie twojego układu .

    0
  • #7 02 Paź 2008 22:40
    DJ Davi
    Poziom 21  

    LCD już wyświetla wszystko tak jak należy.
    Dziękuje za pomoc i zamykam temat.

    0
  • #8 13 Cze 2009 17:33
    gbtronik
    Poziom 11  

    Przed zamknięciem tematu mógłbyś napisać co było przyczyną problemu. Pozdrawiam.

    0
  • #9 13 Cze 2009 17:39
    Robewit
    Poziom 26  

    Zgadzam się z przedmówcą, najpierw prosisz o pomoc, później nie chcesz podzielić się swoimi doświadczeniami.
    Napisz jak wybrnąłeś z sytuacji.

    0
  • #10 13 Cze 2009 18:43
    emarcus
    Poziom 35  

    Robewit napisał:
    Zgadzam się z przedmówcą, najpierw prosisz o pomoc, później nie chcesz podzielić się swoimi doświadczeniami.
    Napisz jak wybrnąłeś z sytuacji.


    Moze nawet nie znalazl przyczyny.
    Wiadomo ze, mial zle podlaczony LCD!
    Prawdopodobnie nie byl prawidlowo podlaczony RS.

    0