Bascom und "Boolean"

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 31 12 2024  00:25:33      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


Autor
Bascom und "Boolean"

    







BID = 748942

Kleinspannung

Urgestein



Beiträge: 13366
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: xxxx1101 AND 0000001 (=AND 1) ergibt 00000001, 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 uxxxx110 AND 00000001 = 00000000, 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: 13366
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: 13366
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).



_________________


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


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 22 Beiträge im Durchschnitt pro Tag       heute wurden bisher 1 Beiträge verfasst
© x sparkkelsputz        Besucher : 182631589   Heute : 98    Gestern : 7581    Online : 213        31.12.2024    0:25
2 Besucher in den letzten 60 Sekunden        alle 30.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.455591201782