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
> 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;).
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
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 ;-)
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
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.
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
> 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.
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
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.