Autor Tema: ¿Cómo utilizo las interrupciones en C18?  (Leído 7144 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
¿Cómo utilizo las interrupciones en C18?
« en: 18 de Diciembre de 2006, 14:23:29 »
Hola, escribo el post para ver si alguien me puede orientar en como usar interrupciones en C18. He utilizado el buscador para encontrar alguna solución pero sólo he encontrado información para CCS... En concreto quiero utilizar RBO/INT, pero estoy bastante perdido porque en asm se "juega" con el vector de interrupciones pero como en C18 no manejas directamente las direcciones de la memoria de programa, pues no se muy bien lo que tengo que hacer... es decir no tengo dudas sobre cómo utilizar los registros manejan interrupciones: intcon, pie, etc. si no de cómo manejar la rutina a la que debe saltar tras una interrupción...

Gracias por vuestra ayuda, saludos y felices fiestas.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: ¿Cómo utilizo las interrupciones en C18?
« Respuesta #1 en: 18 de Diciembre de 2006, 16:08:03 »
Hola, para manejar las interrupciones en C18 tienes que hacer algo como lo siguiente:
Código: [Seleccionar]
/*
 * Rutina para el manejo de las interrupciones de alta prioridad.
 */
#pragma code high_vector = 0x08
void high_interrupt(void) {
_asm GOTO altaPrioridad _endasm
}

#pragma code
#pragma interrupt altaPrioridad
void altaPrioridad(void){

    //poner el código de tratamiento cuando salte la interrupcion de alta prioridad

}

/*
 * Rutina para el manejo de las interrupciones de baja prioridad.
 */
#pragma code low_vector = 0x18
void low_interrupt(void) {
_asm GOTO bajaPrioridad _endasm
}

#pragma code
#pragma interruptlow bajaPrioridad
void bajaPrioridad(void){

//añadir código de tratamiento de la interrupción de baja prioridad

}

Si solamente tienes activo un nivel de prioridad no tienes porque poner ambas rutinas, solamente la que necesites.

Saludos.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Cómo utilizo las interrupciones en C18?
« Respuesta #2 en: 18 de Diciembre de 2006, 17:25:17 »
Muchas gracias por tu respuesta Omix, al final también encontré el mismo código en el manual de C18... El problema es que ahora no consigo que al realizar al interrupción en RB0(utilizo el stimulus de MPLAB SIM para simularlo) el PC salte al vector de interrupciones... Os dejo el código a ver si alguien puede orientarme; seguro que se me ha olvidado algo porque hace más de un año que no hago nada con interrupciones y recuerdo que en asm me costó bastante...:

Código: [Seleccionar]

#include <p18f4520.h>

void low_isr(void);
void high_isr(void);
/*
* For PIC18 devices the low interrupt vector is found at
* 00000018h. The following code will branch to the
* low_interrupt_service_routine function to handle
* interrupts that occur at the low vector.
*/
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interruptlow low_isr
void low_isr (void)
{
Nop();
Nop();
Nop();
}
/*
* For PIC18 devices the high interrupt vector is found at
* 00000008h. The following code will branch to the
* high_interrupt_service_routine function to handle
* interrupts that occur at the high vector.
*/
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interrupt high_isr
void high_isr (void)
{
Nop();
Nop();
Nop();
}

#define buttom PORTBbits.RB0
#define switch1 PORTBbits.RB1
#define switch2 PORTBbits.RB2

void hazLoQueQuieras1 (void);
void hazLoQueQuieras2 (void);
void hazLoQueQuieras3 (void);
void hazLoQueQuieras4 (void);
void hazLoQueQuieras5 (void);


void main (void){

INTCON = 0;
INTCON2 = 0;
INTCON3 = 0;

ADCON1 = 0xff;

TRISB = 0xff;

while(buttom != 0);

INTCONbits.INT0IE = 1;
INTCON2bits.INTEDG0 = 1;

while(1){

if( (switch1 == 0) && (switch2 == 0) )
hazLoQueQuieras1();

else if( (switch1 == 0) && (switch2 == 1) )
hazLoQueQuieras2();

else if( (switch1 == 1) && (switch2 == 0) )
hazLoQueQuieras3();

else if( (switch1 == 1) && (switch2 == 1) )
hazLoQueQuieras4();

}

}


void hazLoQueQuieras1(void){

}

void hazLoQueQuieras2(void){

}

void hazLoQueQuieras3(void){

}

void hazLoQueQuieras4(void){

}

void hazLoQueQuieras5(void){

}



Sólamente intento que al poner un 1 en RB0/INT el programa salte al vector de interrupciones y despues ya pensaré en borrar el flag y deshabilitar la interrupción, etc. pero por ahora parece que no lo consigo :-)

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: ¿Cómo utilizo las interrupciones en C18?
« Respuesta #3 en: 19 de Diciembre de 2006, 16:23:30 »
Hola de nuevo, veo que has activado la interrupcion externa de RB0, pero no veo que hayas habilitado las interrupciones globales, es decir, ademas de lo que has hecho tienes que poner tambien:
Código: [Seleccionar]
INTCONbits.GIEL = 1; //Habilita interrupciones de baja prioridad
INTCONbits.GIEH = 1; //Habilita todas las interrupciones
Por supuesto en la rutina de servicio de interrupcion tienes que borrar el flag de INT0IF o de lo contrario, al saltar la interrupción y no borrar el flag el micro se quedará continuamente bloqueado ahi, puesto que estará saltando la INT0 continuamente.

Saludos.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Cómo utilizo las interrupciones en C18?
« Respuesta #4 en: 19 de Diciembre de 2006, 18:48:00 »
Hola, muchas gracias omix! como de costumbre has dado en el clavo... la verdad es que eres una maquina!!! jejeje Todavía tengo una duda, si no es mucha molestia y si alguien me la puede resolver(no es el caso de RB0/INT)... si no recuerdo mal había una diferencia sustancial entre activar el GIE + el PIE + una interrupción de periféricos en concreto y activar PIE(negar el GIE)  + una interrupción de periféricos en concreto... pero no recuerdo cúal era; sólo recuerdo que me dio muchos quebraderos de cabeza... Espero que alguien pueda refrescarme la memoria, porque realmente lo que siempre he llevado muy mal es esto de las interrupciones...

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: ¿Cómo utilizo las interrupciones en C18?
« Respuesta #5 en: 20 de Diciembre de 2006, 17:41:48 »
si no recuerdo mal había una diferencia sustancial entre activar el GIE + el PIE + una interrupción de periféricos en concreto y activar PIE(negar el GIE)  + una interrupción de periféricos en concreto...

Hola, pues la verdad no se si realmente hay alguna diferencia en hacer lo que dices, pero vamos lo más logico es activar la interrupción del periferico que deseas en el PIE y luego activar el GIE, ya que de esta forma te aseguras que la interrupción no pueda saltar hasta que no actives las interrupciones globalmente, que quizá si lo haces al contrario pueda darse el caso (no estoy seguro) de que haya alguna que pueda saltar antes de que las configures correctamente y pueda producir un mal funcionamiento del programa, pero vamos de esto no estoy muy seguro ya que por defecto creo que estan todas deshabilitadas.

Un saludo.


Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Cómo utilizo las interrupciones en C18?
« Respuesta #6 en: 20 de Diciembre de 2006, 19:13:26 »
Hola, lo he buscado de nuevo... y ya recuerdo.... me refería a que puedes encender un tipo de interrupción en el PIE y dejar apagado GIE, con lo que si se produce la interrupción, el flag de esta interrupción se pone a 1 pero el PC no salta al vector de interrupciones... No se si es algo util, yo recuerdo que lo utilizaba con los timers porque hay veces que lo único que te interesa es contar un tiempo en segundo plano(sin tener que recurrir a delays) mientras sigue el transcurso de tu programa... pero no te interesa saltar al vector de interrupciones...

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ¿Cómo utilizo las interrupciones en C18?
« Respuesta #7 en: 21 de Diciembre de 2006, 09:24:49 »
Hola, lo he buscado de nuevo... y ya recuerdo.... me refería a que puedes encender un tipo de interrupción en el PIE y dejar apagado GIE, con lo que si se produce la interrupción, el flag de esta interrupción se pone a 1 pero el PC no salta al vector de interrupciones... No se si es algo util, yo recuerdo que lo utilizaba con los timers porque hay veces que lo único que te interesa es contar un tiempo en segundo plano(sin tener que recurrir a delays) mientras sigue el transcurso de tu programa... pero no te interesa saltar al vector de interrupciones...

Saludos!

Si un periférico está configurado correctamente, los flags siempre se activan, sin importar si está el GIEH, GIEL , PIE o e, PIE<bit> adecuado a dicha interrupción.

Si tienes habilitada la interrupción (estamos hablando de los PIC18) el program counter irá al vector de interrupción correspondiente a la prioridad que tenga fijada esa interrupción.

Si la interrupción está como alta, irá al 0x0008, si está como baja, irá al 0x0018.  Esto es algo del hardware no del C18.  En el C18 debes armar una rutina de interrupción en el 0x0018 y en el 0x0008 para cada caso. 



Saludos
« Última modificación: 21 de Diciembre de 2006, 09:26:49 por maunix »
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Cómo utilizo las interrupciones en C18?
« Respuesta #8 en: 21 de Diciembre de 2006, 10:29:12 »
Pensaba que para que se activara el flag de un periférico debias , como mínimo, activar la interupción correspondiente al periférico... sin necesidad de activar el GIE. Pero veo que estab equivocado... gracias por tu aclaración maunix.

Saludos y felices fiestas a todos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: ¿Cómo utilizo las interrupciones en C18?
« Respuesta #9 en: 21 de Diciembre de 2006, 15:11:54 »
Los flags siempre se activan, otra cosa es que por dicha activación se produzca una interrupción, para la interrupción debemos programarlo en su respectivo registro.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte


 

anything