Interrupciones pic 18f4550

Buenas,les comento tengo que automatizar un porton que trabaja con un piston neumatico y lo que basicamente tendria que hacer es comandar las electroválvuas, despues las otras salidas no hay problema. Lo que el sistema debe realizar es que cuando pulsa abrir debe abrir, y si no termina de abrir y pulsan cerrar debe cerrar y visceversa, si pulsa cerrar y comienza a cerrar y antes de que termine pulsan abrir debe comenzar a abrir. Lo que yo hice fue utilizar 2 pines de interrupcion externa pero el problema es que lo tengo que poner con prioridades, entonces si por ejemplo pongo la interrupcion de cerrar con prioridad, cuando esta abriendo y pulsan cerrar cierra, pero si esta cerrando y pulsan abrir obviamente sigue cerrando...Lo estoy programando en lenguaje C con el CCS si alguien me da algun consejo me seria de gran ayuda. Muchas gracias Saludos
 
Hola.
Mi duda es si conoces como funcionan las interrupciones en los PIC18, que en resumen seria que funcionan similar a los PIC16 con la diferencia que una interrupción de alta prioridad se produce aun si el procesador se encuentra en una interrupción de baja prioridad. Sabiendo esto te pregunto ¿Dónde has colocado las interrupciones externas?

Seria de ayuda si subes parte de tu programa...

Saludos.
 
Axel te adjunto el mi programa con comentarios asi ves lo que intento hacer y la simulación en proteus. Si bien hace poco comencé con esto eso que decis de las interrupciones lo entiendo, el tema que yo coloque la funcion cierre en la prioridad mas alta entonces cuando necesito cerrar el porton cuando se esta abriendo lo hace, pero tambien necesito que abra si le dan la orden de abrir cuando esta cerrando y eso por como coloque las interrupciones no lo puedo conseguir, si tenes alguna idea me seria de gran ayuda, Saludos!
 

Adjuntos

  • Porton.zip
    18 KB · Visitas: 32
Hola.
Viendo el programa y como dices. No pueden suceder dos interrupciones de la misma prioridad al mismo tiempo; es decir por ejemplo, cuando sucede #INT_EXT ya no puede atender a #INT_EXT1 hasta que termine y eso seria el tiempo en que se demora en cerrar.

Si no es necesario usar Sleep(), sugiero lo siguiente:

- Dentro de While(1), verifica dos avisos (variables o flags) uno para el evento de "abrir" y el segundo para el evento de "cerrar", ambos generalmente desactivados hasta que alguno se active por interrupción.
- En la primera interrupción, activa el aviso de "abrir" (bloquea cerrar) el cuál será ejecutado al volver a While(1).
- En la segunda interrupción, activa el aviso de "cerrar" (bloquea abrir) el cuál será ejecutado al volver a While(1).

Si entiendes lo que trato de explicar es posible que necesites cambiar o quitar los delays y el bucle de espera del censor que detecta el cierre ya que le debe dar mayor prioridad a verificar los cambios realizados en las interrupciones.

Saludos.
 
Modifique el codigo y logicamente creo que funciona bien, el tema es que me desactiva las interrupciones y eso que practicamente lo unico que hago en ellas es modificar banderas, tienen idea de que puede ser?? adjunto el codigo por si se dan una idea que puede ser...Muchas gracias
 

Adjuntos

  • Porton.zip
    18.3 KB · Visitas: 14
Hola Gabriel114, estuve mirando tu programa, pero no se a que corresponde cada entrada o salida. Puedes decirme a cuales entradas corresponden los pulsadores para abrir y a cuales corresponden los pulsadores para cerrar? Además, como detienes la puerta al terminar de abrir o cerrar? con fines de carrera, o por tiempo, o simplemente dejas accionada la electroválvula? Con estos datos tal vez te pueda ayudar. Tienes claro como funciona una interrupción y como funciona la instrucción delay_ms() del CCS? Por el momento te adelanto que instrucciones como delay_ms(4000) dentro de una interrupción = (n)

Saludos!
 
