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) ?
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...
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
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... ;-) ...
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 ?
> 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.
...
> warum nur so kompliziert...
Damit man beim Lesen des Quelltextes nicht im Datenblatt nachschaun
muss, welche 'Schalter' nun gesetzt werden.
1 | LDI temp,1<<adlar |
2 | 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. ...
aber ohne im include-file nachzuschauen geht doch auch nix.... oder seh ich das falsch?
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
> 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. ... ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.