TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: f-traxx en 13 de Septiembre de 2010, 13:29:01
-
Hola a todos, tengo una pregunta sobre el funcionamiento del timer2, estoy con un "reto" y necessito que se me active el timer2 quando yo le llame, me explico:
el micro tiene que hacer sus tareas, y quando "llame" al timer2 que me empiece a contar hasta hacerme la interrupción al cabo de X us, se puede hacer eso, he estado leyendo por el foro y no he visto ningun post que lo hagan, se podria hacer desactivando las interrupciones de timer2, y solo habilitandola quando paso por donde la tenga que llamar?
Seguramente no se entienda nada osea que pongo un ejemplo:
En el pic (16F627A a 4Mhz) me está llegando una trama de bits, quiero que si el pic esta mas de 14720us, empieze de nuevo a leer, yo de momento he hecho esto: y el problema que tengo es que la interrupción se ejecuta cada 14720us y yo quiero que eso pase sino se cumple Y>8.
void TIMER0_isr(void) ////timer que cuenta cada 14,72mS
{
int a=0;
//Timer de 8 bits --> 256 = 1 RTCC
//Pescaler de 1:16
//1 tick cada 16 uS = 0.016mS
//1 RTCC cada 3,68mS (256 - 26 Ticks)
//4 RTCC = 14720us
if ((VT=true)
{
a=get_timer0();
}
}
void main()
{
set_tris_a (0b00111100); //Definición de entradas(RA2-RA5) y salidas.
set_tris_b (0b00001001); //Definición de entradas(RB0yRB4) y salidas.
//HABILITACIO D'INTERRUPCIONS//
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
setup_timer_1(T1_internal | T1_DIV_BY_1 );//Configuramos el timer1 con el prescaler a 1
//asi cuenta de 1ms en 1ms.
// setup_timer_2(T2_div_by_16,26,4); //Habilitamos el timer2 con la siguientes características:
//-ponemos el prescaler a 1:16 asi tenemos un Tick cada 16us
//-26 es el valor que determina cuando el reloj del timer es reseteado.
//- y este valor lo sacamos de (256-26=230 donde 230 es el valor
//-que necesito)4 es las veces que se tiene que resetear el timer2.
//Aqui estan los calculos(256-26=230),(230*0,016=3,68),(3,68*4=14,72ms)
//o lo que es lo mimso 14720us que es lo que necessito.
// enable_interrupts(int_timer2); //Habilitamos interrupción timer2.
enable_interrupts (global); //Sino habilitaramos las interrupciones globales
//no nos funcionaria ninguna interrupcion.
delay_us(200); //Espero a que se estabilice todo.
while(1)
{
output_a(0x00);
output_b(0x00);
if (y>8) "que se activara int timer2" es possible?
y++;
delay_ms(1000);
}
}
haber si me pueden hechar un cable, quando termien el proyecto lo colgare por si le sirve a alguien.
-
El timer2 se puede encender o apagar según pongas el bit 2 (TMR2ON) del registro 0x12 (T2CON) a 1 o 0 respectivamente.
Si no me equivoco en CCS podés usar la propia función "setup_timer2"; si el primer parámetro es T2_DISABLED justamente no trabaja el timer2.
Sino trabajando directamente sobre el bit del registro T2CON
-
Hola AngelGris, eso que me quieres decir que significa, que si pongo "setup_timer_2(disabled)" en el main, y luego lo habilito en una subrutina asi "setup_timer_2(T2_div_by_16,26,4)" solo me funcionara desde que entre en la subrutina?
-
Exacto.
Nunca lo usé desde CCS pero sí en ASM (trabajando directamente con el bit TMR2ON) y sólo trabaja el timer2 si lo encendés. Así que sería cuestión de probar. Quizá en un programita sencillo, no sé, que si presionás un botón se active el timer2 y te cuente x segundos hasta encender un led.
-
gracias por la respuesta ya lo he probado y si que va :-/ :-/