Config Adc = Single , Prescaler = 128 , Reference = Avcc
mh, ich dachte der adc macht mehre khz? also 4mhz/prescaler?
also 4000000/128=31250hz.
er müßte da doch die 16messungen nebenbei machen, oder habe ich da was falsch verstanden?
@m_herr: 'tschuldige, war ein Unterstellung
Das ist das, was Bascom draus macht, wer mag, kann die Zyklen zählen, viele sind es ja nicht
Die meiste Zeit vergeht beim Warten auf den ADCCode:---------------------------------------------- Ad0 = 0 ---------------------------------------------- LDI r24,0x00 LDI r25,0x00 LDI XL,0x60 LDI XH,0x00 ST X+,r24 ST X,r25 ---------------------------------------------- For X = 1 To 16 ---------------------------------------------- LDI r24,0x01 STS 0x0062,r24 L_0x008C: LDS r16,0x0062 CPI r16,0x10 BRLO L_0x009A BREQ L_0x009A JMP L_0x00D6 L_0x009A: ---------------------------------------------- Mtemp = Getadc(0) ---------------------------------------------- LDI r24,0x00 OUT ADMUX,r24 CALL L_0x00F6 LDI XL,0x63 LDI XH,0x00 ST X+,r24 ST X,r25 ---------------------------------------------- Ad0 = Ad0 + Mtemp ---------------------------------------------- LDI XL,0x60 ad0 LDI XH,0x00 LD r16,X+ LD r17,X LDI XL,0x63 mtemp LDI XH,0x00 LD r20,X+ LD r21,X ADD r16,r20 add ADC r17,r21 LDI XL,0x60 store ad0 LDI XH,0x00 ST X+,r16 ST X,r17 ---------------------------------------------- Next X ---------------------------------------------- LDI XL,0x62 x LDI XH,0x00 LD r24,X SUBI r24,0xFF +1 ST X,r24 store x BRCC L_0x00D6 exit for..next JMP L_0x008C continue L_0x00D6: ---------------------------------------------- Shift Ad0 , Right , 4 ---------------------------------------------- LDI r25,0x04 LDI XL,0x60 LDI XH,0x00 CALL L_0x0108 ---------------------------------------------- END ---------------------------------------------- CLI L_0x00E2: RJMP L_0x00E2 ---------------------------------------------- GETADC() ---------------------------------------------- L_0x00F6: SBI ADCSR,ADSC L_0x00F8: SBIC ADCSR,ADSC RJMP L_0x00F8 wait bit clear SBI ADCSR,ADSC set bit L_0x00FE: SBIC ADCSR,ADSC RJMP L_0x00FE wait bit clear IN r24,ADCL read low IN r25,ADCH read high RET
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Config Adc = Single , Prescaler = 128 , Reference = Avcc
mh, ich dachte der adc macht mehre khz? also 4mhz/prescaler?
also 4000000/128=31250hz.
er müßte da doch die 16messungen nebenbei machen, oder habe ich da was falsch verstanden?
Nö,der AVR hat genau "Einen" ADC und der kann logischerweise immer nur eine Messung machen.
Davor ist der Mux der die einzelnen Eingänge mit dem ADC verbindet.
In Assembler mußte ja jedesmal umschalten da merkt man das.
Bei Bascom geht das in der Automatisierung leicht unter.
Dann ist da noch der Umstand das der ADC ja nicht in einem Takt Wandelt (successive approximation) sondern ne gasnze Weile braucht (Parallelwandler sind kaum zu bezahlen wegen dem Aufbau)
Man kann sagen das ca. bei 16ks/s (Praktisch 15.x ks/s) Ende ist.
aber ich les jetzt nochmal nach bevor ich Unsinn verbreite.......
Edit:
Da ist die Textstelle:
"each conversion will require 25 ADC clocks."
Den Rest kannste dir dann ausrechnen.
Gruß
Ratber
Und wenn man das in ein ADC_Ready Interrupt verlagert?GETADC()
----------------------------------------------
L_0x00F6:
SBI ADCSR,ADSC
L_0x00F8:
SBIC ADCSR,ADSC
RJMP L_0x00F8 wait bit clear
SBI ADCSR,ADSC set bit
L_0x00FE:
SBIC ADCSR,ADSC
RJMP L_0x00FE wait bit clear
IN r24,ADCL read low
IN r25,ADCH read high
RET
Auf die Messungen muß er zwar noch warten, er hat dann aber Zeit um was anderes zu machen.
Gruß Sebastian
P.S. ach ja und den ADC in Freerunning Modus setzen.
Gegenfrage :*g
Wie kann ich so schnell und gut wie es geht 16mal den ADXx auslesen und den Wert in Variable x speichern? Auch in Assembler wenn es sein muß.
Vielen Dank
Klar, elegante Leute machen das mit Interrupt und tun derweil was anderes.
Ist aber ein anderes Konzept, da dann einen Average-Loop drüberzulegen.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Das sollte so funktionierenCode:getadc: clr ergebnisl clr ergebnish ldi tmp,(1<<anzahl) start: sbi ADCSR,ADSC warte: sbis ADCSR, ADIF rjmp warte in tmp2, ADCL add ergebnisl, tmp2 in tmp2, ADCH adc ergebnish, tmp2 dec tmp brne start ldi tmp,anzahl teile: lsr ergebnish ror ergebnisl dec tmp brne teile ret
tmp und tmp2 sollen 2 Register >= R16 sein
ergebnisl und ergebnish egal welche
anzahl ist dann eine konstante, wie oft die Schleife durchlaufen soll.
In Deinem Fall 16.
Das Ergebnis steht dann in ergebnisl und ergebnish.
Der Muxkanal muß auch davor eingestellt werden.
Das wäre dann pooling, ich finde es aber trotzdem besser, wenn das in ein Interrupt rein käme.
Ich hoffe, daß Du damit was anfangen kanst.
Gruß Sebastian
P.S.
@Picknick,
hab ich was falsch gesagt ?
puh, das überfordert mich total, war bisher nur auf Bascom ausgelegt...
da ich aber Icp1 und Ovf1 noch benutze und angst habe, daß es da probleme gibt, habe ich das extra mit der schleife die alle 10ms durchlaufen wird aufgebaut....
Neinnein, alles roger, ist ja richtig. Vom Programmablauf her ist das halt etwas schwieriger.Zitat von izaseba
![]()
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ja nu, ich hab nicht gesagt das es einfach ist, aber irgendwas sollte man wirklich auslagern, sonst wartet sich der µC dumm.
Wie wird eigentlich die Ausgabe realisiert auch mit Warteschleifen?
Gruß Sebastian
Lesezeichen