PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitfolge drehen



BoondockDuck
22.06.2008, 15:57
Morgen
kann man irgendwie eine Bitfolge drehen?

Bitfolge1: B1 B2 B3 B4 B5 B6 B7
soll zu
Bitfolge2: B7 B6 B5 B4 B3 B2 B1
werden

Das ganz sollte mathematisch doch irgendwie zu machen sein, ich komme nur nicht wirklich drauf.

Beispiel:
0111111 -> 1111110 | 126 -> 63
1001000 -> 0001001 | 9 -> 72
usw.


Gruß

PicNick
22.06.2008, 16:21
Ich glaub nicht, dass da ein verwertbarer (sinnvoller) mathematischer Ansatz existiert. Es korreliert zwar jedes In-Bit mit seinem Out-Bit, aber jedes in anderer Weise.
(ich lass mich aber gerne belehren)

Ich würde mir da mit einem kurzen Inline-Assembler helfen (18 maschinen zyklen). Viel billiger is nix.

python_rocks
22.06.2008, 16:25
kann man irgendwie eine Bitfolge drehen?
Hallo BoondockDuck!

Das ist jetzt nicht sonderlich ausgeklügelt, aber ich glaube es macht genau das was du haben willst:

$regfile = "M8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 4800

Declare Function Reversed(byval Source As Byte) As Byte


Print Reversed(&B00000001) '=128

End


Function Reversed(byval Source As Byte) As Byte
Local Dest As Byte
Dest.0 = Source.7
Dest.1 = Source.6
Dest.2 = Source.5
Dest.3 = Source.4
Dest.4 = Source.3
Dest.5 = Source.2
Dest.6 = Source.1
Dest.7 = Source.0
Reversed = Dest
End Function
mfg
Gerold
:-)

PicNick
22.06.2008, 16:48
Stimmt schon, der Code wäre ja korrekt.
Nur: wenn man weiss, was für ein Massaker der Bascom mit dem Bit- fragen und -setzen veranstaltet, sollte man sich das überlegen.
https://www.roboternetz.de/wissen/index.php/Bascom_Inside-Code#BIT_Set_.26_Clear

BoondockDuck
22.06.2008, 16:56
Danke Gerold
dein Code läuft ganz gut, auch wenn es schon etwas die sprichwörtliche Kanone auf Spatzen ist


Jetzt zeigen meine Matrizen die Buchstaben auch endlich richtigrum an :)
Davor waren Oben und Unten verdreht. Warum genau bin ich nicht so sicher... Oder es ist einfach so dass die Schaltung einen die Zeichen "andersrum" ausgibt. An der Verkabelung liegts auf jeden Fall mal nicht.

http://dl.getdropbox.com/u/32032/xy.jpg
Das ganze ist eine Laufschrift, die beiden Matrizen muss man sich nebeneinander angeordnet vorstellen.

Ich werde mir allerdings überlegen ob ich nicht schlichtweg den Zeichensatz für jedes Schriftzeichen anpasse.

PicNick
22.06.2008, 17:14
.. für jedes Schriftzeichen anpasse..
IMHO das Beste, was du machen kannst. Bei manchen solchen Datasheets ist die ZeichensatzTabelle im Anhang dabei, ich werd mal nachsehen.

python_rocks
22.06.2008, 17:52
auch wenn es schon etwas die sprichwörtliche Kanone auf Spatzen ist
Hallo BoondockDuck!

Zuerst muss das Programm funktionieren. Und meinstens funktionieren die Programme schnell genug. Erst wenn man erkennt, dass das Programm nicht schnell genug ist, dann sucht man sich die ärgsten Engstellen raus und optimiert genau diese. So opfert man nicht unnötige Zeit für Optimierungen, die in den meisten Fällen nicht notwendig gewesen wären.

mfg
Gerold
:-)

izaseba
22.06.2008, 18:24
Hallo,


Ich werde mir allerdings überlegen ob ich nicht schlichtweg den Zeichensatz für jedes Schriftzeichen anpasse.

Diese Arbeit würde ich mir nicht machen,
was ist wenn Du den Zeichensatz doch auf dem Kopf brauchst ?
Vor dem Problem habe ich mit meiner Propelleruhr gestanden, wo ich was im oberem und im unterem Teil darstellen wollte.
Klar mußte ich die Zeichen drehen und sowas ist sehr schnell in Software erledigt.
Hier mal etwas Inlineassembler:


asm volatile (

"ldi %2,8" "\n\t"
"0:" "\n\t"
"lsr %0" "\n\t"
"rol __tmp_reg__" "\n\t"
"dec %2" "\n\t"
"brne 0b" "\n\t"
"mov %0,__tmp_reg__" "\n\t"
: "=a" (tmp)
: "0" (tmp), "a" (count)
);

Noch schneller(aber nicht Flashsparender) geht es mit 8 lsr und 8 rol hintereinander.

Gruß Sebastian

enterprise30
22.06.2008, 21:17
Da fällt mit jetzt nur das Einerkomplement ein.
Bascom kennt noch den "Toggle" - aber der geht glaub nur für die Ports.
Im AVR-Studio gibt dafür eine Assemblerdirective die heisst
! Logical Not
~ Bitwise Not
Müsstet also $Asm in Dein Proggi einbinden

