mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik A/D wanlung Problem Atmega168


Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal das Makro  AD_MUX_CHANNEL

Ich wette, es ist so geschrieben, dass es nur Bits setzen aber nicht 
mehr löschen kann.

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl Heinz,

ich habe den code irgendwann einfach mal hier aus dem Forum geholt, 
meine ich. Keine Ahnung wo das Makro liegt, muss dabei sein. Ich habe 
eben gegoogelt und:

Beitrag "ADC Rutine vom GCC-Tutorial"

das gefunden, makro ersetzt - läuft.

danke.

m.

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich torf:

hier:

#define AD_MUX_CHANNEL(y)   ADMUX |= (y&0x3f)

ja ja..

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab nun doch das Makro verbessert...

#define AD_MUX_CHANNEL(y)   ADMUX=(ADMUX&0xc0)|(y&0x3f)


danke nochmal...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.