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

max7311 I2C-16HS sporadisch kein Acknowledge Kategorie: I²C-Bus (von Klaus - 8.04.2005 21:07)


Hallo Leute,
ich brauche mal Eure fachliche Hilfe.(eine Herqausforderung für alle I2C Fachmänner/Frauen)

Ich habe bei André u.a. das max7311 I2C-RT16HS Modul gekauft und wollte eigentlich auch das
die MAX-Porterweiterung nachkaufen. Allerdings habe ich ein Problem bei der Inbetriebnahme.
Der MAX7311 antwortet zwischendurch nicht korrekt auf die Befehle, sendet anschinen kein ACK.
Speziell, wenn nach zum auslesen eines Registers zunächst die Moduladresse zum Schreiben
und anschlieĂ?end das Command-Byte (welches das Register angibt) gesendet wird, bevor dann der
Lesevorgang beginnt.

Die Besonderheit: in diesem Fall arbeite ich ohne CC2, d.h. ich nutze ein PC Modul zur Ansteuerung.
Das funktioniert soweit auch ganz prima, speziell nutze ich es erfolgreich mit einigen PCF8574.
Sehr gut bei dem Modul: Es gibt Echos fĂĽr Erfolg oder Fehler auf dem I2C Bus, d.h. den Fehler kann
man sehr gut zuordnen, d.h. feststellen, bei welchem gesendeten Byte auf den Bus etwas nicht
hinhaut.

Wie sieht das nun aus? :
Ich habe mir (orientiert am Datenblatt des MAX7311 und an dem Treiber für die CC2) zunächst einfache
Befehle gebaut, die es mir ermöglichen, Register zu setzen und zu lesen. Der Einfacheit halber lese
bzw. schreibe ich zunächst immer volle Register high + lwo Byte (Funktionen s.u.).

Das Ganze funktioniert auch ganz gut, wenn ich die Funktionen z.B. als Event auf einen Button im der
Anwendung aufrufe. Allerdings gibt es Probleme, wenn der Rechner etwas mehr unter Damp steht.
Dies ist z.B. der Fall, wenn das Programm in der Entwicklungsumgebung startet, oder zwischendurch
mal die Last auf 100% geht.

DAS PROBLEM:
Näheres Hinschauen hat ergeben, dass das Senden einzelner Bytes keine zu lange Pause verträgt.
Setze ich ein Sleep von z.B. 20 ms zwischen den einzelnen zu sendenen Bytes (s.u.), so antwortet der
MAX7311 nicht korrekt.

Aber das dĂĽrfte eigentlich nicht sein, denn der Master gibt ja den Takt vor und da sich die Flanke
für den Max ggf. für die beispielhaften 20 ms nicht ändert, so sollte es eigentlich keine Auswirkungen
haben. Die Frequenzen sind ja nur bis oben und nicht nach unten begrenzt.

Oder gibt es da maximale Pausen, bis das Command-Byte/register empfangen werden muss?

Im regulären Betrieb, komme ich in einer Nacht auf ca. 3 fehlerhaft Commandos.
Je höher die Last ist, desto mehr Fehler werden gelogged.

Mir hat auch einer berichtet, dass er ähnliche Probleme mit dem MAX7300 gehabt hat, die er bisher
noch nicht kösen. Auch da kam in besonderen Fällen kein Acknowledge zurück.

ES WĂ?RE SUPER; WENN JEMAND EINE ERKLĂ?RUNG ODER EINEN ANSATZ HĂ?TTE.

Momentan überlege ich tatsächlich den MAX als Fehlkauf einzustufen und ganz auf PCF umzusteigen.
Wenn ich mit dem Ding eine Sirene oder ein Licht ein/ausschalten will, muss ich auch sicher sein, dass
es tatsächlich passiert, sonst macht es keinen Sinn.

Schönen Dank für alle Feedbacks!!!!!
Klaus


private bool MAX7311SetReg(byte modul, byte register, byte lowByte, byte highByte)
{  
// Low-Level SEND WRITE ADDRESS WITH START
byte[] b1 = {87,MAX7311[modul].Address}; // 'W'
xport.Sendi2cCommand(b1);
while (xport.returnval==-1) {Application.DoEvents();}
if (xport.returnval==256) return false;
// low-Level SEND BYTE
byte[] b2 = {66,register}; // 'B'
xport.Sendi2cCommand(b2);
while (xport.returnval==-1) {Application.DoEvents();}
if (xport.returnval==256) return false;
// Low-Level SEND BYTE
byte[] b3 = {66,lowByte}; // 'B'
xport.Sendi2cCommand(b3);
while (xport.returnval==-1) {Application.DoEvents();}
if (xport.returnval==256) return false;
// Low-Level SEND BYTE
byte[] b4 = {66,highByte}; // 'B'
xport.Sendi2cCommand(b4);
while (xport.returnval==-1) {Application.DoEvents();}
if (xport.returnval==256) return false;
return true;
}

private bool MAX7311GetReg(byte modul, byte register)
{  
MAX7311_GetReg_Register=register;
// Low-Level SEND WRITE ADDRESS WITH START
byte[] b1 = {87,MAX7311[modul].Address}; // 'W'
xport.Sendi2cCommand(b1);
while (xport.returnval==-1) {Application.DoEvents();}
if (xport.returnval==256) return false;
!!!!Hier Pasue eine Pause von 20 ms macht Probleme
// Low-Level SEND BYTE
byte[] b2 = {66,register}; // 'B'
xport.Sendi2cCommand(b2);
while (xport.returnval==-1) {Application.DoEvents();}
if (xport.returnval==256) return false;
// mehrer Bytes mit RXN lesen
byte[] b9 = {114,MAX7311[modul].Address,2}; // 'r'
xport.Sendi2cCommand(b9);
while (xport.returnval==-1) {Application.DoEvents();}
if (xport.returnval==256) return false;
return true;
}


    Antwort schreiben


Antworten: