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

Re: I2CCOM verlorene Bytes Kategorie: I²C-Bus (von Guido O. - 30.10.2009 18:57)
Als Antwort auf I2CCOM verlorene Bytes von Guido O. - 14.10.2009 18:19
Ich nutze:
C-Control II Station, OSOPT V3.0
Hallo,

ich bin dem Problem ein Stück näher gekommen.
Das unten beschriebene Verhalten entsteht durch ein Timing-Problem, da ich die Daten zu spät lese.
Da ich den 64-Byte FIFO-Baustein TL16C750 verwende habe ich den Fehler erst an anderer Stelle
gesucht.
Ich initialisiere die I2CCOM mit:
init(1,0,1)
Hierdurch sollte der 64-Byte FIFO Mode aktiviert werden. Zur Kontrolle ob der 64 Byte-Modus
aktiviert ist, habe ich an verschiedenen Stellen im Code das IIR Register des Bausteins abgefragt.
Wenn Bit 5 gesetzt ist, dann ist der 64 Byte Mode aktiviert.
Ich musste leider feststellen, dass ein Aufruf der Funktion
i2ccom.flush(1)
anscheinend den 64 Byte Modus zurücksetzt.Die Frage die sich mir stellt ist nur, wieso das geschieht?
Laut Datenblatt kann Bit 5 des FCR - dies ist Verantwortlich zum setzen des 64 Byte Modes - nur
geschrieben werden, wenn LCR Bit 7 gesetzt ist. Dies wird - soweit ich das i2ccom-Modul lese - auch
in der Funktion init korrekt gemacht. Flush setzt aber eben nicht das LCR Bit 7 vor dem Schreiben des
FCR-Registers, so dass sich am 64 Byte Mode nichts ändern dürfte - tut es aber bei mir.

Ich verwende bei mir jetzt folgende neue flusch-Funktion die das Problem zumindest für mich löst:

function flush(byte Port)
{
  wait i2ccom._setReg(i2ccom.set8N1|0x80, i2ccom.LCR, Port, i2ccom.COM);
  wait i2ccom._setReg(0b00101011, i2ccom.FCR, Port, i2ccom.COM);
  wait i2ccom._setReg(i2ccom.set8N1, i2ccom.LCR, Port, i2ccom.COM);
}


@André: Solltest Du den Beitrag lesen. Kann es sein, dass ich hier auf ein Problem im i2ccom
Modul gestoÃ?en bin?

Viele Grü�e

Guido.

> Ich benutze die CC2 zur Steuerung meines Hauses und bin derzeit dabei ein Toucpanel (HMI) mit in
> dieses System zu Integrieren.
> Das HMI wird mit der CC2 über RS232 verbunden. Das verwendete Kommuniaktaionsprotokoll ist
> Modbus RTU.
> In diesem Protokoll werden variable Datenblocks gesendet, die mit 2 CRC Bytes enden.
> Zur Kommunikation verwende ich das I2CCOM Modul von CC-Tools. Dessen Interruptausgang liegt auf
> P1H3.
>
> Nun mein Problem:
> Der Modbus Master (das HMI) sendet kontinuierlich Statuspakete die ich in der CC2 verarbeite. Es wird
> ein Interrupt ausgelöst und anschlie�end lese ich den Datenblock aus.
> Zur Unterscheidung, welcher Interrupt durch den FIFO erzeugt wurde hatte ich vor, dass IIR Register
> auszulesen. Sobald ich aber nach Auftreten des Interrupts das IIR Register auslese bekomme ich im
> Empfangspuffer genau ein Byte weniger zurück, wodurch ich CRC Fehler bekomme.
>
> Hier beispielhaft der Code:
>
>   loop{
>     wait (ports.get(11)==0);
>     receiveCnt=i2ccom.receive(1,received,types.MAX_RTU_MESSAGE_LENGTH+1,types.FRAME_SEPARATOR_TIME);
>   }
>

> In diesem Fall erhalte ich z.B. 17 Byte für eine Modbus Frame.
>
>   loop{
>     wait (ports.get(11)==0);
>     iir = i2ccom.getIIR(1);
>     receiveCnt=i2ccom.receive(1,received,types.MAX_RTU_MESSAGE_LENGTH+1,types.FRAME_SEPARATOR_TIME);
>   }
>

> Verwende ich diesen Code bekomme ich für den gleichen Frame noch 16 Byte. Woduch in der
> weitern Verarbeitung CRC Fehler entstehen.
>
> Hat jemand eine Idee, was ich falsch mache?
>
> Viele Grü�e
>
> Guido


    Antwort schreiben


Antworten: