Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola!
Antes que nada, pido perdón si el post no está el el foro correcto, pero es que soy un indeciso y no sabia en que categoría ponerlo... microcontroladores, programación... 😳 😳
Estoy haciendo mis pinitos con pinguino y el entorno de desarrollo me tiene "crujientito" (casi quemao). Se que tiene bugs (muchos) en los define. Gracias al blog de Uvanov, me he enterado que en breve (si breve dos veces bueno) saldrá la beta 8 corrigiendo estos fallos. Pero es que esta ultima me ha dejado muerto 😯 😯 😯
Resulta que si haces un programa con:
//Si los sensores están sobre blanco ==> AVANZA RECTO
if ( (digitalRead(CNY_ED)== BLANCO) && (digitalRead(CNY_EI)== BLANCO) )
{
TonServo[SERVO_D]=AVANCE_D;
TonServo[SERVO_I]=AVANCE_I;
}
else if ( (digitalRead(CNY_ED)== NEGRO) && (digitalRead(CNY_EI)== BLANCO) ) //Si el sensor derecho toca negro ==> GIRO A DERECHAS
{
TonServo[SERVO_D]=STOP_D; //Podemos girar sobre el eje con ATRAS_D
TonServo[SERVO_I]=AVANCE_I;
}
//Si el sensor derecho toca negro ==> GIRO A IZQUIERDAS
else if ( (digitalRead(CNY_ED) == BLANCO) && (digitalRead(CNY_EI)== NEGRO) )
{
TonServo[SERVO_D]=AVANCE_D;
TonServo[SERVO_I]=STOP_I; //Podemos girar sobre el eje con ATRAS_I
}
else //si los sensores están sobre negro ==> PARAMOS
{
TonServo[SERVO_D]=STOP_D;
TonServo[SERVO_I]=STOP_I;
}
Resulta que me da error al compilar
C:Pinguino Beta 7source/user.c:158: syntax error: token -> '{' ; column 3
C:Pinguino Beta 7source/user.c:167: syntax error: token -> 'else' ; column 5
error while compiling file C:Pinguino Beta 7examplesEjemplos DavidProgramas DesafioSigueLinea_2sensoresEXT
Tras muchas vueltas al código me voy al archivo user.c a ver que ha traducido y me encuentro que los else if me los traduce por elseif (tojunto) y claro el sdcc dice que si quieres arroz Catalina.
elseif(( digitalread(11)==FALSE)&&( digitalread(9)==TRUE))
{
TonServo[3]=1300;
TonServo[2]=2100;
}
elseif(( digitalread(11)==TRUE)&&( digitalread(9)==FALSE))
{
TonServo[3]=500;
TonServo[2]=1300;
}
else {
TonServo[3]=1300;
TonServo[2]=1300;
}
De momento la única solución que he encontrado es poner el if en la siguiente linea del else.. y así parece que tira.
else
if ( (digitalRead(CNY_ED) == BLANCO) && (digitalRead(CNY_EI)== NEGRO) )
{
TonServo[SERVO_D]=AVANCE_D;
TonServo[SERVO_I]=STOP_I; //Podemos girar sobre el eje con ATRAS_I
}
Solo quiero saber si le ha pasado a alguien más y que solución ha tomado, y si alguien más sabe de sorpresitas como esta.
Salu2!
Pinguino es un proyecto muy joven, está empezando y como tal todavía tiene unos cuantos fallos. Lo bueno es que JP Mandon es un máquina y le mandas los bugs y los corrige super rápido. Al ser un proyecto joven es donde todos podemos aportar y ayudar... si tienes tiempo y ganas seguro que JP te lo agradecerá (y el resto de los que estamos con Pinguino también).
Si quieres probarlo en la nueva versión (la beta8 mándame un email, o ponme un comentario en mi blog) y te lo hago llegar. A cambio compilas el programa y si encuentras un bug me lo cuentas a mi o se lo cuentas a JP 😀 Aunque yo creo que con los cambios que ha hecho funcionará bien ese programa (pero no lo he probado).
Un saludo.
Hola!
A ver si tengo un rato y lo mando al grupo de google. Si de normal me tengo que pensar lo que digo ... en ingles ni te cuento 😉 .
Te mando un privado o te escribo en el blog para lo de la beta 8. Gracias!
Salu2!
Unas 3 de sugerencias:
1º- Por qué lees 6 veces los sensores sin con 2 veces es suficiente? Lee los sensores antes de los if anidadeos y mete los valores en variables; harás más fácil el codigo y más rápido ( sobretodo si las llamadas a digitalRead son costosas). De hecho, si fuese un sistema "crítico", podrías estar cometiendo errores puesto que una lectura del sensor A en el primer if podría se diferente a una lectura del sensor A en el 3º-4º if, lo que podría darte que se metiese dos veces en la misma iteración y le estarías dando instrucciones inconsistentes al robot ( es decir, en el primer if determinas que ha de girar hacia un lado y en el 3º que tiene que girar al otro, con lo que se te podría quedar hecho un "brick" el robot).
2º.- En tu caso, puesto lo que estás haciendo es "implementar" una tabla de verdad de dos variables booleanas, puedes sustituir esa maraña de if-else en if simples, puesto que las condiciones de los ifs son mutuamente excluyentes (es decir, sólo va a entrar en un if de los 4). Posiblemente "evites" que se repita el bug del compilador/interprete que hay en las condicionales múltiples. El código de los 4 ifs simples en eficiencia es similar a los ifs anidados.
val1=digitalread(..);
val2=digitalread(..);
if(val1==Blanco && val2==Blanco)
{
...
}
if(val1=Blanco && val20=Negro)
{
...
}
.....
3º.- Desconozco si el pinguino tiene estructura de control tipo switch. En su caso podrías codificar la tabla de verdad con un entero a partir de las lecturas de los sensores.
val1=digitalread(..);
val2=digitalread(..);
status=(val1)+(val2<<1):
switch(status)
{
case 1: .... break;
case 2: ..... break;
..
.
}
Espero haberte ayudado en una codificación alternativa del control. Desconozco la sintaxis del pinguino pero no creo que difiera mucho de la que te expongo.
Saludos!
Hola Victorblue!
Gracias por las sugerencias.
Te comento; el programa es de un siguelineas muy simple, por lo que no es nada crítico. Aun así, o no te he entendido bien o estoy confundido, vamos a ver:
Por qué lees 6 veces los sensores sin con 2 veces es suficiente
En realidad no leo 6 veces. Al ser mutuamente excluyentes las condiciones de los if else, en el momento que se cumple una las demás no se comprueban y por tanto no se leen. Por eso no puedo darle al robot una orden en el primer if y la contraria en el tercero, por lo menos no en la misma ejecución del bucle.En cuanto a las funciones de lectura, no tengo por que utilizarlas... puedo acceder directamente a los registros del puerto con PORTBbits.RBx.
puedes sustituir esa maraña de if-else en if simples, puesto que las condiciones de los ifs son mutuamente excluyentes (es decir, sólo va a entrar en un if de los 4).
Si pero entonces si que estaría leyendo en cada if los sensores, precisamente por que no son mutuamente excluyentes. Ademas en ese caso si que podría dar una orden en un if y la contraria en el siguiente. Por otro lado, si utilizo variables (utilizo memoria RAM) y las leo una vez en cada ejecución del bucle si que puedo cometer errores por que el valor que leo de la variable no es el valor "real" de los sensores en todo momento, podría darse el caso que cuando "realmente" se cumple una condición, el código asociado a la condición no se ejecute, por que el valor de la variable es antiguo.
Desconozco si el pinguino tiene estructura de control tipo switch. En su caso podrías codificar la tabla de verdad con un entero a partir de las lecturas de los sensores.
El compilador de pinguino es el sdcc, que implementa el ansi C y por lo tanto si tiene la sentencia switch (como todo compilador de C que se precie de serlo). En lo de la sentencia switch tienes razón, se puede implementar de manera fácil con los valores que me interesan leyendo el byte del puerto. De todas formas, el fragmento de código que posteé, pertenece a un ejemplo de un curso que estoy dando, y mi prioridad no es la eficiencia del código, si no la facilidad para leerlo y entenderlo.
Gracias de nuevo por tus comentarios.
Otra cosa... lo del else if es un caso particular de mi IDE de pinguino, por que me he llevado el programa a otro ordenador y compila sin problemas... pero o sorpresa, campos de soledad y mustios collados, que en un tercer pinguino, me da error en un do {}while(); que solo he podido solucionar cambiando por un while (){}... en cambio en el mio si que compila sin problemas 😯 😮 😯 😮 😯 😮
Salu2!