Du solltest vielleicht mal den Fortlauf des Threads im Auge behalten, meine Argumentation bezieht sich auf Dein "falsch: man kann schon -
muss es aber gar nicht" - man kann eben nicht!
mfg
Achim
Du solltest vielleicht mal den Fortlauf des Threads im Auge behalten, meine Argumentation bezieht sich auf Dein "falsch: man kann schon -
muss es aber gar nicht" - man kann eben nicht!
mfg
Achim
Es geht doch um nichts als um die philosophische Betrachtung von Möglichkeiten etwas zu entwickeln, gestern, heute und morgen wohl noch ganz anders.
Dafür sind harte Bezeichnungen eher übertrieben.
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![]()
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
Lesezeichen