Hallo,
ich hatte nur die Pins angepasst, mehr nicht. Es scheint wir verwenden verschiedene Libs? Meine war von wayoda. GitHub - wayoda/LedControl: An Arduino library for MAX7219 and MAX7221 Led display drivers
Wie gesagt, es spielt für die reine Funktion keine Rolle ob alle Digits (Spalten) angesteuert werden oder nur die vorhandenen, muss dennoch funktionieren. Der Unterschied ist nur das die Zeit der restlichen nicht vorhandenen Digits ungenutzt bleibt für das Multiplexing. Deswegen kann man ungenutzte Digits abschalten. Rein praktisch wird auch das keine große Rolle spielen, weil die Mindestfrequenz 800Hz ist.
Probiere mal folgendes, falls in deiner Lib nicht vorhanden. Das ist der im MAX eingebaute LED Test. Damit müssen alle LEDs mit voller Helligkeit leuchten. Die Helligkeit bei dem Test ist unabhängig von einer ggf. vorher eingestellen Intensität. Sie ist nur noch von Rset abhängig. Deine Massebrücken solltest du entfernen. Auch ein vorher eingestelltes Scanlimit ist bei dem Test egal.
Wenn dabei nicht alle Leds leuchten, liegt entweder eine Hardwarefehler oder ein Defekt vor.
Beschaltung des MAX laut Datenblatt ist okay? Kondensatoren?
Wenn das funktioniert können wir weitere Tests machen.
Pins anpassen! CS ist LOAD und MOSI ist DIN. Habe nur die SPI üblichen Namen verwendet.
Und lasse dich nicht am "7221" stören. Die Funktionen sind gleich.
/*
Doc_Arduino - german Arduino Forum
IDE 1.8.7
Arduino Mega2560
07.11.2018
MAX7221
DATA: MSB first
D15 ...D12 bleibt unbenutzt
D11 ... D8 Registeradresse
D7 ... D0 Daten
*/
struct t_setup
{
const byte CLK = 24;
const byte CS = 25;
const byte MOSI = 26;
const byte SEGDP = 128; // Bit.7 - Datenblatt Tabelle 6
const byte SEGA = 64;
const byte SEGB = 32;
const byte SEGC = 16;
const byte SEGD = 8;
const byte SEGE = 4;
const byte SEGF = 2;
const byte SEGG = 1; // Bit.0
const byte DIGIT0 = 0x01; // Datenblatt kompatible Schreibweise
const byte DIGIT1 = 0x02;
const byte DIGIT2 = 0x03;
const byte DIGIT3 = 0x04;
const byte DIGIT4 = 0x05;
void shift_out( byte adresse, byte daten )
{ // Bits rausschieben, MSB first
unsigned int data = 0; // Datenpaket zusammenbauen
data = (data | adresse) << 8;
data = data | daten;
digitalWrite(CS, LOW);
for (byte i = 0; i < 16; i++) {
if (data & 0x8000) { // nur oberstes Bit betrachten
digitalWrite(MOSI, HIGH); // und Datenleitung entsprechend setzen
}
else {
digitalWrite(MOSI, LOW);
}
digitalWrite(CLK, HIGH); // Takt erzeugen
data = data << 1; // nächstes Bit links schieben
digitalWrite(CLK, LOW);
}
digitalWrite(CS, HIGH);
}
void wake_up () {
shift_out(0x0C, 1);
}
void clear_all () {
shift_out(DIGIT0, 0);
shift_out(DIGIT1, 0);
shift_out(DIGIT2, 0);
shift_out(DIGIT3, 0);
shift_out(DIGIT4, 0);
}
void all_ON_Test () {
shift_out(0x0F, 1); // interne IC Funktion
}
void all_OFF_Test () {
shift_out(0x0F, 0); // interne IC Funktion
}
} MAX7221;
void setup() {
digitalWrite(MAX7221.CS, HIGH);
pinMode(MAX7221.CS, OUTPUT);
pinMode(MAX7221.CLK, OUTPUT);
pinMode(MAX7221.MOSI, OUTPUT);
MAX7221.wake_up();
MAX7221.clear_all();
}
void loop() {
MAX7221.all_ON_Test();
delay(1000);
MAX7221.all_OFF_Test();
delay(1000);
}