que creen no subio el archivo asi que les pongo el programa aqui: saludos
/*MAIN DEL CARRO SEGUIDOR*/
#include <16f877.h>
#include <stdlib.h>
#include <math.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09
#ORG 0X1F00,0X1FFF
void loader(){}
int PWM1,PWM2; /*registros a usar para la salida del control en elciclo pwm*/
float xS,xES,xT; //entradas para fuzzyficar
//xS=Sonar, xES=ErrSonar, xT=Torreta
float y0,y1,y2,y3,y4,y5,y6,y7,y8,y9; //Valores de las funciones membresía
float Ant; //Valor anterior del sonar
float R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,R18,R19;
float R20,R21,R22,R23,R24,R25,R26,R27,R28,R29,R30,R31,R32,R33,R34,R35,R36;
//Valores de las reglas
float Z; //uso general
float Mi,Ba,Me,Al,Ma; //Valores de Salida Singletons
float CdT1,CdT2;
float ay,ay2,ay3,ay4,h1,h2,h3,h4,h5,h6,h7,h8;
float x, x1, x2;
#byte xS = 0X20
#byte xES = 0X21
#byte xT = 0X22
#byte PWM1 = 0X23
#byte PWM2 = 0X24
#byte y0 = 0X25
#byte y1 = 0X26
#byte y2 = 0X27
#byte y3 = 0X28
#byte y4 = 0X29
#byte y5 = 0X2A
#byte y6 = 0X2B
#byte y7 = 0X2C
#byte y8 = 0X2D
#byte y9 = 0X2E
#byte R1 = 0X2F
#byte R2 = 0X30
#byte R3 = 0X31
#byte R4 = 0X32
#byte R5 = 0X33
#byte R6 = 0X34
#byte R7 = 0X35
#byte R8 = 0X36
#byte R9 = 0X37
#byte R10 = 0X38
#byte R11 = 0X39
#byte R12 = 0X3A
#byte R13 = 0X3B
#byte R14 = 0X3C
#byte R15 = 0X3D
#byte R16 = 0X3E
#byte R17 = 0X3F
#byte R18 = 0X40
#byte R19 = 0X41
#byte R20 = 0X42
#byte R21 = 0X43
#byte R22 = 0X44
#byte R23 = 0X45
#byte R24 = 0X46
#byte R25 = 0X47
#byte R26 = 0X48
#byte R27 = 0X49
#byte R28 = 0X4A
#byte R29 = 0X4B
#byte R30 = 0X4C
#byte R31 = 0X4D
#byte R32 = 0X4E
#byte R33 = 0X4F
#byte R34 = 0X50
#byte R35 = 0X51
#byte R36 = 0X52
#byte y = 0X53
#byte C = 0X54
#byte Z = 0X55
#byte Mi = 0X56
#byte Ba = 0X57
#byte Me = 0X58
#byte Al = 0X59
#byte Ma = 0X5A
#byte CdT1 = 0X5B
#byte CdT2 = 0X5C
#byte ay = 0X5D
#byte ay2 = 0X5E
#byte ay3 = 0X5F
#byte ay4 = 0X60
#byte h1 = 0X61
#byte h2 = 0X62
#byte h3 = 0X63
#byte h4 = 0X64
#byte h5 = 0X65
#byte h6 = 0X66
#byte h7 = 0X67
#byte h8 = 0X68
#byte x = 0X69
#byte x1 = 0X6A
#byte x2 = 0X6B
#byte RUE1 = 0X6C
#byte RUE2 = 0X6D
#byte stop1 = 0X6E
#byte stop2 = 0X6F
#byte S1 = 0X60
#byte S2 = 0X61
#byte S3 = 0X62
#byte S4 = 0X63
#byte ES1 = 0X64
#byte ES2 = 0X65
#byte ES3 = 0X66
#byte T1 = 0X67
#byte T2 = 0X68
#byte T3 = 0X69
/*subrutinas*/
/*subrutina de fuzyficación*/
Recta(){
float y;
y=((x2-x)/(x2-x1));
}
/*subrutina de giro*/
giro1(){
int RUE1,RUE2;
output_bit(PIN_C0,1); //sentido de giro motores
output_bit(PIN_C3,0);
RUE1=255;
RUE2=0;
set_pwm1_duty(RUE1);
set_pwm2_duty(RUE2);
delay_ms(150);
RUE1=0;
RUE2=0;
set_pwm1_duty(RUE1); //paro motores y vuelvo a localiza hasta que
set_pwm2_duty(RUE2); //tenga señal de IR
}
/*subrutina de paro*/
stop(){
int stop1,stop2;
stop1=0;
stop2=0;
set_pwm1_duty(stop1);
set_pwm2_duty(stop2);
}
/*FUZZYFICACIÓN DE ENTRADAS*/
Sonar(){ //Función para evaluar la función
float S1,S2,S3,S4; //membresía de Sonar
S1=23;
S2=31;
S3=38;
S4=50;
if(xS<=S1){
y0=1;
y1=0;
y2=0;
y3=0;
} else if(xS<=S2){
x=xS;
x1=S1;
x2=S2;
Recta( );
y0=y;
y1=1-y0;
y2=0;
y3=0;
} else if(xS<=S3){
y0=0;
x1=S2;
x2=S3;
Recta( );
y1=y;
y2=1-y1;
y3=0;
} else if(xS<S4){
y0=0;
y1=0;
x1=S3;
x2=S4;
Recta( );
y2=y;
y3=1-y2;
} else{
y0=0;
y1=0;
y2=0;
y3=1;
}
}
Error(){
float ES1,ES2,ES3;
ES1=-10;
ES2=0;
ES3=10;
xES=Ant-xS;
Ant=xS;
if(xES<=ES1){
y4=1;
y5=0;
y6=0;
} else if(xES<=ES2){
x=xES;
x1=ES1;
x2=ES2;
Recta( );
y4=y;
y5=1-y4;
y6=0;
} else if(xES<ES3){
y4=0;
x1=ES2;
x2=ES3;
Recta( );
y5=y;
y6=1-y5;
} else{
y4=0;
y5=0;
y6=1;
}
}
Torreta(){
float T1,T2,T3;
T1=75;
T2=125;
T3=175;
if(xT<=T1){
y7=1;
y8=0;
y9=0;
} else if(xT<=T2){
x=xT;
x1=T1;
x2=T2;
Recta( );
y7=y;
y8=1-y7;
y9=0;
} else if(xT<T3){
y7=0;
x1=T2;
x2=T3;
Recta( );
y8=y;
y9=1-y8;
} else{
y7=0;
y8=0;
y9=1;
}
}
/*EVALUACIÓN DE REGLAS*/
EvalR(){
float C;
if(y0!=0 && y4!=0){
C=y0*y4;
R1=C*y7;
R2=C*y8;
R3=C*y9;
} else{
R1=0;
R2=0;
R3=0;
}
if(y0!=0 && y5!=0){
C=y0,*y5;
R4=C*y7;
R5=C*y8;
R6=C*y9;
} else{
R4=0;
R5=0;
R6=0;
}
if(y0!=0 && y6!=0){
C=y0*y6;
R7=C*y7;
R8=C*y8;
R9=C*y9;
} else{
R7=0;
R8=0;
R9=0;
}
if(y1!=0 && y4!=0){
C=y1*y4;
R10=C*y7;
R11=C*y8;
R12=C*y9;
} else{
R10=0;
R11=0;
R12=0;
}
if(y1!=0 && y5!=0){
C=y1*y5;
R13=C*y7;
R12=C*y8;
R15=C*y9;
} else{
R13=0;
R14=0;
R15=0;
}
if(y0!=1 && y6!=0){
C=y1*y6;
R16=C*y7;
R17=C*y8;
R18=C*y9;
} else{
R16=0;
R17=0;
R18=0;
}
if(y2!=0 && y4!=0){
C=y2*y4;
R19=C*y7;
R20=C*y8;
R21=C*y9;
} else{
R19=0;
R20=0;
R21=0;
}
if(y2!=0 && y5!=0){
C=y2*y5;
R22=C*y7;
R23=C*y8;
R24=C*y9;
} else{
R22=0;
R23=0;
R24=0;
}
if(y2!=0 && y6!=0){
C=y2*y6;
R25=C*y7;
R26=C*y8;
R27=C*y9;
} else{
R25=0;
R26=0;
R27=0;
}
if(y3!=0 && y4!=0){
C=y3*y4;
R28=C*y7;
R29=C*y8;
R30=C*y9;
} else{
R28=0;
R29=0;
R30=0;
}
if(y3!=0 && y5!=0){
C=y3*y5;
R31=C*y7;
R32=C*y8;
R33=C*y9;
} else{
R31=0;
R32=0;
R33=0;
}
if(y3!=0 && y6!=0){
C=y3*y6;
R34=C*y7;
R35=C*y8;
R36=C*y9;
} else{
R34=0;
R35=0;
R36=0;
}
}
SumaR(){
ay = (R1+R2+R3+R4+R5+R6+R7+R8+R9+R10);
ay2 =(R11+R12+R13+R14+R15+R16+R17+R18+R19+R20);
ay3 =(R21+R22+R23+R24+R25+R26+R27+R28+R29+R30);
ay4 =(R31+R32+R33+R34+R35+R36);
Z= (ay+ay2+ay3+ay4);
}
/*DESFUZZIFICACIÓN*/
DFuzzy(){
h1 = (R3+R5+R6+R7+R8+R10+R11+R13);
h2 = (R9+R12+R14+R16+R17+R19);
h3 = (R15+R18+R20+R21+R22+R23+R25+R28+R31+R34);
h4 = (R24+R26+R27+R29+R30+R32+R33+R35+R36);
CdT1=((Mi*(R1+R2+R4))+(Ba*h1)+(Me*h2)+(Al*h3)+(Ma*h4))/Z;
h5 = (R1+R4+R5+R8+R9+R11+R12+R15);
h6 = (R7+R10+R14+R17+R18+R21);
h7 = (R13+R16+R19+R20+R23+R24+R27+R30+R33+R36);
h8 = (R22+R25+R26+R28+R29+R31+R32+R34+R35);
CdT2=((Mi*(R2+R3+R6))+(Ba*h5)+(Me*h6)+(Al*h7)+(Ma*h8))/Z;
}
/*subrutina de control difuso*/
Persecusion ( ){
xT=input_d();
xS=input_b();
Sonar( ); //fuzzificar para valores de las
Error( ); //funciones membresía
Torreta( );
EvalR( ); //Evalúa reglas y obtengo valores
SumaR( ); //para desfuzzificar
DFuzzy( );
PWM1=CdT1;
PWM2=CdT2;
output_bit(PIN_C0,1); //sentido de los motores
output_bit(PIN_C3,1); //sentido de los motores
SET_PWM1_DUTY(PWM1);
SET_PWM2_DUTY(PWM2);
}
/*subrutinas para el control difuso*/
main( ){
set_tris_a(0x15); //bits a0 al a3 como in y a4,a5 como out
/*a0 indica que hay detección de infrarrojo
a1 indica que debe hacer un giro parcial
a2 indica que se perdió la señal de IR y hacer paro total
a4 indica inicio de búsqueda (Systems ON)*/
set_tris_c(0x00); //puerto C como salida para motores y reinicio del cad y pic aux
set_tris_b(0xff); //puerto b como entrada para sonar
set_tris_d(0xff); //puerto d como entrada para torreta
delay_ms(2000);
setup_timer_2(T2_DIV_BY_1,249,1); //RELOJ DE 20KHZ
setup_CCP1(CCP_PWM);
setup_CCP2(CCP_PWM); //configuro ccp1 y ccp2 como pwm
output_bit(PIN_C4,1); //Reinicio del CAD de sonar
output_bit(PIN_C5,1); //Inicio PIC auxiliar
delay_ms(1000);
output_bit(PIN_C4,0);
output_bit(PIN_C5,0); //fin de envío de señales
output_bit(PIN_A4,1); //saco por canal 1 de TX para checar comunicacion
while (TRUE){
while (PIN_A0==0){
if (PIN_A1==1){
giro1();
}
}
/*Reviso si ya detectó IR, si no lo hizo reviso si quiere
que de giro parcial, si ya detectó IR sale de ese ciclo
e ingreso al ciclo de control, en el cual realizo la
subrutina de persecusión siempre y cuando no exista
señal de interrupción que indica perdida de la señal de
infrarrojo y hago paro de motores*/
/*comunicacion por radiofrecuencia*/
while (PIN_A2==0){ /*mientras el otro carro no me mande por el canal 3 que no tiene*/
Persecusion();
} /*IR que haga todo el control, cuando no tenga señal de IR deja de hacer*/
stop(); /*el while y llama a stop y giro1 y regresa a inicio para*/
//ver si ya tiene de nuevo señal de IR
}
}