Forum: Mikrocontroller und Digitale Elektronik ATmega644 ADC


von MandA K. (Firma: MAMIMO STudios) (bastlomat)


Lesenswert?

Guten Abend,

mit folgendem Code versuche ich auf einem Atmega644 eine Spunnung zu 
digitalisieren und über UART an den PC zu senden. Die initialisierung 
des ADC soll auf Free running stehen und per Interrupt wird die Spannung 
gespeichert.
1
   
2
ADMUX = (0 << REFS1) | (0 << REFS0) ;
3
ADCSRA = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)| (1 << ADEN) |(1<<ADATE)|(1<<ADSC)| (1 << ADIE);
4
ADCSRA |= (1 << ADSC); // eine ADC-Wandlung

nur die Ausgelesene Spannung ist immer 0 egal, was ich mach.
Die Interruptroutine sieht so aus:
1
ISR(ADC_vect)
2
{
3
  Gyro_Nick=ADC;
4
}

von Julian R. (tuefftler)


Lesenswert?

>>  Gyro_Nick=ADC;
Ich bin kein C Experte aber bist du dir sicher, dass du damit den 
ADC-Wert holst, bei mir in ASM braucht man immer ADCL, bzw ADCH

Nur ein denkanstoß, ich kenn mich wiegesagt nicht mit C aus!

julian

von Karl H. (kbuchegg)


Lesenswert?

MandA K. schrieb:
>
> ADMUX = (0 << REFS1) | (0 << REFS0) ;

Sieh mal im Datenblatt nach, was das für eine Referenzspannung ist

von Karl H. (kbuchegg)


Lesenswert?

Julian R. schrieb:
>>>  Gyro_Nick=ADC;
> Ich bin kein C Experte aber bist du dir sicher, dass du damit den
> ADC-Wert holst, bei mir in ASM braucht man immer ADCL, bzw ADCH

Dass passt schon. Der Compiler weiß, wie er die beiden Register bedienen 
muss.

von MandA K. (Firma: MAMIMO STudios) (bastlomat)


Lesenswert?

Wenn ich richtig informiert bin, ist das die interne Referenzsp.
1
 ADMUX = (0 << REFS1) | (0 << REFS0) ;
ich hab das ganze mal auf die externe gesetzt:
1
    ADMUX = (0<<REFS1) | (1<<REFS0);
das Ergebnis ist aber immernoch 0.

von Pete K. (pete77)


Lesenswert?

Gib mal mehr Code. Woran siehst Du, dass 0 herauskommt?

Es kann liegen an:
- Hauptprogramm gibt eine andere Variable aus
- RS232 funktioniert nicht
- Volatile vergessen
- Kalte Lötstelle
- etc...

von Hubert G. (hubertg)


Lesenswert?

ADMUX = (0 << REFS1) | (0 << REFS0) ;
Das ist externe Referenz.

ADMUX = (0 << REFS1) | (1 << REFS0) ;
Referenz ist VCC
So steht es zumindest im Datenblatt
Hast du AVCC Pin30 und GND auf Pin 31 angeschlossen.

von Karl H. (kbuchegg)


Lesenswert?

MandA K. schrieb:
> Wenn ich richtig informiert bin, ist das die interne Referenzsp.

Du sollst dich nicht bei Dritten informieren, sondern im Datenblatt 
nachschlagen. Das und nur das ist deine einzige Autorität der du trauen 
kannst.

von MandA K. (Firma: MAMIMO STudios) (bastlomat)


Lesenswert?

Guten Abend,

ich hab nochmal die Referenzspannung überprüft bzw. die Verarbeitung des 
ADC Wertes.
Es war ein Zugriffsfehler auf die Variable mit dem ADC Inhalt! Jetzt 
wandelt er brav vor sich hin!

Danke für eure Bemühung.

Grüße,
Manu

von Thomas E. (thomase)


Lesenswert?

MandA K. schrieb:
> Gyro_Nick=ADC;

volatile?

mfg.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.