Validar la entrada de dos pulsadores a un pic16f628a

Buenas tardes. Estoy implementando un circuito de arranque y parada de un motor AC, por medio de dos pulsadores normalmente abiertos, utilizando como controlador un pic16f628a. Debe cumplir las siguientes condiciónes: Inicialmente el motor esta parado. Solo al presionar el botón de arranque debe iniciar. Solo el botón de parada debe parar el motor. Ya diseñe el circuito en proteus y lo simule, pero entonces se presenta un caso no deseado al presionar los dos botones a la vez, la salida oscila entre alto y bajo. Quiero que me den una idea de como corregir esto.

Les dejo el algoritmo que utilice:

boton_on=0
boton_off=0
desactivar_boton_on=0
desactivar_boton_off=1

Mientras el PIC este conectado haga:

Si boton_on=1 y desactivar_boton_on=0
entonces
desactivar_boton_on=1
desactivar_boton_off=0

Si boton_off=1 y desactivar_boton_off=0
entonces
desactivar_boton_on=0
desactivar_boton_off=1

Quiero que si se pulsan los dos botones no oscile sino que si estaba andando pare, y si estaba parado, inicie.

Muchas gracias.
 
Si es cómo lo entendí, se puede hacer de esta forma usando una bandera (Flag) y una interrupción externa.

No mencionas el lenguaje de programación que usas, así que escribí el código en C. (PIC C Compiler de CCS)
PHP:
#include <16f628a.h>
#use     delay(internal = 4MHz)

// Definición de pines
#define motor     pin_a1      // Pin RA1
#define detener   pin_b0      // Pin RB0
#define encender  pin_b5      // Pin RB5

int1 detenido = 1;

// Servicio de interrupción externa. (RB0)
#int_ext
void int_externa (void)
{
   if(!detenido)                             // Si "detenido" = 0...
   {
      output_low(motor);                     // Apagar motor
      detenido = 1;                          // Poner "detenido" en 1
      while(!input(encender));               // Esperar hasta que "encender" sea 1
   }
}

void main (void)
{
   port_b_pullups(1);                        // Activar pull-ups en puerto B
   
   output_low(motor);                        // Motor apagado al iniciar.
   
   enable_interrupts(int_ext);               // Habilitar interrupción externa.
   enable_interrupts(global);                // Habilitar todas las interrupciones.
   ext_int_edge(h_to_l);                     // Activar interrupción por flanco de bajada.
   
   while (true)
   {
      if(!input(encender) && input(detener)) // Si encender = 0 y "detener" = 1...
      {
         output_high(motor);                 // Encender motor.
         detenido = 0;                       // Poner "detenido" en 0
      }
   }
}
Adjunto el programa y la simulación para que veas el funcionamiento.
 

Adjuntos

  • 16F628A Botón de emergencia.rar
    25.3 KB · Visitas: 9
Última edición:
Hola....Es buena idea que nos digas que lenguaje de programación usas y muestres lo que llevas echo para así poder ser mas certeros y específicos con la ayuda.
Saludos.

Ric.
 
Última edición:
Hola, gracias a los todos los compañeros del foro, en especial a los que me ayudaron y me ayudaran :D

El circuito completo que estoy implementando tiene 3 salidas: S1, S2 y S3. Y tiene 7 entradas: E1, E2, E3, E4, E5, E6 y E7. PIC16F628A. Lenguaje C (PCW).

Debe funcionar de la siguiente manera:

Inicialmente las 3 salidas están desactivadas (0).

Si se pulsa E1 se activa S1. S1 queda activado aun cuando se suelte el botón E1.

Si se pulsa E2 se desactiva S1. S1 queda desactivado aun cuando se suelte el botón E2.

Si se pulsa E3 se desactiva S1 y se activa S2. S1 queda desactivado y S2 queda activado aun cuando se suelte el botón E3.

Si se pulsa E4 se desactiva S2 y se activa S1. S2 queda desactivado y S1 queda activado aun cuando se suelte el botón E4.

Si se pulsa E5 se desactiva S1 y se activa S3. S1 queda desactivado y S3 queda activado aun cuando se suelte el botón E5.

