Autor Tema: Problema con CCS, no funciona seguidor de linea, ayuda!!  (Leído 5008 veces)

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

Desconectado pirata88

  • PIC10
  • *
  • Mensajes: 16
Problema con CCS, no funciona seguidor de linea, ayuda!!
« en: 01 de Abril de 2009, 11:42:16 »
El caso esque estamos haciendo un seguidor de linea en C y cn el CCS, cuando pongo un if y comparando no mas de 2 veces todo va perfecto y hace el seguidor lo que le decimos, aora si comparamos mas de 3 veces...teniendo en cuenta que tenemos un total de 5 cny70 leyendo si hay linea o no, nose si es un problema de mi programa...o esque el ccs no admite tanto, seria una pena de programa entonces, porque no se podria trabajar cn muchos sensores...sin mas dilacion les envio mi programa tal cual, es por modulacion, esta es la quintuple version de lo mismo...pero empezando desde el principio




#include <18F4550.h>
#use standard_io(a,b,c,d)
#fuses  XT, NOWDT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD, NOPBADEN
#use delay(clock = 4000000)

int16 M_IZQUIERDO=100, M_DERECHO=100;   // motores al principio parados
int16 M_IZQUIERDO_2=100, M_DERECHO_2=100;
int8 a=0;


void main (void) {


disable_interrupts(global);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1 );
enable_interrupts(int_timer1);
enable_interrupts(global);
set_timer1(40000);


do {

//L_I=input(pin_d3);
//L_I_C=input(pin_d2);   lateral izquierdo cercano al del centro
//C=input(pin_c4);
//L_D_C=input(pin_c6);   lateral derecho cercano al del centro
//L_D=input(pin_c5);

if ( input(pin_d2)==0 && input(pin_c6)==0 ){          // detectores centrales en linea

if ( input(pin_d3)==1 &&input(pin_c5)==1 ){          // laterales fuera de linea
M_IZQUIERDO=800; M_DERECHO=800;
}
if ( input(pin_d3)==1 &&input(pin_c5)==0 ){         // detector derecho dentro de linea
M_IZQUIERDO=700; M_DERECHO=500;
}
if ( input(pin_d3)==0 &&input(pin_c5)==1 ){         // detector izquierdo dentro de linea
M_IZQUIERDO=500; M_DERECHO=700;
}
if ( input(pin_d3)==0 &&input(pin_c5)==0 ){         // los dos dentro de la linea
M_IZQUIERDO=800; M_DERECHO=800;
}
}



if ( input(pin_d2)==1 && input(pin_c6)==1 ){         // dos centrales fuera de linea

if ( input(pin_d3)==0 &&input(pin_c5)==1 ){          // veamos cual es el ultimo para salirse
M_IZQUIERDO=500; M_DERECHO=700;
}
if ( input(pin_d3)==1 &&input(pin_c5)==0 ){
M_IZQUIERDO=700; M_DERECHO=500;
}
if ( input(pin_d3)==1 &&input(pin_c5)==1 ){
M_IZQUIERDO=100; M_DERECHO=100;
}

}




if ( input(pin_d2)==1 && input(pin_c6)==0 ){         // se sale primero por el izquierdo

if ( input(pin_d3)==1 &&input(pin_c5)==0 ){
M_IZQUIERDO=800; M_DERECHO=450;
}

}




if ( input(pin_d2)==0 && input(pin_c6)==1 ){       // se sale por el izquierdo

if ( input(pin_d3)==0 &&input(pin_c5)==1 ){
M_IZQUIERDO=450; M_DERECHO=800;
}

}



}
while(true);
}





#int_timer1
void modulacion(void)
{

if ( a==0){

M_IZQUIERDO_2=M_IZQUIERDO;

set_timer1(65535-M_IZQUIERDO_2);
output_high(pin_d1);
}
else if (a==1){

set_timer1(65535-1250+M_IZQUIERDO_2);                                   // 1250 es la ventana de los motores,los 400 Hz
output_low(pin_d1);                                                   // son 2500 tics
}
else if ( a==2){

M_DERECHO_2=M_DERECHO;

set_timer1(65535-M_DERECHO_2);
output_high(pin_c7);
}
else if (a==3){

set_timer1(65535-1250+M_DERECHO_2);
output_low(pin_c7);
a=-1;
}

a++;
}






