Forum: Mikrocontroller und Digitale Elektronik ADC 10bit auslesen


von Peter (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Problem.
Ich hab ein Programm in C geschrieben um einen ADC Wert auszulesen und 
an PortC habe ich mit Widerständen einen DA-Wandler aufgebaut.
Das Programm schaltet also den Analogen Wert 1 zu 1 durch. Dazu habe ich 
nur eine 8 Bit Auflösung benutzt, jetzt würde ich gerne auf 10 Bit 
erhöhen. Dazu wollte ich noch PORTD PIN6 und PIN7 zum DA-Wandler dazu 
schalten.
Jetzt die Frage: Wie krieg ich den inhalt von ADCL auf die zwei PINS?
Bis jetzt habe ich einfach (ADCH = PORTC) benutzt.
Schon mal danke für die Antworten die hoffentlich kommen.

mfg peter

von Floh (Gast)


Lesenswert?

if bit in wert gleich eins
   setze ausgang
ansosnten
   lösche ausgang

das ganze für die beiden Bits.

von Peter (Gast)


Lesenswert?

Kannst du das auch als Code beispiel angeben?

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:

> Jetzt die Frage: Wie krieg ich den inhalt von ADCL auf die zwei PINS?

INdem du den ADC wie jeder andere über ADCW ausliest, dir also den 
10-Bit Wert in eine uint16_t Variable holst.

die untersten beiden Bits dieser Variable gibst du auf deinen 
D-Leitungen aus. Und für den Rest schiebst du in der Variablen alles um 
2 Stelle nach rechts und gibst sie wie bisher aus.

von Floh (Gast)


Lesenswert?

nein, das ist soweit schon formuliert.
Der Rest ist nachschauen bei Bitoperationen und if-Abfrage.
Das lernst du selber :-)

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Kannst du das auch als Code beispiel angeben?

Dein Codebeispiel beginnt damit, dass du dir aus dem AVR-GCC-Tutorial 
die ADC Funktionen holst und davon Abstand nimmst den ADC Wert direkt 
aus den ADC Registern auf die Ports klatschen zu wollen.
Denn nur so klappt es dann auch mit zb einem Mittelwert über mehrere ADC 
Werte bzw irgendwelchen Umrechnungen des ADC Wertes.

von Peter (Gast)


Lesenswert?

@Karl
hört sich gut an. Das Problem ist nur das ich in C ein absoluter 
Änfanger bin. Kannst du mir das auch als Code angeben?

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> @Karl
> hört sich gut an. Das Problem ist nur das ich in C ein absoluter
> Änfanger bin. Kannst du mir das auch als Code angeben?

Siehe AVR-GCC-Tutorial

von Peter (Gast)


Lesenswert?

Hier mal der von mir geschreibene Code, es funktioniert so nicht.

    if (ADCL = 0b0000001)
      PORTD |= (1 << PD6);
    else
    PORTD &= ~(1 << PD6);

    if (ADCL = 0b00000010)
    PORTD |= (1 << PD7);
    else
    PORTD &= ~(1 << PD7);

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Hier mal der von mir geschreibene Code, es funktioniert so nicht.
>
>     if (ADCL = 0b0000001)

Das sind Zuweisungen und keine Vergleiche

ABfrage auf Gleichheit schreibt sich in C als ==

Ausserdem wird dein ADCL Register nicht den Wert 0b00000001 haben.

Ist das wirklich so schwer, sich aus dem Tutorial die ADC Routinen zu 
holen und dann das Tut von Anfang an reinzuziehen und erst mal über 
Bitverarbeitung nachzulesen?

von Peter (Gast)


Lesenswert?

okay dann wende ich mich mal dem Tuturial zu, trotzdem Danke.

mfg peter

von holger (Gast)


Lesenswert?

>jetzt würde ich gerne auf 10 Bit
>erhöhen. Dazu wollte ich noch PORTD PIN6 und PIN7 zum DA-Wandler dazu
>schalten.

Zum Glück willst du die unteren Bits damit umschalten.
PORTC und PORTD können nicht gleichzeitig gesetzt werden.
Es geht zwar relativ schnell, aber beim umschalten der
unteren Bits wird es zu so was wie Umschaltrauschen kommen.
Ein kleiner Kondensator um 100pF am Ausgang vom DAC sollte
das aber platt bekommen.

von Peter (Gast)


Lesenswert?

Danke an sowas hab ich noch gar nicht gedacht.

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.