Bascom: Zahl / 4-Bit / Nibble an 4 beliebigen Pins

Hallo.

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.

Danke im Voraus!
mfG, Martin.

Hallo Martin

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.

Hilft Dir das?

Gruß merimies

Hilft Dir das?

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

Aber trotzdem vielen Dank!

Gruß merimies

Gruß zurück.

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]

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]

Also Anz6d ist nur ein Bit, und zwar das 8er. „Anz6“ stellt das 6. 7-Segment-Display dar und „d“ das 4. Bit.

Aus meinem vorherigen Zitat ergeben sich je 4 Bits, die so zu einem Nibble werden: (Quelltext-Zitat)

If Anzeige = 2 Then
Bcda = Anz2a
Bcdb = Anz2b
Bcdc = Anz2c
Bcdd = Anz2d

Bcd[x] steht jeweils für einen Pin, also vier Stück = Ein Nibble.

Soweit ich deinen Vorschlag verstanden habe, hast du „Anz6d“ falsch verstanden.
Aber trotzdem vielen Dank!

mfG.

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.

Danke im Voraus!

mfG, Martin.

Okay. Ich beschreibe mal die folgende Situation:

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.

I’m confused :confused:

mfG und danke im Voraus.

Hallo,

Okay. Ich beschreibe mal die folgende Situation:

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?

Gruß Uwi

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 :smiley:

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…

Gruß Uwi

Gruß zurück.

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 :smiley:

Hallo,

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

und warum lötest du die Eingänge nicht in einer vernünftigen
Reihenfolge an den Controller an?

War so einfacher :smiley: Aber ja, besser wär’s wohl. Aber jetzt funktioniert’s auch so.