como podeis observar, aun haciendo una anidacion tampoco funciona, solo si comparas dos y...sin anidar con otras, intente leer la entrada y meterla en una variable cmo se observa en lo comentado, y eso tampoco funcionaba, sabeis porque es? el ccs te quita el trabajo de trabajar con direcciones y funciones y tal...por eso lo utilizamos pero si ciertas cosas no las hace, tendremos q utilizar otro, pues restringe muchisimo lo que queremos hacer, muchas gracias de antemano ( notese que he hecho anidacion y no e comparao 4 veces dentro del if, aun asi tampoco funciona
« Última modificación: 01 de Abril de 2009, 16:41:48 por pirata88 »

Desconectado pirata88

  • PIC10
  • *
  • Mensajes: 16
Re: Problema con CCS, no funciona seguidor de linea, ayuda!!
« Respuesta #1 en: 01 de Abril de 2009, 20:09:32 »
se me olvido comentar...que la simulacion en proteus va perfecta, hace lo que yo le ordeno sin complicaciones, todos los cny de dos en dos si comparo asen lo k yo quiero...si utilizo mas de dos comparaciones pues simplemente no va, como si el seguidor de linea no leyera las entradas, pero sigue estando en el while..., alomejor es un problema con los fuses...que se yo...

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con CCS, no funciona seguidor de linea, ayuda!!
« Respuesta #2 en: 02 de Abril de 2009, 00:10:40 »
Hola.

Que sepa: La definicion de las interrupciones ( #int_xxx ) debe hacerse antes del main. A mi nunca me ha dado problema las comparaciones anidadas. No recuerdo donde fue que lo lei, pero eso de los if anidados tiene un limite, pero es bastante amplio.

Saludos
El papel lo aguanta todo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problema con CCS, no funciona seguidor de linea, ayuda!!
« Respuesta #3 en: 02 de Abril de 2009, 03:44:47 »
Yo creo que sería mucho más fácil de depurar, y quedaría más limpio el código, si los pines de los sensores estuvieran todos en el mismo puerto, y uno tras otro.

Supongamos que los pines C5 y C6 los asignas a D0 y D1, por ejemplo.
Un código como este:

if ( input(pin_d2)==1 && input(pin_c6)==1 ){         // dos centrales fuera de linea

if ( input(pin_d3)==0 &&input(pin_c5)==1 ){          // veamos cual es el ultimo para salirse
M_IZQUIERDO=500; M_DERECHO=700;
}
if ( input(pin_d3)==1 &&input(pin_c5)==0 ){
M_IZQUIERDO=700; M_DERECHO=500;
}
if ( input(pin_d3)==1 &&input(pin_c5)==1 ){
M_IZQUIERDO=100; M_DERECHO=100;
}


quedaría simplificado así:
if ((input_d() & 0x0F) == 0b0111) {M_IZQUIERDO=500; M_DERECHO=700;};
if ((input_d() & 0x0F) == 0b1110) {M_IZQUIERDO=700; M_DERECHO=500;};
if ((input_d() & 0x0F) == 0b1111) {M_IZQUIERDO=100; M_DERECHO=100;};

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Problema con CCS, no funciona seguidor de linea, ayuda!!
« Respuesta #4 en: 02 de Abril de 2009, 07:16:02 »

Como veo tu programa supongo antes hay una etapa comparadora y esta a su vez te da la respuesta digital de los sensores.

Esto es asi??

O conectas los CNY70 directamente al uC??


Saludos?




Desconectado pirata88

  • PIC10
  • *
  • Mensajes: 16
Re: Problema con CCS, no funciona seguidor de linea, ayuda!!
« Respuesta #5 en: 02 de Abril de 2009, 09:31:17 »
no puedo conectarlo de otra forma...pues ya hemos insolado la placa y conectado el circuito, respecto a los sensores...la salida la hemos conectado directamente al pic, no hemos puesto ningun chip para que de o cero o 5 voltios, pues funciona a la perfeccion, para no complicar mas el circuito, pues tb tiene leds para la velocidad de los motores q no he incluido en el programa porque lo empezamos de nuevo y eso era el final...yo he leido que hay q configurarlo todo, incluso la entrada analogica y tal..., lo hemos comprobado y los sensores dan o cero y pico cuando estan en la linea negra o 4 y pico estando afuera, descartamos q sea problema de ello, podrian ser los fuses q falta algo...incluso si pongo un bucle while antes del do while diciendo q no ande hasta q algun sensor valga cero, el bicho va a tope, y pasa x la linea negra como si nada mentendeis? una locura...

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Problema con CCS, no funciona seguidor de linea, ayuda!!
« Respuesta #6 en: 02 de Abril de 2009, 09:59:45 »

Entiendo lo de tu programa y el problema que da.

Solo hago referencia a la conexion porque es lo adecuado.Sin duda te funcionaran , pero ten cuidado con los niveles de luz ambiente en caso de que no protejas los sensores. Y no se a que umbral trabaja el pic que uses , me parece que unos tienen entrada Schmitt Trigger.


Saludos!

Desconectado pirata88

  • PIC10
  • *
  • Mensajes: 16
Re: Problema con CCS, no funciona seguidor de linea, ayuda!!
« Respuesta #7 en: 02 de Abril de 2009, 10:47:14 »
si fuera de eso m ubiera dao ya cn un canto en los dientes xD, es un problema de la programacion, pero que solo afecta en la realidad y no en la simulacion...tngo q probar el programa en otro chip, por ejemplo el 628a..., pero entonces todo se iria a la basura...cmo la placa y la estructura...aver si algien aporta luz a esta oscuridad...gracias! :-)

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con CCS, no funciona seguidor de linea, ayuda!!
« Respuesta #8 en: 02 de Abril de 2009, 13:06:44 »
Prueba con un 18F452 o un 16F877A ... tienen la misma distribucion de pines.
El papel lo aguanta todo

Desconectado pirata88

  • PIC10
  • *
  • Mensajes: 16
Re: Problema con CCS, no funciona seguidor de linea, ayuda!!
« Respuesta #9 en: 02 de Abril de 2009, 14:17:43 »
aver si tenemos el 18f452 q supongo q sera de la misma anxura...el 16 lo e visto q lo tenemos dsd luego...abra q probar y esas cosas, gracias! y si algien ve el fallo concreto, tb sera de ayuda! :-/