Autor Tema: No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550  (Leído 4954 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #15 en: 31 de Marzo de 2016, 10:37:50 »
Si lo podes hacer con cualquier timer. desde el 1 hasta el 3. Pero es mas simple con un timer de 16bits siempre. Incluso si tiene modulo CCP ( lo cual debe tenerlo por que me decis sobre timer3 ) podrias hacer uso de ese modulo y asi hacer mas faciles las cosas, solo un poco mas complicado la configuracion, ya que vas a tener que configurar timer + ccp, pero tenes la salida de forma directa sin ningun codigo mas.

Mientras que con el timer solo tenes que realizar el codigo de la interrupcion tambien.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #16 en: 31 de Marzo de 2016, 13:51:37 »
Vaya amigo y como seria eso??...................disculpa
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #17 en: 31 de Marzo de 2016, 18:49:02 »
El modulo CCP lo que hace en uno de sus modos es comparar el valor del timer1 con el guardado por vos. Lo bueno es que el timer cuenta desde 0 al valor del CCP, es decir que pones la cantidad de pulsos directamente, sin necesidad de hacer complemento a 2.

Ejemplo, en uno de los modos del CCP pones el valor 10000 en el CCP, el timer1 comienza desde 0 y cuando llega a 10000 cambia el estado de una salida, Lo unico que tenes que hacer es reiniciar el timer a 0. Lo cual lo vas a tener que hacer en la interrupcion, lo feo es que la salida del CCP es un pin especifico

En otro de los modos el mismo CCP se encarga de resetear el timer cada ves que llega a ese valor, es decir cuando llega a 10000 se pone a 0 en nuestro ejemplo anterior, esto te permite tener una mejor uniformidad en el tiempo de la onda, en la interrupcion solo te encargas de activar o desactivar el pin que vos desees.

Si aun asi lo deseas hacer con el timer solo, sea cual sea, primero vas a tener que cargar el timer con el valor del complemento a 2 de la cantidad de ciclos. ya que ahora es del numero que le das hasta llegar a 0 es decir cuando ocurre un overflow, lo feo es que mientras se ejecutan instrucciones en la interrupcion el timer sigue contando, asi que si tu interrupcion le toma 20 ciclos hasta poner el valor correcto al timer para que comienze la cuenta, y quisieras por ejemplo que cuente 10000 pulsos, tenes que cargarlo con: 2¹⁶ - 10000 + 20, es decir 55556 al timer.

Si usas un timer de 8 bits lo mas seguro que por mas preescaler y postscaler que le pongas vas a terminar con un tiempo muy pequeño, asi que vas a necesitar mantener ademas la cantidad de veces que entra a la interrupcion. 10Hz son 100ms de periodo, en un timer de 8bits a 20Mhz y con preescaler 1:256 serian unos 13.10ms cuando complete los 256, asi que deberias contar al menos 7 entradas a la interrupcion y luego tendrias que buscar la cantidad de pulsos para unos 8.24ms mas asi completar los 100ms, (161 pulsos mas del timer, es decir recargarlo con 256-161= 95)

Lo demas queda a consideracion tuya, ya hacer mas de lo que dije es darte el codigo por completo. Asi que intenta realizarlo y leer el datasheet para ver como lo podes hacer y tratar que cumpla con lo que queres. Luego cualquier cosa podes traer el codigo si tenes problemas y no lograste hacerlo funcionar.


Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #18 en: 18 de Abril de 2016, 00:46:10 »
Buenas Noches...................Buen me parecio mas facil usar el TRM0 solo, pues podia controlar mas la division de frecuencia, una informacion que se me paso decirte que uso es 18F2520, no usa USB es mas simple, no funcionaba la comunicacion serial a 19,2 Kbs por que a 8Mhz la tabla no da valores.......osea jajaja casualmente no funciona,use otras frecuencias y si funciona, ajuste todo para funcionar a 40Mhz y trabaja buen, pienso usar un cristal de 10Mhz y con el PLL subirlo a 40Mhz, lei mas el manual y entedi otros detalles.

Pero ahora pienso colocar un pantalla LCD, y por la frecuencia de trabajo no puedo usar los temporizacion por programa pues daria problemas con los TMRX..................bueno, es lo que creo, se me ocurrio usar el TMR0 como base de tiempo......y usarlo en conbinacion con un contador generar la temporizacion necesaria para trabajar la LCD........que me acosejas.........???
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #19 en: 18 de Abril de 2016, 05:17:01 »
Citar
Pero ahora pienso colocar un pantalla LCD, y por la frecuencia de trabajo no puedo usar los temporizacion por programa pues daria problemas con los TMRX..................bueno, es lo que creo, se me ocurrio usar el TMR0 como base de tiempo......y usarlo en conbinacion con un contador generar la temporizacion necesaria para trabajar la LCD........que me acosejas.........???

No entiendo el por que te puede dar problemas los delays del LCD con respecto al Timer, si usas una interrupcion para el timer, sea donde sea este tu programa principal va a ir al timer.
Si es que yo no te entendi mal lo que quisiste decir. Ami me parece lo mas practico es que aquello que necesite una GRAN pero GRAN precision en el tiempo lo hagas en una interrupcion. Lo demas todo en la parte principal.

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #20 en: 18 de Abril de 2016, 21:32:59 »
Te explico, no considero, bien hacer un retardo con un programa cuando el pic trabaja con una frecuencia tan alta, ademas que uso interrupciones, por eso pense usar el TMR0 como base de tiempo tambien para generar los retardos necesarios para el LCD
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No logro Hacer Funcionar el TMR0 el 16Bit pero si en 8 Bit en pic 18F2550
« Respuesta #21 en: 18 de Abril de 2016, 22:37:17 »
Te explico, no considero, bien hacer un retardo con un programa cuando el pic trabaja con una frecuencia tan alta, ademas que uso interrupciones, por eso pense usar el TMR0 como base de tiempo tambien para generar los retardos necesarios para el LCD

Los retardos mas grandes del LCD son al finalizar el envio de una instruccion o un dato. ya que estan en el orden de los milisegundos.
El tema es que por ejemplo si vas a enviar un texto, supongamos "Hello World", tenes que pensar que primero se va a enviar la H, hay que esperar que se termine eso para poder enviar la e. Y asi con las demas letras. Te quedan 3 opciones:

- Usar un delay
- Usar un timer y esperar ahi que en el timer ocurra el overflow, lo cual es equivalente a usar el delay y solo complicarias las cosas usando un modulo mas.
- Usar un timer que es el encargado de enviar los datos al LCD, y que no va a ser facil de implementar.

Por que no es facil de implementar este ultimo?, por que tu programa principal deberia llenar un "buffer" con los datos a enviar, ademas en este buffer deberias poder discriminar entre instrucciones o datos (lo cual implica casi el doble de memoria RAM de la necesaria), finalmente el timer podria ir cada cierto tiempo enviando una letra y modificando el tiempo segun lo que necesite para enviar la proxima instruccion o dato ( ya que las demoras son distintas ).
Hasta aca genial, aun asi tu programa puede y va a ir mas rapido de lo que va a ser el envio al LCD, a no ser que tomes varias precauciones vas a tener el mismo problema que con los delays. De darle libertad de escribir una y otra ves al LCD vas a llegar un punto en que vas a llenar el buffer, el cual vas a tener que esperar que se vacie (y detener el programa), y si queres aprovechar la memoria lo mejor seria un ring buffer. Todo genial hasta aca. Te ahorraste varios milisegundos, pero tambien te los estas gastando en el manejo del buffer, y ni hablar si es que escribis muy seguido en el LCD que el programa deba colgarse por esperar que se habra espacio en el buffer. Lo cual seria complejidad sin sentido.

Yo pienso que deberias usar el timer para aquello que realmente necesite una atencion rapida ( o a tiempo ), y dejar cosas como el LCD en la rutina principal la cual no necesita de eso, asi como formulas,etc que ocupan tiempo de CPU. Tambien tenes interrupciones externas, etc.


 

anything