#include <avr/pgmspace.h>
#define COLUMN 8 // Anzahl der Spalten
#define PLANE 5 // Anzahl der Ebenen
#define PLANETIME 3333 // Anzeigedauer einer Ebene
#define TIMECONST 15 // Multiplikator für Anzeigedauer eines Bildes (33 LEDs)
// LED Muster: Eine Zeile besteht aus den 5 Ebenen mit je 8 LEDs (außer Ebene 5 mit einer LED) und der Anzeigedauer
prog_uchar PROGMEM PatternTable[] = {
B11111111, B11111111, B11111111, B11111111, B1, 5, // Alle LEDs an
B00000000, B00000000, B00000000, B00000000, B0, 1, // Alle LEDs aus
B11111111, B11111111, B11111111, B11111111, B1, 5,
B00000000, B00000000, B00000000, B00000000, B0, 10,
// Bei Anzeigedauer 0 endet die Schleife
B00000000, B00000000, B00000000, B00000000, B0, 0
};
// Definition der Pins für Ebenen und Spalten (hängt davon ab, wie man sie verlötet hat)
int LedPin[] = {7, 8, 6, 9, 10, 11, 12, 5};
int PlanePin[] = {18, 17, 16, 15, 14};
void setup()
{
int pin;
// Pins als OUTPUT initialiseren
for (pin=0; pin<COLUMN; pin++) {
pinMode( LedPin[pin], OUTPUT );
}
for (pin=0; pin<PLANE; pin++) {
pinMode( PlanePin[pin], OUTPUT );
}
}
void loop()
{
byte PatternBuf[PLANE]; // speichert eine Zeile aus LED Muster
int PatternIdx;
byte DisplayTime;
unsigned long EndTime;
int plane;
int patbufidx;
int ledpin;
// Index in LED Muster setzen
PatternIdx = 0;
// Wiederholen solange Anzeigedauer > 0
do {
// Zeile aus LED Muster lesen
memcpy_P( PatternBuf, PatternTable+PatternIdx, PLANE );
PatternIdx += PLANE;
// Anzeigedauer lesen
DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx++ );
// Anzeigedauer für Bild berechnen
EndTime = millis() + ((unsigned long) DisplayTime) * TIMECONST;
// LEDs der Ebenen immer wieder aufbauen, solange Anzeigedauer für Bild noch nicht erreicht ist
while ( millis() < EndTime ) {
patbufidx = 0; // Am Anfang der Zeile beginnen
// Schleife über Ebenen
for (plane=0; plane<PLANE; plane++) {
// vorherige Ebene ausschalten
if (plane==0) {
digitalWrite( PlanePin[PLANE-1], HIGH );
} else {
digitalWrite( PlanePin[plane-1], HIGH );
}
// Spalten der aktuelle Ebene setzen
// Ebene 5 gesondert behandeln, da nur eine LED
if (plane==PLANE-1) {
digitalWrite( LedPin[0], PatternBuf[plane] );
} else {
// Einzelne Spalten setzen
for (ledpin=0; ledpin<COLUMN; ledpin++) {
// Bitoperation zur Ermittlung der einzelnen Bitwerte
// Beispiel:
// LED Zeile & ledpin (left shift (<<) schiebt ledpin um 1 nach rechts)
// B01010000 & B10000000 = 0 (LED leuchtet nicht)
// B01010000 & B01000000 = 1 (LED leuchtet)
// B01010000 & B00100000 = 0 (LED leuchtet nicht)
digitalWrite( LedPin[ledpin], PatternBuf[plane] & (1 << ledpin) );
}
}
// aktuelle Ebene aktivieren
digitalWrite( PlanePin[plane], LOW );
// Anzeigedauer für Ebene
delayMicroseconds( PLANETIME );
}
}
} while (DisplayTime > 0);
}
i uploaded the file to the atmega328 arduinoBoardDuemilanove and all it does it keeps blinking on off.please help.