# convertir de 8 bits binario a 3 Cifras BCD



## neutron0607 (Nov 11, 2006)

Hola voy  estoy haciendo mi termometro digital pero ahora el problema es que tengo una salida  de 8 bits y quisiera generar ese rango (000-255)  con bcd para alimentar  3 displays de 7 segmentos, apenas me di cuenta de este problema y sinceramente estoy con la mente en blanco les agradeceria mucho un poco  de ayuda, ideas, referencias o si no les ofende alguna rutina  estoy trabajando con el pic16f876  
gracias


----------



## capitanp (Nov 11, 2006)

no se pero este tipo se paso y no uso un PIC:

https://www.forosdeelectronica.com/f25/convertir-valores-binarios-bcd-3757/


----------



## neutron0607 (Nov 14, 2006)

gracias lo voy a checar pero si es necesario que lo haga en pic, mira ya lo intente con circuitos integrados pero para lo que pienso hacer me sale un tabique  y caro comparado con el pic por eso deseo aprender algun metodo para expresar en BCD los resultados del puerto C


----------



## ELCHAVO (Nov 15, 2006)

alguien de uds me podria ayudar con esta pregunta ??? Se sabe que la compuerta AND se puede usar como mascara entre dos bytes y asi escoger el bit que uno quiera leer y saber si es un uno o un cero, pero ahora lo que quiero saber es el proceso contrario , no lectura sino escritura de bits en el byte sin afectar los bits que no deseo cambiar con que tipo de compuerta logica lo hago o que proceso binario hago ??.

En cuanto al termometro no entiendo cual es el problema, pero especificamente dimelo y yo te ayudo ya que en eso tengo experiencia


----------



## neutron0607 (Nov 17, 2006)

El  termometro ya no me da lata,  ya se usar el adc para capturar y digitalizar una señal analogica, luego que ya tengo esa señal me produce un numero de 10 Bits y yo quiero luego desplegar  el numero que obtengo de 10 bits, para eso debo presentarlo en formato BCD y eso es lo que  deseo saber. ¿como convertir a formato BCD?


----------



## neutron0607 (Nov 23, 2006)

ups,  creo que nadie se lo habia planteado antes pero no me explico, ¡si es necesaria una rutina para convertir de binario a bcd  y  desplegar en displays de 7 segmentos! ¿o que ?¿nadie usa displays de  7 segmentos para representar numeros del 0 al 999?


----------



## alejandro_oo (Nov 23, 2006)

Hola neutron0607, mira nunca me ha tocado hacer un termómetro, pero a lo mejor un día me toca, así que busque y me encontré esto:

http://www.geocities.com/micros_uan/Inclass/E7/term.htm

A pesar de que no usa displays de 7 segmentos pense que a lo mejor te ayuda en algo revisar el codigo ese. Bueno personalmente creo que actualmente es mas versátil usar un modulo de LCD en vez de los displays de 7 segmentos (aunque un poco mas caro).

Espero que de algo te sirva.

Saludos,


----------



## chitarous (Mar 29, 2007)

Soy nuevo en el foro, saludos.

Bueno neutron tengo un algoritmo de conversion decimal a BCD si todavia lo necesitas me avisas para colgar el archivo en el foro. Estoy haciendo un trabajo parecido, tambien estoy usando el conversor ad y me guarda los 10 bits en dos registros de 8 bits c/u, mi problema es, espero que alguno de ustedes me pueda ayudar, que no puedo convertir los 10 bits, solo agarra los 8 bits menos significativos almacenados en adresL, si alguien tiene algun algoritmo para la conversion de 10 bits almacenados en dos registros me avisa.


----------



## Ogeid Nauj (Dic 12, 2007)

Mira brother esto es sencillo
http://www.utm.edu/staff/leeb/DM74185.pdf
 en la pagina 7 de este datasheet se encuentra la respuesta ok
es la figura 5
si quieren ayuda me avisan

O mejor aun te paso el archivo


----------



