Forum: Mikrocontroller und Digitale Elektronik interner ADC am uC


von Fragender Anfänger (Gast)


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?

von Fragender Anfänger (Gast)


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)?

von Cyblord -. (cyblord)


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

von Fragender Anfänger (Gast)


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. "

von Cyblord -. (cyblord)


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

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.