TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Goodfrey en 11 de Octubre de 2009, 12:24:26
-
Buenas señores como estan, estoy empezando en esto de programacion del PIC16F84A y tengo problemas a la hora de crear rutinas de retardos.... por ejemplo estoy solamente viendo como hago para encender un leds cada medio segundo, pero necesito entender bien como se hace esas rutinas apie... e revisado el foro y en su mayoria de la gente utiliza un programa para hacer dichas rutinas de retardo yo tambien puedo hacerlo pero necesito entenderlo por que en el examen que tengo sobre esta materia no puedo usar dicho programa asi que por favor espero poder encontrar la ayuda que necesito con uds...
aqui tengo algo que e echo hasta los momentos para que uds me corrigan si esta malo o no por favor....
RETARDO
MOVLW .255 (1)
MOVWF CONT3 (1)
LOOP1 MOVLW .255 (1)
MOVWF CONT2 (1)
LOOP MOVLW .255 (1)
MOVWF CONT1 (1)
DECFSZ CONT1,1 (1 O 2)
GOTO $-1 (2)
DECFSZ CONT2,1 (1 O 2)
GOTO LOOP (2)
DECFSZ CONT3,1 (1 O 2)
GOTO LOOP1 (2)
RETURN (2)
RET = 1+1+1+1+1+1+[((1+2)(CONT1-)+2+1+2+1+2+2)(CONT2-1)+2](CONT3-1)+4
espero se entienda un poco mas o menos lo que e echo y es simplemente sumar las rutinas para ver si estan bien echas.... no importa el tiempo que tarde esas 3 rutinas es solo para determinar mas o menos como seria la formula final....
-
Dividamosla por partes, empecemos desde adentro hacia afuera:
DECFSZ CONT1,1 (1 O 2)
GOTO $-1 (2)
...
Acá tenemos (CONT1-1)*3+2 (2 cuando salga del bucle)
LOOP MOVLW .255 (1)
MOVWF CONT1 (1)
DECFSZ CONT1,1 (1 O 2)
GOTO $-1 (2)
DECFSZ CONT2,1 (1 O 2)
GOTO LOOP (2)
...
Ahora tenemos: ((CONT1-1)*3 + 2 + 1 + 2 + 1 +1)*(CONT2-1)+2
Paso a paso seria: Ciclos utilizados en el primer lazo + ciclo de decfsz + 2 ciclos del goto + 2 ciclos del movlw y movwf y los últimos 2 cuando salga del lazo.
LOOP1 MOVLW .255 (1)
MOVWF CONT2 (1)
LOOP MOVLW .255 (1)
MOVWF CONT1 (1)
DECFSZ CONT1,1 (1 O 2)
GOTO $-1 (2)
DECFSZ CONT2,1 (1 O 2)
GOTO LOOP (2)
DECFSZ CONT3,1 (1 O 2)
GOTO LOOP1 (2)
...
[ ((CONT1-1)*3 + 2 + 1 + 2 + 1 +1)*(CONT2-1)+2 + 1 + 2 + 1 + 1 ]*(CONT3-1) + 2
Paso a paso de nuevo: Ciclos de los 2 lazos anidados + 1 del decfsz + 2 goto + 2 del movlw y movwf + 2 cuando salga del lazo.
A todo esto se debe agregar 2 del call, 2 de movlw y movwf iniciales y 2 del return:
[ ((CONT1-1)*3 + 2 + 1 + 2 + 1 +1)*(CONT2-1)+2 + 1 + 2 + 1 + 1 ]*(CONT3-1) + 2 + 2 + 2 + 2.
Espero no haberme equivocado en algún paso :roll:
Saludos!
-
amigo entendi bien lo que me quisiste decir pero tengo una duda
RETARDO
MOVLW .255 (1)
MOVWF CONT3 (1)
Estas 2 lineas al principio del codigo no la veo que la tomaste en cuenta por ningun lado....
que tanto me afecta en la ecuacion general si no se registra estas 2 instrucciones....
LOOP1 MOVLW .255 (1)
MOVWF CONT2 (1)
LOOP MOVLW .255 (1)
MOVWF CONT1 (1)
DECFSZ CONT1,1 (1 O 2)
GOTO $-1 (2)
DECFSZ CONT2,1 (1 O 2)
GOTO LOOP (2)
DECFSZ CONT3,1 (1 O 2)
GOTO LOOP1 (2)
RETURN (2)
-
A todo esto se debe agregar 2 del call, 2 de movlw y movwf iniciales y 2 del return:
[ ((CONT1-1)*3 + 2 + 1 + 2 + 1 +1)*(CONT2-1)+2 + 1 + 2 + 1 + 1 ]*(CONT3-1) + 2 + 2 + 2 + 2.
-
A todo esto se debe agregar 2 del call, 2 de movlw y movwf iniciales y 2 del return:
[ ((CONT1-1)*3 + 2 + 1 + 2 + 1 +1)*(CONT2-1)+2 + 1 + 2 + 1 + 1 ]*(CONT3-1) + 2 + 2 + 2 + 2.
OK amigo muchisimas gracias por las dudas, pero todavia no tengo bien en claro el por que tengo que agregarle 2 del call, entiendo muy bien que hay que agregarle 2 por movlw y movwf y 2 del return.... pero esos 2 del call por que serian.... solo quiero estar 100% seguro para no cometer mas errores...
-
Son los 2 ciclos de instrucciones que se van a utilizar cuando se llame a la subrutina. Por ejemplo:
bsf PORTA,0
call Demora_10us
bcf PORTA,0
En ese caso si el calculo de demora de 10us para un cristal de 4MHz no tiene en cuenta los ciclos que se usan en el llamado, el pin RA0 se mantendrá en alto 13us. Una figura que aclare la idea:
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=27917.0;attach=10293)
Como se ve si se quiere ser muy preciso en el pulso también hay que tener en cuenta el tiempo en el que se activa y desactiva la señal. (bsf y bcf)
Saludos!