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-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.
>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.
Hier mal ein Bascom-Beispiel für 8-bittige ADC-Abfrage, die den Programmablauf nicht blockiert. ...
@Hannes
Du hast immer so schöne Bezeichnungen für Konstanten oder Variablen:
>Const Warze = 200 'Wartezeit pro Einheit (in Mikrosekunden)
:-)
MfG Paul
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.