PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom-Entsprechung von x<<y (AVR-C)



Goblin
23.05.2008, 09:00
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]

for_ro
23.05.2008, 09:15
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

Jaecko
23.05.2008, 10:56
Es gibt in Basic die Befehle SHIFT und ROTATE, die dem >>/<< entsprechen. Bei einem wird ein rausgeschobenes Bit erhalten, beim anderen gehts verloren.

Goblin
23.05.2008, 11:01
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, 11: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.

Goblin
23.05.2008, 11:39
32 ist doch ganz eindeutig ^^

welche version ist denn schneller? oder WAS genau macht tmpc.5 eigentlich (in ASM)

Jaecko
23.05.2008, 13:19
upsa... sorry verlesen. Dachte es geht ums shiften, nicht ums Bit setzen.

for_ro
23.05.2008, 13:34
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

PicNick
23.05.2008, 14:51
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

Goblin
25.05.2008, 09:18
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?

for_ro
25.05.2008, 10:33
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

PicNick
25.05.2008, 10:50
..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

Vitis
25.05.2008, 15:14
const wert = &B00100000

kann bascom sehrwohl

PicNick
25.05.2008, 16:45
const wert = &B00100000
kann bascom sehrwohl


Aber geh, das hätt' ich jetzt nicht gedacht :-)

Hast du gelesen, worum es geht ?

for_ro
25.05.2008, 19:55
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

Vitis
25.05.2008, 23:37
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

PicNick
26.05.2008, 07:27
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

OEP
03.06.2008, 17:56
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