Sari la conținut
ELFORUM - Forumul electronistilor

cum se pot realiza timere cu pic?


ovy_pas

Postări Recomandate

Am o valoare care trebuie afisata pe afisor cu 3 digiti 7 segmente.Valoarea este citita la o intrare analogica a pic 16f870. Pentru afisare am facut pe o placa experimentala varianta 1.[attachment=0]AFISAJ 7 SEGMENTE.JPG[/attachment]Valoarea citita nu este stabila variaza foarte repede intre 2 valori consecutive si astfel ultimul digit afiseaza 2 cifre suprapuse.De exemplu valoarea oscileaza intre 23 si 24 pe digitul zecilor se afizeaza 2 iar pe digitul unitatilor se va spurapune 3 peste 4 si va afisa un 9.Aceasta problema am rezolvat-o prin citirea valorii analogice la 1 secunda astfel ca ochiul sa aiba timp sa perceapa valoarea afisata pe digit.Pentru intarzierea de 1 secunda am folosit in MicroC functia Delay_ms(1000); functie care ingheata programul timp de o secunda.Vreau sa pun montajul intr-o carcasa si din lipsa de spatiu am nevoie sa realizez varianta 2. Aici va trebui sa fac aprinderea digitilor pe rand la intervale de timp mici si ochiul sa nu perceapa. (Voi pierde din luminozitatea digitilor dar castig spatiu, digitii luminau destul de tare la prima varianta)Cum pot sa realizez in pic-ul meu 4 timere? unul pentru citirea la 1 secunda a valorii la intrarea analogica, si ceilalti 3 pentru succesiunea afisarii digitilor astfel incat ei sa lucreze "independent" adica sa nu astept 1 s si apoi iar sa fac succesiunea digitilor si tot asa.

Link spre comentariu
  • Răspunsuri 76
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • ovy_pas

    31

  • Liviu M

    24

  • Elef

    11

  • Eugen_B

    4

Top autori în acest subiect

Multiplexarea vreau sa o fac in softul microcontrolerului.Daca nu m-am facut inteles am nevoie de 2 temporizari "independente" care sa imi lucreze "in paralel" adica in acelasi timp. Cum pot realiza acest lucru cu un microcontroler?

Link spre comentariu

Timer 0 pentru intarzierea "scurta" si timer 1 pentru intarzierea lunga.

In exemplul urmator (pentru picc de la www.htsoft.com) cu timer 1 "numar" secundele, iar cu timer 0 masor intervalul intre 2 flancuri venite pe RB0. Flancurile astea genereaza intreruperi in care numar cat intreruperi a generat timer 0.

In cazul tau iti trebuie doar comutarea unor biti (in genul ucClkInt in cazul timer1 la mine), unul in fiecare caz, biti la care sa te uiti in programul principal.

Cand e cate unul activ, dai comenzile necesare (achizitie sau afisarea pe unul din digit) mai departe.

Mai trebuie, bineinteles, setate perioadele de generare a intreruperilor, in functie de frecventa de ceas si prescalere.

 

interrupt isr(void){   CLRWDT();     if(TMR1IF && TMR1ON)  /*ceas*/   {       T1CON = 0b00001110;    // stop the timer        TMR1L = 0x00;              TMR1H = 0x80;          // ~ 1 sec       T1CON = 0b00001111;    // start the timer              ucClkInt = 1;         TMR1IF = 0;   }   if(RCIF)    /*comunicatie seriala*/   {       bRxInt = 1;       if(ucGlIdx >= 16)          ucGlIdx = 0;       if(RCREG != 'c')       {          ucComBuf[ucGlIdx] = RCREG;          ucGlIdx++;          bTxStart = 0;       }       else          bTxStart = 1;   }      if(TMR0IF && TMR0ON )  /* dcf77 - perioada1-timer cu perioada ~10 ms*/   {       if(ucDcf77Contor < 250)       {          TMR0IF =0;          TMR0L = 60;          ucDcf77Contor++;       }          else  /* nu receptionez nimic*/       {          ucDcf77Contor=0;          ucDcf77Timer0Over++;	      TMR0ON = 0;         /* opreste timer0*/	      INT0IE = 0;         /* dezactiveaza intreruperea pe INT0 (RB0)*/  	      T1CON = 0b00001111;    // restart the T1 timer       }      }   if((INT0IF) && (INT0IE))  /* dcf77 perioada 2 - numar cate perioada1 s-au scurs intre flancurile semnalului dcf77*/   {              ucDcf77DataIndex = ucDcf77Contor;          bDcf77SaveData = 1;	   ucDcf77Contor = 0; /* reseteaza contorul folosit la masurat timpul */       INT0IF =0;	   INTEDG0 = ~INTEDG0;       /* INT0 trigerat pe celalalt flanc */   }}
Link spre comentariu

Eu de exemplu nu m-am complicat cu timer pe partea de afisare, am folosit un delay iar timerul l-am folosit ptr citirea unui senzor de temperatura.Adica timerul genereaza o intrerupere in care citesc senzorul iar restul e facut in soft.La un ceas mai complicat nu am reusit sa scap de palpairea afisajului din cauza ca procu are prea multe de facut (aproape am umplut 2 pagini de memorie la un 16F690 doar cu un ceas, scris in asm).Depinde cate are de facut.Daca trebuie doar sa citesca un senzor si sa afiseze valoarea e bine, dar daca trebuie sa faca si altceva.... mai greu, asta a fost motivul ptr care folosesc mai mult LCD-uri, tineam picu ocupat cu afisarea prea mult timp.La picul tau vezi care timer are prescalerul mai mare si-l folosesti ptr citirea senzorului, restul merge din soft fara probleme.Ptr timpi mari nu e bine sa folosesti un delay, e musai un timer.Si inca o chestie, nu e nevoie de 4 timere, ma rog, aici cred ca faci o confuzie intre un timer si un delay, ai nevoie de un timer si un delay.Cu intreruperea generata de timer citesti senzorul, iar la afisare folosesti un singur delay indiferent cati digiti ar avea afisajul.

Link spre comentariu

Pentru a activa timerul 1 din 16f870 trebuie ca bitul 0 al registrului T1CON sa fie 1 adica TMR1ON = 1 ;Am realizat acesta conditie in MikroC si am observat ca la debugg TMR1L si TMR1H raman zero, desi in simulator se incrementeaza.De ce oare? imi scapa ceva?...nu pot sa vad ce se intampla in program in mikroC.

Link spre comentariu

Ce fel de debug? Ce fel de simulare?Cum ai ajuns la concluzia ca nu merge (care a fost procedura exacta)? Ai "pasit" prin program asteptand sa se incrementeze registrii? Ai pus un break-point in functia de tratare a intreruperilor si te-ai uitat la registrii cand ai ajuns acolo?Cum ai configurat timerul (de unde primeste clock)?De obicei raspunsuri bune primesc intrebarile bune. Asa ca da detalii/pune o bucatica de cod relevant... ca sa poti fi ajutat mai "eficient".

Link spre comentariu

Daca asta-i tot programul tau, probabil mai trebuie sa activezi oscilatorul pentru timer1.

T1OSCEN: Timer1 Oscillator Enable Control bit1 = Oscillator is enabled0 = Oscillator is shut-off (the oscillator inverter is turned off to eliminate power drain)

Link spre comentariu

L-am activat T1OSCEN este bitul 3, si tot aceiasi treaba acesta este codul:unsigned short x; unsigned short timp;void main() { T1CON=0b00001001; do{ timp =TMR1L; x=1; delay_ms(5); x=2; }while(1); }

Link spre comentariu

N-am folosit niciodata mikroC, asa ca nu stiu cum merge debuggerul lui.Ai conectat PICul cu ICDx/pickitx... la calculator si faci debug?Ai pus un breakpoint undeva, ai oprit programul din executie si nu vezi schimbari in registri?Daca ala-i tot programul tau, s-ar putea sa lipseasca ceva configurari - tip de oscilator, de ex. - si sunt sanse ca PIC-ul tau chiar sa nu faca nimic. Sa clipoceasca un LED merge?

Link spre comentariu

Daca timerul merge in simulator sunt aproape sigur ca va merge si in realitate. Dupa cele discutate cred ca debbug-ul din mikroC nu lucreaza asa cum ma asteptam cu timer 1 deoarece Hex-ul a fost creeat de mikroC si incarcat in simulator. Programul creeat este unul simplu, primul meu program cu timer pentru ca sa vad si sa inteleg cum lucreaza timerul in pic. El urmeaza sa fie dezvoltat cu mai multe configurari si mai multi parametrii.In acest caz am nevoie sa incerc alte complilatoare in C care sa fac debbug , (nu cunosc ASM) ce imi puteti recomanda?

Link spre comentariu

Eu nu inteleg ce intelegi tu prin debugger.In cazul meu, pentru debug folosesc mplab (+ picc, da' nu stiu daca e important) + ICD2 + montajul de "deparazitat"; in felul asta chiar testez codul din montajul final (de fapt eu asta inteleg prin debug; daca tu intelegi altceva, poate ar trebui sa ne punem intai de acord terminologia). Uneori se poate intampla ca in simulator sa mearga anumite functii (de exemplu ceasul de sistem e "generat" de simulator) si in debugger/montajul final nu - un oscilator prost configurat n-o sa porneasca in veci, desi in simulator "merge".Cum tu n-ai in program nici un fel de configurare, nu se poate spune cu siguranta ca montajul functioneaza. Asa ca sunt sanse ca debugerul sa aiba dreptate si in timer1 chiar sa nu se intample nimic.

Link spre comentariu

Eu in mikroC faceam programul in C, apoi faceam bulid si daca nu aveam erori, derulam programul creeat si urmaream ce se intampla, e un fel de debug "offline". Apoi incarcam hex-ul in simulator sau in pic.Din cate am inteles tu faci debug direct conectat la pic. Am pickit2 dar nu am facut asta niciodata, e un lucru bun sa faci debug "online". Din cate m-am uitat in documentatie pickit2 face debug in ASM, partea nasoala e ca ma impac bine cu C si nu cunosc ASM. Se poate face program in C cu MPLAB si debug online in C ?

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