Crear ciclos de encendido de un LED

Hola en esta parte quiero saber como encender un LED tantas veces quiera a traves de un ciclo.
Se que si repito el comando lo hago, pero existe una forma de hacerlo automaticamente? este es el codigo:

BSF GPIO,PATA7 ;1
CALL RETARDO_
BCF GPIO,PATA7 ;AGAPA EL LED
CALL RETARDO_
BSF GPIO,PATA7 ;2
CALL RETARDO_
BCF GPIO,PATA7 ;AGAPA EL LED
CALL RETARDO_
BSF GPIO,PATA7 ;3
CALL RETARDO_
BCF GPIO,PATA7 ;AGAPA EL LED
CALL RETARDO_
BSF GPIO,PATA7 ;4
CALL RETARDO_
BCF GPIO,PATA7 ;AGAPA EL LED
CALL RETARDO_
BSF GPIO,PATA7 ;5
CALL RETARDO_
BCF GPIO,PATA7 ;AGAPA EL LED

Espero su ayuda!
Gracias..
 
tal ves la instrucción goto y btfss te sirvan, jejej la verdad estoy frito con el asm de pic
 
Con contadores, cliclo repetitivo... mismo algoritmo de un Delay o retardo.

movlw .10
movwf REP
call CICLO
...
...
CICLO:
BSF GPIO,PATA7 ;1
CALL RETARDO_
BCF GPIO,PATA7 ;AGAPA EL LED
CALL RETARDO_
decfsz REP,F
goto CICLO
return
...
 
creas una variable y cargas el valor 10 para que repita algo así

Prender
movlw .255
movwf portb
delay;poner el tiempo
movlw .0
movwf portb
delay;
decfsz variable ;valor de 10 si llega a cero salta una instrucción llega a end
goto Prender
end; variable 0 fin del programa


Bueno para hacerlo mas corto el programa ,aplica una Xor al puerto y pones el delay ; no me acuerdo la instrucción :oops:
PD:No soy bueno en asm pero me defiendo;)
 
ahhhhhh ok ya entiendo, dejame probar a ver y posteo en resultado mas tarde



ByAxel, en ese caso solamente estas haciendo que prenda indefinido cierto?? lo que quiero es que prenda tantas, ejemplo 10 veces y luego se apague
 
Última edición:
Código:
__config    _IntRC_OSC & _WDT_OFF & _MCLRE_OFF

PATA7       EQU 0           ;GP0 QUE ES LA PATA 7
PATA3     EQU 4             ;GP4 QUE ES LA PATA 3
TIEMPO1   EQU 0CH
TIEMPO2   EQU 0DH
TIEMPO3   EQU 0EH

    ORG 0X1FF            ;VECTOR DE RESET
    ORG 0X00                    ;INICIO DEL CODIGO
    MOVWF OSCCAL
    MOVLW b'11000000'    ;los 0 representan las patas que son de entrada y los 1 las patas que se utilizaran de salida
    TRIS GPIO
    BCF  GPIO,PATA7     ;BORRO LA SALIDA
    BCF  GPIO,PATA3     ;BOROO LA SALIDA

INICIO

        GOTO     CICLO

PAUSA

        CALL     RETARDO
        CALL     RETARDO

RETORNO    
    
        BTFSC GPIO,PATA3
        GOTO  INICIO
        GOTO  RETORNO

CICLO                            
                                    
        MOVLW         .10            
        MOVWF         TIEMPO1        
                                          
REPETIR                            
                                
        BSF         GPIO,PATA7        
        CALL         RETARDO    
                                
        BCF         GPIO,PATA7        
        CALL         RETARDO    
                                
                                                             
        DECFSZ      TIEMPO1             
        GOTO        REPETIR             
                                
GOTO     PAUSA                                                     

RETARDO                        
                    movlw     .90            
            movwf      TIEMPO2    
DECREMENTO3    movlw     .255            
            movwf     TIEMPO3        
DECREMENTO4    clrwdt                
            clrwdt                
            decfsz    TIEMPO3, 1    
             goto      DECREMENTO4    
            decfsz    TIEMPO2, 1    
            goto      DECREMENTO3    
            goto       PDelL2        
PDelL2      clrwdt                    
            return                

END

Hola chicos, ahí el código de lo que estoy haciendo.

Ya hice el ciclo como me dicen y funciona perfecto.

Pero ahora tengo un problema con el botón. la primera vez se queda esperando el pulso para repetir el ciclo, pero cuando lo pulso entra en un bucle y mas nunca espera a que lo pulse para que haga otro ciclo!

No se si es un problema en la inicialización de los puertos de entrada y de salida. Se supone que los unos representa salidas no?? y viceversa con los ceros...
 
Última edición por un moderador:
Pero ahora tengo un problema con el botón. la primera vez se queda esperando el pulso para repetir el ciclo, pero cuando lo pulso entra en un bucle y mas nunca espera a que lo pulse para que haga otro ciclo!

