A/D wanlung Problem Atmega168

Gast #1562794
Lesenswert?

Hi,

ich nutze die unten aufgeführte Funktion für eine A/D Wandlung. Nun rufe 
ich diese für 2 Kanäle mit 2 mux werten auf (Kanal0,Kanal1). Wenn ich 
sie jedoch einmal mit Kanal1 aufgerufen habe, dann bekomme ich nur noch 
Werte von Kanal 1, auch wenn ich 0 übergebe, wören kann dies liegen?

Dank Euch,
m.

uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;


  /*
                        ADMUX
                        .-----.-----.---....
                        |REFS1|REFS0|
                        '-----'-----'---...
                            |     |
                            |     |
                            |     |
       .--.               |\|     |
  AVCC |  |---------------|0 \    |
       '--'               |   |  _|_
                          |   |-------.
       .---------------.  |   |       |
       | Internal 1.1V |--|1 /        |
       |  Reference    |  |/          |
       '---------------'              |
                                      |
       .--.                           |     .-------....
  AREF |  |---------------------------o-----| A/D Conf
       '--'                                 '-------....


  .---.-------.-------.-----------------------------------------------.
  |Nb.| REFS1 | REFS0 | Voltage Reference Selecttion (23.8.1 / P.256) |
  .---+-------+-------+-----------------------------------------------.
  | 0 |   0   |   0   | AREF, Internal VRef turned off                |
  .---+-------+-------+-----------------------------------------------.
  | 1 |   0   |   1   | AVcc with external cap. at AREF               |
  .---+-------+-------+-----------------------------------------------.
  | 2 |   1   |   0   | Reserverd                                     |
  .---+-------+-------+-----------------------------------------------.
  | 3 |   1   |   1   | Int. VRef 1.1V with ext. cap. at AREF         |
  '---'-------'-------'-----------------------------------------------'
  */
  AD_REF_NB0;                       //Referenzquelle nach o.g. Tab. 
wählen

  AD_MUX_CHANNEL(mux);              //Kanal waehlen


  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler
                               // setzen auf 8 (1) und ADC aktivieren 
(1)


  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man 
liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu 
lassen" */
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten
  }
  result = ADCW;  // ADCW muss einmal gelesen werden,
                  // sonst wird Ergebnis der nächsten Wandlung
                  // nicht übernommen.

  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden 
Wandlungen */
  result = 0;
  for( i=0; i<4; i++ )
  {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
      ;   // auf Abschluss der Konvertierung warten
    }
    result += ADCW;        // Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)

  result /= 4;                     // Summe durch vier teilen = arithm. 
Mittelwert
/*
  if(result>=(last+2))
  {
    last=result;
  }
  if(result<=(last-2))
  {
    last=result;
  }
*/

  return result;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren