Autor Tema: ayuda con entradas para pic 16F877  (Leído 5560 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado yole

  • PIC10
  • *
  • Mensajes: 9
ayuda con entradas para pic 16F877
« en: 07 de Julio de 2004, 13:05:00 »
hola soy nuevo en esto de pics soy ingeniero mecanico y me meti a un curso de microprocesadores y me gusto mucho el uso del pic, he estado viendo diferentes cosas que postean en este foro y tengo que felicitarlos he aprendido mucho de ustedes, asi como de cada uno de los que postean sus dudas, y esto me lleva a mi a una duda que tengo.

quiero utilizar dos puertos como entrada, dependiendo del valor que tenga en el puerto sera la salida que es para controlar un motor, lo intente hacer el programa en C y me salio sin problemas al compilar en el ccs, pero al momento de hacerlo fisicamente con el pic no funciona y no hace nada, entonces me di a la tarea de checar paso a paso cada cosa del pic (la tarjeta que uso la desarrollaron en el curso usamos un pic 16F877), lo primero que hice fue checar las salidas de cada puerto asi como el PWM y si funcionan fisicamente.

despues al checar las entradas para que accienen alguna salida, no hace nada, es mas hace lo que quiere cuando le doy una entrada, no se que este pasando o en que estoy mal al programar, tengo que decirles que he aprendido a programar basandome en un manual que esta en este foro sobre CCS asi que talvez este mal en algo les pongo el programa sencillo que tengo y agradeceria que me ayudaran en que esta mal.


      /*Prueba entradas*/

#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)




#ORG 0X1F00,0X1FFF

void loader(){}

int dato;


   main( ){

   setup_adc( ADC_OFF );
   setup_adc_ports( NO_ANALOGS );
   set_tris_a(0xff); a como entrada
    set_tris_e(0x00); e como salida
     set_tris_b(0x01); b0 como entrada
     set_tris_d(0x00); d como salida
     set_tris_c(0x00); c como salida
   delay_ms(2000);
   setup_timer_2(T2_DIV_BY_1,249,1);   //RELOJ DE 20KHZ


   while ( TRUE ){
   
   if (PIN_B0 == 1){
   
   output_d(0b00001111);
   }
   else {
   output_d(0b11110000);
   }

}
}


saludos

YOLE

Desconectado narcosystem

  • PIC10
  • *
  • Mensajes: 32
RE: ayuda con entradas para pic 16F877
« Respuesta #1 en: 07 de Julio de 2004, 14:13:00 »
hola yole, prueba a poner en lugar de if(pin_B0==1), a poner

 if(input(PIN_B0))

ademas antes de usar set_tris tienes que poner como vas a gestionar la entrada salida(estandar, fast ,fija) usando la directiva
en este caso

#use fast_IO(a) //Nos permite configurar a nosotros los registros
#use fast_IO(b)   //TRIS de seleccion de entrada salida de los pines
#use fast_IO(c)
#use fast_IO(d)
#use fast_IO(e)

espero haberte sido de ayuda


Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: ayuda con entradas para pic 16F877
« Respuesta #2 en: 07 de Julio de 2004, 14:27:00 »
Como anota narcosystem,la comprobación que haces para ver el estado del pin RB0 no está bien.Lo que haces es comprobar si PIN_B0 tiene el valor 1 o no,siendo este PIN_B0 una constante,cuyo valor es 48 y que está definida en el fichero 16F877.h.
Aún siendo así te debería entrar por la otra rama del if en todos los casos.
Puedes probar a omitir la línea para reservar ROM,podrías estar pisando alguna línea de programa.
Un saludo

Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
RE: ayuda con entradas para pic 16F877
« Respuesta #3 en: 07 de Julio de 2004, 20:00:00 »
tente organizar mais seu codigo e coloque comentarios:


tente isto:


#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()
{


}

void main()
{

int dato;

setup_adc( ADC_OFF );

setup_adc_ports( NO_ANALOGS );

 set_tris_a(0xff); //a como entrada
 set_tris_b(0x01); //b0 como entrada
 set_tris_c(0x00); //c como salida
 set_tris_d(0x00); //d como salida
 set_tris_e(0x00); //e como salida

// inicializa os ports
                     // inicializa os ports
      porta=0x00;            // limpa porta
      portb=0x00;            // limpa portb
      portc=0x00;            // limpa portc
      portd=0x00;            // limpa portd
      porte=0x00;            // limpa porte
 

//delay_ms(2000);
//setup_timer_2(T2_DIV_BY_1,249,1); //RELOJ DE 20KHZ


while ( TRUE ){

if (pin_b0)

{

portd=15;
}

else {


portd=240;

}


}
}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: ayuda con entradas para pic 16F877
« Respuesta #4 en: 08 de Julio de 2004, 00:33:00 »
El error está en el if (PIN_B0 == 1), la solución que te dá narcosystem es la correcta y con ella te debiera de funcionar. Sin los fast también tiene que ir, si los pones ahorras código de programación en el caso de usar en tu programa funciones input o output.

Un saludo

Desconectado yole

  • PIC10
  • *
  • Mensajes: 9
RE: ayuda con entradas para pic 16F877
« Respuesta #5 en: 08 de Julio de 2004, 00:45:00 »
muchas gracias, no crei que me contestaran tan rapido, gracias y una disculpa por no poder entrar antes ya que no servia el servidor de la universidad, estaba viendo lo que me ponen,

si yo no puse nunca el #use fast_io(x)
por que en cuanto a las salidas si daban lo que queria?, es decir si queria variar el pwm si hacia el cambio en los pulsos asi como el estado del pin que queria ya fuera UNO o CERO.

ademas estaba viendo en otra parte del foro que si no pongo direccion de memoria a las variables que quiero usar el compilador me marca error de RAM, sucede lo mismo con los puertos ?, tengo que marcar la direccion que tienen dentro del banco de registros del PIC ?
ejemplo:

#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)




#ORG 0X1F00,0X1FFF

void loader(){}

   int PWM1,PWM2;                /*registros a usar para la salida del control en el
ciclo pwm*/

   float xS,xES,xT;                                 //xS=Sonar, xES=ErrSonar, xT=Torreta
   float y0,y1,y2,y3,y4,y5,y6,y7,y8,y9;      
   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;
                     float Z;
   float Mi,Ba,Me,Al,Ma;            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

entonces asi como defini cada una de las variables de mi programa tengo que definir los puertos, y porque tengo que definir primero el tipo de variable que voy a usar y despues definir el lugar que ocupa en el banco de registros ?


hasta mañana checo temprano el programa en una protoboard y veo que sucede si funciona, gracias y una vez que vea que funcionan las entradas subo el programa que hago para controlar dos motores empleando la entrada de dos CADs que vienen de un sonar y una torreta, de hecho se preguntaran porque no uso el CAD del PIC pero me parecio mejor usar para ahorrar tiempo maquina que la señal no fuera analogica sino que fuera digital desde un principio

gracias y saludos, en verdad nunca crei que el mundo de los micros fuera necesario, con esto me olvido de los PLCs y arriba el PIC

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: ayuda con entradas para pic 16F877
« Respuesta #6 en: 08 de Julio de 2004, 01:12:00 »
No, no es necesario asignar a las variables ni a los puertos direcciones de memoria con #byte xS = 0X20
, las asigna automáticamente el compilador, eso sí donde le dá la gana.

Desconectado yole

  • PIC10
  • *
  • Mensajes: 9
RE: ayuda con entradas para pic 16F877
« Respuesta #7 en: 08 de Julio de 2004, 01:19:00 »
ok, gracias creia que era necesario todo eso, bueno, muchas gracias y al rato en unas horas pruebo todo lo que me ayudaron para hacer funcionar mi robot movil, gracias

saludos

Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
RE: ayuda con entradas para pic 16F877
« Respuesta #8 en: 11 de Julio de 2004, 07:43:00 »
realmente pocher tem razao p certo seria:

#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

#bit   botao=portb.0


#ORG 0X1F00,0X1FFF

void loader()
{


}

void main()
{

int dato;

setup_adc( ADC_OFF );

setup_adc_ports( NO_ANALOGS );

set_tris_a(0xff); //a como entrada
set_tris_b(0x01); //b0 como entrada
set_tris_c(0x00); //c como salida
set_tris_d(0x00); //d como salida
set_tris_e(0x00); //e como salida

// inicializa os ports
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte


//delay_ms(2000);
//setup_timer_2(T2_DIV_BY_1,249,1); //RELOJ DE 20KHZ


while ( TRUE ){

if (botao)

{

portd=15;
}

else {


portd=240;

}


}
}

e quanto as variaveis não precisa declarar seu endereços,e vc precisa realmente de tantas?pra que serve elas???

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: ayuda con entradas para pic 16F877
« Respuesta #9 en: 11 de Julio de 2004, 13:28:00 »
No entiendo, podrías explicar tus preguntas de otra forma ?

Desconectado yole

  • PIC10
  • *
  • Mensajes: 9
RE: ayuda con entradas para pic 16F877
« Respuesta #10 en: 17 de Julio de 2004, 03:37:00 »
hola que tal bueno creo que ya termine el programa del robot movil que estaba queriendo hacer, les dire de que se trata, es un robot que se mueve en un medio evitando obstaculos y controlando su velocidad para eso estoy empleando un control difuso en lugar de un PID, tengo un sonar para que me de la posicion y la direccion la obtengo de un potenciometro conectado a un juego de engranes que al generar una trayectoria me da por un convertidor analogico digital un valor, trate de hacer una especie de radar y aparte se comunica con el ambiente por medio de un radio de 4 canales, en base a esto creo que acabe el programa, pero me gustaria que lo vieran y me dijeran si tengo algo equivocado, de seguro veran que hay formas de simplificar el programa pero esto es porque no soy tan ducho en C pero me las arreglo, saludos y espero criticas y comentarios, gracias en verdad me ayuda mucho este foro.

no se si poner el programa como mensaje ya que es un poco largo, asi que mejor lo subi como archivo, subi el texto, saludos

Desconectado yole

  • PIC10
  • *
  • Mensajes: 9
RE: ayuda con entradas para pic 16F877
« Respuesta #11 en: 17 de Julio de 2004, 03:40:00 »
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
               }

   }





Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: ayuda con entradas para pic 16F877
« Respuesta #12 en: 17 de Julio de 2004, 05:30:00 »
¿Te funciona físicamente? veo que sigues poniendo estructuras como if (PIN_A1==1) ó while (PIN_A2==0).

No puedo comprender el programa, ya que no conozco la lógica difusa, aunque me gustaría.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: ayuda con entradas para pic 16F877
« Respuesta #13 en: 17 de Julio de 2004, 05:48:00 »
Yole esas condiciones de control son incorrectas ya te lo dijimos más arriba.Si quieres comprobar si el pin RA1 está a uno,una manera de hacerlo es así:
Codigo:

 if(input(PIN_A1))
  {
  código...
  }




Desconectado yole

  • PIC10
  • *
  • Mensajes: 9
RE: ayuda con entradas para pic 16F877
« Respuesta #14 en: 20 de Julio de 2004, 02:58:00 »
perdon por no contestar antes pero tuve problemas con mi computadora y no tengo el programa a la mano, de hecho el programa que subi no me fije y tiene los errores que ustedes me han corregido, el otro programa tengo que ir al laboratorio por el antes de que se vayan de vacaciones, y me gustaria pedirle a alguien de favor que si me lo puede compilar y mandarme los diferentes archivos que se dan ya que no tengo compu durante estos dias y me gustaria probarlo fisicamente para ver en cuanto a los sensores si estan bien o que posibles errores puedan tener ya que todos los he hecho con mis conocimientos limitados en comparacion con un electronico, saludos y en unas horas subo el programa corregido


 

anything