TODOPIC
Microcontroladores PIC => Pic32 => Mensaje iniciado por: leoar92 en 21 de Mayo de 2014, 15:11:44
-
Buenos días, estoy teniendo un problema al cual no encuentro solución. Tengo el ethernet starter kit y su expansion board, He conseguido hacerlo funcionar sin problemas utilizando de manera eficiente la interrupción INT0. Mi problema radica cuando quiero utilizar una segunda interrupción, identicamente configurada a la primera, que nunca se realiza. He utilizado la misma salida que anda en la INT0 y sigue sin entrar. Proseguí probando si la entrada como propósito genera funcionaba ( algo tan sencillo en el main de que si detecta un uno, produzca un breakpoint en el debug) y nada. Cambié la interrupción implementando la INT3 y tengo el mismo problema. Sin embargo con pines que no son interrupción andan perfectamente entrando el breakpoint cuando les llega el uno de la entrada.
Es decir, pareciera que las interrupciones solamente no estarían actuando como entradas, sin embargo el tris está configurado correctamente, según creo.
Les paso el código:
/**************************** Librerías *************************************/
#include <p32xxxx.h>
#include <peripheral/int.h>
#include <plib.h>
/*********************** Bits de Configuración *******************************/
#pragma config FNOSC = PRIPLL // Oscillator Selection
#pragma config FPLLIDIV = DIV_2 // PLL Input Divider(Use div by 2 only)
#pragma config FPLLMUL = MUL_20 // PLL Multiplier
#pragma config FPLLODIV = DIV_1 // PLL Output Divider
#pragma config FPBDIV = DIV_4 // Peripheral Clock divisor
#pragma config FWDTEN = OFF // Watchdog Timer
#pragma config WDTPS = PS1 // Watchdog Timer Postscale
#pragma config FCKSM = CSDCMD // Clock Switching & Fail Safe Clk Mon
#pragma config OSCIOFNC = OFF // CLKO Enable
#pragma config POSCMOD = XT // Primary Oscillator
#pragma config IESO = OFF // Internal/External Switch-over
#pragma config FSOSCEN = OFF // Secondary Oscillator Enable
#pragma config CP = OFF // Code Protect
#pragma config BWP = OFF // Boot Flash Write Protect
#pragma config PWP = OFF // Program Flash Write Protect
#pragma config ICESEL = ICS_PGx2 // ICE/ICD Comm Channel Select
#pragma config DEBUG = OFF // Debugger Disabled for Starter Kit
/***************************** Constantes *************************************/
#define SYS_FREQ (80000000)
#define SYS_PCLK (SYS_FREQ / (OSCCONbits.PBDIV))
#define PWM_PERIOD (1000)
#define TMR_CONF (0x8070) //TON, 1:256, Internal, 16 bit
/******************* Configuración Interrupciones *****************************/
void Init_Interrupt()
{
/*Configuración Interrupción Externa 0*/
ConfigINT0(EXT_INT_PRI_2 | FALLING_EDGE_INT | EXT_INT_ENABLE);
/* Configuración Interrupción Externa 1 */
ConfigINT2(EXT_INT_PRI_3 | FALLING_EDGE_INT | EXT_INT_ENABLE);
/* Configuración Interrupción Timer2 Cada 1 Seg */
IPC2bits.T2IP = 1; // Asigna la prioridad
T2CON = TMR_CONF; // Configura el Timer2
IFS0bits.T2IF = 0; //Limpia la bandera
PR2 = 39063; // Configura el PR2
}
int main(void)
{
/* Configuraciones Generales del Sistema */
SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
INTEnableSystemMultiVectoredInt();
Init_Interrupt();
/* Configuración Entradas/Salidas */
AD1PCFG = 0xFFFF;
ConfigCNPullups (CN16_PULLUP_ENABLE |CN15_PULLUP_ENABLE);
PORTSetPinsDigitalOut (IOPORT_D, BIT_9 | BIT_1 | BIT_2);
PORTSetPinsDigitalOut (IOPORT_B, BIT_15);
PORTSetPinsDigitalIn (IOPORT_C, BIT_1 | BIT_3 | BIT_4);
PORTSetPinsDigitalIn (IOPORT_B, BIT_0 | BIT_8 | BIT_3 | BIT_2|BIT_9);
PORTSetPinsDigitalIn (IOPORT_G, BIT_9 | BIT_7);
PORTSetPinsDigitalIn (IOPORT_D, BIT_0 | BIT_13 | BIT_6 | BIT_7 | BIT_10);
PORTSetPinsDigitalIn (IOPORT_E, BIT_8 | BIT_9);
PORTSetPinsDigitalIn (IOPORT_A, BIT_14 | BIT_15);
/* Configuración de PWM con Timer3 */
OpenOC4(OC_ON|OC_TIMER_MODE16|OC_TIMER3_SRC|OC_PWM_FAULT_PIN_DISABLE,0,0);
OpenOC2(OC_ON|OC_TIMER_MODE16|OC_TIMER3_SRC|OC_PWM_FAULT_PIN_DISABLE,0,0);
OpenTimer3(T3_ON | T3_PS_1_1, PWM_PERIOD); // Generación del PWM con Timer3
/* Inicialización del PWM y entradas/salidas */
SetDCOC4PWM(PWM_PERIOD/2);
SetDCOC2PWM(PWM_PERIOD/2);
/* Programa */
while(1)
{
}
}
/*************** Handler Interrupción Externa 0 ***********************/
void __ISR( _EXTERNAL_0_VECTOR, ipl2) INT0_Handler(void)
{
contador_pasos1++;
IFS0bits.INT0IF = 0; //Limpia la bandera de interrupción
}
/*************** Handler Interrupción Externa 1 ***********************/
void __ISR(_EXTERNAL_1_VECTOR, ipl3) External_Interrupt_1(void)
{
mPORTDToggleBits(BIT_2);
contador_pasos2++;
IFS0bits.INT1IF = 0; //Limpia la bandera de interrupción
}
void __ISR( _TIMER_2_VECTOR, ipl1) Timer2_Handler(void)
{
IFS0bits.T2IF = 0; //Limpia la bandera de interrupción
}
No se me ocurre dónde puede estar el problema, si alguien puede ayudarme le agradecería. Se me ocurre que exista algún registro para la utilización de los pines de interrupción pero nunca escuché ni leí de algo así.
Gracias!
-
Primero prueba a debugear y ver si los registros T2IF y el otro se ponen en 1, si es asi el problema reside en la activacion de las interrupciones, que no este la global activada, que las prioridades esten mal, etc... en caso contrario el problema reside en que por alguna razon no se inicia el flag de interrupcion (no se activa el timer, o cosas asi).
-
Sí, debugueé y anda perfecto la interrupción del timer2 y la de int0. Int1,Int2,Int3,Int4 no me anduvieron ni utilizando la misma entrada que es funcional en int0, ni probando dentro del while si se activa la entrada que corresponde al puerto correspondiente a la interrupción. Me parece que el problema está en la entrada misma, más que en las rutinas de interrupción, pero no me doy idea
-
Hola, después de muchas pruebas el problema resultó ser de hardware, midiendo continuidad, la placa ethernet starter kit no llega al conector externo en algunos pines (entre los cuales están las interrupciones que no funcionan). Ahora, no tengo idea del origen de este problema, y tampoco sé como proseguir
-
INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
INTEnableInterrupts();