Hallo,
zufällig habe ich genau so was schon mal ausprobiert. Ich stell den Code mal rein. Ist zwar ziemlich viel Overhead drin (serielle Kontrollausgaben), aber ich kann den Code nicht zusammenkürzen und testen, weil ich gestern meinen Mega geschrottet habe
(12V von hinten übers Steckbrett kommt nicht so gut).
Ich hoffe der Code ist verständlich, zumindest geht daraus hervor, welche Register gesetzt werden müssen. Der Rest sollte sich aus dem Datenblatt ergeben.
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.flush();
Serial.println("\nSelect Action:\n0 - Measure A0 and A1 single ended\n1 - Measure A0 and A1 differential\n2 - Measure differential continual\n");
while(!Serial.available()){} // waiting for input on serial interface
switch(Serial.read())
{
case '0':
single_ended();
break;
case '1':
diff_mode();
break;
case '2':
diff_mode_c();
break;
default:
break;
}
}
void single_ended() {
for (int i=1; i<=10; i++) {
int sensorValue0 = analogRead(A0);
int sensorValue1 = analogRead(A1);
Serial.print(i, DEC);
Serial.print("\t");
Serial.print(sensorValue0, DEC);
Serial.print("\t");
Serial.println(sensorValue1, DEC);
}
}
void diff_mode() {
// pinMode(A0, INPUT);
// pinMode(A1, INPUT);
Serial.print("ADCSRA ");
Serial.println(ADCSRA, BIN);
Serial.print("ADCSRB ");
Serial.println(ADCSRB, BIN);
Serial.print("ADMUX ");
Serial.println(ADMUX, BIN);
ADCSRB = 0;
ADMUX = 0;
Serial.print("ADCSRA ");
Serial.println(ADCSRA, BIN);
Serial.print("ADCSRB ");
Serial.println(ADCSRB, BIN);
Serial.print("ADMUX ");
Serial.println(ADMUX, BIN);
// ADMUX |= ((1 << MUX3) | (1 << REFS0) | (1 << REFS1));
ADMUX |= ((1 << MUX0) | (1 << MUX3) | (1 << REFS0));
ADCSRA |= ((1 << ADEN));
Serial.print("ADCSRA ");
Serial.println(ADCSRA, BIN);
Serial.print("ADCSRB ");
Serial.println(ADCSRB, BIN);
Serial.print("ADMUX ");
Serial.println(ADMUX, BIN);
for (int i=1; i<=10; i++) {
ADCSRA |= (1 << ADSC);
delay(1);
while (bit_is_set(ADCSRA, ADSC));
int sensorValueL = ADCL;
int sensorValueH = ADCH;
int sensorValue = (sensorValueH << 8) | sensorValueL;
Serial.print(i, DEC);
Serial.print("\t");
// Serial.print(sensorValueH, DEC);
// Serial.print("\t");
// Serial.println(sensorValueL, DEC);
Serial.println(sensorValue, DEC);
delay(10);
}
}
void diff_mode_c() {
ADCSRB = 0;
ADMUX = 0;
ADMUX |= ((1 << MUX0) | (1 << MUX1) | (1 << MUX3) | (1 << REFS0)); // VRef = AVCC with ext Cap, ADC1 +diff, ADC0 -diff, Gain 10x
ADCSRA |= ((1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0));
Serial.println("Press any key and RETURN to stop reading");
while(!Serial.available()) {
ADCSRA |= (1 << ADSC);
// delay(1);
while (bit_is_set(ADCSRA, ADSC));
int sensorValueL = ADCL;
int sensorValueH = ADCH;
int sensorValue = (sensorValueH << 8) | sensorValueL;
// Serial.print(i, DEC);
// Serial.print("\t");
Serial.println(sensorValue, DEC);
delay(100);
}
Serial.flush(); // don't care what key was pressed
}