logger
Colapsar columna

Menu Usuario -

Hola, Visitante
avatar


Mas Activos -

nocturno
Mensajes: 1646
djfreeman
Mensajes: 269
Meta
Mensajes: 254
spiderman
Mensajes: 198
residente
Mensajes: 164

Autor Tema: timer0 en pic y ejemplos  (Leído 1966 veces)

Desconectado gongonni

  • Amigo MicroPIC
  • **
  • Mensajes: 11
timer0 en pic y ejemplos
« en: Julio 07, 2010, 16:56 »
hola!

estoy empezando en esto de programar pics y ya he tocado un poco de ADC y ahora me gustaria aprender un poco de los timers.

Pero me faltan ejemplos. Vi un ejemplo del timer0 en un foro para hacer los calculos de la carga inicial del TMR0 para una temporización de 500us, el problema es que he intentado hacerlo para 1 minuto y no logro conseguirlo, se que debo hacer varios barridos del timer mediante el conteo con una variable, pero no consigo programarlo correctamente ya que no sé exactamente qué hace el timer cuando se desborda.

Os paso el programa, espero que se entienda:

Cita de: programa timer0
#if defined(__PCM__)
#include <16F690.h>
#include <math.h>
//#DEVICE (ADC=10)
#fuses INTRC,NOWDT,NOPROTECT,NOMCLR
#use delay(clock=8000000)
#endif

void main()
{
   double temps, t_minuts, temporitzacio_max, tempo, preescaler, bits_resol, TMRZ, freq_uc, x, y;
   int i, i_e, i_f, timerz;
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_BIT); //
   
   t_minuts = 0,1;
   freq_uc = 8; //en Mhz segun tengo entendido
   preescaler = 256;
   bits_resol = 256;
   temps = t_minuts * 60 * pow(10, 6);
   TMRZ = 0;   
   x = 4 * (1/freq_uc);
   
   // quise hacerlo de forma general para futuros proyectos,
   // pero me daba error de que faltaba un identificador, asi que las
   // siguientes formulas os las encontrareis particionadas
   
   temporitzacio_max = x * preescaler * bits_resol;   
   i = temps / temporitzacio_max;
   
   i_f = modf(i, &i_e); // separa la parte entera de la fraccionaria del parametro "i"
   
   x = (temps - i_e * temps) * freq_uc; // le quito al tiempo total las vueltas que deberá hacer el timer para quedarme con la carga final de TMR0
   y = x / (4 * preescaler);
   
   TMRZ = y + bits_resol;
   
   output_high(PIN_C0); //simplemente me sirve como indicacion para empezar el conteo con un cronometro de reloj de mano
   delay_ms(1000);
   output_low(PIN_C0);   
   
   set_timer0(TMRZ); //inicia el timer en la carga inicial calculada previamente
         
   for(i=i_e; i>=0; i--)
   {
      timerz = get_timer0();
      while(timerz!=255)
      {
         timerz = get_timer0();
         //comprovación botón emergencia
         //comprovación temperatura
      }
   }   
   output_high(PIN_C0);   // indica que ha llegado al final que es cuando paro el cronometro de mano para saber qué tiempo real ha tardado.
   // El problema es que nunca llega al final.
}

gracias por vuestra ayuda.
Saludos

Desconectado nocturno

  • Administrator
  • MicroPIC Gurú
  • *****
  • Mensajes: 1646
    • MicroPIC
Re: timer0 en pic y ejemplos
« Respuesta #1 en: Julio 08, 2010, 06:50 »
Aunque puedes hacerlo sin interrupción, lo ideal es que utilices una interrupción, lo que te permite liberar al micro para otras tareas, y asegurar que la sincronización es perfecta.

Mira este ejemplo, está perfectamente explicado y resulta muy clarificador. Si sigues con dudas, por aquí estamos:
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr0-como-temporizador.html
Un saludo desde Sevilla, España

Desconectado gongonni

  • Amigo MicroPIC
  • **
  • Mensajes: 11
Re: timer0 en pic y ejemplos
« Respuesta #2 en: Julio 13, 2010, 17:58 »
gracias! ya está "resuelto". Ya manejo bastante bien el tema de los timers, aunque me hace la puñeta lo de habilitarlos.

En el PIC 16F690 que traía el PICKIT 2 STARTER KIT no tenia problemas con la inicializacion del timer0, aunque ahora he hecho un programa bastante complejo y lo he depurado y solo me falta 1 error por depurar: Exacto, la inicialización del timer 1, ya que el timer 0 necesita de oscilador externo y no lo tengo. El timer1 es el timer de 16 bits y no necesita de oscilador externo (opcionalmente, claro), pudiendose fijar su frecuencia de oscilacion a la del pic. Pero a mi me da que algunas funciones no las hace bien el CCS o el MPLAB... aqui os pongo dos trocitos de codigo fuente:

#DEFINE (__PCM__)
#INCLUDE <24HJ128GP502.H>
#DEVICE ADC=12
#INCLUDE <MATH.H>
#FUSES NOWDT, NOPROTECT
#USE DELAY(CLOCK=7370000)

_____ CODIGO QUE DA ERROR: __________

   setup_adc(ADC_CLOCK_INTERNAL);
   //setup_adc_ports(TEMP_INT | V_STDBY);  // deshabilitado ya que creo que es prescindible, luego cambio el channel del ADC para las medidas. De todos modos, TEMP_INT y V_STDBY hacen referencia a los pines
         
   
   setup_timer1(T1_INTERNAL | T1_DIV_2048); // segun el manual es T1_INTERNAL, tambien existe la funcion setup_timer_1 (segun el manual) pero tambien me marca error. T1_DIV_2048 segun el manual es incorrecto y deberia ser T1_DIV_BY_2048, aunque tambien me marca error xD
   //enable_interrupts(GLOBAL);

__________ ERROR QUE MARCA ____________
Executing: "C:\Program files\Picc\CCSC.exe" +FD "Programa_Principal2.c" #__DEBUG=1 +ICD +DF +LN +T +A +M +Z +Y=9 +EA  #__PIC24HJ128GP502__=TRUE
*** Error 12 "Programa_Principal2.c" Line 275(26,37): Undefined identifier   T1_INTERNAL
      1 Errors,  0 Warnings.

Halting build on first failure as requested.
BUILD FAILED: Tue Jul 13 17:54:04 2010

salu2 y gracias por vuestro tiempo!