I am new in PIC processors programming and I need a little help. I'm using PIC18F8680, programming in C with XC8 compiler in MPLAB X IDE v5.35.
I have two interrupts, high priority on timer 0 (5 kHz) and low priority on timer 1 (200 Hz). In high priority int, I call function, that calls another function, where I do AD input conversion.
__interrupt(high_priority) void ISR0(void)
{
if((INTCONbits.TMR0IE == 1) && (INTCONbits.TMR0IF == 1))
{
INT_TMR0_ACK
cntTMR0++;
if (address== MOD_PPP)
{
doSomething ();
}
}
} /* ISR0() */
__interrupt(low_priority) void ISR1(void)
{
if((PIE1bits.TMR1IE == 1) && (PIR1bits.TMR1IF == 1))
{
INT_TMR1_ACK
cntTMR1++;
if (address== MOD_PPP)
{
doSomethingElse ();
}
}
} /* ISR1() */
void doSomething()
{
UrealS = convertUpp (readExtAD (1), 0); // readExtAD returns raw value from 14 bit +-10 V AD in U16 format (always >= 0)
}
U16 convertUpp (U32 input, U8 channel)
{
LATJ |= 0x02;
// offset check (using current loop 4-20 mA with 5 ohm input rezistor amplified by 10x)
U16 offset = 160;
if (input<= offset)
input = 0;
else
input-= offset;
// filter
analog [channel].sum -= analog [channel].mean;
analog [channel].sum += input;
analog [channel].mean = analog [channel].sum >> 6;
input= analog [channel].mean;
// conversion
input *= 4375;
input>>= 8;
input>>= 4;
LATJ &= ~0x02;
return input;
}
typedef struct
{
U32 sum;
U16 mean;
} sADC_PARAM;
sADC_PARAM analog [4];
Variable "address" is global and is set only once in init routine.
With toggling LATJ, I'm testing the function time length with oscilloscope. Problem is, I expect, it would looks like this Expected, but on oscilloscope I can see, that few times in second, it looks like this Real. I can't find any reason, why is one of x int cycle longer than others.
Do you see something I'm missing? Or, is the concept of measuring like this bad (and why)?
Thanks in advance.
PS: I translated code to english for bettter understanding, If you find any czech word, let me know, I translate it.
Edit: grammar, variable "address" description