Ahoj, už nevím jak dál, takže se obracím na fórum, i když nevím jestli vůbc někdo používá tohle dsp.
Používám dsPIC33FJ16GS504 a snažím se rozchodit přerušení od ADC. Vůbec mi to nejde a odmítá jakkoli chodit. V simulátoru (MPLAB 8.92 & XC16) to nechodí, v dsPIC taky ne.
ADC mám nastaven aby pár 0 a 1 spouštěl měření od přetečení TMR1, po dokončení převodu se má vyvolat přerušení. Flagy ADCP0IF a ADCP1IF to v pohodě nastavuje a MCU odmítá skočit do přerušení. Povolené vše je, další přerušení od TMR2 (Stejná priorita) v pohodě chodí.
Nastavení ADC
ADCONbits.FORM = 0; //Integer data format
ADCONbits.EIE = 0; //Early Interrupt disabled
ADCONbits.ORDER = 0; //Convert even channel first
ADCONbits.SEQSAMP = 0; //Select simultaneous sampling
ADCONbits.ADCS = 5; //ADC clock = FADC/6 = 120MHz / 6 = 20MHz
ADCPC2 = 0b0000110000000000; //Kanál AN10 a 11 - 8,9 vypnutý
ADCPC0bits.TRGSRC0=0b01100; // PWM Generator 1 Primary Trigger Selected
ADCPC0bits.TRGSRC1=0b01100; // PWM Generator 2 Primary Trigger Selected
ADCPC0bits.IRQEN0 = 1;
ADCPC0bits.IRQEN1 = 1;
IPC27bits.ADCP0IP = 2; // Set ADC Pair 0 Interrupt Priority (Level 2)
IFS6bits.ADCP0IF = 0; // Clear ADC Pair 0 Interrupt Flag
IEC6bits.ADCP0IE = 1; // Enable ADC Pair 0 Interrupt
IPC27bits.ADCP1IP = 2; // Set ADC Pair 1 Interrupt Priority (Level 2)
IFS6bits.ADCP1IF = 0; // Clear ADC Pair 1 Interrupt Flag
IEC6bits.ADCP1IE = 1; // Enable ADC Pair 1 Interrupt
IPC3bits.ADIP = 2;
IEC0bits.ADIE = 1;
IFS0bits.ADIF = 0;
ADCONbits.ADON = 1;
Nefunguje mi jak společné přerušení pro jakýkoli pár, tak ani individuální přerušení na konkrétní pár. Změna priority nemá na cokoli vliv, změna ADCPC0bits.IRQENx taky nemá na cokoli vliv.
Rutiny pro přerušení:
void __attribute__((interrupt, no_auto_psv)) _ADCP0Interrupt (void)
{
int an0, an1;
an0 = ADCBUF0; // Read AN0 conversion result
an1 = ADCBUF1; // Read AN1 conversion result
// Interrupt Service Routine code goes here
IFS6bits.ADCP0IF = 0; // Clear ADC Pair 0 Interrupt Flag
LED_UPS = 1;
}
/* Example code for ADC Pair 1 ISR*/
void __attribute__((interrupt, no_auto_psv)) _ADCP1Interrupt (void)
{
int an2, an3;
an2 = ADCBUF2; // Read AN2 conversion result
an3 = ADCBUF3; // Read AN3 conversion result
// Interrupt Service Routine code goes here
IFS6bits.ADCP1IF = 0; // Clear ADC Pair 1 Interrupt Flag
LED_UPS = 1;
}
void __attribute__((interrupt, no_auto_psv)) _ADCInterrupt (void)
{
int an2, an3;
an2 = ADCBUF2; // Read AN2 conversion result
an3 = ADCBUF3; // Read AN3 conversion result
// Interrupt Service Routine code goes here
IFS0bits.ADIF = 0; // Clear ADC Pair 1 Interrupt Flag
LED_UPS = 1;
}
Už jsem zkoušel jestli nebude reagovat na společné přerušení od kteréhokoli kanálu a nic. CPU IPL mám nastaveno na 4 - zde nemá taky na nic vliv.
Něco bych byl schopnej obejít tupým hlídáním nastavení flagu, ale potřebuji rozjet automatické měření od PWM modulu a tam jsem proste a jednoduše v prdeli.
Díky za jakýkoli rady.