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

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

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #45 en: 12 de Enero de 2010, 17:32:56 »
Si, es que en mi primer programa cuando había más de dos teclas pulsadas no se encendía ningún otro led, pero si se apagaba el de la tecla que se dejara de pulsar siempre y cuando estuviera previamente encendido. Me explico: Si pulso 4 teclas y las mantengo pulsadas tendré dos led encendidos correspondientes estos a las dos teclas que se pulsaron en primer lugar, si dejo de pulsa una tecla seguiré teniendo tres teclas pulsadas, pero si esta tecla ultima que deje de pulsar, de inicio provoco un encendido de led, este led se apagaría incluso manteniendo tres teclas pulsadas, con lo que el resultado seria de quedar un led encendido. Esto quiere decir que se mantendría el refresco de los led al soltar teclas pero no al pulsarlas. ¡Uf!, que parrafada me salió. :mrgreen:

A vale ya entiendo! Que aun teniendo 3 pulsados, si unos de los que ha soltado tenia la salida activada se desactiva! Ya lo he comprobado al simularlo. Pero cual es el problema de eso? En tu 2º programa, de no ser el resultado buscado ya esta arreglado al igual que en el mio  :?

bueno pues el problema este me parece ke se resiste a la perfeccion ya ke todos los intentos de registrar todas las situaciones de los pulsadores siempre hay algo ke se escapa por ejemplo entiendo ke cuando estan los 5 pulsadores activados con dos led encendidos cuando dejamos de pulsar 2, ke no se encienda otro de los libre ya ke no hay ningun criterio ke gestione eso pero lo ke no entiendo es por ke no se apaga el led ke se le ha desactivado su pulsador  !!sele olvida acaso al programa de revisar eso?

Eso que dices no es lo que ha comentado dogflu en su ultimo post?

Un saludo!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #46 en: 12 de Enero de 2010, 20:43:10 »
Si, es que en mi primer programa cuando había más de dos teclas pulsadas no se encendía ningún otro led, pero si se apagaba el de la tecla que se dejara de pulsar siempre y cuando estuviera previamente encendido. Me explico: Si pulso 4 teclas y las mantengo pulsadas tendré dos led encendidos correspondientes estos a las dos teclas que se pulsaron en primer lugar, si dejo de pulsa una tecla seguiré teniendo tres teclas pulsadas, pero si esta tecla ultima que deje de pulsar, de inicio provoco un encendido de led, este led se apagaría incluso manteniendo tres teclas pulsadas, con lo que el resultado seria de quedar un led encendido. Esto quiere decir que se mantendría el refresco de los led al soltar teclas pero no al pulsarlas. ¡Uf!, que parrafada me salió. :mrgreen:

A vale ya entiendo! Que aun teniendo 3 pulsados, si unos de los que ha soltado tenia la salida activada se desactiva! Ya lo he comprobado al simularlo. Pero cual es el problema de eso? En tu 2º programa, de no ser el resultado buscado ya esta arreglado al igual que en el mio  :?

bueno pues el problema este me parece ke se resiste a la perfeccion ya ke todos los intentos de registrar todas las situaciones de los pulsadores siempre hay algo ke se escapa por ejemplo entiendo ke cuando estan los 5 pulsadores activados con dos led encendidos cuando dejamos de pulsar 2, ke no se encienda otro de los libre ya ke no hay ningun criterio ke gestione eso pero lo ke no entiendo es por ke no se apaga el led ke se le ha desactivado su pulsador  !!sele olvida acaso al programa de revisar eso?

Eso que dices no es lo que ha comentado dogflu en su ultimo post?

Un saludo!

1ª) Si, parece que no me hice entender, quiero decir que todo esto viene por la forma que entendí el enunciado del problema, y por eso en mi primer programa cuando se suelta una tecla el led correspondiente se apaga, de forma independiente de las teclas pulsadas.

2ª) Me repito de nuevo, en mi primer programa se apaga el led que se deja de pulsar la tecla de forma independiente al número de teclas pulsadas.
Y en este último para que se apaguen los led además de soltar la tecla hay que tener menos de tres teclas pulsadas.

PD. Parece que nos repetimos en el mismo bucle. :D
Saludos desde Granada, España.

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #47 en: 13 de Enero de 2010, 11:04:21 »
Todo entendido  :oops: :oops: :oops:

Esque cuando se empieza en la programacion... es peor que un bucle infinito!!!  :shock:

Un saludo!

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #48 en: 13 de Enero de 2010, 12:13:16 »
program ecli
trisa = %11111
trisb = %00000000
portb = %00000000
porta = %00000
main:
while (porta.0 + porta.1 + porta.2 + porta.3) <=2
if  porta.0 = 1 then portb.0 = 1 else   portb.0 = 0  delay_ms(100)
end if
if  porta.1 = 1 then portb.1 = 1 else   portb.1 = 0   delay_ms(100)
end if
if  porta.2 = 1 then portb.2 = 1 else   portb.2 = 0   delay_ms(100)
end if
if  porta.3 = 1 then portb.3 = 1 else   portb.3 = 0   delay_ms(100)
end if
if  porta.4 = 1 then portb.4 = 1 else   portb.4 = 0   delay_ms(100)
end if
wend
end.

Creo que tu principal problema es que defines los puertos antes del main, esto ocasiona que el compilador lo ignore, te recomiendo que lo pongas adentro del main
Código: Visual Basic
  1. program ecli
  2.  
  3.  
  4. main:   'Este es el inicio del programa, por lo tando debe de ir antes de que definas los puertos de entrada
  5.  
  6.  
  7. trisa = %11111
  8. trisb = %00000000
  9. portb = %00000000
  10. porta = %00000
  11. ......

Otra cosa que te recomiendo es 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) <=2 then
  3.     PORTB = PORTA
  4.   else
  5.     PORTB = 0
  6.   end if
  7. wend
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 dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #49 en: 13 de Enero de 2010, 13:03:37 »
Al entrar en el hilo ya estaba muy avanzado, pero pude ver al principio un error en el primer programa, lo que ocurre es que se corrigió en los programas sucesivos por lo que no le di importancia, así que para evitar seguir haciendo referencia a ese programa con el susodicho error lo indico y lo corrijo en el.
Trisa = %11111 ‘Parte del puerto A como entradas
Trisb = %00000000
Portb = %00000000
Porta = %00000 ‘Esto se definió como entradas y aquí se trata como salidas?.

Es contradictorio y puede producir efectos indeseables. Al definir parte del puerto como entrada Trisa = %11111 y luego forzarlo a un estado predeterminado Porta = %00000, esto es algo contradictorio y puede hacer que algún compilador decida redefinir el puerto como salidas. O puede que el compilador lo defina como entrada o como salida según se haga uso de él, esto último puede que haga que funcione el código pero el derroche de memoria a mi parecer no lo justifica.

Hola bigluis, la definición de puertos y programación de módulos en general en el Basic del PSI no tiene lugar predeterminado, se suele colocar fuera del main para no estar reprogramando continuamente el modulo, esto hace que se pierda tiempo de ejecución con código redundante. En Microbasic desde luego no tengo ni idea de que es mejor.
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #50 en: 13 de Enero de 2010, 15:04:31 »
Huy como ha avanzado esto, llevo 3 dias con un gripazo de muerte  :5] :5]  :oops: :oops: :oops: y cuando entro de nuevo está casi resuelto el problema. pero tengo una observacion:
[/quote]
Código: Visual Basic
  1. Otra cosa que te recomiendo es que no utilices los if, es mejor que iguales el puerto de entrada con el de salida a como sigue:
  2.  
  3. while 1
  4.   if (porta.0 + porta.1 + porta.2 + porta.3) <=2 then
  5.     PORTB = PORTA
  6.   else
  7.     end if
  8. wend
[/quote]
Si se realiza un portB=portA se apagarian todas las salidas cuando en realidad deben de permanecer activas las que en ese momento ya lo estuviesen.
Amigo dogflu me descubro ante tanta sabiduria :shock: :shock: :shock:, creo que me queda bastante por aprender todavia.
Fermin
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #51 en: 13 de Enero de 2010, 16:18:11 »
Bigluis con su propuesta de usar la expresión PortB=PortA tiene sus razones, ya que esto genera un código muy reducido y así se ahorra memoria y se acelera el código, pero claro, como dices es posible que no se pueda utilizar siempre. Por ejemplo si la memoria no me falla y el compilador de BASIC es bueno, PortB=0 solo ocupa una instrucción maquina, que esto equivale en los pic a la máxima velocidad de ejecución que ocupa 1 ciclo maquina, ósea 4 ciclos de reloj.
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #52 en: 13 de Enero de 2010, 16:21:53 »
vamos que a la velocidad que va el micro, aunque se produjese una desactivacion de todas las salidas, casi de inmediato volverian a activarse otra vez solo las activadas.
¿cierto?

