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

Re: I2C Capture funktioniert sicher? Kategorie: I²C-Bus (von Detlef - 23.12.2008 8:38)
Als Antwort auf Re: I2C Capture funktioniert sicher? von Joerg C. - 20.12.2008 10:37
Ich nutze:
C-Control II Station, OSOPT V3.0
Hallo Jörg,

ähnlich bin ich schon vorgegangen. Ich lese alle Eingangssignale komplett in ein Array. Danach steht
dieses Array zur Auswertung bereit, und es wird parallel ein zweites Array beschrieben. Am Ende
wird das zweite Array freigegeben und mit dem erneuten Beschreiben des ersten Arrays erst
begonnen, wenn dieses vollständig ausgewertet wurde.
Das funktioniert auch soweit problemlos. Allerdings, wenn mehr als zwei Threads noch zusätzlich
auf den selben Bus auch schreiben, liest der Eingangsthread ab und zu nicht vorhandene Signale.

Jetzt könnte man sich überlegen, nur noch ein Thread fürs Bushandling zu schreiben. Das hatte ich
mir auch schon überlegt, führt aber dazu, da� man auch hier einen riesigen Overhead zur
Synchronisation und Priorisierung zu diesem Thread programmieren muÃ?, was eigendlich mehrere
Threads mit Capture implizit "mitmachen". Das will ich nur, wenn wirklich nix anderes mehr geht.

Ich habe mir jetzt erstmal folgendermaÃ?en geholfen: Nach dem Finden eines Eingangssignals,
ensprechendes Modul erneut auslesen und Ergebnisse vergleichen. Eingangssignal ist nur gültig,
wenn beide Leseergebnisse übereinstimmen.

     eingang=dwmodule.getDigi(modul);                      //  Modul abfragen
     if eingang
        if eingang !=dwmodule.getDigi(modul)                //  Sicherheitsabfrage nur wenn
          eingang=0;                                                    //  positives Eingangssignal

Damit war das Symptom weg. Also liegt es definitiv am I2C Handling. Konsequenter Weise müsste ich
das jetzt auch mit dem "Busschreiben" machen. Solange an ein Modul schreiben, bis das am Modul
gelesene dem Geschriebenen entspricht.

Ich habe übrigens noch einen unerklärichen Effekt.

            Sensor[pos] = (modul*15)+1-1+bit;
   
In obiger Zeile könnte man meinen, das +1 und -1 ist überflüssig. Ist es auch, solange die Variable
"modul" nicht "0" wird. Dann wird das Ergebnis nämlich auch 0 und nicht "bit" wie es mathematisch
korrekt wäre und es auch erwartet wird. Füge ich +1und -1 ein, funktionierts.

Wieso???

Viele Grü�e

Detlef


    Antwort schreiben


Antworten: