Forum: Mikrocontroller und Digitale Elektronik DS1820/DS18S20


von GAST (Gast)


Lesenswert?

hallo
ich hab mal eine frage zum ds1820
die gemessene Temperatur ist richtig wenn ich nun unter null grad messe
dann müsste doch im MSB 0x00 für positive und MSB 0xFF für negative 
Temperatur drin stehen,oder bin ich da aif dem Holzweg
mfg

von Gast (Gast)


Lesenswert?

Laut Datenblatt? JA

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> oder bin ich da auf dem Holzweg

Jein ;-)

Genaugenommen ist MSB das Most Significant Bit. Also nicht 0x00 oder 
0xFF stehen drin, sondern 0 und 1.

Da der Sensor nicht genau 8 oder 16 Bit zurückliefert, liegt es bei der 
Ansteuerlibrary bzw. deinen Einlesefunktionen wie die restlichen, nicht 
vom Sensor gelesenen Bits ergänzt werden.

Ich nehme das MSB und setze die anderen hochwertigen Bits dann 
entsprechend. Bsp. 9-Bit Ergebnis vom Sensor 0x1FF (= 511 dez.) 
erweitert auf 16-Bit => 0xFFFF (= -1 dez. im Zweierkomplement, d.h. wenn 
int16_t i = 0xFFFF;).

von GAST (Gast)


Lesenswert?

guten tag,
ich habe das jetzt mal getestet wenn die temperatur über null grad ist 
dann ist im MSB 0 und wenn ich unter null grad bin zb-1 grad dann steht 
im MSB 223 drin ,
vielleicht könnt mir einer weiterhelfen
mfg

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich beziehe mich im folgenden auf dieses Datenblatt:
http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf

Das Datenformat der Antwort des Sensors ist in Figure 2 erklärt. Wie das 
Datenformat in dein Programm kommt, weiss ich nicht, da kein Sourcecode 
vorhanden ist. Daher im folgenden die Erklärung mit den Daten im 
Datenblatt.

Es gibt ein Least Significant Byte (LS) Bits 0-7 und ein Most 
Significant Byte (BS) Bits 8-15 einer 16-Bit Antwort.

In BS steht das Vorzeichen drin und in LS der Wert. Alle Bits von BS 
sind für das Vorzeichen da. Das was ich in der Nachricht oben 
geschrieben habe bzgl. einem einzelnen Bit und Auffüllen ab 9. Bit ist 
bei diesem Sensor falsch bzw. nicht nötig. Ich hatte da noch die 
Diskussion zum DS1620 im Kopp.

In Table 1 sind Beispielwerte angegeben:

<pre>
Temperatur     16-Bit-Wert        Hex.   Dez.
               BS        LS
----------------------------------------------
+0.5°C         00000000  00000001 0x0001   1
 0.0°C         00000000  00000000 0x0000   0
-0.5°C         11111111  11111111 0xFFFF   -1
</pre>

Der Wert 223 (dez.) = 0xDF = 0b11011111 dürfte in BS rein logisch 
gesehen nicht vorkommen. Ausgenommen es gibt Probleme bei der 
Ansteuerung des Sensors oder in der Abfragefunktion für den Sensor.

Der 16-Bit Wert ist ein signed Wert (mit Vorzeichen) und gibt 
vereinfacht gesagt die Zahl der 0,5°C Schritte bis zur gemessenen 
Temperatur an.

Wenn das Problem damit nicht in den Griff zu bekommen ist, schlage ich 
vor, dass du die Hosen runterlässt und deinen Quellcode zeigst, so dass 
man da nachforschen kann und nicht raten muss ;-)

von GAST (Gast)


Angehängte Dateien:

Lesenswert?

hallo,
ich habe mal meinen code angehängt
ist aber nicht sehr aufgeräumt.
das programm liest derzeit 10sensoren aus (die ID der sensoren hab ich 
vorher bei jeden einzeln ausgelesen)die plusgrade stimmen ja aber mit 
den minusgraden da hab ich meine probleme mit.
mfg

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die DS18S20 Routinen sehen gut aus (von wem sind die?) und wenn der 
Sensor richtig angeschlossen ist (an PC0 mit externem Pullup) sollten da 
auch vernünftige Daten kommen.

