Re: DS18S20 abfragen Kategorie: Programmierung (von André H. - 5.08.2006 21:26) | ||
Als Antwort auf DS18S20 abfragen von Heribert - 3.08.2006 9:52 | ||
| ||
Hallo Heribert, > Wenn ich den DS 18S20 mit dem Beispielprg. von Andrè auslese bekomme ich keine gescheiten > Werte. Ich Denke, das es daran liegt, das das Prog für einen DS1822 ist. Soweit so gut nur ich verstehe > das Prog nicht so ganz was müste man an den Zeilen ändern damit es mit dem DS18S20 läuft ? > Die Funktion mu� dann folgenderma�en aussehen: function getTempl(byte ds2482addr, byte ROM[]) returns int {int x; ds2482.matchROM(0,ROM); ds2482.writeByte(ds2482addr,convertTEMP); sleep 750; ds2482.matchROM(0,ROM); ds2482.writeByte(ds2482addr,readSCRATCHPAD); x=ds2482.readByte(ds2482addr) or ds2482.readByte(ds2482addr) shl 8; return x*5; } Prinzipiell kann man aber auch gleich return (ds2482.readByte(ds2482addr) or ds2482.readByte(ds2482addr) shl 8)*5; schreiben. Dann spart man sich, x zu definieren. ;-) Bei Anwendungen mit mehreren 1W-Sensoren ist es sinnvoll, das Kommando zum Konvertieren und die Abfrage der Temperatur in seperate Funktionen zu packen. Auch sollte bei den 1W-Temperatursensoren auf den Betrieb mit Parasite-Power-Mode verzichtet und die Sensoren mit 5V vertsorgt werden. Also mit GND, 1W und 5V anbinden. Ansonsten darf am 1W-Bus kein Traffic herschen, da sonst die Temperatumessung während den 750ms Konvertieren verfälscht wird. Die Abfrage für die 1W-Sensoren an meinem BHKW sieht folgenderma�en aus: Ich habe 4 DS18S20 und einen DS1822(Abgas, nach WT) im Einsatz. ... ... const DS1820addr[]= 16, 226, 153, 255, 0, 8, 0, 101,//0 16, 246, 116, 255, 0, 8, 0, 212,//8 16, 153, 141, 255, 0, 8, 0, 102,//16 16, 185, 77, 255, 0, 8, 0, 242,//24 34, 223, 42, 17, 0, 0, 0, 135;//32 ... ... function matchROM(byte addr, byte sensor) returns int {byte i; if ds2482.resetDevices(addr) { sensor=sensor shl 3; while ds2482.getStatus(addr) and 1; { sleep 1; } ds2482.writeByte(addr,ds2482.MROM); for i=0...7 ds2482.writeByte(addr, DS1820addr[sensor+i]); return -1; } return 0; } function convertDS1820(byte sensor) { matchROM(ds2482addr,sensor); ds2482.writeByte(ds2482addr,convertTEMP); } function readDS1820(byte sensor) returns int {int x; matchROM(0,sensor); ds2482.writeByte(ds2482addr,readSCRATCHPAD); x=ds2482.readByte(ds2482addr) or ds2482.readByte(ds2482addr) shl 8; return x*5; } function readDS1822(byte sensor) returns long {long temp; matchROM(0,sensor); ds2482.writeByte(ds2482addr,readSCRATCHPAD); temp=ds2482.readByte(ds2482addr) or ds2482.readByte(ds2482addr) shl 8; return (temp*625)/1000; } //------------------------------- // AD-Werte holen und als temp // in var speichern //------------------------------- thread gettemp {byte i,j;int cs; run 25; loop { for i=0...15 { if i%4==3 value[i]=getAD592(rbports.ad(i))+Offset[i]; else value[i]=getPT(rbports.ad(i))+Offset[i]; } if j==0 { for i=0...3 { value[20+i]=readDS1820(i); convertDS1820(i); } value[24]=readDS1822(4)-10;//Offset -1K convertDS1820(4); } sleep 250; j=(j+1)%4; } } Die Abfrage der 1W-Sensoren erfolgt ca. einmal pro Sekunde. Nach dem Abfragen wird das Kommando zum Konvertieren gegeben. Die analogen Sensoren werden viermal pro Sekunde ausgewertet. MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: |