spinach Postat Mai 4, 2016 Partajează Postat Mai 4, 2016 salutam, Deci , -chipul este mega48PA , cu cristal de 20Mhz -utilizat timer1 ,16 biti ,in regim Fast PWM , cu esire OC1A pe normal si esire OC1B pe invers -reglaj TOP cu OCR1A -reglaj df cu OCR1B timerul merge cam asa -porneste , din exterior ; utilizam o intrare pe INT0 , intrerupere-> activare timer pwm -dupa pornire se numara un numar cicli n , un contor in program -dupa n cicli , se opreste Cerinta ar fi : -ca in mersul timerului , sa nu fie deranjat de program -timpi de pornit / oprit sa fie cit mai mici problema 1 - cum numarar cicli de timer pwm var 1.utilizind intrerupere coment-intreruperea cred va deranja programul 2.utilizind flagul OCF1A coment-dupa utilizare , flagul trebuie sters , deci o operatie in plus 3.utilizind informatia despre starea unei esiri OC dar nu stiu daca se poate ca in program sa se utilizeze starea unei esiri OCR ;nu stiu nici cam in ce timp este disponibil in program starea de pe OC 4.Citind contorul pentru valoare de TOP Problema 2 - cum oprim timerul pwm var1-resetam permanent contor ; contorul fiind pe 16 biti , nu imi dau seama in cit timp se poate reseta var2-oprim/pornim din clock select ; se pare ca dureaza intre 1-N cicluri , N=prescalarea var3-utilizam TSM activat [fara utilizare timer0] si scriem/stergem PSRSYNC ; aici am inteles ca se pastreaza starea prescalarii dar imi este neclar ce se intimpla cu contorul . Link spre comentariu
nico_2010 Postat Mai 5, 2016 Partajează Postat Mai 5, 2016 Prezinta aplicatia pe care vrei sa o realizezi si vei primi sfaturi.Altfel sunt doar generalitati pe care ti le poti lamuri citind DS a microcontroller-ului. Link spre comentariu
ratza Postat Mai 5, 2016 Partajează Postat Mai 5, 2016 Cel mai simplu e să foloseşti întreruperea de output compare din fast PWM şi top setat pe OCR1A (WGM1[3:0] setat pe 1111). Timerul se resetează automat imediat cum ajunge la top, adică exact cînd îţi generează întreruperea. Link spre comentariu
spinach Postat Mai 5, 2016 Autor Partajează Postat Mai 5, 2016 Aplicatia am mentionat ; furnizeaza la exterior un semnal pwm , pe doua esiri , una pe normal , cealalta pe invers. Mcu are folosite 5 intrari care definesc frecventa si df de la pwm . Se numara cicli care sint facuti de timer ; dupa 10 cicli , timerul se opreste ; pornire times se face din exterior , folosind o intrerupere externa . Link spre comentariu
nico_2010 Postat Mai 5, 2016 Partajează Postat Mai 5, 2016 Ca sa traduc in limba romana si pentru altii: ai definita o frecventa minima (sau maxima, nu este clar) F si un interval dF de baleiere.Doresti ca dupa 10 cicluri de baleiere timer-ul sa se opreasca, iar repornirea sa se faca dupa aplicarea unui impuls pe INT0/1. Este corecta traducerea?Daca da, unde te-ai impotmolit? Tu vrei sa primesti solutia software de-a gata, sau ai muncit ceva si intampini probleme?L.E.: Sau poate dF este o variabila care defineste factorul de umplere!? Link spre comentariu
spinach Postat Mai 8, 2016 Autor Partajează Postat Mai 8, 2016 da ; df este prescurtare de factor umplere setat cu OCR1B . OCR1A , va da frecventa de lucru . Eu nu vreau soft scris. Am nevoie de idei ; momentan inca fac proiectul . De exemplu eu nu am folosit niciodata bitul PSRSYNC pentru on/off timer , asta in ideia ca nu folosec timerul 0 ; ar fi mai rapid decit sa sterg permant TCNT1 ? Link spre comentariu
nico_2010 Postat Mai 9, 2016 Partajează Postat Mai 9, 2016 Ca sa primesti raspunsuri trebuie sa faci experimente si acolo unde nu te descurci iti putem da sfaturi. Altfel ...Ca idee, nu am folosit niciodata bitul PSRSYNC pentru orpirea/pornirea timerelor, pentru asta folosesc combinatia de biti CSx2...0 (x=0,1 sau 2) si nu am gandit vreo aplicatie care sa ceara pornirea/oprirea simultana a Timer0 si Timer1. Link spre comentariu
spinach Postat Mai 9, 2016 Autor Partajează Postat Mai 9, 2016 OK; am inteles . In ds scrie ca operatia de on/off cu PSRSYNC , este mult mai rapida decit cu CSuri , cind avem N >1 , deoarece la pornire timer la inceput face un numar de cicli egal cu N Dar daca il opresc prin stergere contor ? Adica fac TCNT1=0 , cit imi trebuie ; ce se va intimpla ? Link spre comentariu
nico_2010 Postat Mai 9, 2016 Partajează Postat Mai 9, 2016 Una este sa opresti timerul (si pentru asta ai la dispozitie fie bitul PSRSYNC in registrul GTCCR, fie bitii CSx2...0 in TCCRxB), alta este sa stergi(resetezi) continutul registrilor TCNT1H/TCNT1L.Insa ceva tot nu inteleg: ce aplicatie asa pretentioasa vrei? Nu ma intereseaza decat cel mult cu titlu informativ pentru a-ti da, eu sau ceilalti colegi de forum, indicatii cat mai adecvate.Altfel, te invit frumos sa faci experimente si sa tragi concluzii singur si sa apari din nou cand ai probleme reale de implementare nu teorii izvorate din comoditatea de a nu experimenta Link spre comentariu
ratza Postat Mai 9, 2016 Partajează Postat Mai 9, 2016 Dacă-ţi faci probleme de 2 cicli pentru resetat un timer, ţine cont că saltul în întrerupere ia vreo 12. Link spre comentariu
spinach Postat Mai 9, 2016 Autor Partajează Postat Mai 9, 2016 (editat) Pilot pentru o baza de timp . Ori ca il opresc , ori ca il fac tot timpul zero contorul ,dupa mintea mea , cred ca ar fi cam la fel. Cind genereaza un timp de 0.2s , 2 , 3 cili nu conteaza ; dar cind genereaza un timp de 0.1us , 3 cicli=cam 33% Editat Mai 9, 2016 de hspinache Link spre comentariu
nico_2010 Postat Mai 10, 2016 Partajează Postat Mai 10, 2016 Hmmm, 100ns ... si cam ce frecventa ar trebui sa aiba quartzul? Ca daca pui 20MHz, un impuls de ceas este de 50ns (la care adaugi deriva termica a quartzului - tipic +/-20ppm) ar trebui sa contorizezi 2 impulsuri de ceas si la asta adaugi cei 12 cicli de ceas ceruti de tratarea intreruperii (cum zicea ratza) si proiectul tau - pentru un timp asa de scurt - s-a dus ... Pentru timpi asa de scurti cauta alta solutie, nu asta. Link spre comentariu
ratza Postat Mai 10, 2016 Partajează Postat Mai 10, 2016 Nu poţi obţine ce vrei, cel puţin nu cu 100ns. Link spre comentariu
spinach Postat Mai 10, 2016 Autor Partajează Postat Mai 10, 2016 Nu pot folosi cristal de 20mhz; nu mai iese socoteala pentru valori mari de timp ; folosec 12 Mhz . Din calcul acopera 0.1us-0.5s Inca nu inteleg de ce sa nu mearga pe 0.1us ; din ce am citit , am inteles ca timerul odata pornit , ruleaza , indifernt de ce se intimpla in program ; intreruperile afecteaza programul in principal . Da , in mod sigur operatiile de pornit/oprit vor fi afectate de modalitatea de lucru ; din acesta cauza , o sa sincronizez la 10 cicluri Deci , parerea vostra privind oprirea timerului : opresc prin utilizare PSRSYNC sau scriu permanent TCNT1=0 ? Link spre comentariu
nico_2010 Postat Mai 10, 2016 Partajează Postat Mai 10, 2016 Ai inceput cu un quartz de 20MHz si acum spui ca vei folosi unul de 12MHz. E mai rau decat prima varianta si asta pt ca impulsul de ceas este de 83 ns. Timerul cu prescaler 1 va numara la fiecare 83 ns, care nu se potriveste de niciun fel cu 100ns. Si asta fara sa iei in calcul timpii pentru salt la intrerupere, tratarea continutului ei si revenirea in programul principal. Succes si sa ne arati si noua minunea Link spre comentariu
Postări Recomandate