Duda sobre las interrupciones en SDCC
+2
Risanti
pentax33
6 participantes
Página 1 de 1.
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- Participante
- Mensajes : 11
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
Re: Duda sobre las interrupciones en SDCC
Saludos Risanti
Esta muy bueno el ejemplo que expones, solo una duda
donde localizo la libreria delay.h
gracias
EDITO:
¿Será esta?
mike@mike:~$ find /usr/share/sdcc/ -iname delay*
/usr/share/sdcc/include/pic16/delay.h
/usr/share/sdcc/lib/src/pic16/libc/delay
/usr/share/sdcc/lib/src/pic16/libc/delay/delay1ktcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay1mtcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay100ktcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay10ktcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay10tcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay100tcy.S
pero esta libreria es solo util para PIC16 no para PIC14
alguna forma de usarla, o solo con copiar dicha libreria al subdirectorio $SDCC_HOME/include/pic ???
Esta muy bueno el ejemplo que expones, solo una duda
donde localizo la libreria delay.h
gracias
EDITO:
¿Será esta?
mike@mike:~$ find /usr/share/sdcc/ -iname delay*
/usr/share/sdcc/include/pic16/delay.h
/usr/share/sdcc/lib/src/pic16/libc/delay
/usr/share/sdcc/lib/src/pic16/libc/delay/delay1ktcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay1mtcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay100ktcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay10ktcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay10tcy.S
/usr/share/sdcc/lib/src/pic16/libc/delay/delay100tcy.S
pero esta libreria es solo util para PIC16 no para PIC14
alguna forma de usarla, o solo con copiar dicha libreria al subdirectorio $SDCC_HOME/include/pic ???
maigke- Asiduo del Foro
- Mensajes : 210
Fecha de inscripción : 12/04/2009
Edad : 47
Localización : Mexico
Re: Duda sobre las interrupciones en SDCC
Me contesto a mi mismo, y gracias, todo esto me pasa por no buscar. bueno, pues leyendo en el foro me encontre con los siguientes links
https://pic-linux.forosactivos.net/sdcc-f1/lcd-44780-4-bits-para-pic16f-driver-y-ejemplo-t5.htm
https://pic-linux.forosactivos.net/sdcc-f1/voltimetro-de-0-a-50v-usando-pic-16f876-con-sdcc-t76.htm
https://pic-linux.forosactivos.net/sdcc-f1/problema-con-la-libreria-delay-en-los-18f-t79.htm?highlight=delay
donde también se menciona el uso de la libreria delay.h, e incluso pikitin hizo ya el favor de colocar un link de descarga.
El problema principal es que estan boqueadas las descargas desde el lugar donde escribo en estos momentos, y pues deberia esperar llegar a casa para realizar la descarga, pero eso implica mucho tiempo, asi que mejor me segui leyendo el hilo donde pikitin explica muy amablemente como podemos implementar una libreria muy pequeña de retardos a partir de una libreria para el manejo de una pantalla LCD.
El problema que me esta topando con esta libreria es que, a la hora de compilar con ktechlab, me mandaba un error en esta parte del código
en especifico al calcular el valor de la variable ms, el detalle es que mas arriba usa la directiva #define para asignarle asi un valor a coms, sin embargo no se por que razón el compilador no me permite realizar la operacion de multiplicacion
ms = ms * coms;
a diferencia de que en la rutina de la LCD, coms, no es una constante definida, sino que es una variable tipo char
y esta última compila correctamente.
Por lo tanto el único cambio que hice fué, definir como
unsigned char coms = FREQ / 4000;
en el archivo delay.h
Por si alguien tiene el mismo problema que yo
https://pic-linux.forosactivos.net/sdcc-f1/lcd-44780-4-bits-para-pic16f-driver-y-ejemplo-t5.htm
https://pic-linux.forosactivos.net/sdcc-f1/voltimetro-de-0-a-50v-usando-pic-16f876-con-sdcc-t76.htm
https://pic-linux.forosactivos.net/sdcc-f1/problema-con-la-libreria-delay-en-los-18f-t79.htm?highlight=delay
donde también se menciona el uso de la libreria delay.h, e incluso pikitin hizo ya el favor de colocar un link de descarga.
El problema principal es que estan boqueadas las descargas desde el lugar donde escribo en estos momentos, y pues deberia esperar llegar a casa para realizar la descarga, pero eso implica mucho tiempo, asi que mejor me segui leyendo el hilo donde pikitin explica muy amablemente como podemos implementar una libreria muy pequeña de retardos a partir de una libreria para el manejo de una pantalla LCD.
El problema que me esta topando con esta libreria es que, a la hora de compilar con ktechlab, me mandaba un error en esta parte del código
- Código:
void delay_ms( unsigned int ms )
{
ms = ms * coms;
while (ms > 0 )
{
pausa(247);
ms--;
}
}
en especifico al calcular el valor de la variable ms, el detalle es que mas arriba usa la directiva #define para asignarle asi un valor a coms, sin embargo no se por que razón el compilador no me permite realizar la operacion de multiplicacion
ms = ms * coms;
a diferencia de que en la rutina de la LCD, coms, no es una constante definida, sino que es una variable tipo char
y esta última compila correctamente.
Por lo tanto el único cambio que hice fué, definir como
unsigned char coms = FREQ / 4000;
en el archivo delay.h
Por si alguien tiene el mismo problema que yo
- Código:
unsigned char coms = FREQ / 4000;
void pausa( unsigned char a )
{ a; //tiempo = (4a + 1)µs a>=2, para 4MHz
_asm // "a" ya está en w
sublw 1
bucle:
addlw 1
btfss STATUS,0
goto bucle
_endasm;
}
void delay_ms( unsigned int ms )
{
ms = ms * coms;
while (ms > 0 )
{
pausa(247);
ms--;
}
}
maigke- Asiduo del Foro
- Mensajes : 210
Fecha de inscripción : 12/04/2009
Edad : 47
Localización : Mexico
Re: Duda sobre las interrupciones en SDCC
Si Correcto Maigke.
Esa es la libreria para el tema de los retardos, es bastante practica.. Ademas la puedes copiar en /usr/share/sdcc/include/pic para no tener problemas al compilar.
El control del tiempo es muy importante otra opción seria utilizar el tmr0 para generar retardos. pero con esta librería solucionas mucho..
Risanti
Esa es la libreria para el tema de los retardos, es bastante practica.. Ademas la puedes copiar en /usr/share/sdcc/include/pic para no tener problemas al compilar.
El control del tiempo es muy importante otra opción seria utilizar el tmr0 para generar retardos. pero con esta librería solucionas mucho..
Risanti
Re: Duda sobre las interrupciones en SDCC
Un pequeñísima corrección al primer código -espero no molestar-:
El flag de interrupción, por ejemplo el T0IF, o INTF deben clearearse dentro de su if(){}.
Si borras todas las banderas al final del servicio de interrupciones podés perder alguna llamada a interrupción que haya ocurrido durante la ejecucion del ISR.
Eso nomás.
Saludos
El flag de interrupción, por ejemplo el T0IF, o INTF deben clearearse dentro de su if(
Si borras todas las banderas al final del servicio de interrupciones podés perder alguna llamada a interrupción que haya ocurrido durante la ejecucion del ISR.
Eso nomás.
Saludos
nitrousnrg- Nuevo Usuario
- Mensajes : 5
Fecha de inscripción : 05/12/2009
Re: Duda sobre las interrupciones en SDCC
Tomo nota sobre el tema de interrupciones ... precisamente tengo que imitar la función counter del picbasic (estoy pasando un programa de picbasic a C ). Primero tendré que aprender a usar correctamente el TMR y luego haré el resto.
maigke
Y FREQ tendrá un valor tal como 4000 para 4 Mhz --> coms deberia de valer 1 , etc.... Si .. un Char deberia de poder contener dichos valores, pero por si las moscas, yo que tu usaba mejor un define... al fin al cabo esta va a ser una constante y asi te puedes ahorrar memoria :
maigke
unsigned char coms = FREQ / 4000;
Y FREQ tendrá un valor tal como 4000 para 4 Mhz --> coms deberia de valer 1 , etc.... Si .. un Char deberia de poder contener dichos valores, pero por si las moscas, yo que tu usaba mejor un define... al fin al cabo esta va a ser una constante y asi te puedes ahorrar memoria :
- Código:
#define coms FREQ/4000;
interrupt 0 ?
Porque definen la funcion con "interrupt 0", leyendo el manual de sdcc pág 72, "4.6.15 Interrupts" dice que:
An interrupt service routine (ISR) is declared using the interrupt keyword
void isr(void) interrupt n
{ ... }
n is the interrupt number, which for PIC18F devices can be:
n Interrupt Vector Interrupt Vector Address
0 RESET vector 0x000000
1 HIGH priority interrupts 0x000008
2 LOW priority interrupts 0x000018
No debería ser interrupt 1, o interrupt 2 ? en vez de interrupt 0 ? ( ya que si fuera interrupt 0 sería como un reset?)
An interrupt service routine (ISR) is declared using the interrupt keyword
void isr(void) interrupt n
{ ... }
n is the interrupt number, which for PIC18F devices can be:
n Interrupt Vector Interrupt Vector Address
0 RESET vector 0x000000
1 HIGH priority interrupts 0x000008
2 LOW priority interrupts 0x000018
No debería ser interrupt 1, o interrupt 2 ? en vez de interrupt 0 ? ( ya que si fuera interrupt 0 sería como un reset?)
lejan- Nuevo Usuario
- Mensajes : 4
Fecha de inscripción : 16/04/2011
Re: Duda sobre las interrupciones en SDCC
Saludos mi estimado lejan y bienvenido al foro
Bueno la respuesta a tu duda es que los compañeros del foro en este hilo hacen referencia a PIC14 o de la familia media, por ejemplo PIC16F84
y la información a la que haces referencia, es sobre PIC16, o gama alta, por ejemplo PIC18F2550
Nótese que PIC14 y PIC16, hacen referencia a la arquitectura del microcontrolador, mas no así al nombre.
Pagina 63 del manual de SDCC versión 2.09.0 rev 5413
Esto es para aclarar tu duda y que no se cree confusión en el hilo
Si desea información sobre la __interrupt 0 de la familia PIC14, lea el punto 4.5.3 del antes mencionado manual.
Gracias
Bueno la respuesta a tu duda es que los compañeros del foro en este hilo hacen referencia a PIC14 o de la familia media, por ejemplo PIC16F84
y la información a la que haces referencia, es sobre PIC16, o gama alta, por ejemplo PIC18F2550
Nótese que PIC14 y PIC16, hacen referencia a la arquitectura del microcontrolador, mas no así al nombre.
Pagina 63 del manual de SDCC versión 2.09.0 rev 5413
4.6 The PIC16 Port
The PIC16 port adds support for Microchip PIC MCU with 16 bit wide instructions. Currently this family of microcontrollers contains the PIC18Fxxx and PIC18Fxxxx
Esto es para aclarar tu duda y que no se cree confusión en el hilo
Si desea información sobre la __interrupt 0 de la familia PIC14, lea el punto 4.5.3 del antes mencionado manual.
Gracias
maigke- Asiduo del Foro
- Mensajes : 210
Fecha de inscripción : 12/04/2009
Edad : 47
Localización : Mexico
Temas similares
» Mplabx y Sdcc duda con warning
» duda al modificar el toolchain de sdcc en piklab
» Encuesta sobre videos de instalación y programación de microcontrolador ATmega32U4 sobre una caja Linux
» Modificando el fichero signal.h
» Duda con STATUS
» duda al modificar el toolchain de sdcc en piklab
» Encuesta sobre videos de instalación y programación de microcontrolador ATmega32U4 sobre una caja Linux
» Modificando el fichero signal.h
» Duda con STATUS
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.