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
Pull Up auf der Datenleitung des DS vergessen! 2 KOhm.
Kondensatoren mag ich wirklich nicht aber der Pull-Up müsste drin sein mit 4,7k (R3) oder sehe ich das falsch?
Sag mal, gucke ich richtig und der Atmega8 hat gar keinen Masseanschluß? (Pin 8, Pin 22) Kopf kratz MfG Paul
Doch die haben Masse aber das wird vom Programm nicht angezeigt sogenannte Hidden Pins. Wie gesagt LCD und Relais zieht ja an.
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
nimm mal einen 3,3 kOhm Widerstand als Pullup, dann läuft er wohl
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
so? Do 1wreset 1wwrite &HCC 1wwrite &H44 Waitms 800 1wreset 1wwrite &HCC 1wwrite &HBE For X = 1 To 9 sc(x) = 1wread() Next
Bei deinen Quelltext hat er leider garnix angezeigt. Habe den Quellcode leicht abgeändert:
1 | $regfile = "m8def.dat" |
2 | $crystal = 1000000 |
3 | |
4 | Config Lcd = 16 * 2 |
5 | Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , _ |
6 | Db7 = Portd.3 , E = Portd.6 , Rs = Portd.7 |
7 | |
8 | Initlcd |
9 | |
10 | Wait 1 |
11 | |
12 | Config 1wire = Portc.1 |
13 | |
14 | Dim Sc(9) As Byte |
15 | Dim Temperatur As Integer |
16 | Dim Celsius As Single |
17 | Dim X As Integer |
18 | |
19 | Do |
20 | |
21 | 1wreset |
22 | 1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen |
23 | 1wwrite &H44 'messen |
24 | Waitms 1000 |
25 | 1wreset |
26 | 1wwrite &HCC |
27 | 1wwrite &HBE ' Start Daten lesen |
28 | For X = 1 To 9 |
29 | Sc(x) = 1wread() |
30 | Locate 1 , X |
31 | Lcd Sc(x) |
32 | Next ' Gelesene Daten ins Array |
33 | Waitms 500 |
34 | |
35 | |
36 | Loop |
37 | |
38 | End |
Jetzt zeigt er mir: 22222222255 an. Was ich gar nicht nachvollziehen kann. mfg Mathias
:
Bearbeitet durch User
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
So der ganze Quelltext nochmal. Aber leider keine Veränderung Obere Zeiler LCD 22222222255 Untere Zeile LCD -0,1255(0,0625) immer im Wechsel
1 | $regfile = "m8def.dat" |
2 | $crystal = 1000000 |
3 | |
4 | Config Lcd = 16 * 2 |
5 | Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , _ |
6 | Db7 = Portd.3 , E = Portd.6 , Rs = Portd.7 |
7 | |
8 | Initlcd |
9 | |
10 | Wait 1 |
11 | |
12 | Config 1wire = Portc.1 |
13 | |
14 | Dim Sc(9) As Byte |
15 | Dim Temperatur As Integer |
16 | Dim Celsius As Single |
17 | Dim X As Integer |
18 | |
19 | Do |
20 | |
21 | 1wreset |
22 | 1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen |
23 | 1wwrite &H44 'messen |
24 | Waitms 1000 |
25 | 1wreset |
26 | 1wwrite &HCC |
27 | 1wwrite &HBE ' Start Daten lesen |
28 | For X = 1 To 9 |
29 | Sc(x) = 1wread() |
30 | Locate 1 , X |
31 | Lcd Sc(x) |
32 | Next ' Gelesene Daten ins Array |
33 | Waitms 500 |
34 | |
35 | Temperatur = Makeint(sc(1) , Sc(2)) ' Die oberen |
36 | |
37 | |
38 | Celsius = Temperatur / 16 ' Bei 12Bit |
39 | Locate 2 , 1 |
40 | Lcd Celsius |
41 | |
42 | Loop |
43 | |
44 | End |
mfg Mathias
Ganz sicher 18b20 wo sollte ich den denn Kondensator anschließen?
Kondensatoren mag er doch nicht! Muss auch ohne gehen, eh unnötiger Ballast :-)
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.
Motze schrieb: > LCD Anzeige funktioniert Das ist etwas verwunderlich. Was hast du denn am Pin 3 des LCD-Modules angeschlossen?
1-wire funktioniert mit Bascom erst ab 8MHz Takt. Darunter kann das Timing nicht eingehalten werden.
Ich sehe gerade, dass 2MHz auch noch geht, aber bei 1MHz bekomme ich dein Programm nicht zum Laufen.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.