TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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!
-
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...
movlw 5
movwf contador2
ciclo2
movlw 6
movwf contador1
ciclo1
decfsz contador1,f
goto ciclo
decfsz contador2,f
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.
-
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 ???)