mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Temperaturauswertung klappt nicht


Autor: Mark Schnitzer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche seit zwei Wochen, die erweiterte Auflösung beim DS18S20 zu
realisieren, und auf LCD auszugeben. Dazu habe ich nach dem Auslesen der
Temperatur folgendes mir ausgedacht (nur im positiven
Temperaturbereich):

- Low Temperatur auslesen, und um eine Stelle nach rechts rotieren
- Low Temp. x 16
- Low Temp. - 4
- Count_Remain auslesen, und anschließend diesen Wert von 16 abziehen
- Low Temp. + Count_Remain
- In der Zwischenzeit ist der Wert natürlich größer als 8 Bit
- High- und Low Byte x 10
- High- und Low Byte / 16

Jetzt nur noch die Analyse zu einzelnen Dezimalstellen, und ASCII
Offset dazu addieren.

Mein Problem ist, dass er die Temperatur anzeigt, aber fehlerhaft, nach
folgendem Beispiel:

.. 21,8 , 21,9 , 22,0 , 22,1 , 23,2 , 23,3........

Ich bekomme es leider nicht gelöst, die Ursache des Problems zu
finden.

Im Anhang ist der kommentararme Assemblercode, der eigentlich leicht zu
verstehen ist. Ich muss zugeben, dass ist mein erstes größeres
Assemblerprogramm, und würde mich über jeden Tip freuen.

MFG

Mark Schnitzer

Autor: Mark Schnitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

also ich werde dass Gefühl nicht los, dass der Temperatur LSB in der
Mitte der Subtraktion von 16 - Count_Remain, um 1 nach oben/unten
springt, dass dadurch meine ganze Berechnung dann hin ist.

Ich habe mittlerweile schon alles hundertmal gecheckt. Das Programm
habe ich ausschnittsweise kopiert, ein fiktiven Temperatur- und
Count_Remain Wert mir ausgedacht. Da ging es.

Aber mit dem Sensor klappt der tupfergleiche Code nicht.

MFG

Mark

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann stell fest, welche Werte du vom Sensor kriegst
und spiel dein Programm mal mit Papier und Bleistift
durch (nachverfolgen welche Berechnungen gemacht
werden und welche Zwischenergebnisse sich ergeben).
Dann weisst du auch wie und warum dein µC zu den
Ergebnissen kommt die er dir schlussendlich anzeigt.
Danach kannst du überlegen, wo dein Denkfehler liegt
und etwas dagegen tun.

Das ganze nennt sich 'debugging', und ist das Salz
in der Suppe jedes Programmierers.

Aber erst mal musst du feststellen, welche Werte
tatsaechlich vom Sensor kommen.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist übrigens beim 18B20 deutlich einfacher als mit dem 18S20. Der
liefert die Temperatur direkt in 16tel.

Kleine Tips am Rande:

- LSR interessiert sich nicht für C (das ist ja grad der Unterschied zu
ROR), CLC davor ist also überflüssig.

- Ein AVR ist zwar kein 16bitter, aber derart kompliziert wie
beispielsweise in minus_vier ist der Umgang damit nun auch wieder
nicht:
   subi temp_low, 4
   sbci temp_high, 0
Andere Stellen sind ähnlich, wobei man die Addition einer Konstanten
als Subtraktion des negativen Wertes realisiert.

Im Interrupt:
  in temp1, SREG
  push temp1
Jeder Interrupt vernichtet so den laufenen Inhalt von temp1. Besser
  push temp1
  in temp1, SREG
  push temp1
Alternativ kannst du auch eines der Register ausschliesslich für
Speicherung vom SREG verwenden.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Statt mit
  .equ temperature_lsb = 0x060
alles in Handarbeit zuzuweisen, kann man das ganz gut dem Assembler
überlassen:
  .dseg
temperature_lsb: .byte 1
temperature_msb: .byte 1
TH_register:     .byte 1
[...]
  .cseg

Autor: Frank Schnitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Karl Heinz,

vom Sensor bekomme ich nur zwei Werte: Temperaturwert als 8 Bit, und
Count_Remain, für die erweiterte Auflösung. Ein Debugging während der
Laufzeit geht nicht.

@A.K,

Ich werde die Codefragmente überarbeiten.

Mal sehen ob sich da was tut. Danke für die Tips.

Gruß

Frank

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>multi_zehn:
>    mov test_low, temp_low
>    mov test_high, temp_high
>    lsl temp_low
>    rol temp_high

kann es sein das das andersrum gemeint ist
also
>    mov  temp_low,test_low
>    mov temp_high, test_high

mov ist doch mov Ziel,Quelle
und ich sehe nicht ganz den Sinn warum du in einer unterroutine zum
Multiplizieren erstmal die in Werte(test) speicherst und dann mit den
anderen arbeitest. Aber vielleciht ist es ja auch nur der übergeordnete
Algorithmus.

Autor: Frank Schnitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Wolfram,

die "Test" Variablen sind nur als Zwischenspeicher gedacht, damit ich
mit diesen Werten später eine Addition machen kann.

Gruß

Frank

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> vom Sensor bekomme ich nur zwei Werte: Temperaturwert als 8 Bit,
> und Count_Remain, für die erweiterte Auflösung. Ein Debugging
> während der Laufzeit geht nicht.

Was heist 'geht nicht'.
Natürlich gehts. Du hast ein LCD. Was perfekteres als dort
mal die Werte die man vom Sensor kriegt auszugeben gibts
wohl selten.

Autor: Joachim Börke (joachimb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> vom Sensor bekomme ich nur zwei Werte: Temperaturwert als 8 Bit,
> und Count_Remain, für die erweiterte Auflösung.

Da liegt u. U. das Problem. Um die höhere Genauigkeit nutzen zu können,
muß man die Temperatur, COUNT_REMAIN und COUNT_PER_C verrechnen. (Also
drei Werte!) Die Formel dazu steht im Datenblatt des DS18S20.

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.