Vizitator szilagyiandrei Postat August 31, 2010 Partajează Postat August 31, 2010 Buna ziua! Sunt incepator si am intampinat o problema cu un PIC12F629. Am scris urmatorul program: cblock 0x20 loop1 loop2 endc org 0x00 goto startdelay decfsz loop1,1 goto delay decfsz loop2,1 goto delay returnstart bsf 03h,5 movlw b'11111000' movwf 85h call 0x3ff movwf 90h bcf 03h,5 clrf 05hmain bsf 05h,0 call delay bsf 05h,1 call delay bsf 05h,2 call delayhere goto here endDupa mine ar trebui sa se aprinda pe rand GP0,GP1,GP2 si sa ramana aprinse, insa se aprinde GP0 se stinge GP0 se aprinde GP1, se stinge GP1 se aprinde GP2 care ramane aprins.Mentionez ca am un programator AD-PIC03(de la Adelaida) si folosesc ic-prog 106B, cand il scriu ii dau IntOSC GP4 si toti Fuses Bits debifati.Daca continui pe celalate iesiri(exceptand GP3 care este doar input si nu il folosesc) picul se comporta conform asteptarilor adica, se aprind in ordine (dupa un delay) si se sting in ordinea inversa aprinderii. De ce nu se comporta conform asteptarilor? Link spre comentariu
Vizitator thenoble66 Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Salut,Din pacate nu se cunosc - din punerea problemei - setarile bitilor de configurare.Cel mai probabil WDT este lasat pe Enabled.thenoble66 Link spre comentariu
Vizitator szilagyiandrei Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 eu zic ca nu este lasat pe enabled pt ca debifez casuta corespunzatoare lui WDT. De fapt debifez toate casutele de la bitii de configurare. imi puteti spune cum sa integrez in codul sursa debifarea bitilor de configurare fara a folosi comanda "__config", doresc sa accesez direct registrii pentru a intelege mai bine. Multumesc!!! Link spre comentariu
Liviu M Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Din cate stiu eu, bitii de configurare se pot seta numai cu comanda __config(). Link spre comentariu
Vizitator thenoble66 Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Din pacate n-aveti cum sa accesati registrul de configurare, pentru ca - se specifica in documentatie - controlerul insusi nu are acces la acesti biti. Registrul de configurare se afla la o adresa in afara domeniului programabil (2007h).Folositi MPLAB, cumva? Acolo functioneza bine __config...thenoble66 Link spre comentariu
kit Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT este un exemplu de initializare toti bitii de configurare ii gasesti in fisierul P12F629.INC: ;==========================================================================;; Configuration Bits;;==========================================================================_CPD_ON EQU H'3EFF'_CPD_OFF EQU H'3FFF'_CP_ON EQU H'3F7F'_CP_OFF EQU H'3FFF'_BODEN_ON EQU H'3FFF'_BODEN_OFF EQU H'3FBF'_MCLRE_ON EQU H'3FFF'_MCLRE_OFF EQU H'3FDF'_PWRTE_OFF EQU H'3FFF'_PWRTE_ON EQU H'3FEF'_WDT_ON EQU H'3FFF'_WDT_OFF EQU H'3FF7'_LP_OSC EQU H'3FF8'_XT_OSC EQU H'3FF9'_HS_OSC EQU H'3FFA'_EC_OSC EQU H'3FFB'_INTRC_OSC_NOCLKOUT EQU H'3FFC'_INTRC_OSC_CLKOUT EQU H'3FFD'_EXTRC_OSC_NOCLKOUT EQU H'3FFE'_EXTRC_OSC_CLKOUT EQU H'3FFF'semnificatia lor probabil ca o regasesti in manual, desi mie mi se par destul de intuitiv denumite.mai departe, asta am eu ca template: ; these first 4 instructions are not required if the internal oscillator is not usedmain call 0x3FF ; retrieve factory calibration value bsf STATUS,RP0 ; set file register bank to 1 movwf OSCCAL ; update register with factory cal value bcf STATUS,RP0 ; set file register bank to 0; remaining code goes here...din cate stiu eu aceste instructiuni cam trebuie sa fie primele, tu mai ai inca ceva in cod. nu stiu daca e nociv sau nu, dar nu cred ca se include la "best practice" cum ai facut tu.in loc sa te joci cu bcf STATUS,RPx poti folosi macroul banksel registru de exemplu, banksel TRISA, banksel PORTA... mai departe, sincer, n-am citit, eu prefer sa vad denumirea SFR decat adresa lui. bafta! erata: (ce pot sa ma enervez, pe mine, imi, mi) am uitat: Configure->Configuration bits, iar in meniul care apare se bifeaza "Configuration bits set in code" daca nu mai bagam si o erata n-as fi fost eu Link spre comentariu
Vizitator szilagyiandrei Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Am rescris codul(si am tinut cont de recomandarile si precizarile dvs):list p=12F629 #include __CONFIG _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_OFF & _INTRC_OSC_NOCLKOUTmain org 0x0000 call 0x3FF banksel OSCCAL movwf OSCCAL cblock 0x20 ;rezerva spatiu pt variabilele loop1 si loop2 loop1 loop2 endc movlw b'11111100' banksel TRISIO movwf TRISIO banksel GPIO clrf GPIOdelay decfsz loop1,1 goto delay decfsz loop2,1 goto delay return bsf GPIO,0 call delay bsf GPIO,1HERE goto HERE endin mod normal ar trebui sa se aprinda gp0(pinul 7) sa astepte (durata procedurii delay), dupa sa se aprinda gp1(pinul 6) si sa ramana aprinse amandoua; la mine nu se aprinde nici unuldupa toate testele pe care le-am facut pana acum comportament ciudat am obtinut NUMAI pe acesti 2 pini si nu inteleg de ce. Multumesc inca odata pt ajutor!!! Link spre comentariu
Vizitator thenoble66 Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Pai da: 12F629 are un comparator, care este cuplat dupa un reset, deci se impune dezactivarea lui. Pe de alta parte acea temporizare (delay) dureaza f. putin. Dupa un calcul sumar iese ca la un ceas de 4MHz dureaza cam 197ms, ceea ce cu ochiul liber abia se observa. Am marit timpul de 4x. Vezi modificarile in cod. #include <p12F629.inc> list p=12F629 __CONFIG _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_OFF & _INTRC_OSC_NOCLKOUT cblock 0x20 ;rezerva spatiu pt variabilele loop1 si loop2 loop1 loop2 loop3 endcmain org 0x0000 goto startdelay movlw 5 movwf loop3delay1 decfsz loop1,1 goto delay1 decfsz loop2,1 goto delay1 decfsz loop3,1 goto delay1 returnstart call 0x3FF banksel OSCCAL movwf OSCCAL movlw b'11111100' banksel TRISIO movwf TRISIO banksel GPIO clrf GPIO movlw 7 movwf CMCON bsf GPIO,0 call delay bsf GPIO,1HERE goto HERE end Succes! thenoble66 Link spre comentariu
Liviu M Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Din cate reusesc eu sa inteleg (assemblerul nu e chiar cel mai bun prieten al meu), n-ai dezactivat ADC-ul. Din tabelul de la pag. 48 (data sheet), dupa reset pic-ul tau porneste cu pinii configurati ca intrari analoge. thenoble66 a fost mai rapid (eu a trebuit sa dau o fuga pana la microchip, sa fac rost de data-sheet). Link spre comentariu
Vizitator thenoble66 Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 PIC12F629 nu are AD.Intr-adevar, comparatorul e analogic in sensul strict al cuvantului, dar la pag.48 din doc. e vorba de registrii care intra in joc la convertorul AD, fara efect la 12F629.thenoble66 Link spre comentariu
Liviu M Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Ai dreptate, sorry. Nu cunosc circuitul asta; m-am uitat special in Data-Sheet ca am banuit ca de la partea analogica vine problema.Din pacate n-am fost suficient de vigilent. Link spre comentariu
Vizitator thenoble66 Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Ramane intre noi. Eu unul sper sa functioneze circuitul lui szilagyiandrei. thenoble66 Link spre comentariu
Vizitator szilagyiandrei Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 problema mea este ca dupa ce se aprinde gp1 se STINGE gp0 ceea ce nu ar trebui dupa cunostintele mele(nu conteaza daca delay-ul e scurt sau lung). corectati-ma daca gresesc. ideea mea a fost sa fac un running light cu 5 leduri in felul urmator GP0 - LED1 GP1 - LED2 GP2 - LED3 GP4 - LED4 GP5 - LED5 nu o sa mai scriu secventa de initializare, ci doar comanda porturilor BSF GPIO,0 CALL DELAY BSF GPIO,1 CALL DELAY BSF GPIO,2 CALL DELAY BSF GPIO,4 CALL DELAY BSF GPIO,5 CALL DELAY BCF GPIO,0 .... BCF GPIO,5 IN LOC SA SE APRINDA PE RAND CELE 5 LEDURI(DUPA UN DELAY) DE LA GP0 LA GP5 SI APOI SA SE STINGA DE LA GP0 LA GP5, MIE MI-SE APRINDE GP0 APOI GP1 DAR SE STINGE GP0 CARE AR TREBUI SA SE STINGA DUPA CE S-A APRINS GP5. DECI PROBLEMA E CA SE STINGE GP0 CAND SE APRINDE GP1 FARA SA-I DAU EU COMANDA, LA FEL SE INTAMPLA SI CU GP1 CAND SE APRINDE GP2, RESTUL PORTUEILOR SE COMPORTA CONFORM COMENZILOR. MULTUMESC!!! Link spre comentariu
Vizitator szilagyiandrei Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 MERGE IN SFARSIT!!!Am scapat din vedere comparatorul!!!De ce valoarea 7 si ce face mai exact acest comparator?MULTUMESC MULT!!! Link spre comentariu
Vizitator szilagyiandrei Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Daca tot am deschis topicul as mai avea 2 intrebari:Exista vreo comanda pt a verifica daca un registru are valoarea 0?Eu m-am gandit ca daca nu exista sa fac un truc: sa adaug la acel registru valoarea 1 si apoi sa folosesc comanda decfsz.Si a doua e legata de PWM pt leduri, cam ce frecventa e necesara pt a avea un control al intensitatii intre 0-100%? (cat sa stea aprins si cat stins, m-ar interesa pt oscilatorul intern, 4mhz)MULTUMESC INCA O DATA!!!! 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