Bueno voy a leer paso a paso el programa de Bigluis a ver si lo entiendo mejor.
Fermin
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #53 en: 13 de Enero de 2010, 16:31:20 »
Bueno, esto que dices hay que valorarlo, si son activaciones de relés o líneas de datos lentas no se notara, particularmente si un pin tiene que estar a cero prefiero hacer un rodeo aunque me lleve más gasto de memoria o pierda velocidad, pero que en ese pin no se produzca ningún tipo de transición por muy rápida que sea por la influencia de otro.
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #54 en: 13 de Enero de 2010, 16:41:13 »
Bueno, esto que dices hay que valorarlo, si son activaciones de relés o líneas de datos lentas no se notara, ......

Si dije lo de los reles es que el amigo Janiro, en su enunciado decia que queria activar unas electrevalvulas  (respuesta nº8)y para ello o lo realiza con reles mecanicos, reles de estado solido o con trasistores en colector abierto, pero en cualquier caso el tiempo de reaccion de la propia electrovalvula va aser muy superior a lo que tarda el micro en realizar una pasada por todo el programa.

Fermin
Todos los días se aprende algo nuevo.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #55 en: 14 de Enero de 2010, 11:29:21 »
Al entrar en el hilo ya estaba muy avanzado, pero pude ver al principio un error en el primer programa, lo que ocurre es que se corrigió en los programas sucesivos por lo que no le di importancia, así que para evitar seguir haciendo referencia a ese programa con el susodicho error lo indico y lo corrijo en el.
Trisa = %11111 ‘Parte del puerto A como entradas
Trisb = %00000000
Portb = %00000000
Porta = %00000 ‘Esto se definió como entradas y aquí se trata como salidas?.

Es contradictorio y puede producir efectos indeseables. Al definir parte del puerto como entrada Trisa = %11111 y luego forzarlo a un estado predeterminado Porta = %00000, esto es algo contradictorio y puede hacer que algún compilador decida redefinir el puerto como salidas. O puede que el compilador lo defina como entrada o como salida según se haga uso de él, esto último puede que haga que funcione el código pero el derroche de memoria a mi parecer no lo justifica.

Hola bigluis, la definición de puertos y programación de módulos en general en el Basic del PSI no tiene lugar predeterminado, se suele colocar fuera del main para no estar reprogramando continuamente el modulo, esto hace que se pierda tiempo de ejecución con código redundante. En Microbasic desde luego no tengo ni idea de que es mejor.

Supongo que estas cometiendo un error, ya que PORTA y TRISA son registros completamente distintos, lo que quiero decir es que, es muy poco probable que el compilador los confunda.

Supongo que tu error es que crees que ambos son el puerto, pero no es así, cuando defines un valor en PORTA, no defines el valor al puerto a sino al registro que esta relacionado con el al que los fabricantes han llamado PORTA, cundo defines un valor a TRISA, tampoco le defines el valor al puerto, sino a un registro llamado TRISA que se encarga de decidir si cada pin es de entrada o de salida, si lo tradujesemos serían puertos triestado.

El error real que se comete es que estas dando una orden innecesaria, simplemente mandas a cero todos los pines que estan como salida.


Huy como ha avanzado esto, llevo 3 dias con un gripazo de muerte  :5] :5]  :oops: :oops: :oops: y cuando entro de nuevo está casi resuelto el problema. pero tengo una observacion:
Código: Visual Basic
  1. Otra cosa que te recomiendo es que no utilices los if, es mejor que iguales el puerto de entrada con el de salida a como sigue:
  2.  
  3. while 1
  4.   if (porta.0 + porta.1 + porta.2 + porta.3) <=2 then
  5.     PORTB = PORTA
  6.   else
  7.     end if
  8. wend
[/quote]
Si se realiza un portB=portA se apagarian todas las salidas cuando en realidad deben de permanecer activas las que en ese momento ya lo estuviesen.
Amigo dogflu me descubro ante tanta sabiduria :shock: :shock: :shock:, creo que me queda bastante por aprender todavia.
Fermin

[/quote]

No entiendo muy bien tu duda, si lo que deseas es que las salidas previas que has activado permanescan activas simplemente debes quitar la condicion else y lo que tiene adentro, y veras como ninguna salida se apaga al presionar otro boton, pero en el primer post entendí que lo que deseabas era que cada interruptor de entrada active un pin de salida y los demas se apaguen, y si presionabas más de un pin se apagaran todas las salidas por un error.

