Themen / Index
onewire - Temperaturwert abholen
Content (automatic)
- #content : Content (automatic)
- #test : Testprogramm
- #bef_frgz : ? Hilfe anzeigen
- #bef_z : z - Stapelspeicherverwendung anzeigen
- #bef_i : i - ROM auslesen
- #bef_l : l - 8 Bytes vom "Scratchpad hereinlesen"
- #bef_r : r - 2 Bytes hinsenden und Antwort anzeigen
- #bef_s : s - Schreibe 2 Bytes
- #bef_p : p - Zeige das Port D an
- #bef_t : t - Hole Temperatur
- #err_64 : Entwicklungsproblematik 2014-06-28
- #fehler : Fehlermeldungen und Ursachen
- #optimieren : Speicherbedarf (suche nach _etext: in der .map-Datei)
- #sieheauch : Siehe auch
- #www : WWW
- #google : Google
Testprogramm
Dieses Testprogramm dient dazu, einen DS1820
auszulesen und die Unterprogramme vorzutesten.
Der Test der Unterprogramme ../lq/tsonewi.htm
erfolgt durch tsonewir.htm.
Der Dialog läuft durch die serielle Schnittstelle RS232, 9600 Baud.
AVR: Dieses Programm läuft
auf dem ../../../etronik/s/atm32b.htm.
Der Sensor DS18S20 wird angeschlossen an PORTD, PD6.
PC/LPT: geht nicht, war aber
so gedacht: Der Sensor wird an ../../../etronik/s/pcpartwi.htm
angeschlossen, an GND - SCL - +5V
- Ausgabe 1 durch 1 an LPT1, D0, outportb( 0x378, 0x01 )
- Ausgabe 0 durch 0 an LPT1, D0, outportb( 0x378, 0x00 )
- Eingabe von 0x379, Bit 5, also Maske 0x20, == 0, wenn Eingang
== 1 inportb( 0x379 ) & 0x10
Befehl 0 : Anzeige
0 - Setze 1
0:0: x-> 1 nach 8 Ticks 0.??????
0.1: 1->0 nach 11935 Ticks 0.????? FEHLER:0.1: trotz
Ausgabe 0 kommt Rueckmeldung 1 Bits gelesen:0
stick0:00.??????
|
Ursache: Es gibt keine Rückmeldung D0 invert -> I4
Überprüfung:
Befehl 0 : muss schon ohne angeschlossenen Sensor anzeigen:
0 - Setze 1
0:0: x-> 1 nach 8 Ticks 0.??????
0.1: 1->0 nach 9 Ticks
....
|
Befehl i : darf nicht anzeigen: "Lese ROM FEHLER:Reset(): Leitung
wird nicht Low Bits gelesen:0 dtick0:0" - Das weist
darauf hin, dass der Sensor nicht geantwortet hat.
? Hilfe anzeigen
onewire
2014-06-28 17:23? - Hilfe anzeigen
z - Stackverwendung
i - Lese ROM
l - Lese von Scratchpad
r - Reize variabel und Lese
s - Schreibe in Scratchpad
p - Zeige PORTD / PIND
t - Temperatur holen
0 - Zeige Ausgabe-Eingang-Verzoegerung
1 - Spiele mit kom2 nach 0xCC
onewire 2014-06-28 17:23
|
z - Stapelspeicherverwendung anzeigen
DIA: Stapel frei =39
verwendet =41 von =80
|
Also kann der Entwickler den Speicherplatzbedarf optimieren:
Anstatt
|
kann sein
|
#define NSTKDIA 80
|
#define NSTKDIA 45
|
Dann ist immer noch 4 Worte Reserve
i - ROM auslesen
Das geht nur, wenn nur ein Gerät angeschlossen ist.
durch i - holezeige8() werden 9 Bytes eingelesen, obwohl nur 8 Bytes
gelesen werden dürfen. Deswegen wird als 9. Byte immer FF abgezeigt.
Mit dem DS1820 von TZ:
i - Lese ROM
Geholt wurde: 10 3F B0 98 01 08 00 5D FF Bits
gelesen:72 dtick0:100.000007s
|
qqcrc8 10 3F B0 98 01 08 00
zeigt, dass CRC5D richtig ist:
D:\h\home\cc\qq>qqcrc8 10 3F B0 98
01 08 00
Daten HEX: 10 3F B0 98 01 08 00
crc8_ALGORITHMUS=1 initval=00H res= 0x5D
Zeit=1.54056us
D:\h\home\cc\qq>
|
Mit dem DS1820 in greuen LEGO-4er mit den 3 Löchern:
i - Lese ROM
Geholt wurde: 10 B0 92 C6 02 08 00 C1 FF
Bits gelesen:72 dtick0:159=0.000010s
|
Hierbei bedeutet laut (1), Seite 6:
10 : DS18S20 1-Wire familiy Code
1...6 : Seriennummer
C1; - Die CRC, kann auch mit qqcrc8 berechnet werden.
FF : gibt es gar nicht
qqcrc8 10 B0 92 C6 02 08 00
zeigt
D:\h\home\cc\qq>qqcrc8 10 B0 92 C6
02 08 00
Daten HEX: 10 B0 92 C6 02 08 00
crc8_ALGORITHMUS=1 initval=00H res= 0xC1
Zeit=1.50826us
D:\h\home\cc\qq>
|
Siehe hierzu: ../qq/qqcrc8.htm und ../lq/crc8.htm
l - 8 Bytes vom "Scratchpad hereinlesen"
l - Lese von Scratchpad
Geholt wurde: 2F 00 4B 46 FF FF 05
10 F1 Bits gelesen:72 dtick0:100.000007s
reset_dt416 Ticks 0.000026 s reset_dt2255 Ticks
0.000141 s
|
Hierbei is in Byte 0 und 1 die Temperatur, Einheit 1/2 grad C
r - 2 Bytes hinsenden und Antwort anzeigen
Es mag hilfreich sein, hier Kommandos vorzugeben:
cc b8
r - Reize und Lese
CC 33 - Ueberspringe ROM
BE 7D - Schmierspeicher holen
55 AA - Waehle ROM aus
48 12 - Schmierspeicher 2 und 3 sichern nach
EEPROM
B8 1D - Schmierspeicher 2 und 3 von EEPROM
wieder holen
4E 72 - Bytes 2 und 3 des Schmierspeichers
veraendern
B4 2D - Spannungsversorgung abfragen
44 22 - Temperatur erfassen
F0 0F - Suche Geraet Vorkommando 1 ?cc
Vorkommando 2 ?be
Geholt wurde: 2F 00 4B 46 FF FF
05 10 F1 Bits gelesen:72
dtick0:100.000007s reset_dt416 Ticks 0.000026
s reset_dt2255 Ticks 0.000141 s
|
s - Schreibe 2 Bytes
Geht nicht, weil nur ein Byte abgefragt und geschrieben wird.
p - Zeige das Port D an
p - PIND=41 PORTD=40
DDRD=FF
|
t - Hole Temperatur
Erst eine Umwandlung starten,
Dann alle 9 Bytes holen.
Dann die Temperatur in °C anzeigen:
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 2F 00 4B 46 FF FF 05 10 F1 Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:23.5grdC
|
Siehe 002F = 47, 47 / 2 = 23.5,
Hinweis: DIe Auflösung könnte durch Byte 6 und 7 (hier 05 und 10,
also 5 und 16) vergrößert werden: etwa T = T + 0.5 * b6/(b7+1)
oder T = T + 0.5 * (b7-b6)/(b7+1) oder T = T + 0.5 *
(b7-b6)/b7 (Siehe Datenblatt)
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 34 00 4B 46 FF FF 0D 10 3C Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:26.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 34 00 4B 46 FF FF 0E 10 69 Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:26.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 34 00 4B 46 FF FF 0F 10 AD Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:26.0grdC
CRC-test mit qqcrc8 34 00 4B 46 FF FF 0F 10 berechnet
AD
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 33 00 4B 46 FF FF 02 10 F4 Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.5grdC
CRC-test mit qqcrc8 33 00 4B 46 FF FF 02 10 berechnet
F4
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 33 00 4B 46 FF FF 02 10 F4 Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.5grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 33 00 4B 46 FF FF 04 10 5E Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.5grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 33 00 4B 46 FF FF 06 10 CF Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.5grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 33 00 4B 46 FF FF 07 10 0B Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.5grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 33 00 4B 46 FF FF 08 10 13 Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.5grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 32 00 4B 46 FF FF 0A 10 C1 Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 32 00 4B 46 FF FF 0B 10 05 Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 32 00 4B 46 FF FF 0C 10 6B Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 32 00 4B 46 FF FF 0C 10 6B Bits
gelesen:72 dtick0:100.000007s
Temperatur:25.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 32 00 4B 46 FF FF 0C 10 6B Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 32 00 4B 46 FF FF 0D 10 AF Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 32 00 4B 46 FF FF 0E 10 FA Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 32 00 4B 46 FF FF 10 10 CA Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:25.0grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 31 00 4B 46 FF FF 01 10 27 Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:24.5grdC
t - Temperatur
Geholt wurde: 00 00 00 00 00 00 00 00 00 Bits
gelesen:72 dtick0:159=0.000010s
Geholt wurde: 31 00 4B 46 FF FF 03 10 B6 Bits
gelesen:72 dtick0:159=0.000010s
Temperatur:24.5grdC
|
Siehe: Register 6 kann die Anzeige um 3 Bits erweitern:
T = int(T) - r6/r7
CRC-test mit qqcrc8 34 00 4B 46 FF FF 0F 10 berechnet AD
Entwicklungsproblematik 2014-06-28
Nur CC 64 liefert FE FF FF FF FF FF FF FF FF, alle anderen Reizungen
liefern FF FF FF FF FF FF FF FF FF.
Ursache Master sendet beim Abfragen zu lange 0 aus,
Fehlerhaft
|
besser
|
delaytick( sectotick( 0.000008 ) ); //
1...unendlich
SETZE0 ; //
Sendeaufforderung
delaytick( sectotick( 0.000002 ) ); //
2 us
PASSIV ;
delaytick( sectotick( 0.000015 )
); // 15...60 us
|
delaytick( sectotick( 0.000008 ) ); //
1...unendlich
SETZE0 ; //
Sendeaufforderung
delaytick( sectotick( 0.000002 ) ); // 2
us
PASSIV ;
delaytick( sectotick( 0.000003 )
); // 3 us
|
Fehlermeldungen und Ursachen
|
|
FEHLER:Reset(): Leitung am
Ende bleibt low
|
Der Pull-Up-Widerstand fehlt
|
reset_dt52 Ticks 0.000026
s reset_dt282 Ticks 0.000141 s
|
|
Versionen
Speicherbedarf (suche nach _etext: in
der .map-Datei)
Hinweis: Atmega32
ROMmax = 32K = 0x8000 RAMmax= 2048 = 0x800
Hinweis: ATMega8
oder ATMega8535
ROMmax = 8K = 0x2000
Hinweis: AT90S2313
ROMmax = 2KB = 0x0800 RAMmax=128B
Hinweis: ATMega48
ROMmax = 4KB = 0x1000 RAMmax=512B
Hinweis: ATMega88
ROMmax = 8KB = 0x2000 RAMmax=1024B
Hinweis: ATMega168
ROMmax = 16KB = 0x4000 RAMmax=1024B
Version
|
Prog
|
Neu in dieser Version
|
20150616
|
ROM: 8372 (20B4H), RAM: 302 (12EH)
|
gcc4.7.2 auf HJH2011
|
Siehe auch
../../../../etronik/sensor/DS18S20.pdf
-
../../../etronik/s/atm32b.htm
-
onewire2.htm - onewire2 -
Temperaturwert abholen (von Peter Dannegger)
tsonewir.htm - So ähnlich, verwendet
aber die Unterprogramme in lq/tsonewi.cpp
../sf/modone_n.htm - 8 mal DS1820 auslesen mit MODBUS-Schnittstelle.
WWW
http://github.com/smurfix/owslave - Das ist ein
Slave !
http://www.tm3d.de/index.php/1-wire-barometerm
- Noch ein Slave - für Barometer
http://milesburton.com/Dallas_Temperature_Control_Library -
http://tushev.org/articles/arduino/item/52-how-it-works-ds18b20-and-arduino
- Messen dauert bis zu 750 ms
Google
quelle one wire C
1-Wire DS18S20