PIC und Sensor DS18S20

Gast #360386
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
Angehängte Dateien:
Gast #360387
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
Angehängte Dateien:
Gast #360389
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
Gast #360390
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
Gast #360391
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
Gast #360394
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
Gast #360395
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
Gast #360397
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:)
Gast #360398
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren