Forum: Mikrocontroller und Digitale Elektronik PIC und Sensor DS18S20


von Geri (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich versuche seit einiger Zeit einen Temperaturmessung mit dem DS18S20
und einem PIC18F452.

Als Pullup dient ein 4K7-Widerstand. Als Ein-Ausgang wird Pin A4
verwendet. Mit einem Oszilloskop habe ich geprüft ob die Resetsequenz
richtig abgearbeitet wird. Diese scheint OK zu sein.
Auch die Delay-Routine scheint zu passen.

Im i-net habe ich einige Beispiele gefunden und bin sie durchgegangen.
Temperatur konnte ich aber noch keine messen. Irgendwo habe ich noch
einen Fehler, kann ihn aber einfach nicht finden!!

Vielleicht habt ihr ja noch einen guten Rat, wenn Ihr den Code
anschaut.

Beste Grüsse und vielen Dank für Eure Tipps

Geri

von Geri (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammmen

Ich hänge immer noch an diesem Problem und komme einfach nicht drauf an
was es liegen könnte. Mein Code funktioniert folgendermassen:

DSRESET();              // Reset Ds18S20
DSTXBYTE(0xCC);    // skip ROM
DSTXBYTE(0x44);    // convert temperature
DelayMS(1500);    // wait until conversion has been finished
DSRESET();    // REset DS18S20
DSTXBYTE(0xCC);    // skip ROM
DSTXBYTE(0xBE);    // read scratch pad
for (k=0; k<9; k++)  // read 9 bytes from scratchpad
  buf[k]=DSRXBYTE();


Das Timing-Diagramm habe ich auch schon mit dem Oszilloskop getestet
(siehe Anhang). Lt. Datenblatt bin ich im erlaubten Bereich.

Wie man am Timing-Diagramm erkennen kann, meldet sich der Sensor bei
einem Reset wie erwartet.

Wenn ich das Scratch-Pad auslese, dann erhalte ich lauter Nullen.

Hat jemand von Euch bitte vielleicht noch eine Idee wo der Fehler
liegen könnte?

Für jeden Hinweis wäre ich sehr dankbar! Ich stehe mit meinem Latein
momentan am Ende.

Vielen Dank im Voraus

Geri

von Geri (Gast)


Lesenswert?

Ach ja, es sind nicht lauter Nullen, die ich auslese, sondern 0xFFs:)

von Axel (Gast)


Lesenswert?

Der Pullup ist viel zu gross.

Ich würde mal 1 KOhm probieren.

Davon abgesehen gibt es in einigen Anleitungen einen Fehler im
Anschluss des DS18x20. Der VDD Pin darf nicht unbeschaltet bleiben.

Mal im Datenblatt nachlesen.

Gruss
Axel

von Geri (Gast)


Lesenswert?

Hallo Axel

Vielen Danm für Deinen Hinweis.

Den 1K-Widerstand habe ich eingelötet. Es ergibt sich allerdings keine
Änderung.

"Davon abgesehen gibt es in einigen Anleitungen einen Fehler im
Anschluss des DS18x20. Der VDD Pin darf nicht unbeschaltet bleiben. "

Ich nehme an, du sprichst vom parasitäteren Betrieb.

Bei mir wird der Sensor mit VDD = 5V betrieben.

VDD liegt bei mir auf 5V+

Vielen Dank nochmals
Geri

von Axel (Gast)


Lesenswert?

Hmm, dann fällt mir auch nichts mehr ein.

Der Code scheint soweit ok zu sein.

Evtl. mal versuchen, das Auslesen des Scratchpads mit dem Oszilloskop
mitzukriegen (evtl. an einem freien Pic-Pin ein Triggersignal
generieren).

Gruss
Axel

von Geri (Gast)


Lesenswert?

Hallo Axel

Vielen Dank für Deine rasche Rückmeldung. Gute Idee! Werde es mal
probieren und mich dann wieder melden.

Beste Grüsse und nochmals vielen Dank

Geri

von Geri (Gast)


Lesenswert?

Habe nun die Antwort vom Sensor beim Lesen des Scratch-Pad mit dem Oszi
aufgenommen.

So wie es aussieht liefert der Sensor acht mal den Wert 0.

hm..???

von Axel (Gast)


Lesenswert?

Dann ist doppelt der Wurm drin.

Denn Null liefert der nur bei 0°C, die Du wohl nicht hast.

Und Dein Programm tastet die Werte dann auch noch falsch ab.

Ich würde mal versuchen, die ganze Datenübertragung nachzuvollziehen
und zu checken.

Also auch das Senden der Codes. Dazu am Besten ein Triggersignal
generieren an den jeweiligen Stellen und jede Aktion einzeln mit dem
Oszi checken.

Gruss
Axel

von Geri (Gast)


Lesenswert?

Hallo Axel

Vielen Dank für Deine Rückmeldung. Habe gedacht, dass das alles passt.
Werde es aber nochmals prüfen.

Im Zimmer hat es aktuell etwa 23 °C.

Vielen Dank, ich werde mich dann wieder melden.

Geri

von Geri (Gast)


Lesenswert?

Habe das Timing der Sendedaten und der gelesenen Daten geprüft. Es
passt. Wenn ich das Scratchpad auslese, erhalte ich acht mal den Wert
0xFF (und nicht 0):)

Beste Grüsse

Geri

von Geri (Gast)


Lesenswert?

Hallo

Ich habe das Problem nun gefunden. Wie Axel gemeint hat, es war ein
Timing-Problem.

Kleine Verzögerungen haben genau gestimmt. Bei grösseren kam es zu
Problemen und ab und zu fehlten ein paar us.
Ich nehme an, dass es ab dieser Definition zu Problemen kam.

#define Delay_us(x) Delay10TCYx(x*5/10)

Delay_us(5); i.O

aus Delays.h
void Delay10TCYx(PARAM_SCLASS unsigned char);

Beste Grüsse und Axel nochmals vielen Dank für Deine Hilfe!!!

Geri
PS: Lauffähigen Code werde ich dann noch posten:)

von Geri (Gast)


Lesenswert?

Hallo zusammen

Ich denke, ich habe das Problem gefunden. Es hat mich mehrere Stunden
gekostet. Irgendwie hat der Compiler ein Problem mit der vierten
Programmzeile.

// falsch
while (1==1)
{
  PORTDbits.RD0 = 1;      // Trigger für Oszi
  Delay10TCYx(50*5/10);   // Wartezeit =  500 us
  PORTDbits.RD0 = 0;      // reset Trigger
}

// richtig
while (1==1)
{
  PORTDbits.RD0 = 1;      // Trigger für Oszi
  Delay10TCYx(50/2);      // Wartezeit =  50 us
  PORTDbits.RD0 = 0;      // reset Trigger
}

Beste Grüsse

Geri

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.