Mikrocontroller-Einstieg mit BASCOM-AVR Teil 14: 1-Wire

0,00
Aus ELVjournal 01/2015     3 Kommentare
 Mikrocontroller-Einstieg mit BASCOM-AVR Teil 14: 1-Wire

Inhalt des Fachbeitrags

PDF- / Onlineversion herunterladen

Nachdem in den Teilen 11 bis 13 unserer Artikelserie „Mikrocontroller-Einstieg mit BASCOM-AVR“ verschiedene Möglichkeiten mit dem I2C-Bus – der wegen der benötigten Daten- und Taktleitung auch Two- Wire-Interface genannt wird – gezeigt wurden, geht es im vorliegenden Teil um den 1-Wire-Bus. Der Name 1-Wire-Bus weist darauf hin, dass bei Verwendung dieses Busses nur eine Datenleitung (und keine Taktleitung) benötigt wird. Exemplarisch wird die Verwendung des weit verbreiteten Temperatursensors DS18B20 behandelt.

Aufbau des 1-Wire-Busses

1-Wire (Eindraht-Bus) ist eine serielle Schnittstelle der Firma Maxim Integrated (vormals Dallas Semiconductor) mit nur einer Datenleitung. Es gibt keine Taktleitung (asynchron). Außer der Datenleitung wird noch eine gemeinsame GND-Leitung und die Spannungsversorgung benötigt. Die Datenleitung kann bei den meisten 1-Wire-Bausteinen sogar zur Spannungsversorgung eines angeschlossenen Slave-Bausteins benutzt werden. Man hat dann nur noch GND und die Datenleitung und spricht von „parasitärer Spannungsversorgung“ im Gegensatz zu „externer Spannungsversorgung“. Den Busaufbau mit externer Spannungsversorgung der Busbausteine zeigt Bild 1.
Bild 1: Busaufbau 1-Wire mit externer Spannungsversorgung
Bild 1: Busaufbau 1-Wire mit externer Spannungsversorgung
Es gibt einen Mikrocontroller als Master, der auch die 1-Wire-Befehle initiiert, und es gibt eine Vielzahl von 1-Wire-Slave-Bausteinen. Der Master und die Slave-Bausteine haben eine gemeinsame GND-Leitung. Der Master und jeder Slave haben jeweils eine Spannungsversorgung und der Master und die Slaves sind durch die Datenleitung (DQ) verbunden. Über die Datenleitung können die Daten in beide Richtungen übertragen werden (bidirektional). Wichtig ist, dass ein 1-Wire-Bus (genau) einen Pull-up-Widerstand (RPU) für die Datenleitung hat.
Bild 2: 1-Wire-Slave mit Open Drain
Bild 2: 1-Wire-Slave mit Open Drain
Wie in Bild 2 zu sehen, arbeitet jeder Busteilnehmer mit einem Open-Drain-Ausgang, d. h. jeder Busteilnehmer ist in der Lage, das Potential der Datenleitung nach GND zu ziehen. Damit ein High-Pegel auf der Datenleitung entstehen kann, muss der erwähnte Pull-up-Widerstand vorhanden sein, der das Spannungspotential zur positiven Spannungsversorgung zieht, wenn kein Open-Drain-Ausgang aktiv ist.
Jeder Baustein hat eine eigene eindeutige Adresse in Form einer 64 Bit langen Zahl (Bild 3).
Bild 3: 64-Bit-ROM-Code
Bild 3: 64-Bit-ROM-Code
Dabei sind die ersten 8 Bit (LSB = Least Significant Byte) der sogenannte „family code“ (z. B. &h28 für den DS18B20; &h10 für DS18S20 und DS1820) und die letzten 8 Bit (MSB = Most Significant Byte) die Prüfsumme (CRC) der vorausgehenden 7 Bytes. Dazwischen steht die 48 Bit lange Seriennummer. Damit kann man 2 hoch 48 = 281.474.976.710.656 verschiedene Bausteine eindeutig identifizieren.
Es gibt eine Vielzahl verschiedener 1-Wire-Bausteine wie Echtzeit-Uhren, I/O-Bausteine, Batteriemonitore, EEPROM-Speicher und die sehr beliebten Temperatursensor-Bausteine.
Da das Prinzip bei 1-Wire immer gleich ist, wird es am Beispiel des Temperatursensors DS18B20 erläutert. Es handelt sich um einen Temperatursensor, der den Temperaturwert auf 0,5 Grad genau digital über die 1-Wire-Schnittstelle ausgibt [1]. Der Baustein ist unter der Best.-Nr. J7-10 93 37 bzw. J7-10 27 83 bei ELV erhältlich. Achtung: Der hier behandelte DS18B20 unterscheidet sich im Detail vom ebenfalls verbreiteten DS18S20 bzw. dessen Vorgänger DS1820! Für neue Anwendungen wird der DS18B20 empfohlen und daher hier betrachtet [2].
Bild 4: Sensor (Kunststoff bzw. Metall) und Zubehör
Bild 4: Sensor (Kunststoff bzw. Metall) und Zubehör
ELV bietet den Sensor in einer für Flüssigkeiten geeigneten Version (Best.-Nr. J7-10 27 83) und in einer Metallversion mit Befestigungslasche (Best.-Nr. J7-10 93 37) an (Bild 4 links). Die Sensoren werden von ELV mit Anschlusskabel und RJ45-Stecker geliefert. Als Zubehör gibt es ein Verlängerungskabel (Best.-Nr. J7-10 65 35) mit Kupplung (Best.-Nr. J7-10 65 34) (Bild 4 rechts). Mit Hilfe einer Einbaubuchse für Printmontage (Best.-Nr. J7-11 21 47), eines Klemmadapters (Best.-Nr. J7-11 52 88) oder direkt per Kabelanschluss kann ein Sensor elegant in eigene Projekte eingebunden werden (Bild 4 Mitte). Beim Klemm­adapter ist die Belegung: 3 = Plus, 4 = Datenleitung, 5 = GND.
Bild 5 zeigt das Blockbild des DS18B20.
Bild 5: Aufbau des Temperatursensors DS18B20
Bild 5: Aufbau des Temperatursensors DS18B20
Außerhalb des eigentlichen Sensors sieht man auch hier wieder den notwendigen Pull-up-Widerstand, der einmal pro 1-Wire-Bus vorhanden sein muss. Dessen Wert sollte in der Größenordnung von 4,7 kΩ
liegen. Im linken Block im Bild 5 sieht man die „Parasite Power Circuit“. Diese Einheit erkennt, ob an VDD eine positive Spannung angeschlossen ist (wie in Bild 1). Wenn das nicht der Fall ist, erzeugt die Parasite Power Circuit aus der Datenleitung DQ die positive Spannungsversorgung, die durch einen eingebauten Kondensator gepuffert wird. Da dieser eingebaute Kondensator sehr klein ist, reicht diese Art der Spannungsversorgung allerdings nicht für alle Betriebsmodi des Sensors. Details dazu siehe Datenblatt des Sensors [1].

