Autor Tema: ¿Cuanto tiempo es esta demora? (sin TMR0) - p16F628A  (Leído 3248 veces)

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

Desconectado 9kRPM

  • PIC10
  • *
  • Mensajes: 2
¿Cuanto tiempo es esta demora? (sin TMR0) - p16F628A
« en: 16 de Octubre de 2016, 00:38:41 »
He visto una serie de ejemplos en este foro de programas en assembler, uno de ellos para hacer demoras sin usar el timer0 en el que usaban dos contadores seguidos, en ese caso la demora era de 192 milisegundos, y abajo habia una ecuacion que explicaba el calculo, pero se me complicaba mucho. Asi que para hacer  una demora de un segundo lo pense de otra manera pero queria sabe si esta bien. En este caso son 3 contadores (uno adentro de otro) cuando se termina de decrementar uno, se carga para poder ser usado nuevamente en la proxima pasada. Lo que dejo abajo es el codigo de la subrutina solamente, antes de llamarla cargue los valores de los contadores al principio del programa.


Código: ASM
  1. ........               ..........
  2.                               ........               ..........            
  3. DELAY1s                
  4.                                 decfsz          CONT1,f         ; decfsz(1) + goto(2) = 3 microsegundos
  5.                                 goto            RETARDO         ;  3 x CONT1(2) x RETARDO(161494) = 968964
  6.                                 movlw           .2                      ;  DELAY1s = 968964 + movlw(1) + movwf(1) + return(2) = 968968 microsegundos.
  7.                                 movwf           CONT1           ;
  8.                                 return
  9.  
  10.  
  11. RETARDO
  12.                                 decfsz          CONT2,f         ; decfsz(1)+goto(2)=3 microsegundos
  13.                                 goto            RETARDO2        ;  3 x CONT2(70) x RETARDO2 (769) = 161490
  14.                                 movlw           .70                     ;  RETARDO= 161490 + movlw(1) + movwf(1) + goto(2) = 161494 microsegundos
  15.                                 movwf           CONT2           ;
  16.                                 goto            DELAY1s
  17.  
  18.  
  19. RETARDO2
  20.                                 decfsz          CONT3,f         ;  decfsz(1)+ goto(2)= 3 microsegundos.
  21.                                 goto            RETARDO2        ;  3 x CONT3(255) = 765 microsegundos
  22.                                 movlw           .255            ;  RETARDO2 = 765 + movlw(1)+movwf(1)+goto(2) = 769 microsegundos
  23.                                 movwf           CONT3           ;
  24.                                 goto            RETARDO

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Cuanto tiempo es esta demora? (sin TMR0) - p16F628A
« Respuesta #1 en: 16 de Octubre de 2016, 03:20:40 »
Esta bien el programa y el calculo en su mayoria.. Aunque por ejemplo no tenes en cuenta que el DECFSZ al saltar ocupa 2 Tcy, en ves de 1.

Por lo cual RETARDO2 seria 770us, a RETARDO le tengas que sumar al final 1 microsegundo mas, y tal ves ahi tenes la diferencia.

Si queres saber cuando es que tarda tu rutina, podes usar el MPLAB, poner el codigo, simularlo, y con el stopwatch ver lo que tarda (si esta configurado correctamente el oscilador) y cuantos ciclos de instrucciones realiza todo el conjunto.

Pienso que esto es para algo didactico, sino no vale la pena hacer un delay asi

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

Para la proxima ves si necesitas generar un delay podes usar uno online ( es mas facil que romperse la cabeza innecesariamente ). Aunque como decia antes, si tu idea es aprender, es un buen camino. Pero con que tengas idea de como funciona mejor.

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


Código: ASM
  1. Delay1s
  2.                         ;999990 cycles
  3.         movlw   0x07
  4.         movwf   d1
  5.         movlw   0x2F
  6.         movwf   d2
  7.         movlw   0x03
  8.         movwf   d3
  9. Delay_0
  10.         decfsz  d1, f
  11.         goto    $+2
  12.         decfsz  d2, f
  13.         goto    $+2
  14.         decfsz  d3, f
  15.         goto    Delay_0
  16.  
  17.                         ;6 cycles
  18.         goto    $+1
  19.         goto    $+1
  20.         goto    $+1
  21.  
  22.                         ;4 cycles (including call)
  23.         return

Desconectado 9kRPM

  • PIC10
  • *
  • Mensajes: 2
Re:¿Cuanto tiempo es esta demora? (sin TMR0) - p16F628A
« Respuesta #2 en: 16 de Octubre de 2016, 11:26:13 »
Gracias por responder, es para un examen asi que no voy a poder probar en mplab ni usar lo del delay online.
Tengo otra pregunta, ¿como seria el calculo de tiempo de esa subrutina? Segun yo es d1 multiplicado por la cantidad de ciclos de su propio bucle (2 para los goto, 1 para el decfsz si no llego a cro,etc), que en este caso d1=7 y la cantidad de ciclos del bucle es de 7 tambien. 7x7=49. A esto le sumo el tiempo de d2 que es 47 x 7(la misma cantidad de ciclos que para el d1).  49+(47 x 7) =378. Le sumo el tiempo de d3 que es 378+(3x7)=399.   y a esto ultimo le sumo la cantidad de ciclos que nunca entran en los bucles que son los movlw, movwf, los 3 goto$1, el return y el call. 399+16=415. No me da ni cerca de 1 segundo. Sume los valores de los retardos porque se termina de decrementar uno y comienza a decrementar otro, por eso no me parecio logico que enves de sumarse se multiplicaran, pero aun asi multiplique los tres valores y tampoco llego al segundo. ¿En que me estoy equivocando? 

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re:¿Cuanto tiempo es esta demora? (sin TMR0) - p16F628A
« Respuesta #3 en: 16 de Octubre de 2016, 11:57:26 »
yo te sugiero que utilices un simulador y corras la rutina para que puedas comprender y veas los tiempos que transcurren.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Cuanto tiempo es esta demora? (sin TMR0) - p16F628A
« Respuesta #4 en: 16 de Octubre de 2016, 12:42:00 »
Ahora si perdon.. este es un mensaje editado con la respuesta.

Tu problema con el calculo esta en que no estas contando cuando no d1 o d2 llegan a 0, en ese punto si pasa por el DECFSZ pasan a tener le valor 255.

Otra consideracion previa antes de dar el calculo, para llegar del primer decfsz ( el de d1 ), dar toda la vuelta, y volver al mismo decfsz si o si tenes 7 ciclos. Si el primer defsz no salta, tenes 3 GOTO + 1 DEFCSZ, Si el primero salta, tenes 2 del primer DECFSZ, 1 del proximo DECFSZ y luego 4 de los GOTO, lo mismo se corrobora si los 2 primeros decfsz saltan, como ves sea donde sea tenes SIEMPRE 7 ciclos.
El unico caso que esto no se cumple es cuando se sale, que se ejecutan 3 saltos de DECFSZ y por lo tanto son 6 ciclos.

Aca es donde se complica un poco mas el tema.

Como te decia para cuando d2 vale 47 ( 0x2F ) d3 solo tiene quedar 7 (0x7) vueltas, pero cuando d2 vale 46 o menos, tiene quedar 256 vueltas.
De la misma forma ocurre con d3, el primero de estos significa que d2 solo da 47 vueltas ( de la cual como dijimos antes una es de 7 nomas ), y las demas de 256.

Ahora como obtener esto, asi:

- Son 2 vueltas de d3, las cuales cada vuelta de d3 son 256 de d2, y a su vez cada una de d2 son 256 de d1, y 7 ciclos cada uno de d1 como dijimos, por lo tanto:
2 * 256 * 256 * 7 = 917.504 ciclos
**Caso de vueltas "completas" de d3, observese que d3 eran 3, y tomamos 1 menos**

- Luego tenemos la vuelta restante de d3 ( recorda que eran 3 ) en las que d2 tiene vueltas "completas" de d1, es decir las 46 restantes ( 1 menos de lo que tiene )
1 * 46 * 256 * 7 = 82.432 ciclos
**Caso de vueltas "completas" de d2, aca tambien tomamos uno menos**

- d3 tambien tiene un par de vueltas mas, recorda que empezamos con 7, y hasta ahora no las tuvimos en cuenta, y que corresponden cuando d2 es 47, pero 1 vuelta es la de salida. Por lo tanto:
1 * 1 * 6 * 7 = 42 ciclos
**Caso de vueltas "completas" de d1, aca tambien tomamos uno menos que corresponde a cuando sale**

- Finalmente la vuelta de salida que son 6 ciclos mas.

Resultado final:
999.984

Que sumado a los 6 ciclos de los MOVLW / MOVWF anteriores dan los 999.990 especificados en el codigo
« Última modificación: 17 de Octubre de 2016, 14:54:22 por KILLERJC »


 

anything