Forum: Mikrocontroller und Digitale Elektronik Was bedeutet 1<<4 im Assembler Tutorial


von Michael D. (etzen_michi)


Lesenswert?

Guten Tag.

Gehe grad das Assembler Tutorial durch und im Bereich LCD kommen 
plötzlich neue "Teile"

Hier bei handelt es sich einmal um $42 ($Nummer), wo ich davon ausgehe 
dass das "$" mit "0x" gleich zu setzen ist.

Wo ich aber nichts zu gefunden habe, oder mit zusammen reimen konnte ist 
"1<<4". Was bedeutet dieses "<<"?

von Martin (Gast)


Lesenswert?

1<<4 heißt 1 left shift um 4. also 0b00010000

von Michael D. (etzen_michi)


Lesenswert?

Muss dazu das Register bereits mit 0x01 geladen sein, oder hat man auch 
bei 0x00 ein 0b00010000?

Wenn man ein 0x03 hat, hat man dann nach 1<<4 ein 0b00110000?

von Martin (Gast)


Lesenswert?

wenn man schreibt R0 = 1<<4 dann ist egal, was in R0 drin war. 1<<4 ist 
ja eine Konstante.

von Michael D. (etzen_michi)


Lesenswert?

Also ist die 1 sozusagen eine Hex und die 4 macht "sozusagen" 4mal rol.

Sprich um 0b00110000 zu erhalten würde man 3<<4 eingeben?

von Joachim B. (jojo84)


Lesenswert?

Wenn du dir das mal näher angucken willst kannst du auch gut hier 
gucken:

http://www.mikrocontroller.net/articles/Bitmanipulation

von spess53 (Gast)


Lesenswert?

Hi

>Also ist die 1 sozusagen eine Hex und die 4 macht "sozusagen" 4mal rol.

Nein vier 'shl'.

>Sprich um 0b00110000 zu erhalten würde man 3<<4 eingeben?

Ja.

MfG Spess

von Hannes L. (hannes)


Lesenswert?

Michael Dierken schrieb:
> Muss dazu das Register bereits mit 0x01 geladen sein, oder hat man auch
> bei 0x00 ein 0b00010000?
>
> Wenn man ein 0x03 hat, hat man dann nach 1<<4 ein 0b00110000?

Nein, Du legst damit eine Konstasnte fest, in der Bit 4 gesetzt ist und 
alle anderen Bits gelöscht sind. Diese Konstante kannst Du
- zuweisen (ldi)
- verodern (ori, sbr)
- verunden (andi, cbr mit Komplement)

Die Schreibweise 1<<4 macht erst richtig Sinn, wenn man die Bitnamen 
benutzt, wie sie z.B. bei den I/O-Registern (Steuerungsregister der 
internen Peripheriemodule) verwendet werden, z.B.:

 ldi wl,(1<<refs1)|(1<<refs0)|(1<<adlar)
 sts admux,wl       ;ADC linksbündig mit interner Referenz auf ADC0

Weitere Infos erhältst Du in der Hilfe zum AVR-Studio unter 
AVR-Assembler, Direktiven.

...

von Michael D. (etzen_michi)


Lesenswert?

In dem Link sind wieder Befehle welche ich nciht verstehe/kenne:

TIMSK
TOIE1
UCSR0B
RXCIE0

Was bedeuten diese Werte/Befehle? Die Werde da nirgends 
definiert/erklärt ...

Wat .. ADC will ich glaube ich erst noch ein wenig warten bis ich weiter 
im Tutorial bin ^^...

von Hannes L. (hannes)


Lesenswert?

Doch, im Datenblatt...

Das sind die Namen der I/O-Register.

...

von spess53 (Gast)


Lesenswert?

Hi

>Was bedeuten diese Werte/Befehle? Die Werde da nirgends
>definiert/erklärt ...

Datenblatt.

MfG Spess

von Justus S. (jussa)


Lesenswert?

das sind keine Befehle, sondern Registernamen...->Datenblatt

von Christian H. (chrikrocontroller)


Lesenswert?

1<<4 bedeutet ja, dass du die ->1<- binär um 4 nach links shiftest.
Würdest du 0<<4 schreiben, dann bekämst du immer noch 0 raus.
Du kannst dir folgendes (bezüglich positiver Ganzzahlen) merken.

binär  dezimal
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000    8
1001    9
1010   10
1011   11
1100   12
1101   13
1110   14
1111   15

Schau mal, was passiert, wenn du eine Zahl nimmst und shiftest.

Nehmen wir mal 1 und shiften sie um 1 nach links, dann kommen wir auf 
die 2. Warum?
Die 1 wird ja durch 0001 dargestellt, jetzt nehmen wir das und shiften 
um 1 nach links und kommen auf 0010 (es wird von rechts ja mit Nullen 
aufgefüllt). 0010 entspricht aber der 2. Wenn man dieses Spielchen 
weiterführt, so bekommt man heraus, dass man ganz unkompliziert damit 
das "Multiplizieren mit 2" lösen kann.

1<<3 == 0001<<3 == 0010<<2 == 2<<2
2<<2 == 0010<<2 == 0100<<1 == 4<<1
4<<1 == 0100<<1 == 1000<<0 == 8<<0

Also mit anderen Worten 1<<n == 2^n (also 2 hoch n)
Und allgemeiner x<<n == x * 2^n

Sei allerdings vorsichtig mit Dingen, die geschehen können.
Solches betrifft zum Beispiel zu großes Shiften. Wenn du von 4 Bit 
ausgehst, also xxxx zur Verfügung hast, dann darfst du nicht 1<<4 
schreiben, denn das wäre 0001->0010->0100->1000->0000. Also nicht das 
gewünschte Ergebnis. Auch musst du vorsichtig sein, wenn du eine Zahl im 
Zweierkomplement darstellst, hier kommt dem LSB nämlich eine besondere 
Bedeutung zu.
Das Rechts-Shiften kann man im weiteren nutzen um das Teilen durch zwei 
Effizient umzusetzen, allerdings ist hier noch mehr Vorsicht geboten, 
denn 3>>1 gibt 1 und nicht 1,5 zurück... Außerdem kommt hier bei der 
Darstellung im Zweikomplement hinzu, dass du zwischen logischem und 
arithmetischem Shiften unterscheiden musst. Das hast du beim Linksshift 
allerdings nicht.

LG

von Michael D. (etzen_michi)


Lesenswert?

Jojo .. War eig. auch nur dazu da dass ich verstehe was da geschrieben 
ist in dem Code im Toturial.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.