Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom-Entsprechung von x<<y (AVR-C)
Tagchen!
ich würde gern folgende Zeile Avr-C in Bascom übersetzen:
tmpc |= (1<<5);
Das OR ist klar.
tmpc = tmpc OR ...
Aber was ist mit dem Shift? Im C-Code wird eine 1 um 5 Stellen in das Byte geschoben. Das Bascom-Shift scheint sowas aber nicht zu ermöglichen:
Syntax:
SHIFT var , LEFT/RIGHT[ , shifts]
Bedeutet das nicht einfach
tmpc = tmpc OR &B00010000
oder bedeutet 5 mal shiften
tmpc = tmpc OR &B00100000
Tatsächlich würde man wohl
Set tmpc.4 (bzw. Set tmpc.5)
eingeben
Gruß
Rolf
Es gibt in Basic die Befehle SHIFT und ROTATE, die dem >>/<< entsprechen. Bei einem wird ein rausgeschobenes Bit erhalten, beim anderen gehts verloren.
Jaecko das ist jetzt keine Antwort auf meine Frage.
Ich habs nun so gemacht:
Tmp_c = Tmp_c Or 32
Das packt mir ne 1 direkt an die 5. Stelle.
linux_80
23.05.2008, 12:25
Hallo,
wie for_ro schon geschrieben hat, in Bascom macht man es am einfachsten mit Set tmpc.5 um das Bit5 zu setzen.
Ist für den einen oder anderen auch besser zu erkennen um welches Bit es sich handelt als mit 32.
32 ist doch ganz eindeutig ^^
welche version ist denn schneller? oder WAS genau macht tmpc.5 eigentlich (in ASM)
upsa... sorry verlesen. Dachte es geht ums shiften, nicht ums Bit setzen.
Hallo Jaecko,
bei den C-Programmierern ist Bit setzen immer mit Shiften verbunden.
tmpc |= (1<<5);
wäre eigentlich in Bascom
tmp=1
shift tmp,left,5
tmpc=tmpc or tmp
(1<<5) macht natürlich Sinn, wenn Variablen beteiligt sind (1<<i), ansonsten kannst du genausogut
tmpc=tmpc or 32
in Bascom bzw.
tmpc| = 32
in C schreiben
Gruß
Rolf
Bei festen Wert (1<<5) macht der C kompiler gleich ein 0x20 draus,
also im Code gleich tmp |= 0x20.
Das hat Bascom dzt. nicht drauf
Mit Variablen zur Laufzeit wäre das Äquivalent
DIM TMP AS BYTE
DIM POS AS BYTE
pos = 5
TMP.pos = 1
Btw: das mit dem Shiften und dann Odern geht natürlich auch, is aber mehr Code
Ja Moment mal, Picknick!
Du übergibts dem GCC ja auch ne Konstante (5) und dem Bascom-Compiler ne Variable (Pos = 5). Ist klar dass der GCC das zur Compilierzeit auswertet und der Bascom-Compiler nicht. Wie ist es denn wenn man in Bascom
tmp.5 = 1 machen würde?
welche version ist denn schneller?
Ich hab mal verschiedene Befehle im Simulator angesehen:
Dim X As Word
Dim I As Byte
X.1 = 1 8 cycles
I.1 = 1 8
Set X.1 7
Set I.1 5
X = X Or 1 16
I = I Or 1 7
Gruß
Rolf
..klar, ... GCC Compilierzeit ....Bascom nicht.
Eben. Bascom kann sowas wie
CONST wert = 1 << 5
eben nicht, soweit ich weiss. das geht nur zur laufzeit.
Bestenfalls
CONST wert = 2 * 2 * 2 * 2 * 2
das ist aber wohl keine Alternative
const wert = &B00100000
kann bascom sehrwohl
const wert = &B00100000
kann bascom sehrwohl
Aber geh, das hätt' ich jetzt nicht gedacht :-)
Hast du gelesen, worum es geht ?
Bascom kann sowas wie
CONST wert = 1 << 5
eben nicht, soweit ich weiss.
Das liegt ja nur daran, dass es keinen Shift-Operator gibt, sondern nur einen Shift-Befehl. Sowas wie
CONST wert = 2 + 3
kann Bascom schon und wertet es auch zur Compilezeit aus.
Gruß
Rolf
sorry, aber die syntax 1<<5 erscheint mir eh
hirnrissig wer sich den Käse ausgedacht hat
hatte sadomasochistische Anwandlungen ... ;)
wenn ich n bit 5 setzen möchte, dann mach ich
set variable.5 oder meinetwegen auch
variable = variable or &B00100000 ...
aber reinshiften, das dann doch vom compiler als
set compiliert wird ... sorry, nicht mein Ding.
dagegen ist asm ja richtig elegant ... SBI
Na, da möcht ich aber doch den C verteidigen.
Bits braucht man (meistens) auf zwei Arten:
als Maske (&B00100000) für OR und AND
und als Bit-offset ( 5) für Bit-SET befehle
ein Port-Pin müßte man also zweifach definieren
#define V_PB5 5
#define M_PB5 0x20
das ist gefährlich bei Projekt Anpassungen etc und vor allem grad bei µC recht umfangreich
also definiert man nur
#define V_PB5 5
und die Maske eben direkt im Befehl
XXbyte |= (1 << V_PB5) oder
XXbyte &= ~(1 << V_PB5)
das ist dann nur Arbeit für den Compiler, zur Laufzeit kost' das nix
Hallo,
ist zwar schon etwas her aber wie wäre es mit dem Befehlen Bits() und NBits() zum stzen oder löschen einzelner Bits? Geht wunderbar und sieht übersichtlich aus.
zb.: Admux = Bits(adlar , Refs0)
In wieweit dies mehr Resourcen verbraucht kann ich allerdings nicht sagen.
Mfg
OEP
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.