Hallo!
Wie kann ich in AVR Assembler 2 Analogeingänge (PINC 0 und PINC 1)
"gleichzeitig" einlesen und daraufhin in Register kopieren? Hat jemand
einen Code in Assembler den er mir freundlicherweise übermitteln kann,
damit ich es auch lernen kann?
Viiiiiiiiiieln Dank!!
Johann
Die AVRs können die Analogeingänge nur einzeln wandeln. Sind mehrere
Eingänge zu wandeln, so muss dieses sequenziell geschehen. Gleichzeitig
is nich.
Gruß,
Magnetus
Hi
>Wie kann ich in AVR Assembler 2 Analogeingänge (PINC 0 und PINC 1)>"gleichzeitig" einlesen und daraufhin in Register ...
Das geht noch nicht mal in Assembler. Der AVR hat nur einen ADC (mit
mehreren Eingängen über Multiplexer). Also du kannst also immer nur
Einen Eingang bedienen. Ansonsten einfach: Messung machen, ADMUX
umschalten, nächste Messung.
MfG Spess
"gleichzeitig" geht, gleichzeitig geht nicht.
"gleichzeitig" bedeutet, ersten Kanal starten, ADC-Ende abwarten,
Ergebnis lesen, auf zweiten Kanal umschalten und ADC starten, ADC-Ende
abwarten, Ergebnis lesen, zurückschalten auf ersten Kanal, usw. Eine
Wandlung dauert 13 ADC-Zyklen (wenn es nicht die allererste nach
Aktivierung des ADC ist) , wobei je nach Takteinstellung der ADC-Takt
100kHz bis 200kHz beträgt. Wenn das nicht "gleichzeitig" genug ist, ist
der AVR der falsche Prozessor, oder du bauchst einen externen
2-Kanal-ADC.
Code gibts im Tutorial oben links.
Oliver
Das mit dem "gleichzeitig" Abtasten war mir bereits bekannt, nur meinte
ich das gleichzeitige nutzen von 2 Analogeingängen am µC. Das mit dem
ADMUX umstellen hab ich gemacht nur ohne Erfolg, da die Werte völlig
unbrauchbar waren. Hat jemand einen Code den er mir evtl. zeigen kann,
wie dies funktioniert?
Bin sehr dankbar!!!!!
Johann.
> Das mit dem> ADMUX umstellen hab ich gemacht nur ohne Erfolg, da die Werte völlig> unbrauchbar waren.
Unter bestimmten Bedingungen ist die erste Messung nach dem Umschalten
von ADMUX fehlerhaft. Wirf sie weg und miss erneut, die zweite Messung
(und jede weitere) ist dann ok.
...
Was hat denn das ret da verloren? Das gibt nen sauberen
Stack-Underflow. Da die mainloop nicht mit call aufgerufen wird, darf
da kein ret hin! Schließlich gibt es nichts, wo man von da aus hin
zurückspringen kann. Wenn überhaupt, dann kommt da ein rjmp mainloop
hin!
So, wie es da steht, geht das Programm nach dem ersten Durchlauf der
mainloop ins Nirvana und es gibt einen Reset.
Martin wrote:
> du musst waren, bis die Wandlung fertig ist und nicht gleich das ADC> Register einlesen
Das kommt noch dazu. Ein weiteres Zeichen dafür, dass Johann das
AVR-Tutorial nicht gelesen hat, was dringend zu empfehlen wäre (es
ist ja weiter oben schon mal angesprochen worden...)
Abgesehen davon liest Du nur ADCL ein, was (abgesehen davon, dass es
unsinnig ist, nur das Low-Byte zu lesen) aufgrund der
Registersynchronisation dazu führt, dass nach dem ersten Einlesen ADCL
und ADCH für jegliche weitere Zugriffe seitens des ADC blockiert sind
und von da an immer derselbe Wert ausgelesen wird.
Nach einem Lesezugriff auf ADCL muss grundsätzlich auch ADCH gelesen
werden! Wenn nur 8 Bit Auflösung benötigt werden, dann ADLAR setzen und
nur ADCH lesen. Das geht.
So, ich habe mal einen separaten, allgemeinen Artikel zum Thema [[AVR
16-Bit-Register]] erstellt. Die Infos standen in der Form bisher nur im
AVR-GCC-Tutorial...
nur verstehen tu ich´s mit dem wait nicht ganz, wenn ich doch eh einen
Vorteiler von 32 habe? Mit dem 16Bit Registern hab ich jetzt auch
verstanden. Daaaanke!
Johann
Johann wrote:
> Ich hab´s hinbekommen:
Nein, hast Du nicht!
> sbi ADCSRA,6 ;Starte nächste Konvertierung> [...]> rcall wait> [...]>> wait: inc r17> brne wait> ret
Das ist völliger Mumpitz! Du musst warten, bis der ADC sich meldet, dass
er fertig ist. Da gibt es zwei Methoden, das zu tun (bzw. zwei
Statusbits, die man zu diesem Zweck abfragen kann). Was Du hier machst,
funktioniert nur dann mit Glück, wenn die Wartezeit wirklich länger ist,
als der ADC für eine Wandlung benötigt!
> Mit dem 16Bit Registern hab ich jetzt auch> verstanden. Daaaanke!
Na, wenigstens etwas...
Gast wrote:
> Siehe dem Auszug aus dem GCC-Tutorial:
Nützt ihm bei Assembler nicht viel. Aber auf das AVR-Tutorial ist er
ja auch erst dreimal hingewiesen worden...