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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.