Sari la conținut
ELFORUM - Forumul electronistilor

Problema cu A/D la PIC 16F877


Mar

Postări Recomandate

Cu aceasta secventa eu am citit o tensiune analoaga de pe RA0 al PIC16F877.Am incercat sa citesc succesiv RA0 si RA1 binenteles cu modificarile in ADCON1 si ADCON0 dar nu functioneaza.De ce nu le pot accesa pe rind?Stie cineva :?: :?: :?: :?: bsf 03h,5 movlw 0Eh movwf 9Fh bcf 03h,5 movlw 0xC1 movwf 1Fh call delay bsf 1Fh,2 lop btfsc 1Fh,2 goto lop

Link spre comentariu
  • Răspunsuri 6
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Salut,Subscriu la chestia cu numele simbolice. Asa, e f greu de urmarit.Din cod nu rezulta prea clar secventa de masura. Dupa ce comuti pe alta intrare, cred ca trebuie sa restartezi ADC-ul, ca sa obtii un rezultat. De asemenea, de ce folosesti "call delay" si nu testezi bitul done direct? De fapt eu fac altceva cand am nevoie de conversii. Intai si intai, lucrez pe intreruperi. Perioada e semnificativ mai mare decat durata conversiei. La intrare in ISR verific bitul DONE, desi in principiu conversia trebuie sa fie terminata. Daca e gata, citesc si pornesc o noua conversie, apoi imi vad de treburi. Cand vine intr urmatoare, conversia e gata. In felul asta nu pierd timpul cu call delay. E doar o idee...Cirip

Link spre comentariu

Aici e secventa de mai sus cu nume simbolice.bsf STATUS,5 movlw 0Eh movwf ADCON1bcf STATUS,5 movlw 0xC1 movwf ADCON0 call delay bsf ADCON0,2 lop btfsc ADCON0,2 goto lopdupa aceea poti sa introduci rezultatul conversiei stocat in ADRESH in ce registru vrei.call delay am folosit pentru ca asa am vazut in programele de pe net,nu am incercat altfel.Te rog sa-mi dai si mie o secventa cu conversia A\D folosind intreruperi.

Link spre comentariu

O intarziere trebuie folosita daca faci achizitzie pe mai multe canale. Nu este scris clar in datasheet, de aceea cred ca e bine sa va spun din experientza mea: delay-ul nu este necesar pentru conversie propriu zisa, ci doar pentru ca multiplexorul analogic are constanta de timp destul de mare. Adica trebuie lasat un pic dupa selectarea canalului, inainte de a seta bitul de GO/DONE. Delay-urile sunt de vreo 30uS, pentru o "diafonie" intre canale mai mica de 2LSB. Daca nu introduci delay deloc, ajungi sa citeshti in a doua valoare analogica pana 30/100 din prima. Daca vrei sa optimizezi codul pentru viteza, fa apel la delay imediat dupa selectarea canalului, si plasezi ceva secventza de cod in loc de nop-urile ddin delay. Ca un sfat: nu te juca cu bitul ADON, pentru ca daca decuplezi ADC-ul decuplezi shi multiplexorul. Apoi iarashi trebuie delay...

Link spre comentariu

Salut,Inainte de a posta codul, trebuie sa spun ca:1)Codul NU este testat in forma in care e postat. Am decupat dintr-un program mai vechi, functional, dar dupa hacuiala, nu pot garanta ca nu lipseste ceva. Scopul este sa iti dea o idee. Baga-l pe simulator si joaca-te cu el. Daca ai dificultati, mai vorbim.2)ISR-ul, asa cum e dat aici, nu salveaza contextul. Am scos secventele respective ca sa nu incarc forumul cu carnati interminabili de cod. Am lasat numai ceea ce mi s-a parut relevant.3)Am scos ORG-urile, cblock-urile si alte cele. Sunt irelevante pentru scopul postului.In principiu, organigrama vorbita e cam asa:main:-configureaza si porneste A/D-ul-configureaza si porneste Timer 1-autorizeaza intreruperile si intra in bucla de asteptare.Nopurile sunt ptr testare, nu au rol in program.ISR:-rearmeaza TMR1-verifica daca A/D a terminat conversie****-daca a terminat, ia esantionul si fa ce vrei cu el.****-daca n-a terminat, Pa Ilie! Ne vedem la intreruperea urmatoare.-iese din ISRBafta,Ciripmain;configure A/D converter banksel ADCON1 bsf ADCON1, ADFM banksel ADCON0 movlw b'10001001' movwf ADCON0;start A/D conversion bsf ADCON0, GO;configure Timer 1 movlw b'00110100' movwf T1CON movlw b'01000000' movwf INTCON;start Timer 1 bsf T1CON, TMR1ON banksel PIE1 bsf PIE1, TMR1IE;enable global interrupts bsf INTCON, GIEmain_loop nop nop nop nop goto main_loopRutina de intrerupere;======================;sterge flagul lui TMR1 banksel PIR1 bcf PIR1, TMR1IF;test if conversion is ready banksel ADCON0 btfsc ADCON0, NOT_DONE goto exit_int;if ready (DONE=0), retrieve the result and transmit data banksel ADRESL movf ADRESL, w;....... procesare esantionexit_int retfie ; return from interrupt

Link spre comentariu
  • 1 an mai târziu...

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări