mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC beim ATMega128 liefert stets 1023 (single ended I.)


Autor: Matthias Meeh (taurus1216)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

folgendes Problem:
Mein ATMega128 liefert stets bei der AD Wandlung (ADC0 bis ADC7) als 
Ergebnis 1023, gleichgültig welche Spannung am Eingang der 8 Pins liegt.

folgendes hab ich schon versucht:
- alle Pins auf Masse gelegt, dann bei jedem ADC-Pin eine AD-Wandlung 
unternommen
- das gleiche mit +5 V
- im Register ADMUX hab ich die drei gültigen Kombinationen für 
REFS1/REFS0 ausprobiert
- die getesteten MUX-Kombinationen: 0 bis 7 (also ADC0 bis ADC7)
- mit und ohne Beschaltung von AREF
Bei allen Versuchen war stets das Ergebnis im Register ADC 1023.

hier der C-code:
void AD_Conversion (uint8_t mux_dest){
  ADMUX = mux_dest;
  ADCSRA = 0xC0;
  while (!(ADCSRA&(1<<ADIF)))
   ;
  adc_result = ADC;  //Inhalt von ADC in globale Variable schreiben
  ADCSRA |= (1<<ADIF);
}

meine Hardwareconfig:
- ATMega128, betrieben an +5 V
- AVCC ist mit 100nF an GND und über 10µH an VCC angeschlossen
- AREF: Offen, über 22nF auf GND oder an +5 V (habe alle drei Varianten 
getestet)
- AGND ist mit GND verbunden

Ich lasse mir den Wert der globalen Variable "adc_result" auf einem LCD 
anzeigen. Die Anzeige ist offenbar nicht das Problem, wenn ich in 
adc_result einen beliebigen Wert statt der Zuweisung mit ADC 
hineinschreibe, wird auch dieser Wert angezeigt. Sobald aber die 
Zuweisung mit ADC stattfindet, steht immer 1023 drin.

Vielleicht kann mir jemand weiterhelfen.
Vielen Dank!

Autor: Sven K. (svenk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte es sein dass es  statt

adc_result = ADC;

so heissen muss:

adc_result = ADCW;

Gruss Sven

Autor: Sven K. (svenk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon mal das Beispiel hier unter

" Aktivieren des ADC" probiert ?


http://www.mikrocontroller.net/articles/AVR-GCC-Tu...


Gruss Sven

Autor: Matthias Meeh (taurus1216)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sven,

danke für die Infos, leider haben beide Vorschläge keinen Erfolg 
gebracht. Sowohl ADC also auch ADCW ergeben 1023. Auch die 
vorgeschlagene for-Schleife, die der ersten Messung angehängt wird 
liefert wieder nur 1023.

vg
Matthias

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> ADMUX = mux_dest;
Überschreibt dir die Einstellungen für die Referenzspannung
#define MUX_MASK 0x1F
int16_t get_adc_channel(uint8_t mux_dest){
  // schreibe nur MUXn Bits, behalte REFSm und ADLAR:
  uint8_t tmp = ADMUX;
  ADMUX  = (tmp & ~MUX_MASK) | (mux_dest & MUX_MASK);
  ADCSRA |= (1<<ADSC); /* Der ADC _ist_ doch schon an _und_ initialisiert, oder? */
  // wenn du das ADSC-Bit pollst, brauchst du kein Flag zu loeschen:
  while (ADCSRA & (1<<ADSC))
   ;
  return ADC; // globals sind bestimmt unnoetig ;)
}

hth. Jörg

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist die Vorbereitung der Ports? (Abschaltung der digitalen 
Funktionen)
Wie ist die JTAG Fuse gesetzt?
> ADCSRA = 0xC0;

Und dass soll stimmen??

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
probiers mal so



void ADC_init()
{
  ADMUX = 0x40;     //AVCC  internal , PC0 Input , Right Adjusted
  ADCSRA = 0x86;     //ADC enable , Prescaler = 64
}



unsigned int ADC_GET()
{
  ADCSRA |= 0x40;     //Startb ADC Conversion

  while ( ADCSRA & (1<<ADSC) )  //warten bis ADSC Bit gelöscht wird
  {
    ;
  }

  unsigned int ADC_Erg = ADCW;
        return(ADC_Erg);
}


falls du es unbedingt global brauchst lass die letzten beiden Zeilen weg 
und schreib adc_result = ADC; und return 0;

Gruss

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aso Code war ursprünglich fürn Atmega32, ich hoffe die Register des 
ADC's vom Atmega128 sing gleich !
Und es wird wird nur PC0 initialisiert, also falls du mehr Ports 
brauchst, die ADC_init ändern.

Gruss

Autor: Matthias Meeh (taurus1216)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo fubu1000,

danke für Deinen Vorschlag. Es funktioniert! Bin begeistert! Aber, ich 
hab noch nicht so ganz verstanden, wo mein Fehler liegt. Ist es die 
Änderung, dass die Init-Sequenz beim "hochfahren" den AD-Wandler 
einschaltet?

vg
Matthias

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.