Eine Funktionjn zu schreiben ist sicherlich die bessere Wahl.
Allerdings muss man als C-Programmierer auch mit Makros umgehen können.
Dabei lässt man sich immer vom Gedanken leiten: Makros sind einfach nur
eine Textersetzung. Makros sind einfach nur eine Textersetzung. Makros
sind einfach nur eine Textersetzung.
Nicht mehr.
Das bedeutet bei der Entwicklung eines Makros:
Die erste Frage lautet nicht: wie muss ich das schreiben?
Sondern die erste Frage lautet: was muss eigentlich nach der
Textersetzung rauskommen?
in deinem Fall.
Im Endeffekt muss nach der Textersetzung rauskommen
1 | int main()
|
2 | {
|
3 | ...
|
4 | ADMUX &= 0b00010000;
|
5 | ADCSRB &= 0b00100000;
|
6 | ...
|
soweit so gut. C erfodert von dir nicht, dass du jede Anweisung in eine
neue Zeile schreibst. d.h. du darfst das auch so schreiben.
1 | int main()
|
2 | {
|
3 | ...
|
4 | ADMUX &= 0b00010000; ADCSRB &= 0b00100000;
|
5 | ...
|
Nachdem jetzt klar ist, wie eigentlich das Ergebnis aussehen soll,
überlegt man sich, weche Textersetzung man haben möchte, so dass der
Zieltext sich einfacher präsentiert.
Anstatt dem ganzen Wust, möchtest du gerne schreiben
1 | int main()
|
2 | {
|
3 | ...
|
4 | SET_ADC;
|
5 | ...
|
jetzt ist es aber leicht zu sehen, welcher Text durch welchen anderen
Text ersetzt werden soll. Wenn in der letzten Version der Text "SET_ADC"
durch den Text "ADMUX &= 0b00010000; ADCSRB &= 0b00100000" ersetzt
wird, dann entsteht nach der Textersetzung genau das richtige.
Daher
1 | #define SET_ADC ADMUX &= 0b00010000; ADCSRB &= 0b00100000
|
2 |
|
3 | int main()
|
4 | {
|
5 | ...
|
6 | SET_ADC;
|
7 | ...
|
erzeugt genau das, was du willst.
Laut den Regeln darf allerdings ein Makro auch über mehr als 1 Zeile
gehen. Alles was dazu nötig ist, ist das man in die letzte Spalte einer
Zeile einen '\' reinschreibt.
1 | #define SET_ADC ADMUX &= 0b00010000; \
|
2 | ADCSRB &= 0b00100000
|
3 |
|
4 | int main()
|
5 | {
|
6 | ...
|
7 | SET_ADC;
|
8 | ...
|
Am Prinzip der Textersetzung ändert sich dadurch nichts. Immer noch
sorgt das Makro dafür, dass im eigentlichen Code der Text "SET_ADC"
durch einen anderen Text ersetzt wird. Und nach wie vor ist das Ergebnis
dieser Textersetzung genau das gewünschte.
PS: die Schreibweise 0b00010000 ist an dieser Stelle Müll. Anstatt sich
da Gedanken darüber zu machen, wie man einen 2-Zeiler durch etwas
kürzeres ersetzen kann, solltest du dir lieber Gedanken machen, wie du
diese Binärkonstante besser schreiben kannst. Nicht umsonst hat dir
Atmel in den Header Files die ganzen Bitnamen vordefiniert. Benutze sie!