Haz una pregunta
  Foros de Electrónica » Diseño analógico » Diseño de circuitos en general
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

17/09/2015 #1

Avatar de yorsk2004

Validar la entrada de dos puladores 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.
19/09/2015 #2
Moderador

Avatar de D@rkbytes

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)
Código 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.
20/09/2015 #3


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.
28/01/2016 #4

Avatar de yorsk2004

Nuevos inconvenientes.
Hola, gracias a los todos los compañeros del foro, en especial a los que me ayudaron y me ayudaran

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);
}
}
}



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.
Imágenes Adjuntas
Tipo de Archivo: gif PIC16F628A.gif (31,9 KB (Kilobytes), 41 visitas)
Archivos Adjuntos
Tipo de Archivo: rar PIC16F28A.rar (30,4 KB (Kilobytes), 1 visitas)
28/01/2016 #5

Avatar de Gudino Roberto duberlin

Hola, en lugar de leer puertos individuales. Conviene leer el puerto entero de 8bits y luego aplicando la función switch y case discriminas las combinaciones posibles. El resto serán ignoradas.
28/01/2016 #6

Avatar de yorsk2004

yorsk2004 dijo: Ver Mensaje
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;
}
}
}
28/01/2016 #7
Moderador

Avatar de D@rkbytes

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
Archivos Adjuntos
Tipo de Archivo: rar 16F628A Matriz Selectiva.rar (22,2 KB (Kilobytes), 5 visitas)
30/01/2016 #8

Avatar de yorsk2004

Muchas gracias, D@rkbytes.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Diseño de circuitos en general

Alarmas, temporizadores, acondicionadores de señal...

Cerrar
Foros de Electrónica » Diseño analógico » Diseño de circuitos en general

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.