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

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

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 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 &gt;= 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&gt;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&gt;=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==&#39;n&#39; or get==&#39;N&#39; 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==&#39;n&#39; or get==&#39;N&#39; 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 &gt; 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&gt;=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 &gt;= 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==&#39;1&#39; and stoplog > stoplog=0; > else > if get==&#39;1&#39; and stoplog==0 stoplog=1; > if get==&#39;2&#39; ReadLogger(); > if get==&#39;3&#39; FormatLogger(); > if get==&#39;4&#39; SetIntervall(); > if get==&#39;0&#39; > {s=12+"HOSTMODE"; > hwcom.print(s); > quit 1; > } > } > } > > > > > &gt; Hallo Martin, > &gt; > &gt; &gt; > &gt; &gt; 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. > &gt; &gt; > &gt; > &gt; Der Meldung "ILL INA" heißt "Illegal Instruction Access Flag". > &gt; Beschreibung des C164 Handbuchs: > &gt; <i&gt;A branch to an odd address has been attempted.</i&gt; > &gt; Die etwas längere Erklärung des C164 Handbuchs: > &gt; <i&gt;<b&gt;Illegal Instruction Access Trap</b&gt; > &gt; Whenever a branch is made to an odd byte address, the ILLINA flag in register TFR is set and the > &gt; CPU enters the illegal instruction access trap routine. The IP value pushed onto the system stack > &gt; is the illegal odd target address of the branch instruction.</i&gt; > &gt; > &gt; Mehr ist leider nicht zu finden. > &gt; Auf jeden Fall wurde zu einer ungeraden Byte Adresse gesprungen. > &gt; Das kann mit Arrays passieren, wenn diese mit einer ungeraden > &gt; Größe definiert sind. > &gt; Poste bitte mal die Variabel-Definitionen für die unten verwendeten > &gt; Variablen, und schreibe dazu, ob diese Lokal(innerhalb einer Funktion) > &gt; oder Global sind. > &gt; Vielleicht auch den ganzen Thread. > &gt; > &gt; &gt; > &gt; &gt; Das Codestueck, in dem der Rechner stehen bleiben duerfte, sieht so aus (gekuerzt) > &gt; &gt; loop > &gt; &gt; { > &gt; &gt; eeprom.readbytearray(eeadr,pos,dataframe,satzlaenge); > &gt; &gt; sleep 100; > &gt; &gt; s=""; > &gt; &gt; str.putint(s,dataframe[1]); > &gt; &gt; ....... > &gt; &gt; hwcom.print(s);hwcom.rxd();wait hwcom.ready(); > &gt; > &gt; Warum steht hier ein hwcom.rxd() ? Es macht überhaupt keinen Sinn. > &gt; Die Funktion gibt True oder False zurück und signalisiert so, ob Daten > &gt; im Empfangspuffer sind. Aber der Rückgabewert wird nicht ausgewertet. > &gt; Also kann das rxd() ganz raus. > &gt; > &gt; &gt; ....... > &gt; &gt; tmp= mem.getint(dataframe,8); > &gt; &gt; s5=""; > &gt; &gt; str.putint(s5,tmp); > &gt; &gt; s4=" "+s5+";"; > &gt; &gt; hwcom.print(s4); > &gt; &gt; hwcom.ret(); wait hwcom.ready(); > &gt; > &gt; Dieses wait ready() ist nicht notwendig. das macht bereits > &gt; die Funktion ret(); wait ready() wird nur benötigt, wenn mehrer Strings oder > &gt; Bytearrays über dieselbe Variable nacheinander gesendet werden. > &gt; > &gt; &gt; pos=pos+satzlaenge; > &gt; &gt; > &gt; &gt; if pos&gt;=EEPromsize or > &gt; &gt; (((eeprom.readbyte(eeadr,pos))==0xFF) > &gt; &gt; and ((eeprom.readbyte(eeadr,pos+(satzlaenge-1))))==0xFF) > &gt; &gt; break; > &gt; &gt; ..... > &gt; &gt; } > &gt; > &gt; MfG André H. > &gt; > &gt;
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB