Probleme mit ShiftPWM

Hallo,

ich habe nun einige Zeit lang 3 TLC5916 mit dem Arduino auf einem Steckbrett am laufen gehabt. Da ich später in meinem Objekt kein Steckbrett unterbringen möchte, habe ich versucht, die TLCs auf einer ProtoShield Platine unterzu bringen.

Nun habe ich jedoch das Problem, das nur der erste TLC Baustein angesprochen wird. Die anderen beiden bekommen kein Signal auf die 8 Ausgänge.

Ich habe im stromlosen Zustand bereits die Pins gemessen

Reihe:
TLC1:SDO(14) -> TLC2:SDI(2)
TLC2:SDO(14) -> TLC3:SDI(2)

Parallel:
TLC1:CLK(3) -> TLC2:CLK(3) -> TLC3:CLK(3)
TLC1:LE(4) -> TLC2:LE(4) -> TLC3:LE(4)

und alle hatten einen Verbindungswiderstand von ~ 0,6Ohm (Wert kommt von den Multimeterspitzen)

Das gleiche bei eingesteckten ICs. Wieder besteht kontakt.

Desweiteren wurde die Spannung zwischen Vcc und GND gemessen mit ~5V. Die Abblockkondensatoren sind alle in Ordnung genauso wie die Einstellwiderstände.

Gibt es weitere Möglichkeiten, dem Fehler auf der Spur zu kommen? Ein Ozilloskop besitze ich nicht.

Die TLCs sind alle geprüfpft, heißt wenn ich die umstecke, funktionieren alle auf dem ersten IC Block.

Eine weitere vorallem Libary spezifische Frage stellt sich ebenfall noch, jedoch nicht mehr hoher Priorität.

// SetPinGrouping allows flexibility in LED setup. 
  // If your LED's are connected like this: RRRRGGGGBBBBRRRRGGGGBBBB, use SetPinGrouping(4).
  ShiftPWM.SetPinGrouping(4); //This is the default, but I added here to demonstrate how to use the funtion

Hierbei geht es um die Einstellung, wie die LEDs angeschlossen werden an den TLCs.

Diese Funktion hat bei mir aber weder auf dem Steckbrett noch auf dem ProtoShield funktioniert.
Die LEDs verhalten sich bei (1) identisch mit (4).


Schaltplan
Libary

Hast du mal probiert ob es mit dem normalen ShiftOut funktioniert? Also ohne die PWM.

Das normale ShiftOut aus dem Playground wird nur mit dem 74HC595 betrieben. Dort steht, dass die LEDs/RGB-LEDs mit gemeinsamer Kathode betrieben wird. Mit dem TLC5916 werden die LEDs/RGB-LEDs mit gemeinsamer Anode betrieben.

Der 74HC ist bei mir aus der Schaltung rausgeflogen, da dieser einfach zu viele Bauteile für eine Platine benötigt (jede LED 3 Widerstände und ggf. pro Register 1 DarlingtonArray).

Hallo,

was misst Du denn jeweils an Pin 13 jedes IC's? Die sollten Low-Active sein...

Gruß,
Ralf

Hallo Ralf,

wie kann ich den low-active am IC messen? Pin 13 ist bei allem TLCs auf Grund gelegt, siehe Schaltbild. Messe vom Pin 13 nach GND logischerweise 0V, zu +5V messe ich 4,99V -> 5V.

sschultewolter:
Das normale ShiftOut aus dem Playground wird nur mit dem 74HC595 betrieben. Dort steht, dass die LEDs/RGB-LEDs mit gemeinsamer Kathode betrieben wird. Mit dem TLC5916 werden die LEDs/RGB-LEDs mit gemeinsamer Anode betrieben.

Das hat aber mit dem Code nichts zu tun. Die Schieberegister werden identisch angesteuert. Deshalb sollte das auch damit gehen. Ich meine das auch nur zum Testen ob die Hardware funktioniert.

