Ich müsste zur Vereinfachung der Hardware 4 „verschobene“ Pins verwenden.
Einfach ist es ja, z.B. die Zahl „5“ an (z.B.) PORTB.0, …1, …2 und PORTB.3 auszugeben. Das wär’ ja einfach „PORTB = &B00000101“
Aber wie mach’ ich das, wenn ich Hardware-bedingt die Pins PORTB.2, PORTB.4, PORTB.5 und PORTB.3 verwende? (Sind in chronologischer Reihenfolge, d.h. 1er an B2, 2er an B4, 4er an B5, 8er an B3)
Es geht auch, wenn ich weiß, wie man eine Zahl (0 bis 9) in ihre 4 Bits aufteilt. Dann ist die Ausgabe darüber ja auch möglich.
Es geht auch, wenn ich weiß, wie man eine Zahl (0 bis 9) in ihre 4 Bits aufteilt. Dann ist die Ausgabe darüber ja auch möglich.
Ich weiß nicht, welcher Befehlssatz Dir zur Verfügung steht. Im Allgemeinen macht man das mit einem mehrmaligen Rechtsshift der Information (Zahl) um 1 Bit. Das rechts hinausgeschobene Bit (z.B. in einem Flag) gibt nacheinander die Information 20; 21; 22; 23; usw.
Das geht übrigens mit beliebig großen (>9) Zahlen.
Also das mit dem Verschieben habe ich schonmal irgendwo gelesen.
Aber so ganz verstehe ich das, muss ich ehrlich sagen, nicht…
Aber ich habe das gerade hinbekommen, die Zahlen in Bits aufzuteilen.
Und zwar so:
Help = Sekunden
If Help >= 8 Then
Anz6d = 1
Help = Help - 8
Else
Anz6d = 0
End If
If Help >= 4 Then
Anz6c = 1
Help = Help - 4
Else
Anz6c = 0
End If
If Help >= 2 Then
Anz6b = 1
Help = Help - 2
Else
Anz6b = 0
End If
If Help >= 1 Then
Anz6a = 1
Else
Anz6a = 0
End If
Bascom Array verwenden
Das mit dem Verschieben haette nicht funktioniert, da die
Reihenfolge durcheinander ist.
Aber ich habe das gerade hinbekommen, die Zahlen in Bits
aufzuteilen.
Richtig ist, was funktioniert.
Noch besser ist, was uebersichtlich und erweiterbar ist.
Vielleicht so:
Dim str as String *9
Dim var as Byte *10 at str overlay
str=‚bhiprxzdf‘
ANz6d = var[Help]
Anz6d = Anz6d and &B00011110
oder so:
Dim var as Byte *10
Do Loop End
var: Data 0, 2, 8, 9, 16, 18, 24, 26, 4, 6
ANz6d = var[Help]
Hallo,
vieleicht solltest du mal dein Problem ausführlicher und
im Zusammenhang schildern.
Aus deinen Erläuterungen, die du mit eigenen Lösungsideen
vermischt hast, kann man nicht wirklich sagen, was sinnvoll
möglich ist und wei es evtl. deutlich eleganter lösbar wäre.
Gruß Uwi
Ich müsste zur Vereinfachung der Hardware 4 „verschobene“
Pins verwenden.
Einfach ist es ja, z.B. die Zahl „5“ an (z.B.) PORTB.0, …1,
…2 und PORTB.3 auszugeben. Das wär’ ja einfach „PORTB =
&B00000101“
Aber wie mach’ ich das, wenn ich Hardware-bedingt die Pins
PORTB.2, PORTB.4, PORTB.5 und PORTB.3 verwende? (Sind in
chronologischer Reihenfolge, d.h. 1er an B2, 2er an B4, 4er an
B5, 8er an B3)
Es geht auch, wenn ich weiß, wie man eine Zahl (0 bis 9) in
ihre 4 Bits aufteilt. Dann ist die Ausgabe darüber ja auch
möglich.
Hardware:
Sechs 7-Segment-Displays (gem. K.) sind über je einen Transistor (npn) mit je einem Pin am Controller. Das ist für den Multiplex.
Zur Steuerung und als Treiber der Displays wird der IC 4543 (unter Anderem 4-Bit Eingang und 7 Ausgänge für die Segmente) verwendet.
Software:
Zuerst habe ich die Zeit mit folgenden Variabeln gerechnet: Zehnstunden, Stunden, Zehnminuten, Minu… usw. Das hatte den Vorteil, dass ich für jedes Display eine eigene Zahl hatte, die ich nur noch in ihre 4 Bit aufteilen musste. Fuktionierte wunderbar.
Jetzt, da ich alles für die Zeit-/Datumfunktion umstellen muss, habe ich das Problem, dass ich die Variabeln _sec, _min, _hour usw. verwenden sollte.
Ich würde das wie folgt machen:
Die Zeitfunktion nutzen. Sekunden-, Minuten-, Stunden- und andere ähnlich Variabeln in ihre Ziffern aufteilen. Aus diesen Ziffen die Bits entnehmen.
Hardware:
Sechs 7-Segment-Displays (gem. K.) sind über je einen
Transistor (npn) mit je einem Pin am Controller. Das ist für
den Multiplex.
Zur Steuerung und als Treiber der Displays wird der IC 4543
(unter Anderem 4-Bit Eingang und 7 Ausgänge für die Segmente)
verwendet.
ja, das hatten wir doch erst vor paar Wochen hier diskutiert,
wo ich dir die Schaltungen für Multiplexer näher gebraucht
habe, oder?
Software:
Zuerst habe ich die Zeit mit folgenden Variabeln gerechnet:
Zehnstunden, Stunden, Zehnminuten, Minu… usw. Das hatte den
Vorteil, dass ich für jedes Display eine eigene Zahl hatte,
die ich nur noch in ihre 4 Bit aufteilen musste. Fuktionierte
wunderbar.
Jetzt, da ich alles für die Zeit-/Datumfunktion umstellen
muss, habe ich das Problem, dass ich die Variabeln _sec, _min,
_hour usw. verwenden sollte.
Ja und? Das ändert doch nix am Prinzip.
Je 4 Bit bleiben weiterhin nötig für eine Stelle.
Ich würde das wie folgt machen:
Die Zeitfunktion nutzen. Sekunden-, Minuten-, Stunden- und
andere ähnlich Variabeln in ihre Ziffern aufteilen. Aus diesen
Ziffen die Bits entnehmen.
Dann mache das doch?
Das hat das jetzt aber mit der Fragestellung zu tun?
Wieso sind da jetzt irgend welche Bits durcheinander?
ja, das hatten wir doch erst vor paar Wochen hier diskutiert,
wo ich dir die Schaltungen für Multiplexer näher gebraucht
habe, oder?
Ja, das hat mich auch einen großen Schritt nach vorn’ gebracht; Danke nochmal dafür!
Ja und? Das ändert doch nix am Prinzip.
Stimmt wohl.
Dann mache das doch?
Bin schon die ganze Zeit dabei. Er zeigt mir die Sekunden zwar zusätzlich anstelle der Zehn-Stunden an, aber das kriege ich auch noch gebacken
Das hat das jetzt aber mit der Fragestellung zu tun?
Eigentlich so langsam nichts mehr…
Wieso sind da jetzt irgend welche Bits durcheinander?
Der 4543 hat sozusagen als Eingang die Bits, C-D-B-A. In der Reihenfolge sind sie auch am µC angeschlossen; deswegen kann man die Bits nicht „schieben“.
Jetzt mache ich das Ganze mithilfe von „Config Clock = Soft“ usw. Aber die Zeit läuft sofort los.
Gibt es eine Möglichkeit, diese Uhr anzuhalten, um sie stellen zu können.
Mein Programmablauf:
Variabeln definieren u.Ä.
Timer und sein Interrupt für den Multiplex „einrichten“
Uhr konfigurieren
Do-Loop: Aus _sec, _min und den anderen Bits machen
Timerinterrupt: Multiplexen und die Bits ausgeben
Ich glaube, man kann diese „Soft-Clock“ per „Disable Interrupts“ anhalten, das stoppt allerdings den Multiplex…
Ich glaube, man kann diese „Soft-Clock“ per „Disable
Interrupts“ anhalten, das stoppt allerdings den Multiplex…
Weil beim ATmega8 der Timer2 als „Clock“ konfiguriert wird, kann man die Uhr einfach per „Disable Timer2“ anhalten und mit „Enable Timer2“ laufen lassen.
Mit dem ganz kleinen Nachteil, dass manchmal ca. eine halbe Sekunde übersprungen wird, weil der Timer in der Mitte einer Sekunde wieder gestartet wird.
Ein bisschen Ausprobieren bringen ein’ deutlich weiter
Wieso sind da jetzt irgend welche Bits durcheinander?
Der 4543 hat sozusagen als Eingang die Bits, C-D-B-A. In der
Reihenfolge sind sie auch am µC angeschlossen; deswegen kann
man die Bits nicht „schieben“.
und warum lötest du die Eingänge nicht in einer vernünftigen
Reihenfolge an den Controller an?
Gruß Uwi