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;
}
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
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.