Autor Tema: ¿Dudas sobre cómo usar asm para PIC18 en C18?  (Leído 3127 veces)

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

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
¿Dudas sobre cómo usar asm para PIC18 en C18?
« en: 08 de Diciembre de 2006, 14:27:31 »
Hola, os comento mi problema por si alguien puede echarme una mano o aconsejarme, gracias a todos de antemano...

Estoy trabajando en C18 con un PIC18f4550 que se comunica con dos dispositivos diferentes: una memoria externa y otro PIC. De la memoria obtengo datos en forma de BYTES y al PIC secundario tengo que enviarle los datos de la memoria(despues de modifcarlos, etc) en serie pero en forma de BITS(16 en concreto).

Bueno mi primer problema es el enviarle los bits al PIC, pues en C18 no hay variables booleanas; he optado por utilizar una estructura para crear un nuevo tipo de dato, algo así como:

Código: [Seleccionar]
typedef struct{
int8 bit0;
int8 bit1;
//....
int8 bit15
}dato;

con lo que puedo declarar variables de "tipo dato" que contienen el valor de 16 bits.... Hasta aquí bien pero, el verdadero problema que tengo es que no se como pasar desde los bits(reales) de cada byte que cojo de la memoria hasta los bits del tipo de estructura que he definido. Es decir, lo que quiero es cojer un byte de la memoria y meter el primer bit en dato1.bit0, el segundo en dato1.bit1, etc. para despues mandarselos al otro PIC.

Creo que podría hacerlo "jugando" con bucles, rotaciones de bits y el acumulador, pero me parece bastante lioso. Tambien he pensado que podría usar ensamblador en linea dentro de mi código, pues en asm(si no recuerdo mal) si que puedes manejar los bits de una variable. Sería algo asi:

Código: [Seleccionar]
dato_memoria = 0xAA; //imaginemos que este es el dato que me viene de la memoria externa....
asm{
dato1.bit0 = dato_memoria.0;
dato1.bit1 = dato_memoria.1;
//....
}

Lo que ocurre es que nunca he utilizado ensamblador para PIC18(sólo para PIC16) y tampoco he utilizado ensamblador dentro de código en C por lo que ni siquiera se si se pueden mezclar variables declaradas fuera del trozo en ensamblador, dentro de este(que es lo que he heco aqui).

Si alguien pudiese aconsejarme, se lo agradezco de antemano. Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: ¿Dudas sobre cómo usar asm para PIC18 en C18?
« Respuesta #1 en: 08 de Diciembre de 2006, 19:23:12 »
Hola, si  lo que tratas es de acceder a los bits de una variable por ejemplo de tamaño un byte, puedes hacerlo facilmente con una union. Por ejemplo
Código: [Seleccionar]
typedef union {
   struct {
      unsigned bit0:1;
      unsigned bit1:1;
      unsigned bit2:1;
      unsigned bit3:1;
      unsigned bit4:1; 
      unsigned bit5:1;
      unsigned bit6:1;
      unsigned bit7:1;
  }
}DatoBinario;

De esta forma puedes declarar una variable de tipo DatoBinario y acceder a cada uno de sus bits o bien al byte completo, de la siguiente forma:

DatoBinario dato;

dato = 0x21;  //asignarle un valor

if(dato.bit0)  //testear un bit

dato.bit5 = 0; //asignarle un valor a un determinado bit

Un saludo y espero que te sirva de ayuda.
« Última modificación: 08 de Diciembre de 2006, 19:29:22 por omix »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Dudas sobre cómo usar asm para PIC18 en C18?
« Respuesta #2 en: 08 de Diciembre de 2006, 21:49:10 »
Hola omix, la unión no me sirve... pues en una unión todas las variables comparten una misma posición de memoria y yo tengo la necesidad de guardar el valor de todos los bits al tiempo(no utilizarlos en momentos distintos... que es para lo que creo que sireve una unión..¿?).

