MBI5039 Schieberegister bitte um Hilfe

Hallo Leute

Bin neu hier im Forum also mich nicht gleich hauen wenn der Eintrag nicht im richtigen Topic ist :slight_smile:

Ich habe Platinen von einer Videowall mit je 24 Schieberegistern MBI5039 mit 16 Bit, dh. 384 Led (RGB) auf einer Platine. Grundsätzlich verhält sich beim ansteuern der MBI5039 gleich wie der 74HC595. Da habe ich mit einem Arduino Nano auch kein Problem. Aber laut Datenblatt bzw. Application Note kann man mit setzen der richigen Bit’s am SDI fehlerhafte Led’S am SDO auslesen.

Application Note:

Da ich mit C++ ein Anfänger bin, steige ich da irgendwie nicht durch. Um den MBI in den “Compulsory Error Detection” Modus zu versetzen, sollte man meiner Meinung nach die Abfolge von:

OE high -
LE low -
12x CLK und 1 1 1 1 0 0 0 1 0 1 1 0 über DataIn -
LE high - 4x CLK high und 1011 über DataIn -
LE low - 4x CLK -
OE low

an das IC senden und dann sollte man irgenwie am SDO die Bit’s der als defekt erkannten Led’s
auslesen können.

Hier mein Sketch Versuch, leider ohne Erfolg:

//Bevor Sie die obligatorische Fehlererkennung ausführen, müssen Sie zuerst in den Konfigurationsregistermodus wechseln.
//Dazu muss BitF und BitE mit 11 (0,73 x VDD als Zielspannung) für die Kurzschlussfehlererkennung festlegt werden.
//Während der Fehlererkennung muss OE für eine Periode von tERR_C auf High bleiben, um den effektiven Fehlerbericht zu erhalten. 
//Danach wird der Fehlerbericht im Schieberegister zwischengespeichert und per CLK-Shift-In an SDO gesendet
//Wenn LE nach 4 CLK-Impulsen aktiviert wird, werden die Daten im Schieberegister als Konfigurationscode erkannt.
//d.h.: LE muss vom 12. bis zum 15. Clockimpuls High sein (von 16 Impulsen (0-15)),danach wieder auf Low gehen.
//Beispiel: Bei 4 Registern in Kaskade geschaltet, bleibt LE vom 1. CLK bis zum [(16xN) -4] -ten CLK Low und wechselt dann, 
//in den letzten 4 CLK-Anstiegsflanken auf high.
//Nach dem Aufrufen des Schreibkonfigurationsmodus muss der Arduino eine 16-Bit-Konfigurationsregistereinstellung über den SDI-Pin senden, 
//die die Prüfbits (Bit9 ~ Bit6 = 0101) enthalten muss: 
//
//F E D C B A 9 8 | 7 6 5 4 3 2 1 0
//1 1 1 1 0 0 0 1 | 0 1 1 0 1 0 1 1     Bit 0-5 = Current Gain Adjustment - Bit 6-9 = Check Bits für Fehlererkennung - Bit A,B nicht beschrieben - Bit C,D = In Message Error Dedection - Bit E,F = Auswahl der Spannungsschwellen für die Kurzschlusserkennung
//für einen IC: OE high - LE low - 12x CLK High und 12 Bits DataIn - LE high - 4x CLK high und 4 Bits DataIn - LE low - 4x CLK high - OE low;
int le = 7;
int clk = 8;
int oe = 9;
int dataIn = 10;
int dataOut = 12;

//um den MBI5039 in den Testmodus zu versetzen (laut Aplication Note Seite 15)
const int testByte[2] = {B11110001, B01101011};
const int te1 = B11110001;//Testbyte 1
const int te2 = B01101011;//Testbyte 2
//danach alle Pin's am SDO abfragen(Latch LOW). Wenn eines Null zurück gibt, liegt eine Unterbrechung oder ein Kurzschluss auf dem Kanal vor.

void setup() {
    pinMode(oe, OUTPUT);
    pinMode(clk, OUTPUT);
    pinMode(le, OUTPUT);
    pinMode(dataIn, OUTPUT);
    pinMode(dataOut, INPUT);

  Serial.begin(9600);
}

void loop()
{
  digitalWrite(oe, HIGH);
  digitalWrite(le, LOW);

  for (int i = 1; i<=25; i++){ //IC Nr

    for(int k = 0; k < 8; k++) {// 8 Bits vom 1. Byte
      digitalWrite(clk, LOW);
      digitalWrite(dataIn,bitRead(te1,k));
      digitalWrite(clk, HIGH);}
    for(int k = 0; k < 4; k++) {// Bit 0-4 vom 2. Byte
      digitalWrite(clk, LOW);
      digitalWrite(dataIn,bitRead(te2,k));
      digitalWrite(clk, HIGH);}
    digitalWrite(le, HIGH);
    for(int k = 5; k < 8; k++) {// Bit 5-8 vom 2. Byte
      digitalWrite(clk, LOW);
      digitalWrite(dataIn,bitRead(te2,k));
      digitalWrite(clk, HIGH);}
    digitalWrite(le, LOW);
  }
    for (int j = 0; j>=399; j++){ //Pin Nr.  
      digitalRead(dataOut);
      if(dataOut==0){
        Serial.print("Ausgang: ");
        Serial.print(j);
        Serial.print(" ist defekt"); 
      }      
    }
   
digitalWrite(oe, LOW);
digitalWrite(le, HIGH);

}

Ich weiss nicht, ob ich das hier richtig mache, bitte um Nachsicht und Hilfe.

Horst

Hallo,

