Hallo Leute,
ich habe vor mir an meinen Atmega32 zur LED Steuerung ein
Schieberegister dazuzubauen. Damit möchte ich dann LEDs schalten.
Nun bin ich mir aber noch unsicher wie genau das mit den Registern
funktioniert.
Stimmt es so wie ich es mir vorstelle:
1
PORTA|=(1<<PA0);
2
PORTA&=~(1<<PA0);
3
PORTA|=(1<<PA0);
4
PORTA&=~(1<<PA0);
5
PORTA|=(1<<PA0);
6
PORTA&=~(1<<PA0);
7
PORTA|=(1<<PA0);
8
PORTA&=~(1<<PA0);
Ich gebe auf dem MC folgende Befehle aus, welche den PA0 am PORTA woran
der SER des Register hängt acht mal abwechselnd 1 und 0 schalten. Reicht
das schon für das Schieberegister, dass dann im Schieberegister die
Ausgänge folgendermaßen aussehen:
QA: 0
QB: 1
QC: 0
QD: 1
QE: 0
QF: 1
QG: 0
QH: 1
Stimmt das so wie ich meine?
Hoffe ihr könnt mir helfen.
Lg Basti
Daran habe ich mich schon gerichtet.
Bloß dort weiß ich noch nicht wo genau ich die 0-1-0 Pulse senden muss.
Nach jedem Bit einmal ein 0-1-0 Puls an SCK und nach allem Bits ein RCK
0-1-0 Puls oder nach allem Bits beide 0-1-0 Pulse?
Ein Schieberegister hat einen Eingang Serial-In für die Daten,
die man durch-schieben will, und einen Takt-Eingang (oder CLK),
mit dessen Aktivierung man dem Schieberegister mitteilt, dass es
das Eingangssignal in seine erste Stufe übernimmt und alle Bits,
die schon drin sind, um ein Bit weiterschiebt.
Es gibt auch welche, die noch mehr können...
Wenn du das nicht weißt, kann sich keiner erklären, wie du selbst
auf die Idee gekommen bist, für deine Aufgabenstellung ein
Schieberegister zu benutzen.
Wenn du es nur irgendwo aufgeschnappt hast, lass dir einfach sagen:
Ein Schieberegister braucht einen Anschluss für Daten und einen für
den Takt - und wenn du die nicht sinnvoll bedienst, funktioniert es
einfach nicht, wie gewünscht.
Für Hilfestellungen solltest du schon mal den Typ deines
Schieberegisters mitteilen.
Basti schrieb:> Daran habe ich mich schon gerichtet.
Welchen Teil der Diagramme verstehst du nicht?
> Bloß dort weiß ich noch nicht wo genau ich die 0-1-0 Pulse senden muss.> Nach jedem Bit einmal ein 0-1-0 Puls an SCK und nach allem Bits ein RCK> 0-1-0 Puls
Genau so.
Ich dachte eigentlich, das wäre im Tutorial ziemlich eindeutig.
@Ralli: Ich werde eines aus der 74er Serie nehmen. Kommt ganz drauf an
welches bei Pollin verfügbar ist, da ich alles bei einem Shop bestellen
will.
Ah Ok danke! Ich habe mir das Tutorial nochmals durchgelesen und nun ist
es mir klar geworden:
Ein Datenbit
Darauf ein 0-1-0 Puls (SCK)
Wieder Datenbit
0-1-0 Puls (SCK)
...
...
Letztes Datenbit
0-1-0 Puls (SCK)
0-1-0 Puls (RCK)
Stimmt soweit oder?
Danke!
Basti schrieb:> @Ralli: Ich werde eines aus der 74er Serie nehmen.> Stimmt soweit oder?
Kommt aufs Schieberegister an. Solange du dich nicht auf einen Typ
geeinigt hast, kann man dazu nur wenig sagen. Im Prinzip ja, aber die
PUlse könnten auch umgekehrt (1 - 0 - 1) sein, bzw. kein Mensch sagt,
dass jedes Schieberegister einen RCK hat.
Aber für ein 595 stimmt das schon so.
AH ok Danke!
Habe nun bei Conrad ein Schieberegister mit der Bezeichnung "LOGIK-IC
M74HC595B1R STM" und der Bestellnummer "155762 - 62" gefunden. Dies
dürfte doch ein normales 74HC595 sein oder?
Basti schrieb:> AH ok Danke!>> Habe nun bei Conrad ein Schieberegister mit der Bezeichnung "LOGIK-IC> M74HC595B1R STM" und der Bestellnummer "155762 - 62" gefunden. Dies> dürfte doch ein normales 74HC595 sein oder?
Ja
Bedienung des HC595:
1. Daten (0 oder 1) an SER
2. SCK auf 1
3. SCK auf 0
4. Schon Acht Bits gesendet? Nein => Schritt 1.
5. RCK auf 1
6. RCK auf 0
Du musst zuerst das SIgnal für QH senden, dann QG, QF, ..., bis QA.
Nach Schritt 6. stehen die Daten an den Ausgängen zur Verfügung.
Basti schrieb:> Ja genau so dachte ich mir das.> Was ist wenn ich RCK 1-0 sende aber noch nicht acht Bits an SER gesendet> habe?
Wurst.
Die Schieberegisterkette hat ja auf jeden Fall einen Inhalt. Der wird
durchgeschaltet.
Bei einem Puls an RCK wird der momentane Inhalt der Schiebekette in die
Ausgängstreiber übernommen. Ob du die Schiebekette jetzt 1 mal geschoben
hast oder 5 mal oder 12 mal, interessiert das IC nicht.
> Würde das auch gehen?
Sicher. Wer will dich daran hindern?
Ah ok das wollte ich wissen.
Ich dachte, dass er vielleicht mitzählt oder ich weiß ja nicht ;)
Jetzt schon :)
Ich bedanke mich bei euch allem die mir geholfen haben.
Basti schrieb:> Ah ok das wollte ich wissen.> Ich dachte, dass er vielleicht mitzählt oder ich weiß ja nicht ;)
:-)
Auf dieser primitiven Ebene sind die IC noch kooperativ.
Du legst an einen Pin einen Pegel an und das IC schaltet intern
entsprechend der Pin-Beschreibung (sind ja nur ein paar Gatter intern).
Das rumärgern mit irgendwelchen Mechanismen kommt dann erst ein paar
logische Ebenen darüber, sobald µC ins Spiel kommen :-)
Ich werde die Impulse über einen µC senden ;)
Jetzt habe ich noch eine Frage:
Ich möchte an den Register dann LEDs mit 20mA anschließen.
Da aber das Register max. 70mA insgesamt aushält würden nur die
folgenden
Möglichkeiten bestehen:
-Low Current LEDs verwenden (fällt wegen, da ich helle LEDs brauche)
-20mA LED nur mit max. 10mA "füttern" (geht das?)
- oder irgendeinen Verstärker dazwischenschalten (Gibt es sowas?)
Basti schrieb:> -Low Current LEDs verwenden (fällt wegen, da ich helle LEDs brauche)
Auch Low-Current Leds sind hell. Sie brauchen nur weniger Strom
> -20mA LED nur mit max. 10mA "füttern" (geht das?)
Klar geht das.
> - oder irgendeinen Verstärker dazwischenschalten (Gibt es sowas?)
Auch das geht. Es gibt sogar eine Variante vom 595, die bereits mehr
Strom treiben kann (aber ich kann mir die Bezeichnung nicht merken :-)
oder aber Variante 4
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Acht_LEDs_mit_je_20mA_pro_Schieberegister
Okay das mit den LEDs schau ich nochmal.
Wenn ich nur 10mA "fütter" sind sie dann nur halb so hell oder wie wirkt
sich das aus?
Wenn ich eine Betriebsspannung von 5V habe und die LED 2,1V benötigt und
ich auf 10mA runterkommen will dann brauch ich einen Widerstand von 320
Ohm oder?
Basti schrieb:> Okay das mit den LEDs schau ich nochmal.> Wenn ich nur 10mA "fütter" sind sie dann nur halb so hell oder wie wirkt> sich das aus?
Kommt auf die LED an.
Der Abfall ist aber weniger als halb so hell. Eher: verminderte
Helligkeit aber immer noch hell.
Wir haben eine logarithmische Kennlinie im Auge, ähnlich wie bei
Geräuschen. Am Anfang nimmt die visuelle Helligkeit bei nur geringfügig
gesteiegerten mA an der LED enorm zu, aber dann wirds immer weniger.
> Wenn ich eine Betriebsspannung von 5V habe und die LED 2,1V benötigt und> ich auf 10mA runterkommen will dann brauch ich einen Widerstand von 320> Ohm oder?
( 5 - 2.1 ) / 0.010 = 2.9 / 0.01 = 290
330 Ohm ist ok. Die meisten LED leuchten damit noch anständig
Zwischen 20mA und 10mA ist in der Helligkeit wenig Unterschied, auch 5mA
sind ausreichend. Für 1-2mA brauchst du Low-Current-LEDs, die normalen
sind sonst zu dunkel.
Also 10mA bei 8 LEDs, da bleibst du noch weit unter der 70mA-Grenze des
ICs :)
Karl heinz Buchegger schrieb:> Auch das geht. Es gibt sogar eine Variante vom 595, die bereits mehr> Strom treiben kann (aber ich kann mir die Bezeichnung nicht merken :-)TPIC6B595.
Leider schlecht zu bekommen.
Es gibt auch noch TL5922. Dazu gibt es auch Artikel in der
Artikelsammlung. Leider auch relativ teuer.
> oder aber Variante 4> http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Acht_LEDs_mit_je_20mA_pro_Schieberegister
Diese Variante habe ich selber aufgebaut gerade. Die funktioniert sehr
gut. Die Schieberegister werden etwas mehr als Handwarm, wenn alle LEDs
angeschaltet sind.
Ich habe zwar keine 8 einzelnen LEDs dranangeschaltet, sondern 4 2-Pin
DUO LEDs, die ich damit umpolen kann.
Habe mal gemessen, Es sind ca. 2V an der LED. 4,3V direkt zwischen den
Ausgängen, wo LED und Vorwiderstand zwischen hängt. Also noch 2,3V an
180R Abfall. Macht 12mA.
Also 0,7V Drop an zwei internen Transistoren bei 12mA. Und das für ein
billiges 595-Schieberegister, was im schmalen SMD-Gehäuse nicht mal viel
Platz verbraucht
Ja schon. Ich werd mir jetz solche 20mA LEDs holen und die dann einfach
mit einem Widerstand betreiben, dass sie nur noch 10mA oder weniger
haben. Da ich die LEDs an 2 verschiedenen Stellen mit verschiedener
Leuchthelle haben will werde ich 2 verschiedene Widerstände kaufen. (100
Stück für 1,20 € sind ja nicht gerade viel. Die kann man ja immer mal
gebrauchen)
Habe mir nun für das Schieberegister Funktionen gebastelt:
1
voidSchiebe_kmh(void)
2
{
3
PORTA|=(1<<PA2);
4
PORTA&=~(1<<PA2);
5
}
6
voidSchiebe_ll(void)
7
{
8
PORTA|=(1<<PA6);
9
PORTA&=~(1<<PA6);
10
}
11
voidSchiebe_kmh_aus(void)
12
{
13
PORTA|=(1<<PA0);
14
PORTA&=~(1<<PA0);
15
}
16
voidSchiebe_ll_aus(void)
17
{
18
PORTA|=(1<<PA4);
19
PORTA&=~(1<<PA4);
20
}
An PA2 ist SCK von der ersten Schieberegisterreihe.
An PA6 -----"--------- zweiten ---------"---------.
An PA0 -"- RCK ---"--- ersten ----------"---------.
An PA4 -----"--------- zweiten ---------"---------.
Und SCL muss dauerhaft auf 1 liegen.
Könnte man das Schieberegister einfach ausschalten indem man SCL einfach
auf 0 liegt oder?
Basti schrieb:> Habe mir nun für das Schieberegister Funktionen gebastelt:
Tu dir selbst einen Gefallen und mach dir ein paar #define für die Port
und Pindefinitonen.
In 2 Wochen drehst du nämlich durch, wenns nicht funktioniert und du
ständig nachgrübeln musst: war PA2 jetzt Daten oder doch Clock, welcher
Clock wars denn etc ...
> Und SCL muss dauerhaft auf 1 liegen.> Könnte man das Schieberegister einfach ausschalten indem man SCL einfach> auf 0 liegt oder?
Mit SCL auf 0 löscht du die Schiebekette. D.h. sie wird auf lauter 0
Bits gesetzt. Das ist was anders als 'ausschalten'. Dazu wäre der G-Pin
gut.
(Manchmal frag ich mich, wozu das im Tutorial eigentlich ziemlich
ausführlich abgehandelt wird)