Hallo,
möchte heute ein Lauflicht-Programm mit zwei kaskadierten CMOS-ICs CD4094 am PortB eines ATTiny2313 vorstellen. So könnte ich mir auch prinzipiell eine Porterweiterung auf 16 Bit Breite denken im Sinne einer Seriell/Parallel-Umwandlung der Ausgabe über nur drei Portbits.
Der Baustein CD4094 bietet ein 8-Bit-Schieberegister mit Zwischenspeicher
und Tristate-Ausgängen.
Es können Low-current-Leuchtdioden bei 5 Volt Versorgungsspannung über
2,2 kOhm Widerstände von den Ausgängen direkt angesteuert werden.
Die Steuer-Logik des ICs CD4094 beinhaltet nun kurz folgendes:
Bei steigender Takt-Flanke (Clock) werden am Dateneingang (Data) anstehende Logikpegel in die Schieberegister-Flipflops eingelesen, um eine Stelle weitergeschoben und in den Zwischenspeichern (Latches) gespeichert.
Die Daten der Latches werden bei High-Pegel am Strobe-(Enable)-
Eingang auf die Ausgänge geschaltet.
Dabei ist für das Lauflicht-Programm unwichtig, ob zuerst Strobe oder Taktsignal (Clock)
programmiert wird, und ob Strobe "high" dauernd am Portausgang anliegt, oder dies Signal wie ein Impuls getoggelt wird, wie in diesem Programm gemacht.
Es können mehrere ICs kaskadiert werden, hier zwei Bausteine, so daß ein 16 Bit breites Wort seriell auf parallel gewandelt werden kann.
Nachteil des ICs:
Es besitzt keinen Reseteingang, so daß nach dem ersten Anlegen
der Betriebsspannung zufällige Werte an den Ausgängen erscheinen.
Strenggenommen müssten erst 16 Clockimpulse bei Strobe auf "low"
und Data auf "low" angelegt werden, dann Strobe auf "high" gesetzt
werden, um dann erst die LED-Ausgabe zu aktivieren (quasi zu resetten).
Habe ich mir geschenkt hier.
Zum Programm für den ATTiny2313:
Das Programm ergibt ein Lauflicht, bei dem nur eine Leuchtdiode
von Anfang zu Ende wandert (D0 bis D15).
Der Takt für das Schieberegister wird aus dem Timer1 im CTC-Modus mit
Timer-Interrupt generiert.
Von der Programm-Haupt-Endlosschleife ausgehend werden nun nacheinander mehrere Ausgabeschleifenunterprogramme aufgerufen, die jeweils das in der Interrupt-Service-Routine im gewünschten Vorteiler eingestellten Taktzyklus gesetzte Job-Flag-Register abfragen, und die ihrerseits wiederum die Unterprogramme für die Impulsgenerierung von Strobe und Clock aufrufen.
Wenn nur eine Leuchtdiode wandern soll, wird das scheinbar einfachste Beispiel für die Darstellung der Funktionsweise eines Schieberegisters hierbei nur durch das Programmieren von 16 Schleifenunterprogrammen ermöglicht, die in der Art einer Mehrfach-Verzweigung nacheinander vom Unterprogramm "endlos1" aufgerufen werden, um überdies damit zugleich auch die Schwierigkeit der begrenzten Sprungweite des RJMP-Befehls zu umgehen.
(Mit dem Rotate-Befehl (ROL) wäre dies sicher einfacher direkt über die Portausgänge der MCU und Leuchtdioden des STK500-EVA-Boardes zu bewerkstelligen, allerdings nur in 8-Bit-Breite. Wir möchten aber doch gerne ein 16-Bit-Lauflicht haben...)
Wird nicht so vorgegangen, bekommt man den Eindruck, als ob das eingerichtete Lauflichtmuster zu stehen scheint, also der ureigentliche Sinn und Zweck des Bausteins als Seriell/Parallel-Umwandler wird hier unmißverständlich deutlich.
Übrigens, die Bezeichnungen für die Ausgänge D0 bis D15 sind auf dieser Platine (IHK-Übungsstück) verkehrt herum angebracht.
Das Lauflicht läuft also von rechts nach links.
Man gewinnt auch - vor allem bei höheren Geschwindigkeiten - den Eindruck,
daß immer die zwei unmittelbar benachbarten Leuchtdioden leuchten.
Allerdings bemerkt man dabei auch, daß eine Übergabeverzögerung zwischen den beiden ICs nicht zu existieren scheint, so daß auch durchaus noch mehr ICs kaskadiert werden könnten.
Dies liegt in der Hauptsache an der Verarbeitungsgeschwindigkeit der Ausgänge der Schieberegister-Bausteine und nicht etwa an der Gruppenlaufzeit der Ausgabeschleifen, wie man sicher auch vermuten könnte.
Auch bringt die Entfernung der NOPs in den Impulsgenerierungs-Unterprogrammen für Clock und Strobe da keine Verbesserung, diese ominösen kürzesten Pausen in Form von No-operation-Anweisungen können sogar ganz entfallen, also SBI- und CBI-Befehle direkt hintereinander gesetzt werden, ohne daß dies bei der verwendeten Taktfrequenz noch einen Einfluß auf die Funktion des Schieberegister-ICs hätte. Jedenfalls im Testlauf bei 4-MHz-MCU Takt konnte ich in dieser Hinsicht keinen Unterschied feststellen.
Gruß von Oskar01
Bauteile:
2 x CD4094
R1, R2, R3 = 68 kOhm
R4 - R20 = 2,2 kOhm
C1 = 4,7 yF/35V Tantal
C2, C3 = 100 nF
D1 - D16 = low current LEDs
D17 = 1N4001 (Verpolschutz)
möchte heute ein Lauflicht-Programm mit zwei kaskadierten CMOS-ICs CD4094 am PortB eines ATTiny2313 vorstellen. So könnte ich mir auch prinzipiell eine Porterweiterung auf 16 Bit Breite denken im Sinne einer Seriell/Parallel-Umwandlung der Ausgabe über nur drei Portbits.
Der Baustein CD4094 bietet ein 8-Bit-Schieberegister mit Zwischenspeicher
und Tristate-Ausgängen.
Es können Low-current-Leuchtdioden bei 5 Volt Versorgungsspannung über
2,2 kOhm Widerstände von den Ausgängen direkt angesteuert werden.
Die Steuer-Logik des ICs CD4094 beinhaltet nun kurz folgendes:
Bei steigender Takt-Flanke (Clock) werden am Dateneingang (Data) anstehende Logikpegel in die Schieberegister-Flipflops eingelesen, um eine Stelle weitergeschoben und in den Zwischenspeichern (Latches) gespeichert.
Die Daten der Latches werden bei High-Pegel am Strobe-(Enable)-
Eingang auf die Ausgänge geschaltet.
Dabei ist für das Lauflicht-Programm unwichtig, ob zuerst Strobe oder Taktsignal (Clock)
programmiert wird, und ob Strobe "high" dauernd am Portausgang anliegt, oder dies Signal wie ein Impuls getoggelt wird, wie in diesem Programm gemacht.
Es können mehrere ICs kaskadiert werden, hier zwei Bausteine, so daß ein 16 Bit breites Wort seriell auf parallel gewandelt werden kann.
Nachteil des ICs:
Es besitzt keinen Reseteingang, so daß nach dem ersten Anlegen
der Betriebsspannung zufällige Werte an den Ausgängen erscheinen.
Strenggenommen müssten erst 16 Clockimpulse bei Strobe auf "low"
und Data auf "low" angelegt werden, dann Strobe auf "high" gesetzt
werden, um dann erst die LED-Ausgabe zu aktivieren (quasi zu resetten).
Habe ich mir geschenkt hier.
Zum Programm für den ATTiny2313:
Das Programm ergibt ein Lauflicht, bei dem nur eine Leuchtdiode
von Anfang zu Ende wandert (D0 bis D15).
Der Takt für das Schieberegister wird aus dem Timer1 im CTC-Modus mit
Timer-Interrupt generiert.
Von der Programm-Haupt-Endlosschleife ausgehend werden nun nacheinander mehrere Ausgabeschleifenunterprogramme aufgerufen, die jeweils das in der Interrupt-Service-Routine im gewünschten Vorteiler eingestellten Taktzyklus gesetzte Job-Flag-Register abfragen, und die ihrerseits wiederum die Unterprogramme für die Impulsgenerierung von Strobe und Clock aufrufen.
Wenn nur eine Leuchtdiode wandern soll, wird das scheinbar einfachste Beispiel für die Darstellung der Funktionsweise eines Schieberegisters hierbei nur durch das Programmieren von 16 Schleifenunterprogrammen ermöglicht, die in der Art einer Mehrfach-Verzweigung nacheinander vom Unterprogramm "endlos1" aufgerufen werden, um überdies damit zugleich auch die Schwierigkeit der begrenzten Sprungweite des RJMP-Befehls zu umgehen.
(Mit dem Rotate-Befehl (ROL) wäre dies sicher einfacher direkt über die Portausgänge der MCU und Leuchtdioden des STK500-EVA-Boardes zu bewerkstelligen, allerdings nur in 8-Bit-Breite. Wir möchten aber doch gerne ein 16-Bit-Lauflicht haben...)
Wird nicht so vorgegangen, bekommt man den Eindruck, als ob das eingerichtete Lauflichtmuster zu stehen scheint, also der ureigentliche Sinn und Zweck des Bausteins als Seriell/Parallel-Umwandler wird hier unmißverständlich deutlich.
Übrigens, die Bezeichnungen für die Ausgänge D0 bis D15 sind auf dieser Platine (IHK-Übungsstück) verkehrt herum angebracht.
Das Lauflicht läuft also von rechts nach links.
Man gewinnt auch - vor allem bei höheren Geschwindigkeiten - den Eindruck,
daß immer die zwei unmittelbar benachbarten Leuchtdioden leuchten.
Allerdings bemerkt man dabei auch, daß eine Übergabeverzögerung zwischen den beiden ICs nicht zu existieren scheint, so daß auch durchaus noch mehr ICs kaskadiert werden könnten.
Dies liegt in der Hauptsache an der Verarbeitungsgeschwindigkeit der Ausgänge der Schieberegister-Bausteine und nicht etwa an der Gruppenlaufzeit der Ausgabeschleifen, wie man sicher auch vermuten könnte.
Auch bringt die Entfernung der NOPs in den Impulsgenerierungs-Unterprogrammen für Clock und Strobe da keine Verbesserung, diese ominösen kürzesten Pausen in Form von No-operation-Anweisungen können sogar ganz entfallen, also SBI- und CBI-Befehle direkt hintereinander gesetzt werden, ohne daß dies bei der verwendeten Taktfrequenz noch einen Einfluß auf die Funktion des Schieberegister-ICs hätte. Jedenfalls im Testlauf bei 4-MHz-MCU Takt konnte ich in dieser Hinsicht keinen Unterschied feststellen.
Gruß von Oskar01
Bauteile:
2 x CD4094
R1, R2, R3 = 68 kOhm
R4 - R20 = 2,2 kOhm
C1 = 4,7 yF/35V Tantal
C2, C3 = 100 nF
D1 - D16 = low current LEDs
D17 = 1N4001 (Verpolschutz)