Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, C-Control II Station, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.1
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: