TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Conguito en 03 de Mayo de 2008, 10:40:26
-
Buenas, el título es descriptivo, pero antes de me mandéis usar el buscador me explico:
Tengo dudas sobre las interrupciones y son muy básicas ya que acabo de introducirme en el mundo de los microcontroladores, así que las enumero:
1.- ¿Qué es una interrupción?
2.- ¿Cómo se usa?
3.- ¿Los Pic's sólo tienen una patilla para usar interrupciones?
4.- ¿Se pùeden eventos de interrupción para otras patillas que no sea la definida como INT?
Como véis son preguntas muy básicas y no he visto en ningún manual respuesta efectiva a ellas ya que te explican directamente cómo usarlas y tal.......pero no voy a usar algo que no sé lo que es........por lógica más que nada.
Gracias por adelantado a los que respondan.
Salu2.
-
Con que PIC deseas trabajar de acuerdo a ellos se te podrian dar respuestas mas concretas.
1.- Una interrupcion es un proceso mediante el cual el microcontrolador deja lo que esta haciendo para atender a una subrutina, hasta donde tengo entendido hay Int por Hardware y por Software.
2.- Esta pregunta es muy general, se usa dependiendo del tipo de interrupcion q queramos habilitar, por ejemplo en la INT TIMER0 tenemos que habilitar primero esa interrupcion para despues activarla cada vez que se desborde el timer0 entrando en una subrutina de programa.
3.- No dependiendo de los modelos
4.- Si el pin no esta definido en el data sheet que puede generar una interrupcion no podras generar una interrupcion por el.
No creo q encuentres un manual que defina todo lo que deseas como te digo vas a tener q ir utilizando las interrupciones de acuerdo al pic que uses ya que cada modelo trae diferentes caracteristicas.
-
1.- ¿Qué es una interrupción?
2.- ¿Cómo se usa?
3.- ¿Los Pic's sólo tienen una patilla para usar interrupciones?
4.- ¿Se pùeden eventos de interrupción para otras patillas que no sea la definida como INT?
R1. Es un suceso especial q el microcontrolador atiende cuando ocurre, ejecuta una pequeña rutina y al terminar ella vuelve al lugar de ejecución del programa donde ocurrió la interrupción.
R2. Se usa configurándolo, según como te dice la hoja de datos, se habilitan y deshabilitan bits según corresponda, y esos bits tb indican cuando ha sucedido la interrupción (bandera)
R3. No, los PIC's tienen muchas formas de interrumpirse, la int por una patita solo es un tipo de interrupcion, en microcontroladores de la familia 16Fxxx si es solo un pin, pero en familias superiores como la 18Fxxx tiene como 3 pines (otros talvez más) dedicados a interrupciones externas. Pero ambas familias tienen otro tipo de interrupciones internas.
R4. No
-
Gracias por las respuestas, pero hay algo que no me cuadra, dices que según el modelo no todos los PIC's tienen sólo una patilla para activar interrupciones, pero hojeando así por encima distintas hojas de características de PIC's veo que los 12F629, 16F84a, 16F876, 18F2550........sólo tienen una patilla INT :?
Voy a poner un supuesto de uso:
Imaginemos que tengo un circuito alimentado a baterías, éste circuito tiene 3 pulsadores y cada uno de ellos activa un relé, tengo el PIC permanentemente en una rutina de loop esperando que se pulse uno de los tres pulsadores para cambiar de estado.
El problema de esto es que el PIC consume mucho más que si lo pongo en modo Sleep y mediante interrupciones hago que el PIC "despierte" para activar el relé correspondiente al pulsador usado y una vez activado el relé vuelva al estado Sleep.
Si los PIC sólo tienen una patilla que active interrupciones no puedo hacerlo con los tres pulsadores.
Sé que es más que probable que haya otra manera de hacer que el circuito gaste menos baterías, pero lo que me interesa es aprender sobre las interrupciones ya que es algo cuyo concepto no tengo muy claro, sí sé que mediante una interrupción se puede sacar al PIC del estado Sleep.....y que ése es sólo uno de los usos.
Salu2.
-
el 12F y los 16F si efectivamente solo tienen un pin de INT, pero el 18f2550 si te fijas bien tiene 3 pines de interrupción externa INT0, INT1 e INT2, que son los pines RB0, RB1 y RB2 respectivamente, y con ello si podrias hacer lo q pretendes de los 3 pulsadores.
pero existen otras formas de interrupción, por ejemplo por variación del nibble alto del puerto B en muchos microcontroladores, esto es de RB4 a RB7, con ello tienes hasta 4 pines para pulsadores
tb existe el desborde por TMR0, TMR1, y talvez otro timer mas, ellos pueden ser usados con un reloj externo, que podría ser un pulsador por ejemplo, si siempre tienes al timer a punto de desbordar con tu pulsador provocarías una cuenta al TMRx y por tanto una interrupción "externa" creada.
como ves puedes optar por varias formas de usar las interrupciones.
y como te mencione en mi 1ra respuesta, una vez ejecutada la interrupción, vuelve a donde estaba, si estaba en un ciclo de SLEEP, vuelve ahi
-
el 12F y los 16F si efectivamente solo tienen un pin de INT, pero el 18f2550 si te fijas bien tiene 3 pines de interrupción externa INT0, INT1 e INT2, que son los pines RB0, RB1 y RB2 respectivamente, y con ello si podrias hacer lo q pretendes de los 3 pulsadores.
No me había dado cuenta de que el 18f2550 tenía 3 patillas de INT, error mío.......
pero existen otras formas de interrupción, por ejemplo por variación del nibble alto del puerto B en muchos microcontroladores, esto es de RB4 a RB7, con ello tienes hasta 4 pines para pulsadores
¿Esto mismo se puede hacer con el puerto GPIO que tiene el 12F629? Es el que estoy usando ahora mismo para la aplicación mencionada anteriormente ya que tiene el patillaje justo para mi aplicación: 3 entradas y 3 salidas.
tb existe el desborde por TMR0, TMR1, y talvez otro timer mas, ellos pueden ser usados con un reloj externo, que podría ser un pulsador por ejemplo, si siempre tienes al timer a punto de desbordar con tu pulsador provocarías una cuenta al TMRx y por tanto una interrupción "externa" creada.
Perdona, pero aquí ya me pierdo, ya he dicho que soy novato con el tema de los microcontroladores, por lo que aún no controlo ni de desbordes ni el uso de timers ni nada, así que este tipo de programación lo dejaré para cuando esté algo más iniciado en el tema, para hacerte a la idea de mi nivel, ahora mismo sólo controlo lo que respecta a las entradas y salidas y programo en Basic porque el ensamblador me resulta imposible de entender por mucho que lo haya intentado (que lo he hecho) y el C aún lo tengo "bajo observación" por si le pillo el tranquillo, así podría usar el compilador gratuito de microchip, cosa que me atrae bastante más que tener que usar un programa de pago para poder programar en Basic.
como ves puedes optar por varias formas de usar las interrupciones.
y como te mencione en mi 1ra respuesta, una vez ejecutada la interrupción, vuelve a donde estaba, si estaba en un ciclo de SLEEP, vuelve ahi
Espero llegar al nivel de conocimiento necesario para poder hacer cosas como las que me has explicado arriba, sólo llevo 2 semanas con el tema y he aprendido más de lo que esperaba, por lo que no descarto poder hacer cosas así en menos de 3 meses.......todo es ponerse 8)
Gracias por las respuestas y los consejos, pronto espero poder ser de los que ayudan y aportan algo en el foro.
Salu2.
-
¿Esto mismo se puede hacer con el puerto GPIO que tiene el 12F629? Es el que estoy usando ahora mismo para la aplicación mencionada anteriormente ya que tiene el patillaje justo para mi aplicación: 3 entradas y 3 salidas
si ese micro tiene interrupción por cambio de estado en el puerto:
(http://img169.imageshack.us/img169/2405/interruptsvh7.jpg)
así q te servirá muy bien en tu trabajo, solamente talvez tengas q tener en cuenta q todo el puerto se ve afectado por ello y solo deberás fijarte en los pines q sean necesarios
sobre lo de desborde, para q ya estes con la idea, es el cambio que tiene el timer del maximo valor al minimo, es decir que en el caso del timer0 (q en micros de la familia 12f 16F) es de 8 bits cambie de 255 a 0. ya q el timer siempre se incrementa (ya sea con un reloj interno o externo)
Siempre como referencia puedes usar la hoja de datos del microcontrolador q utilizas, eso lo encuentras en la pagina del fabricante, microchip.com
-
te recomiendo que te des una revisada rapida por este hilo:
[urlhttp://www.todopic.com.ar/foros/index.php?topic=14634.0][/url]
y entra a EJEMPLITOS DE C PARA 16F648
Te juro q ahi aprenderas C para PIC de manera rapida
-
No es necesario saber lenguaje C para entender las interrupciones que posee los micro.
Para entender las interrupciones, es mejor que lo veas funcionar y que mejor que con el MPLAB para simularlo en modo paso a paso e ir fijándose que es lo que hace el CP (contador de programa). Una pequeña anecdota: Yo empezé hace poco con la programación (antes no programaba nada, nada, de nada) y empezé con los PIC, imaginate lo que me costó aprender esta nueva forma de pensar, esta nueva lógica y todo lo que conlleva la programación y lo hise en forma autodidacta (por hobbie), me leí un manual tantas veces, que lo sabía de memoria, y n lograba entender nada. Y todo me cerro cuando lo vi funcionar. Lo vi con el MPLAB y empece a entender todo.
Como esa anecdota y experiencia, te aconsejo que hagas lo mismo. Toma un ejemplo de una interrupción y miralo funcionar. Chequea el siguiente link:
http://www.todopic.com.ar/foros/index.php?topic=1124.msg9345#msg9345
Suerte.
-
si ese micro tiene interrupción por cambio de estado en el puerto:
(http://img169.imageshack.us/img169/2405/interruptsvh7.jpg)
así q te servirá muy bien en tu trabajo, solamente talvez tengas q tener en cuenta q todo el puerto se ve afectado por ello y solo deberás fijarte en los pines q sean necesarios
sobre lo de desborde, para q ya estes con la idea, es el cambio que tiene el timer del maximo valor al minimo, es decir que en el caso del timer0 (q en micros de la familia 12f 16F) es de 8 bits cambie de 255 a 0. ya q el timer siempre se incrementa (ya sea con un reloj interno o externo)
Siempre como referencia puedes usar la hoja de datos del microcontrolador q utilizas, eso lo encuentras en la pagina del fabricante, microchip.com
Llevé a imprimir por completo la hoja de características del 12F629 por lo que me la he leído por encima, pero siempre hay cosas que se le escapan a uno, en esto no me había fijado, sinceramente creo que es que no le había prestado atención al no saber cómo funciona lo de las interrupciones, creo que va a ser una buena forma de practicar con ellas, continuando el proyecto que ya tengo funcionando y optimizándolo para que gaste menos baterías.
Estudiaré lo del desborde del timer leyendo el post al que me ha remitido Leon Pic, aunque sea con un Atmel creo que por lo menos me puede servir para comprender mejor el funcionamiento.
No quiero ser pesado preguntando pero........supongo que puedo programar el Pic para que sólo responda a las interrupciones en algunos de los pins del micro (en mi caso los pins que corresponden a los pulsadores) ¿no?
Es que leyendo eso de los cambios en el puerto GPIO me hace suponer que reaccionará a cualquier cambio que suceda en el puerto.......pero supongo que se podrá programar cuando quiero que reaccione y cuando no quiero que lo haga........joder, soy un mar de dudas y me voy a ahogar :D
Salu2.
-
Me respondo a mi mismo en uno de los puntos:
3.2.2 INTERRUPT-ON-CHANGE
Each of the GPIO pins is individually configurable as an
interrupt-on-change pin. Control bits IOC enable or
disable the interrupt function for each pin. Refer to
Register 3-4. The interrupt-on-change is disabled on a
Power-on Reset.
Seguiré estudiando el datasheet, creo que voy a encontrar la solución a todas mis preguntas ahí mismo delante de mis narices.
Salu2.
-
Hola Conguito. Si te fijas en el link que te pasé, msantiago, en ese mismo link, hiso un programa para un 16f84. Es un detalle que tendría que ver mencionado antes.
-
No te preocupes, de todas formas iba a leerlo, si no me equivoco las interrupciones son algo "universal" en los microcontroladores, da igual el que sea........¿o no? :shock:
Salu2.
-
la interrupcion es la forma de reducir el polling en la programación de los pic
esto induce a pensar como que el pic ejecutara una forma de multiprocesamiento, ya que deja que el módulo que posea/active la interrupción haga un trabajo independiente y simultáneo mientras el contador de programas ejecuta lineas de código en el bucle principal.
...es la forma de reducir el polling...
no por ello dejaremos de hacer preguntas acerca del estado de aquel proceso en el que activamos la interrupción.
polling: dentro del contexto de los uC PIC, significa preguntar acerca de alguna información, su traducción sería poleo o encuesta.
-
http://www.hispavila.com/3ds/chipspic/interrupciones.html :mrgreen:
-
Saludos gente del foro! :-)
Estoy totalmente de acuerdo con el amigo Cryn en las tres primeras respuestas, pero en la última, creo que hay un error...
Acaso no se pueden definir eventos de interrupción en otros pines aparte de INT, como por ejemplo, los clásicos RB4:RB7 del PIC16F877?
Y otros microcontroladores admiten otras interrupciones por "cambio de estado" en determinados pines... no es cierto?
Entonces sí se pueden programar eventos de interrupción asociados a otros pines del pic que no sean INT o INT1, INT2, etc...
De todos modos pido a los maestros moderadores de este foro que si el equivocado soy yo me avisen por favor.
Ok nos leemos! :mrgreen:
1.- ¿Qué es una interrupción?
2.- ¿Cómo se usa?
3.- ¿Los Pic's sólo tienen una patilla para usar interrupciones?
4.- ¿Se pùeden eventos de interrupción para otras patillas que no sea la definida como INT?
R1. Es un suceso especial q el microcontrolador atiende cuando ocurre, ejecuta una pequeña rutina y al terminar ella vuelve al lugar de ejecución del programa donde ocurrió la interrupción.
R2. Se usa configurándolo, según como te dice la hoja de datos, se habilitan y deshabilitan bits según corresponda, y esos bits tb indican cuando ha sucedido la interrupción (bandera)
R3. No, los PIC's tienen muchas formas de interrumpirse, la int por una patita solo es un tipo de interrupcion, en microcontroladores de la familia 16Fxxx si es solo un pin, pero en familias superiores como la 18Fxxx tiene como 3 pines (otros talvez más) dedicados a interrupciones externas. Pero ambas familias tienen otro tipo de interrupciones internas.
R4. No
-
De todos modos pido a los maestros moderadores de este foro que si el equivocado soy yo me avisen por favor.
No es necesario ser moderador, para aclarar algo que está equivocado. Esto lo puede hacer desde el que se inicia por primera ve en este foro, hasta el administrador.
Estoy totalmente de acuerdo con el amigo Cryn en las tres primeras respuestas, pero en la última, creo que hay un error...
Acaso no se pueden definir eventos de interrupción en otros pines aparte de INT, como por ejemplo, los clásicos RB4:RB7 del PIC16F877?
Y otros microcontroladores admiten otras interrupciones por "cambio de estado" en determinados pines... no es cierto?
Entonces sí se pueden programar eventos de interrupción asociados a otros pines del pic que no sean INT o INT1, INT2, etc...
Y Cryn dijo lo siguiente:
3.- ¿Los Pic's sólo tienen una patilla para usar interrupciones?
4.- ¿Se pùeden eventos de interrupción para otras patillas que no sea la definida como INT?
R3. No, los PIC's tienen muchas formas de interrumpirse, la int por una patita solo es un tipo de interrupcion, en microcontroladores de la familia 16Fxxx si es solo un pin, pero en familias superiores como la 18Fxxx tiene como 3 pines (otros talvez más) dedicados a interrupciones externas. Pero ambas familias tienen otro tipo de interrupciones internas.
R4. No
el 12F y los 16F si efectivamente solo tienen un pin de INT, pero el 18f2550 si te fijas bien tiene 3 pines de interrupción externa INT0, INT1 e INT2, que son los pines RB0, RB1 y RB2 respectivamente, y con ello si podrias hacer lo q pretendes de los 3 pulsadores.
pero existen otras formas de interrupción, por ejemplo por variación del nibble alto del puerto B en muchos microcontroladores, esto es de RB4 a RB7, con ello tienes hasta 4 pines para pulsadores
Los INT se utilizan para incrementar un registro inerno del PIC, como por ejemplo, el TMR0. Hay otras interrupciones que están en los puertos y es en el puerto B, en los bit RB4; RB5; RB6; RB7
-
Veo que con mis preguntas he "desatado" un pequeño debate sobre las interrupciones que puede resultar interesante para todos los que estamos aprendiendo, a ver si siguen debatiendo sobre el tema porque me interesa mucho.
El link que ha puesto MiCrOtRoNiC.........estupendo, también es de muchísima ayuda, gracias.
Salu2.
-
Tienes razón en todo... :lol:
Gracias Leon Pic, por tus aclaratorias! :mrgreen:
-
Estoy totalmente de acuerdo con el amigo Cryn en las tres primeras respuestas, pero en la última, creo que hay un error...
:mrgreen: jejeje, bueno pues tienes razon si existen otro tipo de interrupciones, y las mencione como la variación por puerto B (nibble alto), que en otros micros como los 12 es un poco diferente creo (es q casi nunca los vi a detalle no sabia el funcionamiento exacto, pero asumia que era muy similar a los de los 16f)
tb mi respuesta iba a... por ejemplo, no podemos utilizar el pin RA0 (de un 16f84a por ej.) como interrupcion, y definirlo a nuestro antojo, jeje, pensaba q a eso se refería Conguito, y por eso mi respeusta tan seca, jeje
pero bueno, no hay ningún problema de mi parte, simplemente son puntos de vista y formas de pensar, q al leer una cosa hacen pensar una u otra cosa :D.... pero ahi si lo de los micros es algo que no se puede cambiar. y Tb gracias por las aclaraciones LEON :mrgreen:
un saludo a todos