Pomoc oko TMR2 i PR2 regidtra
Moderators: pedja089, stojke369, [eDo], trax
Pomoc oko TMR2 i PR2 regidtra
Pozdrav svima.Pokusao sam nesto za probu da napisem sa upotrebom tmr2 registra ali nekapiram kako se odredjuje pr2 registrar.Dosta sam nalazio na internetu ali nekapirem pa ako moze neko makar kratko objasnjenje.Evo jernog programa i kad se menja vrednost PR2 menja se naravno i vreme blinkanja led ali kako izracunati vrednost pr2 i odrediti tm2 da bih mogao nesto preciznije da uradim.Evo jednog primera koji imam gde led blicka na jednu sekundu sto znaci da je prekid na jednu uS koji se kasnije pretvara u sekunde
Symbol Led = PORTB.0
uSek Var Word
mSek Var Word
Sek Var byte
TMR2_uS Var byte
TMR2_us = 200 'Postavi period za TMR2
PORTB = 0 'PORTB je izlazni
ON INTERRUPT goto Int_Sub
Inicijalizacija:
PIE1.1 = 0 'Onemoguci sve periferijske prekide
INTCON.6 = 1 'Omoguci periferijske prekide
T2CON.0 = 0 '00 = Preskaler je 1
T2CON.1 = 0 '01 = Preskaler je 4
'1x = Preskaler je 16
PR2 = 199 'TMR2 Period
T2CON.3 = 0 '0000 = 1:1 postskaler
T2CON.4 = 0 '0001 = 1:2 postskaler
T2CON.5 = 0 '0010 = 1:3 postskaler
T2CON.6 = 0 '1111 = 1:16 postskaler
TMR2 = 0 'Reset TMR2 vrednosti
PIE1.1 = 1 'Omoguci TMR2 prekid kada je PR2 = TMR2
T2CON.2 = 1 'Omoguci Tajmer2
INTCON.7 = 1 'Omoguci sve nemaskirane interapte
Pocetak:
Repeat 'Ciklus
Until Sek = 1 'Sve dok Sek ne bude 60
Toggle Led
Sek = 0 'Ponisti Sek
Goto Pocetak 'Vrati se na pocetak
Disable
'-------------Podprogram obrade prekida--------------------------------
Int_Sub:
INTCON.7 = 0 'Onemoguci prekide
If PIR1.1 Then 'Ako je prekid od Tajmera2 uvecaj
PIR1.1 = 0
uSek = uSek + TMR2_uS
If uSek >= 1000 Then
uSek = uSek - 1000
mSek = mSek + 1
If mSek >= 1000 Then
mSek = mSek - 1000
Sek = Sek + 1
EndIf
EndIf
EndIf
INTCON.7 = 1 'Omoguci prekide
Resume 'Vrati se iz rutine prekida
End
Symbol Led = PORTB.0
uSek Var Word
mSek Var Word
Sek Var byte
TMR2_uS Var byte
TMR2_us = 200 'Postavi period za TMR2
PORTB = 0 'PORTB je izlazni
ON INTERRUPT goto Int_Sub
Inicijalizacija:
PIE1.1 = 0 'Onemoguci sve periferijske prekide
INTCON.6 = 1 'Omoguci periferijske prekide
T2CON.0 = 0 '00 = Preskaler je 1
T2CON.1 = 0 '01 = Preskaler je 4
'1x = Preskaler je 16
PR2 = 199 'TMR2 Period
T2CON.3 = 0 '0000 = 1:1 postskaler
T2CON.4 = 0 '0001 = 1:2 postskaler
T2CON.5 = 0 '0010 = 1:3 postskaler
T2CON.6 = 0 '1111 = 1:16 postskaler
TMR2 = 0 'Reset TMR2 vrednosti
PIE1.1 = 1 'Omoguci TMR2 prekid kada je PR2 = TMR2
T2CON.2 = 1 'Omoguci Tajmer2
INTCON.7 = 1 'Omoguci sve nemaskirane interapte
Pocetak:
Repeat 'Ciklus
Until Sek = 1 'Sve dok Sek ne bude 60
Toggle Led
Sek = 0 'Ponisti Sek
Goto Pocetak 'Vrati se na pocetak
Disable
'-------------Podprogram obrade prekida--------------------------------
Int_Sub:
INTCON.7 = 0 'Onemoguci prekide
If PIR1.1 Then 'Ako je prekid od Tajmera2 uvecaj
PIR1.1 = 0
uSek = uSek + TMR2_uS
If uSek >= 1000 Then
uSek = uSek - 1000
mSek = mSek + 1
If mSek >= 1000 Then
mSek = mSek - 1000
Sek = Sek + 1
EndIf
EndIf
EndIf
INTCON.7 = 1 'Omoguci prekide
Resume 'Vrati se iz rutine prekida
End
Re: Pomoc oko TMR2 i PR2 regidtra
Posto sam na telefonu, evo ti na brzaka ovaj link. Mozda iz njega skontas kroz primjer.
http://eng-serve.com/pic/pic_timer.html
http://eng-serve.com/pic/pic_timer.html
Re: Pomoc oko TMR2 i PR2 regidtra
Pozdrav.Vec sam video ali nekapiram.U primeru imam PR2 199 a TMR2 200 i tu se uklapa ako je prekoracenje 1uSek ali kad stavim PR2 9 a TMR2 10 onda isto prekoracenje je 1uSek a led blinka na 7 sekundi.Onda sam iz programa obrisao sekunde i ostavio program do mSek=mSek+1 a ogre prepravio da blinka na jednu mili sekudu i sad ocekujem neki pwm sa + periodom od 1mSek i - periodom od 1mSek ali to se nedogadja.Jedino mi ovaj tajmer nije jasan.
Re: Pomoc oko TMR2 i PR2 regidtra
Koji si kristal stavio na PIC? Ako je 4MHz ond nemoj se igrati sa rezolucijom od 1uS, to je prekratko za njega. Ako koristis 4MHz moraces staviti brzi kristal.
Dakle, koji kristal koristis?
Interrupt ce se desiti kada vrijednost TMR2 brojaca dodje do vrijednosti koja je podesena u PR2 registar. Znaci ako si namjestio PR2=199 onda timer TMR2 nikad nece preci tu vrijednost nego ce se vratiti na 0. Ako ti je kristal ipak od 4MHz to znaci da je takt PIC-a 1MHz a to znaci da ce se interrupt na PR2=199 desavati svake 199uS.The Timer2 increments from 00h until it matches PR2 and then resets to 00h on the next increment cycle.
Dakle, koji kristal koristis?
Re: Pomoc oko TMR2 i PR2 regidtra
Koristim kristal 4mhz ali sve to isprobavam u proteusu.Naprimer stvaim u programu iznad da je PR2 9 a TMR2 10 i onda led blinka na svakih 7 sekundi a pomovo je razlika iznadju PR2 i TMR2 1 kao u prvom primeru 199 i 200. E to mi nije jasno kako se racuna tj gleda,menjao sam razne vrednosti da bih dosao do zakljucka ali neide.
Re: Pomoc oko TMR2 i PR2 regidtra
Ne znam sta si ovdje sve pisao:
-----
Ali mozda da probas ovako nekako (ovo je napamet pisano, ispravi greske po potrebi):
a onda u ISR:
A u svom Main programu kad ocekujes da prodje sekunda da bi blinkao ovako:
Code: Select all
If PIR1.1 Then 'Ako je prekid od Tajmera2 uvecaj
PIR1.1 = 0
uSek = uSek + TMR2_uS
If uSek >= 1000 Then
uSek = uSek - 1000
mSek = mSek + 1
If mSek >= 1000 Then
mSek = mSek - 1000
Sek = Sek + 1
EndIf
EndIf
EndIf
Ali mozda da probas ovako nekako (ovo je napamet pisano, ispravi greske po potrebi):
Code: Select all
uSek100 Var Byte
mSek Var Word
Sek Var Byte
Min Var Byte
PrevSek Var Byte
PR2 = 100 ' Nastimamo ga da okida svakih 100uS
uSek100 = 1
mSek = 1
Sek = 1
Min = 1
Code: Select all
If PIR1.1 Then 'Ako je prekid od Tajmera2 uvecaj
PIR1.1 = 0
uSek100 = uSek100 + 1
If uSek100 >= 10 Then
uSek100 = 0
mSek = mSek +1
If mSek >= 1000 Then
mSek = 0
Sek = Sek + 1
if Sek >= 60 Then
Sek = 0
Min = Min + 1
EndIf
EndIf
EndIf
EndIf
Code: Select all
PrevSek = 1
Sek = 1
Pocetak:
' Cekaj da prodje sekunda
While PrevSek = Sek
Whend
' Prosla je, blink
Toggle Led
PrevSek = Sek
Goto Pocetak
Re: Pomoc oko TMR2 i PR2 regidtra
" Ne znam sta si ovdje sve pisao:
CODE: SELECT ALL
If PIR1.1 Then 'Ako je prekid od Tajmera2 uvecaj
PIR1.1 = 0
uSek = uSek + TMR2_uS
If uSek >= 1000 Then
uSek = uSek - 1000
mSek = mSek + 1
If mSek >= 1000 Then
mSek = mSek - 1000
Sek = Sek + 1
EndIf
EndIf
EndIf "
E to je samo iskopirano iz knjige Vije Milanovica.I meni se cini da nebi trebalo tako ali ipak blinka tacno za jednu sekundu,mozda zato sto tmr2 200 i odmah pravi prekid jer je za 1 veci od pr2 i kad se sve izmnozi ispada da radi kako treba.Probacu ovako kako si mi napisao pa javljam.
CODE: SELECT ALL
If PIR1.1 Then 'Ako je prekid od Tajmera2 uvecaj
PIR1.1 = 0
uSek = uSek + TMR2_uS
If uSek >= 1000 Then
uSek = uSek - 1000
mSek = mSek + 1
If mSek >= 1000 Then
mSek = mSek - 1000
Sek = Sek + 1
EndIf
EndIf
EndIf "
E to je samo iskopirano iz knjige Vije Milanovica.I meni se cini da nebi trebalo tako ali ipak blinka tacno za jednu sekundu,mozda zato sto tmr2 200 i odmah pravi prekid jer je za 1 veci od pr2 i kad se sve izmnozi ispada da radi kako treba.Probacu ovako kako si mi napisao pa javljam.
Re: Pomoc oko TMR2 i PR2 regidtra
Evo sad ovako.izbacio sam sekunde da bih gledao na osciloskopu dok menjam PR2
' Primer upotrebe Tajmera2
' Stanje na RB) pinu menjatic ce sa svake minute
Symbol Led = PORTB.0
uSek Var Word
mSek Var Word
Sek Var byte
TMR2_uS Var byte
TMR2_us = 1 'Postavi period za TMR2
PORTB = 0 'PORTB je izlazni
ON INTERRUPT goto Int_Sub
Inicijalizacija:
PIE1.1 = 0 'Onemoguci sve periferijske prekide
INTCON.6 = 1 'Omoguci periferijske prekide
T2CON.0 = 0 '00 = Preskaler je 1
T2CON.1 = 0 '01 = Preskaler je 4
'1x = Preskaler je 16
PR2 = 250 'TMR2 Period
T2CON.3 = 0 '0000 = 1:1 postskaler
T2CON.4 = 0 '0001 = 1:2 postskaler
T2CON.5 = 0 '0010 = 1:3 postskaler
T2CON.6 = 0 '1111 = 1:16 postskaler
TMR2 = 0 'Reset TMR2 vrednosti
PIE1.1 = 1 'Omoguci TMR2 prekid kada je PR2 = TMR2
T2CON.2 = 1 'Omoguci Tajmer2
INTCON.7 = 1 'Omoguci sve nemaskirane interapte
Pocetak:
Repeat 'Ciklus
Until mSek = 1 'Sve dok Sek ne bude 60
Toggle Led
mSek = 0 'Ponisti Sek
Goto Pocetak 'Vrati se na pocetak
Disable
'-------------Podprogram obrade prekida--------------------------------
Int_Sub:
INTCON.7 = 0 'Onemoguci prekide
If PIR1.1 Then 'Ako je prekid od Tajmera2 uvecaj
PIR1.1 = 0
uSek = uSek + TMR2_uS
If uSek >= 1000 Then
uSek = uSek - 1000
mSek = mSek + 1
EndIf
EndIf
INTCON.7 = 1 'Omoguci prekide
Resume 'Vrati se iz rutine prekida
End
Sad dobijam milisekude koliki je pr2 , radi lakseg pregleda.Sa PR2 250 imam prekid na 250mSek , sa PR2 200 imam prekid 200 mSek ali na nizim vrednostima PR2 kao na primer PR2 50 ja umesto na 50 mSek imam prekid na 100 mSek , isto kao kad stavim PR2 100. Kao da na nizim vrednostima nece da radi ili ja gresim.Kapiram da PR2 odredjuje vreme tmr2 tj dokle tmr2 broji ali zasto nece na nizim vrednostima kad je PR2 50 , zasto opet 100 nilisekunde ?
' Primer upotrebe Tajmera2
' Stanje na RB) pinu menjatic ce sa svake minute
Symbol Led = PORTB.0
uSek Var Word
mSek Var Word
Sek Var byte
TMR2_uS Var byte
TMR2_us = 1 'Postavi period za TMR2
PORTB = 0 'PORTB je izlazni
ON INTERRUPT goto Int_Sub
Inicijalizacija:
PIE1.1 = 0 'Onemoguci sve periferijske prekide
INTCON.6 = 1 'Omoguci periferijske prekide
T2CON.0 = 0 '00 = Preskaler je 1
T2CON.1 = 0 '01 = Preskaler je 4
'1x = Preskaler je 16
PR2 = 250 'TMR2 Period
T2CON.3 = 0 '0000 = 1:1 postskaler
T2CON.4 = 0 '0001 = 1:2 postskaler
T2CON.5 = 0 '0010 = 1:3 postskaler
T2CON.6 = 0 '1111 = 1:16 postskaler
TMR2 = 0 'Reset TMR2 vrednosti
PIE1.1 = 1 'Omoguci TMR2 prekid kada je PR2 = TMR2
T2CON.2 = 1 'Omoguci Tajmer2
INTCON.7 = 1 'Omoguci sve nemaskirane interapte
Pocetak:
Repeat 'Ciklus
Until mSek = 1 'Sve dok Sek ne bude 60
Toggle Led
mSek = 0 'Ponisti Sek
Goto Pocetak 'Vrati se na pocetak
Disable
'-------------Podprogram obrade prekida--------------------------------
Int_Sub:
INTCON.7 = 0 'Onemoguci prekide
If PIR1.1 Then 'Ako je prekid od Tajmera2 uvecaj
PIR1.1 = 0
uSek = uSek + TMR2_uS
If uSek >= 1000 Then
uSek = uSek - 1000
mSek = mSek + 1
EndIf
EndIf
INTCON.7 = 1 'Omoguci prekide
Resume 'Vrati se iz rutine prekida
End
Sad dobijam milisekude koliki je pr2 , radi lakseg pregleda.Sa PR2 250 imam prekid na 250mSek , sa PR2 200 imam prekid 200 mSek ali na nizim vrednostima PR2 kao na primer PR2 50 ja umesto na 50 mSek imam prekid na 100 mSek , isto kao kad stavim PR2 100. Kao da na nizim vrednostima nece da radi ili ja gresim.Kapiram da PR2 odredjuje vreme tmr2 tj dokle tmr2 broji ali zasto nece na nizim vrednostima kad je PR2 50 , zasto opet 100 nilisekunde ?
Re: Pomoc oko TMR2 i PR2 regidtra
To je ogranicenje pbp-a i koriscenje on interrupt. Druga stvar 4MHz je presporo.
Re: Pomoc oko TMR2 i PR2 regidtra
Sa tako malim vremenima MCU je stalno u interaptu i glavni deo programa se nece izvrsavati...
Za tako velike brzine moja preporuka je pic na 64MHz, interapt kompletan u asembleru i pic sa automatskim cuvanjem i vracanjem registara procesora.
A mozda je bolje pitanje sta pokusavas da napravis. Moguce je da postoji i drugi pristup problemu.
Za tako velike brzine moja preporuka je pic na 64MHz, interapt kompletan u asembleru i pic sa automatskim cuvanjem i vracanjem registara procesora.
A mozda je bolje pitanje sta pokusavas da napravis. Moguce je da postoji i drugi pristup problemu.
Re: Pomoc oko TMR2 i PR2 regidtra
Nepravim nista namenski,samo hocu da proucim nacin rada tmr2.Koristio sam ga u generisanju PWM ali samo tmr2 nisam nikad a mislim da bi mi bio koristan za neke stvari zbo postkalera.Kristal od 4mhz sam stavio zbog okruglih vrednosti radi lakseg razumevanja pa kad se shvati nacin rada ostalo nece biti problem.Evo do kog zakljucka sam dosao menjajuci razne vrednosti tmr2 i pr2.
Ako je PR2 250 a TMR2 50 pa sad tmr2 raste za jednu mikrosekundu 50,za dve mikrosekunde 100 ... i za
5 mikrosekunde dostigne 250. 5 x 50 = 250. U podprogramu uSek = uSek + TMR2_uS
uSek se uvecava za 1 na svake 5 mikrosekunde do 1000 ,znaci 5000 mikrosekunde ukupno da bi se izgenerisale 5 milisekunde.
Koliko sam shvatio PR2/TMR2 250/50=5 i uvecanje za jedan na svakih 5uS.I kad izmenjam vrednosti to se uklapa.
Neznam da li sam u pravu ali tako se uklapa kad gledam na osciloskop,jedino me buni uSek = uSek + TMR2_uS jer se sabira sa +TMR2_uS a u programu stoji TMR2_us = 50 'Postavi period za TMR2
Neuci se lako u mojim godinama ali volim to pa pokusavam koliko je moguce.Sa tmr0 i tmr1 mi je bilo lako ali ovo teze ide.
Ako je PR2 250 a TMR2 50 pa sad tmr2 raste za jednu mikrosekundu 50,za dve mikrosekunde 100 ... i za
5 mikrosekunde dostigne 250. 5 x 50 = 250. U podprogramu uSek = uSek + TMR2_uS
uSek se uvecava za 1 na svake 5 mikrosekunde do 1000 ,znaci 5000 mikrosekunde ukupno da bi se izgenerisale 5 milisekunde.
Koliko sam shvatio PR2/TMR2 250/50=5 i uvecanje za jedan na svakih 5uS.I kad izmenjam vrednosti to se uklapa.
Neznam da li sam u pravu ali tako se uklapa kad gledam na osciloskop,jedino me buni uSek = uSek + TMR2_uS jer se sabira sa +TMR2_uS a u programu stoji TMR2_us = 50 'Postavi period za TMR2
Neuci se lako u mojim godinama ali volim to pa pokusavam koliko je moguce.Sa tmr0 i tmr1 mi je bilo lako ali ovo teze ide.