Por otro lado lo de limitar el tamaño de las variables bitx a un bit es una buena idea; no lo había pensado, yo estaba utilizando unsigned char...

He probado lo siguiente

Código: [Seleccionar]
typedef struct {
      unsigned bit0:1;
      unsigned bit1:1;
      unsigned bit2:1;
      unsigned bit3:1;
      unsigned bit4:1; 
      unsigned bit5:1;
      unsigned bit6:1;
      unsigned bit7:1;
 
}DatoBinario;

DatoBinario = 0x20;


pero el compilador no me deja ¿estás seguro de que se puede asignar un valor a toda la estructura y esta la reparte entre sus miembros?

Muchas gracias por tu consejo, saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Dudas sobre cómo usar asm para PIC18 en C18?
« Respuesta #3 en: 08 de Diciembre de 2006, 22:30:15 »
Bueno parece que el modo de como hacer lo hablado estaba aqui:

http://www.todopic.com.ar/foros/index.php?topic=5379.0

... debí buscar antes de responder a lo de la union... creo que tenías razón omix, pero se te olvidó escribir un par de sentencias. Debería ser lo siguiente:

Código: [Seleccionar]

typedef union{
     
      unsigned char byte;

      unsigned bit0:1;
      unsigned bit1:1;
      unsigned bit2:1;
      unsigned bit3:1;
      unsigned bit4:1; 
      unsigned bit5:1;
      unsigned bit6:1;
      unsigned bit7:1;
 
      }bits;

}DatoBinario;

DatoBinario dato;

dato.byte = 0x20;
//o.....
dato.bits.bit0 = 1;//etc...


El caso es declarar la unión de un tipo int8 con un tipo estructura de 8 bits de forma que ambos compartan la misma memoria...

Lo dicho, gracias omix! me has dado la idea... y esto me va simplificar bastante el trabajo... Saludos a todos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: ¿Dudas sobre cómo usar asm para PIC18 en C18?
« Respuesta #4 en: 09 de Diciembre de 2006, 08:56:55 »
Bueno parece que el modo de como hacer lo hablado estaba aqui:

http://www.todopic.com.ar/foros/index.php?topic=5379.0

... debí buscar antes de responder a lo de la union... creo que tenías razón omix, pero se te olvidó escribir un par de sentencias. Debería ser lo siguiente:

Código: [Seleccionar]

typedef union{
     
      unsigned char byte;

      unsigned bit0:1;
      unsigned bit1:1;
      unsigned bit2:1;
      unsigned bit3:1;
      unsigned bit4:1; 
      unsigned bit5:1;
      unsigned bit6:1;
      unsigned bit7:1;
 
      }bits;

}DatoBinario;

DatoBinario dato;

dato.byte = 0x20;
//o.....
dato.bits.bit0 = 1;//etc...


El caso es declarar la unión de un tipo int8 con un tipo estructura de 8 bits de forma que ambos compartan la misma memoria...

Lo dicho, gracias omix! me has dado la idea... y esto me va simplificar bastante el trabajo... Saludos a todos!

Hola, como bien comentas es como dices, ayer con las prisas no lo puse bien del todo, solo una pequeña aclaración, el C18 si no recuerdo mal permite hacer uso de estructuras anonimas, con lo cual en teoria deberias de poder hacer lo siguiente:

Código: [Seleccionar]
typedef union {
   unisigned char byte;
   struct {
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
   };
}DatoBinario;

De esta forma deberias de poder acceder asi:

DatoBinario dato;

dato.byte = 0x20;

dato.bit0 = 1; //asi te ahorras de tener que poner como hacias dato.bits.bit0, lo cual a veces puede resultar mas comodo


Saludos.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: ¿Dudas sobre cómo usar asm para PIC18 en C18?
« Respuesta #5 en: 09 de Diciembre de 2006, 09:42:10 »
De nuevo... estas en lo cierto! omix, con gente  como tú da gusto  :-/ . Gracias de nuevo, saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -