Hallo,
ich versuche mich momentan daran mit einem ATMEGA48 auf mehreren A/D
Ports ne Wandlung durchzuführen. Der jeweils erste A/D Port geht auch
ohne Probleme - sobald ich aber einmal mit ADMUX umschalte kommt nix
dolles mehr raus. (Wohlgemerkt - vertausche ich die Reihenfolge geht der
andere Port) Hier mal mein Code - würde mich freuen wenn mir jemand
helfen könnte:
Die Definitions
1 | //definitions for AD
|
2 | #define Vcc (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0)
|
3 | //definition for OPV
|
4 | #define mess_opv (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0)
|
Init des A/D Wandlers:
1 | // AD Init //
|
2 | DIDR0 |= (1 << ADC5D) | (1 << ADC4D) | (1 << ADC3D) | (1 << ADC2D) | (0 << ADC1D) | (0 << ADC0D); //diable not needed AD Ports
|
3 | ADCSRA |= (0 << ADEN) | (0 << ADATE) | (1 << ADIF) | (0 << ADIE) |(1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0); //Leave AD disabled & prescale factor 16
|
4 | ADMUX |= (1 << REFS1) | (1 << REFS0); //Internal reference with external capacitor
|
und hier die beiden A/D Funktionen:
1 | uint16_t AD_START(void)
|
2 | {
|
3 | uint16_t ret; //for the return value
|
4 |
|
5 | ADCSRA |= (1 << ADEN); // Enable the AD
|
6 |
|
7 | ADCSRA |= (1<<ADSC); //start conversion
|
8 |
|
9 | //wait for end
|
10 | while (ADCSRA & (1<<ADSC))
|
11 | {
|
12 | }
|
13 |
|
14 | ret = ADCL;
|
15 | ret += (ADCH << 8);
|
16 |
|
17 |
|
18 | ADCSRA |= (1 << ADIF); // clear the interrupt
|
19 | ADCSRA |= (0 << ADEN); // Disable the AD (Saves power)
|
20 | return ret;
|
21 | }
|
22 |
|
23 | void MeasureAD(void)
|
24 | {
|
25 |
|
26 |
|
27 | PORTD = (1 << DDD4); //Enable OPV (nur für eine externe Beschaltung)
|
28 |
|
29 |
|
30 | ADMUX |= Vcc;
|
31 | printf("Vcc: %i\n", AD_START()); //diese geht noch
|
32 |
|
33 | _delay_ms(500);
|
34 |
|
35 | ADMUX |= mess_opv;
|
36 | printf("OPV: %i\n", AD_START()); // diese nicht mehr
|
37 |
|
38 |
|
39 | _delay_ms(500);
|
40 |
|
41 | ADMUX |= Vcc;
|
42 | printf("Vcc: %i\n", AD_START()); //diese auch nicht
|
43 |
|
44 | }
|
Aus dem Hauptprogramm wird MeasureAD gerufen. Die Wartezeiten sind
aufgrund des Debuggens drinnen. Nach meinen Verständnis sollte es auch
ohne gehen. Währe super wenn jemand helfen könnte.
Gruss Birk