He probado la rutina de "recorre y suma 3" que propuso sander y parece que funciona para 8 bits.
Es decir, metiendo 255 en la entrada, la salida alta sale '00000010' (02 en BCD) y en la salida baja '01010101' (55 en BCD) juntos forman el 255.
Inentare modificarla para 24 bits.
Sin embargo aqui me sale otra duda: Los numeros en BCD de la salida, como se pueden pasar a un LCD?.
La rutina que os envie, directamente saca cada numero en ASCII pra apasarlo directamente al LCD, pero no se muy bien como lo consigue...
Buscando y buscando veo que este es un tema bastante recurrente y no me extrana.
Aunque parece facil pero el tema de las matematicas en los PIC es bastante complicado para mi.
Saludos
swapf digit_32,w ; Intercambio los nibbles MSB <=> LSB, ya que primero se envian los millares...
andlw 0x0F ; Enmascaro los bits de los millares, para eliminar los bits de las centenas...
addlw d'48' ; Al sumarle 48 al WORK, el número se ha convertido a un caracter ASCII!
movwf LCD_Value ; LCD_Value es el registro de SALIDA de la rutina Send_LCD
call Send_LCD ; Envio los millares a la pantalla LCD....
movf digit_32,w ; Ahora se enviaran las centenas, no es necesario intercambiar los nibbles
andlw 0x0F ; Enmascaro los bits de las CENTENAS, para eliminar los bits de los MILLARES.
addlw d'48' ; Al sumarle 48 al WORK, el número se ha convertido a un caracter ASCII!
movwf LCD_Value ; LCD_Value es el registro de SALIDA de la rutina Send_LCD
call Send_LCD ; Envio los millares a la pantalla LCD....
swapf digit_10,w ; Intercambio los nibbles MSB <=> LSB, ya que primero se envian las decenas
andlw 0x0F ; Enmascaro los bits de las decenas, para eliminar los bits de las unidades...
addlw d'48' ; Al sumarle 48 al WORK, el número se ha convertido a un caracter ASCII!
movwf LCD_Value ; LCD_Value es el registro de SALIDA de la rutina Send_LCD
call Send_LCD ; Envio los millares a la pantalla LCD....
movf digit_10,w ; Ahora se enviaran las unidades, no es necesario intercambiar los nibbles
andlw 0x0F ; Enmascaro los bits de las unidades, para eliminar los bits de las decenas
addlw d'48' ; Al sumarle 48 al WORK, el número se ha convertido a un caracter ASCII!
movwf LCD_Value ; LCD_Value es el registro de SALIDA de la rutina Send_LCD
call Send_LCD ; Envio los millares a la pantalla LCD....
probe tambien el metodo de picuino y no funciono.
Saludos
/*
Programa para convertir Binario a BCD
*/
#include <stdio.h>
#define BIN_DIGITS 32
#define BCD_DIGITS 10
void main(void) {
unsigned long bin = 987654321;
char bcd[BCD_DIGITS];
char carry;
int bin_dig, bcd_dig;
// Borra dígitos BCD
for(bcd_dig = 0; bcd_dig < BCD_DIGITS; bcd_dig++)
bcd[bcd_dig] = 0;
// Convierte BIN to BCD
for(bin_dig = 0; bin_dig < BIN_DIGITS; bin_dig++) {
// Extraer último bit binario de la derecha
if ((bin & (1<<(BIN_DIGITS-1))) > 0)
carry = 1;
else
carry = 0;
bin = bin << 1;
// Añadir bit binario por la derecha en número BCD
for(bcd_dig = 0; bcd_dig < BCD_DIGITS; bcd_dig++) {
bcd[bcd_dig] = (bcd[bcd_dig] << 1) + carry;
carry = 0;
if (bcd[bcd_dig] >= 10) {
bcd[bcd_dig] -= 10;
carry = 1;
}
}
}
// Convierte BCD a ASCII e imprime
for(bcd_dig = BCD_DIGITS - 1; bcd_dig >= 0; bcd_dig--) {
bcd[bcd_dig] += '0';
printf("%c", bcd[i]);
}
printf("\n");
}
Para Picuino: Gracias por el codigo que me envias, pero, me da verguenza decirlo, pero no tengo ni idea de c. Sin embargo, la pagina web que me envias esta en ensambaldor asi que creo que me sera de ayuda.
He visitado la pagina que recomienda Picuino y he probado una rutina de 24bit to bcd 8 digits (by Oliver Broad).
El caso es que al implementarla, metiendo las tres entradas a 255(decimal), en la salidas sale lo siguiente:
R0 => 0000 0010
R1 => 1000 1111
R2 => 0101 1100
R3 => 0001 0101
Segun la explicacion, en BCD no hay por encima de 10. Sin embargo, en R1 sale 1111 (15 en decimal), o en R2 sale 1100 (12 en decimal).
No es la primera vez que me pasa esto al probar rutinas ya hechas y, a pesar de la explicacion, no entiendo el significado.
Hay que pensar directamente que la rutina esta mal?. Hay algo que se me escapa?.
Para Picuino: Gracias por el codigo que me envias, pero, me da verguenza decirlo, pero no tengo ni idea de c. Sin embargo, la pagina web que me envias esta en ensambaldor asi que creo que me sera de ayuda.
Lo más seguro es que el código este mal, así se simple...
No sabría en que parte, pero los resultados que te arroja son erróneos.
Ahora, respecto al lenguaje de programación, si te puedo asegurar que C es mucho más fácil de aprender, pero si quieres saber realmente como está funcionando el microcontrolador y que hace, realmente te recomiendo ensamblador.