Hallo
Ein kleiner Testcode
Code:
#define BATTERIE (1 << MUX0) | (1 << MUX2)
int main(void)
{
setLEDs(0);
ADMUX |= BATTERIE;
setLEDs(255);
ADMUX |= 5;
wird wie folgt übersetzt
Code:
29 .LM2:
30 0008 80E0 ldi r24,lo8(0)
31 000a 0E94 0000 call setLEDs
32 .LM3:
33 000e 87B1 in r24,39-0x20
34 0010 8560 ori r24,lo8(5)
35 0012 87B9 out 39-0x20,r24
36 .LM4:
37 0014 8FEF ldi r24,lo8(-1)
38 0016 0E94 0000 call setLEDs
39 .LM5:
40 001a 87B1 in r24,39-0x20
41 001c 8560 ori r24,lo8(5)
42 001e 87B9 out 39-0x20,r24
43 .L2:
Die setLEDs(); dienen der Orientierung im Assemblerlisting. Schön zu sehen ab LM3/5: Lesen des Ports, Wert verodern, schreiben. Wie man sieht, ist es egal, wie man es formuliert, es ist immer 5.
Wenn man wirklich nicht weiß, welche Spannungsreferenz und welche Bündigkeit das Ergebniss haben soll, dann weiß man sicher auch nicht, welcher ADC-Kanal zuvor ausgewählt war. Deshalb sollte man die MUX0-4 wenigstens löschen bevor man sie mit |= setzt. Oder man definiert BATTERIE etwas um:
#define BATTERIE2 (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (1 << MUX0) | (1 << MUX2)
und mit
ADMUX = BATTERIE2;
ergibt das dann diesen Code:
ldi r24,lo8(69)
out 39-0x20,r24
Gruß
mic
Lesezeichen