Bascom und "Boolean" Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
|
|
|
BID = 748942
Kleinspannung Urgestein
Beiträge: 13359 Wohnort: Tal der Ahnungslosen
|
|
Hallo liebe Kollegen!
Bin grad dabei,meine ersten Versuche mit µC und nem Schiebregister (74HC164) zu machen.
Und da ich ja blöd bin,mußt ich mir als Gehhilfe erst mal ein Codeschnippsel im Internet mopsen.
http://www.dieelektronikerseite.de/.....n.htm
(ganz unten)
Funktioniert auch erst mal,nur:
Da gibts ne Zeile "Dim outbit as Boolean"
Und damit kann ich nichts anfangen,auch meine schlauen Bascombücher und Unterlagen schweigen sich darüber aus.
Ich hab zwar in meinem früheren Leben schon mal was von boolscher Algebra gehört,aber auch nie begriffen worum es da geht bzw. was das bedeutet.
Nun hätte ich gernmal gewußt,was Dim as Boolean für einen Variablentyp erzeugt,bzw. was der µC oder das Programm damit anstellt und ob und wie man sich das zunutze machen kann.
Danke!
_________________
Manche Männer bemühen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitätstheorie.
(Albert Einstein) |
|
BID = 748946
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
|
Bool'sche Variable können nur die Werte TRUE oder FALSE annehmen. |
|
BID = 748975
Bartholomew Inventar
Beiträge: 4681
|
Hoi Kleinspannung,
Kenne mich zwar nur mit PICs aus, aber bei AVRs wird es ähnlich sein:
So ein RAM-Register ist ja 8 Bit, also 1 Byte groß. Normalerweise nutzt man immer alle 8 Bit, das ganze Byte. Das Register wird dann via "Dim Reg As Byte" deklariert.
Jetzt kann es aber vorkommen, dass man gerne eine Variable hätte, die nur die beiden Zustände "an" und "aus" kennt, also 1 und 0 (somit genau ein Bit breit). Das schimpft sich dann eine Boolsche Variable.
In einem RAM-Register würden 8 solcher boolschen Variablen Platz finden. Wahrscheinlich sorgt der Compiler automatisch dafür, dass immer bis zu acht boolsche Variablen sich ein RAM-Register teilen, um so RAM-Speicherzellen zu sparen. Ansonsten bräuchte man ja 8 Speicherzellen, wäre ja Verschwendung.
Damit der Compiler weiß, dass die gewünschte Variable bloß ein Bit lang ist, muss man ihm das auch sagen (denn der ist ja noch doofer als Du und merkt das nicht von allein ). Das macht man halt mit "Dim Reg As Boolean".
Gruß, Bartho
|
BID = 748977
Bartholomew Inventar
Beiträge: 4681
|
Habe mir das Codebeispiel nochmal genauer angeguckt.
Also:
In "Reg" wird das eigentliche Bitmuster, das man mal an den vier Ausgängen des Schieberegisters haben will, abgespeichert. Dabei braucht man nur das untere Nibble, das obere Nibble ist egal (ein Nibble ist ein halbes Byte, also vier Bit groß).
Also muss man in "Reg" sowas reinschrieben wie b'xxxx1101' (x=egal). Das sehe ich im Programmcode nirgends.
"Save" ist eine Arbeitskopie von "Reg" und wird verändert, während damit gearbeitet wird. Damit man sich nicht das Original kaputtverändert, macht man halt vorher eine Kopie.
"Outbit" stellt den Wert bereit, der am Dateneingang des Schieberegisters anliegen soll.
"Cnt" ist klar.
Wie bekommt man nun die vier unteren Bits von "Reg" in das Schieberegister reingeschoben?
Zuallererst wird das Register zurückgesetzt.
Dann muss man das niedrigste Bit (1) an den Schieberegisterdateneingang legen und ein Taktsignal ans Schieberegister schicken, damit es den Wert auch einliest.
Danach folgt das zweite Bit (1), dann das dritte (0), und dann das vierte (1).
Nachdem diese vier Bits nun alle an Ort und stelle liegen, wird 300ms gewartet. Danach wird das Schieberegister wieder zurückgesetzt und mit dem aktuellen Wert von "Reg" wieder beschrieben.
Zur Ausführung:
Save = Reg : Portd.0 = 0 : Portd.0 = 1
Macht eine Arbeitskopie von Reg in Save und setzt das Schieberegister zurück.
Outbit = Save And 1 : Portd.2 = Outbit
Das niedrigste Bit von "Save" wird nach Outbit kopiert.
Das "And 1" ist wichtig! Dadurch weiß der Compiler, dass er Bit Nr. 0 nach Outbit speichern soll und nicht etwa Bit Nr. 2,3 oder 7.
Funktioniert mit Boolscher Algebra: xxxx110 1 AND 000000 1 (=AND 1) ergibt 0000000 1, also 1.
Das Outbit wird dann schließlich auf Portd.2 geschrieben.
Portd.1 = 1 : Portd.1 = 0
Erzeugt ein kurzes Taktsignal und sagt dem Schieberegister somit, dass es den Dateneingang einlesen soll.
Shift Save , Right
Lässt Save nach rechts rotieren. Macht also aus xxxx1101 uxxxx110 (u=keine Ahnung, was Bascom da reinfüttert).
Danach kommt wieder:
Outbit = Save And 1 : Portd.2 = Outbit
Outbit ist jetzt uxxxx11 0 AND 0000000 1 = 0000000 0, also 0.
Ab hier geht's weiter wie oben.
Schließlich liegt am Schieberegister das Muster "1011" an. Ist verdreht im vergleich zu Reg (1101). Klar, wir haben ja auch von der falschen Seite angefangen, die Bits in das Schieberegister zu füttern. Schreibt ja auch der Autor von dieeelektronikseite.de.
Alle Klarheiten beseitigt?
Gruß, Bartho
|
BID = 748991
Kleinspannung Urgestein
Beiträge: 13359 Wohnort: Tal der Ahnungslosen
|
Danke Bartho,hast dir ja richtig die Finger wund getippt um Licht ins dunkel des Hirns eines alten Mannes zu bringen.
Zitat :
Bartholomew hat am 17 Feb 2011 16:55 geschrieben :
|
Alle Klarheiten beseitigt?
|
Wenn ich es noch 10x lese,vielleicht.
Ich tu mir mit den ganzen logischen Operationen/Operanten und der Bitschieberei immer unheimlich schwer.
(üb und mach das auch zu wenig)
Paar LED an und ausknipsen,Pwm,ADC und paar Temperaturwerte auf LCD darstellen ist ja noch relativ einfach,aber mit sowas stoß ich immer schnell an meine Grenzen.
Was ich zur Zeit eigentlich versuche zu schaffen ist,das die in einer variablen X abgelegte Zahl so in ein Schieberegister geschiebt wird,das die an den Ausgängen angeschlossene 7-Segmentanzeige auch selbige Zahl anzeigt,und nicht wie jetzt wirren "Strichcode"
_________________
Manche Männer bemühen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitätstheorie.
(Albert Einstein)
|
BID = 749001
Bartholomew Inventar
Beiträge: 4681
|
Da nich' für
Zitat :
| Was ich zur Zeit eigentlich versuche zu schaffen ist,das die in einer variablen X abgelegte Zahl so in ein Schieberegister geschiebt wird,das die an den Ausgängen angeschlossene 7-Segmentanzeige auch selbige Zahl anzeigt,und nicht wie jetzt wirren "Strichcode" |
Klingt sinnvoll.
Wie so eine Zahl binär gespeichert wird, ist Dir bekannt?
b'X' stellen Binäre Zahlen da, d'X' dezimale Zahlen (also "normale" Zahlen für Affen mit zehn Fingern).
Das Hexadezimale System h'X' ist dann für Affen mit 16 Fingern... oder so.
b'0000' ist d'0' ist h'0',
b'0001' ist d'1' ist h'0',
b'0010' ist d'2' ist h'0',
b'0011' ist d'3' ist h'0',
b'0100' ist d'4' ist h'0',
b'0101' ist d'5' ist h'0',
b'0110' ist d'6' ist h'0',
b'0111' ist d'7' ist h'0',
b'1000' ist d'8' ist h'0',
b'1001' ist d'9' ist h'0',
b'1010' ist d'10' ist h'A',
b'1011' ist d'11' ist h'B',
b'1100' ist d'12' ist h'C',
b'1101' ist d'13' ist h'D',
b'1110' ist d'14' ist h'E',
b'1111' ist d'15' ist h'F'.
Das Bitmuster zur Speicherung einer dezimalen Zahl hat nun leider recht wenig mit dem Bitmuster zu tun, das man an den Port anlegen muss, der eine 7-Segment-Anzeige treibt. Du musst also eine Zuordnungstabelle schreiben.
Bei sprut findet sich schon eine:
http://www.sprut.de/electronic/pic/programm/led.htm
; 7-Segment-Tabelle
Segmente
addwf PCL, f
retlw B'00011000' ; 0
retlw B'11011110' ; 1
retlw B'00110010' ; 2
retlw B'01010010' ; 3
retlw B'11010100' ; 4
retlw B'01010001' ; 5
retlw B'00010001' ; 6
retlw B'11011010' ; 7
retlw B'00010000' ; 8
retlw B'01010000' ; 9
Kann allerdings gut sein, dass Du bei Dir jeweils 1 und 0 vertauschen musst, sonst leuchten die Segmente, die eigentlich dunkel sein sollten, und umgekehrt. Also statt b'01010000' für 9 b'10101111' machen usw.
Außerdem musst Du evtl. das Bitmuster umdrehen, also aus b'10101111' b'11110101' machen.
Gruß, Bartho
P.S.: Zum AND-Operator:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
00 AND 00 = 00
00 AND 01 = 00
01 AND 00 = 00
01 AND 01 = 01
00 AND 10 = 00
00 AND 11 = 00
01 AND 10 = 00
01 AND 11 = 01
10 AND 00 = 00
10 AND 01 = 00
11 AND 00 = 00
11 AND 01 = 01
10 AND 10 = 10
10 AND 11 = 10
11 AND 10 = 10
11 AND 11 = 11
Also immer die zueinander gehörigen Stellen miteinander verknüpfen, gemäß der Regel in Fett.
|
BID = 749006
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Hallo Kleinspannung,
Das geht auch nur dann synchron, wenn man ein Schieberegister mit nachgeschaltetem Latch verwendet. Der CD4094 kann das.
Funktion:
Es gibt ein Schieberegister (SREG) und ein nachgeschaltetes Latch-Register (LREG).
Das Programm setzt einen Eingang am CD4094 so, dass das LREG die gespeicherten Daten auf die Ausgänge schaltet, egal, was am SREG passiert.
Nun können im „Hintergrund” Daten ins SREG geschrieben werden und nach acht Bits kann man einmal kurz das LREG dazu veranlassen, die Werte, die am SREG anliegen, abzuspeichern und auszugeben.
So ist es also möglich, mittels Schieberegister und Latchregister Daten synchron auszugeben.
Würde man nur ein Schieberegister benutzen, würde man die „Bits laufen sehen“; dein Strichkode also .
Das, was man dazu vor allem braucht sind sogenannte Bitmaskierungen, Bartho hat ja schon vieles dazu geschrieben.
Dir sind die drei logischen Grundfunktionen UND, ODER, NICHT je bekannt.
Registerweise angewendet werden dabei immer Bits gleicher Wertigkeit verknüpft.
Beispiel ODER:
Register 1:
00001101
Register 2 (wir nennen diesen Wert Bismaske)
10010011
Nun wird die Operation ausgeführt:
00001101
ODER 10010011
= 10011111
Also, überall dort, wo mindestens eines der Bits 1 ist, landet auch im Ergebnis eine 1 an der selben Stelle.
Beispiel UND (gleiche Werte)
00001101
UND 10010011
= 00000001
Wenn ich also in einem Register nur ein ganz bestimmtes Bit auf 1 stehen lassen will, dann verknüpfe ich das Register UND mit einer Maske, wo an der gewünschten Stelle eine 1 steht, der Rest ist 0 und 0 UND x ist immer 0 (x=beliebig).
Mit diesen Maskierungen kann man also nette Sachen machen, vor allem, wenn man noch XOR zur Verfügung hat.
Mit XOR kann ich erreichen, dass nur bestimmte Bits invertiert werden. Dazu werden die zu invertierenden Stellen in der Maske auf 1 gesetzt, der Rest bleibt 0.
Um bestimmte Bits definitiv auf 0 zu setzen, verUNDet man das gewünschte Register mit dem Einerkomplement einer Maske, in der die zu löschenden Bits 1 sind. Als Beispiel:
zu löschende Bits: 00011100
Komplement (bitweises Invertieren): 11100011
11111101
UND 11100011
= 00000001
Du siehst, damit sind ganz nette Dinge möglich .
_________________
|
BID = 749010
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Achja, zu den Siebensegmenten:
Zunächst kannst du die sieben Segmente wild an die Schieberegisterausgänge anschließen, wie es das Layout am Einfachsten gestattet.
Danach nimmst du Stift und Papier und zeichnest dir ein Siebensegment mit den Buchsten a-g auf (oberes Segment ist 'a', danach folgenden die Segmentnamen in Uhrzeigerrichtung).
Zunächst gibst du ein Byte aus, in der nur das niederwertigste Bit gesetzt ist, als Dezimalzahl also
1.
Irgendein Segment leuchtet auf, wenn nicht, dann ist das gerade der Ausgang, der von insgesamt acht unbelegt ist.
Danach gibst du eine 2 aus, binär 00000010.
Notiere, welches Segment (Buchstabe) bei 2 leuchtet.
Dann 4, 8, 16, 32, 64 und 128 ausgeben und jeweils den Segmenten zuordnen.
Um ein bestimmtes Muster leuchten zu lassen, werden die Zahlen der jeweiligen Segmente einfach addiert, angenommen, Segment a ist 1, b ist 8 und c ist 128.
Dann musst du die Zahl 1+8+128=137 ausgeben, um die Ziffer '1' darzustellen.
137 ist binär 10001001 und repräsentiert genau die leuchtenden Segmente.
Um nun "richtige" Zahlen auf das Segment ausgeben zu können, nutzt du eine Tabelle, oder wie man in Hochsprachen auch sagt, ein Array (Vektor):
Dim Segmente as Byte(10)
Byte(0) = SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F
Byte(1) = SEG_A + SEG_B + SEG_C
Byte(2) = SEG_A + ....
...
Byte(9) = SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G
Der Index dieser Tabelle ist gerade die Ziffer, die auf dem Display dargestellt wird.
Soll eine 5 dargestellt werden, kannst du schreiben:
gebeaus(Segmente(5))
Edit:
AVRs implementieren diese bitweisen Operatoren auf Registerebene alle in Hardware, sie sind also sehr schnell (typ. ein Taktzyklus).
Auch Schiebeoperationen können in Hardware und in einem Takt erledigt werden.
Das Beispiel oben in BASIC ist übrigens ein gutes Beispiel für schlechten Programmierstil.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 17 Feb 2011 18:50 ]
|
BID = 749104
Kleinspannung Urgestein
Beiträge: 13359 Wohnort: Tal der Ahnungslosen
|
Danke,danke,danke Jungs.
Aber bitte das nächste mal nicht alles auf einmal.
Der alte Mann war wieder hoffnungslos überfordert.
Mußte bei etwas Hopfenblütentee ne ganze Weile drüber nachdenken.
Ich weiß zwar immer noch nicht richtig was ich da eigentlich tue,aber es tut.
Der letzte Post unseres comischenDon ( ) hat die teilweise Erleuchtung gebracht.
Seine Erklärung mit der Tabelle etc. hab ich dann irgendwann begriffen.
Jedenfalls kommt jetzt auch die Zahl auf der 7-Segment an ,die ich haben will.
Die Fallstricke an denen ich die letzten Stunden gestolpert bin waren:
a) das ich mit den Parametern des in Bascom eigens für diese Sache implementierten Befehls "Shiftout"überfordert war
(das Shiftout das Mittel zum Zweck ist hab ich auch erst später gemerkt)
b) das der HC164 irgendwie nicht das richtige dafür ist
Aber da in der gutsortierten IC-Kiste auch paar HC4094 vorrätig waren,hab ich einen von denen genommen.Damit gings dann.Anfangs konnt ich mit dem "Strobe" und "output enable" Pin nicht viel anfangen.Aber nachdem der Hühnermann mir verraten hatte,das man diese erst mal auch skrupelos auf "hai" legen kann ,war das Problem auch gelöst.
Die nächste Wochenaufgabe wird sein,zwei oder drei von den 7-Segmentdingern zu "multiplexen,so das ich nur einen 4094 brauch.Sollte das nicht klappen,werd ich euch natürlich wieder auf den S**k gehen,
Offtopic :
| Bei der Suche nach dem 4094 hab ich festgestellt,das meine IC-Sammlung im Laufe der Jahre auf 65 verschiedene Typen angewachsen ist.
Natürlich alle im Anwenderfreundlichen DIL-Gehäuse...
|
_________________
Manche Männer bemühen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitätstheorie.
(Albert Einstein)
|
BID = 749316
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Abgesehen davon, daß die Schiebereien wenig mit den ursprünglich angesprochenen Boolschen Variablen, sondern eher etwas mit Modulo 2 Arithmetik zu tun haben, solltest du dich nicht darauf verlassen, dass Boolsche Werte immer, wie hier, als Bitfelder dargestellt werden.
Bei den an notorischer Speicherknappheit leidenden Microcontrollern mag sich das anbieten, aber ich kenne auch Implementierungen, bei denen ein ganzes Wort, also je nach Maschine 16 oder 32 Bit, für eine einzigen T/F-Wert verbraucht wird.
Selbst dabei gibte es noch Unterschiede in der Darstellung.
Teils wird bei der Auswertung auf Zero/Nonzero getestet, teils wird nur das LSB (Bit 0) getestet, und alle anderen spielen keine Rolle.
[ Diese Nachricht wurde geändert von: perl am 18 Feb 2011 22:56 ]
|
BID = 749320
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Hallo,
Richtig perl.
Boolean sollte man hier nicht verwenden, dazu besteht auch kein Anlass.
In Pseudokode würde man z.B. folgenden Algorithmus nutzen:
funktion Bytesenden(byte)
var i as byte
for i = 0 to 7
if byte AND 80$ then PORT = 1
else PORT = 0
byte = byte * 2
generiere_taktflanke
end for
call latch
end funktion
Dank der sbrs- und sbrc-Instruktionen sowie lsl kann ein AVR das ganze ziemlich flott abwickeln. Noch flotter geht es selbstverständlich, wenn man das Schieberegister an die SPI anschließt, also an MOSI, MISO und SCK.
Die Bedingungen if ... und else ... aus dem Pseudokode werden von guten Compilern durch sbrs und sbrc ersetzt. Das Malnehmen mit zwei ist eine Linksschiebeoperation, welche in diesem Fall ruhig überlaufen darf (und wird), es interessiert ja nur das MSB, siehe Maske 80$. Der Vorteil von dieser Maske und dem Linksschieben ist, dass die Daten am Schieberegister ankommen, wie sie reingesteckt wurden
Gibt aber zig andere Möglichkeiten das zu erledigen. Meine Softwareimplementierung ist direkt in Assembler geschrieben und kann auch mit C-Programmen verlinkt werden.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 18 Feb 2011 23:16 ]
|
BID = 749598
Bartholomew Inventar
Beiträge: 4681
|
DonComi schrieb:
Zitat :
| Das geht auch nur dann synchron, wenn man ein Schieberegister mit nachgeschaltetem Latch verwendet. Der CD4094 kann das.
Funktion:
Es gibt ein Schieberegister (SREG) und ein nachgeschaltetes Latch-Register (LREG).
Das Programm setzt einen Eingang am CD4094 so, dass das LREG die gespeicherten Daten auf die Ausgänge schaltet, egal, was am SREG passiert.
Nun können im „Hintergrund” Daten ins SREG geschrieben werden und nach acht Bits kann man einmal kurz das LREG dazu veranlassen, die Werte, die am SREG anliegen, abzuspeichern und auszugeben.
So ist es also möglich, mittels Schieberegister und Latchregister Daten synchron auszugeben.
Würde man nur ein Schieberegister benutzen, würde man die „Bits laufen sehen“; dein Strichkode also . |
Da muss man aber recht schnelle Guckerchen haben, damit man das sehen kann
Dauert doch nur ein paar µs, bis die richtigen Striche leuchten.
Zitat :
| Die nächste Wochenaufgabe wird sein,zwei oder drei von den 7-Segmentdingern zu "multiplexen,so das ich nur einen 4094 brauch. |
Also generell tun's für LED-Anzeigen auch die einfacheren Scheiberegister ohne Latch und Strobe, wie oben geschrieben.
Wenn Du das Multiplexen nicht bloß zu Lernzwecken machen möchtest, würde ich das lassen, weil es den Programmieraufwand erhöht. Und µC-Ausgänge sparst Du dadurch auch nicht:
Ein Schieberegister muss ja mit drei Leitungen mit dem µC verbunden werden: Reset, Clock, Data. Mehrere Schieberegister können sich die gleiche Datenleitung teilen; nur das Register, das man gerade ansprechen möchte, bekommt auch Signale auf seine eigene Clock-Leitung. Wenn die Schieberegister alle zur gleichen Anzeige gehören und eh immer alle gleichzeitig neu geschrieben werden, kann man sie auch auf die gleiche Resetleitung legen. Das die Siebensegmentanzeigen, deren Register dann zuletzt mit neuen Daten gefüttert werden, dann halt ein wenig länger dunkel sind, wirst Du nicht sehen können; da sind die Helligkeitsunterschiede durch die Vorwiderstandstoleranzen noch größer.
Brauchst also für X Siebensegmentanzeigen 2+X µC-Ausgänge (Reset+Data+X*Clock). Für Multiplex bräuchtest Du für X Siebensegmentanzeigen 3+X Ausgänge (Reset+Data+Clock+X*Schalttransistorleitung).
Und der Verdrahtungsaufwand auf der Platine wird auch weniger, wenn jede 7-Segmentanzeige ihr eigenes Schieberegister bekommt, denn bei Multiplex müsste man ja jeweils 8 Leitungen von Segmentanschlus zu Segmentanschluss durchschleifen, und diese Bahnen auch noch kreuzen. So muss man die 8 Leitungen bloß vom jeweiligen Register zur jeweiligen Anzeige ziehen (schön parallel, ohne kreuzen).
Gruß, Bartho
|
BID = 749669
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Offtopic :
|
Zitat :
| Dauert doch nur ein paar µs, bis die richtigen Striche leuchten. |
Stimmt, nur ist dieses Verhalten u.U. nicht erwünscht.
Zudem war zum Zeitpunkt, wo ich antwortete, nicht klar, dass Kleinspannung die Anzeigen multiplexen will.
Das würde ich ihm auch nicht empfehlen.
Pro Siebensegment ein Schieberegister mit Latch reicht völlig aus. Man hat sogar einen Ausgang übrig, den man für einen Dezimal- oder Doppelpunkt nutzen kann
Insgesamt benötigt man also nur drei Leitungen für sämtliche Siebensegmente.
|
_________________
|
BID = 749784
Bartholomew Inventar
Beiträge: 4681
|
Grummel, Absturz hat die fast fertige Antwort gefressen. Also noch mal:
Habe mir Datenblätter und Seiten zum 4094 zu Gemüte geführt und herausgefunden: Man kann beliebig viele 4094er hintereinander kaskadieren und braucht zum Ansteuern bloß vier Leitungen: Data, Clock, Output Enable, Strobe. Die letzten drei werden an alle 4094er parallel angeschlossen. Data von 4094 Nr. 2 kommt an Pin9/QS1/Qs von 4094 Nr. 2; so werden die Bits durch alle Register geschoben.
In einem 4094er gibt es das Schieberegister und das Ausgangs-Latch. Die Bits des Schieberegisters werden genau dann in das Latch kopiert, wenn Strobe high ist und eine steigende Flanke an Clock reinkommt. Das Latch gibt genau dann die in ihm gespeicherten Bits auch aus, wenn OE auf high steht (scheinbar unabhängig von Clock); ansonsten sind die Ausgänge hochohmig.
Folglich ist die Vorgehensweise beim Ansteuern von 3 Siebensegmentanzeigen diese:
Am Anfang liegt OE noch auf low, da wohl unsinnige Zufallswerte in den Latches liegen, die man nicht angezeigt haben will. Also schreibt man 3*8=24 Nullen in die Register, legt dann einmal kurz Strobe auf high und schickt noch einen Taktimpuls hinterher. Wenn man dann OE auf high zieht, ist das Register fertig initilaisiert und zeigt nichts an.
Nun kann man neue, sinnvolle Daten (Temperatur, Uhrzeit usw.) in das Schieberegister schieben; so lange Strobe low bleibt, ändert sich der Ausgang nicht. Wenn die Bits dann alle an Ort und Stelle sind, einmal kurz Strobe high, Takt high, Takt low, Strobe low, und das Display zeigt schlagartig das richtige an.
OE könnte man zum dimmen der Helligkeit nehmen (per PWM), falls das gewünscht wird, oder einfach nur zum Abschalten der Anzeige, ohne, dass die gespeicherten Werte gelöscht werden.
Zum Thema 4094 gegoogelt, gelesen und für gut befunden:
http://www.cmos4000.de/cmos/4094.html
http://www.skilltronics.de/versuch/elektronik_pc/4094.html
http://www.roboternetz.de/phpBB2/viewtopic.php?p=148350
Gruß, Bartho
|
BID = 749787
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Exakt aus diesem Grund habe ich den 4094 vorgeschlagen.
(Das meinte ich auch damit, dass man mit nur drei Leitungen quasi belieibig viele Ausgänge erreichen kann).
OE habe ich immer festverdrahtet, wenn uninitialisierte Register keinen Schaden anordnen können.
Hier mal ein Bild, wo ein 4094 direkt zwischen der oberen und unteren Anschlussreihe eines Siebensegments sitzt. Es sind keine zusätzlichen Treiber vorhanden (Bild ist vergrößert, daher leicht unscharf).
_________________
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 11 Beiträge verfasst © x sparkkelsputz Besucher : 182419798 Heute : 4296 Gestern : 7490 Online : 240 28.11.2024 19:34 5 Besucher in den letzten 60 Sekunden alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.368927955627
|