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
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 ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.