Modificando el fichero signal.h
2 participantes
Página 1 de 1.
Modificando el fichero signal.h
Trabajando con las interrupciones con un pic 18f2331 y el atributo "NAKED" ,que no genera prologo ni epilogo para nuestra interrupción he descubierto que con el sistema de interrupciones normal: ----->void TIMERisr(void) interrupt 1 _naked<---- no existe un salto que desde la dirección 0x08 nos lleve a una zona alta de la memoria, por lo tanto, si tenemos otra interrupcion de baja prioridad dirección 0x018 y nuestra interrupcion supera esta direccion , el linker nos dara problemas. La interrupcion mas larga de alta prioridad seria de 16 octetos (0x018-0x008).
He tomado el camino explicado en el manual donde se utiliza un fichero para generar macros que nos generen parte de las interrupciones. El formato es ---->>>>DEF_INTHIGH(high_handler)
DEF_HANDLER(SIG_TMR0, timer0_handler)
END_DEF
SIGHANDLERNAKED(timer0_handler) AQUI PONDRIAMOS NUESTRO CÖDIGO DE INTERRUPCION<<<<<-------
Este método es perfecto y nos permite las interrupciones "NAKEADAS" pero no estaba definida la interrupcion de "QUADRATURE ENCODER" que implementa el chip 18f2331.
Para implementarla he añadido estas lineas al fichero "SIGNAL.H"
--->>#define SIG_IC2QE SIG_IC2QEIF
#define SIG_IC2QESUF 3 //que numero de registro PIR,IPIR
#define SIG_IC2QEDX 2 //que bit dentro del registro
#define SIG_IC2QEIF SIG_PIR(SIG_IC2QESUF), SIG_IC2QEDX
#define SIG_IC2QEIE SIG_PIE(SIG_IC2QESUF), SIG_IC2QEDX
#define SIG_IC2QEIP SIG_IPR(SIG_IC2QESUF), SIG_IC2QEDX<<<<------
Me ha salido una explicacion un poco leño. Si alguien está interesado le puedo mandar un ejemplo.. bye
He tomado el camino explicado en el manual donde se utiliza un fichero para generar macros que nos generen parte de las interrupciones. El formato es ---->>>>DEF_INTHIGH(high_handler)
DEF_HANDLER(SIG_TMR0, timer0_handler)
END_DEF
SIGHANDLERNAKED(timer0_handler) AQUI PONDRIAMOS NUESTRO CÖDIGO DE INTERRUPCION<<<<<-------
Este método es perfecto y nos permite las interrupciones "NAKEADAS" pero no estaba definida la interrupcion de "QUADRATURE ENCODER" que implementa el chip 18f2331.
Para implementarla he añadido estas lineas al fichero "SIGNAL.H"
--->>#define SIG_IC2QE SIG_IC2QEIF
#define SIG_IC2QESUF 3 //que numero de registro PIR,IPIR
#define SIG_IC2QEDX 2 //que bit dentro del registro
#define SIG_IC2QEIF SIG_PIR(SIG_IC2QESUF), SIG_IC2QEDX
#define SIG_IC2QEIE SIG_PIE(SIG_IC2QESUF), SIG_IC2QEDX
#define SIG_IC2QEIP SIG_IPR(SIG_IC2QESUF), SIG_IC2QEDX<<<<------
Me ha salido una explicacion un poco leño. Si alguien está interesado le puedo mandar un ejemplo.. bye
potis- Nuevo Usuario
- Mensajes : 2
Fecha de inscripción : 10/05/2010
Re: Modificando el fichero signal.h
Hola..
Esta bastante insteresante, mi experiencia con Pic18 es un poca, basicamente he usado sdcc con familia 16F, puedes publicar algun ejemplo de este tema, para lograr compreder mejor esto..
Gracias..
Saludos
RiSanti
Esta bastante insteresante, mi experiencia con Pic18 es un poca, basicamente he usado sdcc con familia 16F, puedes publicar algun ejemplo de este tema, para lograr compreder mejor esto..
Gracias..
Saludos
RiSanti
interrupciones 18f
En los pic de la serie 16Fxx, sólo existe una dirección para cualquier tipo de interrupción, no exixten niveles al contrario que con los pics de la serie 18F. Estos tienen dos direcciones en las cuales se coloca el programa de interrupción. Las interrupciones que hemos permitido con prioridad alta iran a la dirección 08h, las que hemos señalado con baja prioridad la dirección de la Int la tienen en la dirección 018h.
En un programa que realicé para controlar un motor puse como interrupción de alta prioridad la que controlaba el periodo para el cambio del tiempo de activiad del PWM (con la que se le da al motor mas o menos tensión), tambien le di prioridad alta al desbordamiento del contador de impulsos o sprokets del encoder, eventos que consideré muy importantes. Sin embargo a la recepción por el puerto serie le di baja prioridad pues las señales en estos son muy lentas.
El programa en ensamblador no tuvo problemas pues en la dirección de la interrupcion de alta prioridad (08H) escribi un salto y allí puse mi código de interrupción. La rutina de interrupción de baja prioridad la puse en la dirección 0x18H sin problema.
Al traducir este código al compilador SDCC, vi que el código que se escribia en mi programa iba incrementado por un preambulo, donde se guardaban todos los registros mas usuales (que no eran pocos) y al terminar mi código, el compilador ponía un postambulo donde los registros se restauraban a su posicion inicial (el método push y pop). Para obviar estos preambulos y postambulos utilicé el filtro "NAKED" en la definición de la interrupción, peo si superaba la dirección 0x018, teniendo definida la interrupción de baja prioridad el compilador me daba error, lógico pues los códigos se solapaban.
En este punto es donde, leyendo el manual del SDCC encontre la otra manera de definir la interrupción
DEF_HANDLER(SIG_TMR0, timer0_handler)
END_DEF
SIGHANDLERNAKED(timer0_handler)-------->>>>>>> AQUI PONDRIAMOS NUESTRO CÖDIGO DE INTERRUPCION<<<<<-------
Con este modo los códigos no se solapan y el compilador no da error.Hay que tener en cuenta que cuando en la interrupción ponemos "NAKED" tenemos que gurdaros los registros que utilicemos en nuesto código.
Al implementar de este modo la interrupción tenemos quie añadir el fichero de cabeceras "signal.h", en este fichero estan la definición de las interrupciones mas comunes. En mi caso como la interrupcion que quería utilizar era la que se producía cuando el encoder (Cuadrature Encoder en la hoja de datos del 18f2331) daba overflow o regresaba a cero tuve que modificar el fichero "signal.h" como indique el 10 de mayo.
el ejemplo:
DEF_INTLOW(low_handler)
DEF_HANDLER(SIG_TMR0, timer0_handler)
END_DEF
//si necesitaramos interrupciones de alta prioridad
DEF_INTHIGH(high_handler)
DEF_HANDLER(SIG_IC2QE, encoder_handler)
END_DEF
SIGHANDLERNAKED(timer0_handler) /* action to be taken when timer 0 overflows definido en signal.h*/
{
//encendemos y apagamos el led
// LATBbits.LATB3 ^= 1;
//borramos el flag de interrupcion
// INTCONbits.TMR0IF=0;
//en forma ensamblador
_asm
btfss 0xF81,3
bra usetea
bcf 0xF81,3
bra fintim0
usetea:
bsf 0xF81,3
fintim0:
bcf 0xFF2,2
retfie
_endasm;
}
SIGHANDLERNAKED(encoder_handler) //accion tomada por inerrupción de cuadrature encoder
{
//volatile unsigned int ContU;
//compara el bit mas significativo de CAP2BUFH
// if(QEICONbits.UP_DOWN==1){ // ;up o down
_asm
btfss 0xFB6,5
bra dec
incf 0x30,F
bsf 0xF81,2
bra fininit
dec:
decf 0x30,F
bcf 0xF81,2
fininit:
bcf 0xFA4,2 // borra flag
retfie
_endasm;
}
Hay que tener en cuenta que con la cantidad de interrupciones que puden generar estos pics 18F que a cada prioridad se le puede dar alta o baja prioriad el sistema no se hace sencillo de trabajar.
Espero que te sirva
En un programa que realicé para controlar un motor puse como interrupción de alta prioridad la que controlaba el periodo para el cambio del tiempo de activiad del PWM (con la que se le da al motor mas o menos tensión), tambien le di prioridad alta al desbordamiento del contador de impulsos o sprokets del encoder, eventos que consideré muy importantes. Sin embargo a la recepción por el puerto serie le di baja prioridad pues las señales en estos son muy lentas.
El programa en ensamblador no tuvo problemas pues en la dirección de la interrupcion de alta prioridad (08H) escribi un salto y allí puse mi código de interrupción. La rutina de interrupción de baja prioridad la puse en la dirección 0x18H sin problema.
Al traducir este código al compilador SDCC, vi que el código que se escribia en mi programa iba incrementado por un preambulo, donde se guardaban todos los registros mas usuales (que no eran pocos) y al terminar mi código, el compilador ponía un postambulo donde los registros se restauraban a su posicion inicial (el método push y pop). Para obviar estos preambulos y postambulos utilicé el filtro "NAKED" en la definición de la interrupción, peo si superaba la dirección 0x018, teniendo definida la interrupción de baja prioridad el compilador me daba error, lógico pues los códigos se solapaban.
En este punto es donde, leyendo el manual del SDCC encontre la otra manera de definir la interrupción
DEF_HANDLER(SIG_TMR0, timer0_handler)
END_DEF
SIGHANDLERNAKED(timer0_handler)-------->>>>>>> AQUI PONDRIAMOS NUESTRO CÖDIGO DE INTERRUPCION<<<<<-------
Con este modo los códigos no se solapan y el compilador no da error.Hay que tener en cuenta que cuando en la interrupción ponemos "NAKED" tenemos que gurdaros los registros que utilicemos en nuesto código.
Al implementar de este modo la interrupción tenemos quie añadir el fichero de cabeceras "signal.h", en este fichero estan la definición de las interrupciones mas comunes. En mi caso como la interrupcion que quería utilizar era la que se producía cuando el encoder (Cuadrature Encoder en la hoja de datos del 18f2331) daba overflow o regresaba a cero tuve que modificar el fichero "signal.h" como indique el 10 de mayo.
el ejemplo:
DEF_INTLOW(low_handler)
DEF_HANDLER(SIG_TMR0, timer0_handler)
END_DEF
//si necesitaramos interrupciones de alta prioridad
DEF_INTHIGH(high_handler)
DEF_HANDLER(SIG_IC2QE, encoder_handler)
END_DEF
SIGHANDLERNAKED(timer0_handler) /* action to be taken when timer 0 overflows definido en signal.h*/
{
//encendemos y apagamos el led
// LATBbits.LATB3 ^= 1;
//borramos el flag de interrupcion
// INTCONbits.TMR0IF=0;
//en forma ensamblador
_asm
btfss 0xF81,3
bra usetea
bcf 0xF81,3
bra fintim0
usetea:
bsf 0xF81,3
fintim0:
bcf 0xFF2,2
retfie
_endasm;
}
SIGHANDLERNAKED(encoder_handler) //accion tomada por inerrupción de cuadrature encoder
{
//volatile unsigned int ContU;
//compara el bit mas significativo de CAP2BUFH
// if(QEICONbits.UP_DOWN==1){ // ;up o down
_asm
btfss 0xFB6,5
bra dec
incf 0x30,F
bsf 0xF81,2
bra fininit
dec:
decf 0x30,F
bcf 0xF81,2
fininit:
bcf 0xFA4,2 // borra flag
retfie
_endasm;
}
Hay que tener en cuenta que con la cantidad de interrupciones que puden generar estos pics 18F que a cada prioridad se le puede dar alta o baja prioriad el sistema no se hace sencillo de trabajar.
Espero que te sirva
potis- Nuevo Usuario
- Mensajes : 2
Fecha de inscripción : 10/05/2010
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.