TODOPIC
Microcontroladores PIC => Pic32 => Mensaje iniciado por: fram_22 en 13 de Febrero de 2011, 18:19:11
-
Hla:
Acuda ahora con una duda sobre interrupciones de un temporizador:
El codigo es el siguiente, esta programado en c32 en pic32 starter kit:
#include <plib.h>
// Configuration Bit settings
#pragma config FWDTEN = OFF
#pragma config POSCMOD = XT, FNOSC = PRIPLL, FPBDIV = DIV_1
#pragma FPLLIDIV = DIV_2, FPLLMUL = MUL_20, FPLLODIV = DIV_2
//
int main(void){
SYSTEMConfigPerformance(80000000L);
// temporizador:
OpenTimer3(T3_ON|T3_SOURCE_INT|T3_PS_1_1,0x014);
ConfigIntTimer3(T3_INT_ON | T3_INT_PRIOR_7|T3_INT_SUB_PRIOR_3);
//interrupcciones multivector
INTEnableSystemMultiVectoredInt();
mPORTDDirection(0x0000); //todo d salida
while(1){
}
}
//
void __ISR(_TIMER_3_VECTOR, ipl7) Timer3Handler(void)
{
PORTD^=1;
// clear the interrupt flag
mT3ClearIntFlag();
}
El problema es que este código funciona muy bien para las interrupciones de baja frecuencia, he ajustado el temporizador para cambiar la señal cada mS y funciona bien.
Pero si lo intento con una frecuencia mayor (3,96 MHz), este mismo código, simplemente deja de funcionar y la patilla ya no dara ninguna señal de salida. ¿Por qué sucede esto? ¿Está relacionado con el tiempo consumido por el llamado de la ISR? Espero que me puedan ayudar con esto que me parece muy confuso.
Gracias
-
Piensa que, una señal de 3.96 MHz tiene un periodo de 252.5 ns. Si utilizas el microcontrolador a la máxima velocidad posible (80 MIPS), cada ciclo ocupa 12.5ns, entonces en el periodo que realizas solo puedes ejecutar 20 ciclos o su equivalente, 20 instrucciones.
Acuérdate que hay que guardar el contexto y devolverlo al salir de la interrupción, es casi imposible lograrlo en tan pocas instrucciones ;-)
Saludos1
-
Hoa suky gracias por tu respuesta. era algo de esperarse pero nunca esta de mas preguntar a quienes tienen mas conocimiento.
Eso explica la presencia de las salidas por comparacion.
Saludos!!