TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: DarkVect en 24 de Octubre de 2006, 13:48:58
-
Hola,
mirando los ejemplos que hay publicados y el manual del CCS me quedan dudas sobre cómo detectar una interrupción proveniente de una fuente externa al PIC, ya sea un pulsador, biestable, etc...
En los ejemplo se tratan muy bien las interrupciones INT_RB e INT_EXT. La primera genera una interrupción por cualquier cambio en un pin (desde RB4 hasta RB7) del puerto B. Y la segunda se encarga de avisar cuando en RB0 ha habido un cambio H_TO_L o L_TO_H según tengamos configurado el pin. Hasta aquí perfecto, pero en otro PIC donde no hay puerto B aparecen interrupciones en su librería que no se cómo tratar.
Por ejemplo, en el PIC16F676 (con el que estoy haciendo las pruebas y ejemplos) me salen las siguientes:
#define INT_EXT 0x0B10
#define INT_RA 0x0B08
#define INT_RA0 0x010B08
#define INT_RA1 0x020B08
#define INT_RA2 0x040B08
#define INT_RA3 0x080B08
#define INT_RA4 0x100B08
#define INT_RA5 0x200B08
He obviado las correspondientes a fuentes internas como los TIMERS, A/D, etc...
Entonces mi duda es: INT_EXT es cómo en un PIC16F84 pero para RA0 en lugar de para RB0??
INT_RA para qué pines es? Sólo para A4 y A5 puesto que A6 y A7 no existen?
Y luego para qué son INT_RA0, INT_RA1, etc...
He probado a hacer un programa que detecte interrupción en RA0 de la siguiente forma:
...
#INT_RA0
void Int_de_A0()
{
...
}
Pero me dice que INT_RA0 no es válido como directiva. Entonces cómo se usa?
Creo que muchas de las dudas que un novato puede tener sobre interrupciones quedarán resueltas en este post. No pretendo una solución rápida y fácil sino descubrir cómo interpretar las librerías .h de los dispositivos en referencia a las interrupciones.
Un saludo y gracias a todos!!
-
Pues en efecto, no encuentro ninguna directiva para INT_RA.
por que no tratas leyendo en el datasheet aver que tipo de interrupciones se manejan en el puetro A de ese pic.
o talvez sea un error de CCS, quien sabe, nunca he utilizado ese PIC. Tratare de averiguar que sucede.
Suerte, saludos. :-)
-
el INT_EXT para 16F84 es siempre es RB0,
esas interrupcion INT_RA me parece q refieren a los conversores A/D, lo detallo en la siguente:
Hablando del 16F676
Interrupciones puerto A:
RA0 interrupcion A/D o Comparador o cambio de estado
RA1 interrupcion A/D o Comparador o cambio de estado
RA2 interrupcon A/D o Comparador o cambio de estado
RA3 interrupcion cambio de estado
RA4 interrupcion A/D o Comparador o cambio de estado
RA5 interrupcion cambio de estado
Rc0 interrupcion A/D
Rc1 interrupcion A/D
Rc2 interrupcon A/D
Rc3 interrupcion A/D
tienes q leer con mas detalle el data sheet del 16f676, lo bajas de la pagina de microhip o de cualquier lugar, espero te ayude mi colaboracion, si tienes mas dudas,pregunte nomas amigo aca tamos para resolverlas :-/.
-
pues al compilar un pequeño programa con solo
enable_interrupts(int_ra);
#INT_RA
compila perfrecto, el problema viene al poner
#INT_RA1 al RA5
Pues creo que lo que sucede es lo siguiente:
Al parecer son interrupciones al cambio, es decir, habra interrupcion cuando en determinado pin del puerto A halla una trancicion H a L o L a H
con: enable_interrupts(int_ra0); enable_interrupts(int_ra1); .... etc te encargas de habilitar la interrupcion al cambio de dicho pin unicamente, el resto del puerto funcionara como entrada o salida, dependiendo de tu configuracion en trisa.
en el caso de que configures varios pines para interrupcion, imagino que ya tu te encargaras de ver que pin genero la interrupcion dentro de #INT_RA
y pues creo que es asi como funciona, sino que alguien me corrija.
saludos :mrgreen:
-
Te me has adelantado mientras escribia micro_cadaver :D :D
bueno, insisto, para interrupcion al cambio sera #INT_RA
para conversores A/D es #INT_AD
Saludos :-/
-
:D jejeje
-
Voy a releer el Datasheet del PIC a ver si me aclaro un poco más.
Yo también había pensado que con enable/disable_Interrupts(INT_RAx) activas las interrupciones en cada pin de forma independiente para luego usar #INT_RA y en la rutina de interrupción detectar qué pin es el que ha cambiado de estado.
De todas formas la interrupción INT_EXT que en muchos otros PIC es para RB0 y que además permite ser configurada como H_TO_L o L_TO_H en este no tendría sentido, no? Ya que con INT_RA0 ya puedes obtener la interrupción de se pin.
Además en la librería aparcen las definiciones H_TO_L y L_TO_H para usarse con la función EXT_INT_EDGE() con lo que para algo servirán.
Voy a ver si descubro algo...
-
Releído el Datasheet es así como funciona. Cada pin del puerto A pude configurarse para que interrumpa en un cambio de estado de forma independiente a cómo estén configurados los otros pines.
Aunque el misterio de INT_EXT sigue ahí ¿?
Una duda que me ha salido al leer el Datasheet es:
Pone que las interrupciones "on-change" se desactivan en un Power_On_Reset. Qué significa exactamente?
Y por otro lado, dice que este de interrupciones son fruto de la comparación del registro de estado del puerto actual con el estado de la última vez que fue leído. Supongo que entonces en cada interrupción debo leer todo el puerto para actualizar el registro. Existe algún comando que me devuelva el estado de todo el puerto??
-
- INt_EXT no hay misterio, en el pic16F676 el pin EXT_INT es RA2, mira bien el datasheet :-)
- power on reset : al mantenerse reseteado o al resetearse el chip se borran los flags del registro de interrupcion INTCON por ejemplo, a eso se refiere, esos bits son los q disparan las interrupciones.
- bueno si quieres leer el puerto A,
movfw PORTA
movwf TU_REGISTRO
si quieres el flag de disparo, esta en el registro INTCON. :-/
-
Ains!!!! Si lo pone bien claro y grande... RA2 External Int. Perdón... es lo que tiene ser novato ;)
Con lo de leer el puerto me refería a hacer algo así en C (extraído de un ejemplo):
changes = last_b ^ port_b
last_b=port_b;
Con esto supongo que el registro de estado ya queda actualizado para interrumpir en el nuevo cambio de estado de algún pin... en este caso de puerto B.
Gracias y un saludo!!
-
si , pero eso lo hace el hardware del chip por si solo, porq lo deseas hacer tu tambien o no entindi tu mensaje??? :?
-
Eso es lo que no sabía. Si después de una interrupción guarda el registro de estado después de esta para compararlo cuando haya un cambio en un pin de nuevo. Pensaba que si no hacías la lectura del port_b no lo actualizaba.
De todas formas, quiero saber qué pin ha sido el de la interrupción, por lo que debo utilizar ese código o algo muy similar.
Gracias!!
-
sip en ese caso estas en todo correcto, porq la interrupcion por si sola no discierne entre q pin de los 4 fue el q activo la interrupcion, exitos amigo! :-/
-
Gracias!!! Estamos en ello!!
Un saludo!!