TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: janiro74 en 08 de Enero de 2010, 12:51:08

Título: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 08 de Enero de 2010, 12:51:08
lo  primero saludos a todos y espero no incurrir en una falta hacia el foro. Mi cuestion es ke con el 16f84a quiero encender unos leds de portb comandados por unos pulsadores en  porta con la condicion ke si hay ya dos pulsadores presionados al pulsar el tercero y sucesivos ya no realice ninguna accion (un tercer o cuarto led mas encendido...)
pero lo ke ocurre es ke con este programa ke he creado en mikrobasic pro for pic ni siquiera se enciende portb.0 al poner a "1" porta.0 (no me responde a ningun pulsador)
Alguien sabe que es lo que pasa y como hacer para que se cumpla la condicion que espongo al principio?
Muchas gracias ante todo
está en mikrobasic pro for pic

program ecli
trisa = %00011111
trisb = %00000000
portb = %00000000
'porta = %00000
porta.7 = 0
porta.6 = 0
porta.5 = 0
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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: rnelson en 08 de Enero de 2010, 14:19:35
saludos..
hermano colocastes todos las definiciones al comenzar el programa??
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 08 de Enero de 2010, 15:30:24
Con que programa has realizado el susodcicho.
Me paree que si ese es todo el programa falta añadir cosas como el: el micro utilizado, frecuencia del oscilador, si el micro tiene entradas analogicas y/o comparadores, debes de deshabilitarlos.

Me parece que como a mí te hace falta leer mucho lo datasheet.

fer.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 08 de Enero de 2010, 18:41:41
si es cierto por eso digo ke estoy enpezando poro os digo tambien que uso ep mikrobasic pro for pic. Este cuando comienzas un proyecto le indicas el pic y luego te sale la pantalla para enpezar a programar.
Lo he diseñado otra vez y ahora todo el portb esta encendido sin pulsar nada
en este pic no hay ke definir nada puesto ke sus tegistro ya son de entrad salida.
total estoy cada bez mas liao . os comento ke lo he hecho con el 16f887 y funciona incluso co 8 I/O aunke segun le plazca en ocasiones enciende cuando y las ke quiere.



program ecli
trisa.0 = 1
trisa.1 = 1
trisa.2 = 1
trisa.3 = 1
trisa.4 = 1
trisb.0 = 0
trisb.1 = 0
trisb.2 = 0
trisb.3 = 0
trisb.4 = 0
main:
portb = %00000000
WHILE TRUE
if  porta.0 = 1 then portb.0 = 1 else   portb.0 = 0
end if
if  porta.1 = 1 then portb.1 = 1 else   portb.1 = 0
end if
if  porta.2 = 1 then portb.2 = 1 else   portb.2 = 0
end if
if  porta.3 = 1 then portb.3 = 1 else   portb.3 = 0
end if
if  porta.4 = 1 then portb.4 = 1 else   portb.4 = 0
end if
 WEND
end.

aki esta con el 16f887
program ecli

ANSEL = 0
ANSELH = 0
TRISA0_BIT = 1
TRISA1_BIT = 1
TRISA2_BIT = 1
TRISA3_BIT = 1
TRISA4_BIT = 1
TRISA5_BIT = 1
TRISA6_BIT = 1
TRISA7_BIT = 1
TRISB = %00000000
PORTB = %00000000
main:
while (porta.0+porta.1+porta.2+porta.3+porta.4+porta.5+porta.6+porta.7) <=2
if  porta.0 = 1  then portb.0 = 1 else   portb.0 = 0  'delay_ms(5)
end if
if  porta.1 = 1  then portb.1 = 1 else   portb.1 = 0  delay_ms(5)
end if
if  porta.2 = 1  then portb.2 = 1 else   portb.2 = 0  delay_ms(5)
end if
if  porta.3 = 1  then portb.3 = 1 else   portb.3 = 0  delay_ms(5)
end if
if  porta.4 = 1  then portb.4 = 1 else   portb.4 = 0   delay_ms(5)
end if
if  porta.5 = 1  then portb.5 = 1 else   portb.5 = 0   delay_ms(5)
end if
if  porta.6 = 1  then portb.6 = 1 else   portb.6 = 0  delay_ms(5)
end if
if  porta.7 = 1  then portb.7 = 1 else   portb.7 = 0  delay_ms(5)
end if
wend
goto main
end.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 08 de Enero de 2010, 19:16:30
Si no tienes puesto ningun delay, me parece que a la velocidad que va el micro pudes estar leyendo cualquier cosa y mas si no tienes nada puesto para evitar los rebotes que se producen al abrir y cerrar los contactos de los pulsadores. estos son se abren o cierran instantaneamente. Presentan el efecto de tirar un pelota al aire y cada vez que llega al suelo rebota (cada vez menos) hasta quedar en el suelo.
Bueno con esto, si estas simulando el programa o bien colocas un circuito hardware para que los elimine o bien realizas una demora por software entre lecturas del(os) pulsadores. Un valor aceptable puede estar del orden de los 20milisegundos.

Fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 08 de Enero de 2010, 19:50:02
este es el diseño con los delay que estoy simulando co este hardware easypic6 http://www.mikroe.com/en/tools/easypic6/

program ecli
trisa0_bit = 1
trisa1_bit = 1
trisa2_bit = 1
trisa3_bit = 1
trisa4_bit = 1
trisb0_bit = 0
trisb1_bit = 0
trisb2_bit = 0
trisb3_bit = 0
trisb4_bit = 0

main:
delay_ms(20)
portb = 0
while (porta.0+porta.1+porta.2+porta.3+porta.4) >=2
if  porta.0 = 1  then portb.0 = 1 else   portb.0 = 0  delay_ms(20)
end if
if  porta.1 = 1  then portb.1 = 1 else   portb.1 = 0  delay_ms(20)
end if
if  porta.2 = 1  then portb.2 = 1 else   portb.2 = 0  delay_ms(20)
end if
if  porta.3 = 1  then portb.3 = 1 else   portb.3 = 0  delay_ms(20)
end if
if  porta.4 = 1  then portb.4 = 1 else   portb.4 = 0  delay_ms(20)
end if
 WEND
 goto main
 end.

pero incluso con los delay me tililan los led de portb sin pulsar nada y cuando pulso 3 ó mas se apaga todo portb
cada vez me sale algo distinto y estoy mu liao ya ke bajo mis cortos conocimientos no me hacen cosas logicas
gracias por buestra ayuda
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 08 de Enero de 2010, 20:04:38
Pues por lo que indicas es como si viniese abajo la tension de la placa de desarrollo.
En algunas placas comerciales creo recordar que utilizan puentes o switches para anular ciertas partes de la circuiteria. Por el efecto que indicas es que cuando se iluminan varios leds se viniese abajo la placa.
¿No tienes el esquema para que revises las conexiones?

Por otra parte en la linea siguiente:

while (porta.0+porta.1+porta.2+porta.3+porta.4) >=2
 
