TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Miquel_S en 30 de Noviembre de 2009, 14:06:52

Título: Ayuda con TMR0 en lenguaje C
Publicado por: Miquel_S en 30 de Noviembre de 2009, 14:06:52
Hola compañeros de correrias estoy empezando con el lenguaje C y tengo una duda con el TMR0 que no entiendo:

Para generar una señal de 1KHz se necesita un semiperiodo de 500us segun la ecuacion, utilizando un cristal de 4MHz y un prescaler de 2:

 T=Tcm·Prescaler·(256-CargaTMR0)
 
  500us = (4/4000000)·2·(256-x)  donde x = 6 Hasta aqui lo tengo claro.

Luego sigo leyendo el texto y me dice:
Pero esta relacion solo se cumple si se trabaja en ASM. Al trabajar en C, el compilador genera lineas de codigo que aumentan el tiempo de ejecucion del programa y, por ello, es necesario ajustar el valor final. En este caso se ha utilizado un valor de carga de 29 (0x1D).
Mi duda: Como calculo este valor.
Gracias.

Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: Suky en 30 de Noviembre de 2009, 14:21:30
mmm... es medio complicado, porque depende de cuantas interrupciones manejes, el microcontrolador que utilices, ect. La única manera de ver (Que sepa yo :mrgreen:) es en el debug de Proteus, donde presionando CTRL + D, se puede visualizar el asm del código desarrollado en C. A partir de allí se puede estimar cuanto demora el gurdado de contexto.

Saludos!
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: Miquel_S en 30 de Noviembre de 2009, 18:17:05
Gracias Suky por tu respuesta, voy a probar de la manera que dices ya que en ASM me defiendo mejor, y creo que no tendre problemas para contar los ciclos de cada instruccion.
 
 Saludos y gracias de nuevo.
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: migsantiago en 30 de Noviembre de 2009, 18:22:30
Hola, la otra opción es usar un osciloscopio y agregar o quitar bits al tmr0 jeje

Yo tengo una tarjeta de muestreo de 22kHz con periodo de 45.45us, pero los tiempos duraban 47us. Tuve que estar reprogramando el pic y midiendo con el osciloscopio hasta que le atiné a los 45.45us  ;-)
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: jhozate en 30 de Noviembre de 2009, 18:26:05
si se requiere ser mas exactos, no se puede implementar la rutina del timer en asm?
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: migsantiago en 30 de Noviembre de 2009, 18:34:06
si se requiere ser mas exactos, no se puede implementar la rutina del timer en asm?

Hola Jhozate, sí se puede pero lo que retrasa el tiempo es la rutina que no vemos en C que es la que hace una copia de seguridad de W, STATUS, memoria scratch de C (si es que así se llama) y demás registros que hay que proteger cuando se atiende una interrupción.

También hay una forma de atender la interrupción en CCS sin que se haga la copia de seguridad pero no recuerdo con qué directivas se hace.
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: jhozate en 30 de Noviembre de 2009, 19:28:00
sino estoy mal...en proteus hay una herramienta q permite mostrar la frecuencia de alguna entrada de pulsos, (counter timer,que alguien me diga si estoy equivocado) para los no poseemos osciloscopio, qué tan fiable seria esa herramienta?..asi se podrian pobrar distintos ajustes del timer sin reprogramar el micro
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: Suky en 30 de Noviembre de 2009, 23:18:15
sino estoy mal...en proteus hay una herramienta q permite mostrar la frecuencia de alguna entrada de pulsos, (counter timer,que alguien me diga si estoy equivocado) para los no poseemos osciloscopio, qué tan fiable seria esa herramienta?..asi se podrian pobrar distintos ajustes del timer sin reprogramar el micro

El counter timer no me parece nada preciso, porque cuenta la cantidad de pulsos en un segundo, y eso trae mucho error dependiendo de la frecuencia. Yo creo que ya establecidas todas las interrupciones que se van a trabajar en el proyecto, lo mejor es controlar como dice MigSantiago  :undecided:

Sino utilizar el Timer2, o el timer1 junto al módulo CCP en modo comparador evento especial, creo que se tiene mayor precisión.


Saludos!
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: Miquel_S en 01 de Diciembre de 2009, 05:21:39
Gracias a todos por vuestra ayuda.
  :-/ :-/ :-/
Miquel_S
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: KALLITOS en 01 de Diciembre de 2009, 12:31:22
Hola, la otra opción es usar un osciloscopio y agregar o quitar bits al tmr0 jeje

Yo tengo una tarjeta de muestreo de 22kHz con periodo de 45.45us, pero los tiempos duraban 47us. Tuve que estar reprogramando el pic y midiendo con el osciloscopio hasta que le atiné a los 45.45us  ;-)

Exactamente es lo que tambien hago jeje  :mrgreen:.
Pero para encontrar los valores a cargar en los timers uso el programa  Pic Timer Calculator by redraven (http://picmania.garcia-cuervo.net/recursos/rrpictimercalculator.zip), luego busco el valor a cargar en los timer experimentando con el osciloscopio de proteus.
Saludos.
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: Suky en 01 de Diciembre de 2009, 12:43:21
Pero para encontrar los valores a cargar en los timers uso el programa  Pic Timer Calculator by redraven (http://picmania.garcia-cuervo.net/recursos/rrpictimercalculator.zip)...

Y yo uso el ConfigPIC (http://www.infopic.comlu.com/joomla/index.php?option=com_content&view=article&id=48&Itemid=63)  :mrgreen: Que tiene la herramienta de calcular temporizaciones.

Saludos!
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: jhozate en 01 de Diciembre de 2009, 14:26:39
estan muy buenas las dos aplicaciones...yo tambien uso un programita sencillo...pero estos me han gustados mas..aunque siempre me gusta tener presente la formulita tipica
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: MLO__ en 01 de Diciembre de 2009, 16:11:51
 :mrgreen:

Yo uso mi calculadora

 :mrgreen:

Pero siempre verifico la frecuencia de salida con un frecuencimetro, ya que a mayor uso de interrupciones mayor es el error en la frecuencia de salida.
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: migsantiago en 01 de Diciembre de 2009, 18:23:04
:mrgreen:

Yo uso mi calculadora

 :mrgreen:

Pero siempre verifico la frecuencia de salida con un frecuencimetro, ya que a mayor uso de interrupciones mayor es el error en la frecuencia de salida.

jeje yo también  :mrgreen: nada como el papel y lápiz :D
Título: Re: Ayuda con TMR0 en lenguaje C
Publicado por: Miquel_S en 02 de Diciembre de 2009, 19:01:40
Gracias por los programas compañeros.
Miquel_S