//**************************************************************//
//  Name    : shiftOutCode, Hello World                         //
//  Author  : Carlyn Maw,Tom Igoe                               //
//  Date    : 25 Oct, 2006                                      //
//  Version : 1.0                                               //
//  Notes   : Code for using a 74HC595 Shift Register           //
//          : to count from 0 to 255                            //
//****************************************************************

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 13; // edit: sschultewolter (Std: 12)
////Pin connected to DS of 74HC595
int dataPin = 11;

void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  //count up routine
  for (int j = 0; j < 1024; j++) {
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, j);   
    //return the latch pin high to signal chip that it 
    //no longer needs to listen for information
    digitalWrite(latchPin, HIGH);
    delay(50); // edit: sschultewolter
  }
}

Es leuchten nur die ersten 4 RGB LEds in Rot (Gelb) Grün. Blau fehlt (auf dem 2. TLC), sowie die restlichen 4 RGB LEDs auf TLC2 und 3.

Ich habe gerade einmal zum Test das ProtoShield vom Board getrennt und nur Pin8,11,13 und GND angeschlossen, es schein so, als würde die Versorgungsspannung einbrechen. Zwischen Vdd und GND 3,6V. Das komische, das geschiet auch wenn ich die ext. 5V abziehe. Sollte ich besser die 5V von Vdd auch extern betreiben? Dann würde ich eben umlöten, ist eine verbindung nur. Bin mir beim Steckbrett nicht sicher, hatte da glaub alles extern ausser das ich GND mit einander verbunden hab wie jetzt auch.

Edit 2:

Arduino über Vin vom Netzteil versorgt.

An den Klemmen für 5V und GND am Elko => 5,23V
Alle anderen Messstellen zwischen 5V und GND (IC Versorgungsspannung und Versorgunsschiene Protoshield) => nur 3,09V :frowning:

Hallo,

ja, die sollen auf GND liegen. Ich wollte auch nur, dass Du mal misst, ob wirklich an allen drei ICs an diesem Pin keine Spannung ist.
Du hast bei der roten LED in Klammern gelb dahinter geschrieben. Wenn das bedeuten soll, dass die rote LED gelb leuchtet, dann bekommt die zuviel Spannung/Strom und ist kurz vor dem kaputt gehen.

Leider ist es schwer, ohne die Sachen ansehen zu können, was Vernünftiges zu raten. Ich würde jetzt, wenn ich das gleiche Problem hätte, mal mein Multimeter auf Ampere schalten und die Stromaufnahme der Platinen messen. Wenn da deutlich mehr als ein paar wenige Milliampere (musst halt mal überschlägig rechnen, wieviel die Chips an Strom aufnehmen und wieviel die LEDs) gemessen werden, ist wahrscheinlich irgendwo ein Kurzschluss in Deinem Aufbau. Am Schaltplan habe ich so auf die schnelle nichts falsches gesehen, davon sollte auf jeden Fall die Versorgungsspannung nicht einbrechen. Ansonsten nochmal akribisch alle Verbindungen checken und wenn garnichts anderes hilft, wieder zurück aufs Breadboard, schauen ob es da geht...

Hoffe das hilft ein wenig.

Gruß,
Ralf

Hallo Ralf, nein, dass die RBGLED gelb leuchtet ist in dem Fall schon richtig. Das heißt, Gelb ergab sich daher, dass die RGB rot und grün leuchtet.

Werde gleich nochmal die Platine abklemmen, und jeden Kontakt messen, ob ich was finden kann. Leider habe ich die ganzen "Strippen" schon vom Steckbrett runter, müsste die neusetzen, aber sollte kein Problem sein.

Edit:

Hab nun auf dem Steckbrett noch einmal getestet (hab es derzeit auch komplett belassen ausser den ICs).

Dann habe ich auf der Platine die 5V von den ICs auf die externe Spannungsversorgung gelegt. Habe nun nach mehreren hin und hers somit nun die Platine am laufen.

Jedoch besteht das 2. Problem noch.

// SetPinGrouping allows flexibility in LED setup. 
  // If your LED's are connected like this: RRRRGGGGBBBBRRRRGGGGBBBB, use SetPinGrouping(4).
  ShiftPWM.SetPinGrouping(4); //This is the default, but I added here to demonstrate how to use the funtion

