Go Down

Topic: Daten speichern + 16x16 RGB-LED-Matrix ansteuern (Read 18029 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?

Megaionstorm

Wenn ich mich nicht irre benutzt Du den ULN2981, der hat ein Turn-Off Delay von 5µs und ein Turn-On Delay von 1µs.

Ich weis jetzt nicht in welchem µs Abstand die Zeilen durch die TLCMux Library weitergeschaltet werden, aber theoretisch könnte es sein das für kurze Zeit 2 benachbarte Zeilen Strom ziehen.

Kann natürlich auch ein Irrtum meinerseits sein !
Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Nathax

Fast, ich benutze UDNs.
Uwe hat doch auch ein 16x8 und bei dem hats doch mein ich auch funktioniert.
Könnte man die Frequenz zum Shiften irgendwie umstellen?

Megaionstorm

Wieviel Ampere kann dein Netzteil den liefern ?
Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Nathax

Momentan zu wenig, aber ich werde mal nach einem 1A für die 16x8 Matrix suchen.

Habe das Flackern für die 16x8 beseitigen können, jedenfalls das bei rot.
Ich werde versuchen die komplette 16x8 weiß zu färben, wenn ich das passende Netzteil habe.
Anschließend werde ich versuchen, die 16x16 zum leuchten zu bringen.
Ich melde mich sobald ich mehr oder weniger Erfolg habe, könnte allerdings ein paar Wochen dauern, da ich momentan sehr beschäftigt bin.

Megaionstorm

Tu Dir was gutes und kauf dir eins mit 2A, dann hast Du in deiner Schaltung noch Erweiterungspotential.

Wie hast Du das Flackern bei Rot entfernt ?
Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Nathax

Ja, ich werde eins mit 2A nehmen. Wir haben noch ganz viele zu hause. Muss nur später gucken, ob ein passendes dabei ist.

Zu dem Flackern, sorry, hab vergessen das zu erwähnen. Ich habe die eine Matrix an den einen, die andere an den anderen Schieberegister+UDN drangeschlossen, vorher beide "Anoden-Blöcke" an zwei, parallel vom SR angesteuerte, UDNs.

Megaionstorm

Genau durch diesen AHA-Effekt lernt man dazu !
Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Nathax

Ist das denn überhaupt logisch?
Ich meine ob das so muss, wie ich das jetzt angeschlossen habe,
und es vorher falsch war?

Megaionstorm

Vielleicht hat die Power eines 74HC595 Ausganges nicht dazu ausgereicht um 2 UDN2981 Eingänge gleichzeitig sauber zu schalten ?!?
Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Nathax

Hmmm... wenn man an den + und - der ext. Schaltung ein 2,5A 5V Netzteil klemmt, dann wird der TLC für die rote Farbe ganz warm (rot wird gerade angesteuert) und das Bild wird nicht korrekt dargestellt.

Go Up