TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: teban89 en 08 de Noviembre de 2014, 21:15:22
-
Buenas gente, tengo un problema que me esta comiendo la cabeza y no puedo solucionar.
Estoy haciendo un programa en el cual uso el TIMER0 y quiero que empiece a contar CUANDO YO QUIERA pero apenas el programa arranca comienza a funcionar igual. Tenia entendido que el timer comenzaba cuando el programa llegaba a la instruccion SET_TIMER0. Leyendo la libreria 16f628a.h veo que existe la opcion de TIMER0 o de RTCC. ¿Que diferencia hay entre estas? Quizas estoy escribiendo algo mal en el codigo.
Aqui lo dejo por las dudas:
#include <16F628A.h>
#include <LABEL16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES MCLR //Master Clear pin disabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=48000)
/////////////////////INTERRUPCIONES/////////////////////////////
#int_TIMER0
void TIMER0_isr(void)
{
B1=!B1;
}
///////////////MAIN///////////////
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
SET_TRIS_A(0b00000000);
SET_TRIS_B(0b00010001);
OSCF=1;
while(1)
{
}//while
}//main
MUCHAS GRACIAS!!!
-
creo que es lo mismo pero con distinto nombre nomas, no podes desactivar la interrupción y activarla al momento que queres que empiece a contar? o pone alguna bandera en la interrupción para que aumente un contador dependiendo de esa bandera, supongo que hay varias formas de hacer lo que decis
-
Ya lo probe y no funciona. Empieza el programa con la interrupcion deshabilitada (disable_interrupts(INT_TIMER0);) y en cierta parte pongo que si se aprieta un boton esa interrupcion se habilite (enable_interrupts(INT_TIMER0);) y me la habilita igual aunque el boton no se apriete.
-
Es que si te fijas el diagrama/registros del TMR0 en el datasheet vas a notar que no hay ningun bit para desabilitar la cuenta. El TMR1 y 2 si poseen un bit en sus respectivos registros TxCON, llamado TMRxON, habilitando la cuenta o no. Mientras que en el timer0 no.
El timer 1 tiene un preescaler de maximo 8 y el TMR2 tenes un prescaler de 16 y un post scaler de 16.
Con lo cual si queres manejar cuando cuenta y cuando no, usas otro timer, y si no la otra es cuando llegue a tu punto de interes, cargarle el valor al tmr0 (ej ponerlo en 0, creo que con set_timer0(0x00); )
-
Hola, si de hecho el timer arranca apenas se declara el setup_timer_0, esa prueba ya la hice una vez, cuando llega a la linea de codigo set_timer() el se inicializa nuevamente con el valor que le pongas al parecer, al menos eso conclui yo, si me equivoco que alguien me corrija.
-
En realidad todos los timers arrancan con el PIC. Lo unico que puedes hacer es desactivar la interrupcion. Pero el timer seguira corriendo.
Si quieres empezar a contar y que salte la interrupcion al llegar al final tienes que activar la INT y luego poner el timer a 0 con set_timer_0(0);
Asi lo que haces es poner el timer a 0. Si al saltar la INT no queres contar mas, desactivas la INT desde dentro de la interrupcion. Y cuando quieras volver a contar, haces lo mismo de antes.
-
En realidad todos los timers arrancan con el PIC. Lo unico que puedes hacer es desactivar la interrupcion. Pero el timer seguira corriendo.
Si quieres empezar a contar y que salte la interrupcion al llegar al final tienes que activar la INT y luego poner el timer a 0 con set_timer_0(0);
Asi lo que haces es poner el timer a 0. Si al saltar la INT no queres contar mas, desactivas la INT desde dentro de la interrupcion. Y cuando quieras volver a contar, haces lo mismo de antes.
Estas equivocado, depende de que timer sea. El timer sigue funcionando pero no cuenta ( corre ) si desabilitas algun bit como tiene el TMR1 y el TMR2 mira el datasheet del PIC16f628 que es este caso. EL TMR0 no tiene esa particularidad en este PIC.
Pero tu solucion es valida para lo que el necesitaria.