TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: attipax en 19 de Diciembre de 2014, 04:37:02

Título: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: attipax en 19 de Diciembre de 2014, 04:37:02
hola buenas, estoy recién dando mis primeros pasos en MPLAB y no logro hacer que los botones se independicen uno del otro. les cuento son dos pulsadores y dos display conectados al PIC 16F84A al presionar cualquiera de los dos pulsadores solamente me sale el conteo de 0 a 9 con los dos pulsadores. tratare de explicarme mejor,
 el Pulsador1 y el Pulsador2 al momento de presionarlo en el display1 me debe aparecer sus respectivos números 1 o 2, y en el  display2 independiente que pulsador presione este debe contar ascendiendo de 0 a 9 mostrándolo en el display2.

a eso me refería que no lograba hacer que los pulsadores fueran independiente ya que al presionar el pulsador1 o el pulsador2 me muestra en el display2 el conteo de 0 a 9, pero en el display1 no me muestra el pulsador que presione 1 o 2 sigue hasta el 9
 les dejo el código en una hoja de texto, así me pueden decir en que me estoy equivocando, desde ya muchas Gracias.
saludos
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: tapi8 en 19 de Diciembre de 2014, 07:41:42
Bienvenido al foro attipax

Es que no pueden contar de manera independiente porque estan unidos y activados los dos siempre ¿No?.

Con esos dos pines que te quedan libres tendras que poner dos transistores desde el K comun de los displays a masa y activar el que quieras que se vea, ten cuidado porque uno es RA4 que es open drain, mejor usa este como estrada y pon otro para activar en display.
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: KILLERJC en 19 de Diciembre de 2014, 10:45:07
Con esos dos pines que te quedan libres tendras que poner dos transistores desde el K comun de los displays a masa y activar el que quieras que se vea, ten cuidado porque uno es RA4 que es open drain, mejor usa este como estrada y pon otro para activar en display.

Aporto una imagen para que se entienda mejor:
(http://i657.photobucket.com/albums/uu300/BlogAqueronte/LaunchPad%20MSP430/7%20Segmentos/5.png)

Tambien para no complicarte con el programa deberias hacerte un circuito antirebote

(http://perso.wanadoo.es/pictob/imagenes/antireb.gif)


Tu programa tambien tiene unos errores:
- En ningun momento activas las salidas RA2 y RA3 para producir el multiplexado
- Ambos botones tienen el mismo codigo ( no hay limite a 5 )
- Solo mostras cuando se presiono un boton (Si no tenes presionado nada quedaria fijo y no producirias el multiplexado, me refiero que el mostrar en el display es dependiente de los switchs)
- Tenes una sola variable, se puede hacer asi, pero como pensas llevar los 2 numeros (decenas y unidades) en una misma variable?

En ese ultimo si estas corto de RAM y queres complicartela, podes usar un nibble para cada uno, los 4 bits mas altos para las decenas y luego los 4 bits mas bajos para las unidades. y Con swapf + andlw lo tendrias.
Pero mejor no complicarla y crear 2 variables: DECENAS y UNIDADES

Entonces haces algo asi:
Código: [Seleccionar]
Inicio
bsf STATUS,RP0 ;Pone a 1 el bit 5 del STATUS. Acceso al Banco 1
clrf TRISB ;Las Lineas del Puerto B se configuran como Salidas
movlw b'00000011' ; Las 2 líneas del Puerto A se configuran como entrada.
movwf TRISA ;Las Lineas del Puerto A se Configuran como Entradas
bcf STATUS,RP0 ;Pone a 0 el bit 5 de STATUS. Acceso al Banco 0
                clrf   UNIDADES
                clrf   DECENAS


Config_7Seg
movlw .0
call Binario_7Seg
movwf PORTB

Principal
btfss PORTA,PulsadorM1 ;Testeamos si esta a 1 logico(¿El Bit "PulsadorM1" del PuertoA esta en 1 Logico?)
call Sumar ;Salta a la Etiqueta Sumar
btfss PORTA,PulsadorM2 ; Testeamos si esta a 1 logico (¿El Bit "PulsadorM2" del PuertoA esta en 1 Logico?)
call Sumar2
call   MostrarDisplay
goto Principal ;vuelve o salta a la etiqueta Principal
Sumar
incf UNIDADES,F ;Incrementar "UNIDADES" en 1. Solo se resetea con el Binario_7seg o quitarlo de ahi y usar un sublw para cuando valga 10 y borrarlo aca.
return
Sumar2
incf DECENAS,F                  ;Incremento el valor de las decenas
movf DECENAS,W
sublw b'00000110'        ; Si llego a 6 es por que se paso, al restarle 6 a 6 me queda 0 por lo tanto se activa la bandera Z
btfsc         STATUS,Z
                clrf    DECENAS                   ; Si era 6, pongo a 0
return

MostrarDisplay
               bcf PORTA,2                         ; Desactivo el display de las decenas que active al ultimo de esta subrutina
               movf UNIDADES,W                ; unidades al portb y activo display de Unidades
               call Binario_7seg
               movwf PORTB
               bsf PORTA,3
               ;deberia hber una muy pequeña demora aca (15 ciclos por ahi para que sea equivalente el tiempo en ambos displays)
               movf DECENAS,W                 
               call Binario_7seg
               bcf PORTA,3                        ; desactivo el display de unidades, pongo el valor de decenas en portb y activo display de decenas
               movwf PORTB
               bsf PORTA,2
               return

En si lo que hago es:

- Utilizar call para que cuando se termine mi "subrutina" vuelva a donde dejo mi programa principal,
- El programa principal cuenta con lectura de los 2 switchs y mostrar en el display,
- El codigo de los switchs es simplemente incrementar la variable y en el caso del segundo pulsador revisa que si es 6 ( era 5 y se incremento, pase nuevamente a 0 ).
- El mostrar usa un "multiplexado" activo un display ( poniendo un 1 en la base del transistor de esa forma conduce y deja pasar corriente a GND ) y muestro en el PORTB, luego desactivo ese display y activo el otro y muestro en el PORTB el otro valor.

En el programa que pase (no se si hay un error ya que no lo simule ni compile) cumple con lo que dije antes, pero si mantenes presionado el boton va a contar muy rapido, o si presionas tal ves cuente muchas veces antes que lo soltes. Podrias preguntar por que la entrada se ponga a 0 y encerrarte en un loop para siempre pero esto haria que no se muestre en el display nada hasta que salgas. Una solucion es guardar el valor del puerto y revisar que cambie al momento de entrar nuevamente a la funcion de switch.
Ejemplo si mi PORTA esta en 0000 0010 , esto lo guardo en una variable que llamaremos backupPuerto
Cuando entro a cada switch pregunto si BackupPuerto es igual, si no es igual Y el pin esta en 1. ejecuto el codigo del switch y actualizo backupPuerto, si es igual quiere decir que ya paso por ahi asi que no deberia ejecutarlo.
La otra es usar interrupciones pero solo los PORTB tienen esta funcion.

Si estas simulandolo no se si habra problemas pero en un PIC real tendrias ese problema
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: attipax en 19 de Diciembre de 2014, 13:26:01
Primero que nada muchas gracias por darme la bienvenida al foro, y estoy muy agradecido por sus respuestas ya que me han ayudado aclarar algunas cosas que no sabia, sobretodo lo del multiplexado. y el circuito anti-rebote.

al parecer anoche no supe explicarme bien sobre el uso de los display 1 y 2 ya que por la hora y todo lo que había leído y la frustración que solamente me salia el conteo de 0 a 9 con los dos pulsadores no me supe explicar. tratare de explicarme mejor,
 el Pulsador1 y el Pulsador2 al momento de presionarlo en el display1 me debe aparecer sus respectivos números 1 o 2, y en el  display2 independiente que pulsador presione este debe contar ascendiendo de 0 a 9 mostrándolo en el display2.

a eso me refería que no lograba hacer que los pulsadores fueran independiente ya que al presionar el pulsador1 o el pulsador2 me muestra en el display2 el conteo de 0 a 9, pero en el display1 no me muestra el pulsador que presione 1 o 2 sigue hasta el 9.

entonces con el multiplexado me puede ayudar que los display's me muestren los números independientes y agregando mas variables al código

desde ya muchas gracias a KILLERJC por aclararme mucho mas las cosas en este mundo de los microcontroladores PIC.
y a tapi8 por la bienvenida que me dio al foro, espero ser un aporte con guías o libros aunque ahora soy muy nuevo y ya que recién estoy aprendiendo esto que es la programación en MPLAB

modifique el circuito
ahora voy a buscar información como se puede haer el codigo para multiplexar los display, y les cuento como me va
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: KILLERJC en 19 de Diciembre de 2014, 13:59:33
Esta bien que es una simulacion pero te recuerdo que deberias de usar al menos un transistor BJT en el catodo, ya que sino estaria pasando la corriente de cada uno de los segmentos hacia el pin, y todo tiene un limite.
Ejemplo, con 330ohms y suponemos que tiene una caida de 2V el led, serian unos 9mA por segmento, al momento que prendes un 8 , serian 7 segmentos prendidos y estarias haciendo pasar 63mA por el pin, lo cual es mucho y te va a quemar el pin del PIC si lo haces en una placa/protoboard. Tienen un limite de corriente que entregan los pines y el puerto en conjunto.

Al menos esto es lo que se refirio tapi8 con su comentario y yo puse la imagen para que lo veas mas graficamente.

Es todo lo que tengo para decirte, lo del multiplexado queda para que lo averigues vos como lo vas a hacer. Suerte y luego nos contas como te salio.
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: tapi8 en 19 de Diciembre de 2014, 16:05:09
Yo siempre le recomiendo a los que empiezan este curso de ensamblador:

http://www.todopic.com.ar/foros/index.php?topic=24720.0

Tienes incluso eso medio hecho, con tres displays multiplexados, ahi es un contador ascendente, tu tendras que adaptarlo a lo que tu quieres. Si te lo damos todo hecho NO APRENDERAS, es preferible que lo hagas tu, si tienes dudas puntuales pregunta, y te ayudaremos.
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: attipax en 19 de Diciembre de 2014, 16:28:26
Muchas gracias KILLERJC y tapi8  por sus respuestas me han servido de mucho para aprender y aclarar mis dudas, ya modifique he inserte los transistores BJT npn al circuito que me dijo KILLERJC y ahora voy a echar un vistazo al link que me envió tapi8 así entenderé un poco mas de los display multiplexados. ahí les comento como va mi avance

desde ya Muchas gracias,saludos.
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: alexhumbertoa en 26 de Diciembre de 2014, 12:37:48
Hola, al ver el código me doy cuenta de que estas usando unidades y decenas, pero no logro entender porque las usas si solo estas usando un solo display para cada valor, es decir, en cual display mostraras unidades y en cual decenas?
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: KILLERJC en 26 de Diciembre de 2014, 13:34:12
Hola, al ver el código me doy cuenta de que estas usando unidades y decenas, pero no logro entender porque las usas si solo estas usando un solo display para cada valor, es decir, en cual display mostraras unidades y en cual decenas?

Por que yo entendi otra cosa con la explicacion en fin le sirvio como ejemplo
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: attipax en 26 de Diciembre de 2014, 19:19:15
Con el ejemplo que me dio KILLERJC me ayudo para entender y aclararme el tema de multiplexar los display. y vi que a mi código esta errado, porque solamente me cuenta de 0 a 9.
Y lo que estoy tratando de hacer no es un contador de números con ambos display, sino que uno de los display muestre solamente el numero del pulsador presionado ya sea pulsador 1 o pulsador 2

Y el segundo display vaya contando del cero al nueve, es muy parecido cuando uno va a una tienda y saca su numero y el vendedor con un pulsador hace que corra el numero de atención. pero en este caso es con dos pulsadores uno para cada vendedor y el conteo es de 0 a 9.

he estado leyendo bastante y viendo el ejemplo de multiplexar para entender mas el código assembler de MPLAB. incluso buscando encontré un PDF muy completo en Internet que me dice para que sirve cada una de las instrucciones que se utiliza en este lenguaje. la comparto ya que a muchos que se están iniciando les puede ayudar a saber que significa cada instrucción.

Y muchas Gracias a todos los que están comentando, porque cada granito de comentario de ustedes me ayuda para ir aprendiendo y entendiendo  cada día mas el lenguaje assembler de los PIC16F84A. ((:-))
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: KILLERJC en 26 de Diciembre de 2014, 20:07:10
he estado leyendo bastante y viendo el ejemplo de multiplexar para entender mas el código assembler de MPLAB. incluso buscando encontré un PDF muy completo en Internet que me dice para que sirve cada una de las instrucciones que se utiliza en este lenguaje. la comparto ya que a muchos que se están iniciando les puede ayudar a saber que significa cada instrucción.

Pero si en el datasheet te dice todas las instrucciones, hasta te explica que hace cada una :/
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: attipax en 29 de Diciembre de 2014, 17:51:50
      Primero que nada muchas gracias a todos por la ayuda que me han brindado.
Como recién son mis primeros pasos en MPLAB he leído y leído mucho a veces sin entender pero lo he vuelto a leer distintas guías y libros que ayudan a entender cómo se puede programar,  también he visto sus link y tomado nota de todos sus consejos y ejemplos que me han dado. No le pego mucho al inglés por eso no se me ocurrió ver el Datasheet del PIC16F84A, pero después de lo que me dijo KILLERJC lo empecé a ver con el traductor al lado.. xD, me ha costado pero de apoco he ido aclarando mis dudas en esto de la programación.
   Ahora les quiero mostrar mi avance en el código que he estado tratando de hacer. (Puede que sea muy simple, pero para mí es un avance a lo que sabía algunas semanas atrás que era prácticamente nada). Ahora el Display1 me muestra el número de los Pulsadores, ya sea el Pulsador 1 o el Pulsador 2. También el Display2 me muestra el conteo de 0 a 9 reiniciándose al final del conteo independiente que pulsador presionemos.
   Pero mi duda es que al momento de presionar el pulsador1 ó el pulsador2 a veces avanza y se salta rápidamente dos o más números…
¿Es un problema con el retardo?
EJ: Esto es lo que me sucede cada vez que se presiona el pulsador1 o el pulsador2 el Display2 debería incrementar de uno en uno hasta el 9 (Esto lo Hace), pero de vez en cuando al presionar cualquiera de los pulsadores el Display2 avanza del 1 al 3 o del 6 al 8 siendo que debería avanzar al número siguiente cada vez que presionemos alguno de los dos pulsadores.
Desde ya muchas Gracias por la respuesta
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: KILLERJC en 29 de Diciembre de 2014, 18:55:12
El problema es que estas revisando el nivel... vos tenes que pensar que el micro es muchisimo mas rapido que vos, entonces cuando presionas el boton lo podes tener presionado por 500ms siendo o no exagerado( Y en simulación va mas lento xD). En esos 500ms paso por esta condicion:

Código: [Seleccionar]
       btfss   PORTA,PulsadorM1        ;Testeamos si esta a 1 logico(¿El Bit "PulsadorM1" del PuertoA esta en 1 Logico?)
        call    M1    

unas x cantidad de veces, es por eso que ves que avanza por demas ( cuenta mucho mas ).
El circuito antirebote te proteje de que existan muchos pulsos en 1 y en 0 en tu entrada antes que se quede en el valor final hasta que se carga/descarga el capacitor. Con esto ya te aseguras que tengas o un 1 o un 0 y estes seguro que eso ocurra.
Pero queda arreglar el programa.

Se puede hacer de distintas formas, algunos micros ofrecen la posibilidad de detectar el flanco y producir una interrupcion. el PIC16F84A solo lo tiene en el RB0 para flanco ( RB4 a 7 son por nivel ) , pero vos necesitas 2. Asi mejor ver como hacerlo por software
Lo que se hacer yo para no limitar la velocidad del programa en no poder delays o quedarme esperando un evento es usar una variable que me guarde los datos del puerto. ( Digo puerto por que usualmente es mover los datos del PORT a esa variable )

Citar
Inicio
Se presiono el boton 1 ?
Voy a la funcion boton 1
Se presiono el boton 2 ?
Voy a la funcion boton 2
Estan ambos botones sueltos(ninguno presionado)?
Borro mi variable backuppuerto o cargo nuevamente con el valor puerto

Vuelvo al inicio

Funcion boton 1
Boton 1 presionado con anterioridad? ( pregunto por backuppuerto bit del boton 1 si esta en 0/1 como sea tu logica )
Return  (Es decir vuelvo, por que ya fue presionado y ya paso por esta funcion)

Aca hago mi funcion del boton 1 // en caso que no paso
Pongo en 1 o 0 (segun la logica que uses) a backuppuerto para indicar que por aqui ya paso
Rerturn

En negrita los cambios a tu programa

Lo mismo para el boton 2, entonces cuando se ejecuta por 1era vez el programa del boton 1 activa una flag (bandera ) avisandome que ya paso por ahi. Entonces mi primera condicion es que no pase nuevamente por ahi si ya paso antes.
En el programa principal yo puse que si ambos botones NO estan presionados me borre las flags, esto significa que para que pueda volver a entrar ambos botones deberian estar a sueltos, sino podria haberlo hecho individualmente para cada boton y eso no afectaria si presionas ambos juntos etc. Entonces tanto como hacerlo con ambos o individualmente cuando pasa por el punto ese del programa principal me resetea mis banderas si se cumple la condicion permitiendo que pueda entrar nuevamente.

Otros lo que hacen es preguntar si se presiono, llamar a la funcion y quedarse esperando en un loop para siempre preguntando si se solto el boton, tu programa principal quedaria de la misma manera y el del switch

Citar
Boton 1:
Se solto el boton? (si se solto salto )
Vuelvo a boton 1

Programa del boton 1
Return

Cambios a tu programa en negrita. Cabe recalcar que en este programa mientras no soltes el boton no va a salir de ahi, asi que si presionas el otro boton no va a haber diferencia.

La decision de cual programa elegir depende de como queres que funcione ante las distintas posiblidades que ocurran, una de las cosas que siempre tenes que tener en cuenta es cubrir cualquier posibilidad que pueda ocurrir y que responda de acuerdo a lo que queres. ( que presionen ambos botones, que tenga presionado 1 y luego presione el otro sin soltar el primero etc) si cumple tus condiciones del programa entonces esta bien.

Citar
No le pego mucho al inglés por eso no se me ocurrió ver el Datasheet del PIC16F84A, pero después de lo que me dijo KILLERJC lo empecé a ver con el traductor al lado.. xD, me ha costado pero de apoco he ido aclarando mis dudas en esto de la programación.

No es por desanimarte pero todo esta en ingles, yo tambien comence asi buscando palabritas que no entendia y hoy no tengo ningun problema en leer algo en ingles, Pero sea el datasheet que sea estan en ingles o en aleman o chino, pero lo mas comun es el  ingles. Y muchos de los problemas suelen resolverse solo leyendo el datasheet del micro :P. Creo haber renegado por los cambios en los por Rb4:7 que habia que leer el port obligatoriamente, no recuerdo si era eso, pero estaba en el datasheet y lo pase por alto xD. Incluso en el datasheet siempre te ayudan con formulas para el calculo de los registros y los pasos de inicializacion del modulo. Y tambien muchos ejemplos estan en ingles
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: attipax en 29 de Diciembre de 2014, 22:01:04
Muchas gracias por la respuesta KILLERJC han sido de gran ayuda tus comentarios, lo que quiero simular con este programa es muy parecido cuando vas a una tienda y sacas un número y el vendedor con un pulsador hace que corra el número de atención en el Display.

 En este caso es lo mismo, solo que la señal que envía para que corra el número de atención en el Display es con dos pulsadores uno para cada vendedor. Entonces es muy poco probable que (los vendedores) presionen al mismo tiempo ambos botones o que tenga presionado 1 y luego se presione el otro sin soltar el primero.

Ahora voy a seguir tu consejo de añadir lo que está en negrita en el programa y te cuento como me va, y ver si se arregla lo que te comente, que al presionar el pulsador a veces avanza más de un número a la vez.
Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: KILLERJC en 29 de Diciembre de 2014, 22:33:19
Sea el caso que sea el mejor es el primero por que si usas el segundo no va mostrarse en el display los datos entonces se va a apagar mientras tengas presionado, y para eliminar la posibilidad de que ambos toquen ( por SI las dudas ocurre ) en la condicion de cada boton pones que ambos esten sueltos para que se ejecute.

Título: Re: Ayuda no logro hacer que dos botones cuenten de manera independiente con PIC 16f
Publicado por: attipax en 05 de Enero de 2015, 20:52:32
Buenas Tardes y Feliz año nuevo a todos los del foro espero que lo hayan pasado muy bien junto a sus familias y que sus metas se les cumplan para este año que se nos viene.
También agradecerle a KILLERJC y a todos los que me han brindado su ayuda ya que gracias a ustedes he ido avanzando en este proyecto.
les comento el programa ya responde correctamente a medida que presiono los pulsadores pero no logro hacer que los displays vayan tan rápido como sea posible de tal modo que el ojo humano no note el cambio de display de uno al otro, se ve siempre ese parpadeo entre display. creo que tengo mal puesto el retardo pero no se me ocurre donde puede ir para solucionar este problema.
 
desde ya muchas gracias por sus respuestas
Saludos