Autor Tema: AYUDA - Decremento de una cuenta al pulsar un push button  (Leído 2794 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ty4115

  • PIC10
  • *
  • Mensajes: 3
AYUDA - Decremento de una cuenta al pulsar un push button
« en: 27 de Marzo de 2020, 22:01:20 »
Buenass, para introducir un poco, soy alguien nuevo que empieza en esto de la programacion con ensamblador y pues en mi instituto estudiamos circuitos electronicos y microcontroladores, el punto es, que todavia no logro saber como puedo decrementar una cuenta a la hora de pulsar un boton, y cuando me refiero a cuenta, me refiero a una variable que cuando le doy al boton deberia decrementar y luego esta variable se suma con un PCL  y este me da el contenido que se encuentre en el numero de columna de la variable; Por ahora solo puedo incrementar esa cuenta hasta llegar a 10 que es el limite para un display de 7 segmentos, pero necesito de verdad que alguien me ayude o que me de una sugerencia para poder hacer eso :(

NOTA:
La practica de la que hablo es un Sistema de Control que funcione con dos push buttons, el primero se encarga de incrementar la cuenta que va directo a un display de 7 segmentos (Sin Decodificador, esta prohibido) y el otro me debe decrementar esa cuenta y por tanto el numero que se muestre en el display, Utilice PCL para hacer una tabla y que esta me contenga los valores del display (1,2...etc) pero todavia no tengo idea de como decrementar ese valor y que el PCL me regrese el valor anterior a ese (Por ejemplo, si aumento mu cuenta hasta el numero 4 para que mi display muestre el 5 ,  tengo que hacer que con el otro boton esa cuenta disminuya al 3 y asi me muestre el 4 en el display)

Si de verdad me podrian dar consejos u ayudar estaria muy agradecido =)

Este es el codigo:


LIST P=PIC16F628A                         
INCLUDE <P16F628A.INC>
Incremento  EQU 0x0C
#DEFINE PushAumento PORTA,0
#DEFINE PushDecremento PORTA,7
        ORG 0
        bsf STATUS,5                               
        clrf PORTB     
   CLRF PORTA;
   bsf PORTA,0
   bsf PORTA,7
   bcf  STATUS,5                               
        movlw b'00000111'                             ; comparadores desactivados,
        movwf CMCON                                   ; I/O digitales.
        Clrf  PORTB          
   
   InicioAumentar
   btfss   PushAumento
   goto   FinAumentar
   call   Retardo_10ms
   call   ConfirmarA
   goto   InicioAumentar
   FinAumentar
   goto   InicioAumentar   
   ConfirmarA
   btfsc   PushAumento
   goto   ConfirmarA
   goto   Aumentar
   return
   Aumentar
   incf   Incremento,F
   movf   Incremento,W
   call   TABLADisplayA
   movwf   PORTB;
   return
   
   InicioDecre
   btfss   PORTA,7
   goto   FinDecre
   call   Retardo_10ms
   call   ConfirmarD
   goto   InicioDecre
   FinDecre
   goto   InicioDecre
   ConfirmarD
   btfsc   PORTA,7
   goto   ConfirmarD
   goto   Decrementar
   return
   Decrementar
   decfsz   Incremento,F
   movf   Incremento,W
   call   TABLADisplayA
   movwf   PORTB;
   return
   
   Borrar
   clrf Incremento
   return

TABLADisplayA
   subwf   PCL,F
   NOP
   retlw   b'00000110';
   retlw   b'01011011';
   retlw   b'01001111';
   retlw   b'01100110';
   retlw   b'01101101';
   retlw   b'01111101';
   retlw   b'00000111'
   retlw   b'01111111';
   retlw   b'01100111';
   movlw   d'10'
   call   Borrar
   retlw   b'00111111'
   
   
   INCLUDE <DISPLAYS.inc>
   INCLUDE   <RETARDO.inc>
   END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA - Decremento de una cuenta al pulsar un push button
« Respuesta #1 en: 28 de Marzo de 2020, 14:08:14 »
Yo lo plantearia asi:


Código: ASM
  1. Principal:
  2.   BTFSS PushAumento
  3.   CALL  Incrementar
  4.   BTFSS PushDecremento
  5.   CALL  Decrementar
  6.   CALL  Muestro
  7.   GOTO  Principal
  8.  
  9.  
  10. Incrementar
  11.    ;Mientras no suelte, me quedo aca atrapado, asi no cuenta muchas veces
  12.    call   Retardo_10ms
  13.    BTFSS   PushAumento  
  14.    GOTO   Incrementar
  15.    ; Incremento
  16.    INCF   Incremento, F
  17.    ; Verifico que no me pase, si me pase lo vuelvo a 9, sino dejo el numero como esta
  18.    MOVLW  d'10'
  19.    SUBWF  Incremento, W
  20.    BTFSS  STATUS, Z
  21.    RETURN
  22.    MOVLW  d'9'
  23.    MOVWF  Incremento
  24.    RETURN
  25.  
  26. Muestro
  27.   MOVWF   Incremento, W
  28.   CALL    TABLADisplayA
  29.   MOVWF   PORTB;
  30.   RETURN
  31.    
  32. Decrementar
  33.    call   Retardo_10ms
  34.    BTFSS   PushDecremento
  35.    GOTO   Decrementar
  36.    ; Decremento
  37.    DECF   Incremento, F
  38.    ; Reviso que no me pase, si me pase el resultado es 0xFF
  39.    COMF   Incremento, W
  40.    BTFSC  STATUS, Z
  41.    CLRF   Incremento
  42.    RETURN
  43.  
  44.    
  45.    Borrar
  46.    clrf Incremento
  47.    return
  48.  
  49. TABLADisplayA
  50.    subwf   PCL,F
  51.    retlw   b'00111111'; 0
  52.    retlw   b'00000110'; 1
  53.    retlw   b'01011011'; 2
  54.    retlw   b'01001111'; 3
  55.    retlw   b'01100110'; 4
  56.    retlw   b'01101101'; 5
  57.    retlw   b'01111101'; 6
  58.    retlw   b'00000111'; 7
  59.    retlw   b'01111111'; 8
  60.    retlw   b'01100111'; 9


Observa el loop Principal, leo los botones y actuo sobre incremento. Luego Cambio el display.

Esto me permite que en la rutina del boton de incremento. Poner un bloqueo para que no me cuente muchas veces el mismo boton. Y es ahi donde me aseguro que no se pase.
Lo mismo hago con el decremetno.

Finalmente la tabla es de 10 elementos..

PD: No lo probe, solamente lo escribi en el block de notas, asi que puede tener errores, pero te da una idea.

Desconectado ty4115

  • PIC10
  • *
  • Mensajes: 3
Re:AYUDA - Decremento de una cuenta al pulsar un push button
« Respuesta #2 en: 28 de Marzo de 2020, 17:39:01 »
Yo lo plantearia asi:


Código: ASM
  1. Principal:
  2.   BTFSS PushAumento
  3.   CALL  Incrementar
  4.   BTFSS PushDecremento
  5.   CALL  Decrementar
  6.   CALL  Muestro
  7.   GOTO  Principal
  8.  
  9.  
  10. Incrementar
  11.    ;Mientras no suelte, me quedo aca atrapado, asi no cuenta muchas veces
  12.    call   Retardo_10ms
  13.    BTFSS   PushAumento  
  14.    GOTO   Incrementar
  15.    ; Incremento
  16.    INCF   Incremento, F
  17.    ; Verifico que no me pase, si me pase lo vuelvo a 9, sino dejo el numero como esta
  18.    MOVLW  d'10'
  19.    SUBWF  Incremento, W
  20.    BTFSS  STATUS, Z
  21.    RETURN
  22.    MOVLW  d'9'
  23.    MOVWF  Incremento
  24.    RETURN
  25.  
  26. Muestro
  27.   MOVWF   Incremento, W
  28.   CALL    TABLADisplayA
  29.   MOVWF   PORTB;
  30.   RETURN
  31.    
  32. Decrementar
  33.    call   Retardo_10ms
  34.    BTFSS   PushDecremento
  35.    GOTO   Decrementar
  36.    ; Decremento
  37.    DECF   Incremento, F
  38.    ; Reviso que no me pase, si me pase el resultado es 0xFF
  39.    COMF   Incremento, W
  40.    BTFSC  STATUS, Z
  41.    CLRF   Incremento
  42.    RETURN
  43.  
  44.    
  45.    Borrar
  46.    clrf Incremento
  47.    return
  48.  
  49. TABLADisplayA
  50.    subwf   PCL,F
  51.    retlw   b'00111111'; 0
  52.    retlw   b'00000110'; 1
  53.    retlw   b'01011011'; 2
  54.    retlw   b'01001111'; 3
  55.    retlw   b'01100110'; 4
  56.    retlw   b'01101101'; 5
  57.    retlw   b'01111101'; 6
  58.    retlw   b'00000111'; 7
  59.    retlw   b'01111111'; 8
  60.    retlw   b'01100111'; 9


Observa el loop Principal, leo los botones y actuo sobre incremento. Luego Cambio el display.

Esto me permite que en la rutina del boton de incremento. Poner un bloqueo para que no me cuente muchas veces el mismo boton. Y es ahi donde me aseguro que no se pase.
Lo mismo hago con el decremetno.

Finalmente la tabla es de 10 elementos..

PD: No lo probe, solamente lo escribi en el block de notas, asi que puede tener errores, pero te da una idea.


:ooo, gracias amigoo, aunque estaba viendo tu codigo y hay partes que la verdad no entiendo mucho, por ejemplo en "Decrementar" pusiste la instruccion COMf, por lo que he visto eso sirve basicamente para poner el complemento bit a bit, pero exactamente que funcion me otorga esa instruccion en este caso?,  tambien en la tabla del display en vez de pusiste addwf  decidiste poner un subwf, por que ? tambien en Incrementar , luego de que incrementas lo restas con 10 para la comprobacion, pero, si hago eso siempre se me va a quedar en el mismo digito no? (Perdon por las preguntas pero realmente me gustaria comprender a fondo tu Planteamiento)

Y la verdad muchas gracias por tomarte el tiempo de responder a mi duda, ahora voy a tratar de modificiar y compilar sin alejarme tanto de tu planteamiento.
Ah se me olvidaba, por cierto si lo simulo en proteus asi no me deberia de dar ningun error, es decir a la hora de presionar los botones y eso, porque siento que por no poner la resistencia pull up puede ser que me este ocurriendo un error

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AYUDA - Decremento de una cuenta al pulsar un push button
« Respuesta #3 en: 28 de Marzo de 2020, 19:36:34 »
Te respondo por partes:

Citar
por ejemplo en "Decrementar" pusiste la instruccion COMf, por lo que he visto eso sirve basicamente para poner el complemento bit a bit, pero exactamente que funcion me otorga esa instruccion en este caso?,

Tu tabla tiene 10 entradas, es decir de 0 a 9.
Usamos el registro Incremento para guardar ese offset, el problema es que yo tengo que cuidarme de no salirme de los numeros 0 a 9,

Y aca la pregunta es.... ¿Que pasa si mi registro era 0 y yo decremente en 1?
El registro pasa a tener el valor 0xFF ( 255 ) Y eso es algo que mi tabla NO llega. Por lo que quiero detectar cuando es que esto ocurre.
Al hacer un complemento bit a bit, el 0xFF ( 0b1111 1111) queda como 0b0000 0000, Es el unico caso en que ocurre.
Esto quiere decir que si era 0xFF, le hago el complemento, la bandera Z se activaria. De esa forma DETECTO ese problema y lo vuelvo a 0 que es un valor valido de mi tabla.

PD: Podria haber usado un IORLW 0xFF, un SUBLW 0xFF, etc para lograr este cometido, use el COMF por que parecio mas sencillo.
Citar
tambien en la tabla del display en vez de pusiste addwf  decidiste poner un subwf, por que ?

En realidad es un error, es ADDWF, yo copie tu codigo y lo modifique, y esa parte yo no la habia tocado, observa que en el codigo que VOS colgaste tenes un SUBWF, pero es ADDWF.

Citar
tambien en Incrementar , luego de que incrementas lo restas con 10 para la comprobacion, pero, si hago eso siempre se me va a quedar en el mismo digito no?

De la misma forma que antes, si yo incremento y estaba en 9, va a quedar con el valor 10, que es un valor que NO corresponde a mi tabla, por eso observo que si llego a 10 lo vuelvo a dejar en 9. De esa forma nunca me voy a pasar.

PD: Use el SUBWF, pero podria haber usado el IORLW 0xA  (10 decimal) para hacer exactamente lo mismo.



Asi como lo plantee si presionas el incrementar comenzando desde cero verias esto:

0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 9 -> 9 -> 9 -> 9

Si presionas decrementar muchas veces verias esto (Supongo que comienzo desde 5):

5 -> 4 -> 3 -> 2 -> 1 -> 0 -> 0 -> 0 -> 0

Es decir va hacia arriba y abajo, pero no supera esos valores, no es que de 0 pasa a 9.

Si quisieras que haga ese rollback, entonces deberias cambiar los limites. Es decir:

- En Decrementar, donde detecte el 0xFF, en ves de ponerlo en 0, que lo ponga en 9
- En Incrementar, donde detecta el 10 decimal, en ves de ponerlo en 9, que lo ponga en 0.

Y solamente modificando esos limites cambias el funcionamiento.



Para ser correcto, comparar con igualdades es suficiente. Pero si uno quisiera estar TOTALMENTE seguro, entonces deberia comparar en ambos casos por numeros mayores a nueve. Si es 255 se cumpliria, y si se pasa de 9 y es 10, tambien se cumpliria.



Citar
porque siento que por no poner la resistencia pull up puede ser que me este ocurriendo un error

El programa espera un pulso BAJO como para indicar que se presionó. Respecto a las conexiones de tu imagen:

Si seguis con esa logica (la de la imagen) en realidad lo que te faltaria es una resistencia de PULL-DOWN, es decir cuando no este presionado estaria en 0 y al presionar le estarias dando VCC al pin es decir (1).

Si cambias la logica, es decir el boton a GND, Deberias tener una resistencia de PULL_UP, es decir ahora si la resistencia a VCC, mientras no este presionado estaría en 1, y al presionar iría a 0
« Última modificación: 28 de Marzo de 2020, 19:54:10 por KILLERJC »

Desconectado ty4115

  • PIC10
  • *
  • Mensajes: 3
Re:AYUDA - Decremento de una cuenta al pulsar un push button
« Respuesta #4 en: 29 de Marzo de 2020, 19:12:53 »
Te respondo por partes:

Citar
por ejemplo en "Decrementar" pusiste la instruccion COMf, por lo que he visto eso sirve basicamente para poner el complemento bit a bit, pero exactamente que funcion me otorga esa instruccion en este caso?,

Tu tabla tiene 10 entradas, es decir de 0 a 9.
Usamos el registro Incremento para guardar ese offset, el problema es que yo tengo que cuidarme de no salirme de los numeros 0 a 9,

Y aca la pregunta es.... ¿Que pasa si mi registro era 0 y yo decremente en 1?
El registro pasa a tener el valor 0xFF ( 255 ) Y eso es algo que mi tabla NO llega. Por lo que quiero detectar cuando es que esto ocurre.
Al hacer un complemento bit a bit, el 0xFF ( 0b1111 1111) queda como 0b0000 0000, Es el unico caso en que ocurre.
Esto quiere decir que si era 0xFF, le hago el complemento, la bandera Z se activaria. De esa forma DETECTO ese problema y lo vuelvo a 0 que es un valor valido de mi tabla.

PD: Podria haber usado un IORLW 0xFF, un SUBLW 0xFF, etc para lograr este cometido, use el COMF por que parecio mas sencillo.
Citar
tambien en la tabla del display en vez de pusiste addwf  decidiste poner un subwf, por que ?

En realidad es un error, es ADDWF, yo copie tu codigo y lo modifique, y esa parte yo no la habia tocado, observa que en el codigo que VOS colgaste tenes un SUBWF, pero es ADDWF.

Citar
tambien en Incrementar , luego de que incrementas lo restas con 10 para la comprobacion, pero, si hago eso siempre se me va a quedar en el mismo digito no?

De la misma forma que antes, si yo incremento y estaba en 9, va a quedar con el valor 10, que es un valor que NO corresponde a mi tabla, por eso observo que si llego a 10 lo vuelvo a dejar en 9. De esa forma nunca me voy a pasar.

PD: Use el SUBWF, pero podria haber usado el IORLW 0xA  (10 decimal) para hacer exactamente lo mismo.



Asi como lo plantee si presionas el incrementar comenzando desde cero verias esto:

0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 9 -> 9 -> 9 -> 9

Si presionas decrementar muchas veces verias esto (Supongo que comienzo desde 5):

5 -> 4 -> 3 -> 2 -> 1 -> 0 -> 0 -> 0 -> 0

Es decir va hacia arriba y abajo, pero no supera esos valores, no es que de 0 pasa a 9.

Si quisieras que haga ese rollback, entonces deberias cambiar los limites. Es decir:

- En Decrementar, donde detecte el 0xFF, en ves de ponerlo en 0, que lo ponga en 9
- En Incrementar, donde detecta el 10 decimal, en ves de ponerlo en 9, que lo ponga en 0.

Y solamente modificando esos limites cambias el funcionamiento.



Para ser correcto, comparar con igualdades es suficiente. Pero si uno quisiera estar TOTALMENTE seguro, entonces deberia comparar en ambos casos por numeros mayores a nueve. Si es 255 se cumpliria, y si se pasa de 9 y es 10, tambien se cumpliria.



Citar
porque siento que por no poner la resistencia pull up puede ser que me este ocurriendo un error

El programa espera un pulso BAJO como para indicar que se presionó. Respecto a las conexiones de tu imagen:

Si seguis con esa logica (la de la imagen) en realidad lo que te faltaria es una resistencia de PULL-DOWN, es decir cuando no este presionado estaria en 0 y al presionar le estarias dando VCC al pin es decir (1).

Si cambias la logica, es decir el boton a GND, Deberias tener una resistencia de PULL_UP, es decir ahora si la resistencia a VCC, mientras no este presionado estaría en 1, y al presionar iría a 0

La verdad muchas gracias por todos los  consejos y aclaraciones =D, todavia no me sale porque al parecer tengo un problema en el codigo con lo de incrementar porque cuando le doy al boton literalmente no hace nada, pero seguire intentando a ver si me sale, espero porder entregar esta practica =D