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

Re: Fehlermeldung Kategorie: Programmierung (von Martin Rieger - 15.01.2003 21:29)
Als Antwort auf Re: Fehlermeldung von André H. - 15.01.2003 9:05

Hallo Andre´,

vielen Dank fuer die rasche Antwort.

In der Tat hatte mein Programm einen Array "dataframe" mit ungerader Laenge [11], aber eine Vergroesserung auf eine gerade Grenze [12] brachte keinen Erfolg.

Habe mal das EEPROM geloescht und mit wenigen, aber [1000]-langen Saetzen gefuellt und erfolgreich ausgelesen. Die schiere Menge ausgelesener Daten scheint also nicht das Problem zu sein. V

Mein Programm hatte (und hat?) in der Tat unnötige und unschöne Teile, z. T. auch durch die Fehlersuche hereingekommen. Habe einiges bereinigt und in Gänze abgedruckt. Hoffentlich ist das Teil nicht unzumutbar lang.

Vielleicht hat jetzt jemand eine Idee wg  "ILL INA".

Viele Gruesse, Martin

//------------
  thread logger
//------------
{
  run 20;
  logger2.userinterface();
}


/***************************************************
  logger2.c2
  Datenerfassung mit Hilfe Speicherchipkarten
  Benötigt hwcom.c2 ab V1.1;eeprom.c2 ab V2.2
***************************************************/
const eeadr=0;
const ENDE=0xAA;
const FF=0xFF;
const LEN=50;
const satzlaenge= 1000;//benoetigt werden: 4+ 1*2 +1+1+2+1;
// Monat+Tag+Stunde+Minute + 1* ADCs + P1H + P1L +Temp + ENDE

int    intervall,ADC;
float  temp;
byte   minute,data,dataframe[satzlaenge],i,j,stoplog;
long   pos, EEPromsize;


// naechste freie Position im EEPROM suchen
function getFreePos()
{
 string s;
 pos=1;
 i2c.stop();
 eeprom.readbyte(eeadr,pos);
 loop
 {i2c.stop();
  if (((eeprom.readbyte(eeadr,pos))==FF) // Ende gefunden
      and (eeprom.readbyte(eeadr,pos+(satzlaenge-1)))==FF )
      break;
  pos=pos+satzlaenge;
  if pos >= EEPromsize // EEProm voll
     {stoplog=1;
      break;
     } 
  }
}

// Menue ausgeben
function menu()
{
 string s;
 s="Datenlogger-Programm";
 hwcom.print(s);hwcom.ret();
 datport.datumAusgabe();    // Datum ausgeben
 datport.zeitAusgabe();     // Uhrzeit ausgeben
 s="1= Logger ";
 if stoplog s=s + "starten"; else s=s + "anhalten";
 hwcom.print(s);hwcom.ret();
 s="2= Logger auslesen";
 hwcom.print(s);hwcom.ret();
 s="3= Logger loeschen";
 hwcom.print(s);hwcom.ret();
 s="4= Loggerintervall aendern";
 hwcom.print(s);hwcom.ret();
 s="0= HOSTMODE (Beenden)";
 hwcom.print(s);hwcom.ret(); hwcom.ret();
 s="Intervall:  ";
 str.putint(s,intervall);
 s=s + " Min";
 hwcom.print(s);hwcom.ret();
 s="Datensaetze: ";
 str.putint(s,pos/satzlaenge);
 hwcom.print(s);hwcom.ret();
 if pos>EEPromsize
    {
     s=""; s="Das EEProm ist voll!";
     hwcom.print(s);
    }
 hwcom.ret();
}

// Kopf fuer EEPROM Auslesen ausgeben
function ReadLoggerKopf()
{
 string s;
 hwcom.put(12);
 s="Datenlogger auslesen";
 hwcom.print(s);hwcom.ret();
 s="Waehlen Sie im Hyperterminal ";
 hwcom.print(s);wait hwcom.ready();
 s=""Text aufzeichnen..."";
 hwcom.print(s);hwcom.ret();
 s="Zum Fortsetzen eine ";
 hwcom.print(s);wait hwcom.ready();
 s="Taste druecken ...";
 hwcom.print(s);hwcom.ret();
 wait hwcom.rxd();
 hwcom.flush();
 s="Datum;Zeit;ADC0;P1H.0";
 hwcom.print(s);wait hwcom.ready();
 s="P1H.1;P1H.2;P1H.3;P1H.4;P1H.5;";
 hwcom.print(s);wait hwcom.ready();
 s="P1H.6;P1H.7;P1H.0;P1H.1;P1H.2;";
 hwcom.print(s);wait hwcom.ready();
 s="P1L.3;P1L.4;P1L.5;P1L.6;P1L.7;";
 hwcom.print(s);wait hwcom.ready();
 s="Temperatur;";
 hwcom.print(s); hwcom.ret();
}

