Arduino Uno + WS2801 Pixel Wall
hallo zusammen,
ich bin gerade dabei meinen partykeller zu sanieren...und dabi entstand die idee eine pixelwand zu bauen. die wand ist eine 24x12 matrix und besteht aus 288 ws2801 pixeln. soweit gut. angesteuert werden soll diese matrix durch einen pc auf dem glediator (www.solderlab.de) läuft.
für diese software gibt es bereits einen arduino sketch, der wie folgt aussieht:
die ansteuerung funktioniert auch wunderbar...jedoch nicht mit voller pixelzahl. setze ich num_pixels auf 288 passiert gar nichts mehr.
da sich meine "programmierkenntnisse" auf ein wenig java/php/batch beschränken habe ich leider keine ahnung warum das ist. mit 99px funktioniert es noch, gebe ich 100px findet nach upload keine ausgabe mehr statt.
ist der arduino uno ausgelastet? läuft die schnittstelle über? oder ist es ein softwarefehler?
kann jemand helfen? habe schon tage mit der fehlersuche zugebracht bin aber mit meinem latein ende...wie schön wäre jetzt ein bier in der kellerbar

ich bin gerade dabei meinen partykeller zu sanieren...und dabi entstand die idee eine pixelwand zu bauen. die wand ist eine 24x12 matrix und besteht aus 288 ws2801 pixeln. soweit gut. angesteuert werden soll diese matrix durch einen pc auf dem glediator (www.solderlab.de) läuft.
für diese software gibt es bereits einen arduino sketch, der wie folgt aussieht:
code: [select]
//change matrix size!!
#define num_pixels 16
#define cmd_new_data 1
int sdi = 13;
int cki = 12;
unsigned char display_buffer[num_pixels * 3];
static unsigned char *ptr;
static unsigned char pos = 0;
volatile unsigned char go = 0;
void setup()
{
pinmode(sdi, output);
pinmode(cki, output);
//uart initialisation
ucsr0a |= (1<<u2x0);
ucsr0b |= (1<<rxen0) | (1<<txen0) | (1<<rxcie0);
ucsr0c |= (1<<ucsz01) | (1<<ucsz00) ;
ubrr0h = 0;
ubrr0l = 3; //baud rate 0.5 mbit --> 0% error @ 16mhz :-)
ptr=display_buffer;
//enable global interrupts
sei();
}
void loop()
{
if (go==1) {shift_out_data(); go=0;}
}
//############################################################################################################################################################
// uart-interrupt-prozedur (called every time 1 byte compeltely received) #
//############################################################################################################################################################
isr(usart_rx_vect)
{
unsigned char b;
b=udr0;
if (b == cmd_new_data) {pos=0; ptr=display_buffer; return;}
if (pos == (num_pixels*3)) {} else {*ptr=b; ptr++; pos++;}
if (pos == ((num_pixels*3)-1)) {go=1;}
}
//############################################################################################################################################################
// shift out data #
//############################################################################################################################################################
void shift_out_data()
{
(byte i=0; i<num_pixels; i++)
{
byte r = display_buffer[i*3+0];
byte g = display_buffer[i*3+1];
byte b = display_buffer[i*3+2];
(byte j=0; j<8; j++)
{
digitalwrite(cki, low);
if (b & (byte)(1<<(7-j))) {digitalwrite(sdi, high);} else {digitalwrite(sdi, low);}
digitalwrite(cki, high);
}
(byte j=0; j<8; j++)
{
digitalwrite(cki, low);
if (r & (1<<(7-j))) {digitalwrite(sdi, high);} else {digitalwrite(sdi, low);}
digitalwrite(cki, high);
}
(byte j=0; j<8; j++)
{
digitalwrite(cki, low);
if (g & (1<<(7-j))) {digitalwrite(sdi, high);} else {digitalwrite(sdi, low);}
digitalwrite(cki, high);
}
}
digitalwrite(cki, low);
delaymicroseconds(800); //latch data
}
die ansteuerung funktioniert auch wunderbar...jedoch nicht mit voller pixelzahl. setze ich num_pixels auf 288 passiert gar nichts mehr.
da sich meine "programmierkenntnisse" auf ein wenig java/php/batch beschränken habe ich leider keine ahnung warum das ist. mit 99px funktioniert es noch, gebe ich 100px findet nach upload keine ausgabe mehr statt.
ist der arduino uno ausgelastet? läuft die schnittstelle über? oder ist es ein softwarefehler?
kann jemand helfen? habe schon tage mit der fehlersuche zugebracht bin aber mit meinem latein ende...wie schön wäre jetzt ein bier in der kellerbar

wo hast du den code geklaut? für "nur ein bisschen erfahrung mit java/php/batch" sehen mir folgende zeilen ein wenig hochgegriffen aus:
außerdem sehe ich nirgends eine definition dieser variablen, und die methode isr hat keinen datentyp.display_buffer gibt es nicht. im interrupt passieren soll sehe ich auch nicht... wenn sich der sketch kompilieren lassen würde, bedeutet es entweder, dass du auf bereits intern vorhandene funktionen und variablen zurückgreifst - nicht nachvollziehbar für uns wäre, oder dass etwas deines codes fehlt.
dass der arduino überlastet ist, kann ich mir nicht vorstellen, eher dass irgentwo ein falscher (zu kleiner) datentyp eingesetzt wurde.
leider sieht man aus dem sketch nicht, das ding eigentlich machen soll -so wie er da steht, macht er wenig sinn, da er garnix tut... "go" ist immer 0, der loop loopt sich zu tode.
code: [select]
ucsr0a |= (1<<u2x0);
ucsr0b |= (1<<rxen0) | (1<<txen0) | (1<<rxcie0);
ucsr0c |= (1<<ucsz01) | (1<<ucsz00) ;
ubrr0h = 0;
ubrr0l = 3; //baud rate 0.5 mbit --> 0% error @ 16mhz :-)außerdem sehe ich nirgends eine definition dieser variablen, und die methode isr hat keinen datentyp.
dass der arduino überlastet ist, kann ich mir nicht vorstellen, eher dass irgentwo ein falscher (zu kleiner) datentyp eingesetzt wurde.
leider sieht man aus dem sketch nicht, das ding eigentlich machen soll -so wie er da steht, macht er wenig sinn, da er garnix tut... "go" ist immer 0, der loop loopt sich zu tode.
Arduino Forum > International > Deutsch (Moderator: uwefed) > Arduino Uno + WS2801 Pixel Wall
arduino
Comments
Post a Comment