Hallo zusammen,
ich weiß das der Thread schon ein paar Monate eingestaubt ist. Aber vielleicht kann mir ja trotzdem jemand weiterhelfen. ![]()
Habe das ganze mal nachgebaut und den Example Code von der ersten Seite ausprobiert und modifiziert.
Ansicht funktioniert das ganze denke ich auch. Nur tritt bei mir folgendes Problem auf.
Ich setzte folgenden Code:
#include "Tlc5940Mux.h"
#define NUM_TLCS 1
#define NUM_ROWS 8
#define NUM_COLUMNS 8
volatile uint8_t isShifting;
uint8_t shiftRow;
byte red[8 * 8] = { 255, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0};
byte green[8 * 8] = { 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0};
byte blue[8 * 8] = { 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 0, 255, 0, 255, 255, 255,
255, 255, 255, 0, 255, 0, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0};
byte blue2[8 * 8] = { 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 0, 255, 0, 255, 255,
255, 255, 0, 255, 0, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0};
// SHIFT_DATA_PIN (PF0 is analog 0) = '595 SER pin (Pin 14)
#define SHIFT_DATA_PORT PORTF
#define SHIFT_DATA_PIN PF0
#define SHIFT_DATA_DDR DDRF
// SHIFT_CLK_PIN (PF1 is analog 1) = '595 SRCLK (Pin 11)
#define SHIFT_CLK_PORT PORTF
#define SHIFT_CLK_PIN PF1
#define SHIFT_CLK_DDR DDRF
// '595 RCLK is hooked to tlc XLAT pin (Arduino digital Pin 11, 74HC595 Pin 12)
int led_red;
int led_green;
int led_blue;
static inline void
shift8_595_row(uint8_t row)
{
// the output of the '595 for the selected row should be low, all others
// high
uint8_t output = (1 << row);
for (uint8_t bit = 0x80; bit; bit >>= 1) {
if (bit & output) {
SHIFT_DATA_PORT |= _BV(SHIFT_DATA_PIN);
} else {
SHIFT_DATA_PORT &= ~_BV(SHIFT_DATA_PIN);
}
// pulse the '595 sclk
SHIFT_CLK_PORT |= _BV(SHIFT_CLK_PIN);
SHIFT_CLK_PORT &= ~_BV(SHIFT_CLK_PIN);
}
}
ISR(TIMER1_OVF_vect)
{
if (!isShifting) {
disable_XLAT_pulses();
isShifting = 1;
sei();
TlcMux_shiftRow(shiftRow);
shift8_595_row(shiftRow);
shiftRow++;
if (shiftRow == NUM_ROWS) {
shiftRow = 0;
}
enable_XLAT_pulses();
isShifting = 0;
}
}
void setup()
{
SHIFT_DATA_DDR |= _BV(SHIFT_DATA_PIN);
SHIFT_CLK_DDR |= _BV(SHIFT_CLK_PIN);
TlcMux_init();
}
void loop()
{
for (byte Wiederholung = 0; Wiederholung <= 50; Wiederholung++)
{
for (uint8_t row = 0; row < NUM_ROWS; row++)
{
for (uint8_t col = 0; col < NUM_COLUMNS; col++)
{
Matrix_Pixel(row, col, red[(row * 8) + col], green[(row * 8) + col], blue[(row * 8) + col]);
}
}
}
}
void Matrix_Pixel(uint8_t row, uint8_t column, byte red, byte green, byte blue)
{
led_red = map(red, 0, 255, 0, 4095);
TlcMux_set(row, column, led_red / 1.8);
}
Erwartet habe ich, das nun die erste LED angeht. Es geht jedoch folgendes Muster an.
LED:leicht gedimmt | LED:hell | LED: restlichen LEDs dieser Spalte leuchten ganz stark gedimmt
Meine Frage ist natürlich nun woran das liegen kann?
Desweiter wunder ich mich, warum 3 TLC verwendet werden? Prinzipiell wäre es doch auch mit 2 TLC möglich.
Aller guten Dinge sind drei. Meine dritte Frage bezieht sich auf eine Codezeile:
TlcMux_set(row, column, led_red / 1.8);
Warum die "/1.8" ? Weil die roten LED sonst heller wären als die grünen und blauen? Also einfach mit einem etwas höheren Widerstand ausgleichen und die "/1.8" kann man weglassen.
Ich hoffe das mir jemand weiterhelfen kann.
Vielen Dank.
Mit freundlichen Grüßen