mikrocontroller.net

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


Autor: oyla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
:-)

Autor: Majo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schieb mal nach rechts

Autor: oyla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: ikarus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: oyla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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,
...

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gästle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

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

...

Autor: Paul Baumann (Gast)
Datum:

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

:-)
MfG Paul

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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 .

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.