for (int j = 0; j>=399; j++)

die Schleife wird nie ausgeführt.

Und wenn sie ausgeführt würde,

    for (int j = 0; j>=399; j++){ //Pin Nr. 
      digitalRead(dataOut);

würde sie immer den selben Wert lesen.

Du musst schon den Takt bedienen, damit da was rauskommt.

Eventuell so ?

digitalWrite(dataIn, LOW);
for(int j = 0; j < 400; j++) {
  digitalWrite(clk, LOW);
  digitalWrite(clk, HIGH);
	
  if (digitalRead(dataOut) == 0) {
    Serial.print("Ausgang: ");
    Serial.print(400 - j);
    Serial.print(" ist defekt"); 
  }
}

Herzlichen Dank für deine Mühe, das werde ich probieren.
Wie gesagt, ich bin erst Anfänger in C++
Ich habe da auch bedenken, das das schnell genug wird, in der Application Note steht was von 700nS

aber ich versuch's mal mit deinem Beispiel.

DANKE

Horst2275:
Bin neu hier im Forum also mich nicht gleich hauen wenn der Eintrag nicht im richtigen Topic ist :slight_smile:
...
Ich weiss nicht, ob ich das hier richtig mache, bitte um Nachsicht und Hilfe.

Wir bevorzugen Teeren und Federn :grin:

Horst2275:
Ich habe da auch bedenken, das das schnell genug wird, in der Application Note steht was von 700nS

Welchen µC verwendest Du? Nutzt Du die Arduino-IDE?

Ich sehe da bei "In-message Error Detection" nur was von >= 400 ns für das OE Signal. Aber so ganz verstanden habe ich es auch noch nicht.

Bei bestimmten Timing von OE und LE wird der Schieberegisterinhalt wohl als Befehl interpretiert, sonst wird er normal angezeigt.

@agmue : Ich denke er hat einen Nano. Steht im ersten Post.

Ich denke mal in der ersten Hälfte des Sketches ist auch noch was falsch, denn in der Doku steht:

LE keeps low from the 1st CLK to the [(16xN)-4]th CLK, then changes to high in the last 4 CLK rising edges. And then, after LE falling edge, the contents in the shift register will be transferred to the configuration register, not to data latch register.

Das Umschalten von LE erfolgt nur bei den letzten vier Bits der gesamten Übertragung, nicht bei den Daten für jedes IC.

ArduFE:
@agmue : Ich denke er hat einen Nano. Steht im ersten Post.

Sorry, habe ich übersehen :frowning:

Beim ATmega328P könnte Dir die Bibliothek CombiePin zwecks Beschleunigung helfen, wenn es denn nötig wäre.

Danke für eure Tipps. Ich habe den Code jetzt einmal umgeschrieben und werde ihn am Abend probieren.
ja, ich verwende im Moment einen NANO mit 328er. Danke auch ArduFE, das stimmt natürlich!

  digitalWrite(oe, HIGH);
  digitalWrite(le, LOW);

  for (int i = 1; i < 25; i++){ //IC Nr

    for(int k = 0; k < 8; k++) {// 8 Bits vom 1. Byte
      digitalWrite(clk, LOW);
      digitalWrite(dataIn,bitRead(te1,k));
      digitalWrite(clk, HIGH);}
    for(int k = 0; k < 4; k++) {// Bit 0-4 vom 2. Byte
      digitalWrite(clk, LOW);
      digitalWrite(dataIn,bitRead(te2,k));
      digitalWrite(clk, HIGH);}
    if ( i == 24 ){// Das Umschalten von LE erfolgt nur bei den letzten vier Bits der gesamten Übertragung
      digitalWrite(le, HIGH);}
    for(int k = 5; k < 8; k++) {// Bit 5-7 vom 2. Byte
      digitalWrite(clk, LOW);
      digitalWrite(dataIn,bitRead(te2,k));
      digitalWrite(clk, HIGH);}
    if( i == 24 ){// Das Umschalten von LE erfolgt nur bei den letzten vier Bits der gesamten Übertragung,
    digitalWrite(le, LOW);}
  }
//auslesen
    digitalWrite(dataIn, LOW);
    for(int j = 0; j < 400; j++) {
     digitalWrite(clk, LOW);
     digitalWrite(clk, HIGH);
  
     if (digitalRead(dataOut) == 0) {
      Serial.print("Ausgang: ");
      Serial.print(400 - j);
      Serial.print(" ist defekt");
    }      
  }
   
digitalWrite(oe, LOW);

Ganz klar ist mir auch noch nicht, wann ich den OE wieder LOW setzen muss, vor oder nach dem
auslesen

so, ich habe das getestet. Nach ein paar klieinen Änderungen an den Testbits schiebt er jetzt genau die
richtige Bitfolge (laut Application Note) hinaus. Auch der LE geht jetzt nur bei den letzten 4 Bits von IC 24 auf HIGH. Ich bekomme aber immer 141 Fehler retour gemeldet.
Egal welche Platine ich teste. Ich habe mehrere mit verschiedenen Fehlern.

Jetzt meine Überlegungen:

  1. stimmt die Geschwindigkeit?
  2. eventuell Pull-up am Eingang des SDO?
  3. wann (in welchem Teil des Sketches) muss man auslesen?
  4. muss man die Ausgänge vor dem Test auf HIGH und wieder LOW setzen?

Puh, die Geschichte ist nervig!

Noch nerviger ist Dein Crossposting.

Wo soll denn nun geantwortet werden oder meinst Du jeder verfolgt jetzt 2 Threads?

Gruß Tommy