Sie sind hier: Home » ES-Geber » Programm ESG

'##############################################################
'Temperaturmesschaltung mit serieller Ausgabe für die Erdsonde
'
' file: 1-wire zu seriell_Text.bas
'##############################################################

'Programm für den uP in der Erdsonde, der die Temperatur von einem DS18S20 in einen
'seriellen Text umsetzt. Das °-Zeichen [hier chr(223)] zeigt gleichzeitig das Ende der Übertragung an.
'Die Temperatur wird so im Klartext übertragen.


$regfile = "attiny85.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 8000000                                          '8MHz, interner RC-Oszi ohne Teiler (mit 1MHz geht 1-wire NICHT)

Declare Function Decigrades(BYVAL sc(9) as byte) as integer

'
'=========================== serielle Ausgabe ==================================

Dim Text as string * 20                                     'max 20 Zeichen für die serielle Ausgabe
Dim Baudrate as Word
Baudrate = 1200
'serielles Port ist PORTB.4


'=========================== 1-Wire Konfiguration ==============================
Config 1wire = PortB.3                                      '1-Wire-Port

Dim Sc(9) as byte                                           'Scratchpad Bytes 0-8, 9 Bytes, 72 bits incl CRC

Dim Temp_Adr(8) As Byte

Temp_Adr(1) = &h10                                          'fixe Adresse des Temp-Sensor
Temp_Adr(2) = &h4A
Temp_Adr(3) = &h66
Temp_Adr(4) = &h8D
Temp_Adr(5) = &h02
Temp_Adr(6) = &h08
Temp_Adr(7) = &h00
Temp_Adr(8) = &hB1

Dim Sondentemperatur as Integer
Dim Temperatursingle as Single
Dim TempKomma as String * 10

 

'*******************************************************************************
'***************************** Programmstart ***********************************
'*******************************************************************************


'Hauptprogramm

Do
     wait 1
     gosub Temperaturmessung                                'erst Temperatur messen
     waitms 10

     if sondentemperatur = 9998 then
        Text = " AdrFehler "
        serout Text , 0 , B , 4 , Baudrate , 0 , 8 , 1
        if sondentemperatur = 9999 then
           Text = " CRCFehler "
           serout Text , 0 , B , 4 , Baudrate , 0 , 8 , 1
        endif
     else
        TemperaturSingle = Sondentemperatur / 10
        TempKomma = Fusing(TemperaturSingle , "##.#")         'Komma festlegen
        Text = Format(TempKomma , "+0000") + chr(223)         'Zahlenausgabe formatieren und Gradzeichen anhängen
        if Temperatursingle > 100 then Text = " --.- "
        if Temperatursingle < -100 then Text = " --.- "

        serout Text , 0 , B , 4 , Baudrate , 0 , 8 , 1

     endif
     wait 10                                                'alle 10 sec eine Messung

Loop

'_______________________________________________________________________________

Temperaturmessung:                                          'die Temperaturmessung anstossen (Konvertierung starten)
   1wreset                                                  '1-Wire-Bus zurücksetzen
   1wwrite &HCC                                             'Adressromīs überspringen
   1wwrite &H44                                             'Temperaturkonverion für alle anstossen
   wait 1                                                   'Konvertierzeit
   1wverify Temp_Adr(1)                                     'sendet "Match ROM "
   if err = 1 then                                          'Error = 1 Fehler aufgetreten
      Sondentemperatur = 9998                               'damit die Stelle nicht leer bleibt, 9998 = Adressmatchfehler
   elseif err = 0 then                                      'Sensor hat geantwortet
      1wwrite &HBE
      Sc(1) = 1wread(9)                                     '9 Bytes in Array einlesen
      if sc(9) = crc8(sc(1) , 8) then
         Sondentemperatur = DeciGrades(sc(9))               'Umwandlung in ein Integer-Word (-32768...32767) zum abspeichern
      else
          Sondentemperatur = 9999                           'damit die Stelle nicht leer bleibt, 9999 = CRC-Fehler
      end if
   endif
Return

'-----------------------------------------------------------

Function Decigrades(byval Sc(9) As Byte)
   Dim Tmp As Byte , T1 As Integer , T2 As Integer

   Tmp = Sc(1) And 1                                        'für 0.1C Genauigkeit, Bit 0 ausmaskieren
   If Tmp = 1 Then Decr Sc(1)                               'wenn 1 dann 1 abziehen
      T1 = Makeint(sc(1) , Sc(2))                           'Umwandeln in Integerwert, Anzahl 1/2° (Temp-Schritt ist 0.5°C)
      T1 = T1 * 50                                          'x50, da 1/100°-Schritte
      T1 = T1 - 25                                          'gemäss DS18S20 data sheet 0.25(*100) abziehen
      T2 = Sc(8) - Sc(7)
      T2 = T2 * 100
      T2 = T2 / Sc(8)
      T1 = T1 + T2
      Decigrades = T1 / 10                                  'Anzahl 1/10°C
End Function

'_______________________________________________________________________________

crlf:
   Text = chr(&h0D) + chr(&h0A)
   serout Text , 0 , B , 4 , Baudrate , 0 , 8 , 1
Return

Seriellaus:
   serout Text , 0 , B , 4 , Baudrate , 0 , 8 , 1
Return

'_______________________________________________________________________________

End