Problem mit PCA 9532: LEDs flackern beim Schreiben des LS Registers

OP #1668928
Lesenswert?

Hallo zusammen!

Ich habe in einer Schaltung einen PCA 9532 verbaut und die 16 LEDs wie 
im Anhang bei LED0 zu sehen angeschlossen.

I2C Ansteuerung erfolgt von einem mega168. Soweit funktioniert auch fast 
alles prima, nur:

Der PCA hat ja vier 8bit-Register (LS0 bis LS3) in denen man festlegt, 
welche LEDs an/aus sind oder zu PWM0 oder PWM1 gehören. Wenn ich z.B. 
die LED0 im Sekundentakt an/aus toggle, blitzen die anderen 3 LEDs (LED1 
bis LED3) auf, wenn der neue Wert via I2C in das LS0 Register 
geschrieben wird.

Hatte erst gedacht, der PCA ist hin, aber ist nach einem Tausch genau 
das gleiche Fehlerbild.

Hatte jemand schonmal das gleiche Fehlerbild und/oder eine Idee woran es 
liegen könnte?

Gruß,
Sven
Angehängte Dateien:
OP #1668965
Lesenswert?

Ja, der Transistor invertiert das Signal des PCA. Ist aber erforderlich, 
weil der PCA nur bis 200mA (und max. 25mA pro Kanal) spezifiziert ist.

Inwiefern könnte das denn problematisch sein? Der PCA hat ja Open-Drain 
Ausgänge ohne Pull-Up, so wie ich das sehe. Kann also nur nach Gnd 
ziehen. Daher dann ein externer Pullup R40. Der PCA "sieht" ja 
eigentlich auch nur den R40 dann als Last. 10k ist dann zwar kein großer 
Strom, aber von einem Mindeststrom für jeden Kanal lese ich im 
Datenblatt nichts.
#1668975
Lesenswert?

Was sendest Du denn genau, wenns flackert?

Es gehört natürlich ins Datenblatt, wenn die 3 anderen Ausgänge kurz auf 
high gehen.
Das dann die LEDs kurz aus gehen, sieht man nicht.
Wenn sie aber durch die Invertierung aufblitzen, stört das schon.

Wenns um den Strom geht, dann nimm nen pnp in Kollektorschaltung.
Aber die 590R kann der Chip noch treiben.


Peter
OP #1669016
Lesenswert?

Hm, als ich jetzt rausgesucht habe, was und wie ich genau Sende ist mir 
was aufgefallen... sieht mir nach Copy-Paste-Fehler aus. Kann mir das 
Fehlerbild damit aber auch nicht so richtig erklären:

In der main() sende quasi im Wechsel (Sekundentakt) folgende Werte:
led_driver_set(DEV_ALL, LS0, 0b01010101); und
led_driver_set(DEV_ALL, LS0, 0b01010100);

Also LED1 bis LED3 sind lt. Datenblatt AN, werden aber durch den 
Transistor invertiert, also aus.
LED0 blinkt.

Die led_driver_set() tut folgendes:
1
void led_driver_set(char device, unsigned char control_reg, unsigned char value)
2
{
3
  char i;
4

5
  if(device == DEV_ALL) // Alle LED-Treiber
6
  {
7
    for(i = 0; i < NUMBER_OF_DEVICES; i++)
8
    {
9
      i2c_start();
10
      i2c_send((FIRST_LED_DRIVER_ADR + i)<<1);
11
      i2c_send(control_reg);
12
      i2c_send((FIRST_LED_DRIVER_ADR + i)<<1);
13
      i2c_send(value);
14
      i2c_stop();
15
    }
16
  }
17
  else // Nur ein LED-Treiber
18
  {
19
    i2c_start();
20
    i2c_send((FIRST_LED_DRIVER_ADR + device)<<1);
21
    i2c_send(control_reg);
22
    i2c_send((FIRST_LED_DRIVER_ADR + device)<<1);
23
    i2c_send(value);
24
    i2c_stop();
25
  }
26
}

Nach dem Senden control_reg Sende ich quasi nochmal die I2C Adresse. Das 
macht wohl keinen Sinn, jedoch dürfte dann doch nichts blinken. 
Zumindest nicht an LED0, maximal an LED4.

Nunja, jedenfalls habe ich erstmal einen Ansatzpunkt... Danke erstmal! 
Werde dann mal schreiben was es gegeben hat. Schaff es aber heute 
vermutlich nicht mehr!

...zum Strom, ja der LED Strom passt bei einer LED. Sind aber alle LEDs 
an überschreite ich die 200 mA. (Vcc = 12 V)

Danke
OP #1669022
Lesenswert?

Ah, vielleicht noch eine Vermutung.

Wenn beim Schreiben der Registerpointer im PCA nicht inkrementiert wird 
schreibe ich quasi erst meine Adresse ins Register, die LEDs gehen an... 
dann schreib ich sofort meinen eigentlichen Wert ins Register und die 
LEds gehen wieder aus. Man sieht das quasi als Blitzen...

Das könnte es sein! Wie gesagt, ich werde Bericht erstatten.

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