TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: elgarbe en 03 de Junio de 2012, 20:03:40
-
Hola, estoy usando CCS y depurando un programa que me funcionaba mal vi que ni bien habilito las interrupciones del timer, estas se lanzan de una, como si el registro del timer ya estubiera en overflow. Es normal eso? antes de habilitarlas hay que inicializar los contadores del timer?
Este es el código que estoy usando:
void main()
{
set_tris_a(0xFF);
set_tris_b(0x03); //Rb0, 1 entradas, el resto salida
setup_oscillator(OSC_8MHZ);
//ADC_CLOCK_INTERNAL se sugiere solo para frecuencias menores a 1MHz.
//Para 8MHz se sugiere ADC_CLOCK_DIV_32
setup_adc(ADC_CLOCK_DIV_32);
//Voy a usar el pin 2 (AN0) para el TPS, la referencia es GND y +5V
setup_adc_ports(sAN0|VSS_VDD);
//Dentro de los puertos usados (solo el 0) elijo el canal 0 para convertir
set_adc_channel(0);
//El timer0 interrumpira cada 256*4*256/8000000=32,7mSeg
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(T1_DISABLED);
//El timer2 interrumpira cada 256*4*16*2/8000000=4,096mSeg
setup_timer_2(T2_DIV_BY_16,0xFF,2);
setup_spi(FALSE);
setup_comparator(FALSE);
setup_vref(FALSE);
a=(l_Pasos_Maximo-l_Pasos_Minimo)/(float)(l_ADC_Maximo-l_ADC_Minimo);
b=l_Pasos_Minimo-a*l_Pasos_Maximo;
//Habilito las interrupciones para que todo empiece a funcionar
enable_interrupts(INT_TIMER2);
enable_interrupts(INT_AD);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
do{
//Calculo constantemente las constantes a y b de la recta por si modificaron
//por el puerto serie algun parámetro.
a=(l_Pasos_Maximo-l_Pasos_Minimo)/(float)(l_ADC_Maximo-l_ADC_Minimo);
b=l_Pasos_Minimo-a*l_Pasos_Maximo;
-
Si pasa eso lo más sencillo es antes de habilitarlas forzar a 0 los timer y borrar las IFs
Saludos!
-
set_timer0(0);
set_timer2(0);
enable_interrupts(INT_TIMER2);
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL);
eso no funciona.
Como borro en CCS los flags?
Es común lo que me sucede? lo estoy probando en proteus, sinifica que en la práctica pasa lo mismo?
Saludos y gracias!
-
clear_interrupt(..) o algo así me parece que era.
Saludos!
-
clear_interrupt, pero tampoco funciona, en realidad no funciona en proteus, pero no hace falta poner nada, la interrupcion no se dispara sola....