Fährst du denn ohne die Bremse, Lenkrad, Schaltbox, Motor zu benutzen ? Oder wie bedienst du dein Fahrzeug
taxonomisch heißt kennen = ich weiß das es das gibt.
;)
Druckbare Version
da interpretierst du meine Aussage aber schon völlig grundverkehrt, das ist dir ja wohl klar: die Mechatronik kennen war zu verstehen als: die Dinge und Funktionen bis in alle Details samt allen Programmierungen und Steuerungen kennen, darum ging es ja im Disput Aduino versus asm und ARM cores direkt programmieren 8)
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?Zitat:
.. 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:
Zitat von Datenblatt für AtmelATmega16A-8154B–AVR–07/09
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
Anhang 33980
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.
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*).