ADC 10 Bit in 8Bit "abrunden"

Gast #2004359
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
#2004377
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.

...
Gast #2004387
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.
Gast #2004462
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
#2004544
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,
...
Gast #2004869
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
Gast #2004960
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

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