ardiles Postat Ianuarie 16, 2015 Partajează Postat Ianuarie 16, 2015 (editat) 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 Ianuarie 16, 2015 de ardiles Link spre comentariu
marianx Postat Ianuarie 16, 2015 Partajează Postat Ianuarie 16, 2015 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
Vizitator cpu54321 Postat Ianuarie 16, 2015 Partajează Postat Ianuarie 16, 2015 Buna searama intereseaza daca cineva a luctrat cu ecrane LCD TFT + touch cu 34 de pini ci slot SD conectat la pic? Link spre comentariu
Liviu M Postat Ianuarie 16, 2015 Partajează Postat Ianuarie 16, 2015 @marianx: dupa parerea mea nu resetezi flagurile de la intreruperi, drept pentru care intri de fiecare data in rutina de tratare a intreruperilor. Habar n-am cum se face asta in flowcode, in c ar fi TMR0IF = 0.@cpu54321: esti offtopic. Link spre comentariu
ardiles Postat Ianuarie 16, 2015 Partajează Postat Ianuarie 16, 2015 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
Liviu M Postat Ianuarie 16, 2015 Partajează Postat Ianuarie 16, 2015 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
marianx Postat Ianuarie 16, 2015 Partajează Postat Ianuarie 16, 2015 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
bercioiu Postat Ianuarie 17, 2015 Autor Partajează Postat Ianuarie 17, 2015 (editat) 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 Ianuarie 17, 2015 de bercioiu Link spre comentariu
Liviu M Postat Ianuarie 17, 2015 Partajează Postat Ianuarie 17, 2015 Este redundant. Se dezactiveaza automat cand iese din macroul interuperii.OK, asta e raspunsul la "nedumerirea" mea de mai sus. Multumesc. Link spre comentariu
bobinatorul Postat Ianuarie 17, 2015 Partajează Postat Ianuarie 17, 2015 (editat) 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 Ianuarie 17, 2015 de bobinatorul Link spre comentariu
Elison Postat Ianuarie 17, 2015 Partajează Postat Ianuarie 17, 2015 Cel mai bine ar fi sa folosesti ReadAsInt(),o sa ai o rezolutie mult mai mare,zece biti in cazul in care folosesti 18F252. Link spre comentariu
bobinatorul Postat Ianuarie 17, 2015 Partajează Postat Ianuarie 17, 2015 (editat) cu mine Masa picului nu era comuna cu masa sursei. Saptamana viitoare il voi posta la proiecte Editat Ianuarie 17, 2015 de bobinatorul Link spre comentariu
marianx Postat Ianuarie 18, 2015 Partajează Postat Ianuarie 18, 2015 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. Link spre comentariu
bobinatorul Postat Ianuarie 31, 2015 Partajează Postat Ianuarie 31, 2015 Se poate "sensibiliza" intrarea adc pentru citirea directa a tensiunii de pe rezistenta de sunt (0.22 R)?Am deja cablajul facut si n-as vrea sa mai fac altul cu un operational. Caderea pe sunt va fi cel mult 1.1V. Link spre comentariu
ardiles Postat Februarie 1, 2015 Partajează Postat Februarie 1, 2015 Nu cumva, acel shunt, este pentru masurare curent? 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