interner ADC am uC

Gast #2828093
Lesenswert?

Zu diesem Beitrag hab ich ne Frage:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe

Setzte ich ADEN=True (ADC enable), heisst es dann, dass komplett alle 
acht Pins nicht mehr als IO-Ports genutzt werden können, oder kann ich 
es dennoch so machen, wenn ich nur einen Kanal benötige, dass ich die 
übrigen dennoch als IO-Ports verwenden kann?
Gast #2828101
Lesenswert?

ADIF (ADC Interrupt Flag) - habe ich das richtig verstanden -

ADIF = 1, wenn Messung beendet und Werd in ADCL/ADCH reingeschrieben 
wurde und wird automatisch auf

ADIF = 0 gesetzt, wenn eine Leseoperation erfolgt (zB. wenn ich ADCL in 
das Register R16 kopiere)?
#2828110
Lesenswert?

1.) Du kannst weiterhin alle Pins normal nutzen. Mit ADMUX stellst du 
ein welcher Pin als ADC Eingang dienen soll. Aber auch diesen Pin kannst 
du normal nutzen.

2.) RTFM!
Das ADIF wird gesetzt wenn eine Messung beendet ist und gelöscht wenn 
eine ISR angesprungen wird. Ansonsten kann man es noch manuell löschen. 
Sonst wird es nicht gelöscht. Wenn du ADC per Polling machen willst, 
dann teste auf das ADSC Bit mit dem du eine Messung auch startest. Das 
geht wieder auf 0 sobald die Messung fertig ist, dann kannst du die 
Werte aus ADC lesen.

gruß cyblord
Gast #2828111
Lesenswert?

Danke für Deine Antwort.

In dem Tutorial steht beim Initialisieren:

  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
     Wandlung nicht übernommen. */
  result = ADCW;

Also muss ich jeden Wert einmal irgendwie auslesen, sonst wird kein 
neuer reingeschrieben? Ist das nicht auch sowas ähnliches wie

"Dieses Bit wird vom ADC gesetzt, sobald eine Umwandlung erfolgt ist und 
das ADC Data Register aktualisiert wurde. Das Bit wird bei lesendem 
Zugriff auf ADC(L,H) automatisch (d.h. durch die Hardware) gelöscht. "
#2828143
Lesenswert?

Fragender Anfänger schrieb:
> Danke für Deine Antwort.
>
> In dem Tutorial steht beim Initialisieren:
>
>   /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
>      Wandlung nicht übernommen. */
>   result = ADCW;
>
> Also muss ich jeden Wert einmal irgendwie auslesen, sonst wird kein
> neuer reingeschrieben? Ist das nicht auch sowas ähnliches wie
>
> "Dieses Bit wird vom ADC gesetzt, sobald eine Umwandlung erfolgt ist und
> das ADC Data Register aktualisiert wurde. Das Bit wird bei lesendem
> Zugriff auf ADC(L,H) automatisch (d.h. durch die Hardware) gelöscht. "

Steht zwar so im Tutorial, aber wäre mir neu dass das wirklich so ist. 
Kommt evt. auf den AVR drauf an. Schau halt mal im Datenblatt nach, 
müsste ich jetzt auch tun. Da gibt es auch einen Absatz über das Lesen 
von 16 Bit Registern, da wird beim lesen des einen Registers, das andere 
gelockt, bis es ebenfalls gelesen wird.

gruß cyblord

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren