Hola, tengo que hacer un proyecto en un lpc2105 de NXP (ARM), tengo que programar el código para que cuando llegue una interrupción normal la atienda y salte a una subrutina, pero no se como poner poner el código. Si alguien puede ayudarme con un ejemplo o algo?
Muchas gracias.
hola, estoy empezando, mis conocimientos no son muy avanzados. ¿Me podrias poner un ejemplo de codigo, que cuadno llegue una interrupcion (IRQ) la atienda y salte a una subrutina?
void inicia_timer0()
{
//------------------------ Configuracion de las interrupciones ------------------------------//
VICIntEnable|=0x10; // Interrupcion del Timer 0 activado, su indice es 4 al ser el bit 4 (importante para el reg. q viene)
VICVectCntl1=0x24; // Los 4 1eros bits sirven para indicar el indice, el 6to bit si vale 1 indica q es vectorizado y si vale 0 q no
VICVectAddr1= (unsigned long) timer0; // Le digo q la direccion de la subrutina timer0 q funciona como interrupcion
//--------------------------------------------------------------------------------------------//
//------------------ Configuracion del Timer -----------------------------------------------//
T0TCR=0x0; // el contador no cuenta
T0TC=0x0; // el contador comienza de 0
T0PR=52000; // configuro la cuenta del prescaler tal q le mande una cuenta al contador c/ 1 mSeg
T0PC=0x0; // el prescaler comienza de 0
T0MR0=50; // configuro la cuenta del MR0 tal q cuente 50 mSeg
T0MCR=0x03; // configuro q al producirce un evento en MR0, se lance una interrupcion y se resetee el contador
T0TCR=1;
//------------------------------------------------------------------------------------------//
}
Subrutina de irq:
Código:
//--------- Rutina de la interrupcion ---------------------//
__irq void timer0(void)
{
flag_timer0=1;
T0TCR=0x0; // Desactivo la cuenta
T0IR=0x01;
VICVectAddr=0xFF;
}
//---------------------------------------------------------//
En la irq use una variable global flag_timer0 para saber que se produjo la interrupcion y luego reconfiguro al timer0 para que deje de contar.
Tene en cuenta que la configuracion del timer esta ligado a la configuracion del PLL que fija la frecuencia de los puertos. En mi caso, creo que lo tenia configurado para 60MHz o 63MHz, no recuerdo bien.
Lo que te puse ahi es en C. Lamentablemente nunca use assembler con estos uC, asi que mucho no te puedo ayudar. Pero el codigo que puse te puede ayudar a configurar el timmer y las interrupciones:
Ej.:
Código:
void inicia_timer0()
{
//------------------------ Configuracion de las interrupciones ------------------------------//
VICIntEnable|=0x10; // Interrupcion del Timer 0 activado, su indice es 4 al ser el bit 4 (importante para el reg. q viene)
VICVectCntl1=0x24; // Los 4 1eros bits sirven para indicar el indice, el 6to bit si vale 1 indica q es vectorizado y si vale 0 q no
VICVectAddr1= (unsigned long) timer0; // Le digo q la direccion de la subrutina timer0 q funciona como interrupcion
//--------------------------------------------------------------------------------------------//
...
Me imagino que puede ser algo asi (obviamente los comandos puede que sean distintos y que no se manejen asi los registros):