Forum: Compiler & IDEs ATMega16 ADC Abfrage macht Probleme


von Gerhard H. (oderlachs)


Lesenswert?

Hallo Kenner des Fachs !
Ich habe in einem grösserem Projekt mit serieller Ausgabe der Werte , 
Probleme mit der ADC Abfrage...Neben der Zeitabfrage,mit 
TWI/DS1307,Temperaturmessung mit 1-Wire DS18B20, benötige ich eine ADC 
Umwandlung für eine Füllstandsmessung.

Nun Habe ich ein Problem, dass, wenn ich die ADC Funktion aktiviere, die 
RTC Afrage oder(?) die serielle Ausgabe versagt.

Ich hab den Code auf meinem Webspace als Zip gelegt:
(es ist ein AVR-Studio 4.xx Projekt)
http://oderlachs.de/forum/ATM_16_Clock.zip

Hier ist nur RTC, USART und ADC bislang eingebunden..
Vielleicht schaut es sich mal wer an und kann mir helfen..irgendwie hab 
ich da "Brett vorm Kopf" ;)

Gruss & Danke

Gerhard

Ich hoffe das ich alles gut kommentiert habe im Code

von holger (Gast)


Lesenswert?

>  UCSRB = (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);

RX Interrupt freigeschaltet ohne einen Interruptvektor
im Programm. Da muss man sich über komisches Verhalten
nicht wundern.

von Gerhard H. (oderlachs)


Lesenswert?

Danke für den Hinweis, muss mich da bestimmt versehen haben beim Tippen 
, werde nochmals nachlesen was ich da schreiben muss...

Habe nochmals die Zip aktualisiert und hoch geladen, weil da fehlte ja 
noch was...aber nun egal muss ja den Fehler erst ausbügeln... ;)

Gruss und dank

Gerhard

von holger (Gast)


Lesenswert?

In Free Running mode, a new conversion will be started immediately after 
the conversion completes, while ADSC remains high.

Das ist dein Problem.

von Gerhard H. (oderlachs)


Lesenswert?

Danke Dir ...muss nur noch sehen wie ich das in meinen deutschen Kopp 
bekomme, das English ist bei mir sehr mangelhaft, hatte Russisch lernen 
müssen(!)

Gruss
Gerhard

von Karl H. (kbuchegg)


Lesenswert?

Auf Deutsch:
vergiss doch bitte den Free Running Modus. Den braucht keiner!

Deine Start_ADC Funktion sieht doch auf den ersten Blick nicht schlecht 
aus. Wird die Funktion aufgerufen, dann startet sie den ADC, wartet bis 
der fertgi ist und liefert das Ergebnis. Wozu brauchst du da noch einen 
Free Running Modus?

Das Problem ist in deiner Funktion der Teil "Warten auf das Ergebnis". 
Diese Abfrage funktioniert im Free Running Modus nicht. Denn in diesem 
Modus wird der ADC nie "fertig". Sobald er ein Ergebnis hat, startet er 
die nächste Wandlung. Wenn du also den ADC abfragst, dann meldet der 
pflichtbewusst: Ich buddle (noch). Woraufhin deine Start_ADC darauf 
wartet, das der ADC sich mal melden würde "So, isch haben fertig". Nur 
passiert das eben nie.

Vergiss den Free Running Modus. Den braucht man nur ganz selten und nur 
dann, wenn es wirklich wichtig ist, dass man so schnell wie möglich und 
so kurz hintereinander wie möglich Messwerte kriegt. Aber dann muss man 
das ganz anders programmieren (mit Interrupts).
In deinem Beispiel bringt dir Free Running genau gar nichts.

von Walter Tarpan (Gast)


Lesenswert?

Karl Heinz schrieb:
> vergiss doch bitte den Free Running Modus. Den braucht keiner!

Schon das zweite Mal in fünf Jahren, daß ich Dir widersprechen muß :-). 
Ich finde den total nützlich, wenn ich eine möglichst schnelle Regelung 
implementieren will. Dann stellt der ADC-Interrupt auch direkt den 
Systemtimer, aus dem alle anderen periodischen Funktionsaufrufe 
"herausgeteilt" werden.

Aber das war OT. Für das Beispiel oben taugt der wirklich nicht.

von Gerhard H. (oderlachs)


Lesenswert?

Euch Allen sag ich vielen herzlichen Dank für alle Hinweise !!

Ich werde mal alle Hinweise berücksichtigen...und weiter versuchen.
Ich arbeite nach dem Buch von Sven Feldkord :
"Einführung in die C_Programmierung mit dem ATMega32"...danach habe ich 
meine Beispiele ausgearbeitet.
Natürlich habe ich auch die ATMEL-Datenblätter verwendet, da sind ja 
auch Codebeispiele drinnen..nur eben die englische Beschreibung verstehe 
ich nicht immer so ganz..

Danke und Gruss

Gerhard

von Karl H. (kbuchegg)


Lesenswert?

Hier ...
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe
... findest du ADC Funktionen. Die sind für mindestens 95% aller Fälle 
mehr als ausreichend.

von Gerhard H. (oderlachs)


Lesenswert?

Vielen Dank Heinz !

Kann sein das mein flüchtiger Speicher im Kopf wieder was durcheinander 
gebracht hatte, ich habe noch mals die Funktionen/Routinen aus meinem 
"Lehrbuch" für Init_ADC und Start_ADC genommen und nun klappt es mit der 
ADC-Messung, der SerienAusgabe und dem TWI-RTC. Die Auwertung befindet 
sich noch im Debug/Testmodus noch mit LEDs auf dem STK500.
ich habe nochmals den neuen Code auf meinen Webspace geladen zur 
allgemeinen Kontrolle und Begutachtung.
Gewiss gibt es noch was zu Verbessern, aber ich lerne ja noch...

Hier der Code : http://oderlachs.de/forum/ATM_16_Clock_ADC.zip

ja für mich ist es furchtbar immer wieder längere Pausen zwischen dem 
Programmschreiben machen zu müssen..da die Speicherbatterie im Koppe 
nicht mehr so OK ist.. ;)

Vielen Dank , es hat mich besonders die rege Beteiligung an den 
Hinweisen gefallen. Das ist positiv fürs Forum, auch wenn ein gewisser 
Gast, unrühmliche Worte schrieb, die der Mod (Danke !!) schnell entfernt 
hatte.

Gruss

Gerhard

von Peter D. (peda)


Lesenswert?

Karl Heinz schrieb:
> vergiss doch bitte den Free Running Modus. Den braucht keiner!

Nö, der ist schon ganz praktisch.
Wenn man nur einen Eingang braucht, dann startet man ihn einfach als 
free-running.
Fürderhin muß man nichts mehr machen, einfach nur das ADCW lesen, wann 
man lustig ist.

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.