Autor Tema: Crear tiempos de retardo al presionar pulsador  (Leído 181 veces)

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

Desconectado muros

  • PIC10
  • *
  • Mensajes: 2
Crear tiempos de retardo al presionar pulsador
« en: 11 de Octubre de 2020, 22:36:36 »
Buen dia a toda la comunidad, vengo en busca de ayuda ya que soy principiante en microcontroladores PIC y más programando en lenguaje ensamblador, aunque debo reconocer que es complicado este lenguaje pero creo que voy agarrándole cariño jeje.
Bueno el tema que se pide es el siguiente:

Elaborar un programa que genere un corrimiento hacia la derecha de un bit.
Entre cambio de bit y bit debe haber un retardo de tiempo t.
Cada que se presione un push button conectado al microcontrolador, el
tiempo de retardo se va a incrementar por un tiempo t: se presiona una
vez, el retardo seria 2t, se presiona otra vez, el retardo seria 3t, y
así hasta tener un retardo de 5t. Si se vuelve a presionar el push button
el retardo se va decrementando por un tiempo t: 4t,3t,2t hasta tener solo t.
una vez el tiempo de retardo llega a t, entonces se vuelve nuevamente a
incrementar con cada presion del push button.

La verdad solo tengo lo del corrimiento, pero tengo duda en como integrar o añadir
los retardos en un solo push button. Si alguien podría orientarme y explicarme por favor
seria de gran ayuda.

 
* Corrimiento con retardos.txt
(1.43 kB - descargado 11 veces)
« Última modificación: 11 de Octubre de 2020, 23:03:51 por muros »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7894
Re:Crear tiempos de retardo al presionar pulsador
« Respuesta #1 en: 12 de Octubre de 2020, 08:37:45 »
Creas solamente el retardo t,

Lo demas es entrar 1,2,3,4,5,4,3,2 veces al retardo..

Lo podes hacer cargando esos numeros en una tabla.. e implementar un contador.. que vaya de 0 a 7, si detectas el bit4 (8 en binario) reseteas el contador y comenzas del 0 nuevamente.

Otra es hacer una tabla que tenga solo los valores 1,2,3,4,5 y luego tener 2 variables, un contador y un indicado que te de el sentido que se desplaza. Mas complicado y no tiene sentido ya que el otro es mucho mas simple de implementar.

Tabla
  Valores tabla

Inicio
  Configuro todo
  Contador = 0
  Puerto en 1
Loop Principal
   Leo boton, no: vuelvo al loop principal
   Si:
   LLamo delay tantas veces lo diga mi tabla
   Roto el puerto
   Reviso carry por si el bit 7 del port se fue al carry, y activo el bit 0 en ese caso
   incremento mi contador
   bit 4 contador = 1?
   Si: Contador = 0
   Vuelvo al loop principal.
« Última modificación: 12 de Octubre de 2020, 08:42:14 por KILLERJC »

Desconectado muros

  • PIC10
  • *
  • Mensajes: 2
Re:Crear tiempos de retardo al presionar pulsador
« Respuesta #2 en: 13 de Octubre de 2020, 22:13:55 »
Creas solamente el retardo t,

Lo demas es entrar 1,2,3,4,5,4,3,2 veces al retardo..

Lo podes hacer cargando esos numeros en una tabla.. e implementar un contador.. que vaya de 0 a 7, si detectas el bit4 (8 en binario) reseteas el contador y comenzas del 0 nuevamente.

Otra es hacer una tabla que tenga solo los valores 1,2,3,4,5 y luego tener 2 variables, un contador y un indicado que te de el sentido que se desplaza. Mas complicado y no tiene sentido ya que el otro es mucho mas simple de implementar.

Tabla
  Valores tabla

Inicio
  Configuro todo
  Contador = 0
  Puerto en 1
Loop Principal
   Leo boton, no: vuelvo al loop principal
   Si:
   LLamo delay tantas veces lo diga mi tabla
   Roto el puerto
   Reviso carry por si el bit 7 del port se fue al carry, y activo el bit 0 en ese caso
   incremento mi contador
   bit 4 contador = 1?
   Si: Contador = 0
   Vuelvo al loop principal.


Disculpa KILLERJC por la demora de contestar, he tenido algunos exámenes el día de ayer y hoy.
Agradezco la respuesta, solo que tengo un problema de como insertar la tabla en el contador ó en el llamado del retardo.
El programa lo modifique tantito y agregué la tabla en el programa, si me pudieras explicar la manera correcta de como hacerlo te lo agradecería, disculpa la molestia

; Elaborar un programa que genere un corrimiento hacia la derecha de un bit
; entre cambio de bit y bit debe haber un retardo de tiempo t
; cada que se presione un push button conectado al microcontrolador, el
; tiempo de retardo se va a incrementar por un tiempo t: se presiona una
; vez, el retardo seria 2t, se presiona otra vez, el retardo seria 3t, y
; así hasta tener un retardo de 5t. si se vuelve a presionar el push button
; el retardo se va decrementando por un tiempo t: 4t,3t,2t hasta tener solo t.
; una vez el tiempo de retardo llega a t, entonces se vuelve nuevamente a
; incrementar con cada presion del push button.   
;*******************************************************************************       
    LIST P = 18f45K50          ;Microcontrolador a utilizar
    #include<p18f45K50.inc>
   
;****************Sección de bits de configuración inicial***********************
    CONFIG WDTEN=OFF ;Deshabilita el Watchdog
    CONFIG MCLRE=ON ;Habilita MCLEAR
    CONFIG DEBUG=OFF ;Deshabilita Debug mode
    CONFIG LVP=OFF ;Deshabilita programacion bajo voltaje
    CONFIG FOSC=INTOSCIO ;Habilita oscilador interno
   
;****************Declaración de variables en la memoria de datos****************
AUX1     EQU 0x00
AUX2     EQU 0x01   
Delay1   EQU 0x02
Delay2   EQU 0x03
CONTADOR EQU 0x04
Cont1    EQU 0x05
Cont2    EQU 0x06

#DEFINE  PULSADOR PORTB,RB7
 
    ORG    0 
;*******************************************************************************
Start:
    MOVLB  0x0F           ;carga valorr a BSR
    CLRF   ANSELA,1       ;Entradas puertos A y B como digitales
    CLRF   ANSELB,1
    CLRF   TRISA          ;PORTA como salidas
    SETF   TRISB          ;PORTB como entradas
    MOVLW  b'01010011'
    MOVWF  OSCCON         ;Frecuencia a 4MHz
    CLRF   CONTADOR
   
   
;***************************programa principal**********************************   
MainLoop:
    BCF    PORTA,0   ;Limpia pin RA0=0
    BTFSS  PULSADOR  ;Prueba si fue presionado
    GOTO   MainLoop  ;regresa a MainLoop
    BTFSS  PULSADOR  ;verifica si se dejo de presionar
    CALL   ROTACION  ;Llamada a subtutina ROTACION
   
;***************************subrutina de Rotacion*******************************   
ROTACION: 
    MOVLW   0x01     
    MOVWF  PORTA     ;Enciende PIN RA0
ciclo   
    RRNCF   PORTA     ;Rotacin de bits a la derecha
    CALL     Delay     ;retardo
    BTFSS   PORTA,0   ;verifica si pin RA0 esta encendido, salta si es asi
    GOTO   ciclo     ;Bucle
    RETURN           ;Regresa programa principal
   
;*****************************Subrutina de Retardo*****************************     
Delay:
    DECFSZ Delay1,1  ; Decrementa Aux1 en 1, salta siguiente instrucción
                     ; si Aux1 es 0 (256 - 0 )
    GOTO    Delay     
    DECFSZ Delay2,1 
    GOTO    Delay
    RETURN           ; Regresa al programa principal 
   
;*******************************************************************************   
TABLA:
    RETLW  b'0000'   
    RETLW  b'0001'
    RETLW  b'0010'
    RETLW  b'0011'
    RETLW  b'0100'
    RETLW  b'0101'
    RETLW  b'0111'
    RETLW  b'1000'
   
;*******************************************************************************   
    END              ;Fin de programa

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7894
Re:Crear tiempos de retardo al presionar pulsador
« Respuesta #3 en: 14 de Octubre de 2020, 15:25:32 »
Tal ves lei mal la consigna... fijate en esto, fue realiado a medio las apuradas, asi que seguramente tenga errores de sobra

Código: ASM
  1. Reset:
  2.         ;Aca todo la configuracion de los puertos
  3.         MOVLW 0x80
  4.         MOVWF PORTA     ;Cargo con el valor 1000 0000
  5.  
  6.  
  7. MainLoop:
  8.         CALL    DELAY_PRE
  9.         CALL    BOTON
  10.         CALL    ROTACION
  11.         GOTO    MainLoop
  12.  
  13. BOTON
  14.         BTFSS   AUX,0   ;Indicador del estado del boton
  15.         GOTO    BOTON_1
  16.         BTFSC  PULSADOR  ;Prueba si soltado presionado
  17.         RETURN
  18.         BCF     AUX,0
  19.         INCF    CONTADOR, F ; Lo presiono y solto, entonces incremento la demora
  20.         BTFSC   CONTADOR,3
  21.         CLRF    CONTADOR
  22.         RETURN
  23. BOTON_1:
  24.         BTFSC   PULSADOR  ;Prueba si fue presionado
  25.         BSF     AUX,0
  26.         RETURN
  27.  
  28. ROTACION:
  29.         RRNCF   PORTA, F
  30.         RETURN
  31.  
  32.  
  33. DELAY_PRE:
  34.         MOVF    CONTADOR, W
  35.         CALL    TABLA
  36.         MOVWF   AUX2
  37. DELAY_PRE1:
  38.         DECFSNZ AUX2, F
  39.         RETURN
  40.         CALL    DELAY
  41.         GOTO    DELAY_PRE1
  42.  
  43.  
  44. TABLA:
  45.     RETLW  b'0010'      ;Contador = 0, DECF... descuenta primero, por lo tanto necesito que tenga un valor de 2, primer decfs queda en 1 y ejecuta delay, segundo decfs es 0 y no salta, ejecutandose 1 sola ves
  46.     RETLW  b'0011'      ; 3 decfs = 2 delays
  47.     RETLW  b'0100'      ; 4 decfs = 3 delays
  48.     RETLW  b'0101'      ; 5 decfs = 4 delays
  49.     RETLW  b'0110'      ; 6 decfs = 5 delays
  50.     RETLW  b'0101'      ; 5 decfs = 4 delays
  51.     RETLW  b'0111'      ; 4 decfs = 3 delays
  52.     RETLW  b'1000'      ; 3 decfs = 2 delays


 

anything