Sari la conținut
ELFORUM - Forumul electronistilor

Lucreaza cineva cu FLOWCODE ?


Postări Recomandate

are dreptate LiviuM!

Timer0 nu foloseste prea mult procesor!

setarea prescalerului inseamna ca daca am avea o frecventa a clock-ului de 12hz(adica ar rula programul de 12 ori pe secunda), si am seta prescalerul la 1:4, asta ar insemna ca 1 din 3 "rulari", va trata si macro-ul ce-l apeleaza in rutina de intrerupere...adica odata la 300ms va rula rutina de intrerupere... pe rand!

cred ca ti-ai imaginat ca acel prescaler, face ca rutina de intrerupere sa ruleze in paralel, la alta frecventa decat cea a ceasului intern si ca ii consuma resursele... NU functioneaza in paralel...

si uite asa, i-ai reatras atentia colegului Vezi Muti, asupra topicului...

 

LE: ca sa incerc sa te lamuresc:

si TMR0 si TMR1 si 2 si cate or mai fi, fac automat ceea ce face "manual" IOC(PORT)...

adica primele enumerate daca sunt active, trateaza automat, singur, fara comanda externa, trateaza rutina(macro-ul), ce-l apeleaza intreruperea respectiva(sau macrourile ca poate sunt mai multe daca sunt active mai multe intreruperi),

IOC(PORT), executa rutina dedicata doar la comanda externa(zic eu: manuala)!

intelegand astea, IOC(PORT), mai ruleaza in paralel cu frecventa procesorului? dar celelalte? avand in vedere ca toate sunt acelasi lucru: intreruperi din rularea programului normal(din main)...

Editat de ardiles
Link spre comentariu

Initial am setat prescalerul pt tmr0 la 1/4 si am rulat simularea in flowcode. Acum poate o fi limitata viteza simularii, dar chiar si cu o frecventa de simulare de 5Hz programul apela prea des subrutina apelata de tmr0, sarind dupa nici o instructiune a programului principal in subrutina timerului si iar inapoi la principal etc.

 

Stiu ca nu ruleaza in paralel, asta am observat, toate instructiunile se executa pe rand. La asta ma refeream cand am spus ca ocupa prea mult procesor. De fapt prea mult timp din procesor.

tmr0 si tmr1 ruleaza oricum independent de codul incarcat daca sunt activate, generand 255 biti, apelarea subrutinei facandu-se la trecerea inapoi in 0 a timerelor (overflow). Se poate schimba acest numar prin initializarea timerului de la un numar mai mare, nu 0, dar inca n-am testat asta.

 

Cel putin asta am inteles din cele citite prin diverse locuri, corectati-ma daca gresesc.

Link spre comentariu

Habar n-am cum se face asta in flowcode, in c ar fi TMR0IF = 0.

se adauga un macro in care se scrie un cod c "tmr0 = 0x00;"

am gasit asta intr-o aplicatie...nu e opera mea...

 

dar sunt situatii, cum ar fi exemplul cu masurare de frecventa(mai ales varianta mea nepostata aici, in care totul se trateaza in bucla main, microcontrolerul ar sta blocat ca asteapta flanc pozitiv apoi negativ de la semnalul ce-l masoara, apoi incrementeaza o variabila; daca nu ar trata rutina de intrerupere, microcontrolerul ar fi blocat pe masurarea frecventei si chiar nu are sens sa se reseteze flagul intreruperii...

poate in alte situatii, trebuie resetat flagul intreruperii...depinde de situatie...parerea mea.

Link spre comentariu

Sorry, n-am inteles. De ce sa nu intre in rutina de tratare a intreruperilor?Cand un eveniment genereaza o intrerupere, seteaza de fapt flag-ul corespunzator. Cand tratezi intreruperea, intri in rutina de tratare a intreruperii, faci prelucrarile necesare, resetezi flagul care indica intreruperea si iesi. Daca nu resetezi flagul, e ca si cum ai avea un nou eveniment - la urmatorul puls de ceas reintri in rutina de tratare a intreruperii, ceea ce nu e chiar de dorit.Resetarea flagului se face DUPA tratarea intreruperii.

Link spre comentariu

Am incercat si cu dezactivarea intreruperii tmr0 dupa ce-mi ducea variabila TIMER1 la numarul setat, dupa care afisam rezultatul, resetam variabilele si tmr0 (cu un cod C, tmr0=0x00)  si retrimiteam programul inapoi la punctul de unde se activa din nou tmr0.

Desi era functional, nu indica frecventa corecta, pe langa o variatie destul de mare a valorii citite.

 

In codul frecventmetrelor la care m-am mai uitat nu am vazut sa se dezactiveze nici o intrerupere, in alte aplicatii insa da. Mai am de citit sa inteleg exact ce se intampla si sa mai experimentez.

 

Am executat montajul pe o placuta de test, merge exect ca in simularea din Proteus, citeste bine frecventa (am masurat semnalul de la intrare cu un frecventmetru) doar ca nu functiona stabil, se bloca din cand in cand, ba nu pornea deloc, daca apropiam degetul de PIC se aprindeau toate segmentele afisajului.

Poate firele prea multe de pe placa de test si prea lungi, poate PIC-ul cumparat de la Mivarom de calitate proasta, n-am idee. Il voi pune pe un cablaj proiectat corect, ar trebui sa functioneze mai bine.

 

Voi incerca si varianta numararii impulsurilor pe pinul de intrare fara intrerupere, in programul principal, sa vad care varianta e mai exacta.

 

Multumesc frumos pentru implicare!

Link spre comentariu

In Flowcode nu trebuie sa dezactivezi "cu mana" flagurile intreruperilor. Este redundant. Se dezactiveaza automat cand iese din macroul interuperii.

Cea mai buna varianta de masurare a frecventei este cea in care impulsurile sunt numarate de RB0, intr-o unitate de timp fixata de un timer, spre exemplu, la 4 MHZ clock pic, pui rata  prescalerului si postscalerului la 1:1 si valoarea rollover la 250. Obtii o intrerupere cu frecventa de 4KHz. Incrementezi cu "1" o variabila in macroul intreruperii activata de RB0 si in macroul intreruperii TMR2 alta variabila. Cand variabila din TMR2 a ajuns la 4000,(a trecut o secunda) copiezi variabila incrementata de RB0 si o afisezi (RPS) dupa care resetezi variabila respectiva si ciclul se reia. Mai departe, pentru a afisa RPM inmultesti cu 60.

Asta iti va afisa la o secunda valoarea rotatiei, daca vrei un refresh mai scurt, lasi variabila din TMR0 sa numere pana la 1000 (spre exemplu) si o inmultesti cu 4 cand a ajuns la 1000, dupa care o resetezi...

Editat de bercioiu
Link spre comentariu

Gandindu-ma ca torumetrul ar merge pe post de frecventmetru am inceput realizarea unei "scule" care sa fie dotata cu acesta dar si cu un voltmetru dublu.

Am inceput cu voltmetrul avand zic eu o logica mai usoara.Functioneaza ok mai putin partea de afisare a tensiunii si anume valoare afisata variaza foarte repede de la zero la 30 V indifferent ca am tensiune la intrare sau nu.Are cineva idee unde gresesc?Sa fie din cauza ca folosesc variabile string si float?Asta mi s-a parut cea mai simpla solutie de a-mi afisa si zecimale.

Sau din cauza ca folosesc adc ca read as byte in loc de read as voltage?

sursa.rar

Editat de bobinatorul
Link spre comentariu

Am terminat montajul, functioneaza bine. Aveam probleme pe placuta de test, ca si pe cablajul terminat din cauza pinului MCLR, il lasasem liber (e configurat PIC-ul pt MCLR intern). Dupa ce i-am montat o rezistenta de 10k la +5V nu mai sunt probleme, functioneaza stabil.

 

Cablajul l-am proiectat in graba, nu e foarte bine facut, ar fi mers mult mai compact. Ca senzor am folosit un optoculpor (detector de fum cred ca este) gasit prin casa. Are un led infrarosu si un fototranzistor, dispuse in unghi unul fata de celalalt intr-o carcasa mica de plastic. Pentru citire rotatii am lipit o eticheta mica de hartie alba pe ventilatorul caruia ii citeam turatia.

 

Posted Image

 

Posted Image

 

Posted Image

Link spre comentariu
  • 2 săptămâni mai târziu...

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