Duda sobre las interrupciones en SDCC
Página 1 de 1. • Compartir •
Duda sobre las interrupciones en SDCC
Hola ha todos
Quisiera preguntar por si alguien me puede echar una mano, en el tema de las interrupciones con SDCC.
Mi duda es : Cuando se se establece la funcion de interrupcion, es posible diferenciar entre si es de TMR0 , EXT , ..... al igual que lo hace CCS?
Gracias
Quisiera preguntar por si alguien me puede echar una mano, en el tema de las interrupciones con SDCC.
Mi duda es : Cuando se se establece la funcion de interrupcion, es posible diferenciar entre si es de TMR0 , EXT , ..... al igual que lo hace CCS?
Gracias
pentax33- Nuevo Usuario

- Cantidad de envíos: 9
Fecha de inscripción: 28/11/2008
Re: Duda sobre las interrupciones en SDCC
Hola.
No se si sea igual que en ccs donde hay distintas funciones para cada interrupción, Lo que se me ocurre es incluir dentro del codigo una funcion de interrupcion, esta funcion se ejecutara cuando ocurre alguna interrupcion , es como cuando programas en ASM y se define el vector interrupción 0x004. ( Si usas piklab esta se crea por defecto, si usas un plantilla).
//ej.
Por lo cual se puede utilizar una serie de if para consultar los flag (banderas ) de interrupciones para ver tipo de interrupción ocurrió.
Recordando
ej. Para pic 16F87x
El Registro INTCON , Contiene los siguientes Bit.
GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF
Podemos ver.
TM0RIF= Bandera de Interrupcion por TMR0
RBIF=Bandera de Interrupcion Cambio de RB4-RB7
INTF=Bandera de Interrupcion Activacion de RB0
o En Registro PIR1
PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
Podemos ver.
TXIF=Bandera de Interrupcion por Tx USART
RCIF=Bandera de Interrupcion por Rx USART
TM2RIF= Bandera de Interrupcion por TMR2
TM1RIF= Bandera de Interrupcion por TMR1
ADIF= Bandera de Interrupcion por Conversor AD
Por lo cual planteo el siguiente ejemplo.
Quizá esta sea una forma de Atender Interrupciones. la he probado este ejemplo y te permite diferenciar que tipo de interrupción se origino.
Esperando sus comentarios.
atte.
RiSanti

No se si sea igual que en ccs donde hay distintas funciones para cada interrupción, Lo que se me ocurre es incluir dentro del codigo una funcion de interrupcion, esta funcion se ejecutara cuando ocurre alguna interrupcion , es como cuando programas en ASM y se define el vector interrupción 0x004. ( Si usas piklab esta se crea por defecto, si usas un plantilla).
//ej.
- Código:
void isr() interrupt 0 { //Funcion de Interrupcion SDCC
}
Por lo cual se puede utilizar una serie de if para consultar los flag (banderas ) de interrupciones para ver tipo de interrupción ocurrió.
Recordando
ej. Para pic 16F87x
El Registro INTCON , Contiene los siguientes Bit.
GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF
Podemos ver.
TM0RIF= Bandera de Interrupcion por TMR0
RBIF=Bandera de Interrupcion Cambio de RB4-RB7
INTF=Bandera de Interrupcion Activacion de RB0
o En Registro PIR1
PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
Podemos ver.
TXIF=Bandera de Interrupcion por Tx USART
RCIF=Bandera de Interrupcion por Rx USART
TM2RIF= Bandera de Interrupcion por TMR2
TM1RIF= Bandera de Interrupcion por TMR1
ADIF= Bandera de Interrupcion por Conversor AD
Por lo cual planteo el siguiente ejemplo.
- Código:
/*************************************************************************** */
/* Prueba de Interrupciones Pic16F876,
/* 24 Noviembre del 2009
/*--------------------------------------------------------------------------
/* Ricardo Santibañez
/*---------------------------------------------- --------------------------
/* Desarrolado con SDCC.
/* *****************************************************************************/
#include <pic16f876a.h>
#define FREQ 4000
#include <delay.h>
typedef unsigned int word;
word at 0x2007 CONFIG = _XT_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF;
//Rutina de Interrupciones
void isr() interrupt 0 {
if (INTF==1) //Fue por RB0??
{AtenderRB0();
}
if (TMR0IF==1) //Fue por TMR0??
{ AtenderTmr0();
}
T0IF=0; // Borro Bandera de Desborde
INTF=0;// Borro Bandera de Int RBO
TMR0=0; // cargo valor en TMR0
GIE=1;
}
//RUTINA PRINCIPAL/////
void main() {
TRISB=1;
TRISA=255;
TRISC=0;
PORTB=0;
PORTC=0;
OPTION_REG=135; //Configuro preescaler de TMRO
ADCON1=6; // Puerto A Como Digital
T0IE=1;
INTE=1;
GIE=1;
while(1){} //Bucle Infinito
}
// Rutina que se ejecutar cuando hay int. de TMR0//
void AtenderTmr0(){
if (RB4==1)
{RB4=0;
}
else
{
RB4=1;
}
}
// Rutina que se ejecutar cuando hay int. de RB0//
void AtenderRB0(){
RB1=1;
delay_ms(50);
RB1=0;
delay_ms(50);
}
Quizá esta sea una forma de Atender Interrupciones. la he probado este ejemplo y te permite diferenciar que tipo de interrupción se origino.
Esperando sus comentarios.
atte.

Risanti- Participante Activo

- Cantidad de envíos: 42
Fecha de inscripción: 07/12/2008
Edad: 24
Localización: La Serena Chile
Permiso de este foro:
No puedes responder a temas en este foro.





