Problema con código en interrupción

Hola, tengo el siguiente código en una interrupción

Código:
	#pragma interrupt YourHighPriorityISRCode
	void YourHighPriorityISRCode()
	{
        if(PIR1bits.CCP1IF == 1){
            if(aux_counter < 4){
                counterL = TMR0L;
                counterH = TMR0H;
                counter2 += counterL | (counterH << 8);
                LATCbits.LATC1 ^= 1;
                PIR1bits.CCP1IF = 0;
                aux_counter++;
            }
            TMR0H = 0;
            TMR0L = 0;
            TMR1H = 0;
            TMR1L = 0;
        }
	}

y el microcontrolador "se queda pegado" cuando lo programo, pero si comento la linea aux_counter++ todo funciona bien, he examinado el archivo .lst y la unica diferencia es una instrucción incf

Que puede ser?
 
aux_counter, counterL, counterH y counter2 son variables globales con atributos static volatile.

PD: Uso mplab c18 lite v3.40 en linux, pero en la version 3.45 de windows tampoco funciona
 
Última edición:
No, ademas, como dije, el problema es que el pic no hace nada mas si la linea en cuestion no esta comentada. En la funcion main hago parpadear unos led para indicar funcionamiento y estos se detienen. Depure el codigo con el pickit y al parecer el pic entra en un loop que da vueltas por el codigo de la interrupcion, como yo espero que la interrupcion suceda cada 0.025 s y es muy poco tiempo para avanzar linea por linea en el debugger probé moviendo la linea LATCbits.LATC1... al cuerpo de la interrupcion y agregando un pequeño delay el led conectado a RC1 parpadea...
No se que será...
La idea de la variable aux_counter es imitar el comportamiento de un timer de 100ms, que no pude lograrlo directamente en el pic
 
Es lo que trato de decirte, si auxcounter supera 3 las interrupciones quedan activadas de manera indefinida porque nunca se limpia la bandera.

Para mi tenes que limpiar la bandera en cada interrupcion de manera incondicional
 
Es lo que trato de decirte, si auxcounter supera 3 las interrupciones quedan activadas de manera indefinida porque nunca se limpia la bandera.

Para mi tenes que limpiar la bandera en cada interrupcion de manera incondicional

No habia entendido tu pregunta, recien me di cuenta solo que es lo que tu dices, tenia que sacar el CCP1IF=0 fuera de ese if, gracias.
 
Buenas noches compañeros estoy estudiando del libro compilador ccs y simulador proteus
para microcontroladores pic, y hay un código que estoy estudiando el cual no corre,
y en la depuración me marca unos errores, no entiendo el código que está en el libro,
se supone que está bien pero me imagino que debe haber algo que estoy haciendo mal,
y solo necesito es simularlo con proteus, agradezco la colaboración de ustedes que tienen mas
experiencia en el campo, yo estoy estudiando de este libro para poder ir avanzado poco a poco
para aprender a programar pics, voy lento pero seguro para entender que hace cada código correctamente.
Aclaro este código venia para trabajar con el pic 16f876 y yo lo cambie para usar un 16f877a,
pero no creo que halla mucha diferencia porque hice los cambios necesarios en la simulación
para hacerlo funcionar, pero el código es el que no me parece, el cual me da 6 advertencias,
pero no hace lo que debería hacer, agradezco la colaboración para saber cual es el error
y poder corregirlo, este es el código y las advertencias que me da.

La practica es usando los timers del pic un teclado y un lcd.
Las librerías no las copio porque son las que se usan para el ccs la del kbd.c y la del lcd.c.

Código:
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#USE DELAY (CLOCK=4000000)
#INCLUDE <kbd.C>
#include <lcd.c>  
#USE STANDARD_IO (a)
int16 counter=0;

//*************** INT TIMER1*********************
#int_TIMER1
void TIMER1_isr(void) {
counter=get_timer0();         //Lectura contador TMR0
counter=counter*2*120;     //Conversión a rpm
  printf(lcd_putc,"%6lu rpm",counter);
  lcd_gotoxy(1,1);
set_timer0(0);                      //Reinicia cuenta
set_timer1(3036);                // Recarga a 0.5s 
 }
//**********************************************
void MAIN()
{           
   CHAR K,kant='0';
   char PWMH=0,PWML=0;
   lcd_init();
   kbd_init();
   PORT_B_PULLUPS(TRUE);
   
   setup_timer_0(rtcc_ext_l_to_h|RTCC_DIV_2);   //Configuración TMR0
     setup_timer_1(T1_internal|T1_DIV_BY_8);     //Configuración TMR1
   set_timer0(0);                               //Borrado contador
   set_timer1(3036);                         //Carga a 0.5s
   enable_interrupts(int_timer1);
   enable_interrupts(global);           //Habilitación interrupciones
   
WHILE(1) {
      k=kbd_getc();
      if (k=='\0') k=kant;
      if ((k=='*') || (k=='#')) k='0';
      kant=k;
       k=k-48;
       PWMH=k*28;
       PWML=255-PWMH;
      for(PWMH;PWMH>0;PWMH--){
       OUTPUT_HIGH(PIN_A0);}
      for(PWML;PWML>0;PWML--){
      OUTPUT_LOW(PIN_A0);}
  }
}
ADVERTENCIAS:
-Este trozo de código me dice ´code has no effect ¨ for(PWMH;PWMH>0;PWMH--)¨
y este también ¨ for(PWML;PWML>0;PWML--)¨ hay ya son 2 advertencias.
-Esto si no lo entiendo ¨interrupts disable during call to prevent re entracy(@delay_ms1)??
Me salen tres errores así, el otro es que siempre la condición de while es true pero esa no me interesa.
En total son 6 advertencias, el código consiste en hacer un ancho de pulso dependiendo de la tecla
que presione al teclado, espero haya sido lo mas claro posible, y agradezco quien encuentre mi error para corregirlo.

Compañeros muchas gracias.
 
Última edición por un moderador:
Atrás
Arriba