Si se pulsa E6 se desactiva S3 y se activa S1. S3 queda desactivado y S1 queda activado aun cuando se suelte el botón E6.

Si se pulsa E7 se resetea el microcontrolador.

#include <16f628a.h>
#use delay (internal=4MHz)
#define S1 pin_a0
#define S2 pin_a1
#define S3 pin_a2
#define E1 pin_b0
#define E2 pin_b1
#define E3 pin_b2
#define E4 pin_b3
#define E5 pin_b4
#define E6 pin_b5

void main (void)
{
while (true)
{
if (input(E1))
{
output_high(S1);
}
if (input(E2))
{
output_low(S1);
}
if (input(E3))
{
output_low(S1);
output_high(S2);
}
if (input(E4))
{
output_low(S2);
output_high(S1);
}
if (input(E5))
{
output_low(S1);
output_high(S3);
}
if (input(E6))
{
output_low(S3);
output_high(S1);
}
}
}

PIC16F628A.gif

Todo lo anterior ya lo pude resolver, en el archivo adjunto esta el circuito en proteus, el codigo en C, entre otras cosas de este proyecto.

Pero como existe la ley de Murphy no quiero que un usuario presione el botón E1 y E2 a la vez, es mas, el proyecto requiere que:

Inicialmente el único botón disponible sea el E1, ninguno puede tener alguna otra función, es decir que el PIC haga como si no existieran los demás pulsadores de entrada (excepto el E7, reset) hasta que se presione E1.

Una vez se presione el botón E1 el mismo no tenga ninguna otra función (este deshabilitado al usuario) hasta que se presione el botón E2 o bien se resetee el PIC.

Espero sus sugerencias para corregir esto, gracias.
 

Adjuntos

  • PIC16F28A.rar
    30.4 KB · Visitas: 2
Pero como existe la ley de Murphy no quiero que un usuario presione el botón E1 y E2 a la vez, es mas, el proyecto requiere que:

Inicialmente el único botón disponible sea el E1, ninguno puede tener alguna otra función, es decir que el PIC haga como si no existieran los demás pulsadores de entrada (excepto el E7, reset) hasta que se presione E1.

Una vez se presione el botón E1 el mismo no tenga ninguna otra función (este deshabilitado al usuario) hasta que se presione el botón E2 o bien se resetee el PIC.

Espero sus sugerencias para corregir esto, gracias.



Hice lo que me dijo Gudino pero aun no puedo bloquear el botón E1 una vez se oprime.

#include <16f628a.h>
#use delay (internal=4MHz)
#define S1 pin_a0
#define S2 pin_a1
#define S3 pin_a2
#define E1 pin_b0
#define E2 pin_b1
#define E3 pin_b2
#define E4 pin_b3
#define E5 pin_b4
#define E6 pin_b5

void main (void)
{
while (true)
{
switch(input_b())
{
case 0b00000001:
output_high(S1);
break;
case 0b00000010:
output_low(S1);
break;
case 0b00000100:
output_low(S1);
output_high(S2);
break;
case 0b00001000:
output_low(S2);
output_high(S1);
break;
case 0b00010000:
output_low(S1);
output_high(S3);
break;
case 0b00100000:
output_low(S3);
output_high(S1);
break;
}
}
}
 
Existe una forma más simple para realizar ese proceso.
Se puede realizar la lectura de los pulsadores usando el sistema para un teclado matricial.

Adjunto un programa que realicé, y al parecer hace lo que pretendes.

Nota: La simulación está hecha con Proteus v7.10 pero se puede abrir con el 8.XX
 

Adjuntos

  • 16F628A Matriz Selectiva.rar
    22.2 KB · Visitas: 9
Saludos a todos.. estoy iniciandoen ésto de Programaciion en C Compiler.. alguien me puede decir a que hace referencia el signo de admiracion ( ! ) en el siguiente codigo:

if (!detenido) // Si "detenido" = 0

No eh encontrado un tutorial sobre esos operadores en C Compiler.. gracias..!!
 
Atrás
Arriba