No se si es un problema en la inicialización de los puertos de entrada y de salida. Se supone que los unos representa salidas no?? y viceversa con los ceros...
Está muy extraña la forma en que realizas la estructura del programa.
Recuerda que los bits configurados con 1 siempre serán entradas y los bits configurados con 0 serán salidas.
Si quieres comprobar el estado del pin 3 (GP4) con un pulsador, debes configurarlo como entrada y lo tienes como salida.

Nota que en el PIC12F508 la instrucción RETURN se debe cambiar por un RETLW

Este código hace parpadear un LED 10 veces cada 100Ms por el pin 7 (GP0) cuando hay un 1 en GP4
Código:
    list    p=12f508
    include    p12f508.inc
    __config    _IntRC_OSC & _WDT_OFF & _MCLRE_OFF

    cblock    0x07
    cnt1,cnt2
    contador
    endc

    org        0x1FF            ; Vector de reset
    org     0x00            ; Vector de inicio del programa
    movwf    OSCCAL            ; Recuperar el valor de OSCCAL
    movlw    b'111110'        ; Establecer solo GP0 como salida
    tris    GPIO
    clrf    GPIO            ; Bits configurados como salida en 0 (en este caso solo GP0)

programa
    btfss    GPIO,4            ; Comprueba si GP4 es 1
    goto    $-1                ; No es 1, regresa 1 instrucción
    call    parpadeos        ; Es 1, va a rutina de parpadeos 
    btfsc    GPIO,4            ; Comprueba si GP4 es 0 (Esperar a soltar pulsador)
    goto    $-1                ; No es 0, regresa 1 instrucción
    goto    programa        ; Es 0, realizar un bucle infinito a etiqueta "programa"

parpadeos
    bsf        GPIO,0            ; Enciende LED
    call    retardo_100ms    ; Retardo de 100ms
    bcf        GPIO,0            ; Apaga LED
    call    retardo_100ms    ; Retardo de 100ms
    incf    contador,f        ; Incrementar contador
    movlw    0x0A            ; Cargar 10 en W
    subwf    contador,w        ; Restar hasta llegar a 0
    btfss    STATUS,Z        ; Comparar si Z es 1
    goto    parpadeos        ; No, regresar a parpadeos
    clrf    contador        ; Si, limpiar contador y retornar
    retlw    0x00
    

retardo_100ms
; 99993 ciclos
    movlw    0x1E
    movwf    cnt1
    movlw    0x4F
    movwf    cnt2
retardo_100ms_0
    decfsz    cnt1,f
    goto    $+2
    decfsz    cnt2,f
    goto    retardo_100ms_0
; 3 ciclos
    goto    $+1
    nop
; 4 ciclos (incluyendo call)
    retlw    0x00

    end
Adjunto la simulación y el proyecto en MPLAB por si lo quieres probar. (También funciona físicamente)

Suerte.
 

Adjuntos

  • 12F508 Test.rar
    14.4 KB · Visitas: 4
Última edición:
D@rkbytes muy interesante tu acotacion, gracias por la aclaratoria, voy a comprobar esa informacion y posteo el resultado.

Otra pregunta, que pasa si ese pin3 es una entrada, pero el pulso que le va a entrar es una señal negativa? como podria declarar ese pin?



Sigo con el mismo problema, en el ISIS acciono el boton pero el PIN queda en alta, entra en un bucle y no espera a que vuelva a presionar el boton para que vuelva a hacer el proceso!
 
Última edición:
Otra pregunta. ¿Qué pasa si ese pin3 es una entrada, pero el pulso que le va a entrar es una señal negativa? ¿Cómo podría declarar ese pin?
Lo declaras como entrada, pero entonces le pones una resistencia pull-up o puedes hacer uso de las resistencias pull-up internas configurando el registro OPTION.
Sigo con el mismo problema, en el ISIS acciono el botón pero el PIN queda en alta, entra en un bucle y no espera a que vuelva a presionar el botón para que vuelva a hacer el proceso!
Eso no debe pasar si es que estás usando el diseño que adjunté.
¿Por qué no puede pasar? Por que en dado caso que estés usando otro diseño con pull-up, cuando el programa inicie se realizará la secuencia, pero cuando termine y el programa regrese, se encontrará con una instrucción BTFSC que no permitirá que se reanude la secuencia hasta que el pin 3 esté a nivel bajo nuevamente.

En el programa olvidé limpiar la variable "contador" antes de ingresar a la secuencia.

Esta es la corrección:
Código:
programa
    btfss    GPIO,4            ; Comprueba si GP4 es 1
    goto    $-1                ; No es 1, regresa 1 instrucción
    [B][COLOR=Blue]clrf [/COLOR][/B]   [COLOR=Purple]contador[/COLOR]        ; Limpiar contador
    call    parpadeos        ; Es 1, va a rutina de parpadeos 
    btfsc    GPIO,4            ; Comprueba si GP4 es 0 (Esperar a soltar pulsador)
    goto    $-1                ; No es 0, regresa 1 instrucción
    goto    programa        ; Es 0, realizar un bucle infinito a etiqueta "programa"
Saludos.
 
Atrás
Arriba