Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: gambe en 19 de Abril de 2016, 09:28:17
Título: Arreglo de bits.
Publicado por: gambe 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:
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.
Título: Re:Arreglo de bits.
Publicado por: KILLERJC 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
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
TRISE0 =1;
Título: Re:Arreglo de bits.
Publicado por: gambe 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
Título: Re:Arreglo de bits.
Publicado por: KILLERJC en 19 de Abril de 2016, 10:30:50
Código: C
typedefunion{
uint8_t Valorbyte;
struct
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
};
} VarEnBits_t;
La forma de usarla es crear una variable ( le voy a dar el nombre "Variable" )
Código: C
VarEnBits_t Variable;
Y de ahi podes acceder a cada uno de los bits individualmente:
Código: C
Variable.b0=1;
Variable.b5=1;
Variable.b7=1;
Y tambien podes acceder a el byte formado por todos esos bits con:
Código: C
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
Título: Re:Arreglo de bits.
Publicado por: gambe 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??
Título: Re:Arreglo de bits.
Publicado por: KILLERJC 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.
Título: Re:Arreglo de bits.
Publicado por: gambe 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.
Título: Re:Arreglo de bits.
Publicado por: KILLERJC 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
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.