Última edición:
Disculpa que demore en contestar Fuzzer 0110, arriba describi como debia ser el comportamiento, y eso lo intento hacer con las subrutinas abrir, cerrar y despresurizar, en la cual en la apertura con el pin C0 abro una electrovalvula y con el c1 cierro la otra, y en el cierre se debe hacer al reves cerrar c0 y abrir c1. Luego las salidas c2, c4 son luces y alarmas que tienen que mantenerse un tiempo mas luego del cierre. Para la apertura no tiene ningun limite de final de carrera ni nada, el mismo piston te limita eso, lo que quioero hacer es temporizar una vez abierto con una interrupcion del timer. y luego llamar a cerrar. Ademas evaluo si mientras esta abriendo no lo llaman a cerrar o si mientras esta cerrando no lo llaman para abrir. Luego siempre que cierra tiene que despresurizar. Disculpa ese delay en la interrupcion no lo utilizaba ya lo borre y lo compile pero sigue sin prestarle atencion a las interrupciones ni las externas ni las del timer. Si te das una idea me seria de gran ayuda gracias!!!
 

Adjuntos

  • Porton.zip
    34.8 KB · Visitas: 11
Hola Gabriel114, sigo sin entender bien, el por que usas dos electroválvulas. Si te sirve como idea, con una sola electroválvula tipo 5/2 biestable, y conectando los gatos de cada ala de la puerta en paralelo, te saldrías del problema fácilmente con un programa para el PIC muy simple. Sin embargo, es cierto que en neumática hay muchas formas de resolver los problemas, por eso lo mejor es que subieras tu esquema neumático para analizarlo.
Lo de temporizar una vez abierto con una interrupción, es para que al terminar ese tiempo se cierre sola?

Saludos!
 
Te adjunto el esquema neumatico (disculpa la desprolijidad lo hice en paint nomas), y si la idea era que en funcionamiento normal este una x cantidad de tiempo abieerto y desp cierre, siempre y cuando no le ordenen cerrar por el control remoto...

Saludos!
 
Hola Gabriel, el sistema neumático que utilizas es con electroválvulas simples y así tendrías que usar no 3 sino 4 electroválvulas, porque necesitas obligatoriamente descomprimir el lado contrario al movimiento del vástago del gato. La electroválvula que te menciono es muy común (5/2 biestable) que es una electroválvula que tiene las dos salidas para el gato, la entrada de presión y los escapes (que son lo que llamas despresurización) y dos bobinas de mando. Estas electroválvulas tienen memoria de la última señal que reciben. Si le das una pequeña señal en la bobina de abrir, la electroválvula se queda dando esta orden permanentemente, hasta que la bobina de cerrar reciba una señal; lo mismo ocurre al contrario.
Tuve un rato libre ahora en la tarde y te hice un diseño muy simple del control neumático de una puerta. Utilizo dos gatos para un portón de doble ala (aunque puedes eliminar uno si no es el caso) y también te hice un ejemplo muy simple del programa para el PIC, aprovechando las ventajas del CCS.
El programa consiste en activar una salida para energizar la bobina de Abrir y otra salida para energizar la bobina de Cerrar. A estas señales les doy solo 0,5 segundos de duración, ya que con eso es más que suficiente. También le implementé un tiempo de duración Abierto de 5 segundos, como el que mencionaste, y luego de este tiempo recibe la señal de Cerrar.
El programa lo comenté lo mejor que pude, para que tengas una base y si te sirve lo puedas ampliar para la aplicación real que vas a utilizar. En la simulación, el LED verde simula a la bobina de Abrir, y el LED rojo a la bobina de Cerrar. Como mencionabas, puedes cambiar la orden de Abrir a Cerrar o al contrario en cualquier momento y la respuesta será inmediata. Si por ejemplo le das Abrir y antes de los 5 segundos que cuenta para cerrar automáticamente le das la orden de cerrar, el tiempo de cerrado automático se cancela y cierra inmediatamente. El pulsador para abrir está conectado a RB0 y el de cerrar a RB1. Cualquier duda o error que encuentres, no dudes en preguntar.

Saludos!
 

Adjuntos

  • Porton_03.zip
    21.4 KB · Visitas: 26
Última edición:
Atrás
Arriba