....

BoondockDuck
23.06.2008, 07:30
.. für jedes Schriftzeichen anpasse..
IMHO das Beste, was du machen kannst. Bei manchen solchen Datasheets ist die ZeichensatzTabelle im Anhang dabei, ich werd mal nachsehen.
Konnte ich bis jetzt noch nicht rausfinden, aber wenn du mal schauen magst danke :)



Zuerst muss das Programm funktionieren. Und meinstens funktionieren die Programme schnell genug. Erst wenn man erkennt, dass das Programm nicht schnell genug ist, dann sucht man sich die ärgsten Engstellen raus und optimiert genau diese. So opfert man nicht unnötige Zeit für Optimierungen, die in den meisten Fällen nicht notwendig gewesen wären.Ja du hast schon recht
Und so dramatisch ist es auch nicht, denn dein Programmvorschlag wird nur "einmal" durchlaufen und dann läuft die Laufschrift ohne nochmals Bits zu drehen.
D.h. ein String wird zerlegt. Pro zeichen werden 6 Datensätze aus der Tabelle gelesen und bei jedem dieser Sätze werden 7 von 8 Bit gedreht.
Das ganze kommt in ein Array und gut ist.

Bis jetzt ist es noch nicht notwendig den Code anzupassen. Sollte ich die Laufschrift aber ernsthaft mal größer aufbauen überlege ich mir das nochmal.
Ist leider nicht gerade billig da es über den Max7221 läuft. 4 Stück zum Spielen habe ich von Maxim bekommen, aber es sollten ja schon ein paar mehr sein.

Es war aber eh primär für mich damit ich das Laufschriftprojekt endlich mal durchziehe. (Ich spiel damit seit vielen vielen Monaten rum ohne mal richtig angefangen zu haben)

PicNick
23.06.2008, 07:57
In dem Datenblatt is so ein Chart.
http://www.robotikhardware.de/download/eadip204_datenblatt.pdf
Is naturlich Arbeit, je nachdem, wie fix du bist.
Aber dann hast du es ein für allemal

E-Fan
24.06.2008, 16:12
Kann man da nicht auch als Alternative die Bits von zwei Bytes rotieren lassen? Das wäre mein erster Lösungsansatz.
Das eine nach links, das andere nach rechts und alles in eine Schleife eingebunden sähe vielleicht so aus:
.
.
.
.
For C = 0 to 7
A.7=B.7
Rotate A, 1, left
Rotate B, 1, right
Next
.
.
.
.
Ich hab schon ne Weile nichts mehr in Bascom gemacht also nagelt mich nicht auf den korrekten Befehlsaufbau fest und werft vorher einen Blick in die Hilfedatei! :)

Sauerbruch
24.06.2008, 17:37
...und wozu ist das "C" ?

Meine Idee wäre die (allerdings mit dem "Massaker"-Nachteil, den PickNick erwähnte):




Dim Alt as byte 'Ausgangs-Byte
Dim Neu as byte 'Invertiertes Byte
Dim A as byte
Dim B as byte
.
.
.
For A = 0 to 7
B = 7 - A
Neu.A = Alt.B
Next A
.
.
.


Nicht schön, aber selten... =P~

Yossarian
24.06.2008, 17:56
Hallo
b löschen
carry löschen
for n=1 to 8
rlc a
rrc b
next

Mit freundlichen Grüßen
Benno

oe9vfj
25.06.2008, 11:11
Hier ein Vorschlag, wie man die Aufgabenstellung Zeit- und Code-sparend in ASM lösen könnte mit einem Beispiel zum Testen der Funktion.



Dim X1 as Byte, X2 as Byte ' Zum Testen


Declare Function ByteReverse (InByte as Byte) as Byte


' Test für alle Byte-Werte ( 0 - 255)

for x1 = 0 to 255

x2 = ByteReverse(x1)
print bin(x1); " " ; bin(x2)
next

end






Function ByteReverse (InByte as Byte) as Byte

$ASM

Loadadr InByte, Z ' SRAM-Adresse des Input-Bytes in Z-Pointer
ld r24, Z ' Input in CPU-Register r24 laden
ldi r23, 8 ' 8 Bit zum schieben
ByteReverse1:
lsl r24 ' Bit nach links ins Carry schieben
ror r25 ' Carry nach Rechts in Output schieben
dec r23
brne ByteReverse1 ' letztes Bit erreicht
loadadr ByteReverse, Z
st Z, r25 ' Byte in Rückgabevariable abspeichern
$End ASM

End Function



Das Byte kann mit Übergabe in die deklarierte Funktion ByteReverse (wie schon in einem vorigen Post vorgeschlagen) umgedrehrt werden

E-Fan
04.07.2008, 22:06
@Sauer:

Man braucht eine weitere Variable zum Abzählen der Schleifen - und das ist in meinem Fall C
Unter Do...Loop until wär's das selbe.

rici35
07.07.2008, 09:00
Hallo BoondockDuck,

bist du mit deiner Laufschrift weiter gekommen?

Ich möchte mir so was auch gerne anschauen. Könntest Du mir bitte den Code senden?

Gruß Richard