mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DS18s20: Zu hohe Temperatur


Autor: Henning (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

habe schon erfolgreich mehrere DS1820s mit vorgefertigten Funktionen
aus CodevisionAVR verwendet, nun habe ich einen Stapel DS18s20 hier
rumliegen (genauer gesagt die DS18s20z im 8pin-Gehäuse), mit den
gleichen Funktionen und Timings bekomme ich jedoch ca. 200° anstatt ca.
25-30° geliefert.

Wenn ich diese mitgelieferten CodevisionAVR-Libraries für 1Wire und den
DS1820 durch manuelle ersetze (siehe Anhang, Code ist hier aus dem
Forum), dann bekomme ich auf einmal Temperaturen von ca. 90° anstatt
der 25-30°.

Nun dachte ich, dass das ein Timing-Problem sei, habe an den
µs-Verzögerungen manipuliert und rumgespielt, aber keine Annäherung an
die richtige Temperatur hinbekommen.

Hat jemand eine Idee?

Controller ist ATmega8535 (8MHz), ich schreibe in C und compiliere mit
CodevisionAVR.


Vielen Dank für jede Unterstützung.

Viele Grüße,
Henning

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss nicht, ob's mit dem Problem irgendwas zu tun hat, aber die
Steuerung vom 1W Pin scheint mir problematisch. 1-Wire ist immerhin als
Open-Drain-Bus definiert.

Vom Messvorgang mit parasitärer Stromversorgung vom Sensor mal
abgesehen, sollte es keinen Zeitpunkt geben, zu dem der Prozessor den
Pin aktiv hochzieht. Hier hingegen wird stets erst der Pin als Ausgang
definiert, dann der Wert gesetzt. D.h. für 1 Takt wird der Pin ggf.
hochgezogen - kommt ein Interrupt dazwischen, dann entsprechend
länger.

Insgesamt also: Das Output-Latch anfangs einmalig auf 0 setzen und so
stehen lassen. Danach nur noch per Direction-Register arbeiten, 0=high
via externem Pullup, 1=low.

Ansonsten: Peter Danegger hat dazu einen recht passablen Code
veröffentlicht. Versuch's mal damit. Der ist zwar auch nicht 100%
Interrupt-fest aber zum Test reicht es [der Fehler: wenn in
start_meas() nach ow_command und vor ow_parasite_enable einer
reinrutscht, dann geht beim Sensor das Licht aus].

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du Dir mal den Assembler von Deiner Delay-Routine angesehen ?

Eine Multiplikation zur Laufzeit und noch dazu im Schleifentest ist
zumindest für alle AT90S und ATTinys tödlich.

Zieh mal die Multiplikation raus per #define, es sind doch alles
konstante Delays.

Dann sollten auch kleine Delays (15µs) funktionieren.


@A.K.

wenn man längere Interrupts hat, muß man das kapseln.

In dem Beispiel ist aber nur ein sehr kurzer Timerinterrupthandler, da
geht es auch so.

In jedem Fall ist ja nach dem letzten Datenbit noch eine Pause von 60µs
bis das strong-pullup aktiviert werden kann, da machen 10µs mehr den
Kohl nicht fett.


Peter

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich unterstuetze die Vermutung das es am Pegel liegt. Ich hab mal eine
Schaltung entwickelt die mit den ersten DS1820 im langen Gehaeuse
lieft. Als dann spaeter die neuen im kurzen Gehaeuse rauskam hat sie
nicht mehr funktioniert.
Ursache war bei mir das ich den Pullup-Widerstand vergessen habe.
<schaem> Den alten Typen war das interessanterweise egal, den neuen
aber nicht mehr. Die muessen sich da also irgendwie unterscheiden.

Olaf

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter: Schon ok so, wenn da bloss deine knapp gehaltenen Interrupts
dazwischen kommen - ich habe hier im Forum allerdings schon Interrupts
im MS-Bereich und drüber gesehen. Grad heute, wo jemand im seriellen
Interrupt den kompletten Inhalt eines DRAMs über die serielle würgt.

Ich hatte deinen Code vor allem deshalb nach so etwas durchforstet,
weil das bei Multitasking weit stärker ins Gewicht fällt. Da kann die
Pause schon mal länger dauern. Kapseln kam wiederum auch nicht in
Frage, weil's dafür zu lang dauert. Meine Lösung war, Bit- und
Byte-Routine mit abgeschaltetem Interrupt zu beenden und den Caller das
Einschalten zu überlassen. So sind die Interrupts nur jeweils für gut 15
µs ausgeschaltet.

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:

Ich habe nicht die delay-Funktion aus der oben angehängten C-File
benutzt sondern die standardmäßig bei CodevisionAVR inkludierten
Funktionen.

Liegt da also die Ursache allen Übels?

Das wäre aber merkwürdig, da ich wie gesagt an den delay-Werten grob
rumgespielt habe und es hat sich entweder nichts an den
Scratchpad-Temperaturwerten geändert oder er hat schlagartig konstante
0xFF geliefert wegen falschen Timings.

Viele Grüße,
Henning

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.