Programmierung
Der Ablauf bei der 1-Wire-Programmierung mit BASCOM ist prinzipiell immer gleich. Zunächst wird der Pin definiert, der für 1-Wire verwendet werden soll:
0.) Konfiguration Config 1wire = Portx.y ’ Pin als 1-Wire-Pin definieren.
Im laufenden Programm wird der Bus jeweils mit 1wreset initiiert, dann folgt ein ROM-Kommando, mit dem festgelegt wird, welcher Baustein angesprochen werden soll, gefolgt von einem Funktionskommando, welches dem Compiler mitteilt, was getan werden soll.

1.) Initialisierung
1wreset Bus initialisieren/zurücksetzen.


2.) ROM-Command (gefolgt von benötigten weiteren Parametern)
Z. B. 1wwrite &h55 für Match ROM oder 1wwrite &hCC für Skip ROM
(Ggf. Adresse mit for i = 1 to 8 : 1wwrite Adresse(i) : next I )

Beispiele für ROM-Commands: &hCC Skip ROM Alle Slaves/Sensoren ansprechen
&h55 Match ROM Einen bestimmten Slave/Sensor ansprechen


3.) Function-Command (gefolgt von benötigtem Datenaustausch)
Z. B. 1wwrite &h44 für Messung anstoßen
Ggf. Bytes einlesen mit Daten(1) = 1wread(9)

