Forum: Mikrocontroller und Digitale Elektronik kein ADC Wert trotz anliegender Spannung


von Dima B. (tamborine)


Lesenswert?

Hallo zusammen :)

nachdem ich nun bereits seit mehrere Stunde daran zu verzweifeln 
scheine, habe ich mich kurzerhand hier angemeldet und hoffe auf eure 
Hilfe. Ich möchte mithilfe eines NTC Thermistors und einem Arduino die 
Temperatur messen. Der Aufbau ist einfach ein Spannungsteiler, bestehend 
aus dem NTC und einem Widerstand, der bei Referenztemperatur des NTC den 
gleichen Widerstand hat. In der Mitte greife ich die Spannung ab und 
führe sie auf einen analogen Input.
Gemessen habe ich die Spannung nicht, aber es ist auf jeden Fall eine 
Vorhanden (<5V), da ich zum Test eine LED dazwischen gesteckt habe. 
Leider ist der ADC Wert immer 0, was übersehe ich hier? ^^
Vielen Dank

der Code:
#include <avr/io.h>
#include <avr/interrupt.h>

//unsigned int counter = 5;
unsigned int testVariable = 0;

void setupADC()
{
    ADMUX = (1 << REFS0) | (1 << MUX0) | (1 << MUX2);
    ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS0) | (1 << ADPS1) |
    (1 << ADPS2); //ADC 5 aktivieren
    DIDR0 = (0 << ADC5D);
    startConversion();
}

void startConversion()
{
    ADCSRA |= (1 << ADSC);
}
int main(void)
{
   setupADC();
   sei();
   while(1)
   {

   }
}

ISR(ADC_vect)
{
    testVariable = ADC;
    startConversion();
}

von Blinky (Gast)


Lesenswert?

Der ADC muss im zunächst Power Reduction Register (PRR) aktiviert 
werden.

von Nöö (Gast)


Lesenswert?

Blinky schrieb:
> Der ADC muss im zunächst Power Reduction Register (PRR) aktiviert
> werden.

Steht das so im Datenblatt ? - Nöö

von Dima B. (tamborine)


Lesenswert?

Danke für den Hinweis, aber ich erhalte weiterhin keinen Wert :/

von Nöö (Gast)


Lesenswert?

Stichwort volatile von testVariable.

von Nöö (Gast)


Lesenswert?

Da dein "Programm" nichts mit den Daten/ Vatriablen macht, kann der 
Compiler sie auch entfernen.

von Dima B. (tamborine)


Lesenswert?

Super, es tut endlich - Vielen Dank! Ich musste lediglich "volatile" vor 
meine testVariable schreiben.

: Bearbeitet durch User
von Dima B. (tamborine)


Angehängte Dateien:

Lesenswert?

Ok, es funktioniert wohl doch nicht. Das ADC Register wird gar nicht 
beschrieben.. Im Anhang habe ich ein Bild von der Situation

von Jannik (Gast)


Lesenswert?

Wenn du ein Breakpoint in der ISR platzierst, springt er da hin? 
Compileroptimierung mal ausgeschaltet?

von Dima B. (tamborine)


Lesenswert?

ja, er springt in die Interrup Routine. Habe auch mal alle Optimierungen 
des Compilers deaktiviert. ADC bleibt aber unverändert

von Flachpfeife (Gast)


Lesenswert?

Allenfalls den ADC erst Mal ohne Interrupt laufen lassen.

Was fuer Debug Anstrengungen wurden denn bisher unternommen ?

Ich wuerde mal sehen wollen wie oft der ADC sich selbst wieder startet. 
Stimmt die Wandlungsrate mit den erwarteten Zeiten ueberein ?

von Dima B. (tamborine)


Angehängte Dateien:

Lesenswert?

ich habe den ADC jetzt nicht in einem Interrupt abgefragt, sondern 
gleich nach dem Start die Wandlung machen lassen.
Das ADIF (ADC Interrupt Flag) ist auch gesetzt. Laut Doku wird dieses 
Bit gesetzt, wenn die Konversion durchgeführt wurde. Im ADC Register ist 
aber weiterhin kein Bit gesetzt.
Mit den Wandlungsraten kenne ich mich nicht aus. Ich habe den Division 
factor auf 128 gesetzt. Was muss ich hier beachten?

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.