Autor Tema: Arreglo de bits.  (Leído 1427 veces)

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

Desconectado gambe

  • PIC10
  • *
  • Mensajes: 9
Arreglo de bits.
« en: 19 de Abril de 2016, 09:28:17 »
Buenas, queria hacerles una consulta, estoy intentando armar un caracter ASCII a partir de valores adquiridos de los pines de un pic 18f4550, la cuestion es que me da error y no estoy seguro por que. Les paso parte de mi codigo:

#define D0      PORTEbits_t.RE0       //bit menos significativo
#define D1      PORTEbits_t.RE1
#define D2      PORTEbits_t.RE2
#define D3      PORTBbits_t.RB4     
#define D4      PORTBbits_t.RB3
#define D5      PORTBbits_t.RB2
#define D6      PORTBbits_t.RB1
#define D7      PORTBbits_t.RB0      //bit mas significativo

char receive_char (void){
   
            bit buffer[8];
           
            ADCON1 = 1010;
           
            TRISE0 = '1';
            TRISE1 = '1';
            TRISE2 = '1';
            TRISB4 = '1';
            TRISB3 = '1';
            TRISB2 = '1';
            TRISB1 = '1';
            TRISB0 = '1';
           
            buffer[0]=D0;
            buffer[1]=D1;
            buffer[2]=D2;
            buffer[3]=D3;
            buffer[4]=D4;
            buffer[5]=D5;
            buffer[6]=D6;
            buffer[7]=D7;

           int buffLen = sizeof(buffer);
           dat = bytesToHexString(buffer, buffLen); 
           return dat;                     
}

el error que me figura es unexpected token PORTEbits

desde ya cualquier info que me tiren me sera muy util.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Arreglo de bits.
« Respuesta #1 en: 19 de Abril de 2016, 09:37:18 »
Por que es:

PORTEbits.RE2

sin el "_t".

Ademas tenes que tener en cuenta que el dato de los puertos va a ser tomado en distintos momentos. Y el dato en el puerto deberia mantenerse constante mientras hasta que se termina leyendo todo.

Código: C
  1. TRISE0 = '1';

Otra cosa... '1' es un caracter, es decir un ASCII y equivale a 0x31 o 49d

Tal ves lo que intentas hacer es ponerle un 1 nomas:

Código: C
  1. TRISE0 = 1;
« Última modificación: 19 de Abril de 2016, 09:40:35 por KILLERJC »

Desconectado gambe

  • PIC10
  • *
  • Mensajes: 9
Re:Arreglo de bits.
« Respuesta #2 en: 19 de Abril de 2016, 09:48:36 »
Buenas muchas gracias por la respuesta, hice las modificaciones y resulta que ahora me dice que el arreglo de bit o puntero de bit Buffer[8] es ilegal. Tenes idea por que? Hace rato que vengo renegando con esto, no se si sirve pero estoy trabajando con el compilador XC8

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Arreglo de bits.
« Respuesta #3 en: 19 de Abril de 2016, 10:30:50 »
Código: C
  1. typedef union {
  2.     uint8_t Valorbyte;
  3.     struct
  4.     {
  5.         unsigned b0:1;
  6.         unsigned b1:1;
  7.         unsigned b2:1;
  8.         unsigned b3:1;
  9.         unsigned b4:1;
  10.         unsigned b5:1;
  11.         unsigned b6:1;
  12.         unsigned b7:1;
  13.     };
  14. } VarEnBits_t;



La forma de usarla es crear una variable ( le voy a dar el nombre "Variable" )

Código: C
  1. VarEnBits_t Variable;

Y de ahi podes acceder a cada uno de los bits individualmente:

Código: C
  1. Variable.b0 = 1;
  2.     Variable.b5 = 1;
  3.     Variable.b7 = 1;

Y tambien podes acceder a el byte formado por todos esos bits con:

Código: C
  1. Variable.Valorbyte = 0x10;

Ojo no es una array, te aviso por que veo que usas:

bytesToHexString(buffer, buffLen);

Y tendrias el Hex formado de lo recibido, solo deberias guardarlo en tu array de texto.

EDIT:

Yo uso stdint.h

que me permite escribir uint8_t , uint16_t , int16_t , es mas claro que short/long/int/etc. uint8_t es un tipo ( por eso el _t ) unsigned entero de 8 bits, sin la u es con signo
« Última modificación: 19 de Abril de 2016, 10:33:13 por KILLERJC »

Desconectado gambe

  • PIC10
  • *
  • Mensajes: 9
Re:Arreglo de bits.
« Respuesta #4 en: 19 de Abril de 2016, 12:21:50 »
Buenas, no te entendi la ultima parte, cuando decis

"Ojo no es una array, te aviso por que veo que usas:

bytesToHexString(buffer, buffLen);

Y tendrias el Hex formado de lo recibido, solo deberias guardarlo en tu array de texto."

es decir, si defino la union ya tengo el dato en ASCII??

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Arreglo de bits.
« Respuesta #5 en: 19 de Abril de 2016, 13:02:22 »
Por el puerto podes recibir 8 bits,

Ahora esos 8 bits pueden representar cualquier cosa, un numero de 0 a 255, un numero de -128 a 127, un caracter ASCII, 2 numeros BCD, etc.

Vos me decis que queres armar un caracter ASCII de lo recibido del puerto. Un caracter ASCII no es mas que un numero hexadecimal/decimal/binario de 8 bits lo mas basico.

Si recibis un caracter , un caracter vas a tener..

Si recibis un numero, entonces ese numero vas a tener que pasarlo a varios caracteres.

Tal ves vos queres pasar el numero hexadecimal a 2 caracteres, por ejemplo si recibiste 0x3A , queres tener como salida '3','A'

Todo depende de que estas recibiendo por el puerto, y no entiendo por que no estas usando todo un puerto o una comunicacion serial.

Desconectado gambe

  • PIC10
  • *
  • Mensajes: 9
Re:Arreglo de bits.
« Respuesta #6 en: 19 de Abril de 2016, 13:28:45 »
El tema es asi, yo tengo datos que salen por un puerto paralelo centronic y tengo que reconocer que caracter es en ASCII para despues generar un txt. por eso buscaba la forma de convertirlo en ascii, pero segun lo que me estas diciendo ya lo tengo en ASCII solo tendria que ordenarlo para mandarlo por serie.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Arreglo de bits.
« Respuesta #7 en: 19 de Abril de 2016, 13:52:28 »
Segun lo que encontre en internet lo que envia por los 8 bits es justamente los caracteres ASCII:

Citar
8 bits de datos correspondientes al código ASCII del carácter enviado a la impresora
http://www.profesormolina.com.ar/tecnologia/control_pc/centronics.htm

Es decir que ya en Variable.Valorbyte tendrias tu caracter ASCII.

Lo que no entiendo es por que complicarse la vida y hacerlo con esos puertos, en ves de usar todo un puerto completo para la entrada de los 8 bits, de esa forma te ahorras todo este tema de acomodar los bits.
Y como dije, vas a tener problemas al no poder tener los 8 valores de los bits al mismo tiempo, a pesar que sean microsegundos, si en algun momento queda en la transicion de un dato a otro, un pedazo de bits corresponderia a un dato, y lo demas al otro.


 

anything