Vizitator thenoble66 Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Hai sa le luam pe rand. De ce valoarea 7 si ce face mai exact acest comparator? N-ai citit documentatia ... Acolo scrie la FIG. 6-2 (p.37) Dezactivat fiind, comparatorul nu face nimic. Daca n-ar fi fost dezactivat, s-ar fi comportat ca un comparator analogic obisnuit, adica compara o tensiune oarecare de intrare cu una de referinta si in functie de rezultat (>Vref, Exista vreo comanda pt a verifica daca un registru are valoarea 0? Tot in documentatie. In tabelul 10-2 stau sintetizate instructiunile PIC. Te uiti la coloana STATUS Affected si vezi o gramada de Z. Z insemna ca in timpul operatiei respective poate fi modificat bitul ZERO din registrul STATUS. Astfel o idee de testare ar putea fi (nu e singura): movlw b'11111111' andwf REGISTRU_DE_TESTAT, 0 btfss STATUS, Z goto Nu_E_ZeroE_Zero: ... 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) Ciudata intrebare... Inca nu sunt sigur, daca te referi la oscilatorul intern. Cu 4MHz poti face extrem de multe treburi intr-o secunda. Frecventa PWM de obicei e constanta, ceva de genul 1kHz. LEDurile se pot aprinde lejer la aceasta frecventa, crede-ma. Se modifica doar factorul de umplere. Mai detaliaza. thenoble66 Link spre comentariu
Vizitator szilagyiandrei Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Am citit documentatia dar fiind incepator nu inteleg exact termenii tehnici si mai fac erori ca cea despre care am vb pana acum. Dar de ce valoarea 7? Asta nu am inteles. in legatura cu valoarea 0 eu m-am gandit astfel sa adug valoarea 1 la acel registru si sa dau apoi decfsz, care va aduce registrul la valoarea initiala dar daca e zero atunci adaug un goto pt a ma trimite unde imi trebuie. despre PWM stiu ca se foloseste pt a controla motorase si se bazeaza pe inertie. la motorase inertia fiind mai mare nu e nevoie de frecvente asa ridicate, ledul insa nu are asa mare si atunci are nevoie de frecventa mai ridicata. PWM se bazeaza pe proportia dintre 1 si 0 intr-o unitate de timp. Ca ex: daca intr-o secunda sta in 1(logic) 5 zecimi atunci ledul va fi aprins la jumatate de intensitate, daca sta in 1(logic) 7 zecimi atunci va fi aprins la 70% din intensitate. Dar nu stiu care este frecventa la care sa pot face asa ceva. Sper sa nu gresesc cu explicatia eu vreau sa fac ceva de genul http://picprojects.org.uk/projects/rgb/ ... escription stiu ca este si softul acolo dar nu il inteleg plus ca vreau sa fie facut de mana mea. Link spre comentariu
Vizitator thenoble66 Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Dar de ce valoarea 7? Asta nu am inteles.Daca te uiti bine pe fig. amintita, vei vedea ca, comparatorul ESTE DECUPLAT DE PE PINI in momentul in care in registrul de configurare CMCON apare valoarea binara 00000111, adica 7.dau apoi decfsz, care va aduce registrul la valoarea initiala dar daca e zero atunci adaug un goto pt a ma trimite unde imi trebuie.Ideea nu e rea, dar implica modificarea valorii din registrul testat. Nu se poate folosi in cazurile in care testarea fata de 0 se refera la registru de port (GPIO in cazul tau), pentru ca implicit ai modifica iesirile de pe pini. Dealtfel DECFSZ sare peste instructiunea urmatoare (care poate fi un goto) chiar in cazul in care gaseste rezultat ZERO.Numele instructiunii vine din DECrement File and Skip if Zero.Cu PWM-ul ai prins esentialul.Mai ramane de studiat chiar programelul dat de tine drept exemplu.Succes.thenoble66 Link spre comentariu
Vizitator thenoble66 Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Apropo de testare de zero: ... movf REGISTRU_TESTAT,1 ; valoarea registrului se inscrie inapoi in registru, dar daca e zero, se modifica bitul Z !!! btfss STATUS, Z ; testam bitul Z - daca REGISTRU_TESTAT a fost zero, bitul Z va fi 1. Daca Z = 1, salt peste NU_E_ZERO si ajunge pe E_Zero goto Nu_E_ZeroE_Zero: ; a fost zero...Nu_E_Zero: ; nu a fost zero...iar in registrul testat nu am modificat nimic. thenoble66 Link spre comentariu
puiu Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 1. PMW nu se baseaza pe inertie, restul este corect.2. In cazul LED frecventa minima este data de ochiul uman, deoarece nu se doreste ca ochiul sa vada aprinderea LED. Avand in vedere ca la o frecventa de 50Hz ochiul nu vede aprinderea si stingerea unui LED rezulta ca la o frecventa mai mare nu se va vedea cu atat mai mult clipirea LED.3. Nici-o frecventa prea mare nu este buna dearece nu se deschide LED si nici nu se poate varia PMW cu o rezolutie prea buna. Puse la o lalta cele doua conditii daca te-ai hotarat la 1 kHz este foarte bine. Link spre comentariu
kit Postat Septembrie 10, 2010 Partajează Postat Septembrie 10, 2010 apoi daca esti asa de incepator, poate ar fi bine sa incepi prin a citi http://www.mikroe.com/ro/product/books/ ... icbook.htm poti de asemenea testa daca un registru este zero: movwf registru,0 andwf registru,0 apoi testezi daca rezultatul este zero, uitandu-te in STATUS,Z. parca asa era, ca n-am mai scris in ASM de ceva vreme... Link spre comentariu
mdorian Postat Septembrie 15, 2010 Partajează Postat Septembrie 15, 2010 Ca sa afli daca un registru este zero e suficient sa-l incarci in registrul de lucru , de exemplu: "MOVF REGISTRU,W " seteaza flagul Z daca valoarea este zero. Cat despre comportarea haotica a Led-urilor incearca sa nu folosesti instructiuni precum BSF sau BCF direct pe porturi pentru ca acestea citesc valoarea de pe pin, nu cea pe care ai scris-o tu anterior in port. E preferabil sa folosesti un registru tampon ca in urmatorul exemplu:;sterge registrul si GPIO clrf GPIO_T; registru tampon clrf GPIO ;seteaza bitul 0 bsf GPIO_T,0movf GPIO_T,Wmovwf GPIO; intarziere call delay;sterge bitul 0 bcf GPIO_T,0movf GPIO_T,Wmovwf GPIO poti sa folosesti un macro daca ti se pare ca e prea stufos codul Link spre comentariu
Vizitator szilagyiandrei Postat Octombrie 4, 2010 Partajează Postat Octombrie 4, 2010 Buna ziua din nou! Intampin urmatoarea problema:Am scris codul:WAIT MOVLW d'5' MOVWF Loop3 MOVLW d'97' MOVWF Loop2Loop NOP DECFSZ Loop1,1 GOTO Loop NOP DECFSZ Loop2,1 GOTO Loop DECFSZ Loop3,1 GOTO Loop RETURNDupa calculele mele ar trebui sa dureze aprox 0,5 secunde dar dureaza 1,2 secunde. Eu am calculat ca loop1 dureaza 1024 cicluri, loop2 executa de 97 de ori loop1 deci 99328 cicluri + ciclurile din loop2(97 * 4 = 388) = 99716 cicluri, la o viteza de ceas de 4Mhz = 1.000.000 cicluri rezulta aprox 1/10 dintr-o secunda. Daca Loop3 face de 5 ori intarzierea asta ar trebui in total sa am o intarziere de 0,5 secunde.GRESESC? Link spre comentariu
sofian Postat Octombrie 4, 2010 Partajează Postat Octombrie 4, 2010 loop1 este neinitializat prima data si o sa dureze un pic mai putinrestul calculelor sunt bine zic eucum ai dedus tu ca ai intirziere de 1,2 secunde ? Link spre comentariu
Vizitator thenoble66 Postat Octombrie 4, 2010 Partajează Postat Octombrie 4, 2010 Salut,Pai da, dar intre timp ai uitat sa repui valoarea de 97 in loop2, ceea ce a facut ca dupa primul loop de 97*1024 loop2 sa porneasca de la 0!De fapt de la al doilea ciclu incolo a rulat de 256 de ori.thenoble66 Link spre comentariu
Vizitator thenoble66 Postat Octombrie 4, 2010 Partajează Postat Octombrie 4, 2010 Durata reala era de fapt cam 1.15 secunde.Dupa toate calculele facute, inclusiv simulat in MPLABthenoble66 Link spre comentariu
Vizitator szilagyiandrei Postat Octombrie 4, 2010 Partajează Postat Octombrie 4, 2010 CORECT! Multumesc thenoble66 pt raspuns si pentru ca mi-ai salvat cateva fire de par de la albire ) Link spre comentariu
Vizitator thenoble66 Postat Octombrie 4, 2010 Partajează Postat Octombrie 4, 2010 Pentru putin Link spre comentariu
Vizitator szilagyiandrei Postat Octombrie 8, 2010 Partajează Postat Octombrie 8, 2010 Buna ziua! Am reusit sa fac un PWM din soft pt 12F629. Am atasat codul sursa. Astept opinii, critici si aspectele pozitive referitoare la modalitatea de realizare, memorie folosita, eficienta. Multumesc! 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