Jump to content
ELFORUM - Forumul electronistilor

Problema cu A/D la PIC 16F877


Mar

Recommended Posts

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 to comment
  • Replies 6
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

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 to comment

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 to comment

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 to comment

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 to comment
  • 1 year later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines