Pic

Tengo que programar la secuencia de un semáforo en el PIC 16F84.
Las luces se van a simular con LED´s.
Sé que requiero generar la seuencia (1 a la salida para los LED´s). Lo que no sé es como generar el retardo para que se pueda ver la secuencia ¿Lo puedo hacer con el comando NO? ¿Cómo puedo genear un loop para que se repita indefinidamente la secuencia?
Muchas gracias.
Atentamente.,
Freddy
Respuesta
1
Si el comando NO lo usas pero, como en un loop en el que decrementas una variable y preguntas si llegaste a cero para seguir o devolverte.
Éxitos.
Piccasso

4 respuestas más de otros expertos

Respuesta
1
Para generar retardos se usan rutinas muy sencillas con ciclos un ejemplo puede ser el siguiente (lo llamas como subrutina ejemplo CALL RETARDO). La rutina tiene 2 ciclos anidados y va decrementando registros auxiliares (VAR1, VAR2) previamente definidos, solo los vas decrementando y preguntando si llegaron a CERO, cuando esto se cumpla en el ciclo mayor (el que anida al otro) la rutina termina y se regresa al punto donde fue llamada, son dos rutinas las que pongo porque es tan rapido el PIC que un solo ciclo es demasiado lento, si se pone lento de más, cambia el valor que se le ingresa a VAR1.
RETARDO ;INICIA SUB
MOVLW FFH
MOVWF VAR1
Ret1 ;el primer cilco empieza aquí
MOVLW FFH
MOVWF VAR2
RET2 ;ESTO ES EL
DECFSZ VAR2,1 ;SEGUNDO CICLO (ANIDADO)
GOTO RET2
DECFSZ VAR1,1 ;ESTO ES DEL 1 CICLO
GOTO RET1
RETURN ;FIN DE LA SUB
Como puedes ver es muy sencilla, muy usada, también se puede hacer con el contador del PIC con el cual tienes la ventaja de cambiar un PRESCALER al cual le indicas a los cuantos ciclos de reloj va a haber un cambio en el Timer (TMR0), aunque aquí ya intervienen más banderas.
Esta rutinas que te envío es superusada y se usa más que nada en programas cortos o sencillos.
Cualquier Cosa cuentas con mi ayuda, espero tu proyecto salga como quieres.
Que la pases exceletente.
P.D. Te pido por favor que si no tienes más preguntas por favor finalices esta pregunta del foro (y si gustas darme buena puntuación), recuerda que la gente de esta comunidad ofrecemos nuestra ayuda incondicionalmente, solamente recibimos la gratitud de nuestros "colegas".
Respuesta
1
El delay se hace así:
DELAY MOVLW .100
MOVWF REGISTRO1
BB MOVLW .100
MOVWF REGISTRO2
AA no
NO
DECFSZ REGISTRO2
GOTO AA
DECFSZ REGISTRO1
GOTO BB
RETLW 0
AGREGANDO MÁS ANIdados se logra más tiempo. También incrementando el valor que se carga en w.
Esta es una subrutina que se llama con un call.
Se prende la luz, se llama al call y se apaga la luz.
Por supuesto que este tiempo es muy pequeño pero un anidado más ya lo hace bastante largo. Suerte
Respuesta
1
Haz un loop que dependa de un parámetro, esto te permitirá regular el tiempo de una manera fácil. Por ejemplo
movlw parámetro
movwf 0x10
Bucle
No
No
Decfsz 0x10
goto bucle
La posición 0x10 será el contador, y este bucle durará 5 useg POR parámetro.
Si lo que quieres es un filtro sin fin, haz simplemente:
loop
goto loop.
Respuesta
1
Puedes utilizar el TIMER del PIC. O si lo prefieres puedes realizar una subrutina. La siguiente es una subrutina de retardo QUE * 100ms. QUE puede estar dentro del rango de 1 - 256.
; ************************************************************
; * FUNCTION: Delays for around K x 100 ms @ 4MHz *
; * EXAMPLE : K = 100, delays 10 seconds *
; * ENTRY : K in W, range 1 - 256 *
; * EXIT : Flags and W altered; Files 30:1:2h zero *
; ************************************************************
COUNT_H equ 30h ; 2-byte counter
COUNT_L equ 31h ; at File 20:1h
K equ 32h ; Temporary storage for K
N equ d?130? ; Delay parameter
DELAY_K100MS
movwf K ; Put K away in a register file
; Task 1: DO 100ms delay
movlw N; Set up high count to 130
movwf COUNT_H
clrf COUNT_L ; and low count to 256
DK_LOOP
decfsz COUNT_L,f ; Decrement LS count to zero
goto DK_LOOP ; taking in all H*[(256*3)-1]?
decfsz COUNT_H,f ; Repeat for the MS byte
goto DK_LOOP ; taking in all (H*3)-1?
; Task 2: Decrement K
decfsz K,f
; Task 3: WHILE K > 0
goto DK_LOOP ; REPEAT WHILE K > 0
FINI return
Espero que te sea de gran ayuda. Solo tienes que guardar en el registro W el valor de QUE, y luego llamar la subrutina utilizando la instrucción call. No olvides calificar.
Necesito varios (entre 0,2 y 1 segundos). Me interesa saber un procedimiento general para poder generar cualquier retardo (en el rando de tiempo especificado).
Atentamente.,
Freddy
¿Qué tan largo es el retardo, que necesitas?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas