WS2801 led strip ansteuerung

Gast #5005419
Lesenswert?
• ▲
▼
Guten Tag
Ich möchte einen 1m LED Strip ansteuern (IC darauf: WS2801) dafür habe 
ich ein Programm basierend auf Atmelstudio (Atmega 644). Allerdings 
leuchten dan alle LEDs weiss egal ob ich rot Anteil verstelle oder nur 
eine Farbe einstelle sie leuchten alle weiss.
Hat jemand dazu schon einmal ein TEST-Programm geschrieben? Wen ja hoffe 
ich das ich weiter komme. Das man 500us warten muss konnte ich von dem 
Datenblatt entnehmen.
Gast #5005426
Lesenswert?
• ▲
▼
Quellcode:


#include <avr/io.h>
#pragma GCC optimize 0

#define NumberOfLeds 32

unsigned char data[NumberOfLeds][3];

/*********************************************************************** 
***********
*  Wait1s()
*
*Beschreibung:
*Wartet 1 Sekunde.
*
*Rückgabewert:
*keine
*
*Parameter:
*keine
************************************************************************ 
**********/

void Wait1s(void)
{
  unsigned long int ulZaehler;
  for (ulZaehler = 0 ; ulZaehler < 797 ; ulZaehler++)
  {
    asm("nop");
  }
}
/*********************************************************************** 
***********/
void send_RGB(void)
{
  //Clock- und Daten-Leitungen löschen
  PORTA &= ~0xA0;

  for(unsigned char lednum = 0; lednum < NumberOfLeds; lednum++)
  {
    for(unsigned char mask = 0x80; mask; mask >>= 1)
    {
      //Datenleitung setzen oder löschen je nach Tabellen-Inhalt. Pin C1
      if(data[lednum][0] & mask) PORTA |= 0x20; else {PORTA &= 0x20; 
asm("nop");};
      //Clock-Leitung setzen und gleich wieder löschen. Pin C0
      PORTA |= 0x80; PORTA &= ~0x80;
    }

    for(unsigned char mask = 0x80; mask; mask >>= 1)
    {
      if(data[lednum][2] & mask) PORTA |= 0x20; else {PORTA &= 0x20; 
asm("nop");};
      PORTA |= 0x80; PORTA &= ~0x80;
    }

    for(unsigned char mask = 0x80; mask; mask >>= 1)
    {
      if(data[lednum][1] & mask) PORTA |= 0x20; else {PORTA &= 0x20; 
asm("nop");};
      PORTA |= 0x80; PORTA &= ~0x80;
    }
    //Wait1s();
  }
}


int main(void)
{
  DDRA = 0xFF;

  while(1)
  {

    for(unsigned char i = 0; i < NumberOfLeds; i++)
    {
      data[i][0] = 50; //Rot
      data[i][1] = 0; //Grün
      data[i][2] = 0; //Blau
    }



    // SEND DATA TO STRIP 
-------------------------------------------------
    send_RGB();
  }
}
Gast #5005431
Lesenswert?
• ▲
▼
1
#include <avr/io.h>
2
#pragma GCC optimize 0
3

4
#define NumberOfLeds 32
5

6
unsigned char data[NumberOfLeds][3];
7

8
/**********************************************************************************
9
*  Wait1s()
10
*
11
*Beschreibung:
12
*Wartet 1 Sekunde.
13
*
14
*Rückgabewert:
15
*keine
16
*
17
*Parameter:
18
*keine
19
**********************************************************************************/
20

21
void Wait1s(void)
22
{
23
  unsigned long int ulZaehler;
24
  for (ulZaehler = 0 ; ulZaehler < 797 ; ulZaehler++)
25
  {
26
    asm("nop");
27
  }
28
}
29
/**********************************************************************************/
30
void send_RGB(void)
31
{
32
  //Clock- und Daten-Leitungen löschen
33
  PORTA &= ~0xA0;
34
  
35
  for(unsigned char lednum = 0; lednum < NumberOfLeds; lednum++)
36
  {
37
    for(unsigned char mask = 0x80; mask; mask >>= 1)
38
    {
39
      //Datenleitung setzen oder löschen je nach Tabellen-Inhalt. Pin C1
40
      if(data[lednum][0] & mask) PORTA |= 0x20; else {PORTA &= 0x20; asm("nop");};
41
      //Clock-Leitung setzen und gleich wieder löschen. Pin C0
42
      PORTA |= 0x80; PORTA &= ~0x80;
43
    }
44

45
    for(unsigned char mask = 0x80; mask; mask >>= 1)
46
    {
47
      if(data[lednum][2] & mask) PORTA |= 0x20; else {PORTA &= 0x20; asm("nop");};
48
      PORTA |= 0x80; PORTA &= ~0x80;
49
    }
50
    
51
    for(unsigned char mask = 0x80; mask; mask >>= 1)
52
    {
53
      if(data[lednum][1] & mask) PORTA |= 0x20; else {PORTA &= 0x20; asm("nop");};
54
      PORTA |= 0x80; PORTA &= ~0x80;
55
    }
56
    //Wait1s();
57
  }
58
}
59

60

61
int main(void)
62
{
63
  DDRA = 0xFF;
64
  
65
  while(1)
66
  {
67
    
68
    for(unsigned char i = 0; i < NumberOfLeds; i++)
69
    {
70
      data[i][0] = 50; //Rot
71
      data[i][1] = 0; //Grün
72
      data[i][2] = 0; //Blau
73
    }
74
    
75
    
76
    
77
    // SEND DATA TO STRIP -------------------------------------------------
78
    send_RGB();
79
  }
80
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.