Hat keinerlei Auswirkungen.

Ich habe bereits die 4er Stecker hier zum Crimpen liegen und würde somit am liebsten immer 4 Sorten auf einem Stecker haben. 4x Rot, 4x Grün, 4 Blau (2 x gesamt).

Wenn ich ShiftPWM.SetPinGrouping auf Standard lasse mit 1 und ich die LEDs einzeln nach einander auf die Ausgänge lege (TLC1.1 = R; TLC1.2 = G; TLC1.3 = B; TLC1.4 = R; .... TLC3.8 = B) funktioniert der Test Sketch wie im Video. http://www.elcojacobs.com/shiftpwm/

Bei 4 leuchten die ersten 4 RGBs einmal rot auf, dann alle nacheinader Grün und zum Schluss blau

Das letzte bestehende Problem meiner einstigen Frage ist nun gelöst.

Ich habe Elco angeschrieben. Die OnebyOne ist nur eine Demofunktion um die Reihenfolge der Ausgänge zu testen. PinGrouping wird hierbei nicht gesetzt.

Ich habe nun ein kleines Problem, ich denke, ich hab irgendwo nur wieder ein Zeichen verpatzt.

Die Funktion ohne das Switch funktioniert, jedoch wollte ich nun verschiedene Komibination mit dem Blinklicht erzeugen.
rgbModus[] soll die Werte aus der Switch Anweisung erhalten.

// RGB Shift Register
#include <ShiftPWM.h>
// Folgende 3 Zeilen auskommentieren, 
// wenn die SPI Schnittstelle nicht genutzt werden soll. 
//#define SHIFTPWM_NOSPI
//const int ShiftPWM_dataPin = 11;
//const int ShiftPWM_clockPin = 13;
const int ShiftPWM_latchPin = 8;
const bool ShiftPWM_invertOutputs = false;
const bool ShiftPWM_balanceLoad = false;
unsigned char maxHelligkeit = 255;
unsigned char pwmFrequenz = 75;
unsigned int numRegister = 3;
unsigned int numAusgaenge = numRegister * 8;
unsigned int numRgbLeds = numRegister * 8 / 3;



void setup() {
  // RGB Shift Register
  ShiftPWM.SetAmountOfRegisters(numRegister);
  ShiftPWM.SetPinGrouping(4);
  ShiftPWM.Start(pwmFrequenz, maxHelligkeit);

  Serial.begin(9600);
  delay(1000);
  Serial.println("Arduino gestartet");
}


void loop() {
  static int i;

  if(Serial.available()) 
  {
    i = Serial.parseInt();
    Serial.println(i);
  }

  blinklicht(100, i);
}