## adr (Dic 13, 2007)

bueno no se si todavia te sea de utilidad mi respuesta pero ahy te va...

bueno para desplegar 8 bits nesesitas tres bcd's uno para los centenas, decenas y unidades.

para hacer esto divides entre cien primero y guardas el entero en cuatro bits(nible alto y nible bajo) o en una variable de 8 bits, luego multiplicas el numero que te dio por cien y se lo restas a tu numero original, luego el numero obtenido lo divides entre diez y guardas el entero en otra parte  (estos seran tus decimales) luego multiplicas por diez tu ultimo resultado, y se lo restas (al numero que divisdidte entre diez) y este es tu unidad.
un ejemplo de esto aplicado al pic lo encuentras en :
http://micropic.wordpress.com/2007/06/21/conversion-binaria-a-bcd-convertir-un-numero-de-8-bits/
la verdad no le entiendo mucho a ese codigo pero te da una buena idea mas grafica de como hacerle sobretodo para la division.

hasta este punto todo va bien y ahora tienes dos opciones (que de hecho son mas ) puedes usar un circuito integrado como el 7447 o 7448 y tres sietesegmentos, te explico los siete segmentos los vas a activar uno a la ves pero como los activas tan rapido parece que los tres estan activados al mismo tiempo. como hacer esto?
bueno si tus displays son de catodo comun conectas la salida del display de los centenares al bit mas significativo de tu puerto, luego el dysplay de tus decenas al segundo y luego al tercero el de las unidades y luego en el nible alto de tu puerto envias un '0111' y en el nible bajo el bcd de tus centenas durante un tiempo (milecimas o centecimas de segundo depende de como se vea bien) luego en otro instante en el nible alto un '1011' y en el bajo tus centenas y '1101' y el bcd para las enidades.
al bit mas significativo le colocas el anodo comun del display de las centenas y al segundo el de las decenas y al tercero las unidades y al nible bajo el 4748, y las demas patas del los diplays van conectadas a su correspondiente en el 4748 (un 4748 a los tres displays)

lo que hay que tener en cuenta es la potencia y quiza te convenga un display de catodo comun para poder disipar mas potencia o incluso tengas que ponerle un transistor para manejar la carga eso depende de tu micro.
aqui esta mas grafico el uso de los driver(de echo solo vi las imagenes)
http://www.monografias.com/trabajos17/microcontroladores/microcontroladores.shtml?monosearch#otros


la otra es que una ves que tienes tus bcd's transformarlos en sietesegmentos en tu micro para ello pic-man puso en otra parte del foro el siguiente enlase http://micropic.wordpress.com/2007/02/26/displays-de-7-segmentos/

en donde ya estan las conversiones de binario a siete segmentos.

sola mente quedaria el hecho de manejar 3 displays talves necesites otro bit ya que dos displays los puedes manejar haciendo trampa y poner un display de anodo comun y mandar invertidos los codigos 7seg. y otro de catodo comun y mandar el codigo como viene en el enlace anterior.

me explico:
para poner un uno en el display de los centenares (anodo comun)
envias al bit mas alto un 1
y en los 7 inferiores el codigo 7seg invertidos osea para el 1 envias
'11111001'
y para los decimales  con un display de catodo comun  
un cero al bit mas significativo y envias el bcd convertido a 7segmnts. en los 7 inferiores ...
'00000110'
lo pongo asi para que valla con el ejemplo del enlace que puse arriba pero recerda que tu puedes inventar tu codigo de 7 segmentos solo debes de prender los leds que correspondan a cada numero.

fijate que deberas conectar los displays 1 y 2 a las mismas salidas y alternar en periodos de tiempo cortos el envio de decimales y centenas para que paresca que estan prendidos los dos al mismo tiempo, ya que los lets son diodos y el display de los centenares estara inverso y no prendera cuando envies el de los decimales y biseversa.
en este caso tambien debes de cuidar tu carga ya que los miliampers de los 7 leds pasan por una de las patillas del pic y a lo mejor necesites poner dos transistores en foma de driver a menos que tu pic acepte 70 miliamperes de salida en una pata(uno para el positivo y otro para tu negativo en tu bit mas significativo).
espero que hallas llegado hasta aqui y que te sea util cuentanos como te fue con tu proyecto.


----------



## Nilfred (Dic 13, 2007)

Hacer una copia del registro A en B
División entera por 10 (que se pierdan los decimales)
Clear Carry
Multiplicar por 6 (multiplicar por 2, hacer una copia, multiplicar por 2 y sumar con la copia)
Sumar A con B

NOTA: multiplicar or 2 es lo mismo que Shift Left
Si no la tienen a la división binaria o la suma, pregunten que les explico.


----------



## pic-man (Dic 17, 2007)

La explicacion de adr es muy buena (y veo que usa dos enlaces a mi blog  8) ), solo para complementar les comento que existe un algoritmo muy sencillo para convertir binario a BCD llamado "Recorre y Suma 3", yo lo conoci el mismo dia que hice el ejemplo de conversion usando divisiones y la verdad es que ese algoritmo simplifica mucho la conversion, sobre todo para numeros de mas de un byte, ademas el codigo final es mucho mas pequeño que usando el algoritmo de divisiones. Aqui les dejo el enlace:
http://micropic.wordpress.com/2007/06/21/binario-a-bcd-recorre-y-suma3/

La explicacion completa del algoritmo la pueden encontrar en este enlace:
http://www.engr.udayton.edu/faculty/jloomis/ece314/notes/devices/binary_to_BCD/bin_to_BCD.html
Ahi aparece un ejemplo del algoritmo en VHDL pero esta muy bien explicado, recomiendo su lectura para comprender el funcionamiento del mismo.


----------



## murphy9 (Ene 6, 2009)

Hola, tengo un problemita con la conversion ad, resulta que programe un voltimetro de 0 a 30 volts en un pic 16c73. Lo simulo en el proteus y el programa anda de 10. El problema es que quiero comprar ese pic y no lo consigo, alguien conoce algun pic con conversor ad de 8 bits y memoria eeprom?. O de ultima me pueden decir si existe una forma de transformar un conversor de 10 bits en uno de 8, es decir que 255 en binario signifique exactamente 30 volts sin la necesidad de modificar el programa, para asi poder utilizar microcontroladores como el pic 16f873. Muchas gracias


----------



## Chico3001 (Ene 6, 2009)

solo descarta los 2 bits menos significativos haciendo un corrimiento a la derecha...


----------



## murphy9 (Ene 6, 2009)

Gracias por tu respuesta, disculpa que te haga esta pregunta, quiero ver si entendi bien. Tu me dices que justifique a la derecha, es decir que utilice sólo el registro adresh, ahora bien, ¿no estaria perdiendo 2 bits de información al descartar adresl?. Es decir en mi caso el voltimetro estaria marcando 0 volts cuando en realidad tiene a la entrada 350 milivolts?. Esta bien el error es despreciable, lo que te quiero preguntar en realidad es si estoy perdiendo esos 3 bits de información, o el pic interpreta que tiene que trabajar como si contara con un conversor de 8 bits. Disculpa las molestias, y muchas gracias por tu ayuda


----------



## Chico3001 (Ene 6, 2009)

no... usas ambos registros para un corrimiento de 16 bits a la derecha, y vas a descartar los 2 bits menos significativos de ADRESL

ADRESH -> ADRESL

Asi el error es minimo y tienes una conversion de 8 bits... viendo el manual se me ocurre otra opcion mas simple, configura ADFM para que el resultado este justificado a la izquierda y usa el resultado en ADRESH, ADRESL solo tendra los 2 bits menos significativos que puedes descartar sin problemas...


----------



## murphy9 (Ene 7, 2009)

Perfecto, ahora mismo voy a probar lo que me dijiste, agradezco mucho tu respuesta. saludos


----------

