Sari la conținut
ELFORUM - Forumul electronistilor

PIC12F629 AJUTOR!!!


Vizitator szilagyiandrei

Postări Recomandate

Vizitator thenoble66

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
  • 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

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

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

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

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

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
  • 3 săptămâni mai târziu...
Vizitator szilagyiandrei

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

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 szilagyiandrei

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

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