LED Array mit MBI5026CN und PIC 16F688

Gast #5892150
Lesenswert?

Hoi zämä

Ich arbeite zur Zeit an einem Projekt, bei welchem ich ein LED Matrix 
von gut 110 weissen LEDs ansteuern will. Die Steuerung übernimmt ein PIC 
16F688 uP und das Treiben der LEDs MBI5026CN Bausteine, die als 
Schieberegister und LED Treiber funktionieren. Die ganze Schaltung läuft 
ab einem Netzteil mit 5V.

Ich habe bis jetzt drei der insgesamt sieben IC's (MBI5026CN) verbaut. 
Nachdem das erste IC eingebaut war, testete ich die Schaltung und 
stellte fest, dass der LED Treiber das Testmuster auf den ersten 16 LEDs 
Problemlos darstellen konnte.

Als dann das zweite und dritte IC eingebaut war, stellte ich mit 
erstaunen fest, dass nur jeweils das zweite IC das Testmuster 
darstellte. Alle anderen LEDs blieben dunkel.
Die IC's können untereinander auf den Sockets rotiert werden, sogar wenn 
ich nur auf Socket 2 und 3 ein IC platziere und die Datenverbindung vom 
PIC direkt auf Nr. 2 übertrage, ist es Nr. 2, welche die LEDs zum 
leuchten bringt.

Ich hab erst fehlerhafte Signalpegel oder fehlende Pullups/Pulldowns für 
mögliche Ursachen gehalten. Aber nach x-fachen Kontrollen und muss ich 
diese Option wohl aussschliessen. Ich hab die Signalpegel und -Zeiten 
sogar mit einem KO abgelichtet und sie sehen nahezu perfekt aus.

Man sieht auf den KO Ausschnitten ebenfalls gut, dass die Daten welche 
ich im ersten IC einspeise, über die Kaskadierung problemlos bis zum 
letzten durchdringen. Die ICs, resp. ihre Schiebregister funktionieren 
so wie sie sollten, was wiederum gegen deren Defekt und für einen 
sauberen CLK spricht.

An den weissen LEDs fallen 2.6V ab. Ich hab die Eingänge der ICs auch 
mal ohmisch gemessen, doch es geschieht gar nichts daran. Es macht den 
Eindruck, wie wenn die ICs an Position 1 und 3 an ihren Ausgängen keinen 
Wank machen. Auch habe ich mit verschiedenen Werten am externen 
Einstellwiderstand Rext gespielt, doch von 500 bis 2k zeigt auch dieser 
keine Wirkung auf die nicht-funktionierenden ICs (bei Nr. werden die 
LEDs entsprechend der höheren Stromstärke heller).

Langsam aber sicher bin ich Ratlos, was die Ursache dieses äusserst 
kuriosen Verhaltens ist. Hat evtl. jemand hier noch eine Idee, was ich 
noch ausprobieren könnte?

Vielen herzlichen Dank!

Richy
Angehängte Dateien:
Gast #5892299
Lesenswert?

Ja, der IC verfügt über Stromregler welche mit dem Rext eingestellt 
werden können. Deshalb hat auch keine der LEDs Vorwiderstände.

Könnte es vielleicht auch ein Problem der Spannungen sein? An den LEDs 
fallen 2.6V ab, die ganze Schaltung wird mit 5V betrieben. Der IC sollte 
ja eigentlich den Rest übernehmen können, oder?

Die Software generiert eigentlich nur die Pulse, welche meines erachtens 
gut aussehen (siehe KO Bilder). Aber hier der Vollständigkeitshalber 
noch der Code des PICs welcher die Testmuster generiert:
1
/************************************************************************************************
2
*       Titel:          ClockTwo DYI (Testprogram)                        *
3
*       Funktion:       Program zum Testen der Registeransteuerung und LED Helligkeit      *
4
*            und einfache Muster (Zeitabhängig)                    *
5
*       Version:        0.2                                    *
6
*       Datum:          21.07.2018                                *
7
*       Autor:          Y. Richard                                *
8
************************************************************************************************/
9

10

11
/*Pinbelegung:
12
PORTA:
13
A0:   1  
14
A1:   1  Potentiometer    (nicht belegt)
15
A2:    1  
16
A3:   1  Schalter      (Funktionen)
17
A4:    1  (Quarz)
18
A5:    1  (Quarz)
19

20
PORTC:
21
C0:    0  CLK          (Clock)
22
C1:    0  SD          (Serial Data)
23
C2:    0  LE          (Latch Enabled)
24
C3:   1  
25
C4:    0  RS232 TX kontr
26
C5:    1  RS232 RX
27
*/
28

29

30
//PIC- Include Files
31
#include <16f688.h>
32

33
#device ADC=8    //10-Bit ADC
34

35
//Einstellungen
36
#fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR,BROWNOUT,PUT,INTRC_IO
37

38
//Taktfrequenz 8MHz
39
#use delay(clock=8000000)
40

41
// PORTS - Microcontroller interne Definition
42
#byte PORTA = 0x05
43
#byte PORTC = 0x07
44

45
// Data- Direction- Register - interne Definition
46
#byte DDRA = 0x85            // 1000 0101
47
#byte DDRC = 0x87            // 1000 0111
48

49
//Peripheriedefinitionen
50
#define C_1    PORTC=(PORTC|0x01)    // xxxx xxx1 Clock H  -> Pin 10
51
#define C_0    PORTC=(PORTC&0xFE)    // xxxx xxx0 Clock L
52
#define D_1    PORTC=(PORTC|0x02)    // xxxx xx1x Data H    -> Pin  9    
53
#define D_0    PORTC=(PORTC&0xFD)    // xxxx xx0x Data L
54
#define L_1    PORTC=(PORTC|0x04)    // xxxx  x1xx Latch H  -> Pin  8
55
#define L_0    PORTC=(PORTC&0xFB)    // xxxx x0xx Latch L
56
#define SW1    !(PORTA&0x02)      // xxxx xx1x Schalter  -> Pin  12
57

58

59
void sysinit(){
60

61
  //Datenrichtungsregister
62
  DDRA=0xFF;              // IIII IIII  (O = Output / I = Input) SW1>Bit1 TSW>Bit4
63
  DDRC=0x28;              // OOIO IOOO  (O = Output / I = Input) ASW>Bit4 CDL>Bit1-3
64
  PORTC=0x00;
65
  port_a_pullups(TRUE);
66
  
67
  //Analog-Digital Konverter initialisieren und starten
68
//  SETUP_ADC(ADC_CLOCK_DIV_4);
69
//  SET_ADC_CHANNEL(7);
70
//  READ_ADC(ADC_START_AND_READ);
71
  
72
  //Clockfrequenz auf 8MHZ -> 125ns
73
  setup_oscillator(OSC_8MHZ);
74
  // jeden 4. Zyklus wird im Program fortgefahren + Timer inkrementiert
75
  // -> 0.5us
76
  
77
  SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1);
78
  // zählt alle 0.5us eins weiter
79
  
80
}
81

82

83
// Gibt 16 Werte (Bit) ans Register des LED-Drivers weiter (von max 112)
84
void set_out(int16 row){
85

86
  int16 x;  //Bit Maske
87
  x = 1;    //Bit-Index startet bei 0000 0000 0000 0001
88
  
89
  //Lädt die mitgegebene Reihe seriell ins Register
90
  do{
91
    
92
    //Wenn Bit an der Stelle x 0 ist:
93
    if((row & x) == 0){
94
      D_0;  //Setzt Data auf LOW
95
      C_1;  // und macht einen
96
      C_0;  // Clock Zyklus
97
    }
98
    //Wenn Bit an der Stelle x 1 ist:
99
    else{
100
      D_1;  //Setzt Data auf HIGH
101
      C_1;  // macht einen
102
      C_0;  // Clock Zyklus,
103
    //  D_0;  // und setzt Data wieder auf LOW (neutralisiert, da nicht nötig)
104
    }
105
    
106
    //Um einen Overflow zu verhindern, wird vermieden, Zahlen grösser als die Hälfte des Maximalwerts zu dublizieren.
107
    if(x>0x7FFF){
108
      x = 0;
109
    }
110
    else{
111
      x = x << 1;      //Schiebt die Bits in x um 1 nach links
112
      //x = x + x;  //Verdoppelt Index-Bit 1 (wandert ein Bit höher)      
113
    }
114
    
115
  }while(x!=0);
116

117
}
118

119

120
//--
121
// ClockTwo Hauptprogramm
122
//--
123