Entiendo que lo que quieres realizar es que cuando esten 2 pulsadores activados se realice alguna operacion.
Pero segun entiendo, todo lo que hay entre el While y el Wend solo se va a ejecutar si tienes accionados al mens 2 pulsadores.
¿No habras querido poner:    while (porta.0+porta.1+porta.2+porta.3+porta.4) <=2 Si es asi, entonces si se ejecuta lo de abaj, pero ademas despues del Wend deberias de poner algo de codigo para dejar las salidas en algun estado determinado como apagados o encenddos, por ejemplo.

Fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 08 de Enero de 2010, 20:12:44
Oye Janiro:

Comprobando los dos programas veo que en el del 877 que dices que funciona veo que está así: while (porta.0+porta.1+porta.2+porta.3+porta.4) <=2

mientras que en que tu estas realizando está asi:while (porta.0+porta.1+porta.2+porta.3+porta.4) >=2

Fer.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 08 de Enero de 2010, 20:21:20
si si parece ser ke probando probando y con el copia y pega se ma ido la pinzapero el problema son los titileos y resultados aleatorios como luces led ke se encienden sin ke les coresponda o ke probando con los pulsadores en ocasiones no de cumplan las condiciones yyyyy ademas creo ke
no tiene nada ke ver con la tension de alimentacion ya ke con los ejemplos del cd de la placa y algunos programas de encender muchos led no hay problema . en realidad lo ke quiero es un programa ke aunque haya mas de un pulsador dado en porta haya un maximo de dos led encendidos porke este circuito iria luego a unas electrovalvulas (con sus respectivos reles y transi.) de unas tuberias  cuyo caudal solo soporta el de 2 tuberias , de ahi ke solo puede haber 2 leds encendidos simultaneamente
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 08 de Enero de 2010, 20:31:53
El programa te configura el wachtdog como enable. Aver si se te esta reseteando por eso.

Una cosa mas. En tu programa antes del END no te falta = goto main.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 08 de Enero de 2010, 20:33:59
como se configura el wachtdog ke no se ni lo ke es y si es cierto lo del goto
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 08 de Enero de 2010, 20:35:22
si ya se lo kes el wachtdog  y está en disable
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 08 de Enero de 2010, 20:37:58
el wachtdog es un temporizador interno que si se configura como enable en el momento que se da tension al equipo empieza a contar y cada pocos milisegundos lo que hace es resetear y dejar perdido el programa.
Dentro del micro basic no hay ninguna opcion para configurar los fuses. Normalmente si los entornos de programacion no tiene esta opcion hay que escribirlas a mano dentro del programa, pero por lo que has dicho anteriormente que al empezar a realizar el programa te pide cosas como tipo del micro, oscilador,......

Prueba añadiendo el goto main
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 08 de Enero de 2010, 20:43:37
Otra cosa el PIC16F887 tiene comparadores analogicos.

¿Le dices al programa que los deshabilite y deje el puerto como digital? Fijate que hay una intruccion ANsel= = de por medio que alguna vez has eliminado en el programa.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 08 de Enero de 2010, 21:00:33
este es el programa con mikrobasic y con el pic16f84a
con el goto y demas pero tiene una inestabilidad muy notable de titileos , ledas por ejemplo al pulsa de porta.1 y destellan otros tamien o pulsas mas de dos y se apaga todo portb.....  no se es posible ke la rutina sea muy larga y mientras barre todo el programa pasen cosas raras pero yo no  se simplificar mas esto y seguro ke con otros comando seria mas corto pero yo no se. no se si es eso posible

program ecli
delay_ms(40)
trisa0_bit = 1
trisa1_bit = 1
trisa2_bit = 1
trisa3_bit = 1
trisa4_bit = 1
trisb0_bit = 0
trisb1_bit = 0
trisb2_bit = 0
trisb3_bit = 0
trisb4_bit = 0

main:
delay_ms(40)
portb =0
while  (porta.0+porta.1+porta.2+porta.3+porta.4) <=2

if  porta.0 = 1  then portb.0 = 1 else   portb.0 = 0  delay_ms(40)
end if
if  porta.1 = 1  then portb.1 = 1 else   portb.1 = 0  delay_ms(40)
end if
if  porta.2 = 1  then portb.2 = 1 else   portb.2 = 0  delay_ms(40)
end if
if  porta.3 = 1  then portb.3 = 1 else   portb.3 = 0  delay_ms(40)
end if
if  porta.4 = 1  then portb.4 = 1 else   portb.4 = 0  delay_ms(40)
end if

 WEND
 goto main
 
   end.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 08 de Enero de 2010, 21:02:28
Otra cosa el PIC16F887 tiene comparadores analogicos.

¿Le dices al programa que los deshabilite y deje el puerto como digital? Fijate que hay una intruccion ANsel= = de por medio que alguna vez has eliminado en el programa.


Fer.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 08 de Enero de 2010, 21:11:32
si si lo ke pasa es ke cuando lo hago con el 16f84a no es necesario y cuando lo hago con el 887 lo pongo y uso 8 de ntrada y 8 de salida
pero con los 2 pic me hacen cosas raras.
la intruccion select case simplificaria el programa dando le estabilidad ?
y como se haria ke esa es otra!!!!!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 08 de Enero de 2010, 21:15:08
No se como funciona mikrobasic.
Has probado con: while  (porta <=2)

De todas formas por mi ya por hoy es suficiente, espero que lo soluciones, mientras seguire pensando.

Fermin

Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 08 de Enero de 2010, 21:19:01
sisi muchas gracias por todo yo sigo probando ke hasta mañana a las 8 ke salga se guardia tengo tiempo
hasta pronto . ya os contaré
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: KALLITOS en 08 de Enero de 2010, 21:20:21
Hola amigos, janiro pega tu diagrama pues si estas usando las entradas con resistencias pullup tu codigo no haria lo que esperas.

Saludos
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 09 de Enero de 2010, 14:54:03
Hola Janiro:

He estado realizndo pruebas con tu programa. No tengo el MiKrobasic pero lo he simulado con el Pic Simulator IDE. Para ello he cogido tu programa y lo he adaptado a PSI. Decirte que funciona correctamente pero los cambios que he realizado son:
Como dices que quieres tener como maximo 2 salidas activas he cambiado:
-   porta<=2 por <=3
-   Delay_MS (40) por WaitMs 40. esto por que Delay_Ms no existe en PSI.
-   End if   por   Endif
-   He recolocado la sintaxis del programa que  no se por que razon no lo reconoce el PSI.
-   Los Wait los he comentado porque si no la simulacion era muy lenta, pero funciona bien con ella habilitada.

Te adjunto el codigo:
Código: [Seleccionar]
Define CLOCK_FREQUENCY = 4  'Frecuencia del reloj en Mhz

TRISA = %11111111
TRISB = %00000000
main:

'WaitMs 40
PORTB = 0

While PORTA <= 3
If PORTA.0 = 1 Then
PORTB.0 = 1
Else
PORTB.0 = 0
'WaitMs 40
Endif

If PORTA.1 = 1 Then
PORTB.1 = 1
Else
PORTB.1 = 0
'WaitMs 40
Endif

If PORTA.2 = 1 Then
PORTB.2 = 1
Else
PORTB.2 = 0
'WaitMs 40
Endif

If PORTA.3 = 1 Then
PORTB.3 = 1
Else
PORTB.3 = 0
'WaitMs 40
Endif

