Autor Tema: Porblemas con Contador de entradas y salidas con PIC 16F84A en ASM  (Leído 2173 veces)

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

Desconectado Miss_Morgan

  • PIC10
  • *
  • Mensajes: 6
Buenas tardes!
Sere breve, e estado tratando de modificar este .asm que al recivir una señal, un contador en el LCD subia. lo quise modificar para que al dar dicha señal, mostrata el mensaje "Bienvenido" y subiera, ademas de que se pudiera dar otra señal que hiciera que el contador bajara junto al mensaje "Adios"
El problema es que al momento de probarlo, y pulsar la entrada que seria "Port A,4", la pantalla cambia a "Bienvenid" (sin o) y se queda trabado ahi, la entrada 3 de plano no hace nada. soy realmente principiante en esto asi que no tengo idea de que podria estar haciendo mal.
Agradeceria mucho que alguien me explicara.
E aqui el archivo


Código: ASM
  1. ;************************************** LCD_05.asm *************************************
  2. ;
  3. ;       ===================================================================
  4. ;         Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
  5. ;                       www.pic16f84a.com
  6. ;         Editorial Ra-Ma.  www.ra-ma.es
  7. ;       ===================================================================
  8. ;
  9. ; Cada vez que presiona el pulsador conectado al pin RA4 incrementa un contador
  10. ; visualizado en el centro de la primera línea de la pantalla.
  11. ; Otro boton lo decresera.
  12. ;
  13. ; ZONA DE DATOS **********************************************************************
  14.  
  15.         LIST            P=16F84A
  16.         INCLUDE         <P16F84A.INC>
  17.         __CONFIG        _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
  18.  
  19.         CBLOCK  0x0C
  20.         Contador                                                ; El contador a visualizar.
  21.         ENDC
  22.  
  23. #DEFINE  Pulsador1 PORTA,4                      ; Línea donde se conecta el pulsador.
  24. #DEFINE  Pulsador2 PORTA,3          ; Segundo Pulsador
  25.  
  26. ; ZONA DE CÓDIGOS ********************************************************************
  27.  
  28.         ORG     0
  29. Inicio
  30.         call    LCD_Inicializa
  31.         bsf             STATUS,RP0
  32.         bsf             Pulsador1                               ; Línea del pulsador se configura como entrada.
  33.         bcf             STATUS,RP0
  34.         clrf    Contador                                ; Inicializa contador y los visualiza por 1ª vez,
  35.         call    Visualiza
  36. Principal
  37.         btfss   Pulsador1                               ; Lee el pulsador.
  38.         call    Saludo                  ; displaya "Bienvenido"
  39.         call    IncrementaVisualiza             ; Si pulsa salta a incrementar y visualizar el
  40.         goto    Principal                               ; contador
  41. Secundario
  42.         btfss   Pulsador2                               ; Lee el pulsador.
  43.         call    Despedida               ; displaya "Buen dia"
  44.         call    DecrementaVisualiza     ; Si pulsa salta a Decrementar  y visualizar el
  45.         goto    Principal                               ; contador
  46.        
  47. ; Subrutina "IncrementaVisualiza" -------------------------------------------------------
  48. ;
  49. IncrementaVisualiza
  50.         call    Retardo_20ms                    ; Espera a que se estabilicen los niveles de tensión.
  51.         btfsc   Pulsador1                               ; Vuelve a leer el pulsador.
  52.         goto    Fin_Incrementa
  53.         incf    Contador,F                              ; Incrementa el contador y después lo visualiza.
  54. DecrementaVisualiza
  55.         call    Retardo_20ms                    ; Espera a que se estabilicen los niveles de tensión.
  56.         btfsc   Pulsador2                               ; Vuelve a leer el pulsador.
  57.         goto    Fin_Incrementa
  58.         decf    Contador,F                              ; Decrementa el contador y después lo visualiza.
  59. Saludo
  60.     call    Retardo_20ms
  61.         call    LCD_Inicializa
  62.         movlw   'B'
  63.         call    LCD_Caracter
  64.         movlw   'i'
  65.         call    LCD_Caracter
  66.         movlw   'e'
  67.         call    LCD_Caracter
  68.         movlw   'n'
  69.         call    LCD_Caracter
  70.         movlw   'v'
  71.         call    LCD_Caracter
  72.         movlw   'e'
  73.         call    LCD_Caracter
  74.         movlw   'n'
  75.         call    LCD_Caracter
  76.         movlw   'i'
  77.         call    LCD_Caracter
  78.         movlw   'd'
  79.         call    LCD_Caracter
  80.         movlw   'o'
  81.         goto    Fin_Incrementa
  82. Despedida  
  83.     call    Retardo_20ms
  84.         call    LCD_Inicializa
  85.         movlw   'A'
  86.         call    LCD_Caracter
  87.         movlw   'd'
  88.         call    LCD_Caracter
  89.         movlw   'i'
  90.         call    LCD_Caracter
  91.         movlw   'o'
  92.         call    LCD_Caracter
  93.         movlw   's'
  94.         goto    Fin_Incrementa
  95. Visualiza
  96.         movlw   .7                                              ; Se sitúa en el centro de la línea 1.
  97.         call    LCD_PosicionLinea1
  98.         movf    Contador,W
  99.         call    BIN_a_BCD                               ; Se debe visualizar en decimal.
  100.         call    LCD_Byte
  101. EsperaDejePulsar
  102.         btfss   Pulsador1
  103.         btfss   Pulsador2
  104.         goto    EsperaDejePulsar
  105. Fin_Incrementa
  106.         return
  107.  
  108.         INCLUDE  <RETARDOS.INC>
  109.         INCLUDE  <BIN_BCD.INC>
  110.         INCLUDE  <LCD_4BIT.INC>
  111.         END
  112.        
  113. ;       ===================================================================
  114. ;         Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
  115. ;         E. Palacios, F. Remiro y L. López.           www.pic16f84a.com
  116. ;         Editorial Ra-Ma.  www.ra-ma.es
  117. ;       ===================================================================

pd. si este tipo de hilos no pertenece aqui, porfavor indiquenmelo, lo borrare y cambiare.
« Última modificación: 28 de Mayo de 2016, 13:17:14 por Miss_Morgan »

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Porblemas con Contador de entradas y salidas con PIC 16F84A en ASM
« Respuesta #1 en: 27 de Mayo de 2016, 20:00:41 »
No aconsejo copiar ningun codigo porque no se aprende y ademas es mas dificil a veces modificarlo que hacer uno propio.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Porblemas con Contador de entradas y salidas con PIC 16F84A en ASM
« Respuesta #2 en: 28 de Mayo de 2016, 01:02:56 »
No aconsejo copiar ningun codigo porque no se aprende y ademas es mas dificil a veces modificarlo que hacer uno propio.

Soymoe respeto tu opinion, pero no la comparto. Yo me considero autodidacta en varias materias y siempre he aprendido mucho de revisar y modificar trabajos de otros para mis propios usos. Por supuesto que no me limito a ello, siempre que puedo diseño mi propio codigo.

Miss_Morgan no trabajo ni conozco el Ensamblador de los PIC, por tanto mi ayuda se limita a lo evidente. Veo que la "o" de Bienvenido no te sale porque falta una linea "call LCD_Caracter" despues de esa "o".
Por otro lado creo que el segundo pulsador no lo lee porque creo que deberia estar dentro de la misma subrutina que el primero, con el operador correspondiente, quizas un "OR". Igualmente al comprobar que se dejo de pulsar uno u otro. Yo buscaria un programa donde se traten dos pulsadores, para comparar el codigo y adaptarlo.
Finalmente deduzco que quieres implementar un contador de personas. Para ello deberias tener en cuenta los dos pulsadores, (fotocelulas), a la vez. De modo que el programa compare que pulsador se activo primero y en funcion de ello sepa si la persona entra o sale y por tanto realice la tarea adecuada.
Espero te sirva mi comentario, al menos como orientacion.

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Porblemas con Contador de entradas y salidas con PIC 16F84A en ASM
« Respuesta #3 en: 28 de Mayo de 2016, 10:12:01 »
Como dijo AcoranTf te esta faltando los call LCD_Caracter.

La funcion LCD_Caracter, lo que hace es tomar lo que esta en W y ponerlo en el LCD. Es por eso que se hace esto:


Código: ASM
  1. movlw   'd'
  2.         call    LCD_Caracter


Tenes el mismo problema en dos lados ( donde se pone el dato en W, pero luego no se llama la funcion para que lo pase al LCD):

Código: ASM
  1. movlw   'o'
  2.         goto    Fin_Incrementa

y

Código: ASM
  1. movlw   's'
  2.         goto    Fin_Incrementa

---------------------------------

Despues hay otros errores, que aconsejo mas empezar con encender una salida ( led ), y no un LCD para que puedas ver el error facilmente.

Código: ASM
  1. EsperaDejePulsar
  2.         btfss   Pulsador1
  3.         btfss   Pulsador2
  4.         goto    EsperaDejePulsar
  5. Fin_Incrementa
  6.         return

Eso esta mal implementado seguro, vos intentabas hacer que solo avance si es que los 2 botones se dejaron de pulsar. PERO el BTFSS no se queda alli esperando sino que salta 1 instruccion o sigue de largo según el estado del pulsador. El primer BTFSS Pregunta si Pulsador1 esta en 1, si esta en 1 ejecuta el goto, si esta en 0 pasa al otro BTFSS.

Asi que la unica forma de salir de alli es que Pulsador2 este en 1 y que Pulsador1 este en 0. No creo que uses una logica asi en las entradas, normalmente lo haces para todos iguales. Distinto seria algo asi:

Código: ASM
  1. EsperaDejePulsar
  2.         btfss   Pulsador1
  3.         goto    EsperaDejePulsar
  4.         btfss   Pulsador2
  5.         goto    EsperaDejePulsar
  6. Fin_Incrementa
  7.         return

Ahora si cuando los 2 esten en 1 van a pasar al RETURN.

-------------------------------------------------------------------------

Mas cosas sin sentido que encontre:

Código: ASM
  1. Principal
  2.         btfss   Pulsador1                               ; Lee el pulsador.
  3.         call    Saludo                  ; displaya "Bienvenido"
  4.         call    IncrementaVisualiza             ; Si pulsa salta a incrementar y visualizar el
  5.         goto    Principal                               ; contador
  6. Secundario
  7.         btfss   Pulsador2                               ; Lee el pulsador.
  8.         call    Despedida               ; displaya "Buen dia"
  9.         call    DecrementaVisualiza     ; Si pulsa salta a Decrementar  y visualizar el
  10.         goto    Principal

Sigamos el flujo del programa, Entra a Principal, pregunta por el pulsador, si esta en 1 se salta el CALL Saludo, ejecuta el Incrementa Visualiza y luego salta a principal.
Secundario nunca se va a ejecutar!, Por lo cual Despedida o DecrementaVisualiza nunca se van a llamar.

Sigamos un poco mas.

Código: ASM
  1. IncrementaVisualiza
  2.         call    Retardo_20ms                    ; Espera a que se estabilicen los niveles de tensión.
  3.         btfsc   Pulsador1                               ; Vuelve a leer el pulsador.
  4.         goto    Fin_Incrementa
  5.         incf    Contador,F                              ; Incrementa el contador y después lo visualiza.
  6. DecrementaVisualiza
  7.         call    Retardo_20ms                    ; Espera a que se estabilicen los niveles de tensión.
  8.         btfsc   Pulsador2                               ; Vuelve a leer el pulsador.
  9.         goto    Fin_Incrementa
  10.         decf    Contador,F                              ; Decrementa el contador y después lo visualiza.

Miremos el codigo nuevamente. Un delay primero, luego pregunta por si esta en 0 Pulsador1..  Si sigue en 1 ejecuta el GOTO Fin_Incrementa, que solo posee un RETURN, y que por lo tanto podrias tener un RETURN ahi puesto. Si esta en 0 el pulsador Aumenta Contador Y ejecuta todo lo siguiente! , Supuestamente DecrementaVisualiza era del pulsador 2, pero se esta ejecutando, ya que no hay ningun RETURN o algo por el estilo.

Aun peor, si suponemos que "Secundario" funciona, y entra en DecrementaVisualiza y llega al decf Contador, lo proximo que se va a ejecutar es "Saludo"!
Por que no hay nada que lo frene o lo envie para otro lado

Otra cosa, para que el pulso del  boton sea detectado, desde que se detecto en principal que estaba en 1, mientras se mantenga en 1 va a ejecutar el call Saludo miles de veces. Innecesariamente.

Algo distinto seria asi:

Código: ASM
  1. Principal
  2.         btfss   Pulsador1               ; Lee el pulsador.
  3.         call    Boton1Presionado        ; displaya "Bienvenido"
  4.         btfss   Pulsador2               ; Lee el pulsador.
  5.         call    Despedida               ; displaya "Buen dia"
  6.         goto    Principal        
  7.  
  8. Boton1Presionado
  9.         call    Retardo_20ms            ; Espera a que se estabilicen los niveles de tensión.
  10.         btfsc   Pulsador1               ; Vuelve a leer el pulsador.
  11.         GOTO    $-1                     ; Espero que se suelte, es decir ejecuto el BTFSC hasta que sea 0
  12.         call    Saludo                  ; Se solto, entonces muestro el mensaje de Bienvenido
  13.         incf    Contador,F              ; Incrementa el contador, por si lo queres para algo
  14.         RETURN                          ; Vuelvo del CALL!
  15.  
  16. Boton2Presionado
  17.         call    Retardo_20ms            ; Espera a que se estabilicen los niveles de tensión.
  18.         btfsc   Pulsador2               ; Vuelve a leer el pulsador.
  19.         GOTO    $-1                     ; Espero que se suelte, es decir ejecuto el BTFSC hasta que sea 0
  20.         call    Despedida                       ; Se solto, entonces muestro el mensaje de Bienvenido
  21.         decf    Contador,F              ; Decrementa el contador, por si lo queres para algo
  22.         RETURN                          ; Vuelvo del call!

En Principal si algun boton esta en 1 ejecuta el CALL y entra a una funcion, ahi dentro de esa funcion se asegura que luego el usuario SUELTE el boton, de esa forma solamente se ejecuta cuando se encuentra que se presiono Y se solto el boton. Si no ocurre eso no pasa a ejecutar lo demas.

Finalmente cuando se suelta, ejecuta el Saludo o Despedida, incrementa o decrementa el contador por si en algun lado queres mostrarlo, y por ultimo ejecuta el RETURN que corresponde a los CALL de "Principal".

PD:

El GOTO $-1

Solo indica que ejecute lo que esta 1 direccion antes del GOTO, seria equivalente a hacer esto:

Etiqueta
      BTFSS   Algo
      GOTO    Etiqueta

Supongamos que la direccion de memoria del BTFSS es 0x10, Etiqueta tiene un valor de 0x10, no es una instruccion, solo un "nombre" para el lugar ese. el GOTO va a tener la direccion 0x11.
Lo equivalente seria o para el compilador seria algo asi:

Código: [Seleccionar]
Etiqueta
0x10:      BTFSS   Algo
0x11:      GOTO    0x10

Nosotros no podemos saber nunca que direccion va a tener la instruccion anterior, por eso usamos la "Etiqueta", Pero podemos hacer uso de "$", el $ indica la direccion de la linea actual, es decir si estoy en 0x11 y uso el $, esta va a valer 0x11, si quiero saltar 1 lugar antes entonces le resto 1.

Código: [Seleccionar]
0x10:      BTFSS   Algo
0x11:      GOTO    $-1

Lo bueno es que no necesito de Etiqueta, en resumen le digo que salte ( repita ) la instruccion anterior con el GOTO $-1
« Última modificación: 28 de Mayo de 2016, 10:20:17 por KILLERJC »

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Porblemas con Contador de entradas y salidas con PIC 16F84A en ASM
« Respuesta #4 en: 28 de Mayo de 2016, 11:26:42 »
Que palabra rara "displaya"

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Porblemas con Contador de entradas y salidas con PIC 16F84A en ASM
« Respuesta #5 en: 28 de Mayo de 2016, 11:52:01 »
Que palabra rara "displaya"

Ni siquiera me habia dado cuenta, no mire los comentarios aunque son los comentarios de el. Y algunos que puse yo. Pero eso no lo habia leido

Desconectado Miss_Morgan

  • PIC10
  • *
  • Mensajes: 6
Re:Porblemas con Contador de entradas y salidas con PIC 16F84A en ASM
« Respuesta #6 en: 28 de Mayo de 2016, 13:16:39 »
¡Muchas gracias AcoranTF (yo tambien soy muy autodidacta, asi que hacer esto me ayuda mucho) y KILLERJC!
Lo modificare, pero lamentablemente no lo podre comprobar hasta el lunes (caresco de grabador de pics propio)

Solo para quedar claros, los "incrementa/decrementa" necesitan un return cada uno y reconstruir la parte de "principal secundario"?
En cuyo caso, si agrego la parte que KILLERJC puso, elimino entonces los "incrementa decrementa?

Ademas, en esta parte
Código: ASM
  1. Inicio
  2.         call    LCD_Inicializa
  3.         bsf    STATUS,RP0
  4.         bsf    Pulsador1                               ; Línea del pulsador se configura como entrada.
  5.         bcf    STATUS,RP0
  6.         clrf    Contador                                ; Inicializa contador y los visualiza por 1ª vez,
  7.         call    Visualiza

Deberia agregar un "bsf  pulsador 2"?
« Última modificación: 28 de Mayo de 2016, 13:36:54 por Miss_Morgan »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Porblemas con Contador de entradas y salidas con PIC 16F84A en ASM
« Respuesta #7 en: 28 de Mayo de 2016, 14:25:17 »
Lo que estas haciendo ahi es poner los pines como entrada. ( Modificando los registros TRISx, banco 1 )

Ocupan la misma direccion que los PORTx por eso podes usar Pulsador1 y funciona.

En el reset comienzan todas como entradas, por lo cual si el codigo de LCD_Inicializa no los toca, estos seguiran como entradas. Y no es necesario ponerlos a 1 por que ya lo estan.


 

anything