So, früher als gedacht wieder retour ...
Und - können wir bitte beim Thema bleiben !?!?
hier gehts um AVR und LCD und nicht ob Arduino besser oder einfacher ist!
Ich hab nicht viel an meinem Testprogrämmchen geändert.
Aber ich hab eine Lösung gefunden.
Woran es letztendlich liegt, dass eine 10-Bit Abfrage des ADCs in einer Schleife nicht normal abläuft kann ich aber auch nicht beantworten.
Mag sein, dass das Problem an der Wandlungsgeschwindigkeit liegt ... aber:
Frage an avr_racer oder an jene, die meine Frage beantworten können:
Wie schaffe ich eine Wandlungsgeschwindigkeit zwischen 50kHz - 200kHz, wenn bei einer Taktfrequenz des µC von 1MHz nur ein Teiler von 128 zur Verfügung steht?
Meine Lösung ist eine doppelte Wandlung unmittelbar hintereinander.
Allerdings nicht im 10Bit-Modus sondern erst in 8Bit dann sofort in 10Bit.
Dann passt alles.
Kann es sein, dass Du die beiden 8bittigen ERgebnisregister des ADC falsch ausliest?.. Woran es letztendlich liegt, dass eine 10-Bit Abfrage des ADCs in einer Schleife nicht normal abläuft kann ich aber auch nicht beantworten ..
Damit liest Du doch zuerst ADCH aus? Das Datenblatt verlangt aber (must - engl. = müssen - dtsch) wie wohl immer beim 10bittigen Atmel-ADC, zuerst das ADCL und erst dann das ADCH auszulesen:Code:.... USA: ;U-Solar/Akku ldi lcdd,lcd_lin1+$0A ;Zahlenpos Solar-U rcall lcd_cmd4 ldi muxr,$47 ;ADC7 10bit rcall rd_adc in wrk1,ADCH in wrk2,ADCL rcall clc_va ;Values to Chars ...
Zitat von Datenblatt für AtmelATmega16A-8154B–AVR–07/09
Ciao sagt der JoeamBerg
Auslesen wenn ADLAR = 0 = 10bit
erst ADCL dann ADCH
Auslesen wenn ADLAR = 1 = 8bit
reicht ADCH auszulesen
BITTE das DB des ATMEGA 16 durcharbeiten ab Seite 204 http://ww1.microchip.com/downloads/e...oc/doc2466.pdf
Bitte Seite 15 nochmal in Ruhe nachvollziehen. Dein Problem ist das du zuviel in deiner Routine umherspielst anstatt den ADC nur zu
1. Initalisieren + Testkanal** + Ergebnis verwerfen
2. Wandlungskanal auswählen
3. Ergebnis des eingestellten Kanals auslesen
** Testkanal kann auch den Eingang des Wandlers gegen 0V schalten Siehe Seite 218/219 beachten!!!!!
Hier mal ganz grob
Im Anhang deine alte Datei die ich angepasst habeCode:;Einsetzen wo alle anderen Inits auch ablaufen Init: rcall ADC_Init ; das hier kann einzelnd im Hauptprgramm aufgerufen werden oder zusätzlich in deine Unterroutinen eingestezt werden TEST_ADC_LESEN: rcall ADC_channel_0 ;Kanal 0 einstellen rcall RD_ADC ;ADC-Wandlung starten + auslesen in wrk2 ret ADC_Init: ;hier wird AD-Wandler aktiviert und die Samplefreqnz eingestellt zwischen 50 bis 250kHz ;Teiler verfügbar von 2hochX, also bei 1Mhz nur Teiler 4/8/16 möglich ;Siehe Datenblatt Seite 220 Table 85. ADC Prescaler Selections ldi muxr,(1<<ADEN | 0<<ADPS2 | 1<<ADPS1 | 0<<ADPS0) out ADCSRA,muxr rcall ADC_channel_GND rcall RD_ADC ;ADC Testweise auslesen und Ergebnis verwerfen ret ADC_channel_0: ;Kanal ADC0 auf PA0 setzen mit 5V als UREF ldi muxr,(0<<REFS1 | 1<<REFS0 | 1<<ADLAR | 0<<MUX4 | 0<<MUX3 | 0<<MUX2 | 0<<MUX1 | 0<<MUX0) out ADMUX,muxr ;ADMUX setzen ret ADC_channel_GND: ;Hier wird Wandlungsreferenzspannung und der Kanal gleichzeitig gesetzt ;MUXR=128 bedeutet REFS1 = 1 und REFS0 =0 ist RESERVIERT siehe SEITE 217 ldi muxr,(0<<REFS1 | 1<<REFS0 | 1<<ADLAR | 1<<MUX4 | 1<<MUX3 | 1<<MUX2 | 1<<MUX1 | 1<<MUX0) out ADMUX,muxr ;ADMUX setzen ret RD_ADC: ;Liest den selektierten ADC aus, AVCC OK sbi ADCSRA,ADSC ;ADC Start Conversion WADC: ;Schleife bis Messung sbic ADCSRA,ADSC ;abgeschlossen = ADSC=0 rjmp wadc ; in wrk1,ADCL ;mit auslesen wenn ADLAR = 0 in wrk2,ADCH ;ADCH auslesen reicht bei ADLAR = 1 ret
test.txt
Hi allerseits!
DANKE für die Aufklärung! Tatsächlichen Fehler beseitigt!
Dank eures Hinweises!
Bei meinen bisherigen Projekten hab ich immer nur mit 8Bit ADC gearbeitet.
Dadurch ist mir der Fehler mit der Reihenfolge des Auslesens passiert.
Obwohl ich das Datenblatt genau (dachte ich jedenfalls) gelesen hab.
ADCL und dann ADCH auslesen und alles ist ok!!
@avr_racer
Wir dürften offenbar verschiedene Datenblätter besitzen.
Bei meinem beschäftigen sich die Seiten 218/219 mit TAP Controller, Using the Boundary-scan Chain und Using the On-chip Debug System.
Die Prescaler-Tabelle (84) ist bei mir auf Seite 214.
Aber du hast recht. Noch ein Fehler aus der Vergangenheit.
Hab dort, wo ich mit ADC arbeite, eine Taktfrequenz von 9,6MHz.
Dem hatte ich bei meinen Änderungen im Testprogramm noch nicht Rechnung getragen.
Hat jedoch keine Auswirkung auf den tatsächlichen Fehler und funktioniert auch mit /128.
Ist jetzt aber berichtigt!
Danke nochmals an alle, die sich die Mühe gemacht und mein Progrämmchen nach meinem Fehler durchsucht haben!! Besonders an avr_racer.
Geändert von HeSt (09.02.2019 um 10:17 Uhr)
Nur mal so, aus Neugier, würdest Du mal bitte die Version Deines Datenblattes nennen? Steht meist am Deckblatt rechts unten, auf den sonstigen Seiten üblicherweise links unten in der Form "Rev. 2466T–AVR–07/10". Ich hatte meine (wenigen) Datenblätter für mega16 durchgeforstet gehabt und Deine Angaben nicht nachvollziehen können - was die Seitenangaben betrifft.
Wie geschrieben - es ist pure Neugier (und - ich bin ein alter Datenblatt-Sammler *gg*).
Ciao sagt der JoeamBerg
Deine "Neugierde" kann ich gern befriedigen
Mein Datenblatt zeigt folgende Bezeichnung: 2466E–AVR–10/02.
Hab es vor ein paar Jahren von "http://www.datasheetcatalog.com/" geholt.
Jetzt ganz neu von
"http://ww1.microchip.com/downloads/e..._Datasheet.pdf"
geholt.
Das aktuelle hat die Bezeichnung Atmel-8154C-8-bit-AVR-ATmega16A_Datasheet-07/2014 und sieht gewaltig anders aus!
Werd nun alle meine Datenblätter durchforsten und ggf. von den Herstellerseiten aktualisieren!
Danke an oberallgeier + avr_racer für's "mit der Nase drauf zeigen"!!![]()
Lesezeichen