Hallo Leute,
bin blutiger Anfänger und habe hier ein Schieberegister TLC5916
rumliegen,dass ich gerne ansteuern möchte:
Datasheet: http://www.ti.com/lit/ds/symlink/tlc5916.pdf
Ich habe das Gefühl,dass ich etwas sehr grundlegendes nicht verstanden
habe und es deshalb nicht geht..
Kurze Beschreibung zur Beschaltung:
Die Pins:GND, R-Ext und OE(ED2) sind jeweils an GND verbunden.
Nun habe ich am Pin OUT0 eine LED angeschlossen.
Als nächstes habe ich die folgenden Pins des Schieberegisters einfach an
die Pins meines Atmega8 angeschlossen:
PB0 ->SDI
PB1 ->CLK
PB2 ->LE(ED1
Dann der Code:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/delay.h>
int main(void)
{
DDRB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2);
PORTB |= (1<<PB1) | (1<<PB2);
PORTB &= ~(1<<PB0);
_delay_ms(10);
PORTB |= (1<<PB0);
PORTB &= ~(1<<PB1);
_delay_ms(10);
PORTB |= (1<<PB1);
PORTB &= ~(1<<PB2);
_delay_ms(10);
PORTB |= (1<<PB2);
while(1)
{
}
}
Erwartung: LED sollte leuchten.
Was mache ich falsch?
> Ich habe das Gefühl,dass ich etwas sehr grundlegendes nicht verstanden> habe und es deshalb nicht geht..
Das glauben wir auch. Du weisst nicht was ein Schieberegister ist, du
kannst noch nicht C-Programmieren und du glaubst ein IC verwenden zu
koennen ohne dessen Datenblatt zu lesen (Rext).
Mit anderen Worten die Aufgabe ist du komplex fuer dich. Schliesse
erstmal eine LED, natuerlich mit Vorwiderstand, direkt an dem Port an
den du fuer SCK vorgesehen hast und lasse die achtmal blinken. Danach
reden wir mal weiter...
Olaf
Haha nein,ich kann schon einiges grundlegendes.. 7-Segmente Multiplexen
und so habe ich bereits hingekriegt.. ich wollt das nun eben mit
Schieberegistern versuchen..davor noch nie mit einem IC gearbeitet.
Nur bin ich total unsicher wie das gehen soll.. normalerweise würde ich
den 74HC595 verwenden,da es dafür gute Tutorials mit Beispielen
gibt,aber hab nun mal den gerade nicht zur Verfügung...
Die Frage ist eigentlich.. verstehe ich das Datenblatt nicht richtig
oder aber die Software nicht? Oder beides?
Bzw kann sich einer bitte kurz die Mühe machen (hoffe es ist nicht zu
viel verlangt) und mir zeigen wie es sein müsste,damit die LED an OUT0
leuchten muss?
Nur Code und evtl richtige Beschaltung der Pins wären sehr hilfreich..
dann könnte ich mir das auf jedenfall alles irgendwie klar machen.
@ Juergen (Gast)
>Nur bin ich total unsicher wie das gehen soll.. normalerweise würde ich>den 74HC595 verwenden,da es dafür gute Tutorials mit Beispielen>gibt,aber hab nun mal den gerade nicht zur Verfügung...
Beispiele sind wichitg. Aber man muss sie auch VERSTEHEN, nicht einfach
kopieren! Wenn du das Beispiel für den 74HC595 verstanden hast, ist der
TLC5916 ein Kinderspiel.
>Die Pins:GND, R-Ext und OE(ED2) sind jeweils an GND verbunden.
Solche Lyrik kannst du dir sparen. Poste einen VOLLSTÄNDIGEN Schaltplan
unter Beachtung der Bildformate. R-EXT auf GND ist keine gute Idee.
"R-EXT External Resistor - Connect an external resistor to ground to set
the current for all outputs"
>Nun habe ich am Pin OUT0 eine LED angeschlossen.
WIE? Siehst du, so geht das Problem weiter, siehe Netiquette.
>Als nächstes habe ich die folgenden Pins des Schieberegisters einfach an>die Pins meines Atmega8 angeschlossen:>PB0 ->SDI>PB1 ->CLK>PB2 ->LE(ED1
Schön.
>Erwartung: LED sollte leuchten.>Was mache ich falsch?
Datenblatt gelesen? Datenblatt ansatzweise verstanden?
Die Daten werden mit Bit0 beginnend reingeschoben, man muss aber 8 Bits
reinschieben, damit Bit 0 auch ankommt. Sonst belibt es auf der Position
von Bit7 hängen. Du erzeugst drei SCK Takte. Das haut hinten und vorn
nicht hin. Ausserdem bin ich nicht sicher, obe man OE einfach auf GND
klemmen kann oder ob man es takten muss, so wie im Datenblatt. Für die
ersten Test sollte man einfach mal alle acht LEDs anklemmen, irgendeine
wird schon leuchten. Das erleichtert die Fehlersuche.
@ Juergen (Gast)
>Muss ich das per SPI machen ?
Nein.
>Geht das auch nicht auch mit Software?
Ja, einfach so wie du es angefangen hast, aber mit der richtigen
logischen Abfolge.
SDI = HIGH
8 Takte an SCK erzeugen
LE = HIGH
Ok erstmal danke für die ganzen Antworten!
Aber was soll man dann sonst mit R-Ext machen? Auf dem Datenblatt gleich
auf der ersten Seite wurde es auch an GND verbunden mit einem Widerstand
davor in Reihe geschaltet.
@ Juergen (Gast)
>Aber was soll man dann sonst mit R-Ext machen?
Einen Widerstand anschließen? So wie im Datenblatt?
> Auf dem Datenblatt gleich>auf der ersten Seite wurde es auch an GND verbunden mit einem Widerstand>davor in Reihe geschaltet.
EBEN! Wenn du aber schreibst
"R-Ext und OE(ED2) sind jeweils an GND verbunden."
dann bedeutet dass, das eben KEIN Widerstand dazwischen ist und dur das
DIREKT verbunden hast! Großer Unterschied!
Ok alles klar. An R-Ext ist ein Widerstand dran.
Ich hab jetzt für OE ebenfalls ein Pin am Mikrokontroller vorgesehen.
(PB3)
Ich bin jetzt ganz stupide nach dem Timing Diagram vorgegangen auf Seite
5 im Datenblatt:
Aber es geht immernoch nicht,wobei diesmal an jedem OUT eine LED
angeschlossen ist:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/delay.h>
int main(void)
{
DDRB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3);
PORTB |= (1<<PB3); // OE
PORTB |= (1<<PB0); // SDI
clock(); // CLK
clock();
clock();
clock();
clock();
clock();
clock();
clock();
PORTB |= (1<<PB2); //LE
PORTB &= ~(1<<PB2);
PORTB &= ~(1<<PB3);
while(1)
{
}
}
void clock()
{
PORTB |=(1<<PB1);PORTB &= ~(1<<PB1);
}
@Juergen (Gast)
>Ok alles klar. An R-Ext ist ein Widerstand dran.
Gut.
>Ich bin jetzt ganz stupide nach dem Timing Diagram vorgegangen auf Seite>5 im Datenblatt:
Auch gut. Kleiner Tip. Mit defines macht man sich das Leben leicht und
den Quelltext kinderleich lesbar.
Ok habe ein kleines Hardware problem...
Irgendwie gehen alle LEDS von OUT0-OUT7 aus,wenn ich den GND Pin an GND
anstecke..also sind die LED's nur an,wenn ich mit dem GND-PIN gar nichts
mache..
Wenn ich R-Ext rausnehme passiert übrigens nichts.. Lampen leuchten mit
der selben stärke..
Wie lässt sich das erklären? Vor allem wie läuft das überhaupt ohne
GND-PIN?
Da kann doch etwas nicht stimmen..
Hab noch eine zusätzliche Frage zur oberen.
Ich hab einen zeiten Schieberegister hinzuaddiert (kaskadiert).
Jetzt muss ich doch einfach nur noch 16 mal CLOCK benutzen statt 8 mal..
da ja beim 9.CLOCK der letzte Wert vom 1. Schieberegister von SDO im SDI
vom 2. landet..
..leider funktioniert das irgendwie nicht.
@ Juergen (Gast)
>Ok habe ein kleines Hardware problem...
Hmmm.
>Wie lässt sich das erklären? Vor allem wie läuft das überhaupt ohne>GND-PIN?
NEIN! Schließe alles ordentlich an. Punkt! Die Geistereffekte sind nicht
das, was du haben willst.
>..leider funktioniert das irgendwie nicht.
Bring die Schaltung erstmal mit EINEM Schieberegister SOLIDE zum laufen.
Ok irgendwie hatte ich echt irgendein Geistereffekt.
Leider geht es nicht..obwohl ich mich genau an den Timing Diagram halte.
Hardwaremäßig hab ich alles 10 mal überprüft.Ich kann mir nur
vorstellen,dass ich eine bestimmte Taktfrequenz beachten muss...ist das
wirklich streng zu beachten,oder müsste es auch ohne einigermaßen
klappen?
Code:
Juergen schrieb:> Hardwaremäßig hab ich alles 10 mal überprüft.Ich kann mir nur> vorstellen,dass ich eine bestimmte Taktfrequenz beachten muss...
Wenn du mal ins Datenblatt schaust, dann steht da, dass die Frequenz auf
dem Clock-Signal bis zu 25MHz betragen darf. Das schafft dein mit
popeligen 1MHz getakteter µC garantiert nicht.
ABer Hinweis:
Man darf so langsam takten wie man will :-)
Mit ein paar LED+Vorwiderstand direkt an den TLC Pins, kann man bei
genügend langsamer Ansteuerung wunderbar verfolgen, was denn vom
Programm tatsächlich an den TLC Pins für Sequenzen ausgegeben werden,
bzw. was davon beim TLC ankommt. Und wenn dein Steckbrett sowieso nicht
das Allerbeste ist ....
PS:
Warum hast du eigentlich die Leitung über 2 Ports verstreut?
Wenn du die Ansteuerung sowieso in Software machst, ohne das Hardware
SPI Modul zu benutzen, dann kannst du die Pins benutzen, die dir genehem
sind. Zum Beispiel die Pins, die alle am selben Port liegen.
Gut, es muss natürlich auch so gehen, schon klar. Aber es ist eine
Fehlerquelle mehr, weil man jetzt bei jedem Pinwackler auch zusätzlich
auch noch überprüfen muss, ob er am richtigen Port stattfindet und nicht
nur am richtigen Pin.
Man kann sich als Programmierer auch selbst das Leben schwer machen,
indem man
* möglichst inkonsistent die Pins verteilt
* möglichst die Möglichkeiten von C ignoriert. Ist ja auch viel
einfacher, wenn es im Programm nur so von PORTB, PB6, etc. wimmelt,
die man alle einzeln überprüfen muss, anstatt dass man sich gleich mal
per #define ein paar Namen für die Dinge vergibt und dann im Programm
diese Namen verwendet, anstatt darauf zu vertrauen, dass die
Kommentare schon stimmen werden.