Der Haken liegt IMHO in diesem Teil der diversen sensor_x Routinen:
1
  ldi  temp5, 0       ; temp5 = 0
2
  ori  temp5,0x30     ; temp5 += '0' // temp5 = '0'
3
  sts  rsbuff+0,temp5 ; rsbuff[0] = temp5
4
  ldi  temp5, 1       ; temp5 = 1
5
  ori  temp5,0x30     ; temp5 += '0' // temp5 = '1'
6
  sts  rsbuff+1,temp5 ; rsbuff[1] = temp5
7
8
; ... Einlesen des Messwertes ...
9
10
  ; Vorzeichenbehafteter 16-Bit Messwert steht in temp_msb temp_lsb
11
  lds temp5, temp_lsb 
12
  ror temp5
13
  rcall lcd_number

Das ist ungeeignet, um den Messwert auszugeben.

Es wird statt temp_msb auszuwerten ein konstanter String "01" ausgegeben 
und an den wird der in eine zweistellige Dezimalzahl gewandelte 
halbierte 8-Bit Wert aus temp_lsb angehängt.

Die richtige Variante wäre, temp_msb in die Ausgabe einzubeziehen. Z.B.

Zuerst prüfen, ob temp_msb 0x00 ist ('+' Vorzeichen oder ' ') oder 0xFF 
('-' Vorzeichen).

Wenn '-' Vorzeichen, dann Betrag von temp_lsb bilden (temp_lsb = 0 - 
temp_lsb).

Optional: Nachkommastelle (.5°C-Schritte) bearbeiten. Prüfen auf 0.5°C 
im LSB (1 => nachkommastelle = '5', 0 => nachkommastelle = '0').

temp_lsb durch 2 teilen.

Dann Vorzeichen ausgeben, temp_lsb ausgeben (3 Dezimalstellen: +125°C 
bis -55°C), optional '.' ausgeben, dann Nachkommastelle ausgeben.

von GAST (Gast)


Lesenswert?

hallo,
>Die DS18S20 Routinen sehen gut aus (von wem sind die?)
die hab ich glaube ich aus dem i-net nur ein kleinwenig abgeändert


>Der Haken liegt IMHO in diesem Teil der diversen sensor_x Routinen:
>  ldi  temp5, 0       ; temp5 = 0
>  ori  temp5,0x30     ; temp5 += '0' // temp5 = '0'
>  sts  rsbuff+0,temp5 ; rsbuff[0] = temp5
>  ldi  temp5, 1       ; temp5 = 1
>  ori  temp5,0x30     ; temp5 += '0' // temp5 = '1'
>  sts  rsbuff+1,temp5 ; rsbuff[1] = temp5

die werte die in rsbuff und rsbuff+1 drin stehen sind die sensor nummern
damit ich weiss wo welcher sensor ist

>Die richtige Variante wäre, temp_msb in die Ausgabe einzubeziehen. Z.B.
>Zuerst prüfen, ob temp_msb 0x00 ist ('+' Vorzeichen oder ' ') oder 0xFF
>('-' Vorzeichen).
das habe ich ja auch gemacht wenn die werte über null grad sind dann 
steht ja uch im msb 0x00 drin aber nicht wenn sie unter null grad sind
dann bekomm ich entweder 128 oder 127 angezeigt
aber wie gesagt mit den werten unter null grad funktioniert bei mir 
jedenfalls nicht

mfg

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> die werte die in rsbuff und rsbuff+1 drin stehen sind die sensor nummern
> damit ich weiss wo welcher sensor ist

Ah, das habe ich in der Source mit den vorhandenen Kommentaren nicht 
gesehen. Ich habe nur die Funktion sensor_0 näher angesehen. In sensor_1 
usw. wird dann wahrscheinlich die Inhalte von rsbuff und rsbuff+1 
hochgezählt.

> aber wie gesagt mit den werten unter null grad funktioniert bei mir
> jedenfalls nicht

