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