www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik << Zeichen, Bedeutung


Autor: Fert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich hab die Erklärung schon mal irgendwo gesehen, finds aber net
mehr... was bedeutet z.B. die Zeile
        ldi temp, (1<<URSEL)|(3<<UCSZ0)

?

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'<<': Linksshift
'>>': Rechtsshift

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal in die Hilfe des AVR-Studios.
(Help, Tools, AVR-Assembler2, Operatoren... oder so ähnlich)

Unterem Strich machst du durch Linksschieben der 1 um den Wert des
genannten Bits (0..7) die entsprechende Zweierpotenz (aus 0 wird 1, aus
7 wird 128), die du brauchst um das entsprechende Bit in einem Register
zu setzen (Bitmaske, Wert 0..255).

Noch mehr vereinfacht betrachtet:
Mit ldi temp,1<<xy setzt du das Bit xy in Temp. Wenn du mehrere Bits
setzen willst, dann musst du die entsprechenden Terme OR-verknüpfen.
Das macht der Operator '|', dessen Erklärung auch in der Hilfe zum
AVR-Assembler zu finden ist. Und damit nur die kompletten Terme verORt
werden, müssen die Terme in Klammern gefasst werden.

Es ist wie Mathematik in der Unterstufe, nur eben binär...

Bit- & Bytebruch...
...HanneS...

Autor: Stefan Sczekalla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fert,

um der Ausführung von HanneS noch etwas hinzuzufügen:

... mit (1<<URSEL) kannst Du zwar das URSEL Bit setzen, Du kannst aber
keine "0" hineinschieben um das URSEL Bit zu löschen.

Grüße,

Stefan

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig...

Aber bei LDI sind alle nicht gesetzten Bits sowiso gelöscht. Bei ORI
ist das schon etwas Anderes.

Das URSEL-Bit ist ja eigentlich nur eine Art Umschalter, da die Adresse
doppelt vergeben ist. Bei nicht gesetztem URSEL-Bit wird das obere Byte
des Baudratenregisters angesprochen, bei gesetztem URSEL landen die
Daten (die restlichen Bits des Bytes) im Steuerregister.

Ich hoffe, nun ist die Verwirrung komplett... ;-)

...

Autor: Winni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also bedeutet

(1<<URSEL) = 1000 0000 , da URSEL=7 also das Bit 7 (laut m8515.def)



(3<<UCSZ0) = ??
UCSZ0 ist eine 1 (laut m8515.def)

aber was sagt die 3 ?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber was sagt die 3 ?

Dass du eine '3' (0b00000011) um den Wert von 'UCSZ0' nach links
schiebst, also zwei Bits (UCSZ1 und UCSZ0) setzt. Aber solche
Konstrukte verwende ich auch nicht gerne.

...

Autor: Fert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke, ich habs jetzt verstanden
warum nur so kompliziert...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> warum nur so kompliziert...

Damit man beim Lesen des Quelltextes nicht im Datenblatt nachschaun
muss, welche 'Schalter' nun gesetzt werden.
LDI temp,1<<adlar
out admux,temp
sagt nunmal bedeutend mehr aus, als das setzen kryptischer Zahlen, egal
ob diese nun binär, hexadezimal, oktal oder dezimal angegeben werden.

...

Autor: Fert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber ohne im include-file nachzuschauen geht doch auch nix....
oder seh ich das falsch?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Trick besteht eher darin, dass die Bezeichnungen
im Include-File identisch sind mit den Bezeichnungen
im Datenblatt.
D.h. der normale Weg geht ja eher so: Im Datenblatt
des Prozessors nachlesen wie den das Register mit
der gewuenschten Funktionalitaet heist, bzw. wie
das Bit in ihm heist. Dann hast Du 2 Moeglichkeiten:
entweder du benutzt die 1<<adlar Schreibweise, um das
Bit namens 'adlar' zu setzen oder du setzt dich hin
und rechnest dir den binaeren Wert aus, was besonders
bei mehr als 1 Bit in einem Register setzen
  1. fehleranfaellig
  2. nicht selbstdokumentierend
ist.

Bei
     1 << ADMUX

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber ohne im include-file nachzuschauen geht doch auch nix....
> oder seh ich das falsch?

Das include-File definiert die Bezeichnungen, die auch das Datenblatt
benutzt.

Und wenn man die oft genug gelesen/gehört hat, dann prägen sich diese
Bezeichnungen auch ein. Meist hilft auch das Ausdrucken der Tabelle mit
den I/O-Registern (Register Summary), da stehen alle Namen der
I/O-Register und deren Bits drin, und meist auch noch die Seitenangabe,
wo diese Register genauer erklärt sind. Diese Liste sollte man als
Anfänger grundsätzlich in Papierform neben dem Rechner haben, das
erspart viel Sucherei im zusätzlich geöffnetem Datenblatt-PDF.

...

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.