Forum: Mikrocontroller und Digitale Elektronik SPI Timing ATmega8 und TLC5947


von Florian W. (lordtofu)


Angehängte Dateien:

Lesenswert?

Guten Nachmittag mal,

ich habe mich extra hier angemeldet um diese Frage zu stellen, da ich 
durch Suche nach dem Thema nichts gefunden habe was mir helfen könnte.

Und zwar habe ich folgendes Problem:

Vor einem halben Jahr habe ich mit einem Arduino angefangen, jedoch 
scheint der hier im Forum verschrien zu sein. Und da ich mir auch nicht 
für jedes neue Projekt einen neuen kaufen will habe ich mir ein myAVR 
USB MkII bestellt. So weit so gut, Leds blinken lassen und so einfachere 
Sachen gehen, auch PWM schaffe ich schon mit dem ATMega8A der darauf 
verbaut ist.

Nur will ich jetzt einen TLC5947 ansteuern.
Die .c Datei ist angehängt und ich weiß nicht warum das nicht 
funktioniert. Der TLC ist folgendermaßen an den Atmega angeschlossen:

SCKL auf den PINB5
DIN auf PINB3
XLAT auf PINC5
BLANK auf PINC4

Doch wenn ich Daten sende tut sich rein gar nichts, die LEDs am TLC 
leuchten alle mit voller Stärke.

Laut dessen Datenblatt ist der Clock um 90* Phasenverschoben und im Idle 
Low...also das sollte passen. LSB oder MSB ist egal. Und nach dem Senden 
der GS-Bits, setze ich XLAT und BLANK kurz auf hoch und anschließend 
wieder auf LOW, wie im Datenblatt beschrieben wenn ich es richtig 
verstanden habe. Egal was ich sende es tut sich nichts.

Also das wär einmal meine erste Frage was hier los ist.

Und nun meine zweite:

Der SPI anschluss wird ja auch vom ISP benützt. Muss ich diesen 
abstecken damit die Kommunikation mit dem TLC erfolgreich verlaufen kann 
oder kann ich den dran lassen.

Bitte haut mich nicht gleich für diese Anfängerfragen, für mich ist es 
logisch dass es funktionieren sollte, tut es aber nicht.

Code:


#define F_CPU 3686400UL
#include <avr/io.h>



void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDRB = 0xFF;  //Anschlüsse MOSI und CLK
DDRC = 0xFF;  // Anschlüsse XLAT und BLANK
/* Enable SPI, Master*/
SPCR = (1<<SPE)|(1<<MSTR);
}

void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
cData=SPDR;
;
}

int main(void)
{
  void SPI_MasterInit(void);
  PORTC=0x00;
    while(1)
    {


  for(int i =0;i<36;i++)
  {
    SPI_MasterTransmit(0b00001111);  //Test-Byte
  }
      PORTC=(1<<PIND2)|(1<<PIND3);  //XLAT und BLANK auf HIGH
      PORTC=(0<<PIND2)|(0<<PIND3);  //XLAT und BLANK auf LOW
    }
}


mfG

Flo

von Marco (Gast)


Lesenswert?

Guck mal hier, die Forensuche hilft da weiter...

Beitrag "TLC5947 Ansteuerung"

von Florian W. (lordtofu)


Lesenswert?

OK, das habe ich mir zwar angesehen, habe aber keinen großen Unterschied 
gefunden. Wenn ich es aber so abschreibe dann geht es....muss also am 
Timing liegen.
Na dann danke für den Tip, das mit dem ISP hat sich somit auch erledigt.

PS: nur wozu sind in dem Beispiel die Interrupts, die benötige ich ja eh 
nicht oder ?

von Marco L. (lehmi)


Lesenswert?

Die Interrupts brauchst du nicht (so weit ich mich erinnern kann), 
wichtiger Unterschied sind hier die delays zwischen XLAT und BLANK high 
/ low. Wenigstens ein asm("nop") sollte zwischen high / low Änderungen 
drin sein (aus eigener Erfahrung), auch wenn das Datenblatt beim Timing 
was anderes sagt. Entfernen kannst du das dann ja immernoch, wenn der 
Code auch ohne funktioniert.

Grüße

P.S: Zu ISP und SPI gibt es von Atmel auch ne AppNote, siehe: 
http://www.mikrocontroller.net/articles/AVR_In_System_Programmer#ISP-Pins_am_AVR_auch_f.C3.BCr_andere_Zwecke_nutzen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.