124
void main(){
125
  
126
  int16 s, ms, speed, timestep, d1, d2, d3;  //Double
127
  int8 h, min;            //Byte
128
  
129
  
130
  sysinit();    //Systeminitialisierung
131
  
132

133
  //Data + Clock werden auf Null gesetzt, Latch auf 0 (default)
134
  D_0;
135
  L_0;
136
  C_0;
137
  
138

139
  // ***** Konstanten *****
140
  timestep = 2;    //Zeitinterval [s] (min 2)
141
  speed = 1000;    //Wieviele [ms] eine [s] hat: je kleiner, umso schneller läuft das Program ab -> Testfunktion
142
  
143
  // ***** Variablen *****
144
  h = 0;        //Zähler für Stunden
145
  min = 0;      //Zähler für Minuten
146
  s = 0;        //Zähler für Sekunden
147
  ms = 0;        //Zähler für Millisekunden
148
  d1 = 0xFF00;    //Testdaten
149
  d2 = 0b0011001100110011;    //Testdaten
150
  d3 = 0b0101010101010101;    //Testdaten
151
  
152
  //Setzt das Register auf Null und latched es auf die Ausgänge
153
  set_out(0);
154
  L_1;
155
  L_0;  
156
  
157
  set_timer1(0);  //Timer initialisierung
158

159
  
160
  //bleibt in der Schleife wenn der Schalter (SW1) nicht gedrückt wird
161
  while(SW1){
162
    
163
    //*** Zeitzählmodul ***
164
    
165
    if(get_timer1()>=2000){
166
      ms++;
167
      set_timer1(0);
168
      //Ist Anzahl <ms> in <speed> erreicht, werden <s> inkrementiert
169
      if(ms>=speed){
170
        s++;
171
        ms = 0;
172
        if(s>=60){
173
          min++;
174
          s = 0;
175
          if(min>=60){
176
            h++;
177
            min = 0;
178
            if(h>=24){
179
              h = 0;
180
            }
181
          }
182
        }
183
      }
184
    }
185
    
186
    
187
    //Wird jeden timestep ausgeführt (nach 2s)
188
    if(s>=timestep){
189
      s = 0;
190
      
191
      //Setzt die Werte im Register auf den aktuellen Wert und latched sie auf die Ausgänge
192
      set_out(d1);
193
      set_out(d2);  // Sendet so 32 Bit zum testen eines weiteren Registers
194
      set_out(d3);  // Sendet so 48 Bit zum testen eines weiteren Registers
195
      L_1;
196
      L_0;
197
      
198
      d1 = ~d1;  //Invertiert das Testmuster
199
      d2 = ~d2;
200
      d3 = ~d3;      
201
    }    
202
  }
203
  
204
  
205
  //Endschlaufe. Wenn 'SW1' gedrückt wird, bricht das Program ab und verweilt bis auf alle Ewigkeit hier...
206
  while(1){
207
    
208
    //Schaltet die Uhr auf dunkel
209
    set_out(0);  
210
    L_1;
211
    L_0;  
212
  
213
  }
214

215
}

Nebenbei bemerkt. Ich habe festgestellt, dasss die Einschaltungspannung 
beim direkten Einstecken des 5V Netzteils bis auf 8V steigt. Unter der 
Annahme, dass diese die ICs beschädigt hat, habe ich ein neue Serie 
unberührter ICs eingebaut und die Schaltung mit Zuschalten der 
AC-Versorgung des Netzteils "sanft" auf 5V hochgefahren.

Das Resultat ist noch verwirrender. Nun scheint das 3. IC einigermassen 
(!) das Testmuster wiederzuspiegeln, während das 2. willkürlich LEDs 
antreibt und das 1. ganz dunkel bleibt.
Gast #5892395
Lesenswert?

> Ich habe festgestellt, dasss die Einschaltungspannung
> beim direkten Einstecken des 5V Netzteils bis auf 8V steigt.

Aus welchem Schrotthaufen stammt denn dieser Sondermuell?

Bau dir erstmal ein ordentliches Netzteil.
Das kann auch ein LM317 sein.

Bei 8 V geht sogar 74er TTL kaputt.
Gast #5892487
Lesenswert?

Nungut, damit wäre wohl ein Problemfaktor identifiziert.

Aber selbst mit einem anderen Netzteil, bei welchem ich nie mehr als 5V 
beim Einschalten erhalte, habe ich selbst mit neuen IC's das oben 
erwähnte, willkürliche Verhalten.
Gast #5892599
Lesenswert?

Richy schrieb:
> ... selbst mit neuen IC's das oben
> erwähnte, willkürliche Verhalten.

Gem. DB reagiert der IC beim Clk auf die steigende Flanke. Und das macht 
mein PIC auch so (siehe Anhänge im ersten Post).
Was wäre denn am SPI falsch? Gibt es etwas was ich vielleicht falsch 
interpretiere?
#5892609
Lesenswert?

Richy schrieb:
> //Wenn Bit an der Stelle x 0 ist:
>     if((row & x) == 0){
>       D_0;  //Setzt Data auf LOW
>       C_1;  // und macht einen
>       C_0;  // Clock Zyklus
>     }
>     //Wenn Bit an der Stelle x 1 ist:
>     else{
>       D_1;  //Setzt Data auf HIGH
>       C_1;  // macht einen
>       C_0;  // Clock Zyklus,
>     //  D_0;  // und setzt Data wieder auf LOW (neutralisiert, da nicht
> nötig)
>     }

Da wird das Timing nicht passen. Mach mal nach "//Setzt Data auf" 
jeweils ein, zwei NOPs.
Gast #5892712
Lesenswert?

