PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rotate



Mr-400-Volt
10.08.2006, 15:40
Hallo, ich habe eine Variable (ledwf = &B1000). Ich wollte nun die 1 mit dem Rotate-Befehl immer um eine stelle nach rechts wandern lassen, und am ende wider links einlaufen lassen:

1000
0100
0010
0001
1000..........

Rotate ledwf,right,1

Aber die 1 erscheint erst nach dem 8ten aufruf wider an der ersten position. Mach ich da was falsch ?

Bluesmash
10.08.2006, 16:02
ich nehme mal an die ledwf variable ist eine byte variable? 8bit=1byte... dann muss man logischerweise 8mal schieben bis die 1 wieder am anfang steht....

gruss bluesmash

--edit--

wenn du immer nach 4mal schieben wieder die 1 an 4. stelle haben wilst mach doch einfach LED=&B10001000

Mr-400-Volt
10.08.2006, 16:07
Ja, das ist richtig. Ich darf trotzdem nur 4 bit rotieren. Ich hab einfach einen zähler mitlaufen lassen, der bei 5 die Variable zurücksetzt.
Aber was ich nicht hin beckomme ist, einen "ein-aus-ein-aus" mit einem Taster zu programieren.

If Taste = Setsid And Tog = 1 Then
Tog = 0
Adr = &B00000100
Reg = Wf(s)
Gosub Sidsend
End If

If Taste = Setsid And Tog = 0 Then
Tog = 1
Adr = &B00000100
Reg = Wf(s) + 1
Gosub Sidsend
End If

Bluesmash
10.08.2006, 19:03
sollte doch so funktionieren? ich würde noch ein waitms100 oder höher ind die if schleife einbauen.... sonst wird ein tastendruck gleich mehrmals detektiert... da der mikroprozi einiges schneller ist als du mit dem tastendruck...

ich würde es so lösen:



if taste=0 then
waitms 200

toggle setbit

if setbit=0 then
tu irgendwas
endif

if setbit=1 then
tu irgendwas anderes
endif
endif


gruss bluesmash

Klaus W. H.
10.08.2006, 20:32
Zu 1:
Ich schätze, Du könntest auch eine Variable auch mit ledwf_A = &B10001000 initialisieren. Diese dann wie gehabt rotieren.
Danach einfach:
' Ledwf = Ledwf And &B00001111 ........Blödsinn. So sollte es aussehen
Ledwf = Ledwf_A And &B00001111

Sollte so funktionieren.

Zu 2. Das sollte meiner Meinung nach so aussehen:



If Taste = Setsid Then
If Tog = 1 Then
Tog = 0
Elseif Tog = 0 Then
Tog = 1
End If
Adr = &B00000100
Reg = Wf(s) + 1
Gosub Sidsend
End If

E-Fan
12.08.2006, 16:14
Jup! Würd ich ähnlich machen - einfach das passende Bit vier stellen weiter Richtung MSB oder LSB auch setzen und gut ist. Dann kann bei rotate nix schief gehn.

Hanni
12.08.2006, 17:20
Vom Prinzip her würde es übrigens ausreichen, das MSB dieser Variable zu Testen und beim vorhandensein einer 1 einfach die nibbles zu swapen ...

Ich hab allerdings keine Ahnung ob dieses mit Bascom realisierbar ist.

Alternativ ist der Vorschlag meines Vorposters im übrigen auch nicht verkehrt.
Anstatt einer &B00000100 könnte man natürlich auch ein &B01000100 hineinschreiben. Allerdings sollte man vor weiterer Verwendung dieses Wertes (z.B. für eine Adresse) die oberen 4 Bits maskieren.

Grüße,
da Hanni.