• Domingo 22 de Diciembre de 2024, 21:24

Autor Tema:  Problemilla Con Código  (Leído 3913 veces)

infrarrojo

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Problemilla Con Código
« en: Sábado 12 de Mayo de 2007, 11:48 »
0
Hola a tod@s. Estoy haciendo un código en c++ para un microcontrolador HC08, el QT4 exactamente. En concreto es para un mando universal, y quiero que, según sea el valor en una entrada analógica, que en el programa es "tecla", la variable "comando" adopte uno u otro valor. Ahora mismo lo estoy haciendo sólo para dos botones, pero la variable comando siempre está en el mismo valor, es decir, no adquiere el valor de las otras según la condición. El código es éste:
extern byte err;  // Incluye la variable "err" utilizada en Events.c
int i=0;
int j=0;
int k=0;

bool comando[13] ;  
bool comandoOn[13] = {1,0,1,0,1,0,0,1,0,0,0,0,0};
bool comandoVolmas[13] = {0,1,0,0,1,0,0,1,0,0,0,0,0};




static byte tecla[1];   /* Número de canales */

void main(void)

{
   
 (void)PPG1_Disable();  /* disable the bean */
        
 for(;;){   

   for(;;){
         err = AD1_Measure (TRUE);        /* Lee el valor */
         err = AD1_GetValue((byte *)tecla);
         
         if (tecla[0] > 25 && tecla[0] <63)   comando[13] == comandoOn[13];     /* Selecciona on */
        
        if (tecla[0] > 63)                 comando[13] == comandoVolmas[13];  
         
         if (tecla[0] > 25) break;        /* Compara el valor y si es mayor de 25 empieza a emitir el código
    }  

Ahora vendría el código para emitir la trama, eso lo hace bien, pero emite siempre 12 ceros, en lugar de uno de los dos códigos (la tecla On o la de subir volumen).
¿Hay algún error en el código? ¿Se podría hacer de otra forma? Gracias de antemano por vuestros comentarios. Saludos.

fa61an

  • Miembro MUY activo
  • ***
  • Mensajes: 100
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #1 en: Sábado 12 de Mayo de 2007, 18:35 »
0
Sinceramente creo que hace falta mas explicación de tu parte sobre lo que estas haciendo si quieres ayuda, yo llevo poco tiempo programando en lenguaje C pero por lo que veo esta linea esta como rara

 if (tecla[0] > 25 && tecla[0] <63) comando[13] == comandoOn[13];

si la condición llega a ser verdadera vuelve y haces otra pregunta, me explico esta linea es una pregunta y no una asignación.

comando[13] == comandoOn[13];

corrígeme si me equivoco.

fa61an

  • Miembro MUY activo
  • ***
  • Mensajes: 100
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #2 en: Sábado 12 de Mayo de 2007, 18:57 »
0
y otra cosa de que me doy cuenta siempre esta direccionando comandoOn[13] y en esta posicion tu array siempre vale 0 a menos asi se ve en la inicializacion, a no ser de que se lo estes cambiando en el archivo events.c

infrarrojo

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #3 en: Sábado 12 de Mayo de 2007, 19:20 »
0
Hola Fa61an, te explico un poco más lo que estoy haciendo. La programación es para un mando universal. He cogido un osciloscopio y he visto la señal de un mando Sony, y son doce bits, los cuales los puedes ver en la secuencia de comandoOn por ejemplo, que sería {1,0,1,0,1,0,0,1,0,0,0,0,0} es decir, al pulsar la tecla on del mando original sony sale esa trama. Ahora yo quiero que mi variable comando, si el valor de un potenciómetro (que es tecla) es mayor de 25 y menor de 63, tome el valor de esa trama, es decir, al poner comando[13] == comandoOn[13] lo que quiero es que la variable comando pase a valer lo que vale comandoOn, no sé si se entiende, creo que no se hace así exactamente pero es que estoy empezando a programar en C y ahora mismo tengo dudas, así que es probable que esté mal. Si por el contrario el potenciómetro vale más de 63, la trama que quiero que envíe es comandoVolmas, esto es porque más adelante pondré una serie de botones y según el botón que pulses, la entrada analógica tomará un valor u otro, por ejemplo entre 25 y 63 será la tecla On, por eso pongo  if (tecla[0] > 25 && tecla[0] <63) comando[13] == comandoOn[13];

Ahora mismo lo estoy simulando con un potenciómetro para que me sea más fácil probar si está saliendo bien. Lo aumento un poco y voy viendo en el osciloscopio si verdaderamente cambia la trama, que ahora mismo no lo hace, siempre salen doce ceros en lugar de 1,0,1,0,1,0,0,1,0,0,0,0,0 por ejemplo que es la tecla On. Bueno espero que se haya aclarado un poco, si tienes más dudas me lo preguntas, yo creo que la clave está en ese doble igual, lo que quiero es que comando tome el valor de comandoOn, y será otro operador el que tengo que poner. Gracias por tu respuesta.

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #4 en: Domingo 13 de Mayo de 2007, 17:54 »
0
Citar
tome el valor de esa trama, es decir, al poner comando[13] == comandoOn[13] lo que quiero es que la variable comando pase a valer lo que vale comandoOn, no sé si se entiende

Te entiendo perfectamente, pero estas en un error.

a == b no es la manera en que C o C++ copia valores de una variable a otra la forma correcta es.

a=b;

Por tanto

Citar
if (tecla[0] > 25 && tecla[0] <63) comando[13] == comandoOn[13];

Esto es mal formulado


Se hace asi:
 
if (tecla[0] > 25 && tecla[0] <63)
   {
     comando[13] = comandoOn[13];

   }

las llaves son optativas si quieres agregar mas lineas de codigo dentro del if(...)


Otra cosa, por que eliges  el elemento [13] del arreglo lo que tambien te dara errores de ejecucion ya que un arreglo tipo bool  xxx[13] tiene un rango de elementos que va de xxx[0]- xxx[12] como ves el primer elemento del array es
  • y no [1] como parece que crees ,ademas que en el fondo cada elemento que asignas como Bool en la practica para el compilador es un  byte y lo trata como tal, asi que estas gastando mas memoria ram del micro y haciendo el codigo mas pesado de lo que crees.Te aconsejo repasar mejor los fundamentos del lenguaje C para no seguir dando tropiezos en cosas basicas que solo provoca atraso en tu proyecto.

infrarrojo

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #5 en: Domingo 13 de Mayo de 2007, 23:07 »
0
Hola lalo_Soft, gracias por tu respuesta, te comento algunas cosas.

"Se hace asi:

if (tecla[0] > 25 && tecla[0] <63)
{
comando[13] = comandoOn[13];

}"

Así es como tenía el código al principio, pero me da un error al compilarlo. Te lo detallo a continuación:
Link Error : L1102: Out of allocation space in segment RAM at address 0XD6
Buscando el error, cambié ese igual por un doble igual y ya no salía ese error, así que por eso lo dejé así, pero veo que está mal hecho.

"Otra cosa, por que eliges el elemento [13] del arreglo lo que tambien te dara errores de ejecucion ya que un arreglo tipo bool xxx[13] tiene un rango de elementos que va de  xxx[0]- xxx[12]"

Esto sí lo he tenido en cuenta, el código consta de doce bits, por eso pongo 13 elementos, porque debe acabar con un cero añadido, así que eso sí está bien creo.

"ademas que en el fondo cada elemento que asignas como Bool en la practica para el compilador es un byte y lo trata como tal, asi que estas gastando mas memoria ram del micro y haciendo el codigo mas pesado de lo que crees."

Aquí me has creado una duda, por lo que dices podría enumerar los bits de la trama como si fueran tipo entero y así ocuparía menos, y es posible que el error que me da ya no salga no? Es cierto que debería repasar algunos aspectos de C, porque yo aprendí a programar en otro lenguaje (fortran 90) y creía que programar en C me resultaría fácil y estoy comprobando que no lo es. Gracias de nuevo por tu respuesta, seguiré trabajando a ver si logro sacar ésto.

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #6 en: Lunes 14 de Mayo de 2007, 01:41 »
0
Citar
Link Error : L1102: Out of allocation space in segment RAM at address 0XD6

esta claro que el compilador te esta avisando que estas fuera del arreglo

por lo que deverias corregi a:

if (tecla[0] > 25 && tecla[0] <63)
{
comando[12] = comandoOn[12];

}"


Citar
Esto sí lo he tenido en cuenta, el código consta de doce bits, por eso pongo 13 elementos, porque debe acabar con un cero añadido, así que eso sí está bien creo.

te repito el elemento 13 de arreglo no existe (el trece que tu colocas es el tamaño total que le asignas al arreglo que se cuenta de xxx[0]--xxx[12] ahi esta los 13 elementos que le asignaste pero te repito el xxx[13] no existe) si quieres accesar el elenmento 13 tu arreglo devera ser definido como un array de 14 eJ: bool xxx[14]


Citar
Aquí me has creado una duda, por lo que dices podría enumerar los bits de la trama como si fueran tipo entero y así ocuparía menos, y es posible que el error que me da ya no salga no? Es cierto que debería repasar algunos aspectos de C, porque yo aprendí a programar en otro lenguaje (fortran 90) y creía que programar en C me resultaría fácil y estoy comprobando que no lo es. Gracias de nuevo por tu respuesta, seguiré trabajando a ver si logro sacar ésto

En primer lugar, el hacer comparaciones entre lenguajes aprendidos simpre traera erroes ya que cada lenguaje hace las cosas en forma diferente.
Estando claro en eso te sugiero que si lo que pretendes es trabajar con  bits  estos deben ir empaquetados por la cantidad de bits que pretendes manejar con dos bytes
tendras de sobra.

infrarrojo

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #7 en: Lunes 14 de Mayo de 2007, 10:41 »
0
"te repito el elemento 13 de arreglo no existe (el trece que tu colocas es el tamaño total que le asignas al arreglo que se cuenta de xxx[0]--xxx[12] ahi esta los 13 elementos que le asignaste pero te repito el xxx[13] no existe) si quieres accesar el elenmento 13 tu arreglo devera ser definido como un array de 14 eJ: bool xxx[14]"

Vamos a ver, no sé si yo estoy equivocado o es que estás suponiendo que el código son 13 elementos. La cadena de bits que emite el mando original son 12 elementos, así que si miras por ejemplo la trama de la tecla On es ésta:
1,0,1,0,1,0,0,1,0,0,0,0  como ves son doce, ahora, para definir comandoOn, le añado un cero porque así lo indica un manual que tengo de C++ y queda así:

bool comandoOn[13] = {1,0,1,0,1,0,0,1,0,0,0,0,0};  el último cero lo he añadido yo porque sé que el elemento 13 del arreglo no lo va a direccionar, así que ahora mismo sólo tiene en cuenta los 12 primeros que son los que forman parte de la trama. Si estoy en un error comunícamelo pero creo que está correcto, ya que la primera vez puse bool comandoOn[12]={1,0,1,0,1,0,0,1,0,0,0,0} y el último cero se lo comía, por eso le añado un cero más y queda comandoOn[13]. Saludos y gracias de nuevo por tu respuesta y tu tiempo.

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #8 en: Lunes 14 de Mayo de 2007, 21:21 »
0
Citar
o es que estás suponiendo que el código son 13 elementos.


Yo no supongo nada solo me vaso en mis conocimientos de C y en los datos que tu mismo me das.

Esto seria asi

defino el arreglo al comienzo

bool comandoOn[13];

esto dara un arreglo en memoria de:

comandoOn[0] //primer miembro del arreglo
comandoOn[1]
comandoOn[2]
comandoOn[3]
comandoOn[4]
comandoOn[5]    
comandoOn[6]
comandoOn[7]
comandoOn[8]
comandoOn[9]
comandoOn[10]
comandoOn[11]
comandoOn[12] //ultimo miembro

esto es un arreglo con 13 miembros y dentro de ese rango deveras moverte para accesar a los valores ahi guardados, no puede estar mas claro &lt;_&lt;

dicho de otra manera si tuvieras que recorrer el arreglo esto seria asi



char index;
char dato;
bool comandoOn[13];

for(index = 0;index < 13;index++)
     {
       dato = comandoOn[index];          
     }

otra forma

for(index = 0;index < sizeof(comandoOn);index++)
     {
       dato = comandoOn[index];          
     }

infrarrojo

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #9 en: Lunes 14 de Mayo de 2007, 22:39 »
0
Entonces, tal y como lo tenía, si pongo comando[12] = comandoOn[12]; que me está copiando en la variable comando un sólo bit de toda la trama? Si eso es cierto, entonces que debo hacer, accesar todos los valores de la trama y luego pasarlos a la variable comando? ¿No hay una forma más simple de pasar todos los bits? Gracias de nuevo por tu respuesta me he dado cuenta de que tenía un grave error de concepto.

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Problemilla Con Código
« Respuesta #10 en: Martes 15 de Mayo de 2007, 00:17 »
0
Cita de: "infrarrojo"
Entonces, tal y como lo tenía, si pongo comando[12] = comandoOn[12]; que me está copiando en la variable comando un sólo bit de toda la trama? Si eso es cierto, entonces que debo hacer, accesar todos los valores de la trama y luego pasarlos a la variable comando? ¿No hay una forma más simple de pasar todos los bits? Gracias de nuevo por tu respuesta me he dado cuenta de que tenía un grave error de concepto.

trendria que ser asi

char index;
char dato;
bool comandoOn[13];
bool comando[13];



for(index = 0;index < 13;index++)
{
comando[index] = comandoOn[index];
}

otra forma

for(index = 0;index < sizeof(comandoOn);index++)
{
comando[index] = comandoOn[index];
}



Ahora como te dije anteriormente podrias empaquetar los 12bits en solo 2 bytes, para lo cual tendras que usar las funciones para manipular bits que trae C ,esto te valdra cambiar el enfoques de como lees y guardas la informacion.