Autor Tema: Problemas flags timer1  (Leído 1747 veces)

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

Desconectado nrivas

  • PIC10
  • *
  • Mensajes: 2
Problemas flags timer1
« en: 05 de Marzo de 2016, 17:30:54 »
Estimados:
estoy haciendo un programa con interrupcion del timer1 y necesito saber como poder leer el flag de la interrupcion para saber si esta en 1 o en 0. El proyecto es con el PIC16F873 en ccs, les adjunto el codigo para que tengan mas claro todo.


#include <16F873A.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming,
#FUSES NOCPD                    //No EE protection
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use delay(clock=4000000)


int cont=0;
int8 a,b,c,d;

#int_TIMER1
void TIMER1_isr(void)
{
output_toggle(pin_C0);//para visualizar timer 1
set_timer1(3036);
cont=cont+1;
if(cont==50){
 set_adc_channel(0);    //lectura canal 0
 a=read_ADC();
 set_adc_channel(1);   //lectura canal 1
 b=read_ADC();
 timer1=0;
 }
}


void main()
{

   setup_adc_ports(AN0_AN1_AN3);            //canales a usar
   setup_adc(ADC_CLOCK_INTERNAL);            // seleccion del reloj
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(3036);
   enable_interrupts(INT_TIMER1);            //hablilita int tmr1
   enable_interrupts(GLOBAL);

 while(true){
 
if( timer1==0 && input(pin_A5)==0 ){      //bits conversión A0
 output_B(a);
 }
 if(timer1==0 && input(pin_A5)==1 ){      //bits conversión A1
 output_B(b);
 }
  if(timer1==1 && input(pin_A5)==0 ){   //bits  suma A0 A1
  c=a+b;
 output_B(c);
 }
  if(timer1==1 && input(pin_A5)==1 ){   //bits resta A0 A1
  d=a-b;
 output_B(d);
 }
}
}

A lo que llamo timer1 es el flag que quiero leer !

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas flags timer1
« Respuesta #1 en: 05 de Marzo de 2016, 17:43:18 »
Primero que nada:

Código: C
  1. set_adc_channel(0);    //lectura canal 0
  2.  a=read_ADC();
  3.  set_adc_channel(1);   //lectura canal 1
  4.  b=read_ADC();

Eso deberia estar en el main, read_adc() espera hasta que tengas un resultado, por lo tanto se queda en la interrupcion, deberias poner una variable de 1 bit a 1 y luego actuar acorde en el main()

Respecto a tu pregunta original, no veo por ningun lado que tengas definido que es timer1, lo cual no deberia compilar, si compila entonces timer1 se refire a otra cosa.

Código: C
  1. int1 flagtimer1;

Otra cosa, es que siempre se pone el flag a 0, pero jamas a 1. No veo donde estas poniendo el flag a 1, lo cual los 2 ultimos if los deshabilita por completo.


Desconectado nrivas

  • PIC10
  • *
  • Mensajes: 2
Re:Problemas flags timer1
« Respuesta #2 en: 05 de Marzo de 2016, 17:47:00 »
KILLERJC

efectivamente la variable timer1 no la he definido , simplemente queria ejemplicar que en esa variable quiero guardar el valor de la bandera cuando se ponga en 1 (cuando desborde timer1) o 0 en caso contrario. Y esa es mi duda .....

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas flags timer1
« Respuesta #3 en: 05 de Marzo de 2016, 18:46:52 »
podes usar tambien interrupt_active(int_timer1); para saber si efectivamente la flag esta en 1.

Pero eso lo vas a usar cuanod tenes desactivada las interrupciones. Tu interrupcion del timer deberia qudarte adentro del if asi:

if(cont==50){
  timer1=1;
 }

Entonces en tu main(), preguntas por si timer1 es igual a 1, si es asi lo pones en 0 para cuando se ejecute de nuevo la interrupcion lo ponga a 1 y saber cuando es que entro alli.