TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: merycr en 30 de Mayo de 2008, 14:28:37

Título: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 30 de Mayo de 2008, 14:28:37
¡Hola a todos! Primero deciros que me ha sido bastante útil este foro ^^

Tengo que hacer una práctica para la universidad y me ha surgido una dudilla: cómo se pueden encolar interrupciones en el PIC16F84a? Osea, que mientras estás con una interrupción, si se producen un par más, se pongan a la cola y luego se ejecute la más prioritaria de ellas.
Es que necesito programar un ascensor y lo hago mediante interrupciones, y si mientras el ascensor está en movimiento la gente pulsa más botones, pues se tiene que recordar e ir luego a la planta correspondiente.

¿Alguien podría ayudarme? He estado un buen rato con el buscador y no he encontrado nada parecido...  :(


Gracias!!! :mrgreen:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 30 de Mayo de 2008, 15:16:12
Saludos merycr, bienvenido al foro!
Pues si es un ascensor y las interrupciones son causadas por usuarios que presionan botones, no creo que deba preocuparte que se produzca una interrupción mientras estás ocupado con otra interrupción...
Mi razón es la velocidad con la que trabaja el micro versus la velocidad con la que una persona puede presionar otro botón...
Si usas un cristal de 20MHz, estás trabajando con un ciclo de máquina de 0.1us.... bastante rápido no crees?
Entonces la cuestión sería tratar de que tu rutina de interrupción no contenga tanto código (cosa muy conveniente que se ha tratado con anterioridad en otros hilos)... más bien activar banderas en la rutina de interrupción y hacer el resto del trabajo en el programa principal...
Ya algún experto dará alguna opinión, pero entonces como te digo, no creo que eso sea un problema... siempre un botón será presionado primero que otro... y el micro será capaz de reconocer eso...
Por cierto, sería bueno que especificaras en qué lenguaje estás programando, para así poder ayudarte mejor.
Bueno te deseo éxito, nos leemos!  :mrgreen:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: Leon Pic en 30 de Mayo de 2008, 15:25:11
Me ganaste de mano FIRE.

El pic16f84A no puede correr a 20Mhz, y como máximo lo puedes hacer correr es a 10Mhz (que no es nada lento). Otro punto importante es que tampoco permite dos o mas interrupciones a la vez. Esto es así, porque en el momento de ejecutarce una interrupción, el bit GIE, se desactiva para evitar otra.

Debes hacer lo que te dijo Fire, porque el CP trabaja muy rápido y entre un pulso y otro, deberás esperar como mínimo 50ms para evitar que el botón presionado, se lea dos veces, y en este tiempo, tienes suficiente como para atender la interrupción y activar otra.
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 30 de Mayo de 2008, 15:48:54
Pues teneis toda la razón Leon Pic... es que siempre trabajo a 20MHz con los otros micros y pues se me escapó!  :D
A 10MHz todavía tiene tiempo de sobra!
Nos leemos!  :mrgreen:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 31 de Mayo de 2008, 08:56:34
¡Muchas gracias por las respuestas!  :mrgreen:

Teneis razón en esto de las interrupciones....

Pero más bien me refería a que se guarden las posibles interrupciones para mientras el ascensor esté subiendo, o bajando... Ya sabeis, si mientras el ascensor sube alguien le da a otro botón, o alguien lo llama desde otra planta... ¿cómo podría hacer eso?

Y el lenguaje, estoy utilizando el ensamblador ^^
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 31 de Mayo de 2008, 11:41:59
Saludos merycr!
Pues simplemente mientras se producen las interrupciones vas evaluando quién produjo la interrupción y guardas en una variable para saber a qué piso tienes que ir...
Pero sería bueno que colocaras el esquema eléctrico de lo que estás haciendo... para ser más exactos en cuanto a lo que se puede hacer.
Ok nos leemos!  :mrgreen:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 31 de Mayo de 2008, 13:12:24
¡Claro, qué buena idea!   :-/

¡Muchas gracias firepic! :mrgreen:
Mmm no sé muy bien qué es eso del esquema eléctrico....  :lol: pero bueno jeje ya me has ayudado mucho ^^
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 31 de Mayo de 2008, 13:15:55
Merycr, lo que te sugiero que coloques es el diagrama eléctrico de cómo lo vas a montar en la realidad... , el pic, algún otro integrado que vayas a usar, el teclado del ascensor, la alimentación.... todo eso. ¿Me explico?
¿Sí tienes ya idea de cómo lo vas a hacer o estás todavía en fase inicial?
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 31 de Mayo de 2008, 13:28:46
Ahhh ya sé a lo que te refieres jaja

Lo que pasa es que en realidad no voy a montarlo, es sólo un proyecto para simularlo en el ordenador (con el MPLAB).

Por si te refieres también a esto, las especificaciones son que el ascensor se moverá por 4 plantas (guardaré la planta en la que estoy en la memoria EEPROM). Para abrir y cerrar las puertas el PIC está conectado a un servomotor por el pin RB4 (esta parte ya la tengo solucionada :P).
La parte de subir y bajar es lo que aún no sé muy bien cómo lo haré... Pero me pondré a ello y si tengo alguna dudilla ya sé en quién puedo confiar  :mrgreen: jeje.

Si mientras sube y baja el ascensor (que ahí es donde tenía yo la cosa) se pulsan más botones, se recordará y luego se irá primero a la planta más cercana de las que tenga pendientes, y así hasta que no tenga ninguna interrupción pendiente.



Asique supongo que con todo esto... Aún estoy un poco en la fase inicial jejej
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 31 de Mayo de 2008, 13:41:15
Ah pues si son no más cuatro plantas usas directamente cuatro botones conectados a RB4:RB7 y lo manejas mediante interrupciones como hemos hablado, ya ahí tienes resuelto el problema...
Ponte a echar código... podrías guardar los botones detectados y asignarle un valor de acuerdo al piso que corresponda, por ejemplo:

piso1: 01
piso2: 02
piso3: 03
piso4: 04

Entonces se me ocurre que hagas restas entre los pisos que ha sido solicitados y el piso actual, y el resultado menor es el piso que está más cerca.
Bueno no más es una idea. Sigue dándole y seguro terminarás tu proyecto satisfactoriamente!
Nos leemos!  :mrgreen:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 31 de Mayo de 2008, 13:51:37
Otra gran idea  :mrgreen:

¡Gracias de nuevo!

Vuelvo a ponerme a ello, ya os contaré cómo voy jeje
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 31 de Mayo de 2008, 13:59:02
Vaya pues, a trabajar se ha dicho!  :-/
Te vas a divertir un mundo!
Nos leemos!  :mrgreen:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 01 de Junio de 2008, 15:01:54
Ahhg me he vuelto a liar!  :(

He intentado hacer eso de guardar en una variable quién produjo una interrupción a medida que se produzcan pero no sé muy bien cómo hacerlo...

El caso es este: cuando hay una interrupción el pin RB1 se pone a 0 si la llamada ha sido desde fuera del ascensor, y se pone a 1 si alguien ha pulsado un botón dentro del ascensor. Además los pines RB2 y RB3 (siendo RB2 el más significativo) indican a qué planta hay que ir: 00 para la planta baja, 01 para la primera planta, 10 para la segunda y 11 para la tercera.

El caso es que no sé cómo guardar toda esta información a medida que se vayan produciendo las interrupciones.... ¿Lo hago en una variable o en varias? Y si es en varias ¿Cómo sé qué variable modificar cada vez?

Estoy en ello toda la tarde y nada...

¿A alguien se le ocurre algo? :?
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 01 de Junio de 2008, 15:10:58
No te preocupes merycr, que lo vas a lograr!  :P
La pregunta es, quién genera la interrupción? Tienes botones conectados a RB4, RB5, RB6, RB7 correspondientes a cada planta como te mencioné antes?
Por cierto, aún no has colocado el esquema eléctrico. Cárgalo para poder entender mejor lo que estás haciendo y estar en capacidad de ayudarte más.
Dale pues, nos leemos!  :mrgreen:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: Leon Pic en 01 de Junio de 2008, 15:17:45
Acá hay algo que no entiendo. El pin RB1 indica si el pulsador que se accionó fue:

0 si se accionó fuera del ascensor (una persona que llama al ascensor)
1 si se precionó desde dentro de la cabina (una persona que desea ir a un piso)

solo tienes 2 opciones, y las dos muestran acción y no contemplan el estado de reposo del ascensor esperando. Por lo que interpreto que el RB1, comanda a algún circuito. ¿esto es así?

¿puedes subir las directivas del profesor para armar el ascensor? porque la información que nos propoorcionas es muy poca. Esto es para ver si se puede mover el RB4 a otro pin o hay que usar las puertas en el RB4 si o si.

¿porqué? porque una de las interrupciones del del pic, es por cambio de nivel en los pines RB4 al RB7, además, los botones están por duplicado. Los cuatro botones dentro de la cabina y los cuatro botones que estan en cada piso para llamar al ascensor, que justamente, son los mismo y no hay nececidad de distinguirlos (botones e adentro de la cabina y de los de afuera)
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 01 de Junio de 2008, 15:21:58
La interrupción se genera por el pin RB0 cada vez que alguien pulsa un botón. Luego la información está en los pines RB1, RB2, y RB3 como he dicho antes, pero no tengo los botones conectados directamente a ningún pin.

El pin RB1 importa porque si la llamada es desde dentro del ascensor tiene más prioridad (en el caso de que haya varias llamadas en cola).

Los pines RB1, RB2 y RB3 sólo se activarán si ha habido una interrupción, de modo que el estado de reposo es mientras no haya ninguna interrupción.


El pin RB4 está conectado a un servomotor para la apertura y cierre de las puertas. (Esta parte la tengo apañadita jeje)

Y los pines RB5, RB6 y RB7 se utilizan para comunicación del PIC on el motor de desplazamiento mediante el protocolo SPI (RB5 = Reloj, RB6 = Comunicación del maestro al esclavo, RB7 = señal de selección del esclavo). El PIC utiliza este protocolo SPI para enviar cada vez que lo necesite un comando (para indicar cuanto moverse y hacia donde) a la electrónica de control del motor del desplazamiento.
Todo esto es un poco lioso, aún no he llegado a ello...


(Esto vale como esquema eléctrico? xD)

Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 01 de Junio de 2008, 15:26:29
Ok. Así se entiende mucho mejor.
Entonces se genera la interrupción INT en RB0, vas a la rutina de interrupción y evalúas el estado de RB1 para saber la prioridad. Ahora otra pregunta... cómo sabes en qué planta está el ascensor? Para poder conocer cuál planta queda más cerca y a cuál irá más rápidamente.
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 01 de Junio de 2008, 15:31:41
El número de planta lo guardo en la primera posición de la memoria EEPROM del PIC.
Cada vez que cambie de planta cambiamos el valor y listo ^^
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: Leon Pic en 01 de Junio de 2008, 18:32:32
A diferencia de firepic, yo entiendo menos. Si los 4 pulsadores van conectados al RB0, ¿cómo sabes de que piso se pulso? Anteriormente habías dicho por RB2 y RB3, entonces la persona que para usar el ascensor debe pulsar primero un botón y luego otro para seleccionar el piso. El primero sería para generar la interrupción y el segundo para seleccionar el piso. Estoy seguro que esto no es así.

Se me ocurre lo siguiente que, RB2 y RB3, van en la cabina pero como sensor para saber en que piso está (no está accesible al usuario). Pero sigo sin entender.


¿Porqué no pones un diagrama de conección como seria si lo tendrías que montar? porque cada vez se entiende menos. Ten encuenta que el software y el hardware, van de la mano. Si no sabemos la conección, menos sabemos como ayudarte para la generación del software.
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 01 de Junio de 2008, 18:42:43
Bueno tienes razón Leon, merycr no ha sido del todo claro, pues tendría que colocar el esquema eléctrico.
Pero lo que yo entiendo es que debe tener alguna circuitería (tal vez una compuerta OR) que no importa cuál interruptor sea presionado, si es presionado alguno se active una señal que es la que va a RB0. Y supongo que tiene otra circuitería que codifica el botón en un número binario que está en RB2 y RB3. Claro que no estoy seguro pero me imagino que es así. Tal vez estoy equivocado y ahí sí pues la ayuda que podré darte será nula merycr.
Esperemos entonces a que te fajes con el diagrama y lo coloques. Estoy totalmente de acuerdo con Leon. Software y Hardware siempre juntitos  :D
Ok nos leemos!  :mrgreen:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 02 de Junio de 2008, 07:42:52
Jo, es que o sé hacer un esquema eléctrico...  :(

Con lo de los pines RB2 y RB3  (y también el RB1 que indica la prioridad) tienen una circuitería (no tenemos que hacerla y no nos especifica cuál) que hace que cada vez que pulses un botón haya una interrupción por el pin RB0, por el pin RB1 te dice de donde ha sido la llamada, y por los RB2 y RB3 se codifica en binario a la planta a la que vamos.

Gracias por intentar ayudar aunque mis explicaciones estén un poco escasillas!    :lol:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: firepic en 03 de Junio de 2008, 12:02:56
Ya. O sea que básicamente así lo especifica el proyecto y listo. Entiendo.
Merycr, qué tal si colocas el código que tienes hasta el momento?
Y ahí te iremos ayudando.
Ok saludos, nos leemos!  :mrgreen:
Título: Re: Encolar interrupciones en PIC16F84a
Publicado por: merycr en 03 de Junio de 2008, 13:11:06
Vale, pongo el código hasta ahora ^.^

Pero quito todo el código que tengo de apertura y cierre de las puertas, que  ya me funciona y solo va a servir para liarlo todo un poco.


Mmm oye firepic, que he pensado que (como eres el único que está ya conmigo en este hilo) mejor te envio el código por mensajillo privado, porque no soy la única que tiene que hacer este proyecto y a ver si alguien me va a coger el código y me van a decir que he copiado  :D