Wäre es nicht möglich, dass das unstabile Netzteil einen oder mehrere 
brownouts im Pic zulässt, wenn die zwei MBI5026 die Led's ein-und 
ausschalten?
Brownout deaktiviere ich immer, wenns nicht gebraucht wird.
Vielleicht hilft das Probieren mit einem Akku anstatt ein schlechtes 
Netzteil.
Gast #5892724
Lesenswert?

Richy schrieb:

> Langsam aber sicher bin ich Ratlos, was die Ursache dieses äusserst
> kuriosen Verhaltens ist. Hat evtl. jemand hier noch eine Idee, was ich
> noch ausprobieren könnte?

\LE oszilloskopieren. Und zwar an jedem einzelnen 5026, jeweils direkt 
am Pin. Und mit hoher Zeitauflösung, so dass man tatsächlich etwas sehen 
kann.
Gast #5893287
Lesenswert?

Teo D. schrieb:
> Wo her kommen den dies üblen Überschwinger in deinem CLK-Signal?

Das war wohl auf einen Messfehler meinerseits zurückzuführen. Ich habe 
die GND-Verbindung der zweiten KO-Sonde vergessen. Anbei eine erneute 
Clk Messung. Es sind keine Überschwinger feststellbar.

Ebenfalls habe ich das LE Signal an allen ICs inklusive im ersten 
Oszillogramm die Versorungsspannung am PIC gemessen. Die Spannung sieht 
bei allen ICs genau so aus. Man erkennt den Schaltvorgang, die 
Pegelveränderungen sind aber noch innerhalb der Spezifikationen. Ich 
bezweifle daher, dass diese schwachen veränderungen zu einem Brownout 
des PIC führen können.
Angehängte Dateien:
Gast #5894500
Lesenswert?

Ich habe den Code jetzt mal so angepasst, dass Clk und LE invertiert 
ausgegeben werden (bei einer Dateneingabe wird Clk erst 0 dann wieder 1, 
dasselbe bei einem Latch).

Die Schaltung zeigt aber genau das gleiche Verhalten wie oben 
beschrieben: Während mit normalen Ausgängen nur das mittlere der drei 
ICs scheinbar seine Aufgabe erfüllt, ist dies mit invertierten Ausgängen 
genau so.

Sorry, auch das führte nicht zur erhofften Lösung des Problems. Aber 
danke für den Input!
Gast #5895053
Lesenswert?

Richy schrieb:
> Ich habe den Code jetzt mal so angepasst, dass Clk und LE invertiert
> ausgegeben werden (bei einer Dateneingabe wird Clk erst 0 dann wieder 1,
> dasselbe bei einem Latch).
Hallo,
ich habe nicht CLK oder LE gemeint, sondern nur die Dateneingabe (SDI): 
anstatt 0.....15 , 15.....0 oder weil du in 3 IC's schiebst 0....47 bzw. 
47....0 , einfach das Gegenteil von dem jetztigen, vielleicht hilft's 
weiter, Gruss J.P.S
Gast #5895252
Lesenswert?

Richy schrieb:

> Ebenfalls habe ich das LE Signal an allen ICs inklusive im ersten
> Oszillogramm die Versorungsspannung am PIC gemessen. Die Spannung sieht
> bei allen ICs genau so aus. Man erkennt den Schaltvorgang, die
> Pegelveränderungen sind aber noch innerhalb der Spezifikationen.

Hähä. Guck mal deutlich "schneller".

Die Schulter des Pulses sieht so dermaßen Scheisse aus, dass man 
ziemlich sicher davon ausgehen kann, dass da bei genauerem Hinsehen sehr 
üble Sachen an der vorderen Flanke des Pulses zum Vorschein kommen 
werden.

Ich würde ganz stark auf eine völlig unzureichend abgeblockte oder sogar 
grundlegend unterdimensionierte Versorgung tippen.
Gast #5910910
Lesenswert?

Also, ich habe mittlerweile das Problem identifiziert und behoben.
Es ist nix kaputt gegangen und die Pulse sind auch i.O.

Meine Fehlinterpretation des Datenblattes lag darin, dass ich davon 
ausging, dass der IC den Strom für die LEDs anhand einer 
Referenzspannung (welche am Rext abfällt) steuert.
Offenbar scheint dieser aber die Stromregelung anhand eines 
Referenzstroms (durch Rext) einzustellen. Und da ich versuchte - wie im 
Schema ersichtlich - alle ICs mit einem gemeinsamen Rext zu verbinden, 
führte dass dazu, dass winzige Variationen beim Rext-Ausgang des ICs 
dazu führten, dass Strom von einem IC zum anderen floss, statt über den 
Referenzwiderstand. Und somit war auch die Stromregelung ausser kraft 
gesetzt, was zu dem von mir festgestellten merkwürdigen Verhalten 
führte.

Ich habe nun für jeden IC einen eigenen Rext installiert und voila. Es 
funktioniert jetzt wie geschmiert!

Aber trotzdem Danke für die Unterstützung!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren