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.

[ATMEGA8][BASCOM]Problem z termometrem ATmega8 + LCD 16x2

dbraven 15 Dec 2009 17:25 6777 8
  • #1
    dbraven
    Level 10  
    Witam,

    na początku zaznaczam, że przed zamieszczeniem tego tematu, zapoznałem się z treściami z forum dotyczącymi tego zagadnienia i po ich przetestowaniu problem nie został rozwiązany.



    Na główny problem składają się 2 zagadnienia.
    1. na wyświetlaczu generowane są litery "p" choć ich tam nie powinno być.
    2. temperatura sczytana z czujnika DS1820 wynosi 0*C choć w pokoju temperatura wynosi 23*C.

    Zamieszam kod programu w BASCOMIE:
    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config 1wire = Portb.0
    Dim Temp(2) As Byte
    Declare Sub Od
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    Do
    Cursor Off
    Locate 1 , 1
    Lcd "TERMOMETR"
    Call Od
    If Temp(2) > 0 Then
    Locate 2 , 1
    Lcd "                "
    Locate 2 , 1
    Lcd "TEMP: -" ; Temp(1) ; Chr(0) ; "C"
    Else
    Locate 2 , 1
    Lcd "                "
    Locate 2 , 1
    Lcd "TEMP: " ; Temp(1) ; Chr(0) ; "C"
    End If
    Wait 1
    Loop
    End
    Sub Od
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Temp(1) = 1wread(2)
    1wreset
    If Temp(2) > 0 Then
    Temp(1) = 256 - Temp(1)
    End If
    Temp(1) = Temp(1) / 2
    End Sub

    Uprzedzając pytania, które często się pojawiają:
    -Program został poprawnie wgrany i zweryfikowany.
    -LCD nie ma zimnych lutów i działa z innymi programami.
    -Na zasilaniu Atmegi8 znajduje się kondensator 4,7uF i 100nF.
    -Do pinu resetu przyłożone jest napięcie poprzez rezystor 10kΩ.
    -Rezystor podciągający do magistrali 1wire ma wartość 4,7kΩ.
    -Wszystkie kable użyte przy konstrukcji układu stykają.
    -Kwarc przy procesorze ma wartość 8MHz i akompaniują mu 2 kondensatory 22pF.
    -Atmega8 użyta przy tym projekcie działa z innym softem w innych układach.
    -Parametry zasilacza: 5V 0,5A.
    [ATMEGA8][BASCOM]Problem z termometrem ATmega8 + LCD 16x2 [ATMEGA8][BASCOM]Problem z termometrem ATmega8 + LCD 16x2

    Proszę o pomoc w rozwiązaniu problemu i wskazaniu błędów w kodzie.
    Pozdrawiam Dbraven
  • #2
    Wojtek75
    Level 24  
    dbraven wrote:

    -Kwarc przy procesorze ma wartość 8MHz i akompaniują mu 2 kondensatory 22pF.

    To napisz jeszcze jak ustawiłeś fuse bity.
  • #3
    dbraven
    Level 10  
    Wszystkie fusebity są w stanie OFF sprawdziłem to za pomocą nakładki na avrdude gui Burn-O-Mat.
  • #4
    sp3ots
    Level 38  
    Witam !
    Wgrałem ten program do megi8, przedtem dopisałem przed liną Do, CLS.
    Program działa źle pokazuje PEMP: -72stopnie C po podgrzaniu czujnika temperatura maleje -63...
    Pozdrawiam. Stefan

    Dodano po 4 [minuty]:

    Pomyłka nie PEMP a TEMP: -72

    Dodano po 16 [minuty]:

    Zmieniłem 2 linie:
    Dim Temp(2) As Integer
    Temp(1) = Temp(1) / 16
    Teraz pokazuję 22stopnie i po podgrzaniu idzie w górę.
    Powodzenia życzę. Stefan
  • #5
    Wojtek75
    Level 24  
    sp3ots wrote:
    Witam !
    Wgrałem ten program do megi8, przedtem dopisałem przed liną Do, CLS.
    Program działa źle pokazuje TEMP: -72stopnie C po podgrzaniu czujnika temperatura maleje -63...

    Kod działa ok tylko użyłeś inny typ czujnika ma być DS18S20 (DS1820), a nie DS18B20.
    dbraven wrote:
    Wszystkie fusebity są w stanie OFF sprawdziłem to za pomocą nakładki na avrdude gui Burn-O-Mat

    hmm.. rozumiem, że masz do dyspozycji programator równoległy.
  • #6
    dbraven
    Level 10  
    Posiadam programator USBasp na magistrali USB.
  • #7
    biglolo94
    Level 16  
    Chcesz to moge zapodać ci włąsny kod ktory zawsze działa i napewno zadziała też u ciebie
  • #8
    dbraven
    Level 10  
    spoko zamieść go chociaż sam nie wiem tyle konfiguracji ile testowałem.
    jednak byłbym wdzięczny pozdrawiam =D
  • #9
    biglolo94
    Level 16  
    Code:
         $regfile = "m8def.DAT"                                'deklaracja procesora, w tym wypadku Atmega16
    
    $crystal = 8000000                                          'deklaracja cześtotlwiości pracy
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    Cursor Off

    '**** Termometr ****
    Config 1wire = Portb.0
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte                                        'deklaracja zmiennej do odczytu kodów ID
    Dim W As Byte
    Dim B As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników
    W = 1wirecount()
    Cls
    Locate 1 , 1
    Lcd W
    Wait 1
    Cls
    Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
    Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu

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

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

     If Dsid2(8) = Crc8(dsid2(1) , 7) Then
     Locate 2 , 1
     Lcd "  Czujnik 2 OK  "
     Wait 2
     Locate 2 , 1
     For B = 1 To 8
     Lcd Hex(dsid2(b))
     Next
     Wait 2
     end if
    Cls

    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza

    Do

       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
       1wwrite &HBE
       I2 = 1wread(2)
    '---------------------------------
    '--------konwersja temp dla wszystkich dsow
       1wreset
       1wwrite &HCC
       1wwrite &H44

       Wait 1

       I1 = I1 * 10
       I1 = I1 / 16
       'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")                                 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Locate 2 , 1
       Lcd "1" ; Chr(7) ; ": " ; Ss ; Chr(0)


       I2 = I2 * 10
       I2 = I2 / 16
       'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")                                 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Locate 2 , 1
       Lcd "2" ; Chr(7) ; ": " ; Ss ; Chr(0)

       Loop


    Mam nadzieje ze skumasz o co biega, a i zajrzyj jeszcze na Link