Autor Tema: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion  (Leído 25947 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #75 en: 26 de Enero de 2010, 15:00:14 »
Te recomiendo que no utilices los if, es mejor que iguales el puerto de entrada con el de salida a como sigue:

Código: Visual Basic
  1. while 1
  2.    if (porta.0 + porta.1 + porta.2 + porta.3 + porta.4 + porta.5 + porta.6 + porta.7) <=2 then
  3.                                 'Si hay activo dos o menos pulsador entonces
  4.      Delay_ms(40)              'Tiempo necesario para evitar rebotes
  5.       PORTB = PORTA             'PORTB sera igual a PORTA haciendo que se enciendan las salidas necesarias
  6.   end if                       'de lo contrario se mantendran encendidas las salidas que estaban activas y las demas no se encenderan
  7. wend

  • Será el if el que se encargue de controlar si hay mas de un pin activo, con lo que no necesitarás los flags ni los contadores que antes mencionas.
  • Al hacer PORTB=PORTA condicionarás directamente que pin de salida será el que se activará, sin necesidad de los if.

Si lo que deseas es que cada pulsador realice funciones togle, es decir que presiones y sueltes para que se enciendan las salidas, presiones y sueltes para que se apaguen lo que necesitas es lo siguiente.
Código: Visual Basic
  1. while 1
  2.    while PORTA=0        'mientras no presionen ningun pulsador el PIC se mantendra en este bucle, hasta que se presionen alguno de ellos
  3.   wend            
  4.    Delay_ms(40)         'Tiempo necesario para evitar rebotes
  5.   aux=PORTA xor aux    'recordemos que 1 xor 1=0, 0 xor 1 = 1 y 0 xor 0 = 0, se encenderian los pines que estan apagados y apagaria los encendidos.
  6.                        'es decir al presionar un pulsador se produce un cambio de estado en las salidas
  7.   if (aux.0+aux.1+aux.2+aux.3+aux.4+aux.5+aux.6+aux.7)<=2 then
  8.                          'Contamos cuantas salidas deberian estar activas, si son menos de 2.
  9.       PORTB=aux         'En el puerto B se encenderan los pines necesarios
  10.    else                 'de lo contrario
  11.       aux=PORTB         'se guradara el estado anterior de PORTB en aux
  12.   end if
  13.    while PORTA<>0       'El PIC se mantendra en este bucle hasta que se suelten todos los pulsadores.
  14.   wend
  15. wend

Otra cosa que podrias hacer es utilizar interrupciones, mandando a dormir el PIC mientras no este en uso.
« Última modificación: 26 de Enero de 2010, 15:02:42 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado janiro74

  • PIC10
  • *
  • Mensajes: 44
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #76 en: 27 de Enero de 2010, 19:37:08 »
amigo bigluis he compilado los programas ke has posteado con mikrobasic ya ke con el compolador de pic simulator ide me da fallo en la linea de while 1
pero bueno al probarlos he obserbado los siguientes problemas y es ke se activan hasta tres salidas simultaneas en portb y lo he solucionado poniendo <=1 pero pasa ke al pulsar pa1 pues pb1, pa2 pues pb2 y si pulso el resto pues no se encienden mas pero si suelto el porta1 y 2 ademas de no encender otros portb solicitados no se apagan los dos ke dejaron de estar solicitados


Y el segundo programa funciona corectamente como tal pero el ke necesito recibirá las señales de los contactos de 8 termostatos y estos se cerraran y abriran en largos espacios de tiempos pero me ha servido para conocer hotra forma de activar y desactivar los port y otro repaso de variables y funciones ke no me viene nada mal  "else" bien :lol: :lol:
Ahora bien me inclino a un programa del estilo


ctrol_nbit:
   contador = 0
   flag = 0
   If PORTA.0 = 1 Then contador = contador + 1
   If PORTA.1 = 1 Then contador = contador + 1
   If PORTA.2 = 1 Then contador = contador + 1
   If PORTA.3 = 1 Then contador = contador + 1
   If PORTA.4 = 1 Then contador = contador + 1
   If PORTA.5 = 1 Then contador = contador + 1
   If PORTA.6 = 1 Then contador = contador + 1
   If PORTA.7 = 1 Then contador = contador + 1

   If contador > 2 Then flag = 1
‘Return
 utilizando ahora otra rutina del estilo ctrol_nbit: pero rvisando las salidas activas  con las entradas solicitadas .Yo he intentado hacerlo por orden de mayor a menor.
Esto lo digo ya ke el programa tenia el fallo ke cuando habian por ejemplo 5  activas en porta en portb habian solo dos activas pero si soltabamos estas 2 se apagaban de portb pero no se encendia otras 2 libres de las tres ke kedaban solicitads y cuando soltaba una mas de porta ya si se encendian de golpe las dos restantes ,, supongo ke por la falta de prioridad ke yo si supiera lo estableceria de mayor a menor .


Una vez mas gracias por vuestro interes y por todo lo ke me haceis aprender pon vuestras respuesta 
saludos desde motril (granada españa)

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #77 en: 28 de Enero de 2010, 00:18:57 »
 
amigo bigluis he compilado los programas ke has posteado con mikrobasic ya ke con el compolador de pic simulator ide me da fallo en la linea de while 1
pero bueno al probarlos he obserbado los siguientes problemas y es ke se activan hasta tres salidas simultaneas en portb y lo he solucionado poniendo <=1 pero pasa ke al pulsar pa1 pues pb1, pa2 pues pb2 y si pulso el resto pues no se encienden mas pero si suelto el porta1 y 2 ademas de no encender otros portb solicitados no se apagan los dos ke dejaron de estar solicitados

:oops: Lo siento mucho, el problema ocurre debido a que el delay se encuentra dentro del if, lo que significa que al activar cualquier interruptor (despues del segundo) durante los 40ms de retardo, encenderas la tercera salida y luego preguntaras si hay mas de dos encendidas y como la respuesta es no, entonces no vuelves a entrar al if y no se actualizan las salidas por lo tanto no se corrige el error. Para solucionar esto pon el delay arriba del if y listo.

Código: [Seleccionar]
program salidas_entradas

' Declarations section
dim aux as byte

main:
  TRISA=255
  TRISB=0
  while 1
    Delay_ms(40)           'Tiempo necesario para evitar rebotes
                           'Este retardo debe de ir arriba del if, para evitar los errores.

    if (porta.0 + porta.1 + porta.2 + porta.3 + porta.4 + porta.5 + porta.6 + porta.7) <= 2 then
                          'Si hay activo dos o menos pulsador entonces
           PORTB = PORTA  'PORTB sera igual a PORTA haciendo que se enciendan las salidas necesarias
    end if                'de lo contrario se mantendran encendidas las salidas que estaban activas y las demas no se encenderan

    wend
  
end.

 :( Eso no significa que el error quedará completamente corregido, es posible que en algun momento el programa de estos mismos problemas, pero poniendo el retardo fuera del if harás que las posibilidades se disminuyan considerablemente a menos del 0.001%. Es decir el error se puede producir si y solo si activas una entrada más en el momento en que se está haciendo la pregunta, ciertamente esta pregunta solo dura unos cuantos microsegundos.

 :? Supongo que para corregir completamente este error debes trabajar con interrupciones, pero no todos los pines del puerto pueden activar estas interrupciones.
Otra cosa que puedes hacer es resetear el PIC cada cierto tiempo con el watchdog, aunque supongo que no es necesario.

Recuerda que la mejor forma de agradecer es compartir con otros el conocimiento que aquí has adquirido. :-/

« Última modificación: 28 de Enero de 2010, 00:23:09 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #78 en: 28 de Enero de 2010, 02:42:23 »
Esta es otra forma de como podrías resolver el problema

Código: [Seleccionar]
program salidas_entradas

' Declarations section
dim contador,i,aux as byte

main:
  CMCON=7                       'apagamos comparadores analogicos
  VREN_bit=0                    'deshabilitamos modulo Vref
  TRISA=255                     'Puerto A como entrada
  TRISB=0                       'Puerto B como Salida
  PORTB=0                       'Limpiamos el puerto B.
  while 1
    contador=0                  'iniciamos valor del contador en 0
    for i=0 to 7                'Para i desde 0 hasta 7
      if (PORTA.i) and (not contador.1) then
                                'Si el bit i del puerto A es 1 y contador es menor o igual a 2
        PORTB.i=1               'El bit i del puerto B sera 1
        contador=contador+1     'y el contador incrementara su valor
      else                      'de lo contrario
        PORTB.i=0               'el bit i del puerto B sera 0
      end if
    next i
    if not contador.1 then continue end if 'si contador es menor a 2 regresar al incio del bucle
    while(PORTB and PORTA) = PORTB wend    'mientras se mantengan encendidos los dos bits que inicialmente
                                           'estaban encendidos en PORTA no habra cambio de estado en PORTB
                                           'de lo contrario podra haber cambio de estado en PORTB dando
                                           'prioridad a los bits mas bajos
  wend
end.

Basicamente es la misma forma que has estado utilizando, nada más que en este caso yo uso un for.

Este código es para MikroBasic. Los archivos adjuntos son el código fuente y el esquema. yo uso MikroBasic 2009 v3.2 y Proteus 7.6
« Última modificación: 28 de Enero de 2010, 02:47:51 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado janiro74

  • PIC10
  • *
  • Mensajes: 44
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #79 en: 28 de Enero de 2010, 19:11:25 »
Perdona bigluis aunque el prorama basicamente funciona estoy mirando las linesa de tu programa y no consigo entender donde le indicas el maximo de 2 salidas simultaneas

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #80 en: 28 de Enero de 2010, 21:33:57 »
Bueno trataré de explicarte un poco.

Primero un registro tiene ordenados sus bits de la siguiente manera 7 6 5 4 3 2 1 0, si en el registro se guardara el numero 2 en decimal, en binario sería de la siguiente manera 0000 0010, lo que significa que el bit1 del registro estará activo y los demas no.

Para preguntar si el valor del registro es menor o igual a 2 tienes 2 opciones

Código: [Seleccionar]
if PORTA.i and contador<=2
o tambien

Código: [Seleccionar]
if (PORTA.i) and (not contador.1) then
esta ultima posiblemente te ahorre 2 o tres líneas de código, en MikroC ahrrarás más líneas que en MikroBasic.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado janiro74

  • PIC10
  • *
  • Mensajes: 44
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #81 en: 29 de Enero de 2010, 15:36:21 »
Llevo mucho, mucho rato analizando tu explicacion y la linea de instrucciones:

if (PORTA.i) and (not contador.1) then

y creo haber entendido algo pero no lo cojo del todo
 no se ke valores coje contador.1  acaso sumamos a 00000010  y lo negamos o a contador ke se inicia como 00000000 ...... lo siento mi cabeza no da pa mas en cambio si creo entender la instruccion if PORTA.i and contador<=2 pero no se! tampoco lo tengo demasiado claro
creo ke son dos lineas muy complicadas para un principiante como yo ó algo muy basico se me está escapando

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #82 en: 29 de Enero de 2010, 19:11:46 »
Ok, trataré de explicarlo de otra forma.

MikroBasic o MikroC te permiten acceder a los bits individuales de cada registro. En nuestro caso er registro contador que incrementa en 1 cada vez que se activa una salida posee 8 bits ya que es un byte, estos bits estan ordenados de mayor a menor de izquierda a derecha, es decir comienzan con el bit 7 que es el MSB y terminan con el bit 0 que es el LSB. Para acceder a cada bit del registro debes hacerlo de la siguiente manera.

Código: [Seleccionar]
contador.1
Es decir, primero escribes el nombre del registro seguido de un punto y finalizas con en numero del bit al cual deseas manipular.

Cuando contador vale 0 decimal es equivalente a 0000 0000 en binario, el bit 1 vale 0.
Cuando contador vale 1 decimal es equivalente a 0000 0001 en binario, el bit 1 vale 0.
Cuando contador vale 2 decimal es equivalente a 0000 0010 en binario, el bit 1 vale 1.

Para preguntar si el bit 1 vale 1 debes hacer lo siguiente:
Código: [Seleccionar]
if contador.1 then  'en MirkroBasic
if(contador.1)      //En MikroC
BTFSS contador,1    'en Asambler

Para preguntar si el bit 1 vale 0 debes hacer lo siguiente:
Código: [Seleccionar]
if (not contador.1) then 'en MirkroBasic
if(!contador.1)          //En MikroC
BTFSC contador,1         'en Asambler
Lo que haces con esto es preguntar si el bit 1 del registro contador no vale 1, por lo tanto preguntas si el bit1 del registro contador vale 0.

Otra opcción es la siguiente:
Código: [Seleccionar]
if contador.1 = 0 then
if contador.1 = 1 then
Pero el complidador generará más código que si haces lo primero.

En nuestro caso deseamos que hayan a lo sumo 2 bits activos en las salidas, lo que preguntamos es que si el contador es menor o igual a 2, para ello lo puedes hacer directamente, o puedes preguntar

  • el bit 1 es igual a 0?, si esto ocurre significa que contador vale 0 o 1
  • el bit 1 es igual a 1?, si esto ocurre significa que contador vale 2.

Ahora en el caso de PORTA lo que haces es utilizar una variable auxiliar que almacena el valor del bit al que vas a manipular, en nuestro case es i, si observas notarás que i va incrementando desde 0 hasta 7 gracias al for, es decir recorrerás cada uno de los bis con ayuda del for.

Por ejemplo cuando hagas la pregunta
Código: [Seleccionar]
if (PORTA.i) thensi i=0 preguntarás, si el bit 0 del registro PORTA es igual a 1.
si i=1 preguntarás, si el bit 1 del registro PORTA es igual a 1.
si i=2 preguntarás, si el bit 2 del registro PORTA es igual a 1.
.
.
.
si i=7 preguntarás, si el bit 7 del registro PORTA es igual a 1.

Por lo tanto cuando haces la pregunta
Código: [Seleccionar]
if (PORTA.i) and (not contador.1) thenestarás preguntando si el bit i (i puede tener valores desde 0 hasta 7) del registro PORTA es igual a 1 y si el bit1 del registro contador es igual a 0 (lo que es equivalente a preguntar si contador es mayor o igual a 2).

Para que veas si hay o no un ahorro en el código debes compilar el código y luego ver las líneas en el archivo ASM que genera MikroBasic.

Por cierto, utilizar una variable auxiliar para manipular los bits de los registros es algo que solo es posible en los compiladores de Mikroelectronica, o por lo menos no se como hacerlo en CCS, C18, HIHGTECH-C, PBP, u otros.

Esto lo aprendí observando este ejemplo posteado hace rato en el foro.

 :-/ Espero haber sido lo suficientemente claro, gracias por leer mis mensajes.
« Última modificación: 29 de Enero de 2010, 19:32:55 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado janiro74

  • PIC10
  • *
  • Mensajes: 44
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #83 en: 29 de Enero de 2010, 19:45:31 »
Gracias a ti por la atencion y dedicacion prestada. ke seria de nosotros los muy principiantes si no leyeramos todas estas explicaciones tan detalladas para entender todo esto ke aveces es tan complejo .Espero pronto poder ayudar a otros pero he estado mirando y todavia no tengo respuestas muy claras para otros principiantes .

y ahora voy a estudiarme tu ultima lecion y en cuanto la asimile te comento los adelantos.

hasta muy pronto
saludos desde la costa granadina en españa

Desconectado janiro74

  • PIC10
  • *
  • Mensajes: 44
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #84 en: 31 de Enero de 2010, 20:16:24 »
Pues si que me ha costado entender todo. Y con las lineas que me explicaste con tanto detalle se me habia pasado por alto otra no menos importante

                                                                while(PORTB and PORTA) = PORTB wend

Esta como dices le da prioridad a los bit mas altos ra0,ra1,ra2....y me ha costado entender por que si inicialmente teniamos por ejemplo porta.7 y porta.6 pulsados con sus corespondientes portb7y6 encendidos Y pulsamos 2 pulsadores o mas de bit mas altos, si soltamos UNO de los que habian encendidos se apagan los DOS  que habian encendidos para encenderse los siguientes de bit mas altos y lo ideal seria que se apagara SOLO el que hemos soltado para encender solo un led de los de bit mas altos solicitado.
supongo que eso lo hace porque esta por medio la funcion AND . Claro si en algun momento portb en 1 se enfrenta a porta en 0  segun tabla verdad de AND 0and1=0  ahí es donde se sale del bucle while wend while 0 = portb
No se si me he explicado bien pero bueno ahora estoy estudiando la manera de que solo se apague el que sueltas aunque no se si habra que cambiar la funcion o hacer nuevas lecturas de los bit encendidos y los solicitados con otro FOR NEXT y una nueva variable


GRACIAS Y HASTA PRONTO

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #85 en: 01 de Febrero de 2010, 05:41:40 »
 :( Si es mas o menos a como lo planteas, para resolver este problema debes cambiar unas cuantas líneas en el código, aunque sé como hacerlo prefiero que tu pienses como hacerlo, una vez hecho esto espero que postees las modificaciones y luego yo postearé las mías si son diferentes ;-).

Por cierto el bit más alto es el 7 y el bit más bajo es el 0.


Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado janiro74

  • PIC10
  • *
  • Mensajes: 44
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #86 en: 02 de Febrero de 2010, 20:15:12 »
Pues bueno como soy tan torpe como sincero tengo que confesar que me ha echado una mano un gran profesional el cual al igual que todos vosotros me ha ido indicando el porque de muchas cosas estas Yo no sabia el funcionamiento real de los bucles for nex y lo he visto funcionar con el debuguer de mikrobasic , una gran utilidad de la que hecharé mano de ahora en adelante ya que ves como se mueve el programa, entra y sale de bucles etc, y sobre todo me ha servido la la leccion de las formas de hacer referencia a los registros port, contador, etc con not porta.x y sin el NOT y hacerlas interacionar con los contajes de o bucles for next. bueno bueno  , dejo de enrrollarme y ahí va el codigo

program ecli

dim contador,i,j,test,x as byte

main:
  CMCON=7                       'apagamos comparadores analogicos
  VREN_bit=0                    'deshabilitamos modulo Vref
  TRISA=255                     'Puerto A como entrada
  TRISB=0                       'Puerto B como Salida
  PORTB=0                       'Limpiamos el puerto B.
  contador=0
  test=0
  for x = 0 to 2
  for test=0 to 7
  portb.test = 1
  delay_ms(20)
  portb.test = 0
  next test
  for test=7 to 0 step -1
  portb.test = 1
  delay_ms(20)
  portb.test = 0
  next test
  next x
                   'iniciamos valor del contador en 0
  while 1

    for i=0 to 7                'Para i desde 0 hasta 7
         if (PORTA.i) and (not contador.1) and (not PORTB.i) then     'Si el bit i del puerto A es 1 y contador es menor o igual a 2
          PORTB.i=1               'El bit i del puerto B sera 1
          contador=contador+1     'y el contador incrementara su valor
         end if
         if not porta.i and portb.i and (not contador.1) then
            portb.i=0
            contador=contador-1
         end if
      if  contador.1 then  'si contador es igual a 2
              while(PORTB and PORTA) = PORTB wend   
        for j=0 to i
           if (PORTA.j <> PORTB.j) and PORTB.j  then
              PORTB.j=0
              contador=contador-1
          end if
        next j
      end if
    next i
  wend

end.

El primer puñado de lineas es solo una pequeña presentacion para antes de empezar a trabajar . Un juegucillo de luces
Gracias y hasta pronto ,,,con un nuevo tema que iniciaré pronto sobre el ds1820  y el pic16f887

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #87 en: 03 de Febrero de 2010, 04:02:39 »
Utilizar una variable auxiliar para manipular los bit de cada registro por lo general consume más recursos que algunas instrucciones que son espesificas para esto. Te recomiendo cambiar las siguientes líneas de código.

 for x = 0 to 2
  for test=0 to 7
  portb.test = 1
  delay_ms(20)
  portb.test = 0
  next test
  for test=7 to 0 step -1
  portb.test = 1
  delay_ms(20)
  portb.test = 0
  next test
  next x

por estas
Código: [Seleccionar]
 for aux =0 to 2               'Para aux desde 0 hasta 2
  i=0                           'igualar i a 0
  while i<7                     'mientras i sea menor a 7
    Delay_100ms                 'Retardo de 100 ms, esta linea es similar a Delay_ms(100) pero cuano
                                'se utiliza el mismo retardo mas de una vez esta linea permite ahorrar reursos
    PORTB=PORTB<<1              'rotar hacia la izquierda los bits de PORTB
    i=i+1                       'incrementar i en 1
  wend
  
  while i>0                     'mientras i sea mayor a 0
    Delay_100ms                 'Retardo de 100 ms
    PORTB=PORTB>>1              'rotar hacia la derecha los bits de PORTB
    i=i-1                       'decrementar i en 1
  wend
  next aux

y como te mencione antes esta es la propuesta que yo hago al código

Código: [Seleccionar]
 PORTB=0
  while 1
    for i=0 to 7                'Para i desde 0 hasta 7
      if PORTA=PORTB then goto L1 end if
      if PORTA.i then
                                'Si el bit i del puerto A es 1 y contador es menor o igual a 2
        PORTB.i=1               'El bit i del puerto B sera 1
        if aux <> portb then    'si auxiliar es distinto de PORTB
            contador=contador+1     'el contador incrementara su valor
        end if
      end if
      if contador.1 then        'si el contador es menor a 2.
         goto L2                'ir a la linea L2
      end if
    next i
       while PORTB=PORTA        'mientras PORTB sea igual a PORTA
L1:    wend                     'mantenerse preguntando hasta que ocurra lo contrario
       aux=portb and porta      'aux sera igual a la operacion and entre PORTA y B
       goto L3                  'ir a la linea L3
    do
L2:    aux = PORTB and PORTA    'aux sera igual a la operacion and entre PORTA y B
    loop until aux <> PORTB     'mientras se mantengan encendidos los dos bits que inicialmente
                                'estaban encendidos en PORTA no habra cambio de estado en PORTB
                                'de lo contrario podra haber cambio de estado en PORTB dando
                                'prioridad a los bits mas bajos

L3: portb = aux                 'PORTB sera igual a aux
    if aux then                 'si auxiliar no es cero
        contador=1              'contador sera igual a 1
    else                        'de lo contrario
        contador=0              'contador sera igual a 0
    end if
  wend

Si comparas tu opción con la mía observarás que hay un ahorro en el código.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado janiro74

  • PIC10
  • *
  • Mensajes: 44
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #88 en: 03 de Febrero de 2010, 19:18:10 »
supongo que lo has hecho a conciencia lo de el codigo de desplazar las lucecitas por los bits
Me lo has puesto faltandole una linea de codigo a ver si yo lo arreglaba verdad??? (como buen maestro pa que nos esforcemos un poquito)
pues esta vez aunque he tardado he dado yo solo con el fallo.


for aux =0 to 2               'Para aux desde 0 hasta 2
  i=0                              'igualar i a 0
  portb.i = 1
  while i<7                      'mientras i sea menor a 7
    Delay_100ms                 'Retardo de 100 ms, esta linea es similar a Delay_ms(100) pero cuano
                                     'se utiliza el mismo retardo mas de una vez esta linea permite ahorrar reursos
    portb=PORTB<<1              'rotar hacia la izquierda los bits de PORTB
    i=i+1                            'incrementar i en 1
  wend

  while i>0                     'mientras i sea mayor a 0
    Delay_100ms                 'Retardo de 100 ms
    PORTB=PORTB>>1              'rotar hacia la derecha los bits de PORTB
    i=i-1                       'decrementar i en 1
  wend
  next aux


pues nada en brebe comenzaré otro tema referente  al ds1820 y el 16f887, en cuanto defina las caracteristicas lo incio .
gracias por todo y hasta pronto

Desconectado ubvredes

  • PIC10
  • *
  • Mensajes: 4
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #89 en: 17 de Abril de 2012, 09:48:28 »
Ante todo un gran saludo a todos los que hacen parte de este foro. Felicitar ((:-)) a BigLuis por sus aportes me han servido mucho.

Bueno mi consulta es la siguiente:

Estoy utilizando un pic 16f877 , tengo tres pulsadores(puertos A) y tres leds(puertos B). Cada pulsador debe pagar y encender un led respectivamente, a su vez cuando encieda un led debe aparecer el mensaje en un lcd de 16x4  de "led1 on", y cuando lo apague "led1 off"; y asi sucesivamente con los demás leds.  Tomando parte del codigo de BigLuis, logré aplicar el problema de rebote....creo.
Sin embargo me encuentro con las siguientes dificultades:

1. Cuando me ubico al final del tercer if, escribo "goto conteo", solo puedo encender y apagar los leds...solo funciona apagar y encender sin mostrar ningun mensaje en el lcd, a pesar que estan declarados como funciones en el programa.

2. Cuando voy al final del tercer if, escribo "goto inicio", me muestra el mensaje de las tres opciones, pero cuando le doy click en un pulsador toma la condicion de la primera condicional, y se queda alli, no evalua las demás condicionales....he querido anidar las tres if, con ifelse, pero me genera error(es probable que sea algun detalle, pero me tiene atascado).

3. No he podido resolver lo siguiente: cuando le dé click en el pulsaodr led0 se enciende , me salga su estado de on en el lcd. Si le doy nuevamente click en el mismo pulsador debe se apagarse el led0 y imprima su estado en el lcd de su estado en off y se mantenga el mensaje de led0 on u off, led1 on u offí.

Si por ejemplo, le doy click en otro led2, y cambie su estado a on, debe mantener en pantalla si el led0 esta en on u off, o el led1 está en off u on, y asi sucesivamente.

gracias.

anexo codigo e imagen.


Device =16F877
Xtal = 4

Dim secuencia As Byte

Dim aux As Byte
     
TRISA=1
TRISB=0


Symbol uno=PORTA.0
Symbol dos=PORTA.1
Symbol tres=PORTA.2
Symbol led0=PORTB.0
Symbol led1=PORTB.1
Symbol led2=PORTB.2

Input PORTA
Output PORTB

 LCD_DTPin = PORTD.4
 LCD_RSPin = PORTD.2
 LCD_ENPin = PORTD.3
 LCD_Interface = 4
 LCD_Lines = 2
 LCD_Type = 0
 
All_Digital = On

TRISB=0

conteo:
'While PORTA= 1
   
    Print At 2,1, "led0 :  ON  OFF "
    Print At 3,-3, "led1 :  ON  OFF "
    Print At 4,-3, "led2 :  ON  OFF "
   
  While PORTA=0        'mientras no presionen ningun pulsador el PIC se mantendra en este bucle, hasta que se presionen alguno de ellos
   Wend             
   DelayMS 40         'Tiempo necesario para evitar rebotes     
   aux = PORTA ^ aux    'recordemos que 1 xor 1=0, 0 xor 1 = 1 y 0 xor 0 = 0, se encenderian los pines que estan apagados y apagaria los encendidos.
                        'es decir al presionar un pulsador se produce un cambio de estado en las salidas
   If (aux.0+aux.1+aux.2)<=3 Then
                         'Contamos cuantas salidas deberian estar activas, si son menos de 2.
      PORTB=aux         'En el puerto B se encenderan los pines necesarios
   Else                 'de lo contrario
     aux=PORTB         'se guradara el estado anterior de PORTB en aux
   End If
   While PORTA<>0       'El PIC se mantendra en este bucle hasta que se suelten todos los pulsadores.
   Wend
'Wend
'End



inicio:
   

If uno=0 And dos=1 And tres=0 Then op2
'goto inicio

If uno=1  And dos=0 And tres=0 Then op1

'goto inicio
   
If uno=0 And dos=0 And tres=1 Then op3

Print At 2,1, "led0 :  ON -OFF- "
    Print At 3,-3, "led1 :  ON -OFF- "
    Print At 4,-3, "led2 : -ON- OFF "
    DelayMS 300
'goto conteo
       
GoTo inicio

op1:                         
     PORTB.0=1
     PORTB.1=0
     PORTB.2=0
     
    Print At 2,1, "led0 : -ON-  OFF "
    Print At 3,-3, "led1 :  ON  -OFF-"
    Print At 4,-3, "led2 :  ON  -OFF-"
    DelayMS 300
    Stop   
    DelayMS 300
    Cls
    GoTo inicio
   
   

op2:                         
     PORTB.0=0
     PORTB.1=1
     PORTB.2=0
    Cls
    Print At 2,1, "led0:  ON  OFF "
    Print At 3,-3, "led1: -ON- OFF "
    Print At 4,-3, "led2 :  ON -OFF-"
    Stop   
    DelayMS 300
   GoTo inicio
   


    op3:                         
     PORTB.0=0
     PORTB.1=0
     PORTB.2=1
    Cls
    Print At 2,1, "led0 :  ON -OFF- "
    Print At 3,-3, "led1 :  ON -OFF- "
    Print At 4,-3, "led2 : -ON- OFF "
    Stop   
    DelayMS 300
   Cls
    GoTo inicio

     End
« Última modificación: 17 de Abril de 2012, 10:10:40 por ubvredes »