Hallo Forum,
mir ist es nicht gelungen, das Beispiel 14_DS18B20 zum Laufen zu bringen.
Die Suche nach der Ursache führte zu ein paar Korrekturen in der Datei ds18b20.c
Gut, ich verwende hier die "alte" LaunchPad Version 1.4. Kann sein, dass der Original-Code mit der Version 1.5 funktioniert...?
Die Idee bei der 1-Wire-Schnittstelle ist, dass diese eine Leitung in beiden Richtungen verwendet wird.
Die Übertragung von Einsen und Nullen wird dabei durch präzise Zeitintervalle auf dem Bus gewährleistet.
Man realisiert das (genau wie bei der I2C-Schnittstelle) indem ein Pull-Up-Widerstand die Leitung auf 1 hält, solange kein Device eine Null übertragen will und zu dem Zweck dann die Leitung per Open-Kollektor auf Null ziehen würde.
Dazu muss der Controller den Pin, an dem das Device hängt, mal als Ausgang definieren und eine Null in das entspr. Bit schreiben (damit wird eine "0" übertragen). Sonst wird der Pin als Eingang definiert, um den Pegel dem Pull-Up-Widerstand zu überlassen oder dem Device, das die Leitung per Open-Kollektor auf "0" schalten kann.
Diese Umschaltung zwischen Ein- und Ausgang fehlte in der ds18b20.c-Datei. Ich habe also die low-level-Routinen (also die, die direkt mit dem Ein/Ausgangs-Pin umgehen) entspr. verändert.
Damit läuft die Software hier. Es sind übrigens gerade 18.6|19°C.
Die geänderte Schnittstellen-Datei hänge ich als ZIP-File an.
Man muss nur noch (am besten in "main.h") ein `#define DS18B20PIN BIT7 ergänzen, damit klar ist, an welchem Pin des Ports 1 der Temperatur-Sensor hängt. (also P1.7)
vy 73 de Matthias, DL9MWE
1-Wire Schnittstelle (für den Temperatur-Sensor)
1-Wire Schnittstelle (für den Temperatur-Sensor)
- Attachments
-
- ds18b20.zip
- geänderte Schnittstelle zum Temperatur-Sensor DS18B20
- (2.6 KiB) Downloaded 689 times
Last edited by DL9MWE on Fri 7. Dec 2012, 11:22, edited 1 time in total.
Re: 1-Wire Schnittstelle (für den Temperatur-Sensor)
Hallo Matthias,
jetzt sehe ich Deine Nachricht hier erst... Es ist richtig, daß die Umschaltung der Richtung des Datenpins nicht so einfach in der ds18b20.c zu finden ist, da sie hinter einem Makro versteckt wurde. In der ds18b20.h befinden sich folgende Zeilen:
#define DS18B20_IN_H (P1IN & BIT7)
#define DS18B20_IN_L !(P1IN & BIT7)
#define DS18B20_OUT_H DS18B20_SET_INPUT
#define DS18B20_OUT_L DS18B20_SET_OUTPUT;(P1OUT &= ~BIT7)
#define DS18B20_SET_OUTPUT (P1DIR |= BIT7)
#define DS18B20_SET_INPUT (P1DIR &= ~BIT7)
Die beiden letzten zeigen das Setzen und Löschen des BIT7 im P1DIR-Register, womit die Richtungseinstellung des Ports auf Ausgang bzw. wieder Eingang erfolgt. In den beiden Zeilen darüber *_OUT_H und *_OUT_L wird die Richtungsumschaltung der letzten beiden Zeilen mit zugewiesen.
Überall wo nun in der ds18b20.c z.B. DS18B20_OUT_H geschrieben steht, wird der Pin zum EIngang konfiguriert und wo DS18B20_OUT_L steht, wird der Pin zum Ausgang konfiguriert und eine '0' ausgegeben.
Diese Substitution von Namen durch ein oder mehrere C-Befehle per #define nennt sich Makro. Damit wird der Quelltext besser lesbar, aber es werden halt auch die konkreten Befehle versteckt.
Bei mir läuft die originale Software aus meinem Kurs-Workspace prima. Mal schauen, welche Erfahrung die anderen MC-Freunde sammeln.
vy 73 de Gerrit, DL9GFA
jetzt sehe ich Deine Nachricht hier erst... Es ist richtig, daß die Umschaltung der Richtung des Datenpins nicht so einfach in der ds18b20.c zu finden ist, da sie hinter einem Makro versteckt wurde. In der ds18b20.h befinden sich folgende Zeilen:
#define DS18B20_IN_H (P1IN & BIT7)
#define DS18B20_IN_L !(P1IN & BIT7)
#define DS18B20_OUT_H DS18B20_SET_INPUT
#define DS18B20_OUT_L DS18B20_SET_OUTPUT;(P1OUT &= ~BIT7)
#define DS18B20_SET_OUTPUT (P1DIR |= BIT7)
#define DS18B20_SET_INPUT (P1DIR &= ~BIT7)
Die beiden letzten zeigen das Setzen und Löschen des BIT7 im P1DIR-Register, womit die Richtungseinstellung des Ports auf Ausgang bzw. wieder Eingang erfolgt. In den beiden Zeilen darüber *_OUT_H und *_OUT_L wird die Richtungsumschaltung der letzten beiden Zeilen mit zugewiesen.
Überall wo nun in der ds18b20.c z.B. DS18B20_OUT_H geschrieben steht, wird der Pin zum EIngang konfiguriert und wo DS18B20_OUT_L steht, wird der Pin zum Ausgang konfiguriert und eine '0' ausgegeben.
Diese Substitution von Namen durch ein oder mehrere C-Befehle per #define nennt sich Makro. Damit wird der Quelltext besser lesbar, aber es werden halt auch die konkreten Befehle versteckt.
Bei mir läuft die originale Software aus meinem Kurs-Workspace prima. Mal schauen, welche Erfahrung die anderen MC-Freunde sammeln.
vy 73 de Gerrit, DL9GFA
Re: 1-Wire Schnittstelle (für den Temperatur-Sensor)
Gerrit hat recht: die Port-Pin-Umschaltung ist korrekt implementiert.
Das Problem hier lag darin, dass ich die Taktfrequenz (in "main.h") auf 1MHz gestellt hatte. Dann stimmt das Timing der OW_Read_Bit()-Routine nicht mehr.
Bei 8MHz funktioniert Gerrits-Routine bestens. Bei 1MHz muss man das Timing etwas anpassen (was dann bei 8MHz immer noch funktioniert).
vy 73 de Matthias, DL9MWE
Das Problem hier lag darin, dass ich die Taktfrequenz (in "main.h") auf 1MHz gestellt hatte. Dann stimmt das Timing der OW_Read_Bit()-Routine nicht mehr.
Bei 8MHz funktioniert Gerrits-Routine bestens. Bei 1MHz muss man das Timing etwas anpassen (was dann bei 8MHz immer noch funktioniert).
vy 73 de Matthias, DL9MWE
Re: 1-Wire Schnittstelle (für den Temperatur-Sensor)
Hallo MC-Freunde,
zum Thema "Gerrits Routine" muß ich in diesem Einzelfall anmerken, daß die DS18B20-Routinen von einem Jörg S. stammen (wie im Header steht, von mikrocontroller.net glaube ich) und die Einbindung in ein MSP430-Projekt von Marc-Andre, DG9OBU, als Unterstützung unseres Kurses vorgenommen wurde. Ich habe hinterher nur noch etwas herum getestet.
Für die Kursbeispiele verzichte ich auf eine Kennzeichnung der Quellen mit meinem Namen, weil die urheberische Leistung bisher kaum über ein "Hello World"-Programm hinaus geht und von mir daher nicht als schützenswürdig empfunden wird.![Zwinkern ;)](./images/smilies/icon_e_wink.gif)
Nur um korrekt zu bleiben.
vy 73 de Gerrit, DL9GFA
zum Thema "Gerrits Routine" muß ich in diesem Einzelfall anmerken, daß die DS18B20-Routinen von einem Jörg S. stammen (wie im Header steht, von mikrocontroller.net glaube ich) und die Einbindung in ein MSP430-Projekt von Marc-Andre, DG9OBU, als Unterstützung unseres Kurses vorgenommen wurde. Ich habe hinterher nur noch etwas herum getestet.
Für die Kursbeispiele verzichte ich auf eine Kennzeichnung der Quellen mit meinem Namen, weil die urheberische Leistung bisher kaum über ein "Hello World"-Programm hinaus geht und von mir daher nicht als schützenswürdig empfunden wird.
![Zwinkern ;)](./images/smilies/icon_e_wink.gif)
Nur um korrekt zu bleiben.
vy 73 de Gerrit, DL9GFA