Autor Tema: timer0 10ms  (Leído 4026 veces)

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

Desconectado fr4n

  • PIC12
  • **
  • Mensajes: 53
timer0 10ms
« en: 12 de Octubre de 2011, 05:29:03 »
Hola a todos, estoy usando un PIC 18F4550. Programo en C usando CCS.
Uso un cristal externo de 20Mhz, pero mi sistema funciona a 48Mhz (mediante trasformaciones PLL)

He estado buscando información el foro sobre el tema de los timers, pero no me queda claro.
Necesito una interrupción cada 10ms (milisegundos) y he visto que se usa esta fórmula:

(256-TMR0) = Temporización / (ciclo de instrucción * Divisor de frecuencia)

Necesito usar el timer0, solo necesito que se interrumpa cada 10ms, pero no entiendo que valores debo meter para cargar ese tiempo.
No se que valor de prescaler poner ni de ciclo de instrucción (¿20 Mhz o 4Mhz?), no se si servirá de algo, pero tengo usando estos fuses, no se si alguno indica el prescaler que se está usando:

#FUSES LPT1OSC                 //Timer1 configured for low-power operation
#FUSES NOXINST                 //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL5                       //Divide By 5(20MHz oscillator input)
#FUSES CPUDIV1                 //No System Clock Postscaler
#FUSES USBDIV                  //USB clock source comes from PLL divide by 2

¿Que valor le tengo que cargar? o como lo calculo realmente?
Segun el datasheet el prescaler (¿divisor de frecuencia?) máximo de mi PIC es 256 y usando ese valor, si hago las cosas bien, me sale un número negativo ¿alguien puede ayudarme?

Muchas gracias!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: timer0 10ms
« Respuesta #1 en: 12 de Octubre de 2011, 09:31:19 »
Si tu sistema funciona a 48MHz el ciclo de instrucción es 4/48M --> 83.333ns. Siempre el ciclo de instrucción es de 4/clock de CPU
Fijate en el datasheet tanto en el esquema de la configuración del oscilador como en la del timer0. En la del timer0 figura que la entrada puede ser T0CKI (que sería RA4) o sino Fosc/4 (es la frecuencia de CPU).

Usando ese clcok y suponiendo un prescaler de 256 y el Timer0 en 16 bits, generaría la interrupción cada
83.333n(ciclo de instrucción) * 256(prescaler) * 65536(timer0 en 16 bits) --> 1.398s
si en cambio utilizas el prescaler en 64 sería  83.333n * 64 * 65536 --> 349.511ms
con prescaler en 2 sería 83.333n * 2 * 65536 --> 10.922ms
« Última modificación: 12 de Octubre de 2011, 09:41:50 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado fr4n

  • PIC12
  • **
  • Mensajes: 53
Re: timer0 10ms
« Respuesta #2 en: 12 de Octubre de 2011, 10:00:06 »
Pensaba que el Timer0 era de 8 bits  :shock:

Muchisimas gracias! salvo ese detalle, creo que me ha quedado todo claro :)
Gracias!

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: timer0 10ms
« Respuesta #3 en: 12 de Octubre de 2011, 10:56:59 »
Hola, te puede servir tambien el PIC Timer Calculator By Redraven.

Saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: timer0 10ms
« Respuesta #4 en: 12 de Octubre de 2011, 11:06:43 »
Pensaba que el Timer0 era de 8 bits  :shock:

Hay que tener el datasheet a mano  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado fr4n

  • PIC12
  • **
  • Mensajes: 53
Re: timer0 10ms
« Respuesta #5 en: 12 de Octubre de 2011, 11:22:45 »
Muchas gracias a todos!

En CCS, como quedaría la rutina de configuración entonces, asi?
setup_timer_0(T0_INTERNAL | T0_DIV_2 | T0_16_BIT); ???

Y la rutina de interrupción en ccs, si no me equivoco, será asi, no?
#int_TIMER0
void TIMER0_isr(void) {
Código
}

Falla algo?
Gracias!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: timer0 10ms
« Respuesta #6 en: 12 de Octubre de 2011, 11:55:15 »
  No uso CCS pero aparentemente parecería estar bien.

  También, si queres tener mas aproximado una interrupción cada 10ms podes poner el prescaler en 4 y precargar el timer0 con x valor para que el tiempo sea mas cercano a los 10ms.

  10ms = 83.333ns * 4 * x (siendo x el valor que tiene que contar el timer0) --> 10ms = 333.332n * x -->
  x =(aproximadamente) 30000

  Luego, para que el timer cuente 30000 tendrías que hacer valor_precarga = 65536 - 30000 --> timer0 = 35536.

  La precarga la tendrías que hacer al comienzo y cada vez que se ejecuta la interrupción, así siempre la cuenta será de 30000 ciclos.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado fr4n

  • PIC12
  • **
  • Mensajes: 53
Re: timer0 10ms
« Respuesta #7 en: 12 de Octubre de 2011, 12:05:48 »
La instrucción para cargarle ese tiempo es así?
TIMER0(35536); ???

Muchas gracias, eres un crack! :)

Saludos!
« Última modificación: 12 de Octubre de 2011, 12:08:11 por fr4n »

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: timer0 10ms
« Respuesta #8 en: 12 de Octubre de 2011, 12:27:10 »
La instrucción para cargarle ese tiempo es así?
TIMER0(35536); ???

Muchas gracias, eres un crack! :)

Saludos!

Hola fr4n, utiliza la ayuda de CCS alli encontraras la sintaxis usada por el compilador. Tambien encontraras codigo de ejemplo, aca en el foro también hay información a montones.

saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado fr4n

  • PIC12
  • **
  • Mensajes: 53
Re: timer0 10ms
« Respuesta #9 en: 13 de Octubre de 2011, 04:45:14 »
Si, muchas gracias, ya habia mirado la ayuda (aunque no me entero bien con el inglés) y también habia mirado el foro (por eso he llegado a la conclusión de que se hace como expongo arriba), pero tenía dudas de saber si era correcto o no porque el compilador me da errores en esa línea.

Muchas gracias!

EDITO: Era un despiste, es y setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); set_TIMER0(35536); parece ser. Gracias.
« Última modificación: 13 de Octubre de 2011, 08:00:38 por fr4n »


 

anything