mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Led Chip SD600 mit Bascom programmieren


Autor: Martin Moser (schiefer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Hab mir im Internet Led-Streifen mit Led-Controller (SD600) gekauft.
Nun kenn ich mich nicht unbedingt gut aus mit Datenblätter.
Handelt es sich bei dieser Ansteuerung um eine SPI-Schnittstelle?
Was ich bis verstanden habe ist:
Man überträgt zuerst jeweils ein Byte für grün,blau und rot - und das 
sooft wie Leds
am Streifen sind - und danach 25 Bit ??
Was bedeutet: Guard gap2 ?  25 Bit?
Was muss ich da machen?
Da komm ich nicht mehr klar!

Bis jetzt schaut mein Programm etwa so aus:
Din gibt es eigentlich nicht, ist mit irgendeinem Port definiert

$crystal=4000000
Config Spi=Soft , Din=Pind.3 , Dout=Pind.1,Ss=None , Clock=Pind.0
Dim red as Byte
Dim green as Byte
Dim blue as Byte
Dim x as Byte
Dim y as Byte

Spiinit

red=100:green=50:blue=0

For y=0 to 149     '150 Leds sind am Streifen
  y=Spimove(green)
  y=Spimove(blue)
  y=Spimove(red)
next

nop
End

Kann mir jemand weiterhelfen?
mfg
schiefer

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ist da wirklich für jede LED eine IC verbaut? Sicher kein billiger Spaß 
aber sicherlich nicht schlecht wenn jede LED einzeln steuerbar ist. Die 
25Bit sind dafür das der IC den neuen Frame erkennt, d.h er muss ja 
erkennen wann du neue Daten schickst. Leider ist Bascom nicht mein Fall 
aber generiere einfach 25 Clock Impulse ohne das du Daten schickst nach 
deine Schleife.

Schick mal den Link wo du das Teil gekauft hast.

Gruß

Thorsten

Autor: Martin Moser (schiefer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thorsten,

Danke für deine schnelle Antwort!
Für drei Leds gibts einen Controller.
Handelt es sich wirklich um eine SPI-Schnittstelle?
Weil wenn das so ist, weiss ich nicht wie man den Takt extra senden 
könnte!
Die Streifen habe ich direkt in Shanghai gekauft.

mfg
schiefer

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das wirst du sicherlich mit einer SPI Schnittstelle ansteuern können. 
Allerdings pass mit deiner Kabellänge auf ( vom Controller zum LED 
Streifen ) Ich würd mal sagen nicht mehr als 10cm! Oder stell deinen SPI 
sehr langsam ein!

Gruß

Th.

Autor: Niklas Upphed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Guys

I started to look at the SD600 yesterday (only the data sheet, haven't 
got any sd600 hardware yet). I also find the 25 bit gap guard a bit 
strange.

I see three possible solutions to this problem

1. Manually add a single clock cycle.
while(1) // loop forever
{
  for(n=0; n<150; ++n) //150 Leds sind am Streifen
  { 
    writespi(green);
    writespi(blue);
    writespi(red);
  }
  GetManualControlOfSpiPins();
  SetSpiDataPinToZero();
  SendOneClockCycle();
  SetControlOfSpiPinsToSpiHardware()

  writespi(0xff);
  writespi(0xff);
  writespi(0xff);
}

The problem with this solution (if you get it to work) is that the SPI 
clock won't come in a steady pace. In the end of each inner loop you 
will have to make sure that the red byte is fully transmitted before you 
get manual control of the pins. Since the sd600's pwm clock is based on 
the data clock it can result in flicker.

2. Shift data bytes
while(1)
{
  for(s=0; s<8; ++s ) 
  {
    for(n=0; n<150; ++n) 
    { 
      writeSpiShifted(green, s);
      writeSpiShifted(blue, s);
      writeSpiShifted(red, s);
    }
    writeSpiShifted(0x7f, s);
    writeSpiShifted(0xff, s);
    writeSpiShifted(0xff, s);
  } 
}


uint8 lastByte;
void writeSpiShifted(uint8 byteToSend, uint8 shift)
{
  uint8 hi;
  uint8 lo;
  if(shift==0)
  {
    writespi(byteToSend);
  }
  else
  {
    hi = lastByte << 8-shift;
    lo = byteToSend >> shift;
    writespi( hi | lo ); //or together
  }
  lastByte=byteToSend;
}

This solution ought to work, but it is quite time consuming to do all 
this shifting for every byte sent. You can of course optimize the 
algorithm, but it will still be slow.

3. Send 32 bit gap guard

Rgb color values are allowed to be 0..254. 255 is reserved for the gap 
guard. IF (and this is a big if) the logic within sd600 resets it's 
pixel counter when it has received 24 1's preceded by at least one 0. 
Then you could just as well send a 32 bit gap guard (0x00ffffff)
while(1) // forever
{
  for(n=0; n<150; ++n)
  { 
    writespi(green);
    writespi(blue);
    writespi(red);
  }

  writespi(0x00);
  writespi(0xff);
  writespi(0xff);
  writespi(0xff);
}

This is by far the simplest solution of my three, but i relies on the 
stated prejudice about the logic. The only way to know if it works is to 
try it on real hardware. And then you only know that it works on that 
particular hardware.

/Niklas

(Sorry for the English. I can read German ok, but I never manage to form 
complete sentences.)

Autor: Martin Moser (schiefer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

danke für die antworten von thorsten und niklas!
lg
martin

hab mich auf einer chinesischen seite (in c++) informiert.
bascom:

'config spisoft.....

dim red(50) as byte
dim green(50) as byte
dim blue(50) as byte
dim stopbit(4) as byte
dim x as byte
dim y as byte

stopbit(1)=127
stopbit(2)=255
stopbit(3)=255
stopbit(4)=255

'die ganze linie in rot
do
for x=1 to 50
  red(x)=254
  green(x)=0
  blue(x)=0
next
gosub ausgabe
loop


end

ausgabe:
  for y=1 to 50
    spiout red(y),1
    spiout green(y),1
    spiout blue(y),1
  next
  for y=1 to 4
    spiout stopbit(y),1
  next
  return

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I apologize in advance if this is in English, but I can't really read or 
write German.

Anyways, I also have this LED tape lighting that uses the SD600 chip. 
I'm testing my controller right now, and I have control over the chips, 
but I've noticed that I can't get the Red LED to turn off completely.  I 
suspect that the outputs on the SD600 chip are not truly open-collector, 
and that even when the output is "OFF" there is still current that is 
allowed to leak through.  I have the data sheet for it, but it is very 
vague.

Please let me know if anyone else has this problem and/or a solution.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK,

I just confirmed my suspicion.  The outputs on  the SD600 do not float 
in OFF mode, but are actually held at approximately Vdd.  The problem 
arises when running the strip from 12V ( as indicated ) because the 
voltage drop across three red LEDs is less than 7V so the SD600 can't 
turn the red output off.  The voltage drop across the green and blue 
LEDs is more than 7V, so when the output is held at approx 5V (Vdd) the 
LEDs will not turn on.

The solution to the problem is to run the tape at 10V instead of 12V. 
The LEDs will be a little less bright, but at least the red turns off 
completely.

Autor: Martin Moser (schiefer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

i have the same problem.
if i reduce the voltage to 9 volt, the strip running very well.
the red goes off, and the other colors also.
i dont know, why the problem appears by 12volt.
in the datasheet i dont read it!

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yeah, it's a design problem.  It's because the SD600 chip sinks the 
current from the LEDs.  So when the chip outputs are at 0V, the LEDs 
turn on.  Then when the chip wants to turn the LEDs off, the output goes 
to 5V.  This works ok for the green and blue because when the chip 
output is at 5V, there is 7V left ( from 12V) across the three LEDs in 
series.  That is 2.3V per LED, that is not enough to turn a green or 
blue LED on, but it is enough to dimly turn the red ones on.

The SD600 chip is not designed very well to be sinking the current.  It 
would need open-collector outputs to do this.  Hopefully the 
manufacturer realizes this and makes a design change.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.