george81 Postat Mai 28, 2009 Partajează Postat Mai 28, 2009 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
sofian Postat Mai 28, 2009 Partajează Postat Mai 28, 2009 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
kit Postat Mai 30, 2009 Partajează Postat Mai 30, 2009 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 intreruperilereturnastea deoarece, conform datasheet, "The RESET vector is at 0000h and the interrupt vectoris at 0004h." codul scris de tine si pus la ORG 0x000: call InitLoop call Key_Pcall Key_Agoto Loopapartine 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
bogdan_ Postat Mai 30, 2009 Partajează Postat Mai 30, 2009 trecand peste partea cu cod-ul, oscilator ai pus pe PIC? Alimentarea e ok? Condensatoare de filtrare ai? Link spre comentariu
george81 Postat Mai 30, 2009 Autor Partajează Postat Mai 30, 2009 Salutare,Va multumesc pentru sfaturi!Am rezolvat problema, incredibil, am avut un SW defect (desi era nou) 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 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
bogdan_ Postat Mai 31, 2009 Partajează Postat Mai 31, 2009 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
kit Postat Mai 31, 2009 Partajează Postat Mai 31, 2009 Ai tot evitat inevitabilul, adica lucrul cu intreruperi... Este partea care da forta unui uC. Despre debounce poti gasi la http://www.mikroe.com/ro/product/books/ ... lavlje.htm mai multe informatii. 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