dsPIC33FJ16GS504 - nevykoná přerušení od konkrétního ADC

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.

cau, pravda , s dsp nedelam

v DS je seznam registru tykacijici se adc , mas je vsechny spravne nastaveny ?
samotny adc bez preruseni bezi ?
skus kouknout tady microchip.com/forums/m598503.aspx

zacit postupne od zacatku a pridavat funkce , mozna se ti pak podari presnejc lokalizovat problem… vic asi nepomuzu

Ponoř se do listingu a zkontroluj, jestli symboly z těch ISR skutečně “sedí” na těch vektorech, kde mají podle IVT být.

Já jsem na to přišel. Jsem fakt roura, “zakázal” jsem si totiž přerušení.

dsPIC má 7 priorit přerušení, pro jednotlivý periferie se dá nastavit priorita v registrech IPC. Procesor ukazuje aktuální prioritu bity IPL. Z nepochopitelnýho důvodu jsem si IPL nastavil na vyšší číslo, než jsem měl prioritu od ADC, takže to proste procesor neviděl…
Takže mi aspoň si postežování si na forum rozsvítilo mozek.

Stane se… hlavně že jsi na to přišel, a super že jsi napsal čím to bylo (pro nás ostatní - chybama se člověk učí, někdy i cizíma).

Jinak je to naprostá klasika, nebo aspoň já to tak mám pořád - řešení, věc (např. nářadí), nebo obecně cokoliv objevím přesně ve chvíli, kdy vyslovím otázku, a je úplně jedno kolik času jsem předtím nad problémem strávil :smiley:

Já nad tím sedím už týden… dsPIC je trošku složitější na ty první krůčky, ale jak na to člověk přijde, tak to jde. Základ je stejnej jak na PIC24 a z toho fakt uchcávám. Řadu 16F jsem totálně zavrhl a 18F používám už jen na ty úplně nejjednodušší projekty.
To velké množství vektorů přerušení fakt neskutečně zrychluje práci.

Učení se z cizích chyb je fajn, člověk aspoň nemusí ty slepý cesty prošlapávat sám.

Kdyby náhodou nějkdo chtěl poradit s dsPIC nebo PIC24, tak jsm schopen v něčem poradit.