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
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
:-)
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
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.
...
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-Tutorialhttp://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.
>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
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,
...
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
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.
...
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
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
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.
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 .
...