// EEPROM auslesen
function ReadLogger()
{
string s,s1,s2,s3,s4,s5;
int tmp, h1, i;
 ReadLoggerKopf();
 h1=0;
 pos=1;
 loop
 {
  // Datensatz lesen
  eeprom.readbytearray(eeadr,pos,dataframe,satzlaenge);
  // Datum und Uhrzeit
  s="";
  str.putint(s,dataframe[1]);
  s=s+".";
  str.putint(s,dataframe[0]);
  s=s+".;";
  str.putint(s,dataframe[2]);
  s=s+":";
  str.putint(s,dataframe[3]);
  s=s+";";
  hwcom.print(s);
  // ADC
  tmp= mem.getint(dataframe,4);
  s1="";
  str.putint(s1,tmp);
  s1=" "+s1+";";
  hwcom.print(s1);
  // Port P1L
  s3="";
  for i=0 ... 7
  {
   s3=s3 + (((dataframe[6] shr i) and 1) + 0x30) + ";";
  }
   hwcom.print(s3);
  // Port P1H
  s4="";
  for i=0 ... 7
  {
   s4=s4 + (((dataframe[7] shr i) and 1) + 0x30) + ";";
  };
  hwcom.print(s4);
  // Temperatur
  tmp= mem.getint(dataframe,8);
  s5="";
  str.putint(s5,tmp);
  s5=" "+s5+";";
  hwcom.print(s5);
  hwcom.ret();
  // naechster Satz?
  pos=pos+satzlaenge;
  if pos>=EEPromsize or
     (((eeprom.readbyte(eeadr,pos))==FF)
      and ((eeprom.readbyte(eeadr,pos+(satzlaenge-1))))==FF)
      break;

  if (h1==50)
   {
    pcf8583.resetWD(); // Watchdog zuruecksetzen,
    h1=0;              // falls Lesen lange dauert
   }
   else
    h1=h1+1;
     
 }
 sleep 10;
 s="Uebertragung abgeschlossen. Be";
 hwcom.print(s);wait hwcom.ready();
 s="enden Sie "Text aufzeichnen...";
 hwcom.print(s);wait hwcom.ready();
 s="" und druecken Sie eine Taste";
 hwcom.print(s);wait hwcom.ready();
 wait hwcom.rxd();hwcom.flush();
 getFreePos();
}

// EEPROM teilweise loeschen
function DelLogger()
{
 string s;
 byte get;
 hwcom.put(12);
 s="Datenlogger loeschen ?(j/n)";
 hwcom.print(s);
 wait hwcom.rxd();
 get=hwcom.get();
 if get=='n' or get=='N' return;
 pos=1;
 for j=0 ... 5                // 5 Saetze ueberschreiben
  {
   for i=0 ... (satzlaenge-1)  // Satz ueberschreiben
   {
    dataframe[i]=FF;
   }
   eeprom.writebytearray(eeadr,pos,dataframe,satzlaenge);
   pos=pos+satzlaenge;
  }
  pos=1;
}

// EEPROM komplett loeschen
function FormatLogger()
{
 string s;
 byte get, array[LEN];
 hwcom.put(12);
 s="Datenlogger formatieren ?(j/n)";
 hwcom.print(s);
 wait hwcom.rxd();
 get=hwcom.get();
 if get=='n' or get=='N' return;
 for i=0 ... (LEN-1)              // Array fuellen
   {
    array[i]=FF;
   }
 pos=1;
 loop                             // komplett ueberschreiben
 {
   eeprom.writebytearray(eeadr,pos,array,LEN);
   if (pos+LEN > EEPromsize)
   { // letztes Stueck byteweise loeschen
     loop
     {
       if pos==EEPromsize
       {
         return;
       }
       else
       {
          eeprom.writebyte(eeadr,pos,FF);
          pos=pos+1;
       }
     }
   }
   pos=pos+LEN;
 }
 pos=1;
}

// Speicherzeitintervall abfragen
function SetIntervall()
{
 string s;
 hwcom.ret();
 s="Neuer Intervall(in Min): ";
 hwcom.print(s);
 intervall=hwcom.input(1);
}

// Datensatz in EEPROM speichern
function log()
{
 int temp_12;
 string s;
// Datenformat:(satzlaengeByte)
// mm dd hh nn ADC P1H P1L temp
 dataframe[0]=system.month();
 dataframe[1]=system.day();
 dataframe[2]=system.hour();
 dataframe[3]=system.minute();
 // ADC lesen
 ADC=ports.adc(0);
 mem.putint(dataframe,4,ADC);
 // Ports lesen
 dataframe[6]=ports.getb(1);
 dataframe[7]=ports.getb(0);
 // twb-Sensor lesen und ausgeben
 temp_12=twbus.get_temp_int(85);
 temp=twbus.get_temp(85);
 s=""; str.putfloatf(s, temp,2);s="temp="+s;
 hwcom.print(s);hwcom.ret();
 mem.putint(dataframe,8,temp_12);
 // Satzende markieren
 dataframe[satzlaenge-1]=ENDE;
 // Satz schreiben
 eeprom.writebytearray(eeadr,pos,dataframe,satzlaenge);
 pos=pos+satzlaenge;
 if pos>=EEPromsize stoplog=1; // EEProm voll
    else  eeprom.writebyte(eeadr,pos,FF);
   
}


