1wire Programmierung mit BASCOM

Hier soll am Beispiel vom 1wire Temperatursensor DS1820 das Ansprechen der 1wire Schnittstelle mit BASCOM gezeigt werden. Der 1wire Bus ist eine Verbindung von mehreren Geräten mit nur einer Datenleitung. Mit nur einem Pin am Mikrocontroller lässt sich der Bus durch Software realisieren. Man muss also dem BASCOM Compiler als erstes mitteilen, welchen Pin man benutzt. Das geschieht mit dem Befehl:

Config 1wire = Port?.? (Beispiel: Config 1wire = Portc.5 --> Pin 5 an Port C wird als 1wire Bus konfiguriert)

Der Master, was in unserem Fall unser Mikrocontroller ist, gibt den Ton an und verkündet immer als erstes mit wem er reden will. Dazu besitzt jeder Baustein am 1wire Bus eine eigene eindeutige Adresse in Form einer Zahl die 64 Bit lang ist und die vom Hersteller bereits ‚eingebrannt‘ wurde. Dabei sind die ersten 8 Bit der sogenannte „family code“ und die letzten 8 Bit die Prüfsumme (CRC)Damit ist es praktisch möglich 2^48=281.474.976.710.656 verschiedene Bausteine von jedem Type herzustellen, was ausreichen sollte.
Das Auswählen eines Bausteines geschieht folgender maßen, zuerst den Bus zurück setzen, dann das Kommando zur Bausteinauswahl übertragen und anschließend die Adresse des Bausteines (hier in einem Array von 8 Byte gespeichert):

1wreset
1wwrite &H55 ' 055H = Match ROM command, also Baustein auswählen
For I = 1 To 8 : 1wwrite Dsid(i) : Next I

Die oben aufgeführte Sequenz ist in BASCOM auch in einem Befehl zusammen gefasst und sieht dann so aus (beides ist von der Funktion her identisch):

1wverify Dsid(1)

Nach dem klar ist wer mit wem spricht können jetzt mit 1WWRITE und 1WREAD Daten oder Kommandos geschrieben oder Daten gelesen werden. Es gibt noch einen Sonderfall der Bausteinauswahl, das ist die Auswahl aller am Bus befindlichen Bausteine. Das macht Sinn, wenn man nur mit einem Baustein arbeitet oder wenn man ein Kommando an alle am Bus befindlichen Bausteine schicken will. Das sieht dann so aus:

1wreset
1wwrite &HCC ' 0CCH = Skip ROM command, also Bausteinauswahl ignorieren

Wenn man mit mehreren Bausteinen arbeitet speichert man an Besten die jeweiligen Adressen in jeweils einem Array.
Dazu muss man natürlich die Adresse des Bausteins kennen. Dafür kann man die Funktionen 1wsearchfirst() und 1wsearchnext() nutzen. 1wsearchfirst() liest die Adresse des ersten Bausteines ein und übergibt sie an ein Array. Mit:

Dsid1(1) = 1wsearchfirst()

werden die 8 Byte Adresse des ersten 1wire Chips in das Array Dsid1 eingelesen. Das Array sollte natürlich genau 8 Byte groß sein. Es wird vorher mit wie folgt definiert:

Dim Dsid1(8) As Byte

Um ganz sicher zu sein welchen Baustein man anspricht sollte man die Adressen vorher mit jeden Baustein einzeln ermitteln und aufschreiben oder besser mit einem beschrifteten Klebeband am Chip befestigen.

Download: 1wire-ds1820-adresse.zip
Noch was zum Beschreiben von Array’s in BASCOM. Das Beschreiben von Arrays in BASCOM ist etwas gewöhnungsbedürftig. Wenn man folgendes liest A(2)=irgendwas(), dann nimmt man normaler weise an, das die Zelle des Array’s A mit dem Index 2 beschrieben wird. Das ist in BASCOM erst mal auch so, wird aber mehr geschrieben, dann werden in BASCOM die nachfolgenden Zellen auch mit beschrieben. Wenn im vorangegangenem Beispiel die Funktion irgendwas() 3 Byte liefert und A ein Byte-Array ist, dann werden die Variablen A(2), A(3) und A(4) beschrieben.