Ciclos de reloj y tiempo para delays 16f84

Pues estoy trabajando con delays en un pic16f84a, un cristal de 4MHz, y quiero calcular el tiempo que hago de retardo con una delay. 4 MHz son 4.000.000Hz que quiere decir que una instruccion tarda 4us que son 0,004ms, no? Me parece que no iba así. Cuanto tarda en ejecutar una instrucción?

Porque cuanto tardaría en ejecutar esto?


DELAY

movlw 0xFF
DLOOP
movwf DCOUNT
nop
decfsz DCOUNT,W
goto DLOOP

movlw 0xFF
DLOOP2
movwf DCOUNT
nop
decfsz DCOUNT,W
goto DLOOP2


Gracias :D
 
A ver, os ahorro la tarea de contar las instrucciones de este programa que he escrito:

unas 2040 instrucciones? y esto cuanto tiempo demora al pic¿


seria esto, verdad? Esque en Micros me estoy iniciando y ops:
 
hola...el reloj del pic se divide entre 4....4Mhz/4=1Mhz

en pocas palabras las instrucciones duran 1uS.

entonces :
Código:
delay       movlw 0xFF
                movwf variable_1

delay_1  movlw 0xFF
               movwf variable_2
delay_2   decfsz variable_2,F
               goto delay_2
               decfsz variable_1,F
               goto delay_1
               return

este instrucciones va tardar....si vemos la variable 1 se carga con 255 y variable dos tambien
entonces se va a decrementar variable_2 uno en uno, osea va tardar 255 ciclos, cuando termine de
decrementar va a decrementar a uno la variable 2, y asi sucesivamente, hasta decrementar la variable 1 hasat cero y regresa..

255x255=65025 ciclos y eso se multiplica por el tiempo
65025x1uS=65.025 mS de retardo.
 
Ah claro ya lo entiendo! Luego para crear un delay de más de medio segundo necesito tres variables, y hacerlas encadenadas en vez de consecutivas. Con tres variables consigo un delay máximo de 255*255*255 que son aprox 16000000 uS= 16 segundos.

Por lo que veo, la instrucion de goto no gasta tiempo? Porque hay un poquito más de instrucciones de las que has dicho

Lo que tampoco entiendo es porque pones decfsz variable_2, F , no tendría que ser decfsz variable_2,variable_2?


porque la idea de incluir de incluir instrucciones de no-operacion para que cada ciclo tenga más instrucciones?
 
goto consume 2 ciclos y si afecta...mucho si usas este metdo de temporizacion...yo he usado el timer0...
pero por ahora te consego que vas asi bien por ahora...

ahora usa decfsz variable_1,F esta instruccion decrementa la variable y la guarada el resultado en el misma variable,

variable_2=variable_2-1

y asi...

si usas decfsz variable_2,w

solo haces..

w=variable_2-1

y no te va funcionar porque el regitro w es donde se guarda temporalmente un valor, y ese valor lo desecha cuando se sobre escribe en w.

por ejemplo:

movlw 0x01 ;carga w con 1
movlw 0x02 ;borra el uno de w y guarda a w el 2
movwf variable ; y lo que se va a guardar en la variable es lo que tuvo lo ultimo guardado en w.

espeor que no te alla confundido :)
 
Si, puedes hacer bucles anidados para lograr retardos muy largos, las instrucciones duran un ciclo de máquina, para un oscilador de 4MHz es 1µs, exepto las de salto que duran dos ciclos, por ejemplo goto o call, y en las condicionales como decfsz que duran un ciclo mientras la condición no se cumple y dos ciclos cuando la condición se cumple y salta...

Si necesitas calcular retardos de forma rápida y fácil usa alguno de estos programas:

http://www.golovchenko.org/cgi-bin/delay

http://www.todopic.com.ar/utiles/calcular_retardos.zip

La F en decfsz variable_2, F indica que el resultado será guardado en el mismo registro variable_2... las instrucciones nop se usa para aumentar el tiempo del bucle o ajustar, cada nop gasta un ciclo de máquina.

 
jejeje creo que me ayudarian si tengo un reloj int del pic 16f628a a 37KHz cuanto tiempo tarda cada instruccion.

por que si entiendo en el caso de tener un reloj a 4Mhz , un ciclo mauina tarda 4 ciclos reloj
entonces 1Mciclos maquina =4Mciclos Reloj, pero de donde sacan eso de que cada instrucion maquina tarda 1us jejeje

necesito algo de matematicas si alguien me lo puede explicar y para el reloj de 37Khz interno del pic 16F628A
 
Paso a paso
Para 4Mhz, un ciclo reloj es 1/4000000=0.25us. Un ciclo máquina son cuatro ciclos reloj 4*0.25us=1us.
Para 37Khz, un ciclo reloj es 1/37000=27.027us. Un ciclo máquina 4x27.027us=108.108us.
Cada instrucción dura un ciclo máquina, excepto las de salto como goto, call, y las decfs dependen de si se cumple el salto o no.
 
Ese libro es muy bueno, pero la página que puse tiene la ventaja de que es gratis, está disponible las 24 horas y explica paso a paso como calcular los retardos. Resumiendo: es genial! y no lo digo porque yo sea el autor :p
 
Parece que la idea es sacado del libro. Pues si, está bien explicado. Hace tiempo que ya no actualizas tu blog.

PD: Juraría que tenías otro nick.
 
Conozco el libro pero la verdad es que nunca lo he usado. Al final no importa si se aprende con el libro o con la página, lo cierto es que la idea es la misma. Lo importante es darse cuenta que siguiendo una lógica muy sencilla se pueden programar retardos de cualquier duración.

También hay que tener en cuenta que los retardos son útiles pero tienen su lado oscuro y es que esclavizan al micro a realizar la misma tarea (el retardo en si mismo) durante todo el tiempo que dura éste por lo que se desperdician muchos ciclos de proceso. Una solución para esto puede ser usar alguno de los timers. Por ejemplo el temporizador timer 0.

PD: @Meta no te equivocas, pero el otro nick quedó arrumbado hace tiempo así que esto es borrón y cuenta nueva
 
Hablando de ciclos de reloj, ¿Cual es la manera más efectiva para introducir un delay de 10,20 o 30 min en un microcontrolador? (para evitar que éste se "pierda")
 
Hablando de ciclos de reloj, ¿Cual es la manera más efectiva para introducir un delay de 10,20 o 30 min en un microcontrolador? (para evitar que éste se "pierda")
Este ejemplo que adjunto en PICC, sirve para hacer un retardo de 1 segundo.
Puede ser usado para hacer un RTC (Reloj en Tiempo Real)
Se basa en usar un cristal de 32768 Hz con el oscilador externo T1OSI, T1OSO de algunos PIC.
Este ejemplo puede ser usado como base para lograr retardos de tiempo largos (Horas)
Incluso para hacer un reloj con displays en modo multiplex, ya que la temporización no afecta el programa.

Notas:
Programa para un 16F628A (Aplicable a otros PIC con los cambios básicos al programa)

Saludos.
 

Adjuntos

  • 16F628A TMR1 1Seg Base.rar
    38.3 KB · Visitas: 237
  • TMR1 1Hz. SCH.jpg
    TMR1 1Hz. SCH.jpg
    56.9 KB · Visitas: 118
Última edición:
Hola amigos . uds saben como se puede hacer prender una secuencia determinada 24 veces por segundo?? seria con un pic 16f628. la idea es hacer que entren 24 escenas en un segundo para 8 leds.

Saludos
 
Atrás
Arriba