Re: I2CCOM 64Byte FIFO Lesefehler ??? Kategorie: I²C-Bus (von FF - 15.02.2006 6:49) | ||
Als Antwort auf Re: I2CCOM 64Byte FIFO Lesefehler ??? von FF - 13.02.2006 10:08 | ||
| ||
> > Hallo FF, (<- guter Name ;-) ) > > > > > > > ich möchte mit der CC2-Station Daten aus einer Wetterstation (Elsner P02-RS465) verarbeiten. > > > Die Wetterstation ist an einen Wandler RS485 nach RS232 angeschaltet. > > > Wenn ich nun den bisherigen Aufbau an eine COM-Schnittstelle eines PC's anschliesse und > > > 19200baud 8N1 einstelle, kann ich auf dem Monitor (mittels Programm, das den Eingang an COMx > > > auf den Bildschirm zaubert) jede Sekunde einen neuen 40Byte langen Ausdruck sehen. > > > Schliesse ich das ganze an die I2CCOM an, gelingt es mir nur 16Byte unterschiedliche Bytes > > > zu empfangen, bevor wieder mit dem Inhalt des ersten Byte begonnen wird. > > > > > > Bei der I2CCOM habe ich den TL16C550C gegen TL16C750 ausgetauscht. > > > => initCOM(1,0,1) > > > > > > Ich kann mit get() das Endzeichen 0x03 des 40Byte langen Protokolls separieren. > > > Danach setze ich ein flush() um den Empfangspuffer zu leeren für den nächsten Datensatz. > > > Danach ist es egal, ob ich receive(DATA[]) mit DATA[40] verwende oder über eine > > > Schleife die 40 Zeichen versuche einzeln mit get(DATA[i]) einzulesen. > > > Ich erhalte nur 16 von den 40 Zeichen. > > > > > > Hat jemand eine Idee, wo das Problem liegen könnte oder einen Lösungsvorschlag ??? > > > > Poste am besten einmal kurz Deine Routinen. > > Denn, der 64Byte-Fifo ist von mir natürlich gestestet und funktioniert ohne Probleme. > > Darum vermute ich, da� es irgendeine Kleinigkeit an den Routinen ist. > > (z.B. versehentliches Zurücksetzen des 64Byte-FiFo-Modes etc.) > > > > Du kannst das Bit auch mit i2ccom.getReg(comport,i2ccom.IIR) wieder auslesen. > > Beim Rückgabewert mu� dann Bit 5 gesetzt sein. > > > > MfG André H. > > > Hallo zurück und vielen DANK für den Tipp, > > ich muss meine Aussage z.T. revidieren. Es können tatsächlich mehr als 16 Byte von der I2CCOM > gelesen werden. Aber nach 28 bzw. 29 Zeichen (Byte) gibt es eine �berlagerung, so dass die Zeichen > 29-40 eine Wiederholung der Zeichen 1-12 darstellen. Dies ist unabhängig davon, welche Methode > ich zur Selektion des Anfangs zum Lesen wähle. Im folgenden Beispiel triggere ich das Einlesen > des 40Byte-Arrays der Wetterstation,in dem ich den Puffer der I2CCOM so lange leere, bis eine > Sendepause der Wetterstation erreicht ist. Dann wird versucht, über i2ccom.receive() das nächste > 40Byte Array einzulesen. Als zusätzlicher Effekt ist noch zu nennen, dass bei dem Beispielcode > die Anzahl der eingelesenen Byte's zwischen 16 und 40 pro funktionsdurchlauf differiert. > Hier der Beispielcode mit Initialisierung, Einlesen und Ausgabe am LCD-Displ. der Station II: > > > //-----------------I2CCOM initialisieren und einstellen ----------------------// > function i2ccom_init() returns int > { > int i2ccom_erkannt; > i2ccom_erkannt=0; // = nicht erkannt > i2ccom.setDataPCF(7); //I2C-Adresse 7 > i2ccom.defineCOM(1,6,0); //Com1,I2C-Adresse Ctrl 6, Sub-Adre. 0 > i2ccom_erkannt=i2ccom.initCOM(1,0,1);//Com1,Autoflow = aus 0/ 64Byte-Puffer = 1 > i2ccom.setFormat(1,i2ccom.set8N1); //Com1,Datenformat 8 Daten no par. 1 Stopp > i2ccom.setspeed(1,6); //Com1, 19200 Baud > return i2ccom_erkannt; > } > > //-----------------Wetterdaten von I2CCOM COM1 lesen -------------------------// > function get_wetter() returns int > { > int anzahl_daten; > byte I, J,DATA[40], s1[16], s2[16], s3[8]; //s1, s2, s3 für lcd-Ausgabe > > for I=0...39 > { > DATA[I]=35; //Belegung alle Felder DATA mit '#' > if I<16 > { > s1[I]=36; //Belegung Ausgabestrings S1-S3 mit '$' > s2[I]=36; > if I<8 s3[I]=36; > } > } > i2ccom.flush(1);//leeren des Eingangspuffers der I2CCOM COM1 > anzahl_daten = 0; > while i2ccom.rxd(1); //den Puffer so lange leeren, bis keine Daten > { // mehr gesendet werden (beginn Sendepause) > i2ccom.flush(1); > sleep 10; > } > //0x57= 1.Zeichen des Protokolls der Wetterstation > //0x03 = Endekenneung des 40Byte langen Datensatzes der Wetterstation > anzahl_daten=i2ccom.receive(1,DATA,40, 999); //es wird 1x pro Sekunde gesendet > for J=0...16 > { > s1[J]=DATA[J]; //Gelesene Daten in Ausgabestring s1-s3 übertragen > s2[J]=DATA[J+16]; > if J<8 s3[J]=DATA[J+32]; > } > lcdext.clear(); > lcdext.line(1); > lcdext.printlength(s1,16); > lcdext.line(2); > lcdext.printlength(s2,16); > sleep 3000; > lcdext.clear(); > lcdext.line(1); > lcdext.printlength(s3,8); > sleep 2000; > lcdext.clear(); > lcdext.print("anz_daten="); > lcdext.zahl3p(anzahl_daten); > sleep 1500; > > if anzahl_daten < 40 return 0; > else return -1; > } > > //-----------------Hauptprogramm -------------------------// > > thread main > { > int status_i2ccom_init, status_get_wetter; > > > lcdext.init(); > pcf.init(); > stports.init(); > lcdext.clear(); > > status_i2ccom_init = i2ccom_init(); > if status_i2ccom_init > { > while get_wetter(); > lcdext.clear(); > lcdext.print("kein Wetter "); > sleep 3000; > } > else lcdext.print("keine I2CCOM "); > sleep 3000; > } > > > Habe ich da irgend einen Denkfehler beim Einlesen oder Ausgeben drin ??? > > Gruss FF Hallo nochmal an die CC2-Experten, ich habe zum testen die I2CCOM SDA/SCL direkt mit der CC2-Station verbunden ohne irgend welche Widerstände gegen +5V. Im Baustein sind ja bereits die 2 Stk. 330 Ohm Widerstände SDA+SCL eingebaut. Die Leitungslänge beträgt 20 CM. Könnte ggf. der fehlende Pullup Widerstand mein Problem sein ??? Zusatzfrage: Wenn ich den Interrupt-Ausgang der I2CCOM zum Triggern des Lesevorgangs verwenden will, kann ich diesen einfach direkt auf einen (Interrupt)-Eingang der CC2 schalten und mit getcount() abfragen ? DANKE für die HHHIIILLLFFFEEE !!! und Gruss FF | ||
Antwort schreiben Antworten: Re: I2CCOM 64Byte FIFO Lesefehler ??? (von FF - 17.02.2006 13:46) Re: I2CCOM 64Byte FIFO Lesefehler ??? (von FF - 22.02.2006 7:35) Re: I2CCOM 64Byte FIFO Lesefehler ??? (von FF - 23.02.2006 6:32) |