Forum: Mikrocontroller und Digitale Elektronik Temperaturauswertung klappt nicht


von Mark Schnitzer (Gast)


Angehängte Dateien:

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

von Mark Schnitzer (Gast)


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

von Karl H. (kbuchegg)


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.

von A.K. (Gast)


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.

von A.K. (Gast)


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

von Frank Schnitzer (Gast)


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

von Wolfram (Gast)


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.

von Frank Schnitzer (Gast)


Lesenswert?

Hallo Wolfram,

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

Gruß

Frank

von Karl H. (kbuchegg)


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.

von Joachim B. (joachimb)


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.

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.