PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DS1820 Wert verarbeiten



Neutro
08.10.2008, 14:05
Hallo Leute,

ich bin gerade dabei mir eine Temperaturegelung aufzubauen. Als Temperaturfühler dient dazu ein DS 1820.
Ich habe das folgende prog aus dem www mal auf meinen Controller
übertragen, das funktioniert auch alles einwandfrei.

$regfile = "m8def.dat"
$crystal = 3686411

' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2

' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5

Dim Ar(2) As Byte

Cls

Do
1wreset
1wwrite &HCC
1wwrite &H44
1wreset
1wwrite &HCC
1wwrite &HBE
Ar(1) = 1wread(2)

Waitms 500
'Locate 1 , 1
'Lcd Hex(ar(2)) ; Hex(ar(1))
Locate 2 , 1
Shift Ar(1) , Right , 1
Lcd Ar(1)
Loop

End

Soweit so gut, nun möchte ich den Ausgelesenen Wert "AR" auswerten.
Wenn ich aber folgenden Code ergänze

If Ar > 10 then
Upperline
LCD "Temp. zu hoch"
end if

Nur so funktioniert das nicht weil der Wert AR irgendwie umgewandelt werden muss.
Aber wie?

bin für jede Hilfe und Programmbeispiele dankbar.
Neutro.

for_ro
08.10.2008, 17:26
Du musst nach dem Starten der Konvertierung (1wwrite &HCC , 1wwrite &H44) dem Sensor etwas Zeit geben, fertig zu werden.
Hier solltest du ein Wait von 750ms einfügen, bvor du die Daten abfragst (1wwrite &HCC , 1wwrite &HBE). Ist zwar unschön, aberdas kann man später noch ändern.

Umgewandelt hast du den Wert schon irgendwie.
Shift Ar(1) , Right, 1 teilt dir den Wert durch 2. Aber das höchstwertige bit der Temperatur steht im niedrigstwertigen bit von Ar(2) und zusätzlich noch das Vorzeichen.
Deswegen geht man meistens hin und macht erst ein
Temp_int=MAKEINT(Ar(1),Ar(2)) eingefügt und dann wird geshiftet.
Dann kannst du auch abfragen, ob Temp_int größer als 10 ist.

Gruß

Rolf

Neutro
09.10.2008, 05:35
@for_ro: Danke für die Hilfe, jetzt funktionierts.
Allerdings ist der Temp_int Wert doppelt so hoch wie die Temperatur; ist ja auch klar weil noch nicht durch zwei geteilt wurde. Aber das lässt sich ja leicht
umrechnen.

MfG

Neutro