Beispiele für Function-Commands:
&h44 Convert Temperature Temperaturmessung anstoßen
&hBE Read Scratchpad Werte aus Sensor auslesen
&h4E Write Scratchpad Werte schreiben: Byte 2, 3 und 4 = TH, TL und Config


BASCOM stellt außerdem Befehle wie 1wsearchfirst(), 1wsearchnext() und 1wcount() zur Verfügung, mit denen die erste bzw. die nächste Bausteinadresse bzw. die Anzahl angeschlossener Slaves ermittelt werden kann.

1-Wire-ROM-Code-Scanner (ROM-Code lesen)
Wenn mehr als ein 1-Wire-Baustein am Bus angeschlossen werden soll oder wenn geprüft werden soll, ob ein bestimmter Baustein angeschlossen ist, muss man zunächst den eindeutigen ROM-Code des Bausteins ermitteln. Dafür kann man sich ein kleines BASCOM-Programm schreiben, welches als 1-Wire-ROM-Code-Scanner bezeichnet werden kann. Ein ELV-Temperatursensor wird gemäß Bild 6 am Mikrocontroller angeschlossen.
Bild 6: Anschluss des Sensors
Bild 6: Anschluss des Sensors
Die grüne Ader kennzeichnet die Datenleitung DQ. Gelb bzw. Orange kennzeichnen die 5-V- bzw. GND-Leitung. Andere 1-Wire-Bausteine können natürlich ebenso benutzt werden.


Bild 7: DS18B20-Memory-Map (Scratchpad)
Bild 7: DS18B20-Memory-Map (Scratchpad)

Erläuterungen:
Mit Config 1wire = Portc.0 wird im Programm der Pin 0 des Ports C als Pin für 1-Wire festgelegt. Im Anschluss daran wird ein 8 Byte langes Byte-Array Rom_Code(8) für die Aufnahme des ROM-Codes dimensioniert.
In der DO-LOOP wird mit 1wsearchfirst() der ROM-Code des ersten (und hier einzigen) angeschlossenen 1-Wire Bausteins gelesen.
Danach steht in der Systemvariablen Err, ob das Lesen erfolgreich war (0 = 1-Wire-Baustein angeschlossen) oder nicht.
Wenn das Lesen des ROM-Codes erfolgreich war, wird der ROM-Code auf dem LC-Display ausgegeben. Diesen einzigartigen ROM-Code kann man sich nun notieren, um ihn später gezielt benutzen zu können.

Thermometer mit nur einem DS18B20-Sensor (Scratchpad lesen)
Ein DS18B20-Temperatursensor gibt den Temperaturwert mit einer Genauigkeit von 0,5 °C digital aus (vgl. „Elektronikwissen“). Im Sensor werden die Daten in einem Speicherbereich gespeichert, der als Scratchpad bezeichnet wird und aus 8-Byte-Registern besteht (Bild 7). In Register 0 und Register 1 wird der Temperaturwert gespeichert.

Bild 8: Temperaturregister-Format
Bild 8: Temperaturregister-Format
Der Temperaturwert ist in diesen beiden Registern als Zahl im Zweierkomplement gespeichert (Bild 8 und „Elektronikwissen“). Bit 11 bis 15 stellen das Vorzeichen der Zahl dar. In den anderen Bits steht der Wert der Zahl. Bild 9 zeigt Beispielwerte für die Temperatur und deren Darstellung in den beiden Temperaturregistern. Da Integerzahlen auch im AVR-Mikrocontroller im Zweierkomplement abgelegt werden, erfolgt die Umrechnung negativer Zahlen implizit.


