TODOPIC
FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: emmanuelap en 09 de Octubre de 2014, 02:23:50
-
Buenas noches compañeros, estoy intentado convertir unos datos capturados y almacenados en un array, a su equivalente bcd. Pero el resultado es un disparate y no comprendo por que, espero alguno de uds tenga una perspectiva mas esclarecedora. El siguiente código debería arrojar como resultado una suma de 255. Desde ya agradezco este espacio.
Codigo:
#include <16F877A.H>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 20000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
void main()
{
int j=0;
char dato[8]={'1','1','1','1','1','1','1','1'};
int fcode=0;
int pot=0;
printf("\r\f\nDato = %s\n",dato);
for(j=0;j<=7;j++)
{
if(dato[j]=='1')
{
pot=(2^j);
fcode=fcode+pot;
}
printf(" \nbit = %u pot = %u Suma = %u ",j,pot,fcode);
}
j=0;
fcode=0;
pot=0;
}
Resultado :
{FF}
Dato = 11111111
bit = 0 pot = 2 Suma = 2
bit = 1 pot = 3 Suma = 5
bit = 2 pot = 0 Suma = 5
bit = 3 pot = 1 Suma = 6
bit = 4 pot = 6 Suma = 12
bit = 5 pot = 7 Suma = 19
bit = 6 pot = 4 Suma = 23
bit = 7 pot = 5 Suma = 2
-
no seria mas facil:
if(dato[j]=='1') fcode|=1<<j;
else fcode&=~(1<<j);
-
Muchas gracias por el aporte MerLiNz, estoy tratando de interpretar como con las compuertas lógicas logras el resultado. Sin embargo, el cogido y la salida quedaron de la siguiente manera:
Espero alguien logre entender por que envía este tipo de dato tan extraño, cuando comienza con la lógica correcta. Saludos
void main()
{
int j=0;
char dato[8]={'1','1','1','1','1','1','1','1'};
int fcode=0;
printf("\r\f\nDato = %s\n",dato);
for(j=0;j<=7;j++)
{
if(dato[j]=='1') fcode|=1<<j;
else fcode&=~(1<<j);
printf(" \nbit = %u Suma = %u ",j,fcode);
}
printf(" \nTotal = %u ",fcode);
j=0;
fcode=0;
}
Resultado:
{FF}
Dato = 11111111
bit = 0 Suma = 1
bit = 1 Suma = 3
bit = 2 Suma = 7
bit = 3 Suma = ?
bit = 4 Suma = O
bit = 5 Suma = o
bit = 6 Suma = 10K
bit = 7 Suma = 20g
Total = 20
-
prueba a poner unsigned int fcode=0;
-
Gracias por la inmediata respuesta !! Continua haciendo exactamente lo mismo, también probé con long, char, int16, pero no modifica el resultado. Se te ocurre algún plan B para dar sentido a esa tira de bits en bcd?
-
del 1 al 7 esta bien, pero lo demas nose, salen caracteres extraños, prueba a poner fcode=0b1111; y ver si te imprime tambien esos caracteres tan extraños, quizas sea problema del printf
-
El asunto es MerLiNz, que estoy capturando el tren de pulsos de un lector Wiegand, logro esa captura y guardarla en un array, pero al convertirla en BCD me pasaba esto tan extraño, por eso asile el bloque e intente hacer una rutina que decodifique ese array de bits. De tal manera que no me serviría tenerlo como (fcode=0b1111;) ya que no seria el caso practico que deseo resolver. Lo que no entiendo es, si la logica esta correcta, por que envia caracteres especiales.
-
ahi es donde queria llegar, debes ir probando opciones para ver porque te modifica eso, si pones eso, la variable contiene ese valor, y te imprime mal pues es problema del printf. Si estas haciendo debug deberias ver que valor va tomando la variable segun el ciclo y verificar que toma su valor correcto.
-
Sabes a que puede deberse ese error en la función printf? en otros programas funciona correctamente
-
Proba con:
char fcode=0;
char pot=0;
Algunos printf son celosos con los tipos.
Saludos.
-
Muchas gracias por el aporte MerLiNz, estoy tratando de interpretar como con las compuertas lógicas logras el resultado. Sin embargo, el cogido y la salida quedaron de la siguiente manera:
Espero alguien logre entender por que envía este tipo de dato tan extraño, cuando comienza con la lógica correcta. Saludos
void main()
{
int j=0;
char dato[8]={'1','1','1','1','1','1','1','1'};
int fcode=0;
printf("\r\f\nDato = %s\n",dato);
for(j=0;j<=7;j++)
{
if(dato[j]=='1') fcode|=1<<j;
else fcode&=~(1<<j);
printf(" \nbit = %u Suma = %u ",j,fcode);
}
printf(" \nTotal = %u ",fcode);
j=0;
fcode=0;
}
Resultado:
{FF}
Dato = 11111111
bit = 0 Suma = 1
bit = 1 Suma = 3
bit = 2 Suma = 7
bit = 3 Suma = ?
bit = 4 Suma = O
bit = 5 Suma = o
bit = 6 Suma = 10K
bit = 7 Suma = 20g
Total = 20
Parece ser que el código esta funcionando bien, poco se de C, pero lo que veo es que se están sumando las potencias de 2 0K,
1+2=3
3+4=7 hasta aquí no hay problema porque coincide con BCD
7+8=15 que es mayor que 10 de acuerdo?
desde aquí viene la jugada del ingeniero,
a la suma se le resta 10, 15 -10=5 ese es el valor en la unidad
y se sabe que se lleva un acarreo de 1
valor: 1 decena y 5 unidades,
así sucesivamente, los caracteres que aparecen después de 7 parecen ser los caracteres ASCII de la suma por tanto el código cumple con su función. Hice algo parecido para visualizar la cuenta de un frecuencimetro pero en assembler.
-
Excelente aporte inventor1967, de ser asi, debería ir separando unidad, decena, etc etc.?
Por q no logro modificar el código para visualizar correctamente esos valores.
Se debe a los tipos de las variables?
-
Efectivamente, en C no hay una función que cambie de base numérica?