Hallo, ich bin zur Zeit daran einen Thermometer zu Programmieren. Ein Bekannter hat mir dabei auch schon geholfen, jedoch hat er sich selbst auch noch nie mit diesem Sensor beschäftigt und macht selbst auch weniger mit Bascom. Als µC habe ich einen Atmega8. Der Temperatursensor ist ein DS18B20 Die 7-Segment Anzeigen haben eine gemeinsame Anode, welche über NPN Transistoren an +5V liegen. Der Atmega8 ist so belegt: Portd. 0 = a der Anzeigen Portd. 1 = b der Anzeigen ... Portd. 6 = g der Anzeigen Portb. 0 = Anzeige 1 Portb. 1 = Anzeige 2 Portb. 2 = Anzeige 3 Portb. 3 = Sensor Das Programm zur Ansteuerung der 7-Segment-Anzeige ist bereits geschrieben, jedoch weiß ich nicht, wie ich den Sensor auslese uns anschließend den Wert auf dem Displan ausgebe. Es genügt eine Anzeige in ganzen Schritten. Das bereits geschriebene Programm ist im Anhang als Textdokument. Ich hoffe auf Hilfe :) Gruß Jochen
Hallo, du brauchst so was wie:
1 | dim busy as byte |
2 | dim Scratch(9) as byte |
3 | Config 1wire = Porta.0 ' 1wire Pin, Pulup nicht vergessen |
4 | 1wreset ' reset 1wire |
5 | 1wwrite skip_rom ' adressierung überspringen |
6 | 1wwrite convert_t ' temperatur messen |
7 | do
|
8 | busy = 1wread() |
9 | loop until busy = &HFF ' warten bis fertig, ca 750 ms |
10 | 1wreset ' reset 1wire |
11 | 1wwrite skip_rom ' adressierung überspringen |
12 | 1wwrite read_ram ' scratch lesen |
13 | for i=1 to 9 |
14 | Scratch(i) = 1wread() ' 9 byte in Ram |
15 | next
|
jetzt hast du in Scratch(1) das Vorzeichen und in Scratch(0) die Temperatur in 0.5 Grad Celsius. Man sollte aber noch die CRC auswerten. Das ist mal schnell aus dem Kopf da ich nichts mehr mit Bascom mache. Gruß Rene
Hallo Jochen, die wirklichen Probleme gehen erst los, wenn durch das Multiplexen das Timing des 1wire zerhauen wird. Seit wann kann man den Prescale eines Timers eigentlich auf "5" setzen?
Für das Timing kann man ja den Timer solange deaktivieren, dass ist doch nicht das Problem
Danke erstmal für die Antworten. Das der Prescale auf 5 steht ist falsch ... den habe ich eben auf 8 geändert.
Timer schrieb: > Für das Timing kann man ja den Timer solange deaktivieren, dass ist doch > nicht das Problem Das wirst du dann in der Anzeige bemerken, da die Bascom Befehle für 1wire schon mal mehrere ms dauern. So einfach geht das nun wieder nicht.
Ich hab mir ein Aquariumthermoter mit nem DS18S20 gebaut und das dort auch so gemacht. Alle 60 sek wird der Sensor ausgelesen solange der Interrupt fürs Multiplexing aus und wieder ein. Vielleicht ne Sekunde sind die Anzeigen aus oder weniger und das stört eig wenig. Weil wenn man draufschaut dann sind sie meistens eh an.
So, der Code wäre fertig, jedoch gibt Probleme: Die Anzeige zeigt immer nur "00" Es ist alles so beschalten, wie oben beschrieben, jedoch mit dem Unterschied, dass der Sensor nun an Portd. 7 dran hängt. Für weitere Hilfe wäre ich sehr dankbar :)
Kann es sein das du Read_temp nicht aufrufst?
1 | Do
|
2 | |
3 | Disable Timer0 ' Interrupts ausschalten |
4 | Portd = &B01111111 ' alle Segmente ausschalten |
5 | Portb.0 = 0 : Portb.1 = 0 : Portb.2 = 0 ' alle Displays ausschalten |
6 | |
7 | gosub Read_temp |
8 | |
9 | If Vorzeichen = 1 Then |
10 | Display_numbers(1) = 10 |
11 | Else
|
12 | Display_numbers(1) = 11 |
13 | End If |
14 | |
15 | Display_numbers(2) = Temperatur / 10 |
16 | Display_numbers(3) = Temperatur Mod 10 |
17 | |
18 | Enable Timer0 ' Interrupts anschalten |
19 | |
20 | Wait 10 ' 10 Sekunden warten |
21 | |
22 | Loop
|
das MSB kann nur $00 oder $FF sein.
1 | If Scratch(2) >= 248 Then |
Gruß Rene
1 | If Scratch(2) >= 248 Then |
2 | B1 = &HFF - Scratch(1) |
3 | B2 = &HFF - Scratch(2) |
4 | Vorzeichen = 1 |
5 | Else
|
6 | Vorzeichen = 0 |
7 | End If |
8 | |
9 | T1 = B1 / 16 |
10 | T2 = B2 * 16 |
11 | Temperatur = T1 + T2 |
B1 ist immer 0, vieviel ist 0 / 16 ?
1 | if Scratch(2) = &HFF then |
2 | TempRead = &HFF - Scratch(2) |
3 | TempRead = TempRead / 2 |
4 | Vorzeichen = 1 |
5 | else
|
6 | TempRead = Scratch(2) / 2 |
7 | Vorzeichen = 0 |
8 | endif
|
9 | |
10 | Temperatur = TempRead - 0.25 |
11 | T1 = Scratch(9) + Scratch(8) |
12 | T1 = T1 / Scratch(9) |
13 | Temperatur = Temperatur + T1 |
So, ich habe gestern mal den Code abgeändert und er sieht nun so aus: https://dl.dropbox.com/u/41257941/temp.bas Jedoch zeigt die anzeige nur "01" an und ändert sich nicht. Die Anzeige erlischt nun alle 10 Sekunden für ca. 1sekunde, wie es ja soll. Jedoch wird nicht die richtige Temperatur angezeigt ... Ich steh echt auf dem Schlauch.
1 | T1 = Scratch(9) + Scratch(8) |
da habe ich mich verschrieben es muß eine Subtraktion sein. Kannst du dir die Werte des Scratch, Temperatur und T1 mal ausgeben lassen? So wie ich das sehe gibst du die Temperatur ja nur in ganzen Grad Celsius ohne Nachkommastelle aus. Dann brauchst du die erweiterte Genauigkeit nicht. Es reicht dann ja das Vorzeichen aus Scratch(2) zu lesen eventuell Scratch(1) anzupassen und durch 2 zu Teilen dann hast du schon die Temperatur auf ein Grad genau. Du sparst dir dann auch die ganze Gleitkommasache.
1 | Dim Tempread As Single |
Tempread muß eine Bytevariable sein. Gruß Rene
Anhang vergessen. Wenn die Anzeige nicht so lang aus sein soll dann geht auch das noch:
1 | Read_temp:
|
2 | Anzeige_aus
|
3 | 1wreset ' Initialisierung |
4 | 1wwrite Skip_rom ' Skip ROM, da nur ein DS18B20 verwendet wird |
5 | 1wwrite Convert_t ' Befehl für Messung geben |
6 | Anzeige_an
|
7 | wait 1 |
8 | Anzeige_aus
|
9 | 1wreset ' Initialisierung |
10 | 1wwrite Skip_rom ' Skip ROM |
11 | 1wwrite Read_scratch ' Temperatur auslesen |
12 | For I = 1 To 9 |
13 | Scratch(i) = 1wread() |
14 | Next
|
15 | Anzeige_an
|
16 | If Scratch(2) = &HFF Then |
17 | Tempread = &HFF - Scratch(2) |
18 | Tempread = Tempread / 2 |
19 | Vorzeichen = 1 |
20 | Else
|
21 | Tempread = Scratch(2) / 2 |
22 | Vorzeichen = 0 |
23 | End If |
24 | Return
|
Hallo und einen Guten Amend miteinander Ich habe nun auch diesen Aufbau, wie Jochen, aufgebaut und das Programm von Rene auf den Atmega8 gemacht. Irgendwie kommt bei dem Link von Jochen nun ein Error?? Jedoch habe ich auch das Problem, dass immer nur "00" angezeigt wird? Kann es sein, dass etwas an dem Code nicht stimmt, weil richtig aufgebaut habe ich es zu 100% und auch Jochen hat das Problem schon beschrieben. Kann mir jemand weiterhelfen? Wenn es geht Rene, da du ja anscheinend was davon verstehst ;D Ich wünsche noch einen schönen Abend Alexander
>Kannst du dir die Werte des Scratch, Temperatur und T1 mal ausgeben >lassen? Wie ich schon sagte lasst euch die Werte mal ausgeben um den Fehler einzuschränken.
Jochen schrieb: > Jedoch wird nicht die richtige Temperatur angezeigt ...Ich steh echt > auf dem Schlauch. Hallo Jochen, hast du denn inzwischen mal in das Datenblatt des Sensors geschaut oder wartest du nur darauf, dass Rene dir ein fertiges Programm abliefert? Dann hättest du vielleicht auch erkannt, dass Renes Auswertung offensichtlich für einen DS1820 geschrieben ist, du aber scheinbar einen DS18B20 verwendest. Und dann sind die Ergebnisse durchaus nachvollziehbar.
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.