Ensamblador ARM, interrupciones

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.
 
Las preguntas del millon son ¿cuales son tus conocimientos? ¿que sabes hacer con los ARM? ¿que codigo propones?

Como veras falta mucha informacion, y codigo.
 
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?
 
mmm... sin codigo es complicado.

Aca te va un ej. del uso del timmer:

Subrutina de configuracion para 50mSeg:

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
//--------------------------------------------------------------------------------------------//

//------------------ 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):

Código:
...
inicia_timer0:
  mov r0,dir_VICIntEnable
  or [r0],0x10
  mov r0,dir_VICVectCntl1
  mov [r0],0x24
  mov r0,dir_VICVectAddr1
  mov [r0],timmer_irq
  ....

timmer_irq:
  mov r0,1
  mov [flag_timer0],r0
  ...
  mov r0,dir_VICVectAddr
  mov [r0],0xFF
...

Tomalo con pinzas ese codigo, pero tal vez te puede ayudar, pero como ya dije, nunca use assembler con estas bestias.
 
Atrás
Arriba