Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > Hallo Matthias, > > > ... > > Da ich die Adresse des Sensor kenne, wollte ich das Ganze über eine Konstante lösen. Aber da habe ich > > momentan noch ein Verständnisproblem. Folgendes habe ich erfolglos versucht. Einen Kompilerfehler > > gibt es nicht, also die Syntax ist erst mal grundsätzlich richtig, aber es klappt nicht: > > <code> > > const DS1820addr[]=16,58,184,96,1,8,0,229; > > byte sensor[8]; > > : > > sensor=DS1820addr; > > : > > getTemp(0,sensor); > > : > > </code> > > Ich vermute mal, dass die Zuweisung so einfach nicht möglich ist. Leider habe ich im Forum und im > > Handbuch nichts darüber gefunden. > > Wie muß hier die Zuweisung erfolgen? > > Ein direktes zuweisen von Konstantenarrays zu Variabelarrays ist nicht möglich. > Dein Syntax ist nicht falsch, sondern bedeutet nur etwas anderes. > Wenn man bei einem Arrays keinen Index angibt, wird dies aus Sicht des Compilers > immer als Index 0 gesehen. > Kurz: <code>sensor=DS1820addr;</code> ist gleichbedeutend mit <code>sensor[0]=DS1820addr[0];</code> > > Das einfachste ist, Du baust Dir eine Hilfsfunktion, und benutzt ein Konstantenarray > für die Sensoradressen "zweidimensional". > Hier das Programmmodul meiner Heizungs-/Solar-/BHKW-Regelung > zur Temperaturauswertung: > <code> > /* > Meßadapter PT1000: > -30°C bis +275°C (Auflösung ca. 0,3K) > -30°C = 0 > 0°C = 103 > 90°C = 413 > 140°C = 581 > 200°C = 780 > 275°C =1023 > > Meßadapter PT1000 Abgas: > -0°C bis 500°C > > Meßadapter AD592: > -40°C bis +130°C > */ > > const Offset[]=0,0,0,0, //Offsets analoge Sensoren > 0,-8,-8,0, > 0,0,0,0, > 0,0,0,0; > > int value[25]; //Temperaturwerte > > //------------------------------- > // Temperatur berechnen > //------------------------------- > function getAD592(long x) returns int > { > if x==10230 return -32000; // Fühler Kurzschluß > if x==0 return -31000; // Fühler unterbrochen > return (170*x)/1023 - 395; > } > > function getPT(int x) returns int > {long y; > if x==0 return -32000; // Fühler Kurzschluß > if x==10230 return -31000; // Fühler unterbrochen > y=x; > if x>=7800 return ((y-7800)*75)/243 +2000; > if x>=5810 return ((y-5810)*60)/199 +1400; > if x>=4130 return ((y-4130)*50)/150 + 900; > if x>=1030 return ((y-1030)*90)/310; > return (y*30)/103 - 300; > } > > function getPTAbg(int x) returns int > {long y; > if x==0 return -32000; // Fühler Kurzschluß > if x==10230 return -31000; // Fühler unterbrochen > y=x; > if x>=8320 return ((y-8320)*100)/191 +4000; > if x>=6320 return ((y-6320)*100)/200 +3000; > if x>=4270 return ((y-4270)*100)/205 +2000; > if x>=2170 return ((y-2170)*100)/210 +1000; > return (y*100)/217; > } > > > //1W-Adressen DS1820, DS18B20, DS1822 > 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 > > const BHKWabgWT = 4; > const BHKWmotV = 3; > const BHKWmotR = 2; > const BHKWm = 1; > const BHKWv = 0; > > const ds2482addr=0; > > const convertTEMP = 0x44; > const readSCRATCHPAD = 0xBE; > > > function matchROM(byte addr, byte sensor) returns int > // ROM[]=8 Byte-Array mit ROM-Adresse > {byte i; > if ds2482.resetDevices(addr) > { > sensor=sensor shl 3;// Offset * 8 > 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 ad; > run 25; > loop > { > for i=0...15 > {// 16 analoge Sensoren am MUXer > if i%4==3 value[i]=getAD592(rbports.ad(i))+Offset[i]; > else value[i]=getPT(rbports.ad(i))+Offset[i]; > } > ad=0; > for i=0...9 ad=ad+ports.adc(4); //PT-Meßadapter f. Abgas > value[16]=getPTAbg(ad); > if j==0 > {// 1Wire-Sensoren nur jeden 4ten Durchlauf (ca. jede Sekunde) > 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; > } > } > </code> > > Ich verwende hier eine eigene Funktion matchROM(), um nur den Sensor-Index > angeben zu müssen. Alle 1Wire-Sensoren stehen in einer Konstantentabelle, > die zweidimensional genutzt wird. > Um die Wartezeit beim Sensorauslesen zu umgehen, lese ich erst den Sensor aus, und > sende erst anschließend das Kommando zum Konvertieren. Der erste Meßwert nach > Einschalten ist dann zwar nicht zu gebrauchen, aber dafür dauert ein Meßzyklus > aller Sensoren nur etwas über eine Sekunde. > > > MfG André H. > > >