Hola a todos, tengo entre manos un proyecto para una aplicación real que quiero llevar a cabo. Os cuento lo que quiero hacer, y lo que tengo hecho de momento.
Vamos a ver: el tema es utilizar un pic16f876a para hacer un dispositivo que controle la cantidad de cadena que soltamos o que recogemos a traves de un motor. Hay un molinete que, por cada giro nos recoge o suelta 45 cms de cadena, tenemos un detector que nos da una señal por cada giro del molinete y dos entradas que nos indican el sentido de giro del motor. La cantidadde cadena que está suelta tenemos que visualizarlo en 3 display de 7 segmentos (los dos de la izquierda para metros, un punto y el de la derecha para los decímetros). Además hay otros tres displays donde indicamos los metros de cadena que deseamos soltar si queremos hacer la operación en automático, de modo que mediante un pulsador seleccionamos entre trabajar en manual y automatico, estando en automático podemos cambiar la preselección con dos pulsadores (subir y bajar) cambiando el valor preseleccionado rápidamente hacia arriba o hacia abajo en función del pulsador que accionemos. Este valor se validará con otra tecla que tendrá alguna función más (resetear algún fallo). Una vez validado el valor deseado si se pulsa brevemente la tecla bajar, el sistema activará un relé que hará que el motor suelte los metros de cadena preseleccionados. Del mismo modo cuando se quiere recoger la cadena se pulsa el se subir brevemente y otro relé hará que el motor regoja la cadena casi del todo, la parte final se hará manualmente. Por otro lado seleccionando la función manual los pulsadores de subir y bajar sirven para activar los respectivos relés directamente.
Por el momento tengo hecho la parte del contador y la visualización y está probada en un prototipo (de momento sin la parte de la preselección) y funciona ok.
A continuación os pongo la parte que tengo hecha:
Notas:
1.- Utilizo un contador que tiene como valor inicial 1000, ya que en las pruebas en alguna ocasión se me fué a negativo y me dió problemas, pero esto no es la parte que me preocupa.
2.- De momento uso el portb solo, pero mi idea es usar el portb para colocar el valor a visualizar y en el portc seleccionar el dígito a visualizar en bcd y luego usar un 4511 para pasar a 7 seg. y un 74ls138 para demultiplexar la selección. Aunque estaría mejor usar los cuatro primeros pines del portb para el valor y los tres últimos para la selección del display.
3.- Utilizo los 5v como 1 y los 0v como 0, es una deformación profesional, me ayuda a entender mejor el programa, si hay muchos problemas lo cambiaría.
define OSC 4
ADCON1 = 7 'PORTA entradas digitales
TRISB = %00000000 'PORTB 8 salidas
TRISC = %10000000 'PORTC 7 salidas y 1 entrada
clear
decimetros var word
centimetros var word
factor var byte
cont var word
situacion var word
unid var byte
dece var byte
cent var byte
auxconteo var bit
auxprog var bit
automatico var bit
motorbaja var porta.0
motorsube var porta.1
programar var porta.2
puls_subir var porta.3
puls_bajar var porta.4
reset var porta.5 'pulsador de validacion /reset
detector var portc.7
led_baja var portc.4
led_sube var portc.5
led_manual var portc.6
cont = 1000
auxconteo = 0
factor = 45 'cms cada vuelta
principal:
gosub visualizar
gosub contar
gosub AutomaticoManual
gosub error
goto principal
contar:
if detector = 0 then auxconteo = 0
if detector = 0 or auxconteo = 1 then return
gosub visualizar 'aprovechamos para usar el ciclo de visualización para antirrebote
if detector = 0 then return
if motorsube = 0 and motorbaja = 1 then cont = cont + 1
if motorbaja = 0 and motorsube = 1 then cont = cont - 1
if cont < 1000 then cont = 1000
auxconteo = 1
return
visualizar:
situacion = cont - 1000
centimetros = situacion * factor
decimetros = centimetros / 10
unid = decimetros dig 0
PORTB = unid + 16
PAUSE 2 ' valores de 50 para visualizar bien en proteus
dece = decimetros dig 1
PORTB = dece + 32
PAUSE 2
cent = decimetros dig 2
PORTB = cent + 64
PAUSE 2
RETURN
AutomaticoManual:
return
error:
if motorsube + motorbaja < 2 then return
visuerror:
portb = 8 + 16 + 32 +64
pause 500
portb = 0
pause 500 'mostramos 88.8 y hacemos intermitencia
if reset=0 then goto visuerror
cont=1000
return
end
No seais crueles, son mis primeras líneas y ya es un gran logro que funcione algo.
Donde me lio bastante es en la parte que viene ahora, la de seleccionar manual y automático y la preselección.
Saludos y gracias por haber llegado hasta aquí leyendo