Autor Tema: Problema con las variables en la interrupcion  (Leído 1568 veces)

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

Desconectado facuver

  • PIC10
  • *
  • Mensajes: 14
Problema con las variables en la interrupcion
« 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.



Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema con las variables en la interrupcion
« Respuesta #1 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().
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado facuver

  • PIC10
  • *
  • Mensajes: 14
Re: Problema con las variables en la interrupcion
« Respuesta #2 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;

}



}

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema con las variables en la interrupcion
« Respuesta #3 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()
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.