www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC beim atmega32 liefert 0


Autor: Ulrich Leutner (kaschpal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

leider habe ich ein Problem beim Auslesen des ADC mit meinem mega32:
Der returnwert von read_sensor ist immer null, egal, was am Port 
anliegt.

- Spannung direkt am Pin überprüft, liegt was an
- unterschiedliche Spannungen ausprobiert
- porta0 - porta7 durchprobiert
- Nur lesen von ADCH ausprobiert
- Takt 10 MHz

Code habe ich angehängt:
extern void init_sensor()
{  

  // adc freischalten
  ADCSRA = (1 << ADEN);


  // Frequenzteilerverhältnis auf 1/128
  ADCSRA |= (1 << ADPS2) | (1 << ADPS1) |  (1 << ADPS0);


  /* Kanal einstellen */
  ADMUX = SENSOR;             // SENSOR == 7

  
  /* Interne Referenzspannung 2.56 V */
  ADMUX |= (1 << REFS1) | (1 << REFS0);


}


extern uint16_t read_sensor()
{  
  uint16_t  result;



  
  init_sensor();

  // Messung anstoßen  
  ADCSRA = (1 << ADSC);


  // warten, bis Messung komplett
  while (ADCSRA & (1 << ADSC)) ;


  result = ADCL;
  result += (ADCH << 8);


  return result;

}

Tja, ich hoffe, jemanden von Euch ist das Problem bekannt, ich
weiss langsam wirklich nichte mehr weiter ... (adc kaputt??)

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ulrich Leutner wrote:

>   // Messung anstoßen
>   ADCSRA = (1 << ADSC);     <- Da setzt du nur das ADSC Bit, löschst aber alle 
anderen

Autor: Ulrich Leutner (kaschpal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhhh! Himmel! Stimmt, danke.

Bloss die schlechte Nachricht, es geht immer noch nicht.
Ich habs auch schonmal im freilaufenden Betrieb probiert, das war dann 
das gleiche ...

Inzwischen hab ich mir auch noch einen zweiten µC (baugleich) 
ausgeliehen, bei dem gehts auch nicht, also wird der ADC wohl nicht 
defekt sein ...

Autor: Ulrich Leutner (kaschpal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommando zurück: jetzt funktionierts. Keine Ahnung was sich jetzt 
verändert hat, aber jetzt gehts :)

Danke für die schnelle Antwort!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> result = ADCL;
> result += (ADCH << 8);
Mach das nicht von Hand. Der Compiler kennt dafür ein 16-Bit-Register 
(ADC oder ADCW), das Du ohne großes Trara direkt in die entsprechende 
Variable übernehmen kannst, ohne dass Du Dich auch noch um die 
Zugriffsreihenfolge kümmern musst (die hier aber zufällig stimmt)...

Autor: Ulrich Leutner (kaschpal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, danke für den Tipp, mag auch schönen Code :)

Ich hab jetzt bloss grad die lezten 2 Stunden zwischen Datenblatt, den 
zwei Tutorials und anderen Codefetzen hin&hergewurschtelt und so war ich 
mir sicher, dass in der Variablen wenigstens IRGENDWAS steht, wenns 
funktioniert ...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier:
result += (ADCH << 8);
... klappt zwar in diesem Fall, weil Du Glück hast, dass es die Integer 
Promotion gibt. Aber grundsätzlich sollte man einen Wert, bevor man ihn 
über seinen eigenen Wertebereich hinaus verschiebt, auf den Zieldatentyp 
erweitern. Würde der Compiler nämlich nicht automatisch das auf der 
rechten Seite vom "=" nach int erweitern, käme immer 0 raus. Also besser 
auf Nummer sicher und
result += ((uint16_t) ADCH) << 8;
(abgesehen von oben gesagtem, nur als zusätzlicher Tipp).

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.