Hallo,
hier meimein Test-Code. Musst nur die Port's und LCD anpassen.
Funktioniert ohne Probleme mit Minuszeichen und Kommastellen.
'****************** Test-Platine ************************
'* ist ein Testmodul für Digital Temperatur-Sensoren *
'* [DS18x20] DS18S20 ist ein 9 Bit Family Adr &H10 *
'* und DSB20 ein 12 Bit Family Adr &H28 *
'* somit große Unterschiede bei der "Empfindlichkeit" *
'* Das lesen der Bit's ist somit auch Unterschiedlich. *
'************************************************* *******
$regfile "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 40
$baud = 19200
'### LCD Verbindungen mit Controller###
Lcd_db4 Alias Portd.5
Lcd_db5 Alias Portd.4
Lcd_db6 Alias Portd.3
Lcd_db7 Alias Portd.2
Lcd_e Alias Portd.6
Lcd_rs Alias Portd.7
Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs
Config Lcd = 16 * 2 'dies ist die Kennung für Lib Lcdpin
Cursor Off Noblink 'Aus und nicht blinken
Lcdinit
Waitms 100
'für Test die am Port B.0 angeschlossenen Temperatursensoren
Declare Sub Ds1820_alleseriennummern()
'Temperatursensor Anschluß an Portpin B.0
Dim 1wtemp_adresse_1(As Byte ' Adresse des Temperatursensors 1
Dim 1wtemp_adresse_2(As Byte ' Adresse des Temperatursensors 2
Dim Temp_bytes(9) As Byte
Dim Tempdif As Integer
Dim Tempdif1 As Integer 'Variable zur Temp. Berechnung DeziGrad
Dim Temp1 As Single
Dim Temp2 As Single
'Format für Single zwei Nachkommastellen
Config Single = Scientific , Digits = 1 'wenn 2 benötigt Dann Digits = 2 (macht aber kein Sinn)
'Temperatursensoren DS 18S20 an PortB.0 (Bascom Unterprogramm einbinden)
Config 1wire = Portb.0 'Temperatursensor 1und2
Portb.0 = 1 'Port auf H schalten
'------Temperatursensor erkennen-------
'testet die am Portpin B.0 angeschlossenen Temperatursensoren
Call Ds1820_alleseriennummern()
1wtemp_adresse_1(1) = 1wsearchfirst() 'ist der erste gefundene Sensor
1wtemp_adresse_2(1) = 1wsearchnext() 'suche nächsten
'1wtemp_adresse_3(1) = 1wsearchnext() 'wenn noch mehr erweitern
Cls
Do
'Temperatursensoren Daten einlesen
Gosub Temperaturmessung
' Print " Temp1 " ; Temp1
' Print " Temp2 " ; Temp2
'nun was anzeigen
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd " Temp1 " ; Temp1
Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte
Lcd " Temp2 " ; Temp2
Loop
End
Temperaturmessung:
' bei allen Sensoren den Messvorgang starten
1wreset
1wwrite &HCC ' SKIP ROM, alle Sensoren ansprechen
1wwrite &H44 ' CONVERT T, Temperatur messen
'Zeit zum Messen geben
Waitms 50
'===== erster Temp.-Sensor ist ein S Typ=====
1wreset
1wverify 1wtemp_adresse_1(1)
1wwrite &HBE ' Read Scratchpad, Temperatur auslesen
'Zeit zum Messen geben
Waitms 100
Temp_bytes(1) = 1wread(
Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen
Tempdif = Tempdif * 50
Tempdif = Tempdif - 25.6
Tempdif1 = Temp_bytes(- Temp_bytes(7)
Tempdif1 = Tempdif1 * 100
Tempdif1 = Tempdif1 / Temp_bytes(
Tempdif = Tempdif + Tempdif1
Temp1 = Tempdif / 100
'(
'===== zweiter Temp.-Sensor wenn auch ein S Typ =====
' Anfrage senden
1wreset
1wverify 1wtemp_adresse_2(1)
1wwrite &HBE ' Read Scratchpad, Temperatur auslesen
Temp_bytes(1) = 1wread(
Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen.
Tempdif = Tempdif * 50
Tempdif = Tempdif - 25.6
Tempdif1 = Temp_bytes(- Temp_bytes(7)
Tempdif1 = Tempdif1 * 100
Tempdif1 = Tempdif1 / Temp_bytes(
Tempdif = Tempdif + Tempdif1
Temp2 = Tempdif / 100
'Zeit zum Messen geben
Waitms 10
')
'===== erster Temp.-Sensor wenn es ein B Typ ist =====
' Anfrage senden
1wreset
1wverify 1wtemp_adresse_2(1)
1wwrite &HBE ' Read Scratchpad, Temperatur auslesen
'Zeit zum Messen geben
Waitms 100
Temp_bytes(1) = 1wread(
Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen.
Tempdif = Tempdif / 8 'hier der Unterschied
Tempdif = Tempdif * 50
Tempdif = Tempdif - 25.5
Tempdif1 = Temp_bytes(- Temp_bytes(7)
Tempdif1 = Tempdif1 * 100
Tempdif1 = Tempdif1 / Temp_bytes(
Tempdif = Tempdif + Tempdif1
Temp2 = Tempdif / 100
Return
'-------------------------------------------------------------------------------
'############# nach Neustart Temperatursensor Test ###############
'wird dieser Test Erfolgreich beendet wird die "Messung" oben in den Variablen
'geschrieben [1wtemp_adresse_1(1)] ist der erste Sensor und
'und [1wtemp_adresse_2(1)] ist der zweite usw.
'Gibt die Seriennummer aller Sensoren des Bus über COM(TTL) aus.
'wenn Hardware-Fehler wird dieser angezeigt.
Sub Ds1820_alleseriennummern()
Local Crc As Byte
Local I As Integer
Local Anzahl As Integer
Dim Adresse(As Byte
Adresse(1) = 1wsearchfirst() 'prüft den ersten Teilnehmer am Bus
If Err = 0 Then 'Wenn err, dann gibt es keinen Sensor
'ist nur für Info die Hex-Adresse ist "Name" mit dieser Kenntnis
'kannst Du mit [1wwrite &H55 und 1wwrite Sensor1_id("Name") , 8
'jeden einzeln ansprechen. Mach bei mehreren Sensoren Sinn.
Print "sind Hex-Adresse der Ds1820"
'ab hier prüfen
Do
Crc = Crc8(adresse(1) , 7)
If Crc <> Adresse(Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
For I = 1 To 8
Print Hex(adresse(i)) ;
Print " ";
Next
Adresse(1) = 1wsearchnext() 'nächste suchen
Loop Until Err = 1
End If
Anzahl = 1wirecount() 'Anzahl der Sensoren
Print "Anzahl der Sensoren am Bus: " ; Anzahl
Print "Test abgeschlossen"
Print "Hauptprogramm wird gestartet"
Wait 5
End Sub
Dim Sngeeprom As Single 'Single to/from EEPROM
Dim Bytsngeep(4) As Byte At Sngeeprom Overlay
Dim Wrdaddr As Word 'EEPROM address
Dim Byttmp0 As Byte 'Temporary byte variable
Dim Sngtmp0 As Single 'Temporary single variable
'Declare subs
Declare Sub Eepromwritesng(byref Sngsingle As Single)
Declare Sub Eepromreadsng(byref Sngsingle As Single)
Wrdaddr = 11 'EEPROM start address
Sngtmp0 = 123.456 'Single to be stored in EEPROM
Call Eepromwritesng(sngtmp0) 'Store sngTmp0 to EEPROM
Wrdaddr = 11
Call Eepromreadsng(sngtmp0) 'Retrieve sngTmp0 from EEPROM
'================================================= =============================
Sub Eepromwritesng(byref Sngsingle As Single)
'Decode sngSingle to 4 bytes of bytSngEEP for writing to EEPROM
'Input sngSingle is set to sngEEPROM, overlayed with bytSngEEP(i), i=1...4
'The 4 bytes bytSngEEP(i)are written to EEPROM
'Input: sngSingle to be decoded & written to EEPROM
' wrdAddr first EEPROM address
Sngeeprom = Sngsingle 'Set input
For Byttmp0 = 1 To 4
Writeeeprom Bytsngeep(byttmp0) , Wrdaddr
Incr Wrdaddr
Next Byttmp0
End Sub
'================================================= =============================
Sub Eepromreadsng(byref Sngsingle As Single)
'Encode 4 bytes read from EEPROM to sngSingle
'The 4 bytes are read to bytSngEEP(i), i=1...4
'bytSngEEP is overlayed @ sngEEPROM
'sngEEPROM is set to output sngSingle
'Input: wrdAddr first EEPROM address
'Output: sngSingle encoded to single variable read from EEPROM
For Byttmp0 = 1 To 4
Readeeprom Bytsngeep(byttmp0) , Wrdaddr
Incr Wrdaddr
Next Byttmp0
Sngsingle = Sngeeprom 'Set output
End Sub
Hoffe es Hilft weiter.
Lesezeichen