Go Down

Topic: Daten speichern + 16x16 RGB-LED-Matrix ansteuern (Read 17 times) previous topic - next topic

Nathax

So, kleiner Zwischenstand:
Ich habe jetzt die Platinen fertiggestellt.
Angeschlossen wurden bis jetzt zwei Matrizen, also 16x8 Pixel.
Klappt auch einigermaßen.
Allerdings flackert es, wenn ich alles Rot färbe.
Ich weiß nicht, ob ich das schonmal angesprochen habe,
aber weiß jemand, woran das liegen könnte?

Nathax

#181
Oct 14, 2012, 08:24 pm Last Edit: Oct 14, 2012, 08:33 pm by Nathax Reason: 1
Ich habe folgenden Sketch und rot flackert:
Code: [Select]
#define  NUM_TLCS  3 // Hier Anzahl der verwendeten TLC5940 hinschreiben
#define  NUM_ROWS  16 // Anzahl der ROWS der Matrix
#define  NUM_COLUMNS 8 // An zahl der Columns der Matrix
#include "Tlc5940Mux.h"
//#define __AVR_ATmega2560__

volatile uint8_t isShifting;
uint8_t shiftRow;
                     
// SHIFT_DATA_PIN (PF0 is analog 0) = '595 SER pin
#define SHIFT_DATA_PORT PORTF
#define SHIFT_DATA_PIN  PF0
#define SHIFT_DATA_DDR  DDRF
// SHIFT_CLK_PIN (PF1 is analog 1) = '595 SRCLK
#define SHIFT_CLK_PORT  PORTF
#define SHIFT_CLK_PIN   PF1
#define SHIFT_CLK_DDR   DDRF
// '595 RCLK is hooked to tlc XLAT pin

uint16_t Led_Red;
uint16_t Led_Green;
uint16_t 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);
  uint8_t output = (1 << row); // Eventuell beides mal probieren
  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;
  }
}


const int MatrixWidth = NUM_ROWS;
const int MatrixHeight = NUM_COLUMNS;

int PixelColor[MatrixWidth+1][MatrixHeight+1][4];


void setup()
{
  SHIFT_DATA_DDR |= _BV(SHIFT_DATA_PIN);
  SHIFT_CLK_DDR  |= _BV(SHIFT_CLK_PIN);
  TlcMux_init();
}



void loop()
{
  for(int i = 1; i <= MatrixWidth; i++)
  {
    for(int j = 1; j <= MatrixHeight; j++)
    {
      PixelColor[i][j][1] = 255;
      PixelColor[i][j][2] = 0;
      PixelColor[i][j][3] = 0;
    }
  }
  Render();
  delay(1000);
}



void Render()
{
  Display();
}



void Display()
{
  for(int i = 1; i <= MatrixWidth; i++)
  {
    for(int j = 1; j <= MatrixHeight; j++)
    {
      Matrix_Pixel(i, j, PixelColor[i][j][1], PixelColor[i][j][2], PixelColor[i][j][3]);
    }
  } 
}



void Clear()
{
  for(int i = 1; i <= MatrixWidth; i++)
  {
    for(int j = 1; j <= MatrixHeight; j++)
    {
      PixelColor[i][j][1] = 0;
      PixelColor[i][j][2] = 0;
      PixelColor[i][j][3] = 0;
    }
  }   
}



void Matrix_Pixel(uint8_t Row, uint8_t Column, byte Red, byte Green, byte Blue)
{   
   Row -= 1;
   Column -= 1;
   Led_Red = map(Red, 0, 255, 0, 4095);
   Led_Green = map(Green, 0, 255, 0, 4095);
   Led_Blue = map(Blue, 0, 255, 0, 4095);
   
   if(Row < 8)
   {
     TlcMux_set(Row, Column, Led_Red / 1.8);
     TlcMux_set(Row, Column+16, Led_Green);
     TlcMux_set(Row, Column+32, Led_Blue);
   }
   else
   {
     TlcMux_set(Row-8, Column+8, Led_Red / 1.8);
     TlcMux_set(Row-8, Column+8+16, Led_Green);
     TlcMux_set(Row-8, Column+8+32, Led_Blue);
   } 
   //TlcMux_set(Row, Column, Led_Green);
   //TlcMux_set(Row, Column, Led_Blue);



Auffällig ist auch, dass wenn Pixelfehler auftreten, sagen wir bei einer 6x3 Matrix, folgendes passiert:
xxxoox
ooxxxx
ooxxxx
Es tritt eine Art verschiebung des Pixelfehlers in die zweite Matrix ein.
Kann der "Arduino" eigentlich 2 Matrizen bewältigen, ohne ext. Spannungsversorgung?

Nathax

Neue Beobachtungen:
Wenn man den "Arduino" über USB anschließt und alle LEDs (16x8) auf Lila setzt, flackert das Bild in verschiedenen Farben, und Mustern.
Schließt man nun ein Netzteil an, so erhält man die Wunschfarbe, in diesem Fall Lila und es flackert nicht.
Rot flackert jedoch trotz Netzteils. Nimmt man jedoch bei Pixelfehlern oder bei einem komplett roten Bild eine der beiden Matrizen raus,
so funktioniert die zweite so wie sie soll. Es tritt kein Flackern oder Pixelfehler mehr auf.
Manchmal, wenn die RGB-Werte eine sehr große Summe haben, erhitzen die TLCs sehr stark und schalten sich ab.
Jemand eine Idee woran das liegen könnte?
Und wv. Strom sollte die Matrix ziehen, wenn ich sie auf komplett Weiß stelle?

Megaionstorm

Quote
Und wv. Strom sollte die Matrix ziehen, wenn ich sie auf komplett Weiß stelle?


2 X 3 X 8 X 0.02A = 0,96A
Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Nathax

Ok, dann war meine Rechnung richtig.
Kann das ganze trotzdem ein Problem der Spannung/Stromstärke sein?

Go Up