I am working with PIC24EP256GP204. The CPU frequency is 64 MHz. I am generating two PWM pulses for TCD1304AP CCD sensor and two PWM pulses for WM8253 ADC AFE.
My problem lies with PWM pulses for ADC as i have to use ISRs to fetch data.
I need to sync Vsmp (it determines sampling point and frequency) and Master clock of ADC so that i can read the 16-Bit output of ADC (which is available in 4-Bit multiplexed format). I am generating square wave of frequency 3 MHz for Master clock of ADC and square wave of 500 KHz for Vsmp. I have verified the wave-forms with a digital oscilloscope.
But for syncing and reading the output of ADC AFE, i need to run some code in ISR of Vsmp and Master clock of ADC. If i just clear the interrupt flags in respective ISRs, then everything works perfectly. However, even a few lines of code in C programming language makes the PIC24EP hang. I couldn't post my whole code base as it is huge. I have posted ISRs code. Please have a look:
volatile bool vsmp_failing_edge = false;
// VSMP ISR
void __attribute__((__interrupt__, no_auto_psv)) _OC3Interrupt(void)
{
vsmp_failing_edge = true;
IFS1bits.OC3IF = 0;
}
// ADC ISR
void __attribute__((__interrupt__, no_auto_psv)) _OC4Interrupt(void)
{
/*
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop(); Nop();
*/
if (vsmp_failing_edge) {
// oc_disable(OC_CHANNEL_4);
vsmp_failing_edge = false;
}
IFS1bits.OC4IF = 0;
}
The ISR _OC4 is assigned to Master clock of ADC which is running at 3 MHz and ISR _OC3 is assigned to Vsmp which is running at 500 KHz. The output of ADC is available at few other pins in 4-Bit multiplexed format.
ISR _OC3 is executed at falling edge of Vsmp pin. In the interrupt, i am setting some flag. After 16.5 Master clock cycles, i have to read 4 external pins at falling edge of master clock pulses. I have to read at four consecutive falling edges of master clock to get complete data.
Please comment on my approach or suggest better approaches for the sensor and ADC.
I also thought of using Pin change interrupt at Master Clock pulse output pin and some timer interrupt to fetch the data. However, i haven't implemented that approach because i am not sure if PIC24EP can handle the waveform generation and sync at the frequency i want it to.
EDIT:
If you look at code of _O4 ISR, you can find 60 Nop() instructions along with IFS1bits.OC4IF = 0;
line will make PIC hang. I have added Nop()
instructions to verify the number of instruction cycles required to make it hang.
The Nop()
instructions are commented out. Without them, only the if
condition and IFS1bits.OC4IF = 0;
line will make PIC hang. So, you can conclude that Nop() instructions are equivalent to just if
part of the ISR in terms of execution time.