// Menue ausgeben und Wunsch abfragen
function userinterface ()
{
 string s;
 int counter;
 byte get;
 EEPromsize=32768;     // Kapazitaet in kByte
 intervall=1;          // Abfrageintervall in min
 counter=0;
 getFreePos();         // erste freie pos, in EEPROM
 pcf8583.synccc2();    // nochman Zeit syncen
 minute=system.minute();
 stoplog=0;             // Logger freigeben
 
 loop
 {
  menu();

  while not hwcom.rxd()
  {  // keine Eingabe
    if system.minute()!= minute
     { // Minute um?
      minute=system.minute();
      counter=counter+1;
     }
    if counter >= intervall and stoplog==0
     { // Zeit zum Loggen
      if pos==1 getFreePos();
      counter=0;
      // zur Kontrolle: Temp auch auf LCD ausgeben
      lcd.clear();
      s="";
      s="T= ";
      str.putfloatf(s,temp,2);
      lcd.goto(0,0);
      lcd.print(s,10);
      // Datensatz aufzeichnen
      log();
      break;
     }
  }
  // Eingabe verarbeiten
  if hwcom.rxd() get=hwcom.get(); else get=255;
  if get=='1' and stoplog
     stoplog=0;
    else
     if get=='1' and stoplog==0 stoplog=1;
  if get=='2' ReadLogger();
  if get=='3' FormatLogger();
  if get=='4' SetIntervall();
  if get=='0'
   {s=12+"HOSTMODE";
    hwcom.print(s);
    quit 1;
   }
  }
}




> Hallo Martin,
>
> >
> > bei einem laenger dauernden Lesevorgang von EEPROM mit Ausgabe auf ein Terminal bekomme ich nach ca 2 min (bzw ca 800 Ausgabezeilen) die Meldung "ILL INA" auf dem internen LCD und der Rechner steht dann.
> >
>
> Der Meldung "ILL INA" heiÃ?t "Illegal Instruction Access Flag".
> Beschreibung des C164 Handbuchs:
> > Die etwas längere Erklärung des C164 Handbuchs:
> > Whenever a branch is made to an odd byte address, the ILLINA flag in register TFR is set and the
> CPU enters the illegal instruction access trap routine. The IP value pushed onto the system stack
> is the illegal odd target address of the branch instruction. >
> Mehr ist leider nicht zu finden.
> Auf jeden Fall wurde zu einer ungeraden Byte Adresse gesprungen.
> Das kann mit Arrays passieren, wenn diese mit einer ungeraden
> Grö�e definiert sind.
> Poste bitte mal die Variabel-Definitionen für die unten verwendeten
> Variablen, und schreibe dazu, ob diese Lokal(innerhalb einer Funktion)
> oder Global sind.
> Vielleicht auch den ganzen Thread.
>
> >
> > Das Codestueck, in dem der Rechner stehen bleiben duerfte,  sieht so aus (gekuerzt)
> > loop
> >  {
> >   eeprom.readbytearray(eeadr,pos,dataframe,satzlaenge);
> >    sleep 100;
> >    s="";
> >   str.putint(s,dataframe[1]);
> >  .......
> >   hwcom.print(s);hwcom.rxd();wait hwcom.ready();
>
> Warum steht hier ein hwcom.rxd() ? Es macht überhaupt keinen Sinn.
> Die Funktion gibt True oder False zurück und signalisiert so, ob Daten
> im Empfangspuffer sind. Aber der Rückgabewert wird nicht ausgewertet.
> Also kann das rxd() ganz raus.
>
> >  .......
> >   tmp= mem.getint(dataframe,8);
> >   s5="";
> >   str.putint(s5,tmp);
> >   s4=" "+s5+";";
> >   hwcom.print(s4);
> >   hwcom.ret(); wait hwcom.ready();
>
> Dieses wait ready() ist nicht notwendig. das macht bereits
> die Funktion ret(); wait ready() wird nur benötigt, wenn mehrer Strings oder
> Bytearrays über dieselbe Variable nacheinander gesendet werden.
>
> >   pos=pos+satzlaenge;
> >  
> >    if pos>=EEPromsize or
> >      (((eeprom.readbyte(eeadr,pos))==0xFF)
> >       and ((eeprom.readbyte(eeadr,pos+(satzlaenge-1))))==0xFF)
> >       break;
> >   .....  
> >  }
>
> MfG André H.
>
>


    Antwort schreiben


Antworten: