Sari la conținut
ELFORUM - Forumul electronistilor

PIC12F629 AJUTOR!!!


Vizitator szilagyiandrei

Postări Recomandate

Vizitator szilagyiandrei

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
  • 2 săptămâni mai târziu...
  • Răspunsuri 28
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    3

  • kit

    2

  • puiu

    1

  • mdorian

    1

Top autori în acest subiect

Vizitator szilagyiandrei

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
Vizitator thenoble66

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

__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 :ras:

Link spre comentariu
Vizitator szilagyiandrei

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

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

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

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

Ai dreptate, sorry. :jytuiyu 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. :jytuiyu

Link spre comentariu
Vizitator szilagyiandrei

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

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

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