Autor Tema: Como hago que el timer0 desborde a los 2 segundos  (Leído 1735 veces)

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

Desconectado naieto

  • PIC10
  • *
  • Mensajes: 45
Como hago que el timer0 desborde a los 2 segundos
« en: 31 de Mayo de 2006, 01:22:52 »
HOla gente, este es mi primer mensaje, y en este caso es una pregunta. Estoy aprendiendo con un 16f84A y se me ocurrio hacer una rutina que si aprieto un pulsador en rb0 menos de un tiempo delta t determinado (2 segundos en este caso) me prenda un led por ejemplo en ra0, y si el tiempo de apretado es mayor, que me prenda un led conectado en rb1. QUIERO usar en una parte del programa la interrupcion del desborde del timer0, pero necesitaria que sea a los 2 segundos. Mi pregunta es: como hago jaja?
Bueno tambien me gustaria compartir una rutina para que la agreguen en los ejemplos, que hace lo siguiente: modula el ancho del pulso en un led conectado a rb1 en forma senoidal (creo), sospecho que es en forma triangular (que alguien lo confirme o me corrija) produciendo un efecto de prendido y apagado del brillo en forma gradual. No les dejo la simulacion porque no se ve el efecto (por lo menos en mi precaria pc) aqui esta:
//Modulacion del ancho de pulso en forma senoidal en RB1

# INCLUDE <16F84.h>
# USE DELAY(clock=4000000)
# FUSES HS,NOWDT,NOPUT
# USE FAST_IO(A)
# USE FAST_IO(B)

pwm(int brillo)       //Prende el led hasta que j llega a brillo y lo apaga
{                     //hasta que llega a 100, es decir modula el ancho de
int j;                //del pulso en cada ciclo
for(j=0;j<brillo;j++)
output_high(PIN_B1);
for(;j<100;j++)
output_low(PIN_B1);
}

frec_onda(int brillo) //Retarda entre la funcion onda y pwm. Cada vez que onda
{                     //cambia el valor de brillo. Esta funcion produce un retardo, 
int i;                //en consecuencia varia la frecuencia de la onda senoidal
for(i=0;i<10;i++)     
pwm(brillo);     
}

onda()
{                                 // Cambia el valor de brillo de forma senoidal
int brillo;                       // entre 0 y 100 y se lo pasa a frec_onda
for(brillo=2;brillo<100;brillo++)
frec_onda(brillo);
for(brillo=100;brillo>2;brillo--)
frec_onda(brillo);
}
main()
{
set_tris_b(0);
while(true)
onda();
}

Salu2
El fruto solo madura con el tiempo

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Como hago que el timer0 desborde a los 2 segundos
« Respuesta #1 en: 31 de Mayo de 2006, 01:36:51 »
Hola naieto, la forma de onda que genera tu PWM para el control del brillo es una triangular y no una senoidal, tal como lo sospechavas.

Para que el TMR0 del 16F84 tenga un desbordamiento cada 2 segundos debes bajarle la frecuencia al oscilador que uses para accionarlo, en al caso que sea el propio oscilador del PIC deberas colocarle un cristal que tenga una frecuencia de por ejemplo 131072 Hz, y en el caso de usar un oscilador externo deberias hacer una que tenga una frecuencia de 32768 Hz, por lo que no lo veo muy util, pero solo es mi opinion.

Un saludo.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado naieto

  • PIC10
  • *
  • Mensajes: 45
Re: Como hago que el timer0 desborde a los 2 segundos
« Respuesta #2 en: 31 de Mayo de 2006, 10:52:21 »
Bueno Chaly29 gracias por la respuesta. Me olvide decir que el timer cuenta con el cristal que usa el micro de 4 MHZ. Me gustaria ver si hay alguna forma de combinar el timer con el incremento de alguna variable para prolongar el tiempo. Tengo esa idea pero no se me ocurre todavia como puedo hacer.
El fruto solo madura con el tiempo

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Como hago que el timer0 desborde a los 2 segundos
« Respuesta #3 en: 31 de Mayo de 2006, 11:38:17 »
Hola naieto, la unica manera que conosco de hacer lo que deseas con el 16F84 es poner el TMR0 sin prescaler y contar las veces que este llega a la interrupcion, en tu caso serian como 7812.5 veces, pero es un trabajo muy tedioso, te recomiendo sin el prescaler por el tema de la precision pero si esta no es muy importante lo puedes usar en 256 y solo debes contar 30.5 interrupciones y tendras los 2 segundos.

Un saludo.

Atte. CARLOS.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.