PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Byte Invertieren



Movie85
29.12.2009, 14:30
Hallo,

ich bin gerade dabei, eine LED matrix mit einem Schieberegister aufzubauen.
Da ich den Code übersichtlich halten will, und man als Spaltenansteuerung immer eine 0 für "Spalte an" setzen muss, wollte ich das komtplette Bitmuster invertieren. Da ich für die nächste Spalte das Bitmuster einfach eins nach rechts shifte, wird das neu enstehende Bit ja 0, daher aber auch die Spalte wieder an.

Heißt:

Z = &B01111111
Shift Z , Right

wird zu &B00111111, was ich ja nicht will, ich will dass &B10111111 draus wird. Ich kenn mich mit Bitrechnen nicht so gut aus, kann man das auch durch addideren, dividieren erreichen? Durch invertieren wäre das kein Problem.


Ich weiß nicht ob sowas ohne Hardware möglich ist?!

Gruß,

Tom

for_ro
29.12.2009, 14:58
Ich würde nach dem Shiften einfach das oberste Bit auf 1 setzen. Bei dir wäre das so:
Z.7 = 1
Die Nummerierung fängt rechts bei 0 an, entsprechend der Wertigkeit der Bits.

MagicWSmoke
29.12.2009, 15:11
Nimm einfach den Rotate Befehl.

Movie85
29.12.2009, 15:44
Danke für die Antworten.

@for_ro Danke, diese Funktion kannte ich noch garnicht!

@ MagicWSmoke Wie meinst du das? Der Rotate Befehl dreht doch nur das Muster um

00111 wird zu 111000 oder täusche ich mich da?

Gruß

EDIT:

Muss mich korrigieren! Danke Magic, habs ausprobiert und das ist genau das was ich gesucht habe! So wird ja alles noch einfacher! Kann man da auch größere Bytes verschieben? Ich denke da z.B. an ein 64bit Byte oder so

Gruß

MagicWSmoke
29.12.2009, 16:07
Kann man da auch größere Bytes verschieben?
Die Bascom Hilfe ist Dein Freund :D

Das höchste der Gefühle ist ein Long, also 32 Bit. Wobei Du mir auch erstmal eine 64 Bit Variable in Bascom zeigen müsstest ;)

Solltest Du mal etwas richtig negativ sehen wollen, so nimm NOT:


N = NOT N

negiert alle Bits in N.

Movie85
29.12.2009, 16:22
Hallo,

danke, ich hab mich ein bisschen schlecht ausgedrück und nicht nachgedacht.
Ich will nicht unbedingt größere Zahlen verschieben, sondern:
Ich habe z.B. 8 kaskardierte Schieberegister, die jeweils die Spalten in meiner Matrix aktivieren. Die Zeilen werden über einen Treiber geschalten.

Daraus ergeben sich 7 Zeilen mal (8*7)+1 Spalten = 399 Leds.
Um das ganze jetzt in einer Matrix anzusteuern, wollte ich in den Schieberegistern halt jeweils eine 0(= Spalte an) komplett durchschieben, also erst in Q1 des ersten Registers, dann Q2... bis es dann bei Q8 des 8ten Regsisters angekommen ist.
Ich hatte noch die Idee, einfach am Anfang eine 0 in die Schieberegister zu schieben und per "Shiftout" einfach immer 1er nachzuschieben, und zwischendrinnen immer den Zustand übernehmen. Dadurch bekomme ich auch die 0 durch alle durchgeschoben, das muss ich noch ausprobieren.

Hoffe das war verständlich

Tom

MagicWSmoke
29.12.2009, 16:35
Es ist aber ein Unterschied, ob Du ein Schieberegister bedienst, oder das auf lokale Variablen abbilden willst. Beim Schieberegister reicht einmal 0 und 63 mal 1 schieben, wenn die 0 überall durchgeschoben werden soll.

Nur zwischendrin wirst Du nicht viel übernehmen können, dazu müsstest Du Dein Schieberegister erst wieder auslesen. Also alles wieder rausschieben, nicht sehr effizient.

Solltest Du dagegen den Zustand auf 8 Bytes abbilden wollen, so würde es am einfachsten in Maschinensprache, also ASM Code gehen, die Sprache solltest Du dafür aber sinnvollerweise können.

Einen unkomplizierten Befehl um 8 Bytes direkt in Basic zu rotieren gibt's nicht. Wenn's denn Basic bleiben muss, kannst Du den aus 2 Rotate Befehlen, mit einem bisserl Code zusammenbauen. Unsauberer als die ASM Lösung, aber klappen tät's sicher.

Movie85
29.12.2009, 18:00
Ok, damit ich nicht soviel Zeit verschwende beim Multiplexen, werde ich einfach nicht wie gedacht über die Spalten multiplexen sondern über die Reihen.
Dadurch muss ich nicht immer eine 0 durch die Schieberegister schieben, sondern das Bitmuster. Die Zeilen werden dann über ein 74HC259 jeweils von oben nach unten auf 0 gesetzt(schön ist auch, das der den ausgang gleich invertiert) Dann noch nen Treiber davor und los gehts:)

Danke nochmal für die Hilfe

Tom