Verhalten !?!?!?!?
Hallo Jens,
das doch sehr ominöse Verhalten Deines Codes hat mir keine Ruhe gelassen und ich habe mir erneut Deinen Code angesehen.
Ich komme mehr und mehr zu der Annahme, das wir es in Deinem Fall mit einem klassischen Speicherüberschreiber zu tun haben.
Hier zunächst die relevanten Codestellen:
Code:
Dim Ds1820 As Integer
Dim Halb As Byte
....
Ds1820 = 1wread(9)
....
Halb = Ds1820 And 1
Erläuterung:
- Du definierst zwei Variablen. Integer und Byte. Integer ist im Speicher 2 Byte groß, Byte ist 1 Byte groß!
- In der Routine zum Auslesen des Temperatursensors liest Du 9 Byte mit der Funktion 1wread(9) in eine Variable die im Speicher nur 2 Byte groß ist!!!!
- Dabei wird neben dem Speicherplatz für die Variable Halb sicherlich auch noch anderer Speicherplatz überschrieben. Vermutlich auch der Speicherplatz in dem sich Debounce in Bit-Feldern die Zustände für die PIN's merkt.
Fazit: Das kann nicht funktionieren, tut es aber mit Randeffekten
Das ist aber nur reiner Zufall!!!!
So, was ist passiet das es mit LONG funktioniert......
Ich nehme folgendes an:
Long ist im Gegensatz zu Integer zwei Byte größer da es im Speicher 4 Byte benötigt. Damit verschiebt sich Dein ganzes Speichergefüge vermutlich für Dich so positiv, dass die Routinen für debounce in einen Speicherbereich wandern der nicht mehr überschrieben wird.
Wie gesagt, aus meiner Sicht es es reiner Zufall, dass es überhaupt funktioniert und Du hast dringenden Handlungsbedarf, Deinen Code sauber zu bekommen und die Funktion richtig zu imlementieren. Entweder Du liest Byte für byte einzeln oder Du liest die 9 Byte in ein 9 Byte großes Array um danach die für Dich wichtigen Daten dort rauszuholen oder oder oder. Als Beispiel stelle ich Dir gerne meinen Code zur Verfügungen den ich für einen DS18S20 geschrieben habe und im Rahmen meinen Zisternenfüllstandsanzeige hier im Forum veröffentlicht habe.
Ein Weiterer Punkt ist mir aufgefallen den ich oben auch als Code-Schnipsel mit angefügt habe.
Mit "Halb = Ds1820 And 1" machst Du gleichzeitig eine Bitoperation auf einen Integer (2Byte) und castest ihn gleichzeitig auf ein Byte. Aus meiner Erfahrung mit BASCOM ist hier größte Vorsicht geboten da BASCOM verettete Operationen oft noch nicht sauber abarbeitet. Ich hatte hier schon die größten Probleme.
Also was tun?
Lösung 1: Zuerst verunden (in eine Hilfvariable) und dann caste
Code:
Temp_int_var = Ds1820 AND 1
Halb = Temp_int_var
Lösung 2: Zuerst Casten und dann verunden
Code:
Halb = Ds1820
Halb = Halb AND 1
Das würde ich mir an Deiner Stelle nochmal genau ansehen.
Also wie gesagt, für mich ist es aktuell ein großes WUNDER dass der Code überhaupt funktioniert hat weil unter den oben beschriebenen Bedingungen nur Datenmüll hätte herauskommen müssen.
Um hier aber weiter eine Antwort zu finden müsste man sich den Assembler Code ansehen den BASCOM produziert um dann genau zu wissen, wo was liegt und was wie wann überschrieben wird. Aber ich glaube das können wir uns nach der hier beschriebenen Analyse sparen!
Schönen Abend und viel Spass beim Umbauen Deiner Software
Grüße,
Markus