Erläuterungen:
Mit Config 1-Wire wird zunächst wieder der Pin für 1-Wire definiert. Dann wird ein 9-Byte-Array Scratchpad(9) dimensioniert, in das im Folgenden die Temperaturwerte aus dem Sensor eingelesen werden.
Die Initialisierung des Sensors erfolgt nach dem Standard-1-Wire-Schema:


Danach werden alle angeschlossenen Sensoren (hier nur einer vorhanden) angewiesen, eine Temperaturmessung durchzuführen:

Die Messung kann je nach gewählter Auflösung bis zu 0,75 Sekunden dauern. Mit einer Wartezeit von einer Sekunde (WAIT 1) ist man also sicher, dass der Sensor die Messung beendet hat. Das eigentliche Auslesen des Temperaturwertes erfolgt mit:

Danach erfolgt die Aufbereitung und die Anzeige des Temperaturwertes.

Thermometer mit mehreren Sensoren
In praktischen Projekten reicht natürlich oftmals nicht die Auswertung EINES Temperatursensors. Oft sollen mehrere Temperaturwerte gemessen und angezeigt bzw. weiterverarbeitet werden. Dafür lassen sich an einen einzigen 1-Wire-Bus viele Temperatursensoren anschließen (siehe Bild 1). Die Sensoren werden wie beschrieben durch die jeweils einzigartige ROM-Adresse unterschieden – siehe oben. Dadurch ist die Zuordnung von eingelesenem Temperaturwert zu Temperatursensor/Messstelle möglich. Im folgenden Beispiel werden die (durch den 1-Wire-Scanner ermittelten) ROM-Codes von drei Sensoren im Data-Bereich des BASCOM-Programms hinterlegt. Die Temperaturwerte der drei Sensoren werden nacheinander ermittelt und angezeigt.




Erläuterungen:
Durch einen Timer wird ein Ein-Sekunden-Takt erzeugt. Jede Sekunde wird in der Timer-ISR ‚Sekunden_isr’ das Flag Neuesekunde auf 1 gesetzt. In der Hauptschleife wird dieses Flag regelmäßig abgefragt, so dass einmal pro Sekunde eine neue Temperaturanzeige erfolgen kann. In der Sekunden-ISR wird außerdem ein Zähler für die Anzeige-Restzeit für eine Messstelle heruntergezählt. Dadurch ist es möglich, im DATA-Bereich zu hinterlegen, wie viele Sekunden der Temperaturwert einer Messstelle jeweils angezeigt werden soll. Im DATA-Bereich steht die Anzeigedauer je Messstelle. Im Beispiel: zwei Sekunden lang Innentemperatur, zwei Sekunden Außentemperatur und eine Sekunde Kellertemperatur. Dieser Wert wird in der Sekunden-ISR heruntergezählt und wenn null erreicht ist, dann ist die entsprechende IF-Bedingung in der Hauptschleife erfüllt und die Daten für den nächsten Sensor werden mittels der Routine ‚Sensorbeschreibung_lesen’ aus dem DATA-Bereich eingelesen.
Mit 1wverify Rom_Code(1) wird der entsprechende Sensor gezielt angesprochen und dann wie bereits oben beschrieben der Temperaturwert dieses Sensors ausgelesen und angezeigt. Wichtig ist, dass auch hier den Sensoren genügend Zeit zum Durchführen der eigentlichen Temperaturmessung gegeben wird, indem am Ende der sekündlich stattfindenden Temperaturauswertung eine neue Temperaturmessung durch alle angeschlossenen Sensoren angestoßen wird. Bis zur nächsten „Runde“ bleibt den Sensoren dadurch Zeit, die Temperatur zu messen.

Ausblick

Nach der Beschreibung der komfortablen 1-Wire-Schnittstelle in diesem Teil wird im nächsten Teil der Artikelserie „Mikrocontroller-Einstieg mit BASCOM-AVR“ die SPI-Schnittstelle behandelt.

Weitere Infos:

[1] Datenblatt DS18B20: Unter www.elv.de bei der Artikelbeschreibung hinterlegt.
Geben Sie dazu bitte einfach die Best.-Nr. J7-10 93 37 im Suchfeld ein.
[2] DS18B20 vs. DS18S20/DS1820: www.maximintegrated.com/en/app-notes/index.mvp/id/4377
• Stefan Hoffmann: Einfacher Einstieg in die Elektronik mit AVR-Mikrocontroller und BASCOM.
Systematische Einführung und Nachschlagewerk mit vielen Anregungen. ISBN 978-3-8391-8430-1
• www.bascom-buch.de
• www.mcselec.com
• www.atmel.com
• Produktübersicht BASCOM: www.elv.de/bascom.html

Fachbeitrag als PDF-Download herunterladen

Inhalt

Sie erhalten den Artikel in 1 Version:

pdf  als PDF (9 Seiten)

Sie erhalten folgende Artikel:
  • Mikrocontroller-Einstieg mit BASCOM-AVR Teil 14: 1-Wire
Produkteweitere FachbeiträgeForenmehr Wissen
Atmel Mikrocontroller ATmega88PA-PU DIP28

Atmel Mikrocontroller ATmega88PA-PU DIP28


EUR 2,95*
sofort versandfertig Lieferzeit:1-2 Werktage2
Kupplung für RJ45-Stecker 8/8

Kupplung für RJ45-Stecker 8/8


EUR 1,00*
sofort versandfertig Lieferzeit:1-2 Werktage2
ISDN-Kabel mit RJ45-Steckern 8/4, 50 m

ISDN-Kabel mit RJ45-Steckern 8/4, 50 m


EUR 6,50*
(EUR 0,13 / Lfm)
sofort versandfertig Lieferzeit:1-2 Werktage2
Delock Adapter Terminalblock mit Drucktaste > RJ45 Buchse

Delock Adapter Terminalblock mit Drucktaste > RJ45 Buchse


EUR 5,95*
sofort versandfertig Lieferzeit:1-2 Werktage2
PEAK Atlas DCA 75 Pro Halbleiter-Tester

PEAK Atlas DCA 75 Pro Halbleiter-Tester


EUR 109,95*
sofort versandfertig Lieferzeit:1-2 Werktage2

Kommentare:

25.01.2015 schrieb Friedhelm Brügmann:
„Guten Tag, Ausgabe 01/15: Ab Seite 104 wird der Artikel "Mikrokontroller Einstieg mit BASCOM-AVR" Teil 14 nur teilweise wiedergegeben, mit dem Hinweis, man könnte sich den vollständigen Artikel KOSTENLOS hier herunterladen. Ich kann diese kostenlose Funktion aber nirgendswo finden. Es kann doch wohl nicht sein, das ich als langjähriger Abonnent Ihrer Zeitschrift hier noch zusätzlich etwas für den Erhalt vollständiger Artikel bezahlen soll. Was ist denn das für ein Geschäftsgebahren ?? Ich bitte um Aufklärung. mfg Friedhelm Brügmann”
  Name
  E-Mail
26.01.2015 schrieb Frank Pfeil:
„guten tag leider ist es mir nicht möglich teil 14 bascom-avr zu laden. wie sie sehen habe ich mich eingeloggt. was mache ich falsch? ausserdem finde ich es nicht gut das auf diese weise ein bezahltes produktangeboten wird. ich hätte dann ja gleich an eines abonoment ihres journals ein buch kaufen können mfg pfeil ”
  Name
  E-Mail
24.02.2015 schrieb Michael Sandhorst (Technik):
„Hallo Frank Pfeil, wir würden Sie bitten, sich kurz mit unserer Abo-Abteilung in Verbindung zu setzen. eMail: abo@elv.de Telefon: 0491-6008-450 Mit freundlichen Grüßen Michael Sandhorst (Technik) ”
  Name
  E-Mail


Hinterlassen Sie einen Kommentar:
(Anmeldung erforderlich)
  Name
  E-Mail
KATEGORIEN
DAS KÖNNTE SIE AUCH INTERESSIEREN