//Subfunktionen
void blinklicht(unsigned long wartezeit, unsigned int modus) {
  unsigned long aktuelleZeit = millis();
  static unsigned long vorherigeZeit;
  static int j;
int rgbModus;
  
  switch(modus) {
  case 0: 
   rgbModus[] = {
      0, 2, 4, 6, 1, 3, 5, 7                      }; // RB RB RB RB
    break;
  case 1: 
    rgbModus[]  = {
      1, 3, 5, 7, 0, 2, 4, 6                      }; // BR BR BR BR
    break;
  case 2: 
    rgbModus[]  = {
      0, 1, 4, 5, 2, 3, 6, 7                      }; // RR BB RR BB
    break;
  case 3: 
    rgbModus[]  = {
      2, 3, 6, 7, 0, 1, 4, 5                      }; // BB RR BB RR
    break;

  case 4: 
    rgbModus[]    = {
      0, 1, 2, 3, 4, 5, 6, 7                      }; // RR RR BB BB
    break;
  case 5: 
    rgbModus[]    = {
      4, 5, 6, 7, 0, 1, 2, 3                      }; // BB BB RR RR
    break;

  case 6: 
    rgbModus[]    = {
      2, 3, 4, 5, 0, 1, 6, 7                      }; // BB RR RR BB
    break;
  case 7: 
    rgbModus[]    = {
      0, 1, 6, 7, 2, 3, 4, 5                      }; // RR BB BB RR
    break;

  default:
    modus = 0;
  }

  if(aktuelleZeit - vorherigeZeit > wartezeit) {
    j = 1;
    if(aktuelleZeit - vorherigeZeit > wartezeit * 2) {
      j = 0;
      vorherigeZeit = aktuelleZeit;
    }
  }

  if(j == 1)
  {
    for(int k = 0; k < 4; k++) ShiftPWM.SetRGB(rgbModus[k], 255, 0, 0);
    for(int k = 4; k < 8; k++) ShiftPWM.SetRGB(rgbModus[k], 0, 0, 0); 
  }
  else
  {
    for(int k = 0; k < 4; k++) ShiftPWM.SetRGB(rgbModus[k], 0, 0, 0);
    for(int k = 4; k < 8; k++) ShiftPWM.SetRGB(rgbModus[k], 0, 0, 255);   
  }
}
sketch_aug22a.ino: In function 'void blinklicht(long unsigned int, unsigned int)':
sketch_aug22a:52: error: expected primary-expression before ']' token
sketch_aug22a:52: error: expected primary-expression before '{' token
sketch_aug22a:52: error: expected `;' before '{' token
sketch_aug22a:56: error: expected primary-expression before ']' token
sketch_aug22a:56: error: expected primary-expression before '{' token
sketch_aug22a:56: error: expected `;' before '{' token
sketch_aug22a:60: error: expected primary-expression before ']' token
sketch_aug22a:60: error: expected primary-expression before '{' token
sketch_aug22a:60: error: expected `;' before '{' token
sketch_aug22a:64: error: expected primary-expression before ']' token
sketch_aug22a:64: error: expected primary-expression before '{' token
sketch_aug22a:64: error: expected `;' before '{' token
sketch_aug22a:69: error: expected primary-expression before ']' token
sketch_aug22a:69: error: expected primary-expression before '{' token
sketch_aug22a:69: error: expected `;' before '{' token
sketch_aug22a:73: error: expected primary-expression before ']' token
sketch_aug22a:73: error: expected primary-expression before '{' token
sketch_aug22a:73: error: expected `;' before '{' token
sketch_aug22a:78: error: expected primary-expression before ']' token
sketch_aug22a:78: error: expected primary-expression before '{' token
sketch_aug22a:78: error: expected `;' before '{' token
sketch_aug22a:82: error: expected primary-expression before ']' token
sketch_aug22a:82: error: expected primary-expression before '{' token
sketch_aug22a:82: error: expected `;' before '{' token
sketch_aug22a:100: error: invalid types 'int[int]' for array subscript
sketch_aug22a:101: error: invalid types 'int[int]' for array subscript
sketch_aug22a:105: error: invalid types 'int[int]' for array subscript
sketch_aug22a:106: error: invalid types 'int[int]' for array subscript
int rgbModus;
  
  switch(modus) {
  case 0: 
   rgbModus[] = {
      0, 2, 4, 6, 1, 3, 5, 7                      }; // RB RB RB RB
    break;

Müsstest du erklären was du da eigentlich willst ?

Sieht aus als sollte rgbModus ein byte-Array von 8 Byte sein ?
Bzw. ein Pointer auf eines von mehreren konstanten ByteArrays ?

Falls ich richtig rate, mach doch ein Array aus solchen ByteArrays und hol dir das richtige, abhängig von modus.

byte rgbModusList[8][8] = {
    { 0, 2, 4, 6, 1, 3, 5, 7  } , // 0 =  RB RB RB RB
    { 1, 3, 5, 7, 0, 2, 4, 6  }   // 1 =  BR BR BR BR

// ... usw.
}
// ...
void blinklicht ( unsigned int wz, unsigend int modus) {

    if (modus < 8)  {
        byte * rbgModus = rgbModusList[modus];

        // rgbModus[k] ist jetzt ok
        // ...
        for(int k = 0; k < 4; k++) ShiftPWM.SetRGB(rgbModus[k], 255, 0, 0);
        for(int k = 4; k < 8; k++) ShiftPWM.SetRGB(rgbModus[k], 0, 0, 0); 
    }
}