Autor Tema: Duda en calculo de retardo  (Leído 8914 veces)

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

Desconectado aprendiz_pic

  • PIC10
  • *
  • Mensajes: 15
Duda en calculo de retardo
« en: 01 de Agosto de 2015, 13:58:17 »
Saludos compañeros soy nuevo en el foro un gusto conocerlos a todos y todas. He estado leyendo e investigando para retomar nuevamente el estudio de los PIC microchip con ensamblador. En mi universidad lleve la materia pero muy por encima. Pues bien, como les comento, he estado repasando y mi duda surge en el calculo de los retardos. Encontre este ejemplo en la web y quise hacer el proceso "a mano" para determinar el tiempo pero no se si esta bien echo, asi que pido de su ayuda. El código es el siguiente:

Código: [Seleccionar]
RETARDO                                                             ;llama de subrutina con call 2
                       movlw         N                                ;1
                       movwf         CONTADOR                 ;1
CICLO             decfsz          CONTADOR,F               ;1*(N-1)+2
                       goto            CICLO                         ;2*(N-1)

donde: N -> es el número a cargar en el CONTADOR
En los comentarios expongo el tiempo que tarda cada instrucción en ejecutarse y esta en microsegundos.

Ahora con lo indicado en los comentatios yo obtube la siguiente formula:
Código: [Seleccionar]
T=2+1+1+1(N-1)+2+2(N-1)

Reduciendo obtengo lo siguiente:
Código: [Seleccionar]
5+1(N-1)+2(N-1)
5+N-1+2N-2
2N+N+5-1-2

T=3N+2

Entonses quiero saber el valor de N para obtener un retardo de 500 microsegundos, por lo tanto:
Código: [Seleccionar]
N=T-2/3   -->  N=500-2/3 = 166

N vale 166 para cargarlo al CONTADOR.

Mi duda es en el procedimiento para obtener la formula en la subrutina, ya que tengo entendido que para tiempos más grandes (1, 2 segundos) se utilizan bucles anidados, entonces antes de hacer estos calculos, primero quiero hacegurarme de que mi procedimiento esta bien.

NOTA: En este mismo foro encontre en un post pasado que para retardos emplean una libreria sacada del libro: Microcontrolador PIC16F84: Desarrollos De Proyectos del autor Lucas J. Lopez.
Me pasaron un pdf del libro pero las hojas estan algo borrosas asi que quiero comprarlo. ¿Ustedes lo recomiendan para comenzar con los pic?, ya que lo que he estado apreniendo es atravez de internet, prueba y error y mis apuntes de escuela.

Algo que se me olvidaba mencionar es que estos calculos los realize tomando en cuenta que estoy utilizando un cristal de 4 Mhz para un pic 16F84A

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Duda en calculo de retardo
« Respuesta #1 en: 01 de Agosto de 2015, 15:15:14 »
Realmente para casos MUY inusuales o de curiosidad para ver si lo puedo sacar haria algo asi. Y me gusta el ASM, pero no le veo sentido romperse la cabeza.

Y tenes un error que contaste el CALL pero no el RETURN,

4 ciclos- CALL + RETURN
2 ciclos- Carga al contador
3(N-1) - 3 ciclos tarda la resta y el GOTO, y esto se produce (N-1) veces
2 - del salto del DECFSZ , para cuando llega a N

4 + 2 + 2 + 3(N-1)

8 + 3(N-1)
3N+5  (ciclos)

Si necesito 500us, serian 500us / Tcy = 500us / 1us = 500 ciclos

(500 - 5) / 3 = 165

En fin, como dije es solo por "curiosidad", o meramente aprendizaje, sino directamente uso algo como esto:

http://www.piclist.com/techref/piclist/codegen/delay.htm

Y te da:

Código: ASM
  1. ; Delay = 1 seconds
  2. ; Clock frequency = 4 MHz
  3.  
  4. ; Actual delay = 1 seconds = 1000000 cycles
  5. ; Error = 0 %
  6.  
  7.         cblock
  8.         d1
  9.         d2
  10.         d3
  11.         endc
  12.  
  13. Delay
  14.                         ;999990 cycles
  15.         movlw   0x07
  16.         movwf   d1
  17.         movlw   0x2F
  18.         movwf   d2
  19.         movlw   0x03
  20.         movwf   d3
  21. Delay_0
  22.         decfsz  d1, f
  23.         goto    $+2
  24.         decfsz  d2, f
  25.         goto    $+2
  26.         decfsz  d3, f
  27.         goto    Delay_0
  28.  
  29.                         ;6 cycles
  30.         goto    $+1
  31.         goto    $+1
  32.         goto    $+1
  33.  
  34.                         ;4 cycles (including call)
  35.         return

Ya tenes tu rutina de delay  :tongue:

« Última modificación: 01 de Agosto de 2015, 15:17:36 por KILLERJC »

Desconectado aprendiz_pic

  • PIC10
  • *
  • Mensajes: 15
Re: Duda en calculo de retardo
« Respuesta #2 en: 02 de Agosto de 2015, 11:40:24 »
Realmente para casos MUY inusuales o de curiosidad para ver si lo puedo sacar haria algo asi. Y me gusta el ASM, pero no le veo sentido romperse la cabeza.

Y tenes un error que contaste el CALL pero no el RETURN,

4 ciclos- CALL + RETURN
2 ciclos- Carga al contador
3(N-1) - 3 ciclos tarda la resta y el GOTO, y esto se produce (N-1) veces
2 - del salto del DECFSZ , para cuando llega a N

4 + 2 + 2 + 3(N-1)

8 + 3(N-1)
3N+5  (ciclos)

