CIBY2 Postat Februarie 2, 2021 Partajează Postat Februarie 2, 2021 (editat) Asa cum spune si titlul am ceva nelamuriri in legatura cu intreruperile generate de timere, bine, si cu celelalte, iar din DS nu prea ma lamuresc. Sunt destul de novice in microcontrolere si in programare asa ca intreb! Vreau sa fac un ceas si baza de timp este generata de Timer2. Stiu cum sa calculez, i-am prevazut si posibilitatea de ajustare cu +/- 2,5%, dar ma poticnesc intr-o chestie. Programul este gandit astfel: Timer2 este setat in modul 2, numara 1000 de impulsuri ale ceasului intern (1 mS) si genereaza o intrerupere. Aceasta intrerupere trimite programul la o procedura care numara milisecundele iar in functie de valoarea variabilei, face ce are de facut mai departe. Ce nu inteleg: Ce se intampla cu timerul pe timpul executiei acestei proceduri? Stiu ca la intrerupere se reseteaza, dar mai departe? Reia numaratoarea pe timpul executiei procedurii, sau asteapta ca aceasta sa se termine? Editat Februarie 2, 2021 de CIBY2 Link spre comentariu
cirip Postat Februarie 2, 2021 Partajează Postat Februarie 2, 2021 (editat) Acum 43 minute, CIBY2 a spus: Ce se intampla cu timerul pe timpul executiei acestei proceduri? Timerul este un bloc hardware independent. Prin urmare, timerul continua sa numere independent de executia procesorului, cu conditia ca procedura sau modul de configurare sa nu-i fi blocat ceasul. De exemplu, daca e in "single shot", timerul s-ar opri pana cand ar fi repornit, dar cred ca nu e cazul. Fa un experiment: citeste si scoate la seriala timerul inainte si dupa executia procedurii. Ar trebui sa constati ca a avansat. Atentie la prescalere/postscalere, sa nu te pacaleasca. De ex, daca procedura dureaza 100 de cicli de ceas si ai un prescaler cu 256, atunci impulsurile vor avansa numai prescalerul, care in general nu e citibil, nu si timerul. Cred ca ai prins ideea. Editat Februarie 2, 2021 de cirip Link spre comentariu
Viorel A Postat Februarie 2, 2021 Partajează Postat Februarie 2, 2021 Nu se intampla nimic, ramane cu valoarea 0 pana la reinitializarea cu valoarea calculata pe care o faceti dupa executarea codului intreruperii, apoi activati din nou intreruperea. Link spre comentariu
Vizitator Postat Februarie 2, 2021 Partajează Postat Februarie 2, 2021 Nu are de unde sa stie un Timer ca a fost sau nu setat sa genereze intreruperi. El contorizeaza si atat. Este hardware (programabil din soft). Link spre comentariu
CIBY2 Postat Februarie 2, 2021 Autor Partajează Postat Februarie 2, 2021 Am inteles ideea. Este asa cum credeam, el isi vede de treaba lui daca nu-l intrerup eu din soft. @cirip, nu este cazul de prescaler, dar e de tinut minte. @viorel A, nu am dezactivat intreruperea. Si acum imi dau seama ca de fapt, era logic sa-si vada de treaba. El trebuie sa numere pana la 1000, cu pauza 0. Asta era ideea. Va multumesc tuturor si daca mai am nelamuriri imi permit indolenta de a mai apela la bunatatea voastra! Link spre comentariu
XAN77 Postat Februarie 2, 2021 Partajează Postat Februarie 2, 2021 Referitor la ceasurile pe baza timerelor din MCU, mi-a plăcut mereu teoria zero cumulative error de aici https://www.romanblack.com/one_sec.htm Pe de altă parte am renunțat la ceasurile în soft pentru că consumă prea mult ca să nu piardă timpul când pică tensiunea de alimentare, pe de altă parte iese compact. Link spre comentariu
cimitavita Postat Februarie 2, 2021 Partajează Postat Februarie 2, 2021 (editat) CIBY2 vezi ca faci o confuzie. La toate ATMEGA, timer0 si timer2 sunt pe 8 biti. Deci, poate numara doar pana la 256. Nicidecum pana la 1000. Singura deosebire intre timer0 si timer2, e ca timer2 poate merge si asincron si prescalerul lui poate genera mai multe frecvente. Doar timer1 daca e setat sa mearga pe 16 biti poate numara pana la 65536. E exact asa cum a spus cirip. Un timer daca e programat sa numere, numara in continuare (indiferent daca e intr-o intrerupere sau nu) si nu se opreste la nici un 0. Daca intreruperile sunt activate, el va genera o intrerupere atunci cand continutul sau trece de la FFh la 00h (intreruperea TIMER2 OVF) sau daca continutul lui ajunge sa fie egal cu cel al lui OCR2 (intreruperea TIMER2 COMP). Timerele pot fi oprite doar software prin oprirea semnalului TIMER2 CLK din prescaler (exceptie pentru CLK extern sau sincronizare externa). Timerele si prescalerele mai pot fi resetate din SFIOR, bitii PSR. E o operatie hardware, dar care e comandata tot software. Editat Februarie 2, 2021 de cimitavita Link spre comentariu
CIBY2 Postat Februarie 2, 2021 Autor Partajează Postat Februarie 2, 2021 (editat) @cimivita, Asta spune in data sheet: Timer 2 is a 16-bit Timer/Counter that can operate as either a timer or an event counter. The type of operation is selected by bit C/T2 in the SFR T2CON (see Table 10-2 on page 15). Timer 2 has three operating modes: capture, auto-reload (up or down counting), and baud rate generator. The modes are selected by bits in T2CON, as shown in Table 10-2. Timer 2 consists of two 8-bit registers, TH2 and TL2. In the Timer function, the TL2 register is incremented every machine cycle. Since a machine cycle consists of 12 oscillator periods, the count rate is 1/12 of the oscillator frequency. Acum tu ma bagi in ceata si mai rau! Stai putin ca nu e ATMEGA, este din familia 8051. Editat Februarie 2, 2021 de CIBY2 Link spre comentariu
nico_2010 Postat Februarie 3, 2021 Partajează Postat Februarie 3, 2021 De obicei se posteaza si codul, folosind butonul "<>" din editor si se explica clar ce microcontroller este folosit si unde se intalneste problema. In cazul tau la trecerea de la 999 la 1000, timerul este resetat (daca ai scris in program ca asta trebuie sa se intample) si incepe sa numere de la 0 pana la valoarea prestabilita (in cazul tau 1000). Rutina de tratare a intreruperii trebuie sa fie cat mai putin populata cu cod, adica sa consume cat mai putin din timpul microcontroller-ului si in niciun caz nu il va trimite dupa cai verzi pe pereti (adica intr-o functie sau subrutina). Link spre comentariu
vijelie02 Postat Februarie 3, 2021 Partajează Postat Februarie 3, 2021 De evitat ca in rutina de tratare a intreruperii sa fie apelate functii legate de time, delay si functii legate de comunicatii seriale. Link spre comentariu
CIBY2 Postat Februarie 3, 2021 Autor Partajează Postat Februarie 3, 2021 (editat) Acum 56 minute, nico_2010 a spus: De obicei se posteaza si codul, folosind butonul "<>" din editor si se explica clar ce microcontroller este folosit si unde se intalneste problema. Mea culpa. Este vorba de AT89S8253. Problema era la modul general, indiferent de tipul microcontrolerului, dar cu ajutorul colegilor m-am lamurit. Aici este o bucata din cod, scrisa in BASCOM8051, in care este configurat Timer2, precum si procedura (sau rutina) Incr_milisecunde: care trateaza intreruperea. $crystal = 12000000 $regfile = "89s8253.dat" $large Config Timer2 = Timer , Gate = Internal , Mode = 2 Config Timer0 = Timer , Gate = Internal , Mode = 0 Enable Int0 Enable Int1 Enable Timer0 Enable Timer2 Enable Interrupts Priority Set Timer2 On Timer0 Load_data On Timer2 Incr_milisecunde Dim Adjust As Byte Readeeprom Adjust , 10 If Adjust = 255 Then Adjust = 25 Goto Write_adjust End If Load Timer2 , 975 + Adjust ' ' ' ' Incr_milisecunde: If Milisecunde < 1000 Then Incr Milisecunde If Milisecunde = 500 Then Set Puncte End If Else Milisecunde = 1 Reset Puncte End If Return Citind mai cu atentie ultimele doua posturi, incep sa-mi dau seama ca rutina de tratare a intreruperii poate contine o singura linie de cod, respectiv incrementarea variabilei Milisecunde. De restul se poate ocupa o bucla in afara respectivei rutine. Editat Februarie 3, 2021 de CIBY2 Link spre comentariu
cimitavita Postat Februarie 3, 2021 Partajează Postat Februarie 3, 2021 Daca e 8051, atunci e un pic diferit de atmega. La 8051 intreruperile generale nu se opresc la aparitia unei intreruperi, si deci, pot apare intreruperi in intreruperi. Detalii multe si cu poze colorate despre cum functioneaza timerele si cum se pozitioneaza comutatoarele in memoria SFR gasesti pe http://www.break-ic.com/programming_8051_MCU/Architecture_and_programming_of_8051_MCU_reverse_engineer.htm Link spre comentariu
nico_2010 Postat Februarie 3, 2021 Partajează Postat Februarie 3, 2021 Nu prea mai tin minte daca intrarea in rutina de tratare a intreruperii reseteaza flagul de intrerupere, in cazul tau TF2, dar daca nu o face trebuie sa o faci tu in interiorul rutinei, asta conform foii de catalog: "Timer 2 overflow flag set by a Timer 2 overflow and must be cleared by software". Link spre comentariu
CIBY2 Postat Februarie 3, 2021 Autor Partajează Postat Februarie 3, 2021 @nico_2010, cam asta am vrut sa intreb, dar nu m-am priceput la cuvinte. Daca trebuie sters flagul, atunci prima linie din rutina ar trebui sa fie Enable Timer2, dar prin exemplele din BASCOM8051 nu prea am vazut asa ceva, fara sa existe undeva mai inainte comanda Disable Timer2. O sa mai studiez putin sa vad ce gasesc. Va multumesc inca o data! Link spre comentariu
nico_2010 Postat Februarie 3, 2021 Partajează Postat Februarie 3, 2021 In niciun caz "Disable Timer2" ci mai degraba: T2CON.TF2 = 0; Cred ca se poate in BASCOM 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