Ensamblador ARM, interrupciones

#1
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.
 
#2
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.
 
#3
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?
 
#4
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.
 
#8
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.
 
Arriba