Re: Zuweisen von Arraykonstanten an Variablen Kategorie: Programmierung (von André H. - 7.07.2008 18:14) | ||
Als Antwort auf Zuweisen von Arraykonstanten an Variablen von Matthias - 7.07.2008 17:17 | ||
| ||
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: > > const DS1820addr[]=16,58,184,96,1,8,0,229; > byte sensor[8]; > : > sensor=DS1820addr; > : > getTemp(0,sensor); > : > > 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: sensor=DS1820addr; ist gleichbedeutend mit sensor[0]=DS1820addr[0]; 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: /* 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; } } 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. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: |