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

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
Ich nutze:
C-Control II Station, OSOPT V3.0
> > 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)