Fragen zum Shift-Register und Matrixsteuerung

Die kleinste adressierbare Speichereinheit ist das char
Und ein byte ist ein unsigned char

CHAR_BIT ( aus #include "limits.h") sagt dir, wie viele Bit in einem char stecken.

Wenn Du es so sehen willst, dann werden die links fehlenden Bits mit 0 "aufgefüllt".
Einfacher gesagt: Sie sind einfach 0.

Gruß Tommy

Danke für die einfache und verständliche Erklärung Tommy 56

Lieben Gruß

Das hat sich ja vermutlich inzwischen geklärt. "der alte Inhalt" bezieht sich nicht auf die Ausgänge des Schieberegisters sondern eventuell auf den Inhalt des Bytes, falls du da einzelne Bits per bitSet oder mit dem oder-Operator | bzw. |= setzt.

So befinierst Du 2 Arrays zu 8 Elementen aber die Binärzahl wird in das erste Element der Arrays geladen. Noch dazu sind das 16 bit Variablen, also doppelt so groß wie gebraucht.
Da 1 Byte bereis 8 Bit Daten tragen kann reicht eine Variable vom Typ byte. Die einzelnen Bits eines Bytes kannst Du mittels den Funktionen

bzw

Löschen und setzen

Auch kann ein bitweises AND bzw OR ein bestimmtes Bit setzen bzw löschen.
Siehe

Grüße Uwe

Mit ein bisschen Fleiß, kann man sich auch ein BitArray bauen.

Hier mal ein Fragment aus meiner Wühlkiste:


#include "limits.h"
#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"

class BitRef
{
  private:
  byte &bits;
  const unsigned maske;
  
  public:
  BitRef(byte &bits,const unsigned index ): bits{bits},maske(1<<(index % CHAR_BIT)){}

  operator bool()
  {
    return bool(bits & maske);
  }
/*  
  operator int()
  {
    return bits & maske;
  }
*/
  bool operator=(const bool bit)
  {
    bits = bit ? bits | maske : bits & ~maske;
    return bool(*this);
  }
};

class BitArray
{
   private:
   byte bits;

   public:
   explicit BitArray(const byte initial = 0):bits{initial}{}
   operator byte() const
   {
    return bits;
   }

   BitRef operator [](unsigned index)
   {
     return {bits,index};
   }

   
};


void setup() 
{
  Serial.begin(9600);
  cout << F("Start: ") << F(__FILE__) << endl;

  BitArray b;
  cout << F("leer: ") << _BIN(b) << endl; 

  b[2] = 1;
  cout << F(" b[2] = 1: ") << _BIN(b) << endl; 
  cout << F(" b[2]: ") << bool(b[2]) << endl; 
  
  b[2] = 0;
  cout << F(" b[2] = 0: ") << _BIN(b) << endl; 
  cout << F(" b[2]: ") << bool(b[2]) << endl; 

  
}

void loop() 
{

}

Meinst du einfach:

//Shift für Spalten
byte LED_C[8] = {0b11110000, 0b..., 0b..., 0b..., 0b..., 0b..., 0b..., 0b...};

//Shift für Reihen
byte LED_R[8] = {0b00010000, 0b..., 0b..., 0b..., 0b..., 0b..., 0b..., 0b...};

?
Verstehe ich das richtig?

Die Links schaue ich mir die Tage in Ruhe an. Heute hatte ich schon sehr viel neuen Input. Danke!

Kurze Zwischenfrage: Dass ich Transistoren nutzen muss, ist klar. Dachte da an einen Array-Tarnsistor. Müssen für diese nicht noch Basis- und Emitterwiderstände berechnet werden? Sehe immer nur Bsp. ohne. Hatte mit einem solchen noch nicht gearbeitet. Aber sind ja eigentlich nur Transitoren?! Ic ist klar, zur Begrenzung des Stromes für die LED´s.
Also der Basiswiderstand, dass der Arduino nicht überlastet wird und der Emitter für die Vorspannung?!

Gruß

Hat sich schon, denke ich, geklärt :smiley:
Unbenannt

warum nimmst denn keine Treiber ICs wie den MAX7219 (wie schon vorgeschlagen) oder den HT16K33 ?

Weil ich anderes vorhabe.
Es sollen in einer 11x11 Matrix einzelne LED´s in noch nicht definiertem Abstand zueinander, in Gruppen angesteuert werden.

Werde vermutlich APA102 nutzen oder eigene Platinen anfertigen lassen, wenn alles läuft. Aber nicht zu viel Neues auf einmal. Lieber Schritt für Schritt.

Auf die Platine kommen dann die Arrays, Shifts, LED´s und ein Steckplatz für einen uC.

Danke aber noch einmal für die Erinnerung :slight_smile:

11x11 sind auch nur 121 LEDs. Das geht mit einem HT16K33. Aber wennst lieber zwei Shiftregister, x Transen oder 2 ULN, Vorwiderstände für die LEDs und sonstiges Hühnerfutter löten möchtest, ... jedem sein Königreich.

Oh, hatte es schon befürchtet - habe mich versehen :smiley: Das sind ja IC´s. Hatte im Internet erst nur so fertige LED-Segmente gefunden, unter der Bezeichnung. Sorry! Jetzt weiß ich was du/ihr meint. werde ich mir ansehen!

Gruß

bei den meisten 8x8 Modulen mit MAX7219 (die oft als 4er Kombi verkauft werden, kannst vorsichtig auseinanderbrechen) ist das 8x8 Modul oft gesockelt sodass du dann auch deine Platine anstecken könntest.

Ebenso bei den 8stelligen 7 Segment-Anzeigen mit grüner PCB ... da sind die Module meist auch nur gesteckt.

Ansonsten gibts den MAX7219 auch in DIL falls das beim Löten hilft.

Den HT16K33 kenne ich nur als SMD - dafür findest du den auch fertig auf Breakout boards

Nein.

Du benutzt die Transistoren als Schalttransistoren vor allem als NPN Typ und darum mit reichlich genügend Basisstrom damit der Kollektorstrom nicht begrenzt wird. Richtig ist, daß der Basiswiderstand so groß sein muß damit der Arduino nicht überlastet ist. Einen Emitterwiderstand darf es keinen geben, Der Emitter kommt auf Masse und am Collektor kommt die Cathode der LED einer Reihe mit Vorwiderstand und die Anode an die Ausgänge der Schieberegister.

Die Wertetabelle brauchst Du nur in eine Richtung. In die andere Richtung wird einfach nacheinander geschaltet.

Grüße Uwe

Hab eine dumme Frage.

In der Anleitung steht, dass nur bis zu 64 LED´s angesteuert werden können. Also 8 je Ausgang?!
Eine übliche LED hat 20mA und die Ausgänge vertragen laut Datenblatt 330mA.
Dabei bräuchte ich für mein Vorhaben mindestens zwei Maxis je Reihe und Spalte, oder?

Woher kommt diese Einschränkung?

Du hast 8 Ausgänge für Anoden und 8 Ausgänge für Cathoden.
2x64 sind 128.

Aus meiner Sicht reichen für 121 LEDs daher zwei MAX7219

Einspruch. oder besser etwas genauer.
Der MAX7219 hat schon 8 Pins für die Anoden der LED und 8 Pins für die Kathoden.
Die LED mußt Du zwischen den AnodenPins und den Cathodenpins anschließen und so passen nur 64 LED. Ich weiß nicht wo Du die zweiten 64 LED herkommst.

Für 128 LED brauchst Du dann 2 MAX7219. Jeder steuert unabhängig 64 LED an. Du kannst die Datenleitung der MAX7219 in serie schalten (Dout zu Din) und die Steuerleitungen (SCK, CS) paralell. Dann mußt Du 2 mal 8Byte Daten ( 64 bit) übertragen.

Grüße Uwe

Welche Einschänkung?

@uwefed

Also ich lese da, dass zwei benötigt werden….