Si necesito 500us, serian 500us / Tcy = 500us / 1us = 500 ciclos

(500 - 5) / 3 = 165

En fin, como dije es solo por "curiosidad", o meramente aprendizaje, sino directamente uso algo como esto:

http://www.piclist.com/techref/piclist/codegen/delay.htm

Y te da:

Código: ASM
  1. ; Delay = 1 seconds
  2. ; Clock frequency = 4 MHz
  3.  
  4. ; Actual delay = 1 seconds = 1000000 cycles
  5. ; Error = 0 %
  6.  
  7.         cblock
  8.         d1
  9.         d2
  10.         d3
  11.         endc
  12.  
  13. Delay
  14.                         ;999990 cycles
  15.         movlw   0x07
  16.         movwf   d1
  17.         movlw   0x2F
  18.         movwf   d2
  19.         movlw   0x03
  20.         movwf   d3
  21. Delay_0
  22.         decfsz  d1, f
  23.         goto    $+2
  24.         decfsz  d2, f
  25.         goto    $+2
  26.         decfsz  d3, f
  27.         goto    Delay_0
  28.  
  29.                         ;6 cycles
  30.         goto    $+1
  31.         goto    $+1
  32.         goto    $+1
  33.  
  34.                         ;4 cycles (including call)
  35.         return

Ya tenes tu rutina de delay  :tongue:



Ok, entiendo y si tienes razon el de para que romperse la cabeza. Queria saber si mi procedimiento estaba correcto jejeje, y gracias por la observacion del RETURN.
Una pregunta con respecto al enlace del calculador que compartes: Veo que se puede calcular la rutina de retardo a partir de el número de ciclos o en segundos pero, si por ejemplo necesito que sea en milisegundos o microsegundos, ¿Como seria?.

Investigando un poco sobre las conversiones se que un milisegundo es 10-3 o lo que es lo mismo 1/1000=0.001
para micro segundos creo que es 10-6 o lo que es lo mismo 1/1000000=0.000001

entonces si por ejemplo deseo una rutina de retardo para eliminar rebote de un push button, por lo que se mas o menos con 20 milisegundos la puedo eliminar por lo tanto:
0.001/20=0.02 y colocando este valor en el calculador da por codigo lo siguiente:
Código: [Seleccionar]
; Delay = 0.02 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.02 seconds = 20000 cycles
; Error = 0 %

cblock
d1
d2
endc

RETARDO
;19993 cycles
movlw 0x9E
movwf d1
movlw 0x10
movwf d2
RETARDO_0
decfsz d1, f
goto $+2
decfsz d2, f
goto RETARDO_0

;3 cycles
goto $+1
nop

;4 cycles (including call)
return

¿El proceso que estoy siguiendo para calcular esto es correcto?, asi que si si lo es, para calcular en microsegundos seria exactamente lo mismo.

Saludos KILLERJC :)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Duda en calculo de retardo
« Respuesta #3 en: 02 de Agosto de 2015, 11:53:56 »
Si, es correcto. Yo por ahi hablo de ciclos por que uno puede cambiar el oscilador. Cuanto tarda un ciclo es la inversa de frecuencia del oscilador por 4

Tcy = 4 / Fosc

Si es 4Mhz

Tcy = 4 / 4Mhz = 4 / 4000000 Hz = 1us ( es lo que tarda un ciclo interno )

Del codigo que pasaste:
Citar
; Actual delay = 0.02 seconds = 20000 cycles
; Error = 0 %

20000 ciclos * 1us = 20000us o 20ms ( si lo divido por 1000)

Si pones un cristal de 8Mhz por ejemplo ahora tu ciclo es de 0.5us y ese retardo es de
20000 ciclos *  0.5us = 10ms

----------------------------------------------------------

Si necesitas pasar de 10^-3 a 10^-6

1 * 10^-3 = 0.001    (3 lugares luego de la coma)
1 * 10^-6 = 0.000001 (6 lugares luego de la coma)

20 * 10^-3 = 0.020 = 0.02

Desconectado aprendiz_pic

  • PIC10
  • *
  • Mensajes: 15
Re: Duda en calculo de retardo
« Respuesta #4 en: 02 de Agosto de 2015, 13:02:43 »
Si, es correcto. Yo por ahi hablo de ciclos por que uno puede cambiar el oscilador. Cuanto tarda un ciclo es la inversa de frecuencia del oscilador por 4

Tcy = 4 / Fosc

Si es 4Mhz

Tcy = 4 / 4Mhz = 4 / 4000000 Hz = 1us ( es lo que tarda un ciclo interno )

Del codigo que pasaste:
Citar
; Actual delay = 0.02 seconds = 20000 cycles
; Error = 0 %

20000 ciclos * 1us = 20000us o 20ms ( si lo divido por 1000)

Si pones un cristal de 8Mhz por ejemplo ahora tu ciclo es de 0.5us y ese retardo es de
20000 ciclos *  0.5us = 10ms

----------------------------------------------------------

Si necesitas pasar de 10^-3 a 10^-6

1 * 10^-3 = 0.001    (3 lugares luego de la coma)
1 * 10^-6 = 0.000001 (6 lugares luego de la coma)

20 * 10^-3 = 0.020 = 0.02

Ya voy entendiendo, ahora lo vemo más claro, si es es en donde me atoraba. Muchas gracias por tu gran ayuda, y por compartirme el calculador jejeje, ahora ya puedo seguir avanzando.
Al final siempre si me compre el libro que mencionaba, muy buen libro.

Gracias nuevamente y ahora  aseguir con el ASM y MPLAB  :D