TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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.
-
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().
-
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;
}
}
-
Si, fijate que además:
#int_RTCC
int16 ang;
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:
int16 ang;
#int_RTCC
RTCC_isr()