Supongo que deberías reescribir lo que deseas hacer así podría darte más ayuda.
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 Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #56 en: 14 de Enero de 2010, 11:36:54 »
...
El error real que se comete es que estas dando una orden innecesaria, simplemente mandas a cero todos los pines que estan como salida.
...

Lamento decirte que eso no es un error, es una forma de inicializar el registro del puerto b con un valor, y te aseguro por experiencia propia, que hay veces que sin tener eso escrito, he tenido programas al iniciar el programa porque no hacia lo esperado.

Un saludo!

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #57 en: 14 de Enero de 2010, 11:42:10 »
...
El error real que se comete es que estas dando una orden innecesaria, simplemente mandas a cero todos los pines que estan como salida.
...

Lamento decirte que eso no es un error, es una forma de inicializar el registro del puerto b con un valor, y te aseguro por experiencia propia, que hay veces que sin tener eso escrito, he tenido programas al iniciar el programa porque no hacia lo esperado.

Un saludo!

No estabamos hablando de PORTB, sino de PORTA que fue definido como entrada, es decir aunque el PIC realice esa orden su hardware la va a ignorar, PORTB esta correctamente inicializado.
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 Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #58 en: 14 de Enero de 2010, 11:47:47 »
Mis disculpas! Te he entendido mal, y mira que lo he leido dos veces eh!  :oops:

De todos modos, en 3 años que llevo con los Pics, yo siempre lo he escrito y nunca me ha dado problemas, pero ya que lo comentas, habra que probar a no ponerlo aumque creo que tampoco esta de mas.

Un saludo!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
« Respuesta #59 en: 14 de Enero de 2010, 12:17:10 »
Al entrar en el hilo ya estaba muy avanzado, pero pude ver al principio un error en el primer programa, lo que ocurre es que se corrigió en los programas sucesivos por lo que no le di importancia, así que para evitar seguir haciendo referencia a ese programa con el susodicho error lo indico y lo corrijo en el.
Trisa = %11111 ‘Parte del puerto A como entradas
Trisb = %00000000
Portb = %00000000
Porta = %00000 ‘Esto se definió como entradas y aquí se trata como salidas?.

Es contradictorio y puede producir efectos indeseables. Al definir parte del puerto como entrada Trisa = %11111 y luego forzarlo a un estado predeterminado Porta = %00000, esto es algo contradictorio y puede hacer que algún compilador decida redefinir el puerto como salidas. O puede que el compilador lo defina como entrada o como salida según se haga uso de él, esto último puede que haga que funcione el código pero el derroche de memoria a mi parecer no lo justifica.

Hola bigluis, la definición de puertos y programación de módulos en general en el Basic del PSI no tiene lugar predeterminado, se suele colocar fuera del main para no estar reprogramando continuamente el modulo, esto hace que se pierda tiempo de ejecución con código redundante. En Microbasic desde luego no tengo ni idea de que es mejor.

Supongo que estas cometiendo un error, ya que PORTA y TRISA son registros completamente distintos, lo que quiero decir es que, es muy poco probable que el compilador los confunda.

Supongo que tu error es que crees que ambos son el puerto, pero no es así, cuando defines un valor en PORTA, no defines el valor al puerto a sino al registro que esta relacionado con el al que los fabricantes han llamado PORTA, cundo defines un valor a TRISA, tampoco le defines el valor al puerto, sino a un registro llamado TRISA que se encarga de decidir si cada pin es de entrada o de salida, si lo tradujesemos serían puertos triestado.

El error real que se comete es que estas dando una orden innecesaria, simplemente mandas a cero todos los pines que estan como salida.

Seguramente no se me ha entendido correctamente por generalizar demasiado y la culpa es toda mía. Lo que quiero decir en post anterior es que hay compiladores BASIC que cuando se encuentran por ejemplo un “PortA.0=1 ” de forma automática insertan delante un “TrisA.0=0”.  O al revés si se encuentran con un “If RA0 = 1 then xxx” entoces insertan delante un “TrisA.0 = 1”. Yo solo comentaba esto porque en este subforo se utilizan muchas versiones de Basic.
« Última modificación: 14 de Enero de 2010, 12:58:05 por dogflu66 »
Saludos desde Granada, España.


 

anything