Hallo
Ich habe einen Atmega8 und einen DS18b20 Temperatursensor.
Mein Ziel:
Die Temperatur vom DS18b20 auslesen und auf ein LCD 2*16 Anzeigen Lassen
und bei einen Bestimmten wert soll ein Relais schalten.
LCD Anzeige funktioniert und das Relais schaltet auch leider bekomme ich
keinen vernünftigen wert aus den DS18B20. Habe die Schaltung Simuliert
und eine Passende Platine dazu geätzt. Ist also alles wie bei der
Simulation.
Anbei die Schaltung(nicht gerade die Schönste).
Der Quellcode ist in Bascom.
Der Atmega8 läuft intern mit 1MHz.
Meine Versorgungspannung ist 4,95V mit Multimeter gemessen.
Der Code:
$regfile = "m8def.dat"
$crystal = 1000000
Config 1wire = Pinc.1
Config Portc.0 = Output
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , _
Db7 = Portd.3 , E = Portd.6 , Rs = Portd.7
Initlcd
Wait 1
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 ' replace
[x] with number (0-7)
Cursor Off
Dim Temp_soll As Integer
Dim Temp_ist As Integer
Dim Temp_string As String * 10
Temp_ist = 60
Cls
'######################Tempsensor##################
Dim Sc(9) As Byte
Dim Temperatur As Integer
Dim Celsius As Single
Do
1wreset
1wwrite &HCC '
Überspringe Rombefehl Seriennummer weglassen
1wwrite &H44 'messen
Waitms 1000
1wreset
1wwrite &HCC
1wwrite &HBE ' Start
Daten lesen
Sc(1) = 1wread(9) ' Gelesene
Daten ins Array
Waitms 1000
Temperatur = Makeint(sc(1) , Sc(2)) ' Die oberen
und unteren 8Bit in eine 16Bit Integer Variable speichern
Celsius = Temperatur / 16
Temp_string = Str(temp_ist)
Temp_string = Format(temp_string , "+0.0")
Locate 1 , 1
Lcd "Ist:"
If Temp_ist < -99 Or Temp_ist > 99 Then
Locate 1 , 1
Lcd Celsius ; Chr(0) ; "C"
Else
Locate 1 , 1
Lcd " " ; Celsius ; Chr(0) ; "C"
End If
Temp_string = Str(temp_soll)
Temp_string = Format(temp_string , "+0.0")
Locate 2 , 1
Lcd "Soll:"
If Temp_soll < -99 Or Temp_soll > 99 Then
Locate 2 , 10
Lcd Temp_string ; Chr(0) ; "C"
Else
Locate 2 , 10
Lcd " " ; Temp_string ; Chr(0) ; "C"
End If
If Temp_soll >= Temp_ist Then
Portc.0 = 0
Else
Portc.0 = 1
End If
If Pinc.3 = 1 And Temp_soll < 300 Then
Temp_soll = Temp_soll + 1
End If
If Pinc.2 = 1 And Temp_soll > -150 Then
Temp_soll = Temp_soll - 1
End If
Waitms 80
Loop
Motze schrieb:> Kondensatoren mag ich wirklich nicht aber der Pull-Up müsste drin sein> mit 4,7k (R3) oder sehe ich das falsch?
Ok, auf dem hingerotzten Schalt"plan" nicht zu erkennen..
Also Kondis sind PFLICHT!
Teste mal den DS solo. Gibt ja in Bascom ne Demo dazu.
Erst mal vielen dank für eure Hilfe bis jetzt.
Die Anzeige zeigt zwei Werte abwechselnd an und zwar -0,0625 und 0,01255
an.
Der Code:
$regfile = "m8def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , _
Db7 = Portd.3 , E = Portd.6 , Rs = Portd.7
Initlcd
Wait 1
Config 1wire = Portc.1
Dim Sc(9) As Byte
Dim Temperatur As Integer
Dim Celsius As Single
Do
1wreset
1wwrite &HCC '
Überspringe Rombefehl Seriennummer weglassen
1wwrite &H44 'messen
Waitms 1000
1wreset
1wwrite &HCC
1wwrite &HBE ' Start
Daten lesen
Sc(1) = 1wread(9) ' Gelesene
Daten ins Array
Waitms 500
Temperatur = Makeint(sc(1) , Sc(2)) ' Die oberen
und unteren 8Bit in eine 16Bit Integer Variable speichern
Celsius = Temperatur / 16 ' Bei 12Bit
Auflösung (default Einstellung) durch 16 dividieren oder mit 0,0625
multiplizieren
Locate 1 , 1
Lcd Celsius
Cls
Loop
End
Ich habe ein 2.2k Wiederstand verwendet hatte leider keinen 3,3k
Wiederstand. Aber es hat sich nichts geändert. Er wechselt immer noch
zwischen den zwei Werten.
mfg Mathias
Motze schrieb:
...
Dim Sc(9) As Byte
...
> Daten lesen> Sc(1) = 1wread(9) ' Gelesene
Kenne mich in Bascomp definitiv nicht aus, aber wenn ich das richtig
verstehe liest du in das Array Sc nicht alle neun Bytes ein sondern nur
eins.
Sc = 1wread(9); sollte besser sein ?
bascom gibt mir dann eine Fehlermeldung aus und zwar:
Array expected
der Code ist Kopiert und sollte laufen zumindest bei anderen war das der
Fall.
mfg Mathias
den rest nicht vergessen
Temperatur = Makeint(sc(1) , Sc(2)) ' Die oberen
und unteren 8Bit in eine 16Bit Integer Variable speichern
Celsius = Temperatur / 16 ' Bei 12Bit
Auflösung (default Einstellung) durch 16 dividieren oder mit 0,0625
multiplizieren
Locate 1 , 1
Lcd Celsius
Cls
Loop
End
steht im Datenblatt des M8 oder in jeder vernünftigen Schaltung mit AVR
drin.
VCC->GND und AVCC->GND, direkt am IC je 100nF || 10uF, VRef->GND nur
100n.
Komme gerade frisch aus der Kneipe aber genau das war das Problem jetzt
funktioniert alles...
recht herzlichen dank nochmal...
vielen dank...
habe den atmel auf 8Mhz gestellt und schon läuft alles.
mfg Mathias
Um die Sache noch zu klären was ich an Pin 3 des LCD angeschlossen habe
hier noch ein Schalt"Plan" des LCD.
vielen dank nochmal euch allen.
mfg Mathias
Schön das es funktioniert hat.
Mir ist allerdings noch ein kleiner Fehler aufgefallen.
Sobald die Temperatur unter 0 C° fällt wird nur noch Mist angezeigt :
+0.5 0000 0000 0000 1000 0008h ((0 * 256) + 8 ) / 16 = 0,5
-0.5 1111 1111 1111 1000 FFF8h ((255 * 256) + 248) / 16 = 4.095,5
Bei negativen Ergebnissen werden in dem MSB die Bits 15 - 11 auf eins
gesetzt.
http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
- OPERATION—MEASURING TEMPERATURE und folgende Abschnitte
Pseudocode
if SC(2) > 248 // Prüfen ob "Bits 15 - 11 im MSB gesetzt sind"
{
WORD Temperatur = (65535 - Temperatur) + 1 // NOT
Celsius = Temperatur / -16 // Berechnung
}
65535 - 65.528 + 1 = 8
8 / -16 = -0,5
Hier gibt es bestimmt noch Spezialisten die das besser hinbekommen.
Vielen dank für den Hinweis. Wäre mir bestimmt auch nie aufgefallen.
Zumindest nicht solange in meinem Zimmer Temperaturen über null
Herrschen.
Werde mal den Code ändern. Den gesamten Code werde ich dann nochmal hier
reinstellen.
Ist ja eigentlich ne schöne Sache Temperatursensor mit Ist Soll
vergleich und Schaltet dann bei gewissen über/Unterschreitungen ein
Relais.
Habe ja komplett alles mit Layout und das werde ich dann noch ein bissel
verändern. So was wie Kondensatoren rein(die ich ja nicht so mag) und
ein bissel hübsch machen. Vielleicht brauch ja mal jemand/e so was.
mfg Mathias
Ja ist auch eine drin keine angst. Sonst wäre mein Transistor schon
abgeraucht. Leider nicht eingezeichnet. Werde den Schaltplan auch
nochmal hübsch machen und ihn nochmal reinstellen.
Du rechnest doch mit Integer und setzt die beiden Werte über
Makeint(sc(1),sc(2)) korrekt zusammen.
Da brauchst keine seltsame Umrechnung zu machen, in Celsius stehen die
richtigen Werte.