1sec interrupt tmr0, mikroC, 16f84a, 32.768

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
pro37
Pocetnik na forumu
Pocetnik na forumu
Posts: 26
Joined: 26-11-2013, 17:41
Location: BiH

1sec interrupt tmr0, mikroC, 16f84a, 32.768

Post by pro37 »

Poštovanje drugovi, već duže vrijeme pratim ovaj forum i dosta mi je pomogao,
ovo mi je prvi post tako da umjesto da se ja predstavljam, ako koga šta zanima u vezi mene neka pita (:

Za programiranje PIC-ova koristim mikroC i radim na jednom projektu gdje mi je potrebno dosta tačno mjerenje vremena. (Ne bih znao reći tačno koliko je moje znanje u vezi ovih MCU-ova, ali smatram da je onako "solidno"). Sklop koristi LP oscilator 32.768kHz i naštimao sam TMR0 interrupt sa preskalerom 1:32 što rezultira precizni interrupt od 1 sekunde.

Ovo je kod za interrupt koji mi je potreban (u C-u):

Code: Select all

void interrupt() {
  tick = 1;
  INTCON.TMR0IF = 0;
}
A ovako ga je mikroC preveo u assemblerski jezik:

Code: Select all

_interrupt:
0x0004        0x00CF              MOVWF      R15
0x0005        0x0E03              SWAPF      STATUS, 0
0x0006        0x0183              CLRF       STATUS
0x0007        0x0092              MOVWF      ___saveSTATUS
0x0008        0x080A              MOVF       PCLATH, 0
0x0009        0x0093              MOVWF      ___savePCLATH
0x000A        0x018A              CLRF       PCLATH
;76 ::                 void interrupt() {
;77 ::                 tick = 1;
0x000B        0x1411              BSF        _tick, BitPos(_tick+0)
;78 ::                 INTCON.TMR0IF = 0;
0x000C        0x110B              BCF        INTCON, 2
;79 ::                 }
L_end_interrupt:
L__interrupt39:
0x000D        0x0813              MOVF       ___savePCLATH, 0
0x000E        0x008A              MOVWF      PCLATH
0x000F        0x0E12              SWAPF      ___saveSTATUS, 0
0x0010        0x0083              MOVWF      STATUS
0x0011        0x0ECF              SWAPF      R15, 1
0x0012        0x0E4F              SWAPF      R15, 0
0x0013        0x0009              RETFIE
; end of _interrupt
U datasheetu (16f84a) sam vidio da se sve instrukcije (u ovom interruptu) osim RETFIE (koja se izvrsava u dva ciklusa) izvršavaju u jednom ciklusu.
Ono što mene zanima je to da li će sve ove instrukcije "ukrasti" malo od one fikse 1sec?
U tom assemblerskom kodu, ako se ne varam, nakon što se resetuje INTCON.TMR0IF i dalje se izvrsavaju one instrukcije (od 0x000D do 0x00013) da li se u tom periodu (poslije resetovanja TMR0IF zastavice pa do kraja interrupt-a) vrši inkrementiranje TMR0 ili će se ponovno inkremetiranje TMR0 pokrenuti tek nakon instrukcije RETFIE ?

Dakle ukratko mene interesuje kako napraviti da interrupt ne krade vremena od fiksne 1 sekunde. Da li je potrebno poravnati vrijeme sa instrukcijom "NOP", a zatim postaviti TMR0 na neku vrijednost?

Hvala onima koji su voljni pomoći u bilo kom pogledu.
Pozdrav.
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1725
Joined: 28-03-2012, 18:01
Location: Split

Re: 1sec interrupt tmr0, mikroC, 16f84a, 32.768

Post by Kukinjos »

Ne trebaš vodit računa o "krađi impulsa"u interrupt rutini, osim odmah iza reseta, a to mislim da ti nije problem. Timer0 se konstantno vrti, bez obzira na T0IF, njegov interrupt flag, tako da će se interrupt uvijek pojavit nakon točno jedne sekunde, tj. kad se prelije sa FF na 00. Jedino je bitno da ti je interrupt rutina dovoljno kratka da obriše T0IF prije slijedećeg prelijeva, a to je u ovom tvom slučaju i više nego dovoljno, jer osim spremanja W registra (akumulatora), statusa i PC-a, jedino što ova rutina radi je postavljanje TICK bita, nakon čega vrati registre i nastavi s programom.
Pretpostavljam da iz glavne petlje čitaš stanje TICK bita i tamo ga resetiraš, jedino ti tu može doći do pomaka, ako primjerice imaš neke uvjete koji nisu uvijek vremenski isti, pa može proći više ili manje vremena prije nego pročitaš TICK bit. Recimo ako trebaš dobit na nekom portu točan izlaz od 1 sek., stavi to u interrupt rutinu, a ne u glavnu petlju.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
pro37
Pocetnik na forumu
Pocetnik na forumu
Posts: 26
Joined: 26-11-2013, 17:41
Location: BiH

Re: 1sec interrupt tmr0, mikroC, 16f84a, 32.768

Post by pro37 »

To me je zanimalo (da li će TMR0 otkucavati i u interrupt-u kad se (ne )očisti T0IF).
Za svaki slučaj sam stavio da se T0IF očisti na samom početku interrupt-a...

Da, u glavnoj sam provjeravao TICK,
a onda sam i ja skontao da je bolje (vremenski preciznije) u interrupt-u.

Kukinjos, hvala very puno (:
Post Reply