TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Germanio333 en 08 de Septiembre de 2011, 19:44:56

Título: Ayuda calculo rutina de retardo y ciclos de instrucciones (sin software )
Publicado por: Germanio333 en 08 de Septiembre de 2011, 19:44:56
 :)Muy buenos dias, estoy trabajando con un programa en el cual inserto una demora de 1.5 seg, en el main, sin subrutina, pero tengo problemas con calcular el tiempo (1.5 o el que sea), ya que no se que hago mal que no me da cuando cuento los ciclos totales y los multiplico por 1 useg, ya que el osc que uso es de 4Mhz.
Por ahi consegui una pagina para calcularlos (http://www.golovchenko.org/cgi-bin/delay) pero no consigo descifrar la cuenta "que hace" para sacar el tiempo, hasta donde se, entre el "incfsz" y el "goto" se me van 3 ciclos, por lo que deberia multiplicarlo por la cantidad cargada en el contador, pero me da algo distinto a lo calculado en el link que referencie antes.

Por ejemplo:
-----------------------------------------------
   contador1    equ   05h
   contador2    equ   06h

primero   incfsz   contador1,f
           goto           primero   
   
segundo   incfsz   contador2   ,f
           goto           segundo
           nop

end
---------------------------------------------
Con este codigo obtengo (3*5)*(3*6) = 270 ciclos, que seria 270*0.000001seg = 0.27mseg ??? Es decir, esta bien calculado???

AL margen de esto tengo otra duda :mrgreen:: Estoy usando TMR0 como contador con una señal asincrona externa hasta que se desborde. NO necesito las interrupciones pero si el bit T0IF del registro INTCON como bandera de desborde del TMR0. Puedo poner en cero T0IE pero a la vez tener en 1 T0IF ?

Muchas gracias de antemano!
Título: Re: Ayuda calculo rutina de retardo y ciclos de instrucciones (sin software )
Publicado por: AngelGris en 08 de Septiembre de 2011, 20:06:06
  Teniendo en cuenta tu ejemplo, estás cometiendo un error en el cálculo... Como está tu ejemplo, el tiempo total sería, lo que tarda en decrementar contador1 mas lo que tarda en decrementar contador2. Tomando tus valores sería (3*5) + (3*6). Para que sea como vos habías puesto "(3*5)*(3*6)" los contadores tiene que estar anidados...

Código: ASM
  1. movlw 5
  2.   movwf contador2
  3.  
  4. ciclo2
  5.   movlw 6
  6.   movwf contador1
  7.  
  8. ciclo1
  9.   decfsz contador1,f
  10.   goto ciclo
  11.  
  12.   decfsz contador2,f
  13.   goto ciclo2

  De esta manera, para que se decremente un valor contador2, se tiene que decrementar por completo contador1, y el ciclo se repite hasta que contador2 llegue a 0.

  Respecto a la otra pregunta, sí se puede testear el T0IF aunque no habilites las interrupciones ya que el flag sí cambia solo que no se activa la interrupción.
Título: Re: Ayuda calculo rutina de retardo y ciclos de instrucciones (sin software )
Publicado por: Germanio333 en 08 de Septiembre de 2011, 20:32:33
AngelGris miles de gracias por tan pronta respuesta. Soy un bobo, debi mandar el goto al primer lazo, no se como se me escapo eso, pasa cuando la cabeza ya esta muy quemada jeje. Con respecto a la segunda, lo del TMR0 me dejas mas tranquilo, ya que ni WDT ni interrupciones pienso usar.
Estoy terminando un proyecto para cintas de correr, donde cada 200km se activa una bomba de lubricacion, para lubricar la lona de la cinta, que va contando los km recorridos y los guarda en la EEPROM del 16f84 (por si se desenchufa o apaga la maquina) y despues al llegar a 200km activa la bomba de lubricacion durante 1.5seg. Ya casi esta cocinado, lo paso por mplab, si tngo dudas volvere por aca y ya terminado lo publico en el foro.

Miles de gracias!

PD(se debe poner "tema solucionado" o algo asi ???)