If PORTA.4 = 1 Then
PORTB.4 = 1
Else
PORTB.4 = 0
'WaitMs 40
Endif

Wend
Goto main
End
Por que no pruebas a eliminar las eliminar las lineas del endif

Fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 10 de Enero de 2010, 15:19:21
acabo de hacer el programa haciendo los cambios a mikrobasic osea poner delay_ms, end if etc pero no funciona es decir ke cuando pulso porta.0 se enciende el led de portb.0 pero si pulso un tercer pulsado se enciende un tercer led .... y un cuarto..... y un quinto despues lo he cargado en el simulator id pero no se muy bien como va. he cargado el hex. he abierto una pantalla con 8 led board y microcontroler view con el 16f84a y cuando pongo en on porta.0 no se enciende portb.0 . ke es lo ke hago mal?


program ecli
TRISA = %11111111
TRISB = %00000000
main:

delay_ms(40)
PORTB = 0

While PORTA <= 3
   If PORTA.0 = 1 Then
      PORTB.0 = 1
   Else
      PORTB.0 = 0
delay_ms(40)
   end if

   If PORTA.1 = 1 Then
      PORTB.1 = 1
   Else
      PORTB.1 = 0
delay_ms(40)
   End if

   If PORTA.2 = 1 Then
      PORTB.2 = 1
   Else
      PORTB.2 = 0
delay_ms(40)
   End if

   If PORTA.3 = 1 Then
      PORTB.3 = 1
   Else
      PORTB.3 = 0
delay_ms(40)
   End if

   If PORTA.4 = 1 Then
      PORTB.4 = 1
   Else
      PORTB.4 = 0
delay_ms(40)
   End if

Wend
Goto main
End



ah!!! y otra cosa cuando en mi probador pulso por ejemlo porta.1 se enciende portb.1 pero ademas los otros port  de por debajo tambien se enciende por un instante
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 10 de Enero de 2010, 15:26:15
Con PSI la secuencia seria:
- Ejecutas PSI
- Seleccionas el tipo de micro, ejemplo 16F84
- Abres el tool el basic compiler y copias el programa que adjunté.
-Lo compilas con F9
-Como bien dices el 8-leds board
-En Rate seleccionas la velocidad, por ejmplo: Normal o fast.
Le das a Star simulation y verás como funciona.

Si ves que funciona se puede pensar que o bien es el Mikrobasic o la placa de desarrollo.

Fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 10 de Enero de 2010, 15:59:32
mira he copiado tu programa lo he pegado lo he modificado a mikrobasic y lo he compilado pero esta vez bien ya ke la otravez no me habia dado cuenta de ke faltaba el "." en el end de el fin de programa pero ahora pasa ke si activo mas de 2 pulsadores se apagan los led de portb ke habian encendidos y otracosa he cargado el hex en pic simulator y cuando le doy a la T on de por ejemplo porta.0 este se enciende en los en porta.0de los 8 led pero no se enciende su correspondiente en portb.0 y ya creo ke la preba de fuego seria ke me mandaras tu hex y lo simulara tanto en mi palca como en pic simulator para descartar si faya mi compilador con mikrobasic, mi placa o yoke se
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 10 de Enero de 2010, 16:09:01
espera me he dado cuenta ke lo ke no hace es encender un bit superior a 2 y no la suma de 1 led mas 1 led porke si pulso
porta.0 =1 ---- portb.0 = 1
portb.1 =1 ---- portb.0 = 1
porta.2= 0 ---- portb.2 = 0


pero si activamos un tercer pulsador

porta.0 =1 ---- portb.0 = 0
portb.1 =1 ---- portb.0 = 0
porta.2= 1 ---- portb.2 = 0
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 10 de Enero de 2010, 16:23:04
 A ver 2 cosas:

- No hace falta poner ningun " ." en el END.
-Segun esta tu programa cada vez que pulsas a la T de cualquier entrada se enciende su correspondiente led del portB.
- Si dejas pulsados 2 se encienden los 2 correspondientes, pero si en ese caso actuas sobre un 3º segun el punto del programas en que lo actues(puedes verlo en el simulador) Se enciende el led de ese 3 pulsador. Lo unico que solo lo realiza hasta que el programa despues de recorrer todos los pulsadores, regresa al main con la instruccion goto main. Hecho lo cual como tienes puesto portB=0 despues del main, pues se apagan los 3, hasta que el programas detecta que solo tienes dos pulsadores actuados.

Mas o menos eso es o que planteabas que quirias realizar. Date cuenta que a la velocidad que va el micro en realidad(no en el simulador) el encendido del 3º led no lo apreciarias. Si quisieses evitar ese pulso, tendrias que trabajar un poco mas el programa.

Fer.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 10 de Enero de 2010, 16:39:46
Mira he probado mas cosas y me parece que tendrás que cambair algo en el programa por que si haces : While porta<= 3 , cada vez que haya 2 pulsadores, dependiendo de cuales sean se te activaran los 2 o no  ¿Porque? muy sencillo:
Con while <=3 cada vez que se detecten 2 pues como se comparan  con un registro de 8 bits y si están actuados RA0 y RA3 entonces esto en binario seria:

portA= 00000101 en binario =>  5 en decimal y como es mayor que 3 entonces siempre estaras en portb=0

Entendido?

Fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 10 de Enero de 2010, 16:51:26
mira Fer con lo crudo ke estoy y lo mal ke me explico te estoy liando. Esta vez he segudo bien los pasos ke me dijistes del pic simulator para compilar tu codigo . Yo habia compilado tu codigo con mi mikrobasic y usado el hex ke este crea  de ahí ke me hacia falta el "." en el end y ya siguiendo tus instrucciones lo simulo bien pero lo ke el programa deberia de hacer es ke cuando pulsaramos un tercer pulsador no se encendiera un tercer led pero ke tampoco se apagaran los 2 ke ya habian encendidos y lo de <=3 se debe referir al numero de leds encendidos y este programatuyo lo hace segun una posicion maxima en decimal (no mas de el  2º bit de mayor peso creo) y no si hay mas de 2 pusadore pulsados cualesquiera que sea su peso por eso si pulsas porta.2 (ke ocupa una posicion  3 3n decimal) no se enciense el portb.2
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 10 de Enero de 2010, 16:58:15
Bueno ya voy intentndo comprenderte mejor.
Segun eso tu programa es muy basico y creo que deberias de crearte, creo,  al menos 2 variables 1 para guardar el numero de pulsadores actuados y otra para guardar el numero (2) y cuales son las entradas activadas.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 10 de Enero de 2010, 17:12:44
yo pensaba ke era senciyo pero no doy con la tecla y si es verdad lo de las variables pero no tengo claro para vincularlas a pusdores  y demas sobretodo cuando la variable ke almacena la suma de "unos" en pulsadores ,,,,,,, ke ago con so?
bueno voy a ver si soy capaz
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 10 de Enero de 2010, 18:55:09
llevo un buen rato con el programa y no doy pie con bola con el tema de las variables pero mi fallo ahora creo ke son las matematicas , no soy capaz de orientar un par de ecuaciones para encender solo dos leds a la vez.
creo que necesito un poco de norte!!!!!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Strepto en 10 de Enero de 2010, 19:25:48
Leyendo un poco el asuntillo este que teneis por aqui, creo que lo que tendriais que hacer seria implementar un contador que te cuente los botones que tienes pulsados antes de volver a entrar al while y la condicion tendria que ser que sea <3 o <=2 como teniais antes y mientras eso se cumpla que no vuelve a entrar al while por lo que no actua sobre el portb y conseguimos que este preguntando constantemente hasta que soltemos un pulsador y pueda vuolver entrar al while.

