www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC am ATMeha644p geht nicht


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bekomme den ADC an meinem ATMega644p nicht zum laufen. Hier mein 
Code:
#include <stdlib.h>
#include <avr/io.h>
#include "uart.h"      

#define F_CPU 16000000L

void main(void)
{
//init UART
  uinit();
  //ADC aktiv, ADC starten, Freerunning mode, Prescaler = 128
  //ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADPS0 ) | (1<<ADPS1) | (1<<ADPS2); 
  ADCSRA=(1<<ADSC)|(1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
  //ADC auf Pin 1
  ADMUX = 0x01;
  //interne 2.56 Volt Ref., 
  ADMUX = (1<<REFS1) | (1<<REFS1);
    uint16_t x;
  char text[4];
    while(1)
    {
    x = ADCL;
    x += (ADCH<<8);
    itoa(x, text, 10);
    uputs(text);
    uputs("\n\r");
    }
}

Ich verwenden ein STK500. An den Pin PA1 habe ich ein Poti als 
Spannungsteiler geschaltet. Egal was ich dort einstelle, über die 
serielle Schnittstelle wird immer nur 1023 ausgegeben.

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit dem ADMUX = (1<<REFS1) | (1<<REFS1);
stellt du den ADC wieder auf 0.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach dem Start der Conversion (ADSC-Bit) musst du warten, bis die 
Wandlung fertig ist.
Ausserdem:
Natürlich ZUERST den Mux-Input+Referenz auswählen, DANN den Wandler 
starten.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Bei dieser Reihenfolge ändert sich leider auch nichts.
  //ADC auf Pin 1
  ADMUX = 0x01;
  //interne 2.56 Volt Ref., 
  ADMUX = (1<<REFS1) | (1<<REFS1);
  //ADC aktiv, ADC starten, Freerunning mode, Prescaler = 128
  //ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADPS0 ) | (1<<ADPS1) | (1<<ADPS2); 
  ADCSRA=(1<<ADSC)|(1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);

@Hubert:
> Mit dem ADMUX = (1<<REFS1) | (1<<REFS1);
> stellt du den ADC wieder auf 0.

Aber so stelle ich doch auf interne Ref.spannung um, oder?

@Ernst:
wenn es "nur" am warten liegt, sollten doch nur die ersten Werte falsch 
sein. Es wird aber dauern 1023 ausgegeben.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:

>
> Aber so stelle ich doch auf interne Ref.spannung um, oder?
>

und den Kanal auf 0

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinst Du so:
  //interne 2.56 Volt Ref., 
  ADMUX = (1<<REFS1) | (1<<REFS1);
  //ADC auf Pin 1
  ADMUX = (1<<MUX0);
  //ADC aktiv, ADC starten, Freerunning mode, Prescaler = 128
  ADCSRA=(1<<ADSC)|(1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
kommt aber noch immer 1023 raus...:-(

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:
> Meinst Du so:

nein...

jetzt stellst du wieder auf ext. Referenz um UND wählst Kanal0 (MUX0) 
um...

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

Bewertung
0 lesenswert
nicht lesenswert
Klartext: Mit der zweiten Zuweisung an ADMUX überschreibst Du den Wert 
von der ersten Zuweisung! Ist das so schwer zu verstehen?

Schau Dir mal den Artikel Bitmanipulation genauer an...

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das wäre dann so, oder?:
{c]
  //interne 2.56 Volt Ref., ADC auf Pin 1
  ADMUX = (1<<REFS1) | (1<<REFS1) | (1<<MUX0);
  //ADC aktiv, ADC starten, Freerunning mode, Prescaler = 128
  ADCSRA=(1<<ADSC)|(1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
[/c]
immer noch 1023...

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

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht mal dran denken, dass man erstmal warten sollte, bis der ADC 
mit seiner Wandlung fertig ist, bevor man das Ergebnis ausliest. Steht 
alles im AVR-GCC-Tutorial inkl. Codebeispielen...

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder du schreibst  ADMUX = (1<<REFS1) | (1<<REFS1) | (1<<MUX1);
oder ADMUX |= (1<<MUX1);
ADC erst abfragen wenn ADIF gesetzt ist, ansonst ist der Wert 
undefiniert oder alt.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> du schreibst  ADMUX = (1<<REFS1) | (1<<REFS1) | (1<<MUX1);
Sollte das nicht MUX0 am Ende sein wenn ich Pin1 abfragen will?
Egal, es bringt beides nur 1023.

> ADC erst abfragen wenn ADIF gesetzt ist, ansonst ist der Wert
undefiniert oder alt.

Ich wollte den Code auf ein absolutes Minimum beschränken um den Fehler 
zu finden / zu verstehen.

Wenn der Wert alt oder undef. ist, müste ja mal was anderes als 1923 
rauskommen. Darum denke ich, dass ich noch was anderes falsch mache.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:
>> du schreibst  ADMUX = (1<<REFS1) | (1<<REFS1) | (1<<MUX1);
> Sollte das nicht MUX0 am Ende sein wenn ich Pin1 abfragen will?

was den nun, Pin 1 oder A1

hast du denn überhaupt mal nachgemessen, was an dem Pin anliegt?

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast in deinem ersten Beitrag geschrieben PA1, das ist MUX1.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> was den nun, Pin 1 oder A1
PA1, nach Datenblatt ist das ADC1.


> hast du denn überhaupt mal nachgemessen,
> was an dem Pin anliegt?

Ja, habe ich. Eine Spannung die ich mit einem Poti von 0V bis 4,9V 
verändere ohne dass sich mein "gemessener" Wert ändert.

Sorry für die vielleicht dummen Fragen und danke für die Gedult ;-)

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du hast in deinem ersten Beitrag
> geschrieben PA1, das ist MUX1.

ist das nicht so:

MUX2 MUX1 MUX0
0    0    0    = PA0
0    0    1    = PA1
0    1    0    = PA2
usw.?

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, richtig, war mein Fehler.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf dem STK500 steckte der Jumper AREF noch. Wenn ich ihn entferne geht 
es. Ich dachte mit dem Umschalten auf interne Referenzspannung:
ADMUX = (1<<REFS1) | (1<<REFS1)

wäre der Jumper bedutungslos.

Danke an alle und sorry, dass ich das mit dem Jumper nicht eher abgklärt 
habe.

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.