Autor Tema: Novato comenzando con un proyecto real  (Leído 2039 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pandarojo

  • PIC10
  • *
  • Mensajes: 6
Novato comenzando con un proyecto real
« en: 28 de Mayo de 2007, 13:32:38 »
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 :)
« Última modificación: 28 de Mayo de 2007, 14:36:43 por pandarojo »

Desconectado pandarojo

  • PIC10
  • *
  • Mensajes: 6
Re: Novato comenzando con un proyecto real
« Respuesta #1 en: 28 de Mayo de 2007, 14:40:37 »
Como se ve en el código he cambiado el detector al portc.7 y así no me va, en el porta si funcionaba. Tengo que ver si este port se configura de otro modo.

Saludos.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Novato comenzando con un proyecto real
« Respuesta #2 en: 31 de Mayo de 2007, 15:22:59 »
Se ve bien el codigo y felicitaiones por los avances, una pregunta obligada es si es necesario usar displays de 7 segmentos no podrias sustiturlos por un LCD son mas versatiles y con el Backlight ayudan a visualizar de noche.


Con lo de la selecion manual-automatico puedes poner al incio del programa una condicion que depende de la entrada de tu pic es decir que un PIN se dedique a ver si es en modo manual o automatico. Digamos si esta en 0 que sea manual pero si cambia su estado a 1 que sea automatico. Como posees un boton que resetea y este debe estar presente en todas las rutinas del programa y cuando resetees que mande al inicio para saber si sigue automatiko o si sigue manual.

Una vez que sepas cual es el estado lo mandas a las respectvas rutinas sin retorno hasta que se cumpla el ciclo o bien se resetee el programa.

Saludos
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."