Morgen Männers =) Ich bin es wieder, diesmal mit einem Projekt von unserer Techniker Schule ich und zwei Mitschüler wollen ein Mensch ärger dich nicht Spiel mit RGB-LEDs nachbauen wo man über zwei Taster pro Spieler und einen gemeinsamen Würfeltaster das Spiel bedient bzw Spielt. Wir möchten die RGB-LED´s mit den 16 TLCs Ansteuern 8 für die Lauffelder und 8 für start und Zielfelder mit einer Testplatine hat auch der Einfache Versuchsaufbau auch super hin gehauen mit dem Code den ich in meinem anderen Thread gepostet hab, wurde der Versuchsaufbau dann Positive abgeschlossen anschließend haben wir alle Platinen geätzt, gebohrt und gelötet. Jetzt wo das Projekt Hardwaremäßig steht und wir wieder den Mikrocontroller angeschlossen haben versuchsweise nur die Lauffelder mit 8 TLC´s und ca 40 RGB LED´s wollen die Leds nicht mehr wirklich leuchten ich hab sie Stromtechnisch erstmal noch an das STK500 angeschlossen das sich als Dauerlösung auf keinen fall eignet ein TLC Leuchtet voll die anderen haben eine bis drei Leds am Leuchten jetzt wir der erste TLC schon recht warm die anderen bleiben Kalt. Meine Frage: könnte das wirklich nur an dem Netzteil liegen bzw warum Leuchtet der sechste TLC voll und die anderen eher schlecht als recht wenn ich ein andere Spannungsquelle nehm muss ich Logischer weise auch die TLC damit versorgen ? hier ist nochmal der C-Code: #include <avr/io.h> #include <avr/interrupt.h> /* * GccApplication16.c * * Created: 21.01.2013 18:38:31 * Author: Lethaface */ #define VPRG_DDR DDRB #define VPRG_PORT PORTB #define VPRG_PIN PB0 #define BLANK_DDR DDRB #define BLANK_PORT PORTB #define BLANK_PIN PB3 #define XLAT_DDR DDRB #define XLAT_PORT PORTB #define XLAT_PIN PB2 #define DCPRG_DDR DDRB #define DCPRG_PORT PORTB #define DCPRG_PIN PB4 #define S_IN_DDR DDRB #define S_IN_PORT PORTB #define S_IN_PIN PB5 #define S_OUT_DDR DDRB #define S_OUT_PORT PORTB #define S_OUT_PIN PB6 #define SCLK_DDR DDRB #define SCLK_PORT PORTB #define SCLK_PIN PB7 #define TLC5940_n 1 uint8_t gsDaten[24 * TLC5940_n] = { 0x00, 0x00, 0x00, // Channel 14+15 0x00, 0x00, 0x00, // Channel 12+13 0x00, 0x00, 0x00, // Channel 10+11 0xff, 0xff, 0xff, // Channel 8+9 0xff, 0xff, 0xff, // Channel 6+7 0xff, 0xff, 0xff, // Channel 4+5 0xff, 0xff, 0xff, // Channel 2+3 0xff, 0xff, 0xff, // Channel 0+1 }; void Init_RGB(void) { // Ports als Ausgänge versehen DDRB = (1<<SCLK_PIN)|(1<<S_OUT_PIN)|(1<<S_IN_PIN)|(1<<VPRG_PIN)|(1<<BLANK_PIN)| (1<<XLAT_PIN)|(1<<DCPRG_PIN); DDRD = 0xff; S_OUT_PORT |= (1<<S_OUT_PIN); SCLK_PORT &= ~(1 << SCLK_PIN); DCPRG_PORT &= ~(1 << DCPRG_PIN); VPRG_PORT |= (1 << VPRG_PIN); XLAT_PORT &= ~(1 << XLAT_PIN); BLANK_PORT |= (1 << BLANK_PIN); // Aktivieren der SPI Schnittstelle, Masterports, einstellen der Daten transfers und das Interrupt SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPIE); // Einstellen des fck faktors (fck/2) und aktivieren des Interrupt SPSR=(1<<SPI2X);//|(1<<SPIF); //Einstellen der Taktrate des Zählers: 8Mhz und Timerart CTC (Clear Timer on Compare Match Timer 1) TCCR1A=(1<<COM1A0); TCCR1B=(1<<CS11)|(1<<WGM12); //4096 in das vergleichsregister schreiben zum herstellen desGLSCLK Taktimpulse hergestellt OCR1AH=0x10; OCR1AL=0x00; TIMSK |= (1 << OCIE1A); } ISR (TIMER1_COMPA_vect) { static uint8_t xlatPulse = 0; uint8_t i = 0; BLANK_PORT |= (1 << BLANK_PIN); if (VPRG_PORT & (1 << VPRG_PIN)) { VPRG_PORT &= ~(1 << VPRG_PIN); if (xlatPulse) { XLAT_PORT |= (1 << XLAT_PIN); XLAT_PORT &= ~(1 << XLAT_PIN); xlatPulse = 0; } SCLK_PORT |= (1 << SCLK_PIN); SCLK_PORT &= ~(1 << SCLK_PIN); } else if (xlatPulse) { XLAT_PORT |= (1 << XLAT_PIN); XLAT_PORT &= ~(1 << XLAT_PIN); xlatPulse = 0; } BLANK_PORT &= ~(1 << BLANK_PIN); // Nach den 4096 GSCLKŽs können jetzt die daten geschickt werden for (i = 0; i < TLC5940_n*24; i++) { SPDR = gsDaten[i]; while (!(SPSR & (1 << SPIF))); } xlatPulse = 1; } int main(void) { sei(); Init_RGB(); while(1) { } return 0; } Das Gehäuse die Programmstruktur(als Textausgabe) und die "Hardware" stehen schon nur will das der Verbund zwischen uController mit den Treibern noch nicht richtig hinhauen(nur Einzelnd). Ich bedanke mich schonmal für die Mühe.
@ Patrick S. (patrick22285) >Ich bin es wieder, diesmal mit einem Projekt von unserer Techniker >Schule Wenn du noch in der Schule bist, solltest du mal etwas über Netiquette lernen. Lange Quelltexte gehören in den Anhang. >ich und zwei Mitschüler wollen ein Mensch ärger dich nicht Spiel >mit RGB-LEDs nachbauen wo man über zwei Taster pro Spieler und einen >gemeinsamen Würfeltaster das Spiel bedient bzw Spielt. Wir möchten die >RGB-LED´s RGB-LEDs >8 TLC´s und ca 40 RGB LED´s wollen die Leds nicht mehr wirklich leuchten >ich hab sie Stromtechnisch erstmal noch an das STK500 angeschlossen das >sich als Dauerlösung auf keinen fall eignet ein TLC Leuchtet voll die >anderen haben eine bis drei Leds am Leuchten jetzt wir der erste TLC >schon recht warm die anderen bleiben Kalt. >könnte das wirklich nur an dem Netzteil liegen Eher nicht. >bzw warum Leuchtet der sechste TLC voll >und die anderen eher schlecht als recht Wahrscheinlich weil bei 16 TLC5940 bei der Verteilung der SPI-Signale mal wieder was daneben gegangen ist. So wie immer. Man braucht eine solde Signalführung, vor allem auch gescheite Masse, siehe Wellenwiderstand. Wenn die Kabel recht lang sind, muss man auch terminieren. >wenn ich ein andere Spannungsquelle nehm muss ich Logischer weise auch >die TLC damit versorgen ? Technikerschule? Ohje! Sowas konnte früher (tm) ein Schüler der 7. Klasse im ESP-Unterricht beantworten! Jaja, früher war doch alles besser. >hier ist nochmal der C-Code: Das nächste Mal bitte als Anhang. Welcher Controller?
Dank dir für deine Antwort Falk Brunner schrieb: > Welcher Controller? Den Atmega32 16 PU Falk Brunner schrieb: >Technikerschule? Ohje! Sowas konnte früher (tm) ein Schüler der 7. >Klasse im ESP-Unterricht beantworten! Jaja, früher war doch alles >besser. Da wurde bestimmt auch nicht soviel wert aufs Präsentieren gelegt wie in der heutigen zeit. Endschuldige bitte das ich den Quelltext einfach so gepostet hab das nächste mal kommt er wieder in den Anhang Falk Brunner schrieb: >Wahrscheinlich weil bei 16 TLC5940 bei der Verteilung der SPI-Signale >mal wieder was daneben gegangen ist. So wie immer. >Man braucht eine solde Signalführung, vor allem auch gescheite Masse, >siehe Wellenwiderstand. Wenn die Kabel recht lang sind, muss man >auch terminieren. Sowas lernt man zum Beispiel nicht auf der Technikerschule mit Schwerpunkt Automatisieren und sonstige Hilfen/ Richtungsanweisungen bekommt man eben nicht da muss es im Selbststudium erfolgen. Wir haben auf jedenfall eine Länge der Leiterbahnen die länger ist als 17,5 cm sind.
@ Patrick S. (patrick22285) >Den Atmega32 16 PU >DCPRG_PORT &= ~(1 << DCPRG_PIN); Erstes Problem mit der SPI. Das SS-Pin MUSS als Ausgang konfiguriert werden. Siehe Datenblatt. http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Ansteuerung_per_SPI-Modul >Da wurde bestimmt auch nicht soviel wert aufs Präsentieren gelegt wie in >der heutigen zeit. Was willst du präsentieren, wenn du kein Wissen hast? Oder bist du auf der BWLer Schauspielschule? >Wir haben auf jedenfall eine Länge der Leiterbahnen die länger ist als >17,5 cm sind. Tja, dann verlegt sie gut. Verdrillte Leitung für Takt/GND, es reicht verdrillter Klingeldraht, muss nicht CAT7 Netzwerkkabel sein. Linienförmige Signalführung, nicht sternförmig, möglichst keine Stichleitungen. Am Ende eine AC-Terminierung.
Falk Brunner schrieb: > Tja, dann verlegt sie gut. Verdrillte Leitung für Takt/GND, es reicht > verdrillter Klingeldraht, muss nicht CAT7 Netzwerkkabel sein. > Linienförmige Signalführung, nicht sternförmig, möglichst keine > Stichleitungen. Am Ende eine AC-Terminierung. ohne stichleitungen ist es ja kaum möglich meine kürzeste ist 5 mm und meine längste 15mm die Takt Dräthe sin mit dem GND Verdrillt ich hab jetzt aber auch schon Ergebnisse an einer seperaten Platine ich setzte alle bits auf 1 im GSData Array und hab an den ersten drei Channels(0-2) nur Channel 1 durchgeschaltet (Grün) Channel 3 Leuchtet nur mit Halber Intensität (Rot) Channel 4 bis 7 sind Aus Channel 8 Leuchtet mit gefühlten 75% Intens.(Blau) Channel 9 und 11 Leuchten (Lila) Channel 10 ist aus und der Rest 12 bis 15 ist nicht angeschlossen wenn ich das Array Verändere ändert sich auch die Durchschaltung der LEDs also einzelne kann ich Aus- bzw Einschalten. ich hab 1mm Breite Leiterbahnen mit einer Aura von 0,6mm da ich sichergehen wollte das der erste Ätzversuch auch klappt anbei ist jetzt noch der neue Code wo ich einmal den SS als Ausgang geschaltet hab den SPI CLK auf 500Khz da mir ein Niedriger wert zu sehr Flackerte Die AC Terminierung hab ich bis jetzt noch nicht durchgeführt kommt aber in kürze
@Patrick S. (patrick22285) >ohne stichleitungen ist es ja kaum möglich meine kürzeste ist 5 mm und >meine längste 15mm Das ist OK, ich würde mal sagen bis 50mm geht das schon noch. > die Takt Dräthe sin mit dem GND Verdrillt ich hab >jetzt aber auch schon Ergebnisse an einer seperaten Platine >wenn ich das Array Verändere ändert sich auch die Durchschaltung der >LEDs >also einzelne kann ich Aus- bzw Einschalten. >ich hab 1mm Breite Leiterbahnen Autobahn. 0,3mm reicht locker. >mit einer Aura von 0,6mm da ich >sichergehen wollte das der erste Ätzversuch auch klappt anbei ist jetzt >noch der neue Code wo ich einmal den SS als Ausgang geschaltet hab den >SPI CLK auf 500Khz da mir ein Niedriger wert zu sehr Flackerte Dann machst du was falsch. Das schieben der Daten lässt die Anzeige nicht flackern. Denn die Daten aus dem Schieberegister werden mit einem Schlag ins das Speicherregister übernommen. Naja, ein Oszilloskop ist hier schon recht nützlich. Zu deinem Code. Man macht ERST die Initialisierung, sei() kommt zum Schluß, kurz vor der endlosen Hauptschleife. OCR1A kann man direkt mit 16 Bit beschreiben, das klärt der Compiler für dich. Dein Programm ist merkwürdig. Denn 1. kann man SCK nicht per CPU steuern, wenn das SPI-Modul aktiv ist. Muss man auch nicht. 2. fehlt in deiner ISR ein Zähler, damit erst nach eben4096 GS-Takten neue Daten in die TLCs geschoben werden. 3. Der BLNAK Pulse für den Reset des GS PWM Zählers muss nicht so lange sein, der kann deutlich kürzer sein. 4. Der LATCH Pulse kann direkt nach dem Rausschieben des letzten Bytes erfolgen. Etc. Viel zu tun.
- kurzer zwischen Status - Nach reichem Studium der Datenblätter.. versteh ich das so: Das der TLC5940 der einen Takt von 30Mhz (GSCLK 4096 a 16ns H/L) benötigt das wiederum eine Frequenz von 30-31 Mhz ist und somit mein Atmega32 16PU (16Mhz) der nur einen Takt von 8 Mhz erzeugen kann. Wie dieser Ic jetzt mit niedrigeren Taktraten auskommen würde wissen wir ja nicht. ergo Wir benötigen entweder einen Quarz oder einen Mikroprozessor der die Taktrate erzeugt. im Demystifying the TLC5940 wird ein Atmega 328 verwendet der einen ClkOut besitz und somit dann einen direkten Cpu Clock an CLKO von 20 Mhz an den Treiber schickt ich denke das könnte so eventuell "Praktisch" noch hinhauen bei niedrigeren Frequenzen erscheint es mir schon fast unmöglich. Hab ich das jetzt alles so richtig aufgefasst oder bin total auf dem Holzweg?
Patrick S. schrieb: > Wie dieser Ic jetzt mit niedrigeren Taktraten auskommen würde wissen wir > ja nicht. ? Patrick S. schrieb: > Nach reichem Studium der Datenblätter.. ...bereits nach flüchgem Lesen sollte sich folgender (etwas vereinfachter, die BLANK-Dauer vernachlässigend) Zusammenhang erschließen: GSCLK == 4096 * PWM-Frequenz bzw. PWM-Frequenz == GSCLK / 4096 Bei 8MHz GSCLK werden die LEDs bspw. mit 1953 Hz "flackern".
@ Patrick S. (patrick22285) >Das der TLC5940 der einen Takt von 30Mhz (GSCLK 4096 a 16ns H/L) >benötigt Falsch! Er KANN bis zu 30 MHz getaktet werden, MUSS aber nicht. >Wie dieser Ic jetzt mit niedrigeren Taktraten auskommen würde wissen wir >ja nicht. WIR schon, DU nicht. >Wir benötigen entweder einen Quarz oder einen Mikroprozessor der die >Taktrate erzeugt. Nö. >Hab ich das jetzt alles so richtig aufgefasst oder bin total auf dem >Holzweg? You are heavy on the woodway.
so jetzt hab ichs mal mit dem Oszilloskop Gemessen ich hab zweit Timer im Compare Match- und CTC modus auf CPU Takt beide geben bei überlauf ein Toggle weswegen der GSCLK Takt nur 4,16 Mhz erzeugt der andere das Blank Signal mit einer Taktung von 1086.95 Hz ich Timer 1 der das Blank Signal erzeugt Braucht für eine Periode 0,00092 S Timer 0 der das GSCLK Signal erzeugt braucht für 4096 Perioden 0,00098 S über ein Interrupt am Timer 1 hab ich über High Low setzten ein Versuchten Impuls zu erzeugen allerdings mein ich das das nicht so "einfach" klappt. der Quellcode ist im Anhang das Bild was der Chip Produziert ist das gleiche wie einst oben das Patrick S. schrieb: > ich setzte alle bits auf 1 im GSData Array und hab an den ersten > drei Channels(0-2) nur Channel 1 durchgeschaltet (Grün) > > Channel 3 Leuchtet nur mit Halber Intensität (Rot) > Channel 4 bis 7 sind Aus > Channel 8 Leuchtet mit gefühlten 75% Intens.(Blau) > Channel 9 und 11 Leuchten (Lila) > Channel 10 ist aus und der Rest 12 bis 15 ist nicht angeschlossen ich hoffe der Ansatz ist jetzt besser
@ Patrick S. (patrick22285)
>ich hoffe der Ansatz ist jetzt besser
Er ist die blanke Katatrophe. Immer in der Endlosschleife Daten
rauschieben und unkoordiniert in der IST einen XLAT Puls erzeugen ist an
Unbrauchbarkeit kaum zu überbieten.
Falk Brunner schrieb: > @ Patrick S. (patrick22285) > >>ich hoffe der Ansatz ist jetzt besser > > Er ist die blanke Katatrophe. Immer in der Endlosschleife Daten > rauschieben und unkoordiniert in der IST einen XLAT Puls erzeugen ist an > Unbrauchbarkeit kaum zu überbieten. eigentlich meinte ich die Timer... Falk Brunner schrieb: > Dein Programm ist merkwürdig. Denn 1. kann man SCK nicht per CPU > steuern, wenn das SPI-Modul aktiv ist. Muss man auch nicht. Auf Seite 135 des langen Datenblattes wirst du eines besseren belehrt ;) aber Dein Schreibstil @Falk Brunner ist echt Image schädigend für das Forum den man postet hier keine Threads um blöde Antworten zu bekommen. Wenn dir hier meine Fragen auf den Keks gehen bist du nicht gezwungen zu Antworten. Ich dachte nur, das Ich hier in einem Forum bin wo man gerne über seine Interessen schreibt und dem Anderen vielleicht hilft falls dieser ein Problem hat.
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.