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: |