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][MEGA8]Dodanie odczytu temperatury DS18B20

Ficu 06 Aug 2008 22:16 3077 5
  • #1
    Ficu
    Level 31  
    Witam,
    jako, że kończą się wakacje postanowiłem udoskonalić trochę soft piórnika - chcę dodać odczyt temp., tylko nie wiem gdzie ją umieścić.
    Code:
    '******************************************************************************'
    
    '*       Program Piórnik Mini wersja 1.0 Beta                                 *'
    '* Pomysł: FICU                                                               *'
    '* Programista: Jacek R (Black Jack)  Kompilator: BASCOM AVR                  *'
    '* Procesor: ATMega8 - 8 MHz.                                                 *'
    '* EEPROM: 24c64                      LCD: 2 linie po 16 znaków               *'
    '******************************************************************************'
    ' konfiguracja dla kompilatora
    $regfile = "m8def.dat"
    $crystal = 8000000

    ' konfiguracja urządzeń CPU
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    Config Rc5 = Pind.2
    Config Timer1 = Timer , Prescale = 256
    Config Sda = Portc.4
    Config Scl = Portc.5

    ' deklaracja procedur
    On Timer1 Czas_sys
    Declare Sub Godziny
    Declare Sub Wys_czas
    Declare Sub Txt_edit
    Declare Sub Ustaw_czas

    ' deklaracje zmiennych
    Dim Address As Byte , Command As Byte
    Dim Godz As Byte
    Dim Minuty As Byte
    Dim Sek As Byte
    Dim Nowy_czas As Bit
    Dim Ekran As Bit
    Dim Gora As Bit
    Dim Dol As Bit
    Dim Odswierz As Bit
    Dim Cykl As Bit
    Dim Wart_bcd As Byte
    Dim Bufor As Byte

    Dim Adr_eep As Word At &H69                                 'Taka nietypowa zmienna
    Dim Adr_low As Byte At &H69 Overlay                         'jest jedna?, mimo iż
    Dim Adr_hi As Byte At &H6A Overlay                          'zdefiniowano 3.
    Dim I As Byte

    ' deklaracje stałych
    Const Piornik_id = 0
    Const Podst_czasu = 49911                                   'przedtem 34286
    Const In_eep = 160                                          'Adresy dla EEPROM
    Const Out_eep = 161
    Const Max_eep = 8160
    Const Null = 0
    Deflcdchar 0 , 28 , 8 , 8 , 30 , 5 , 6 , 5 , 32             'Def ikony IRed

    ' program główny
    Enable Interrupts
    Enable Timer1
    Stop Timer1
    Set Nowy_czas
    Reset Ekran
    Counter1 = Podst_czasu
    Call Ustaw_czas
    Start Timer1
    Cursor Off
    Cls
    Adr_eep = 0
    Odswierz = 0
    Set Cykl
    Do
       If Nowy_czas = 1 And Ekran = 0 Then
          Call Godziny
          Call Wys_czas
       End If
       If Nowy_czas = 1 And Ekran = 1 Then
          Call Godziny
          If Gora = 1 And Adr_eep <= Max_eep Then
             Adr_eep = Adr_eep + 16
             Reset Gora
          End If
          If Dol = 1 And Adr_eep > 15 Then
             Adr_eep = Adr_eep - 16
             Reset Dol
          End If
          If Odswierz = 1 Then
             Call Txt_edit
             Odswierz = Not Odswierz
          End If
       End If
       Getrc5(address , Command)
       Command = Command And &B01111111
       Select Case Command
       Case 11 : Ekran = Not Ekran
                 Set Odswierz
                 Cls
       Case 12 : If Ekran = 1 Then
                   Set Gora
                   Set Odswierz
                  End If
       Case 13 : If Ekran = 1 Then
                   Set Dol
                   Set Odswierz
                  End If
       End Select
    Loop
    End                                                         'end program

    ' opis procedur
    Czas_sys:
       Counter1 = Counter1 + Podst_czasu
       Cykl = Not Cykl
       If Cykl = 1 Then
          Incr Sek
       End If
       Set Nowy_czas
    Return

    Sub Godziny
       If Sek = 60 Then
          Sek = 0
          Incr Minuty
          If Minuty = 60 Then
             Minuty = 0
             Incr Godz
             If Godz = 24 Then
                Godz = 0
             End If
          End If
       End If
    End Sub



    Sub Wys_czas
          Locate 1 , 5
          Wart_bcd = Makebcd(godz)
          If Godz < 10 Then
             Lcd " " ; Wart_bcd ; ":"
          Else
             Lcd Bcd(wart_bcd) ; ":"
          End If
          Wart_bcd = Makebcd(minuty)
          Lcd Bcd(wart_bcd) ; ":"
          Wart_bcd = Makebcd(sek)
          Lcd Bcd(wart_bcd) ;
          Locate 1 , 16
          Lcd Chr(0)
          Lowerline
          Reset Nowy_czas
    End Sub

    Sub Txt_edit
       Home Upper
       I2cstart
       I2cwbyte In_eep
       I2cwbyte Adr_hi
       I2cwbyte Adr_low
       I2cstart
       I2cwbyte Out_eep
       For I = 1 To 32
          I2crbyte Bufor , Ack
          If I = 17 Then
             Lowerline
          End If
          If Bufor < 128 Then
             Lcd Chr(bufor)
          Else
             Lcd " "
          End If
       Next I
       I2crbyte Bufor , Nack
       If Bufor < 128 Then
          Lcd Chr(bufor)
       Else
          Lcd " "
       End If
       I2cstop
       Reset Nowy_czas
    End Sub

    Sub Ustaw_czas
       Cls
       Call Wys_czas
       Lcd " Ustaw godzine"
       Do
          Getrc5(address , Command)
          Command = Command And &B01111111
          Select Case Command
          Case 11 : Incr Sek
                     If Sek = 60 Then
                        Sek = 0
                     End If
          Case 12 : Incr Minuty
                     If Minuty = 60 Then
                        Minuty = 0
                     End If
          Case 13 : Incr Godz
                     If Godz = 24 Then
                        Godz = 0
                     End If
          End Select
          Waitms 250
          Call Wys_czas
          Lcd " Ustaw godzine"
       Loop Until Command = 10
    End Sub


    Napisałem prosty program, do obsługi wyłącznie DS18B20 - wszystko działa, problem pojawił się dopiero jak chciałem to dodać do głównego programu.
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    Config Rc5 = Pind.2
    Config Timer1 = Timer , Prescale = 256
    Config Sda = Portc.4
    Config Scl = Portc.5
    Config 1wire = Portb.0

    Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32        ' definicja znaku stopnia


    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5

    Do
      1wreset
      1wwrite &HCC
      1wwrite &H44
      Waitms 750
      1wreset
      1wwrite &HCC
      1wwrite &HBE
      Odczyt(1) = 1wread(2)
      T = Odczyt(2)
      Shift T , Left , 8
      T = T + Odczyt(1)

      T1 = T * 0.0625

    Napis = Fusing(t1 , "#.#")
      Cls : Cursor Off : Lcd "* Temperatura *"
      Lowerline
      Lcd "Wynik: " ; Napis ; " " ; Chr(1) ; "C"
    Loop : End

    Mógłby mnie ktoś nakierować? Strasznie ciężko idzie mi pisanie programów..
  • Helpful post
    #2
    Balu
    Level 38  
    Fajnie pięknie a próbowałeś COKOLWIEK sam? Może pokażesz i powiesz co nie działa, bo oczywiście umiem skleić oba kody ale tego nie zrobię specjalnie po to,abyś Ty się czegoś nauczył!
  • #3
    Ficu
    Level 31  
    Próbowałem. Dodawałem odczyt do programu głównego za getrc5, a wyświetlanie temp w Sub Wys_czas na końcu za Lowerline. Efektem tego było wyświetlanie d dolnej linii na wyświetlaczu: Wynik: 0.0 C Us. Czyli coś namieszałem, bo powinno być najpierw w dolnej linii: Ustaw godzinę, po ustawieniu dopiero temperatura.
  • #4
    Ficu
    Level 31  
    Udało mi się coś zrobić i nawet działa, ale:
    -jak uruchamiam układ powinno pisać w dolnej linii Ustaw godzine, a jest jak na fotce niżej,
    -ustawianie godziny - jak trzymam przycisk w pilocie cały czas wysyła sygnał, a układ odbiera kod raz na 3 sek - wcześniej było 250ms (tak jak jest zdefiniowane w programie).

    [BASCOM][MEGA8]Dodanie odczytu temperatury DS18B20

    Code:
    '******************************************************************************'
    
    '*       Program Piórnik Mini wersja 1.0 Beta                                 *'
    '* Pomysł: FICU                                                               *'
    '* Programista: Jacek R (Black Jack)  Kompilator: BASCOM AVR                  *'
    '* Procesor: ATMega8 - 8 MHz.                                                 *'
    '* EEPROM: 24c64                      LCD: 2 linie po 16 znaków               *'
    '******************************************************************************'
    ' konfiguracja dla kompilatora
    $regfile = "m8def.dat"
    $crystal = 8000000

    ' konfiguracja urządzeń CPU
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    Config Rc5 = Pind.2
    Config Timer1 = Timer , Prescale = 256
    Config Sda = Portc.4
    Config Scl = Portc.5
    Config 1wire = Portb.0

    ' deklaracja procedur
    On Timer1 Czas_sys
    Declare Sub Godziny
    Declare Sub Wys_czas
    Declare Sub Txt_edit
    Declare Sub Ustaw_czas
    Declare Sub Odcz_temp

    ' deklaracje zmiennych
    Dim Address As Byte , Command As Byte
    Dim Godz As Byte
    Dim Minuty As Byte
    Dim Sek As Byte
    Dim Nowy_czas As Bit
    Dim Ekran As Bit
    Dim Gora As Bit
    Dim Dol As Bit
    Dim Odswierz As Bit
    Dim Cykl As Bit
    Dim Wart_bcd As Byte
    Dim Bufor As Byte

    Dim Adr_eep As Word At &H69                                 'Taka nietypowa zmienna
    Dim Adr_low As Byte At &H69 Overlay                         'jest jedna?, mimo iż
    Dim Adr_hi As Byte At &H6A Overlay                          'zdefiniowano 3.
    Dim I As Byte

    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5

    ' deklaracje stałych
    Const Piornik_id = 0
    Const Podst_czasu = 49911                                   'przedtem 34286
    Const In_eep = 160                                          'Adresy dla EEPROM
    Const Out_eep = 161
    Const Max_eep = 8160
    Const Null = 0
    Deflcdchar 0 , 28 , 8 , 8 , 30 , 5 , 6 , 5 , 32             'Def ikony IRed
    Deflcdchar 1 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            'Def znaku stopnia

    ' program główny
    Enable Interrupts
    Enable Timer1
    Stop Timer1
    Set Nowy_czas
    Reset Ekran
    Counter1 = Podst_czasu
    Call Ustaw_czas
    Start Timer1
    Cursor Off
    Cls
    Adr_eep = 0
    Odswierz = 0
    Set Cykl
    Do
       If Nowy_czas = 1 And Ekran = 0 Then
          Call Godziny
          Call Wys_czas
       End If
       If Nowy_czas = 1 And Ekran = 1 Then
          Call Godziny
          If Gora = 1 And Adr_eep <= Max_eep Then
             Adr_eep = Adr_eep + 16
             Reset Gora
          End If
          If Dol = 1 And Adr_eep > 15 Then
             Adr_eep = Adr_eep - 16
             Reset Dol
          End If
          If Odswierz = 1 Then
             Call Txt_edit
             Odswierz = Not Odswierz
          End If
       End If
       Getrc5(address , Command)
       Command = Command And &B01111111
       Select Case Command
       Case 30 : Ekran = Not Ekran
                 Set Odswierz
                 Cls
       Case 10 : If Ekran = 1 Then
                   Set Gora
                   Set Odswierz
                  End If
       Case 40 : If Ekran = 1 Then
                   Set Dol
                   Set Odswierz
                  End If
       End Select
    Loop
    End                                                         'end program

    ' opis procedur
    Czas_sys:
       Counter1 = Counter1 + Podst_czasu
       Cykl = Not Cykl
       If Cykl = 1 Then
          Incr Sek
       End If
       Set Nowy_czas
    Return

    Sub Godziny
       If Sek = 60 Then
          Sek = 0
          Incr Minuty
          If Minuty = 60 Then
             Minuty = 0
             Incr Godz
             If Godz = 24 Then
                Godz = 0
             End If
          End If
       End If
    End Sub

    Sub Wys_czas
          Locate 1 , 5
          Wart_bcd = Makebcd(godz)
          If Godz < 10 Then
             Lcd " " ; Wart_bcd ; ":"
          Else
             Lcd Bcd(wart_bcd) ; ":"
          End If
          Wart_bcd = Makebcd(minuty)
          Lcd Bcd(wart_bcd) ; ":"
          Wart_bcd = Makebcd(sek)
          Lcd Bcd(wart_bcd) ;
          Locate 1 , 16
          Lcd Chr(0)
          Lowerline
          Call Odcz_temp
          Napis = Fusing(t1 , "#.#")
          Lcd "     " ; Napis ; Chr(1) ; "C"
          Reset Nowy_czas
    End Sub

    Sub Txt_edit
       Home Upper
       I2cstart
       I2cwbyte In_eep
       I2cwbyte Adr_hi
       I2cwbyte Adr_low
       I2cstart
       I2cwbyte Out_eep
       For I = 1 To 32
          I2crbyte Bufor , Ack
          If I = 17 Then
             Lowerline
          End If
          If Bufor < 128 Then
             Lcd Chr(bufor)
          Else
             Lcd " "
          End If
       Next I
       I2crbyte Bufor , Nack
       If Bufor < 128 Then
          Lcd Chr(bufor)
       Else
          Lcd " "
       End If
       I2cstop
       Reset Nowy_czas
    End Sub

    Sub Ustaw_czas
       Cls
       Call Wys_czas
       Lcd " Ustaw godzine"
       Do
          Getrc5(address , Command)
          Command = Command And &B01111111
          Select Case Command
          Case 10 : Incr Sek
                     If Sek = 60 Then
                        Sek = 0
                     End If
          Case 30 : Incr Minuty
                     If Minuty = 60 Then
                        Minuty = 0
                     End If
          Case 40 : Incr Godz
                     If Godz = 24 Then
                        Godz = 0
                     End If
          End Select
          Waitms 250
          Call Wys_czas
          Lcd " Ustaw godzine"
       Loop Until Command = 20
    End Sub

    Sub Odcz_temp
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       Odczyt(1) = 1wread(2)
       T = Odczyt(2)
       Shift T , Left , 8
       T = T + Odczyt(1)

       T1 = T * 0.0625
    End Sub
  • Helpful post
    #5
    Balu
    Level 38  
    No nic dziwnego, w ustaw_czas robisz call do wys_czas który wbrew obiegowej opinii wyświetla temperaturę;] i... ustawia kursor kilka spacji za *C :) a potem sobie reta do ustaw_czas gdzie już jak widać LCD "Ustaw czas" :)
    Ot i tajemnica;]

    Pozdro ;]

    Dodano po 1 [minuty]:

    PS lowerline sux, ja bym używał locateów na twoim miejscu ;-)

    Poza tym funkcje są fajnejsze niż procedury zwracające parametry w zmiennych globalnych :]
  • #6
    Ficu
    Level 31  
    Balu wrote:
    No nic dziwnego, w ustaw_czas robisz call do wys_czas który wbrew obiegowej opinii wyświetla temperaturę;] i... ustawia kursor kilka spacji za *C :) a potem sobie reta do ustaw_czas gdzie już jak widać LCD "Ustaw czas" :)
    Ot i tajemnica;]

    Nie bardzo rozumiem :| Jak by to miało mniej więcej wyglądać?

    Używanie locateów faktycznie jest lepsze.