buenas..me faltaba colocar #int_timer2 arriba de void TIMER2_isr.
Ese #int_timer2 es lo que le indica al compilador que la rutina que hay a continuación es la que debe usar para tratar la interrupción de timer2. Gracias Redpic y Palitroquez por avisarme.
Con respecto a lo de poner algo en set_pwm_duty no se si hace falta, pero por ahora no me funciona el modulo PWM..solo puedo adquirir y enviar a la PC. A continuacion coloco el programa realizado hasta el momento.Saludos
#include <16F873.h>
#device adc=8
#include <stdlib.h>
#include <float.h>
#include <math.h>
#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 NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//Definición de variables
Float Error_k2=0,Error_k1=0,Error_k0=0;
Const Float a0=0.132,a1=0.2497,a2=0.1181,REFERENCIA=1.6666;
Float ANGULO=0;
Float uk,uk_anterior,Anterior=1;
Long uk_PWM=0;
Const Float Pendiente1=0.06603;
Const Float Pendiente2=0.03667,oo2=3.16667;
Const Float Pendiente3=0.14,oo3=-97;
Const Float Pendiente4=0.24051,oo4=-217.6075;
Const Float Pendiente5=0.1,oo5=-57;
Float corre;
#use fast_io(A)
#use fast_io(B)
//Definición de variables
Int POSI,VELOC,Vangulo,Acorr;
#byte portb=0x06
void POSICION()
{
set_adc_channel(2); //Selecciona canal 2
delay_us(40); //Espera estabilización del canal
POSI=read_adc();
printf("P= %2x\n\r",POSI);
}
void VELOCIDAD()
{
set_adc_channel(1); //Selecciona canal 1
delay_us(40); //Espera estabilización del canal
VELOC=read_adc();
printf("V= %2x\n\r",VELOC);
}
void LEEANGULO()
{
set_adc_channel(0); //Selecciona canal 0
delay_us(40); //Espera estabilización del canal
Vangulo=read_adc();
printf("A= %2x\n\r",Vangulo);
corre=(float)Vangulo*(5/256);
if(corre<=0.4) ANGULO=Pendiente1*corre;
if(0.4<corre<=3.7) ANGULO=Pendiente2*corre+oo2;
if(3.7<corre<=3.91) ANGULO=Pendiente3*corre+oo3;
if(3.91<corre<=4.67) ANGULO=Pendiente4*corre+oo4 ;
if(4.67<corre<=5) ANGULO=Pendiente5*corre+oo5;
Acorr=(int)ANGULO;
printf("AC= %2x\n\r",Acorr);
Error_k2 = error_k1;
Error_k1 = error_k0;
Error_k0 = REFERENCIA - ANGULO;
uk = a0*Error_k0+a1*Error_k1+a2*Error_k2+uk_anterior*Anterior;
uk_anterior= uk;
if(uk<=0){
uk=0;
}
uk_PWM=(long int)uk;
if(uk_PWM>=1023) uk_PWM=1023;
if(uk_PWM<=0) uk_PWM=0;
}
#int_TIMER2
void TIMER2_isr()
{
set_pwm1_duty(uk_PWM);
}
void inicializar()
{
set_tris_b(0x00); //Puerto B como salida
port_b_pullups(TRUE);
portb=0x00; //Limpio el puerto B.
setup_adc(ADC_CLOCK_DIV_32);
setup_adc_ports(ALL_ANALOG);
set_adc_channel(0); //selección canal 0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
disable_interrupts(GLOBAL);
}
void main()
{
inicializar();
set_pwm1_duty(
;
while(true)
{
POSICION();
VELOCIDAD();
LEEANGULO();
}
}