www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bedeutung von ldi temp, (1<<URSEL)|(3<<UCSZ0)


Autor: Karl-alfred Römer (karl-alfred_roemer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz kurz, nur damit ich weiß, dass ich es richtig verstanden
habe:

URSEL hat in der m8def.inc den Wert 7
UCSZ0 den Wert 1

1<<URSEL bedeutet dass ich eine 1 um sieben Bits nach links schiebe.
Also habe ich die 1000 0000

3<<UCSZ0 bedeutet dass ich die Zahl drei, die also die letzten beiden
Bits als 1 haben um eine Stelle nach links schiebe.
Also habe ich die 0000 0110

Diese beiden Werte werden verodert.
Also habe ich die 1000 0110.

Man hätte auch

ldi temp, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1) schreiben können

man hätte auch gleich schreiben können
ldi temp, 0b10000110

Man tut das aber nicht, weil man an den komischen Konstanten
(URSEL, UCSZ0 usw) erkennen kann, was hier genau gemacht werden
soll. (Falls man die nötiger Erfahrung hat, auswendig zu wissen,
was diese Kürzel bedeuten)

Ist das so korrekt?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Karl-alfred Römer schrieb:
> Ganz kurz, nur damit ich weiß, dass ich es richtig verstanden
> habe:
>
> URSEL hat in der m8def.inc den Wert 7
> UCSZ0 den Wert 1
>
> 1<<URSEL bedeutet dass ich eine 1 um sieben Bits nach links schiebe.
> Also habe ich die 1000 0000
>
> 3<<UCSZ0 bedeutet dass ich die Zahl drei, die also die letzten beiden
> Bits als 1 haben um eine Stelle nach links schiebe.
> Also habe ich die 0000 0110
>
> Diese beiden Werte werden verodert.
> Also habe ich die 1000 0110.

Ja, alles korrekt so.

> Man hätte auch
>
> ldi temp, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1) schreiben können

Und so schreibe ich es in meinen Programmen.

> man hätte auch gleich schreiben können
> ldi temp, 0b10000110
>
> Man tut das aber nicht, weil man an den komischen Konstanten
> (URSEL, UCSZ0 usw) erkennen kann, was hier genau gemacht werden
> soll. (Falls man die nötiger Erfahrung hat, auswendig zu wissen,
> was diese Kürzel bedeuten)
>
> Ist das so korrekt?

Die Bitnamen findet man im Datenblatt, einige merkt man sich, es gibt 
auch ein gewisses Sytem bei den Kürzeln.

Bei mir ist vieles dann Copy&Paste aus existierenden Sourcen, da tippt 
man später sowieso nicht jedesmal alles neu.

Entscheidener ist jedoch: die Bits müssen nicht bei allen AVR-Typen an 
der gleichen Position im Register sitzen...

Wenn man jetzt von einem AVR auf einen anderen portiert, macht es wenig 
Spaß, dutzende 0b10001111 zusammenzusuchen und da dann z.B. 0b01001111 
draus zu machen. Fehler wären da garantiert.

Bei den symbolischen Namen weiß aber der Assembler aus dem Typ-Include, 
wo eben URSEL gelandet ist oder mault, weil es das auf diesem Typ 
garnicht gibt.

Gruß aus Berlin
Michael

Autor: Karl-alfred Römer (karl-alfred_roemer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Michael,

es gibt mir Sicherheit, zu wissen, dass ich das jetzt richtig
verstanden habe.  Dein Aspekt mit dem Portieren auf andere AVRs
ist auch ein wichtiger Grund, der FÜR diese seltsamen Bezeichner
spricht. Habe daran noch garnicht gedacht. Vielleicht auch, weil
mir nicht bewusst war, dass die Bits sich bei den unterschiedlichen
Controllern des gleichen Herstellers an unterschiedlichen Stellen
sitzen.

Dann muss ich mich demnächst an die Arbeit machen, das System
hinter den Kürzeln herauszufinden.

VG und
Danke nochmals
Karl

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wie und warum die symbolischen Namen sinnvoll sind, wurde ja schon 
erklärt. Allerdings bin ich der Meinung, dass man nicht (3<<UCSZ0) 
schreiben sollte, sondern (1<<UCSZ0)|(1<<UCSZ1), weil sich sonst der 
ganze Sinn wieder verwässert. Leider schreibt Atmel selbst in den 
Datenblättern den Unfug mit der 3 :-/

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.