Sari la conținut
ELFORUM - Forumul electronistilor

PIC16F84A


george81

Postări Recomandate

Salut,Am scris aseara un mic cod pentru un PIC16F84A, partea HW se poate vedea in poza atasata.Eu am gandit softul in felul urmator: cat timp tin SW apasat LED-ul sa stea aprins, am testat codul pe simulator si pare a fi OK,dar cand il testez pe controler nu merge...imi scapa mie ceva???codul sursa: (sau atasat TXT file);********************************************************************** list p=16F84A ; list directive to define processor #include ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC;*********************Variables definition (RAM);**********************B_Flag EQU 1Eh ;********************************************************************** ORG 0x000 ; processor reset vector call InitLoop call Key_P call Key_A goto Loop;********************************************************************** Init clrf B_Flag bsf STATUS,RP0 ;Bank 1 bsf TRISA,3 ;RA3= INTRARE bcf TRISB,2 ;RB2= OUT bcf STATUS,RP0 ;Bank 0 bcf PORTB,2 ;LED OFF return;********************************************************************** Key_P btfsc B_Flag,4 ;Este RA3 deja apasat? return ;DA-> Return btfss PORTA,3 ;NU-> Test RA3 bsf B_Flag,4 ;E apsat returnKey_A btfss B_Flag,4 ;Testeaza bit 4 B_Flag (este 1) goto OFF goto ONON bcf B_Flag,4 ; sterge bitu din Flag bsf PORTB,2 ; LED ON returnOFF bcf PORTB,2 ; LED OFF return END **************************Va multumesc anticipat!George

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

Top autori în acest subiect

  • bogdan_

    2

  • george81

    2

  • kit

    2

  • sofian

    1

Top autori în acest subiect

softul la prima vedere merge dar este greoi de urmarit

 

uite cum as face eu

 

call Initloop_1bcf PORTB,2 ;LED OFFloopbtfsc PORTA,3  ;test butongoto loop_1bsf PORTB,2 ; LED ONgoto loop
Link spre comentariu

nu ma prea pricep la 16f84, dar, in plus fata de postul precedent, cred ca ar mai fi si:

un cod, la modul general, are:

ORG 0x000    ;vectorul de RESETgoto mainORG 0x004   ;vectorul de intreruperimovwf   w_temp            ; save off current W register contentsmovf	STATUS,w          ; move status register into W registermovwf	status_temp       ; save off contents of STATUS register; isr code can go here or be located as a call subroutine elsewherecall intmovf    status_temp,w     ; retrieve copy of STATUS registermovwf	STATUS            ; restore pre-isr STATUS register contentsswapf   w_temp,fswapf   w_temp,wretfiemain:  ;rutina principalagoto mainint:    ;rutina ce trateaza intreruperilereturn
astea deoarece, conform datasheet, "The RESET vector is at 0000h and the interrupt vector

is at 0004h."

 

codul scris de tine si pus la ORG 0x000:

call	InitLoop	 call	Key_Pcall	Key_Agoto	Loop
apartine de fapt rutinei main. Nu este incorect asa cum ai scris, dar nu-i fain. E adevarat ce nu ai folosit intreruperi, dar asa este mai complet si de aici poti merge cu dezvoltarea softului pe baza de intreruperi.

 

apoi,

__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

ar putea fi:

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

_WDT_OFF pentru ca nu am vazut in codul tau resetarea WDT-ului. Daca vrei sa folosesti WDT, pune undeva clrwdt, pentru a nu reseta jucaria la fiecare depasire WDT.

de asemenea, pinul de MCLR se leaga printr-o rezistenta de 10k la VDD (aici era de fapt hiba majora, cred eu).

nu stiu, trebuie de verificat daca oscilatorul este configurat corect, daca ai oscilator de 4MHz merge _XT_OSC, altfel trebuie consultat datasheetul.

intre VDD si VSS se pune, cat mai aproape de acestia, un condensator de 100nF, pentru filtraj.

 

un pas urmator ar fi sa folosesti IOC oferita de PORTB, in loc sa folosesti intrarea de pe PORTA.

bafta!

Link spre comentariu

Salutare,Va multumesc pentru sfaturi!Am rezolvat problema, incredibil, am avut un SW defect (desi era nou) :speriat Sofian, am testat si versiunea ta e foarte eficienta, functioneaza OK.Intradevar versiunea mea de soft e cam greu de urmarit, era o idee initiala. KIT, multumesc pentru idei, am tot evitat lucrul cu intreruperi :jytuiyu As mai avea o intrebare: voi ce metoda utilizati pt "debounce"? ma refer la o metoda soft nu HWEu pana acum am folosit un Delay, dar nu e prea ok,...PS: Schema electronica e mai stufoasa eu am postat doar partea unde aveam probleme...am Quartz de 4Mhz, doi conzi de 22pF si rez de 10K intre MCLR si 5V.Numai bine!George

Link spre comentariu

PS: Schema electronica e mai stufoasa eu am postat doar partea unde aveam probleme...am Quartz de 4Mhz, doi conzi de 22pF si rez de 10K intre MCLR si 5V.

Ok. Te-am intrebat asta pentru ca de curand am avut o experienta neplacuta cu cineva care avea o problema similara cu tine, dar care intr-un final nu pusese quartz-ul.Succes mai departe!
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