...genau weil man es den leuten Einfach machen will sind die #defines so aufgebaut damit ich (1<<Mux0) |(1<<Mux1) |(1<<Mux2) |(1<<Mux3) |(1<<Mux4) machen kann. Klar kannst du beim ADC auch = 5 machen, in dem falle ist es schön, dass es dann auf Kanal 5 geht
(Mach aber mal etwas mit ner Uart oder sonstigen Registern ..)...
Ich mache das nicht, weil 5=ADC5 ist, sondern weil es Mode 5, also die 6te Zeile in der Tabelle ist.
Hmm.. UART0, ok... (ich hab hier grad das DB des 88er in der Hand, beim 8er sollte es ja ähnlich sein:
UDR0 - da machts keinen Sinn
UCSR0A und UCSR0B ebenso
UCSR0C - hier gibts die Bits UMSEL01 und UMSEL00 for den Operation Mode, dazu die Tabelle mit Mode 0=async, 1=sync, 2=reserved, 3=MSPIM. Wenn Du Dir also Deinen Mode rausgesucht hast, kannst Du Dir den als Preprozessor-Konstante definieren (.equ), und im späteren Programm verwenden:
Code:
LDI tempregister, (DeinMode<<UMSEL00) ' ggf + weitere zu setzende Bits (|)
OUT UCSR0C, tempregister
Dasselbe dann beim Parity Mode (UPMN0)
Vorsicht ist bei der Anzahl der Datenbits gegeben - UCSZ02 befindet sich in UCSR0B - allerdings wird das lediglich bei 9 Databits benötigt, also eher selten. Genau genommen braucht man hier eh nie viel machen, da meist die defaultwerte des Registers passen.
UBRR0H/L - da man hier üblicherweise eh erst den Wert ausrechnet, kann der auch als ganzes in die Register eingetragen werden (wobei man das Ausrechnen bei vorgegebener Rate und Prozessertakt und so auch den Preprozessor machen lassen kann - mehr oder weniger gut)
...Zudem gibt unter Programmierern auch einen Programmierstil
und ein Sourcecode in dem Register direkt beschrieben sind tragen nicht umbedingt der Lesbarkeit zu =)....
Mache ich doch gar nicht. Ich fasse nur sinnig (!) zusammen. Warum soll "Bit MUX2 und Bit MUX0 und vielleicht noch weitere Bits (zusammen) gesetzt" einfacher zu lesen sein, als "alle Bits für MultiplexerMode5 und vielleicht noch weitere Bits/Modes (zusammen) gesetzt"? Insbesondere, wenn die Modes als Preprozessor-Variable... aber das hatten wir ja schon
...Bsp. 3
Code:
ADMUX = (1<<REFS0) | (1<<MUX0) | (1<<MUX2) ;
-> oh ja also er setzt zwei Mux register und ein Refs0, da ich schon mal mit nem Atmel gearbeitet hab weiß ich, dass es die Referenz sein muss und ein Mux Kanal....
Ist ja bei mir dasselbe, nur daß ich nicht mehr in der Tabelle suchen muß, sondern gleich die Zeilennummer hab
...Auch wenn beim ADC z.b. die 5 = Kanal 5 gibt ... mit ner 0x45 weißt immer noch nicht wass mit der 0x40 gemeint ist ...
man sollte in einem Programm eine Schreibweise haben, was machst jetzt wenn noch ne Uart und nen Timer dazu kommen dann wird das ganze etwas bunt .. ?!?...
eine 0x45 brauchste nicht zu shiften, so lange Tabellen gibts mMn nicht. Letztendlich sehe ich das auch eher so wie Dino, wobei ich das Zusammenfassen von zusammengehörenden Bits (Tabellen im DB) schon als "eine Schreibweise" empfinde. Letztendlich ist das genau dasselbe, wie das (Preprozessor-) shiften von Einzelbits. Ob ich sonst Hex-, Dezimal- oder Bitschreibweise verwende, kommt auch darauf an, was dieser Wert bedeutet. Da ich als Nichtinformatiker nicht in Hex- bzw Bitwelten aufgewachsen bin, rechne ich mit dezimalen Zahlen, wenn aber zB an einem Port gleichzeitig mehrere Pins den Zustand ändern sollen (hi/lo/pullup/offen), ist mir das Aufzählen und Shiften der einzelnen Bits auch zu umständlich. (Ich drucke mir als Haptiker meine Programme teilweise auch manchmal aus - da werden die Zeilenumbrüche bei 8 einzeln geshifteten Portbits auch nicht leserlicher.
...Wenns total unsauber machen willst machst es am bessten noch so
Code:
ADMUX = (1<<REFS0);
ADMUX |= 5;
Das ist C, gell? (auch wenn's in Bascom sicher ein ähnliches "Read Modify Write" ergeben würde.) Warum willst Du sowas machen? In Assembler halst Du das doch auch erst dem Preprozessor auf, und schiebst es dann ins Zielregister.
...und wieso ich sage unsauber ist ganz einfach ...
Code:
ADMUX = (1<<REFS0) | (1<<MUX0) | (1<<MUX2) ;
ergibt in ASM
Code:
544: ADMUX = (1<<MUX0) | (1<<MUX2) | (1<<REFS0);
+00000204: E485 LDI R24,0x45 Load immediate
+00000205: B987 OUT 0x07,R24 Out to I/O location
schöne 2 Instruktionen ......
Hmm... MUX0 und MUX2 gesetzt sind Mode 5. Bei mir wären das letztendlich exakt dieselben Zeilen, da der Preprozessor logischerweise auf dieselben Werte kommen sollte. Richtig ordentlich sollte es sein, wenn Du alle Möglichkeiten des MUX als Preprozessor-Variable definierst, und dann zB "(ADC5<<MUX0)|(AREF<<REFS0)" als immediate lädst. Aber das wäre letztendlich auch nur eine Erweiterung meiner Schreibweise.
Den Rest muß ich sicher nicht mehr kommentieren - das ist ein typisches Hochsprachenproblem...