Forum: Mikrocontroller und Digitale Elektronik Infrarot Distanzsensor AD-Wandler, Bitte Source Code Prüfen


von Christian D. (Gast)


Angehängte Dateien:

Lesenswert?

hallo, versuche gerade mit dem ad-wandler ein analoges signal von einem
infrarot distanz sensor einzulesen und per uart an die serielle
schnittstelle zu senden, funktioniert jedoch nicht! weis nicht mehr was
ich noch tun kann, quelltext ist im anhang, habe einen atmega8 mit
integriertem ad wandler und programmiere ihn in c, bitteee sourcecode
prüfen! thx schonmal

von Rahul (Gast)


Lesenswert?

Irgendwie fehlt der Prototyp für "init".

von Dirk Dörr (Gast)


Lesenswert?

> funktioniert jedoch nicht!

Wie wäre es mal mit einer vernünftigen Fehlerbeschreibung?

von Christian D. (Gast)


Lesenswert?

also das programm soll den analogen eingangswert in einen digitalen
umwandeln und per uart senden, jedoch sendet er mir den wert des sensor
nicht ans terminal

von Dirk (Gast)


Lesenswert?

Hi,

ohne direkte Fehlerangabe sind meine Vermutungen nur aus der Glaskugel
geholt.

Deine globalen Variablen werden vom Compiler weg optimiert. Setze mal
diese auf volatile.

Globaler Interrupt enable fehlt? sei();

von Dirk Dörr (Gast)


Lesenswert?

Sehr viel besser ist die Beschreibung auch nicht.

Kommen überhaupt keine Ausgaben?
Kommen falsche Ausgaben?

Eine Vermutung ist, daß Du eine Endlosschleife in read_adc hast.

von Christian D. (Gast)


Lesenswert?

was für eine headerdatei benötige ich für sei(); ?

von Christian D. (Gast)


Lesenswert?

es kommt nur die ausgabe das die init funktion erfolgreich ausgeführt
wurde, danach kommt garnichts mehr, er reagiert also nicht mehr,

von Christian D. (Gast)


Lesenswert?

hm ich habe nun den watchdog aktiviert und das timeout auf 1 sekunde
eingestellt, und nun resettet er mir den atmega ständig also muss etwas
mit der funktion readadc() nicht stimmen, denn wenn ich die funktion
auskommentiere resettet der wd nicht!

von Dirk Dörr (Gast)


Lesenswert?

Sag ich doch.

Du hast eine Endlosschleife in Deinem readadc() => while(1){...}

von Branko Golubovic (Gast)


Lesenswert?

Hallo Christian

#define ADC_VREF_TYPE 0x00  //External VREF
 //#define ADC_VREF_TYPE 0x40  //AVCC
 //#define ADC_VREF_TYPE 0xc0  //Interne 2,56V Spannung

unsigned int read_adc(unsigned char adcinput)
{
ADMUX=adcinput|ADC_VREF_TYPE;

// Starte AD Konversion
ADCSRA|=1<<ADSC;

// Warte  bis AD Konversion fertig ist
while ((ADCSRA & (1<<ADIF))==0);

ADCSRA|=(1<<ADIF);  // Lösche ADC Interrupt Flag

return ADCW;
}

von Christian D. (Gast)


Lesenswert?

danke für die funktion, wenn ich jedoch die funktion aufrufe hängt sich
das programm wieder auf! hm...

von Christian D. (Gast)


Lesenswert?

juhuuu^^ es geht, hatte vergessen die initialisierung des ad-wandlers zu
starten. vielen dank an alle für die hilfe

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.