Forum: Mikrocontroller und Digitale Elektronik ADC 10 Bit in 8Bit "abrunden"


von oyla (Gast)


Lesenswert?

Guten Abend,

Ich habe gerade folgende Nuss zu knacken und bräuchte jetzt doch mal 
wieder hilfe, da ich nicht weiter weiss :/

Mein Atmega88 hat ja einen 10Bit ADC onboard, daran ist ein Poti 
angeschlossen. Die Auflösung ist nicht wichtig, auch nicht die 
Geschwindigkeit.

Der Wichitge teil des Codes ist Sinngemäß:

P_8bit ist Integer
P_10bit ist Byte

P_10bit = getadc(0)
P_8bit = P_10bit

=> Wenn ich den Potentiometer nun drehe erhalte ich 4 mal Werte von 0 
bis 255, was ja auch logisch ist, da er bei der Convertierung einfach 
die Bits von links anfängt zu zählen, und dann die Beiden zusätzlichen 
Bits nicht realisiert. Ich möchte nun aber, dass er die letzten 2 Bits 
ignoriert, damit wieder Zahl von 0 - 255 rauskommt.

Meine idee war es, einfach durch:

SHIFT P_10bit , left , 2

alles 2 nach links zu verschieben und dann an P_8bit zu übergeben. Das 
ging nicht. Dann hab ich nochmals ausprobiert alles um 10 nach links zu 
schieben, da integer ja 16bits sind, aber das klappte auch nicht.

Wo ist mein verdammter Denkfehler und wie mach ich das denn jetzt 
richitg? :D

danke schonmal
Gruss oyla

von Floh (Gast)


Lesenswert?

oyla schrieb:
> Wo ist mein verdammter Denkfehler und wie mach ich das denn jetzt
> richitg? :D

du solltest die Daten 2 mal rechtsschieben, so machst du aus einem 
10bit-Wert einen 8bit-Wert.
2 mal rechts schieben entspricht /4 bei vorzeichenlos, also
1024 Werte / 4 = 256 Werte
:-)

von Majo (Gast)


Lesenswert?

Schieb mal nach rechts

von oyla (Gast)


Lesenswert?

Verdammt! ...
Das ist mir nach dem Schreiben und 3. Lesen dieses Textes ebend auch 
aufgefallen!
Gleich ausprobiert, funktioniert wunderbar :D

Ich danke euch, vielleicht sollte man um diese Zeit einfach mal aufhören 
und entspannen... ;)

Danke euch!
oyla

von Hannes L. (hannes)


Lesenswert?

Bei alten Classic-AVRs war das doppelte Rechtsschieben richtig. Moderne 
AVRs können den ADC 8-bittig konfigurieren. Dazu setzt man das ADLAR-Bit 
(meist in ADMUX, aber bei einigen AVRs auch in einem 
ADC-Steuer-Register) und liest dann nur ADCH aus. Inwieweit 
vordefinierte Hochsprachenmodule das unterstützen, weiß ich allerdings 
nicht.

...

von ikarus (Gast)


Lesenswert?

Ich verstehe nicht wirklich was du da machst und warum, aber die kannst 
die unteren 2 Bit schon beim auslesen weglassen. Einfach den ADC 
linksbündig konfigurieren und dann nur ADCH auslesen, ADCL einfach 
ignorieren und niemals auslesen.
Siehe auch AVR-GCC-Tutorial http://www.mikrocontroller.net/articles 
direkt Link 
/AVR-GCC-Tutorial#16-Bit_Register_.28ADC.2C_ICR1.2C_OCR1x.2C_TCNT1.2C_UB 
RR.29
> Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht,
> die Möglichkeit, das Ergebnis "linksbündig" in ADCH/ADCL auszurichten, so
> dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte
> nur ADCH ausgelesen werden.

von oyla (Gast)


Lesenswert?

>Ich verstehe nicht wirklich was du da machst und warum, aber die kannst
>die unteren 2 Bit schon beim auslesen weglassen. Einfach den ADC
>linksbündig konfigurieren und dann nur ADCH auslesen, ADCL einfach
>ignorieren und niemals auslesen

Ja okay, geht auch. Es handelte sich aber halt um Bascom, hatte es 
vergessen zu erwähnen. Da gibt es schon fertige Befehle, die es mir als 
Anfänger mit einem für mich größerem Projekt halt bedeutend einfacher 
machen ;). (Halt x = getadc(0))


Nacht
oyla

von Hannes L. (hannes)


Lesenswert?

oyla schrieb:
>>Ich verstehe nicht wirklich was du da machst und warum, aber die kannst
>>die unteren 2 Bit schon beim auslesen weglassen. Einfach den ADC
>>linksbündig konfigurieren und dann nur ADCH auslesen, ADCL einfach
>>ignorieren und niemals auslesen
>
> Ja okay, geht auch. Es handelte sich aber halt um Bascom, hatte es
> vergessen zu erwähnen. Da gibt es schon fertige Befehle, die es mir als
> Anfänger mit einem für mich größerem Projekt halt bedeutend einfacher
> machen ;). (Halt x = getadc(0))

Man kann aber auch auf GETADC() verzichten und den ADC durch Auslesen 
des Registers ADCH auslesen. Und schon läuft das Programm schneller, 
weil es in der Zeit, wo GETADC() auf das Fertigwerden der Wandlung 
wartet, etwas Anderes tun kann.

>
>
> Nacht
> oyla

N8,
...

von Andreas (Gast)


Lesenswert?

Hannes Lux schrieb:
> Man kann aber auch auf GETADC() verzichten und den ADC durch Auslesen
> des Registers ADCH auslesen. Und schon läuft das Programm schneller,
> weil es in der Zeit, wo GETADC() auf das Fertigwerden der Wandlung
> wartet, etwas Anderes tun kann.

Noch schlimmer: GETADC führt zwei Wandlungen aus und liefert nur das 
Ergebnis der letzten zurück (Version 1.11.8.8, ATMega32). Wenn man es 
eilig hat, dann sollte man auf GETADC verzichten.

Gruß,
Andreas

von Hannes L. (hannes)


Lesenswert?

Nunja, die meisten meiner Programme müssen mehrere Dinge quasi parallel 
tun, da sind blockierende Dinge wie Wait oder Getadc sowiso tödlich. Da 
kann man nicht mehr "in Schleifen" denken, sondern muss "in Zuständen 
und Ereignissen" (TM Buchegger) denken.

...

von Paul Baumann (Gast)


Lesenswert?

Soll man nicht ohnehin den ersten Meßwert "wegwerfen"?
Ich denke, daß sich der Bascom-Mann beim Programmieren der 
Getadc-Routine
danach gerichtet hat.

MfG Paul

von Andreas (Gast)


Lesenswert?

Paul Baumann schrieb:
> Soll man nicht ohnehin den ersten Meßwert "wegwerfen"?
> Ich denke, daß sich der Bascom-Mann beim Programmieren der
> Getadc-Routine
> danach gerichtet hat.
>
> MfG Paul

Richtig, unter bestimmten Bedingungen ist das erste Wandlungsergebnis zu 
ignorieren. Der "Bascom-Mann" hat nur nirgendwo aufgeschrieben, daß er 
immer zwei Wandlungen macht und er hat keine Alternative mit nur einer 
Wandlung angeboten. Ok, das mag an dem "All Purpose" in BASIC liegen.

Gruß,
Andreas

von Gästle (Gast)


Lesenswert?

Den 1. Messwert muss man nur nach der ersten Initialisierung (nach 
Reset/ Einschalten) wegwerfen. Danach kann man sogar auf andere 
ADC-Kanäle umschalten und direkt das Ergebnis der ersten Wandlung 
benutzen.

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Hier mal ein Bascom-Beispiel für 8-bittige ADC-Abfrage, die den 
Programmablauf nicht blockiert.

...

von Paul Baumann (Gast)


Lesenswert?

@Hannes
Du hast immer so schöne Bezeichnungen für Konstanten oder Variablen:
>Const Warze = 200     'Wartezeit pro Einheit (in Mikrosekunden)

:-)
MfG Paul

von Hannes L. (hannes)


Lesenswert?

Paul Baumann schrieb:
> @Hannes
> Du hast immer so schöne Bezeichnungen für Konstanten oder Variablen:
>>Const Warze = 200     'Wartezeit pro Einheit (in Mikrosekunden)
>
> :-)
> MfG Paul

Schöne Bezeichnungen? Naja, manchmal sollen Programme nicht nur 
funktionieren, sondern auch etwas schön sein .

...

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.