Mar Postat Februarie 4, 2005 Partajează Postat Februarie 4, 2005 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
Cristiano Postat Februarie 4, 2005 Partajează Postat Februarie 4, 2005 Foloseste, te rog, nume simbolice pentru registri: STATUS, ADCON0, etc. Codul va fi mult mai usor de citit si inteles. Link spre comentariu
cirip Postat Februarie 4, 2005 Partajează Postat Februarie 4, 2005 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
Mar Postat Februarie 7, 2005 Autor Partajează Postat Februarie 7, 2005 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
bogdanel Postat Februarie 7, 2005 Partajează Postat Februarie 7, 2005 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
cirip Postat Februarie 7, 2005 Partajează Postat Februarie 7, 2005 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
Vizitator adadinu Postat Aprilie 11, 2006 Partajează Postat Aprilie 11, 2006 sal are cineva o documentatie in romana pentru 16f877. daca are cineva asa ceva sa ma ajute si pe mine astept un raspuns la mail [email protected] mersi Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum