Usar push button y cambiar otra secuencia en microcode

hola a todos necesito una orientacion estoy creando una secuencia de derecha a izquierda con 7 salidas,
con el pic 16f84A y con un push button deseo cambiarle el sentido de secuencia, osea de izquierda a derecha
como lo puedo hacer? trabajo com microcode studio se los agradeceria mucho ...
 
Aquí dejo el diagrama y el programa.
PHP:
TrisA=%11111                'todo el port A como entrada
TrisB=%00000000             'todo el port B como salida
PORTB=%00000000             'todo el port B en 0
     
'cmcon=7     ;convierte el puerto A en digital

trisb=0      ;convierte en salidas el puerto B
digito var Byte
veces var Byte

inicio:
 
If PORTA.0 = 1 Then ;SECUENCIA A LA DERECHA
For veces = 0 To 255
For digito = 0 To 7
portb=%00000000 :PAUSE 100
portb=%00000001 :PAUSE 100   ;esperar 4 mls, total 20 mls 
portb=%00000010 :PAUSE 100
portb=%00000100 :PAUSE 100
portb=%00001000 :PAUSE 100
portb=%00010000 :PAUSE 100
portb=%00100000 :PAUSE 100
portb=%01000000 :PAUSE 100
pause 100
Next digito

Next veces
Endif


If PORTA.1 = 1 Then   ;SECUENCIA A LA IZQUIERDA
For veces = 0 To 255
For digito = 0 To 7
portb=%01000000 :PAUSE 100   ;esperar 4 mls, total 20 mls 
portb=%00100000 :PAUSE 100
portb=%00010000 :PAUSE 100
portb=%00001000 :PAUSE 100
portb=%00000100 :PAUSE 100
portb=%00000010 :PAUSE 100
portb=%00000001 :PAUSE 100
pause 100
Next digito

Next veces
Endif

PORTB = 0
GOTO inicio            ;volvemos a inicio
END
 

Adjuntos

  • JPG.png
    JPG.png
    31.2 KB · Visitas: 11
Última edición por un moderador:
No miras el botón dentro de la secuencia, así que hasta que no acabe no cambia.
Además como no lo memorizas no lo lees tiene que ser justo en ese microsegundo que esté pulsado.

 
Estoy creando una secuencia de derecha a izquierda con 7 salidas,
con el PIC16F84A y con un push button deseo cambiarle el sentido de secuencia, osea de izquierda a derecha.
¿Cómo lo puedo hacer?
Trabajo con Microcode Studio.
Esta sería una forma sencilla de hacerlo.
PHP:
; Palabra de configuración: (PBP3)
#Config
    __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON
#EndConfig
;*******************************************************************************
Define OSC 4                ; Definir que se trabajará con 4MHz.

Inicio:
    TRISB = 0
    PORTB = 0
    a Var Byte
    b Var Byte
    
Programa:
    If PORTA.0 = 1 Then     ; Secuencia hacia la izquierda.
        For a = 1 To 100
            PORTB = 1
            Pause 100
            For b = 1 To 7
Rotar_Izq:
                PORTB = PORTB << 1
                If PORTA.1 = 1 Then Rotar_Der
                Pause 100
            Next b
            PORTB = 0
            Pause 100
        Next a
    EndIf
    
    If PORTA.1 = 1 Then     ; Secuencia hacia la derecha.
        For a = 1 To 100
            PORTB = $80
            Pause 100
            For b = 7 To 1 Step - 1
Rotar_Der:
                PORTB = PORTB >> 1
                If PORTA.0 = 1 Then Rotar_Izq
                Pause 100
            Next b
            PORTB = 0
            Pause 100
        Next a
    EndIf

    GoTo Programa
    
    End
 
Gracias por responder, la idea es esta: mi secuencia es de derecha a izquierda con un push button me cambie la secuencia de a izquierda a derecha y con el mismo push button me lo vuelva a cambiar de derecha a izquierda el otro push button es para aumentar la velocidad de la secuencia que por cierto no se como hacerlo, el primer pulso velocidad lenta, el segundo pulso velocidad media, el tercer pulso velocidad rapida, el cuarto pulso se repite el ciclo, con el mismo push button ,se lo agradeceria mucho de antemeno gracias por responder yo uso el microcode studio atte, kimer
 
¿Cómo puedo usarla y en qué parte podría ir el flag?
¿Podrías darme una ayuda con un ejemplo?
 
Última edición por un moderador:
Esta puede ser una forma:
PHP:
; Palabra de configuración: (PBP3)
#Config
    __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON
#EndConfig
;*******************************************************************************
Define OSC 4                ; Definir que se trabajará con 4MHz.

Inicio:
    TRISB = 0
    PORTB = 0
    a Var Byte
    Bandera Var Bit
    Bandera = 0
    
Programa:
    If PORTA.0 = 1 Then
        If Bandera = 1 Then
            Bandera = 0
            GoSub Rotar_Izq
        Else
            Bandera = 1
            GoSub Rotar_Der
        EndIf
    EndIf
    
    GoTo Programa
 
 Rotar_Izq:   
 ; Secuencia hacia la izquierda.
    While PORTA.0 = 1
        PORTB = 1
        Pause 100
        For a = 1 To 7
            PORTB = PORTB << 1
            Pause 100
        Next a
        PORTB = 0
        Pause 100
    Wend

    Return
 
 Rotar_Der:
; Secuencia hacia la derecha.
    While PORTA.0 = 1
        PORTB = $80
        Pause 100
        For a = 7 To 1 Step - 1
            PORTB = PORTB >> 1
            Pause 100
        Next a
        PORTB = 0
        Pause 100
    Wend
    
    Return
    
    End
 
Excelente, pero si quiero que cuando presiono el push button la secuencia sea indifinida y vuelvo a presionar el mismo push button me cambie de sentido pero que su secuencia tambien sea indifinada ¿como lo hago? gracias por responder
 
Podrías usar la interrupción externa por RB0 para cambiar de estado la bandera y hacer que cada secuencia se active dependiendo el estado.
Pero tendrías que usar dos banderas, una para comprobar la activación de la secuencia y otra para cambiarla.
La rutina se mantendría activa comprobando el estado de la bandera, hasta que cambie.
La de activación la establecería el mismo botón de cambio y la detención se haría con el reset.
 
DIsculpa, amigo D@rkbytes pero no entiendo, como incluir las 2 banderas y hacer la rutina externa podrías darme un ejemplo, te agradesco mucho por tratar de ayudarme,
 
Olvidé que el pin RB0 se está usando.
Así que está es una opción sin usar interrupciones:
PHP:
; Palabra de configuración: (PBP3)
#Config
    __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON
#EndConfig
;*******************************************************************************
Define OSC 4                    ; Definir que se trabajará con 4MHz.

Inicio:
    TRISB = 0
    PORTB = 0
    a Var Byte
    Bandera_Act Var Bit         ; Bandera de activación.
    Bandera_Sec Var Bit         ; Bandera para cambio de secuencia.

    Bandera_Act = 0
    Bandera_Sec = 0
    
    
Programa:
    GoSub Leer_Pulsador
 ; Secuencia hacia la izquierda.
    While Bandera_Act = 1 And Bandera_Sec = 0
        GoSub Leer_Pulsador
        PORTB = 1
        GoSub Delay_100ms
        For a = 1 To 7
            GoSub Leer_Pulsador
            PORTB = PORTB << 1
            GoSub Delay_100ms
        Next a
        PORTB = 0
        GoSub Delay_100ms
    Wend
    
 ; Secuencia hacia la derecha.
    While Bandera_Act = 1 And Bandera_Sec = 1
        GoSub Leer_Pulsador
        PORTB = $80
        GoSub Delay_100ms
        For a = 7 To 1 Step - 1
            PORTB = PORTB >> 1
            GoSub Delay_100ms
        Next a
        PORTB = 0
        GoSub Delay_100ms
    Wend
 
    GoTo Programa
    
Leer_Pulsador:
    If PORTA.0 = 1 Then
        If Bandera_Sec = 1 Then
            Bandera_Sec = 0
        Else
            Bandera_Sec = 1
        EndIf
        
        While PORTA.0 = 1: Wend
        Bandera_Act = 1
    EndIf
    
    Return
    
Delay_100ms:
    x Var Byte
    
    For x = 1 To 100
        GoSub Leer_Pulsador
        Pause 1
    Next x

    Return 
    
    End
 
Hola, D@rkbytes. Excelente, es lo que quería. Te agradezco mucho.
En el mismo archivo estoy tratando de modificar el tiempo (3 tiempos. 50ms, 100ms, 500ms)
El segundo pulsador que va a RA1 es para aumentar la velocidad de la secuencia, el primer pulso velocidad lenta, el segundo pulso velocidad media, el tercer pulso velocidad rápida y el cuarto pulso se repite el ciclo.

Lo estoy haciendo así pero no me responde. ¿Cómo lo puedo hacer?
PHP:
; Palabra de configuración: (PBP3)

Define OSC 4                    ; Definir que se trabajará con 4MHz.

Inicio:
    TRISA = 1
    PORTA = 1
    TRISB = 0
    PORTB = 0
    a Var Byte
    m Var Byte
    n Var Byte
    o Var Byte
    Bandera_Act Var Bit         ; Bandera de activación.
    Bandera_Sec Var Bit         ; Bandera para cambio de secuencia.

    Bandera_Act = 0
    Bandera_Sec = 0
    m=50
    n=100
    o=500
     
Programa:
    GoSub Leer_Pulsador
 ; Secuencia hacia la izquierda.
    While Bandera_Act = 1 And Bandera_Sec = 0
        GoSub Leer_Pulsador
        PORTB = 1
        GoSub Delay_100ms
        For a = 1 To 7
            GoSub Leer_Pulsador
            PORTB = PORTB << 1
            GoSub Delay_100ms
        Next a
        PORTB = 0
        GoSub Delay_100ms
    Wend
    
 ; Secuencia hacia la derecha.
    While Bandera_Act = 1 And Bandera_Sec = 1
        GoSub Leer_Pulsador
        PORTB = $80
        GoSub Delay_100ms
        For a = 7 To 1 Step - 1
            PORTB = PORTB >> 1
            GoSub Delay_100ms
        Next a
        PORTB = 0
        GoSub Delay_100ms
    Wend
 
    GoTo Programa
    
Leer_Pulsador:
    If PORTA.0 = 1 Then
        If Bandera_Sec = 1 Then
            Bandera_Sec = 0
        Else
            Bandera_Sec = 1
        EndIf
        
        While PORTA.0 = 1: Wend
        Bandera_Act = 1
    EndIf
    
    Return
    
Delay_100ms:
    x Var Byte
    
    For x = 1 To 100
        GoSub Leer_Pulsador
        Pause 1
    Next x

    Return 
    
    End
 
Última edición por un moderador:
Lo estoy haciendo así pero no me responde. ¿Cómo lo puedo hacer?
El programa no responde porque no estás cambiando nada, únicamente estás declarando variables que nunca usas.
Debes pensar la manera en cómo podría llegar a funcionar lo que quieres, programarlo y ver el comportamiento.

No es nada complicado, sólo piensa un poco.
 
Bueno, tienes razón, sólo los mencionaba.
Lo hice así, viendo cómo tú lo habías hecho con el pulsador 1, pero me sale error.
Por favor, una ayuda.
PHP:
; Palabra de configuración: (PBP3)

Define OSC 4                    ; Definir que se trabajará con 4MHz.

Inicio:
    TRISA = 1
    PORTA = 1
    TRISB = 0
    PORTB = 0
    a Var Byte
    m Var Byte
    n Var Byte
    o Var Byte
    Bandera_Act Var Bit         ; Bandera de activación.
    Bandera_Sec Var Bit         ; Bandera para cambio de secuencia.
    Bandera_Act2 Var Bit        ; Bandera de activación de velocidad.
    Bandera_cam Var Bit         ; Bandera para cambio de velocidad.


    Bandera_Act = 0
    Bandera_Sec = 0
    m=50
    n=100
    o=500
     
Programa:
    GoSub Leer_Pulsador
    GoSub Leer_Pulsador2
 ; Secuencia hacia la izquierda.
    While Bandera_Act = 1 And Bandera_Sec = 0
    While Bandera_Act2 = 1 And Bandera_cam = n
    While Bandera_Act2 = 1 And Bandera_cam = m
    While Bandera_Act2 = 1 And Bandera_cam = o
        GoSub Leer_Pulsador
        GoSub Leer_Pulsador2
        PORTB = 1
        GoSub Delay_100ms
        For a = 1 To 7
            GoSub Leer_Pulsador
            GoSub Leer_Pulsador2
            PORTB = PORTB << 1
            GoSub Delay_100ms
        Next a
        PORTB = 0
        GoSub Delay_100ms
    Wend
    
 ; Secuencia hacia la derecha.
    While Bandera_Act = 1 And Bandera_Sec = 1
    While Bandera_Act2 = 1 And Bandera_cam = n
    While Bandera_Act2 = 1 And Bandera_cam = m
    While Bandera_Act2 = 1 And Bandera_cam = o
        GoSub Leer_Pulsador
        GoSub Leer_Pulsador2
        PORTB = $80
        GoSub Delay_100ms
        For a = 7 To 1 Step - 1
            PORTB = PORTB >> 1
            GoSub Delay_100ms
        Next a
        PORTB = 0
        GoSub Delay_100ms
    Wend
 
    GoTo Programa
    
Leer_Pulsador:
    If PORTA.0 = 1 Then
        If Bandera_Sec = 1 Then
            Bandera_Sec = 0
        Else
            Bandera_Sec = 1
        EndIf
        
        While PORTA.0 = 1: Wend
        Bandera_Act = 1
    EndIf
    
Leer_Pulsador2:
   If PORTA.1 = 1 Then
   If Bandera_cam = 1 Then
        Bandera_cam = 0


    Return
    
Delay_100ms:
    x Var Byte
    
    For x = 1 To 100
        GoSub Leer_Pulsador
        GoSub Leer_Pulsador2
        Pause 1
    Next x

    Return 
    
    End
 
Última edición por un moderador:
Claro que te debe dar errores porque cada instrucción While debe terminar con un Wend
O sea...
Mientras variable menor o mayor o igual o diferente a x valor
; Hago algo.
Repito hasta que x se cumpla.

Y eso que escribiste no tiene sentido, ni cumple con el objetivo.
Necesitas estudiar para qué sirve cada instrucción y tener más lógica sobre los procesos.

Así podría ser, pero si no pones más empeño de tu parte, ya no continuaré con los ejemplos.
PHP:
; Palabra de configuración: (PBP3)
#Config
    __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON
#EndConfig
;*******************************************************************************
Define OSC 4                    ; Definir que se trabajará con 4MHz.

Inicio:
    TRISB = 0
    PORTB = 0
    a Var Byte
    Bandera_Act Var Bit         ; Bandera de activación.
    Bandera_Sec Var Bit         ; Bandera para cambio de secuencia.
    Veces Var Word              ; Variable para establecer el tiempo.
    Contador Var Byte           ; Variable de conteo para establecer los tiempos.

    Bandera_Act = 0
    Bandera_Sec = 0
    Veces = 500                 ; Tiempo inicial por defecto = 500 mS.
    Contador = 1
    
    
Programa:
    GoSub Leer_Pulsadores
 ; Secuencia hacia la izquierda.
    While Bandera_Act = 1 And Bandera_Sec = 0
        GoSub Leer_Pulsadores
        PORTB = 1
        GoSub Delay
        For a = 1 To 7
            PORTB = PORTB << 1
            GoSub Delay
        Next a
        PORTB = 0
        GoSub Delay
    Wend
    
 ; Secuencia hacia la derecha.
    While Bandera_Act = 1 And Bandera_Sec = 1
        GoSub Leer_Pulsadores
        PORTB = $80
        GoSub Delay
        For a = 7 To 1 Step - 1
            PORTB = PORTB >> 1
            GoSub Delay
        Next a
        PORTB = 0
        GoSub Delay
    Wend
 
    GoTo Programa
    
Leer_Pulsadores:
    Btn1 Var Byte
    Btn2 Var Byte
    
    Button PORTA.0,1,255,255,Btn1,0,P2
        If Bandera_Sec = 1 Then
            Bandera_Sec = 0
        Else
            Bandera_Sec = 1
        EndIf
        
        Bandera_Act = 1
P2:   
    Button PORTA.1,1,255,255,Btn2,0,Salir
        If Bandera_Act = 1 Then ; Sólo se incrementará la variable "Contador"
                                ; si la "Bandera_Act" está en 1.
            Contador = Contador + 1
        EndIf
        ; No permitir que la variable "Contador" supere el valor de 3.
        If Contador > 3 Then Contador = 1
        
        Select Case Contador
            ; Se establecen los tiempos en mS. (Para la subrutina "Delay")
            Case 1
                Veces = 500
            Case 2
                Veces = 100
            Case 3
                Veces = 50
        End Select  
Salir:    
    Return
    
Delay:
    x Var Word
    
    For x = 1 To Veces
        GoSub Leer_Pulsadores
        Pause 1
    Next x

    Return 
    
    End
el cuarto pulso se repite el ciclo.
Esto no lo entendí, así que ya corre por tu cuenta. :cool:
Me parece que con lo expuesto ya podrás tener ideas de cómo seguir.
 
Última edición:
te agradezco mucho, y gracias por el consejo, estudiare mas de programación, ahora estoy entendiendo mas con los ejemplo que me pusiste y la aclaracion que me has dado atte kimer
 
Atrás
Arriba