TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: facuver en 06 de Julio de 2012, 14:17:47

Título: Problema con las variables en la interrupcion
Publicado por: facuver en 06 de Julio de 2012, 14:17:47
hola que tal, tengo un problema en un programa simple para el control de un servo. el problema es para tomar una variable del programa principal y poder usarla en la interrupción.

es para un PIC12F683
y lo compilo con el PIC C COMPILER de CCS

El programa:

#include "Z:\***\siguelineas\servo\pruebas\1.h"
#int_RTCC
int16 ang;



RTCC_isr()
{
int i;
for(i=0;i!=10;i++)
{

   OUTPUT_HIGH (PIN_A0);         //Esto le da un pulso
   delay_us(ang);                       //al servo de 1.4ms
   OUTPUT_LOW(PIN_A0);           //
   delay_ms(10);
}

}



void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   setup_oscillator(OSC_8MHZ);

   // TODO: USER CODE!!

while(true)
{
OUTPUT_HIGH(PIN_A1);   //parpadea un led
delay_ms(200);               //
OUTPUT_LOW(PIN_A1);   //
delay_ms(200);

ang = 1400;

}
}

Ya probé asignarle un valor a la variable "ang" dentro de la interrupción y anda bien, pero al ponerle el valor desde el programa no lo toma.

Espero que se entienda bien, y espero que alguien sepa el problema.


Título: Re: Problema con las variables en la interrupcion
Publicado por: BrunoF en 06 de Julio de 2012, 14:30:59
Está interrumpiendo el Timer antes de que se ejecute la asignación del valor 1400 a la variable ang. El Timer interrumpe cada 256 * 128 instrucciones. Eso a 8Mhz son 16.384 mS lo que significa que el Timer va a interrumpir varias veces antes debido a las demoras que pusiste previas a la asignación. Por eso "parece" que no la tomase.

Probá asignandole el valor 1400 antes de el while().
Título: Re: Problema con las variables en la interrupcion
Publicado por: facuver en 06 de Julio de 2012, 15:11:29
Está interrumpiendo el Timer antes de que se ejecute la asignación del valor 1400 a la variable ang. El Timer interrumpe cada 256 * 128 instrucciones. Eso a 8Mhz son 16.384 mS lo que significa que el Timer va a interrumpir varias veces antes debido a las demoras que pusiste previas a la asignación. Por eso "parece" que no la tomase.

Probá asignandole el valor 1400 antes de el while().


el programa que algo asi y sigue sin funcionar, a esto te referias?


#include "Z:\Vereertbrugghen\siguelineas\servo\pruebas\1.h"
#int_RTCC
int16 ang;



RTCC_isr()
{
int i;
for(i=0;i!=10;i++)
{

   OUTPUT_HIGH (PIN_A0);
   delay_us(ang);
   OUTPUT_LOW(PIN_A0);
   delay_ms(10);
}

}



void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   setup_oscillator(OSC_8MHZ);

   // TODO: USER CODE!!
ang = 1400;

while(true)
{
/*
OUTPUT_HIGH(PIN_A1);
delay_ms(200);
OUTPUT_LOW(PIN_A1);
delay_ms(200);*/

ang = 1400;

}



}
Título: Re: Problema con las variables en la interrupcion
Publicado por: BrunoF en 06 de Julio de 2012, 15:20:38
Si, fijate que además:

Código: C
  1. #int_RTCC
  2. int16 ang;
  3.  
  4. RTCC_isr()
es incorrecto. La directiva del preprocesador #INT_XXXX debe ir JUSTO ANTES de la subrutina a asociar. No podés poner ningún tipo de sentencia en el medio. Sino el compilador no asocia la subrutina a la interrupción declarada.

Debería quedar, por ejemplo:

Código: C
  1. int16 ang;
  2.  
  3. #int_RTCC
  4. RTCC_isr()