Esto se me ha ocurrido asi a botepronto, no se si dara resultado o no, mañana hare alguna prueba a ver que tal que hoy ya es un poco tarde.

Un saludo!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 10 de Enero de 2010, 19:42:17
muchas gracias a todos por el interes y por supuesto la ayuda ya ke me estais dando ideas y opciones . en estos dia he aprendido vastante con vuestras orientaciones .
por ahora no se nada de contadores aunke supongo ke os referis a un bucle for  next . he intentado alfo como esto :


x=0
for x=0 to 4
en donde x lauso en:
while true
if porta.x = 1 then portb.0 = 1 else portb.0=0

:
:
:
end wile
 
pero no he tenido resultados.
Espero pronto resolver el programa con vuestra ayuda
Muchos saludos a todos desde Motril (granada)
y os dejo ke descanseis por hoy y gracias otra vez a todos
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 11 de Enero de 2010, 15:15:24
Buenas tardes Janiro:

te adjunto un nuevo codigo que estado soñando ésta noche :D :D :D :D
Parece que funciona t se aproxima muy mucho a lo que necesitas, pero tiene un pelin de inconveniente y es que:
Despues de detectar 3 pulsadores accionados se regresan a 2 hay un pequeo impulso de encendido de un de ellos, pero espero qye ya seas capaz de solventarlo.
El programa no está realizado de la manera mas ortodoxo pero lo he realizado para que entiendas las secuencias.
¡¡ ya se que para los puristas se puede reducir el numero de lineas!! :mrgreen: :mrgreen:

Código: [Seleccionar]
Define CLOCK_FREQUENCY = 4  'Frecuencia del reloj en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
Dim estado As Byte
Dim estado_ra0 As Byte
Dim estado_ra1 As Byte
Dim estado_ra2 As Byte
Dim estado_ra3 As Byte
Dim estado_ra4 As Byte

TRISA = %11111111
TRISB = %00000000
main:
'Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms

'WaitMs 40
PORTB = 0
estado = 0
estado_ra0 = 0
estado_ra1 = 0
estado_ra2 = 0
estado_ra3 = 0
estado_ra4 = 0

inicio:
p_0: If estado_ra0 = 0 Then
If PORTA.0 = 1 Then
estado = estado + 1
estado_ra0 = 1
If estado >= 3 Then Goto p_1 Else PORTB.0 = 1
Else
PORTB.0 = 0
Endif
Else
If estado_ra0 = 1 Then
If PORTA.0 = 1 Then
If estado >= 3 Then Goto p_1 Else PORTB.0 = 1
Else
estado_ra0 = 0
estado = estado - 1
Endif
Endif
Endif

p_1: If estado_ra1 = 0 Then
If PORTA.1 = 1 Then
estado = estado + 1
estado_ra1 = 1
If estado >= 3 Then Goto p_2 Else PORTB.1 = 1
Else
PORTB.1 = 0
Endif
Else
If estado_ra1 = 1 Then
If PORTA.1 = 1 Then
If estado >= 3 Then Goto p_2 Else PORTB.1 = 1
Else
estado_ra1 = 0
estado = estado - 1
Endif
Endif
Endif

p_2: If estado_ra2 = 0 Then
If PORTA.2 = 1 Then
estado = estado + 1
estado_ra2 = 1
If estado >= 3 Then Goto p_3 Else PORTB.2 = 1
Else
PORTB.2 = 0
Endif
Else
If estado_ra2 = 1 Then
If PORTA.2 = 1 Then
If estado >= 3 Then Goto p_3 Else PORTB.2 = 1
Else
estado_ra2 = 0
estado = estado - 1
Endif
Endif
Endif

p_3: If estado_ra3 = 0 Then
If PORTA.3 = 1 Then
estado = estado + 1
estado_ra3 = 1
If estado >= 3 Then Goto p_4 Else PORTB.3 = 1
Else
PORTB.3 = 0
Endif
Else
If estado_ra3 = 1 Then
If PORTA.3 = 1 Then
If estado >= 3 Then Goto p_4 Else PORTB.3 = 1
Else
estado_ra3 = 0
estado = estado - 1
Endif
Endif
Endif

p_4: If estado_ra4 = 0 Then
If PORTA.4 = 1 Then
estado = estado + 1
estado_ra4 = 1
If estado >= 3 Then Goto p_0 Else PORTB.4 = 1
Else
PORTB.4 = 0
Endif
Else
If estado_ra4 = 1 Then
If PORTA.4 = 1 Then
If estado >= 3 Then Goto p_0 Else PORTB.4 = 1
Else
estado_ra4 = 0
estado = estado - 1
Endif
Endif
Endif

Goto inicio
End                                           

Fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Strepto en 11 de Enero de 2010, 18:25:53
Bueno, deciros que despues de comerme un rato la cabeza lo he conseguido:

Código: [Seleccionar]
    device 16f84
    Dim cont As Byte
    Dim estado_ra0 As porta.0
    Dim estado_ra1 As porta.1
    Dim estado_ra2 As porta.2
    Dim estado_ra3 As porta.3
    Dim estado_ra4 As porta.4
    TRISA = %11111111
    TRISB = %00000000
    porta = 0
    portb = 0
    estado_ra0 = 0
    estado_ra1 = 0
    estado_ra2 = 0
    estado_ra3 = 0
    estado_ra4 = 0
   
Repite:
    call miracont
    if cont >= 3 then goto repite
    delayms 10
    if porta.0 = 1 then
        portb.0 = 1
    else
        portb.0 = 0
    endif
   
Sigue1:
    call miracont
    if cont >= 3 then goto sigue1
    delayms 10
    if porta.1 = 1 then
        portb.1 = 1
    else
        portb.1 = 0
    endif
   
Sigue2:
    call miracont
    if cont >= 3 then goto sigue2
    delayms 10
    if porta.2 = 1 then
        portb.2 = 1
    else
        portb.2 = 0
    endif
   
Sigue3:
    call miracont
    if cont >= 3 then goto sigue3
    delayms 10
    if porta.3 = 1 then
        portb.3 = 1
    else
        portb.3 = 0
    endif
   
Sigue4:
    call miracont
    if cont >= 3 then goto sigue4
    delayms 10
    if porta.4 = 1 then
        portb.4 = 1
    else
        portb.4 = 0
    endif
   
    goto repite   
             
Miracont:   
    if porta.0 = 1 then estado_ra0 = 1 : else estado_ra0 = 0
    delayus 50
    if porta.1 = 1 then estado_ra1 = 1 : else estado_ra1 = 0
    delayus 50
    if porta.2 = 1 then estado_ra2 = 1 : else estado_ra2 = 0
    delayus 50
    if porta.3 = 1 then estado_ra3 = 1 : else estado_ra3 = 0
    delayus 50
    if porta.4 = 1 then estado_ra4 = 1 : else estado_ra4 = 0
    delayus 50
    cont = (estado_ra0 + estado_ra1  + estado_ra2 + estado_ra3 + estado_ra4)
    delayms 10
    return
   
    end

