Sari la conținut
ELFORUM - Forumul electronistilor

Nelamurire intreruperi


CIBY2

Postări Recomandate

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 de CIBY2
Link spre comentariu
  • Răspunsuri 14
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • CIBY2

    5

  • nico_2010

    3

  • cimitavita

    2

  • cirip

    1

Zile populare

Top autori în acest subiect

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 de cirip
Link spre comentariu

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

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

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 de cimitavita
Link spre comentariu

@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 de CIBY2
Link spre comentariu

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
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 de CIBY2
Link spre comentariu

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

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

@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

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