Autor Tema: Problema con rutinas de Retardos  (Leído 3084 veces)

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

Desconectado Goodfrey

  • PIC12
  • **
  • Mensajes: 87
Problema con rutinas de Retardos
« 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....

Código: [Seleccionar]
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....

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con rutinas de Retardos
« Respuesta #1 en: 11 de Octubre de 2009, 13:36:41 »
Dividamosla por partes, empecemos desde adentro hacia afuera:

Código: ASM
  1. DECFSZ  CONT1,1 (1 O 2)
  2.         GOTO    $-1     (2)
  3.         ...

Acá tenemos (CONT1-1)*3+2 (2 cuando salga del bucle)

Código: ASM
  1. LOOP    MOVLW   .255    (1)
  2.         MOVWF   CONT1   (1)
  3.         DECFSZ  CONT1,1 (1 O 2)
  4.         GOTO    $-1     (2)
  5.         DECFSZ  CONT2,1 (1 O 2)
  6.         GOTO    LOOP    (2)
  7.         ...

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.


Código: ASM
  1. LOOP1   MOVLW   .255    (1)
  2.         MOVWF   CONT2   (1)
  3. LOOP    MOVLW   .255    (1)
  4.         MOVWF   CONT1   (1)
  5.         DECFSZ  CONT1,1 (1 O 2)
  6.         GOTO    $-1     (2)
  7.         DECFSZ  CONT2,1 (1 O 2)
  8.         GOTO    LOOP    (2)
  9.         DECFSZ  CONT3,1 (1 O 2)
  10.         GOTO    LOOP1   (2)
  11.         ...

[ ((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!
No contesto mensajes privados, las consultas en el foro

Desconectado Goodfrey

  • PIC12
  • **
  • Mensajes: 87
Re: Problema con rutinas de Retardos
« Respuesta #2 en: 12 de Octubre de 2009, 00:49:47 »
amigo entendi bien lo que me quisiste decir pero tengo una duda

Código: [Seleccionar]

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....

Código: [Seleccionar]
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)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con rutinas de Retardos
« Respuesta #3 en: 12 de Octubre de 2009, 01:28:31 »
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.
No contesto mensajes privados, las consultas en el foro

Desconectado Goodfrey

  • PIC12
  • **
  • Mensajes: 87
Re: Problema con rutinas de Retardos
« Respuesta #4 en: 12 de Octubre de 2009, 10:36:39 »
Código: [Seleccionar]
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...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con rutinas de Retardos
« Respuesta #5 en: 12 de Octubre de 2009, 11:46:10 »
Son los 2 ciclos de instrucciones que se van a utilizar cuando se llame a la subrutina. Por ejemplo:

Código: ASM
  1. bsf    PORTA,0
  2.     call    Demora_10us
  3.     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:



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!
No contesto mensajes privados, las consultas en el foro