Deciros que supongo que todo ese programa se podra acortar con un for y que disfruteis de la simulacion.

Un saludo!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 11 de Enero de 2010, 20:13:33
hola a todos acabo de probar los dos codigos y me alegra decir ke son casi casi perfectos os lo habeis currao. esto no lo habria sacado yo en la vida .
!!!!! y deciamos ke era sencillo !!! yo lo veo conplejo todo teneis un coco ke lo flipo . yo todavia no estoy ni en parbulitos. pero en dos dias me habeis enseñado un monton como a por ejemplo del codigo de fer lo he simulado y sacado el hex paragrabarlo en mi pic (para mi ha sido un gran abance)
y con el codigo hex del archivo  rar de strepto ke lo he grabado directamente en el pic . DEcios tambien ke tiene algunos pequeños fallos (aunke importantes a la hora de colocar el circuito de control del sitema de enrgia solar ke iria colocado) hahora tengo ke estudiar con mucho detenimiento los paso ke habeis seguirlos y aprender de estos para empezar a hcerlo en el circuito real ke es para 8 entradas y 8 salidas con el 16f887 .los fallos ke tengo ke corregir son del tipo cuando estan todos pulsados ke se enciende aveces tres o alguno ke no se le ha ordenado o ke lo sueltas y sighe encendido.
Para todo esto supongo ke habra ke establecer algunas prioridades.

pero ante todo mil gracias por toda buestra ayuda y espero pronto poder  ayudar yo tambien a otros ke como yo empiezan en este mundillo
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 en 11 de Enero de 2010, 20:17:59
Este otro parece que sí que hace exactamente lo  que quieres.
Si es así, pues solo queda intentar simplificarlo, pasarlo a funciones y comentarlo.

Código: Visual Basic
  1. 'Program ecli
  2. 'Pic16F84
  3. 'Basic del PSI
  4. Define SIMULATION_WAITMS_VALUE = 1
  5. Dim contador As Byte
  6. Dim flag As Byte
  7. contador = 0
  8. flag = 0
  9. TRISA = %11111
  10. TRISB = %00000000
  11. PORTB = %00000000
  12. main:
  13.         If PORTA.0 = 1 And flag = 0 Then
  14.                 PORTB.0 = 1
  15.         Else
  16.                 If PORTA.0 = 0 Then
  17.                         PORTB.0 = 0
  18.                         WaitMs 100
  19.                 Endif
  20.         Endif
  21.         Gosub ctrol_nbit
  22.  
  23.         If PORTA.1 = 1 And flag = 0 Then
  24.                 PORTB.1 = 1
  25.         Else
  26.                 If PORTA.1 = 0 Then
  27.                         PORTB.1 = 0
  28.                         WaitMs 100
  29.                 Endif
  30.         Endif
  31.         Gosub ctrol_nbit
  32.  
  33.         If PORTA.2 = 1 And flag = 0 Then
  34.                 PORTB.2 = 1
  35.         Else
  36.                 If PORTA.2 = 0 Then
  37.                         PORTB.2 = 0
  38.                         WaitMs 100
  39.                 Endif
  40.         Endif
  41.         Gosub ctrol_nbit
  42.  
  43.         If PORTA.3 = 1 And flag = 0 Then
  44.                 PORTB.3 = 1
  45.         Else
  46.                 If PORTA.3 = 0 Then
  47.                         PORTB.3 = 0
  48.                         WaitMs 100
  49.                 Endif
  50.         Endif
  51.         Gosub ctrol_nbit
  52.  
  53.         If PORTA.4 = 1 And flag = 0 Then
  54.                 PORTB.4 = 1
  55.         Else
  56.                 If PORTA.4 = 0 Then
  57.                         PORTB.4 = 0
  58.                         WaitMs 100
  59.                 Endif
  60.         Endif
  61.         Gosub ctrol_nbit
  62. Goto main
  63. End                                              
  64. ctrol_nbit:
  65.         contador = 0
  66.         flag = 0
  67.         If PORTA.0 = 1 Then contador = contador + 1
  68.         If PORTA.1 = 1 Then contador = contador + 1
  69.         If PORTA.2 = 1 Then contador = contador + 1
  70.         If PORTA.3 = 1 Then contador = contador + 1
  71.         If PORTA.4 = 1 Then contador = contador + 1
  72.         If contador > 2 Then flag = 1
  73. Return
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: MiCrOtRoNiC en 11 de Enero de 2010, 20:33:14
eh notado que cuando se inserta los codigo con "GeSHi (vb):" para hacer copy paste... :? :? :? :?
ah alguien no le ah pasado??? copio directo al compilador basic y queda todo desordenado con # en cada linea y en .txt tampoco....

saludos
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 11 de Enero de 2010, 20:48:26
acavo de prebar el hex de dogflu66 en mi placa (la easypic6) y tiene basicamente los mismos osea supongamos ke le doy en este orden pulsador 1, 2 ,3 ,4 ,5 pues se enciende en portb el led 1, 2, y lla no mas pero si suelto el 1  y 2  el 3, 4 ,5 siguen apagados hasta ke no libero un pulsador y entonces se enciende de golpe los dos restantes ya ke el programa se keda con tres peticiones pero no tiene ninguna prioridad para para cual de ellos dejar encendida o apagada. esto se podria solucionar con la situacion real ke seria una sonda con por ejemplo el ds1820 o lm35 y le dariamos paso al deposiro conectado a porta mas frio
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 11 de Enero de 2010, 20:56:15
copia el texto en el word de ofice 2003 elke yo tengo!!! selecionas todo y en la barra de herramientas en estilo y formato lo despliegas y eliges normal y ya está ordenado para ke de ahí lo copies i peges donde kieras
mira ver si te funciona
saludos
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 en 11 de Enero de 2010, 21:16:40
acavo de prebar el hex de dogflu66 en mi placa (la easypic6) y tiene basicamente los mismos osea supongamos ke le doy en este orden pulsador 1, 2 ,3 ,4 ,5 pues se enciende en portb el led 1, 2, y lla no mas pero si suelto el 1  y 2  el 3, 4 ,5 siguen apagados hasta ke no libero un pulsador y entonces se enciende de golpe los dos restantes ya ke el programa se keda con tres peticiones pero no tiene ninguna prioridad para para cual de ellos dejar encendida o apagada. esto se podria solucionar con la situacion real ke seria una sonda con por ejemplo el ds1820 o lm35 y le dariamos paso al deposiro conectado a porta mas frio

Por desgracia aquí hay que especificarlo todo. Posiblemente lo más fácil seria que sigan los últimos estados hasta que solo queden 2 teclas pulsadas de nuevo y, solo entonces se actualice el sistema.

PD. De todas formas cuando se conoce exactamente las entradas y salidas (por su puesto la naturaleza de las mismas), más su relación entre ellas y, si le sumamos lo que se pretende hacer o controlar, como es natural, de forma cociente o posiblemente inconsciente la estructura del programa varia radicalmente.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 en 11 de Enero de 2010, 21:35:50
Aqui lo dejo, no hay variacion del estado anterior al actual, hasta no quedar de nuevo 2 o menos teclas pulsadas.

Código: vb.net
  1. 'Program ecli
  2. 'Pic16F84
  3. 'Basic del PSI
  4. Define SIMULATION_WAITMS_VALUE = 1
  5. Dim contador As Byte
  6. Dim flag As Byte
  7. contador = 0
  8. flag = 0
  9. TRISA = %11111
  10. TRISB = %00000000
  11. PORTB = %00000000
  12. main:
  13.         If PORTA.0 = 1 And flag = 0 Then
  14.                 PORTB.0 = 1
  15.         Else
  16.                 If PORTA.0 = 0 And flag = 0 Then
  17.                         PORTB.0 = 0
  18.                         WaitMs 100
  19.                 Endif
  20.         Endif
  21.         Gosub ctrol_nbit
  22.  
  23.         If PORTA.1 = 1 And flag = 0 Then
  24.                 PORTB.1 = 1
  25.         Else
  26.                 If PORTA.1 = 0 And flag = 0 Then
  27.                         PORTB.1 = 0
  28.                         WaitMs 100
  29.                 Endif
  30.         Endif
  31.         Gosub ctrol_nbit
  32.  
  33.         If PORTA.2 = 1 And flag = 0 Then
  34.                 PORTB.2 = 1
  35.         Else
  36.                 If PORTA.2 = 0 And flag = 0 Then
  37.                         PORTB.2 = 0
  38.                         WaitMs 100
  39.                 Endif
  40.         Endif
  41.         Gosub ctrol_nbit
  42.  
  43.         If PORTA.3 = 1 And flag = 0 Then
  44.                 PORTB.3 = 1
  45.         Else
  46.                 If PORTA.3 = 0 And flag = 0 Then
  47.                         PORTB.3 = 0
  48.                         WaitMs 100
  49.                 Endif
  50.         Endif
  51.         Gosub ctrol_nbit
  52.  
  53.         If PORTA.4 = 1 And flag = 0 Then
  54.                 PORTB.4 = 1
  55.         Else
  56.                 If PORTA.4 = 0 And flag = 0 Then
  57.                         PORTB.4 = 0
  58.                         WaitMs 100
  59.                 Endif
  60.         Endif
  61.         Gosub ctrol_nbit
  62. Goto main
  63. End                                              
  64. ctrol_nbit:
  65.         contador = 0
  66.         flag = 0
  67.         If PORTA.0 = 1 Then contador = contador + 1
  68.         If PORTA.1 = 1 Then contador = contador + 1
  69.         If PORTA.2 = 1 Then contador = contador + 1
  70.         If PORTA.3 = 1 Then contador = contador + 1
  71.         If PORTA.4 = 1 Then contador = contador + 1
  72.         If contador > 2 Then flag = 1
  73. Return
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Strepto en 12 de Enero de 2010, 11:56:25
Por desgracia aquí hay que especificarlo todo. Posiblemente lo más fácil seria que sigan los últimos estados hasta que solo queden 2 teclas pulsadas de nuevo y, solo entonces se actualice el sistema.

Esque segun la esplicacion del programa, pulsamos 2, se encienden, pulsamos los otros 3 y despues soltamos los 3 anteriores, por lo que todavia es superior a 2 pulsados, por lo que es imposible (a mi parecer) actuar sobre el resto hasta que solo queden 2 como bien has dicho tu, y creo que eso es lo que hemos echo los tres  :D :D :D

Por cierto, siguiendo tu idea, en vez de quedarme continuamente preguntando en la misma posicion he echo que vayan preguntando en el siguiente hasta que solo haya 2 pulsados y dependiendo la combinacion de pulsadores, el tiempo de respuesta ha mejorado.

Código: [Seleccionar]
    device 16f84
    Dim cont As Byte
    Dim estado_ra0 As porta.0
    Dim estado_ra1 As porta.1
    Dim estado_ra2 As porta.2
    Dim estado_ra3 As porta.3
    Dim estado_ra4 As porta.4
    TRISA = %11111111
    TRISB = %00000000
    porta = 0
    portb = 0
    estado_ra0 = 0
    estado_ra1 = 0
    estado_ra2 = 0
    estado_ra3 = 0
    estado_ra4 = 0
   
Repite:
    call miracont
    if cont >= 3 then goto sigue1
    delayms 10
    if porta.0 = 1 then
        portb.0 = 1
    else
        portb.0 = 0
    endif
   
Sigue1:
    call miracont
    if cont >= 3 then goto sigue2
    delayms 10
    if porta.1 = 1 then
        portb.1 = 1
    else
        portb.1 = 0
    endif
   
Sigue2:
    call miracont
    if cont >= 3 then goto sigue3
    delayms 10
    if porta.2 = 1 then
        portb.2 = 1
    else
        portb.2 = 0
    endif
   
Sigue3:
    call miracont
    if cont >= 3 then goto sigue4
    delayms 10
    if porta.3 = 1 then
        portb.3 = 1
    else
        portb.3 = 0
    endif
   
Sigue4:
    call miracont
    if cont >= 3 then goto repite
    delayms 10
    if porta.4 = 1 then
        portb.4 = 1
    else
        portb.4 = 0
    endif
   
    goto repite   
             
Miracont:   
    if porta.0 = 1 then estado_ra0 = 1 : else estado_ra0 = 0
    delayus 50
    if porta.1 = 1 then estado_ra1 = 1 : else estado_ra1 = 0
    delayus 50
    if porta.2 = 1 then estado_ra2 = 1 : else estado_ra2 = 0
    delayus 50
    if porta.3 = 1 then estado_ra3 = 1 : else estado_ra3 = 0
    delayus 50
    if porta.4 = 1 then estado_ra4 = 1 : else estado_ra4 = 0
    delayus 50
    cont = (estado_ra0 + estado_ra1  + estado_ra2 + estado_ra3 + estado_ra4)
    delayms 10
    return
   
    end

Un saludo!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 en 12 de Enero de 2010, 13:41:32
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:
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 12 de Enero de 2010, 16:45:54
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?
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Strepto 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!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Strepto 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!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Strepto 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!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Strepto 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!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 14 de Enero de 2010, 16:24:55
bueno he estado todos estos dias lellendo todos vuestros comentarios e instrucciones de como resolver el problema,  en la circunstacia de cuando se teniamos 5 pulsados y solo dos encendidos pues ke cuando se dejabande pulsar los dos pulsadores ke correspondian a los dos led encendidos se kedaban los otros tres apagados pues como dije no le dimos prioridad, pero ¿¿¿¿y si le dieramos la prioridad de por ejemplo el ke ocupara el numero mas alto????
O ke en esa situacion volviera a mirar los pulsadores uno a uno y asi encenderia 2 nuevos.
Tambien os recordaré ke en la realidad lo  quiero hacer con 8 entradas y 8 salidas pero no se cual seria el pic mas adecuado y si sabeis de alguno ke por diversidad de operaciones (funciones ) papaz de realizar simplificaria o facilitaria el programa. y dispongo de un16f887 ke tiene mas funciones ke el 16f84a
o si conoceis otro mejor pues proponermelo para buscarlo y pincharlo en mi simulador. y otracosa en microbasic para poner los pines todos como entrada salida es con la instruccion ANSEL = 0 ,ANSELH = 0 (para el pic 16f887) pero como se haria en buestros compiladores , es que estoy haciendo pruebas con buestros codigos con este pic


Gracias

Janiro74
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 14 de Enero de 2010, 17:27:31
 Bueno en principio para lo que planteas creo que es mas que suficiente con el 16F887.
Si quieres utilizar 8 entradas -8 salidas pues ya sabes en los ejempls hemos puesto 4 pues seria añadir los restantes para las i/o que quedan.
Respecto a las prioridades pues segun sean así deberan ser las condiciones de test y de accion.
Por ultimo por ejemplo para el Pic Simulator IDE que no he probado me imagino que es con las correspondientes instrucciones TRIS(puerto)= 0 para salida y =1 cuando sean entradas.
Con el compilador proton tambien es asi.
Te digo que creo que es asi por que la version que tengo de PSI es la 6.65 y no soporta tu micro, en el momento que necesite utilzar alguno de la serie 16F88x me actualizare la version.

Fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis en 18 de Enero de 2010, 02:48:18
Bueno en principio para lo que planteas creo que es mas que suficiente con el 16F887.
Si quieres utilizar 8 entradas -8 salidas pues ya sabes en los ejempls hemos puesto 4 pues seria añadir los restantes para las i/o que quedan.
Respecto a las prioridades pues segun sean así deberan ser las condiciones de test y de accion.
Por ultimo por ejemplo para el Pic Simulator IDE que no he probado me imagino que es con las correspondientes instrucciones TRIS(puerto)= 0 para salida y =1 cuando sean entradas.
Con el compilador proton tambien es asi.
Te digo que creo que es asi por que la version que tengo de PSI es la 6.65 y no soporta tu micro, en el momento que necesite utilzar alguno de la serie 16F88x me actualizare la version.

Fermin

Yo diria que es demansiado usar el 16f887, en todo caso deberias usar uno mas pequeño como el 16F627A o posiblemente un GAL16V8, pero si es lo que tienes al alcance pues ni modo, recordemos que a la hora de diseñar se trabaja con lo que se tiene no con lo que se bebe.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: dogflu66 en 18 de Enero de 2010, 07:42:17
La verdad es que para un programa tan simple lo mejor es una GAL, ya que con los micros no basta que el programa haga la tarea encomendada, también hay que añadirle las protecciones de bloqueos y protecciones antiparasitarias varias por soft, más las protecciones antiparasitarias por hard o componentes físicos en la placa de circuito impreso para esta función. Si no hacemos esto corremos el riesgo de que funcione el circuito en el laboratorio y en el simulador, pero no funcione o de problemas en el sitio. Las GAL por su estructura interna en general simplifican todo esto, pero el uso de las GAL conlleva otro tipo de método o entorno de desarrollo con sus propias particularidades.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 18 de Enero de 2010, 19:31:06
no sabia de la existencia de esas gal pero por lo ke he mirado me inclino mas a algo parecido al 16F627A ke me decis pero si existiera uno ke solo tuviera un porta y un portb y sus patillas solo como I/O simplificaria un poco todo. me evitaria la instruccion de configurar todo como I/O ke tengo ke hacer en el pic16f887 con ANSEL = 0  Y ANSELH = 0

Porcierto no consigo establecer la prioridad ke corrigiera el estado de !!  indecision del pic !!! de encender ke dos led cuando habian 3 simultaneos .
lo he intentado hacer (en papel primero pero no se plantearlo ) por prioridad de los 2 bit mas altos o mas bajos de los pulsados ya ke hasta ke no sepa como hacerlo segun las temperaturas leidas por los ds1820 ke espero poder ser capaz algundia de programar me tengo ke conformar con decisione numericas
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 19 de Enero de 2010, 06:46:03
Podrias utilizar para esos menesteres el PIC16F84 o 16F84A estos solo tiene I/O digitales, sin dada adicional, aunque estan en proceso de dejarse de fabricar, creo.
Un sustituto natural a ellos puede ser el PIC16F88

Fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis en 19 de Enero de 2010, 14:30:55
Podrias utilizar para esos menesteres el PIC16F84 o 16F84A estos solo tiene I/O digitales, sin dada adicional, aunque estan en proceso de dejarse de fabricar, creo.
Un sustituto natural a ellos puede ser el PIC16F88

Fermin

Tengo entendido que el PIC16F84A en la actualidad es más caro que el PIC16F627A y este ultimo posee mejores prestaciones que el primero.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 19 de Enero de 2010, 15:29:58
Efectivamente Bigluis tienes razon.
Mi razon para esponer el 16F84 fue debido a que el creador del post preguntaba que si no habia un micro con solo los pines de I/O para evitar complicaciones a la hora de las configuraciones iniciales.

fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis en 19 de Enero de 2010, 17:30:25
Otra razon por la que aconsejo que uses el PIC16F627A es que lo puedes configurar para que tenga 16 pines de I/O, es decir podrías usar 8 como entradas y 8 como salidas. El 16F88 también tiene esa característica.

Pero tambien puedes hacer un teclado matricial de 4x2 o 3x3 para obtener 8 ó 9 botones de entrada, y solo utilizarías 6 pines, con lo cual el 16F84 te serviría.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 19 de Enero de 2010, 19:04:54
pufff lo ke me faltaba complicarlo todo aun mas con un teclado , pero sitodavia no he reuelto el problema con pulsadores simles ya ke estoy probando con las 8 in y 8 out con el pic16f887 pero voy a empezar a hacer pruebas con el 16f627a ke me decis pero pregunto las intruccione s de inicio son tambien ansel y anselh = 0 como en el 16f887 ???
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Fer_TACA en 20 de Enero de 2010, 15:33:30
Amigo hay que mirar el datasheet y hay explica como configurarlo.

Cada uno tiene su forma de realizarlo.

Fermin
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: Strepto en 20 de Enero de 2010, 18:29:50
En mi caso por ejemplo, usando el Proton, para configurar los puertos es casi todo el rato lo mismo, lo unico que si tiene conversores adc tengo que añadir la linea all_digital = true y todo solucionado  :lol:

Un saludo!
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 23 de Enero de 2010, 19:29:40
bueno pues yo sigo con lo mio y ya estoy intentandolo paso a paso pero ahora con el pic 16f628a pero resulta ke no se encienden los led de portb.6 ,7 y 8. este es el codigo



program ecli

trisa.0 = 1
trisa.1 = 1
trisa.2 = 1
trisa.3 = 1
trisa.4 = 1
trisa.5 = 1
trisa.6 = 1
trisa.7 = 1
trisb.0 = 0
trisb.1 = 0
trisb.2 = 0
trisb.3 = 0
trisb.4 = 0
trisb.5 = 0
trisb.6 = 0
trisb.7 = 0
CMCON=7
main:

portb = %00000000
                     '
WHILE TRUE
while (porta.0 + porta.1 + porta.2 + porta.3 + porta.4 + porta.5 + porta.6 + porta.7) <=2

if  porta.0 = 1  then portb.0 = 1 else   portb.0 = 0  delay_ms(20)
end if
if  porta.1 = 1  then portb.1 = 1 else   portb.1 = 0  delay_ms(20)
end if
if  porta.2 = 1  then portb.2 = 1 else   portb.2 = 0  delay_ms(20)
end if
if  porta.3 = 1  then portb.3 = 1 else   portb.3 = 0  delay_ms(20)
end if
if  porta.4 = 1  then portb.4 = 1 else   portb.4 = 0   delay_ms(20)
end if
if  porta.5 = 1  then portb.5 = 1 else   portb.5 = 0   delay_ms(20)
end if
if  porta.6 = 1  then portb.6 = 1 else   portb.6 = 0  delay_ms(20)
end if
if  porta.7 = 1  then portb.7 = 1 else   portb.7 = 0  delay_ms(20)
end if
wend
wend
end.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 24 de Enero de 2010, 08:38:42
me corijo queria decir los led de porta.5, 6 y 7
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 en 24 de Enero de 2010, 18:49:46
He adaptado el codigo de dogflu66 para ke funcione con el pi16f628a , para 8 entradas 8 salidas , y para mikrobasic . Lo de los parentesis en (flag=0) los he puesto porque daba error al compilarlo pero lo ke pasa es ke no se enciende ningun los led de portb al pulsar porta. veis si se me ha pasado algo???


program ecli
Dim contador As Byte
Dim flag As Byte
TRISA = %11111111
TRISB = %00000000
Cmcon=7
main:
flag = 0
contador = 0
portb = %00000000
If PORTA.0 = 1 And (flag=0) Then
         PORTB.0 = 1
 Else
    If PORTA.0 = 0 And (flag = 0) Then
                PORTB.0 = 0
         Delay_ms (100)
      End if
   End if
   Gosub ctrol_nbit

   If PORTA.1 = 1 And (flag = 0) Then
      PORTB.1 = 1
   Else
      If PORTA.1 = 0 And (flag = 0) Then
         PORTB.1 = 0
         Delay_ms (100)
      End if
   End if
   Gosub ctrol_nbit

   If PORTA.2 = 1 And (flag = 0) Then
      PORTB.2 = 1
   Else
      If PORTA.2 = 0 And (flag = 0) Then
         PORTB.2 = 0
         Delay_ms (100)
      End if
   End if
   Gosub ctrol_nbit

   If PORTA.3 = 1 And (flag = 0) Then
      PORTB.3 = 1
   Else
      If PORTA.3 = 0 And (flag = 0) Then
         PORTB.3 = 0
         Delay_ms (100)
      End if
   End if
   Gosub ctrol_nbit

   If PORTA.4 = 1 And (flag = 0) Then
      PORTB.4 = 1
   Else
      If PORTA.4 = 0 And (flag = 0) Then
         PORTB.4 = 0
         Delay_ms (100)
      End if
   End if
   Gosub ctrol_nbit
If PORTA.5 = 1 And (flag = 0) Then
      PORTB.5 = 1
   Else
      If PORTA.5 = 0 And (flag = 0) Then
         PORTB.5 = 0
         Delay_ms (100)
      End if
   End if
   Gosub ctrol_nbit

If PORTA.6 = 1 And (flag = 0) Then
      PORTB.6 = 1
   Else
      If PORTA.6=0 And (flag = 0) Then
         PORTB.6 = 0
         Delay_ms (100)
      End if
   End if
   Gosub ctrol_nbit

If PORTA.7 = 1 And (flag = 0) Then
      PORTB.7 = 1
   Else
      If PORTA.7 = 0 And (flag = 0) Then
         PORTB.7 = 0
         Delay_ms (100)
      End if
   End if
   Gosub ctrol_nbit



Goto main

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
        end if
        end if
        end if
        end if
        end if
        end if
        end if
        end if
        end if
Return

end.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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


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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 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)
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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. :-/

Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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


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 (http://www.todopic.com.ar/foros/index.php?topic=13762.msg80995#msg80995) posteado hace rato en el foro.

 :-/ Espero haber sido lo suficientemente claro, gracias por leer mis mensajes.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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.


Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis 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 (http://www.todopic.com.ar/foros/index.php?topic=29008.msg243079#msg243079) 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.
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: janiro74 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
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: ubvredes 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
(http://)
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: ubvredes en 17 de Abril de 2012, 19:46:15
Saludos nuevamente, he podido resolver el punto numero 1 y el numero2. Aun estoy en el punto numero 3, no he logrado que cuando le dé click se ponga en "on", y cuando le dé click nuevamente en el puslador se coloque en "off". Todo esto debe visualizarse en el lcd.


gracias
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: bigluis en 17 de Abril de 2012, 20:47:14
Prueba a cambiar estas líneas

Código: [Seleccionar]
Print At 3,-3, "led1 :  ON -OFF- "
Print At 4,-3, "led2 : -ON- OFF "

por estas

Código: [Seleccionar]
Lcd_Out(3,3,"led1 :  ON -OFF- ")   
Lcd_Out(3,4,"led2 : -ON- OFF ")

Si no me equivoco eso te esta dando errores
Título: Re: hacer funcionar 5 salidas comandadas por 5 pulsadores con una condicion
Publicado por: ubvredes en 17 de Abril de 2012, 21:05:13
De hecho no tenbgo errores en la compilacion, y cuando lo simulo en proteus en mi circuito; me enciende cuando presiono una vez y me muestra el led que enciendo en el lcd. Pero cuando le doy click nuevamente en el pulsador no me cambia a "off" y tampoco se apaga el led. La unica forma que me cambie es que presione otro pulsador.

este es el codigo que tengo ahora.


Device =16F877
Xtal = 4

Dim sec As Byte

Dim aux As Byte
     
TRISA.0=1
TRISA.1=1
TRISA.2=1

TRISB.0=0
TRISB.1=0
TRISB.2=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
 pantalla:
    Cls
    Print At 2,1, "led0 : ON  OFF "
    Print At 3,-3, "led1 : ON  OFF "
    Print At 4,-3, "led2 : ON  OFF "
 

inicio:

If PORTA=0 Then
   
   ElseIf uno=0 And dos=0 And tres=0 Then
            GoTo inicio
   
    ElseIf uno=1  And dos=0 And tres=0 Then       
             GoTo op1
           
            ElseIf uno=0 And dos=1 And tres=0 Then
                    GoTo op2
     
                ElseIf uno=0 And dos=0 And tres=1 Then
                        GoTo op3 
 EndIf



conteo:
PORTA= 1
   
   
  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





 
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 200
    GoTo inicio

op2:                         
     PORTB.0=0
     PORTB.1=1
     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 200
 
   GoTo inicio
   
   
op3:                         
     PORTB.0=0
     PORTB.1=0
     PORTB.2=1
     
    Print At 2,1, "led0 : ON -OFF- "
    Print At 3,-3, "led1 : ON -OFF- "
    Print At 4,-3, "led2 :-ON- OFF "
    DelayMS 200
     
     
  GoTo inicio