Weiss ich, hast du schon geschrieben und ich weiss auch wieso ;-)

Wenn du deinen problematischen Quellcode nach meinem obigem Vorschlag 
umschreibst? Funktioniert es dann auch nicht? Wenn der Teil 
umgeschrieben ist, kannst du den ja wieder zum Begutachten an deine 
nächste Nachricht anhängen.

Du hast in deinem Programm eine UART-Übertragung drin. Ich würde die zum 
Debuggen nutzen und mir die Rohdaten in temp_msb und temp_lsb 
übertragen lassen und auf dem PC in HEX protokollieren (z.B. auf dem 
Windows-PC mit HTerm oder dem Br@y-Terminal aus dem Artikel RS232). 
Die Übertragung z.B. mit 4 Bytes: * für Start, temp_msb, temp_lsb, # für 
Ende des Telegramms. Das kannst du mitloggen und auch in einem 
Zip-Archiv an deine nächste Nachricht anhängen.

von GAST (Gast)


Angehängte Dateien:

Lesenswert?

hallo,
so ich habe das programm so umgeschrieben das nur ein sensor ausgelesen 
wird und alles überflüssige rausgeschissen.
das programm sendet zuerst das lsb+cr dann das msb+13.
hab jetzt mal im plusbereich gemessen msb=0 und im minusbereich msb=255 
so wie es im datenblatt auch steht.


ich hatte das programm denn mal so umgeschrieben das ich zuerst prüfe ob 
das msb bit 0 oder 1 ist, im plusbereich hatte es ja funktioniert aber 
im minusbereich dann nicht er zeigte dann 254 (-1°)

zb.
lds temp,msb
cpi temp,1        ;ist minusbereich
breq minus        ;ja
print pluss       ;gib plusszeichen aus
rjmp weiter
minus:
print minus      ;gib minuszeichen aus

weiter:


die plusszahlen werden ja korrekt ausgegeben aber wenns ins minus geht 
da komme ich nicht ganz mit klar die zahlen korrekt auszugeben

vielleicht könnte mir da nochmal jemand weiterhelfen

mfg

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich schaue mir die Rohdaten an und ich hoffe der "zb." Quellcode inkl. 
dem seltsamen "print" ist in echt im Archiv. Wenn ja, checke ich den 
auch. Bis denn erstmal ;-)

...

Wieder da. Die Rohdaten sehen perfekt aus. Der Sensor arbeitet über Null 
und unter Null. Du hast nicht weit unter Null getestet, gell? In dem 
Assembler-Quellcode im Archiv ist keine Spur einer Umwandelroutine zu 
finden.

Mal sehen, ob ich das ohne Vorlage hinbekomme. Meine ASM-Kenntnisse 
beschränken sich nämlich auf's Debuggen. Komplett von Null losschreiben 
ist eine andere Kiste.

Wenn ich mich lange nicht mehr melde, habe ich mich in den 
Maschinenbefehlen verstrickt. Es kann sich für dich lohnen, dass du 
irgendeinen Quellcode beibringst, dir nur zu debuggen ist ;-)

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

So im Anhang ist mal was. Ich habe dein "temperatur zum pc.asm" 
umgestrickt, so dass man was Debugbares/Simulierbares bekommt.

Achtung, da ich den Sensor nicht habe, sind alle Funktionen hierzu als 
Dummyfunktionen (einfaches RET) drin. Nur read_scratchpad füllt temp_lsb 
und temp_msb für die Simulation. Pass auf, dass du deine Quellen 
sicherst und nicht überschreibst!

Die Umwandlungsfunktion 8-Bit => Dezimalzahl (ohne Unterdrückung der 
führenden Nullen) stammt aus dem AVR Tutorial. Vorzeichen, Komma und 
Nachkommastelle wie oben beschrieben.

ADD: Ich habe nicht das AVR Assembler Instruction Set gewälzt und die 
optimalen Befehle gesucht sondern genommen, was gerade passte. Da kannst 
du sicher noch Eleganz reinbringen ;-)

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.