Hallo AVR-Meister Habe einen ATmega16 in einem Pollin-Board Entwicklungs SW ist AStudio 4.18 Programmiert in Assembler Problem ist AD-Wandlung Beschaltung: PA0 (ADC0) Pin 40 an Anode einer Diode0 PA1 (ADC1) Pin 39 an Anode einer Diode1 beide Kathoden an GND Dass etwas Strom fliesst, wird der interne Pullup-Widerstand eingeschaltet (sbi PortA,PA0 ,,PA1) Strom gegen Gnd ca 140 mikroA,beide gleich viel Referenz ist die interne 2,56V also REFS1,REFS0 ==1 nun messe ich die interne Bandgap (1,22 V) in ADMUX ist MUX4..0 also 1110 (Tab.84 im Atmel doc2446.pdf) Ergenis: 0x1eb das kommt rechnerisch etwa hin Dann wird die erste Diode an Pin 40 gemessen Ergebnis: 0x0d3 mit Voltmeter gemessene Spannung 0,47V also auch in Ordnung, dann die zweite Diode an Pin 39 Ergebnis: 0x0e7 diese mit Voltmeter gemessene Spannung 0,52V also auch in Ordnung, dann wollte ich die Differenz messen dazu ADMUX MUX4..0 =1000 das wäre ADC0 gegen ADC1 gain=1 Ergebnis: 0x3ff und ab und an auch mal 0x3fe dann Versuch mit gain=10 dazu ADMUX MUX4..0 =01001 das wäre ADC0 gegen ADC1 gain=10 Ergebnis: wieder 0x3ff und ab und an auch mal 0x3fe ich kann mit den Eingängen machen was ich will,das Ergebnis der Differenzmessung bleibt 0x3ff zu bemerken ist noch,dass ich am Pin32== AREF keine Spannung messe Habe ich was übersehen ?? Weiss jemand darüber Bescheid
Hi >dazu ADMUX MUX4..0 =1000 das wäre ADC0 gegen ADC1 gain=1 Nein ADC0 gegen ADC0 mit Gain=10 >Habe ich was übersehen ?? Zeig mal deine ADC-Initialisierung. MfG Spess
Hallo Spess53 Danke für die schnelle Reaktion laut Datenblatt von Atmel wo der ATMega16 beschrieben ist doc2446.pdf Tab 84 Seite 218 und das Buch von G.Schmitt Mikrokontroller der AVR Risk Familie auf Seite 414 sagt dasselbe MUX4..0 pos.Eing neg.Eing. Gain 10000 ADC0 ADC1 1x ------ Programmausschnitt ;;;;;;;;;;;;;;;;;;AD wandler dioden an adc 0,1 ;ref ist intern 2,56 Volt lsb 7...0 , msb 9..8 >> ADLAR = 0 ;;.pdf Table 84. Input Channel and Gain Selections ;; ADMUX -- REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 ;;11110 1.22V (VBG) ldi tmp,(1<< REFS1|1<< REFS0 | 1<< MUX4 |1<< MUX3 |1<<MUX2 |1<< MUX1 ) out ADMUX,tmp ------------------- ; Table 86. ADC Auto Trigger Source Selections ;SFIOR = ADTS2 ADTS1 ADTS0 – ACME PUD PSR2 PSR10 ; ADTS2 ADTS1 ADTS0 Trigger Source ; = 0 0 0 Free Running mod ,also wie bei Reset ------------- ; ADPS2 ADPS1 ADPS0 Division Factor 000==2...111=256 ; ADCSRA -- ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 ; ADEN ein Wandler-Start ldi tmp,(1<< ADEN|1<< ADSC |1<< ADPS2 | 1<< ADPS1 |1<< ADPS0) out ADCSRA,tmp ;ad wandler startet mit BandGap 1,2 V ------------Unterprogramme für abholen des AD-wertes getadc: ;ist (schon) gestartet,jetzt warten bis fertig und in bb,akku bringen nop ;Wenn das Ergebnis in ADC rechts-ausgerichtet ist, MUSS ADCL vor ADCH ausgelesen werden, ;da erst ein neuer Wert in ADC geschrieben werden kann, wenn ADCH ausgelesen wurde. nop sbic ADCSRA,ADSC ;lesen bis adsc==0 rjmp getadc ;adsc ist noch high in akku,adcl ;7...0 in bb,adch ;xxxxxx98 ret ---------neuer Kanal stellen stadc39s: ;adc1, pin 39, PA1 ,single nop cbi ddra,pa1 ;eingang sbi porta,pa1 ;pullup ein in tmp,admux ;;ADMUX = REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 andi tmp,0b1110_0000 ori tmp,0b000_0001 ; ADC1 Pin39 out admux,tmp sbi ADCSRA,ADSC ; start mit 1 einschreiben ADCSRA,ADSC ret ---------- in der "Mainloop" werden die einzelnen Kanäle angewählt, ausgelesen in hexstring umgesetzt und auf die serielle Schnittstelle ausgegeben. so etwa loop: rcall adc_bandgap ; 11110 1.22V (VBG) rcall zeigadc ;,mit getadc rcall stadc40s ;adc0, pin 40, PA0 ,single rcall zeigadc ;,mit getadc rcall stadc39s ;adc1, pin 39, PA1 ,single rcall zeigadc ;,mit getadc rcall stadc3940d ;adc1, pin 39+40, PA0+11 ,differenz gain 1 rjmp loop ---------------------------ergebnis auf dem HTerm herauskopiert 1eb 0d4 0e7 3f8 | | | |--> sollte Differenz sein | | | --> PA1 (ADC1) ca 0,53 V | | -->> PA0 (ADC0) ca. 0,47 V |-->> interne Bandgap ------------------------------------- hoffe, dass es ausreichend verständlich dargestellt ist. Berichtigung: am Pin32 (Aref) messe ich doch wie erwartet 2,6 V (sorry habe mich in der Zählrichtung vertan) ------------- externer Hinweis, leider von 2004 http://www.uni-koblenz.de/~physik/informatik/MCU/Analog.pdf auf Seite 14 soll man bei Differenzmessung den Wandler aus und wieder einschalten -->>> habe ich gemacht: gleiches Ergebnis ------------ MfG Fritz Seiffert
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.