Autor Tema: De decimal a BCD en CCS  (Leído 9073 veces)

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

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
De decimal a BCD en CCS
« en: 16 de Febrero de 2006, 09:57:00 »
Hola, alguien me puede decir como pasar de ul long en decimal, a BCD en CCS.

En el manual que tengo no viene ninguna funcion.

Es para sacar los datos por un display.

Saludos y gracias.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado grouchy

  • PIC10
  • *
  • Mensajes: 39
RE: De decimal a BCD en CCS
« Respuesta #1 en: 16 de Febrero de 2006, 10:52:00 »
Escrito originalmente por micro_pepe
Hola, alguien me puede decir como pasar de ul long en decimal, a BCD en CCS.

En el manual que tengo no viene ninguna funcion.

Es para sacar los datos por un display.

Saludos y gracias.


Mira no se si alguien tenga una idea mejor, pero ahi va la mia:

char  codigo_BCD[5];
int16 numero;

void main ()
{
int i=0,bcd[6];
.
.
.
sprintf(codigo_BCD,"%lu",numero);
for (i=0;i<=5;i++)
{
switch(codigo_BCD[ i])
{
case "0":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
case "1":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
case "2":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
case "3":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
case "4":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
case "5":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
case "6":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
case "7":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
case "8":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
case "9":{bcd[ i]=//introduce aqui el código bcd para el dysplay a utilizar;
brake;}
}
}
// El resultado de los códigos BCD estan bcd[0], bcd[1].................
}


Espero que te sirva de algo:

char mystring[20];
long mylong;

 

mylong=1234;
sprintf(mystring,"<%lu>",mylong);
// mystring agora tiene:

//      < 1 2 3 4 >


Desconectado Alvarikokex

  • PIC10
  • *
  • Mensajes: 13
Re: De decimal a BCD en CCS
« Respuesta #2 en: 08 de Julio de 2006, 19:06:38 »
se me ocurrio esto para un reloj que hice.

byte seg[6]={0,0,0,0,0,0};
.
.
.
bin_bcd(){
   seg[5]=horas/10;
   seg[4]=horas-seg[5]*10;
   seg[3]=minutos/10;
   seg[2]=minutos-seg[3]*10;   
   seg[1]=segundos/10;
   seg[0]=segundos-seg[1]*10;
}

creo que puede ayudar.

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: De decimal a BCD en CCS
« Respuesta #3 en: 08 de Julio de 2006, 21:50:59 »
Hola pues hay una funcion que vi que es

Código: Matlab M
  1. get_bcd(data)                              Convert data to BCD  
  2.  rm_bcd(data)                               Convert data to int  
  3.  
  4.  
  5. int get_bcd(BYTE data)
  6. {
  7.    int nibh;
  8.    int nibl;
  9.  
  10.    nibh=data/10;
  11.    nibl=data-(nibh*10);
  12.  
  13.    return((nibh<<4)|nibl);
  14. }
  15.  
  16. int rm_bcd(BYTE data)
  17. {
  18.    int i;
  19.  
  20.    i=data;
  21.    data=(i>>4)*10;
  22.    data=data+(i<<4>>4);
  23.  
  24.    return data;
  25. }

ME imagino que si jala hoy lo pruebo pero ya checando el codigo y los operadores no se bien que es  Bitwise  ya que algunos estan definidos con esa palabra espero alguien me pueda ayudar

por ejemplo:

Código: Matlab M
  1. l  Bitwise inclusive or operator
  2.  
  3. &  Bitwise and operator

« Última modificación: 08 de Julio de 2006, 21:56:39 por pantera »
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: De decimal a BCD en CCS
« Respuesta #4 en: 09 de Julio de 2006, 13:55:44 »
Otra forma:

Guardamos en una cadena el número convertido a Ascii:

sprintf(cCadenaRes,"%u",nNumero);

Para sacar cada número por el display (por ejemplo el de menor peso):

OUTPUT_C(cCadenaRes[0] - '0');

Un saludo.
« Última modificación: 14 de Julio de 2006, 08:19:41 por jfh900 »
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: De decimal a BCD en CCS
« Respuesta #5 en: 13 de Julio de 2006, 19:59:11 »
Hola espero me puedan ayudar con este pequeño detalle.

 :?


Tengo problemas con un cambio de BCD mi codigo es el siguiente estoy haciendo un reloj. El problema que tengo es que todo bien del [0-15] pero cuando pongo un 16 y reviso denuevo el Dato [get_bcd(BYTE data)]. Me devuelve un 10 y pues creo que esta bien el codigo.

Código: Matlab M
  1. /*=======================================================================*/
  2. /*                           Convierte datos a BCD                       */
  3. /*=======================================================================*/
  4.  
  5. int get_bcd(BYTE data)
  6. {
  7.    int nibh;
  8.    int nibl;
  9.  
  10.    nibh=data/10;
  11.    nibl=data-(nibh*10);
  12.  
  13.    printf("nibh= %u \n\r",nibh);         // imprime si hay errores
  14.    printf("nibl= %u \n\r",nibl);         // imprime si hay errores  
  15.    getc();
  16.    return((nibh<<4)|nibl);
  17. }
  18.  
  19.  
  20. #int_EXT
  21. EXT_isr()
  22. {
  23.    lcd_gotoxy(1,1);
  24.    printf(lcd_putc,"Set Time & Date    \n");
  25.    printf(lcd_putc,"Horas: %u    ",Horas);  
  26.  
  27.    while(Set);
  28.    delay_ms(80);
  29.  
  30.      
  31. Do{
  32.  
  33.    if(UP==1){
  34.    Horas=Horas+1;
  35.  
  36.          if(Horas>23){
  37.          Horas=0;
  38.          }
  39.    
  40.    lcd_gotoxy(1,1);
  41.    printf(lcd_putc,"Set Time & Date    \n");
  42.    printf(lcd_putc,"Horas: %u    ",Horas);  
  43.    
  44.    }
  45.      
  46.    if(DOWN==1){
  47.    Horas=Horas-1;
  48.  
  49.          if(Horas==255){
  50.          Horas=23;
  51.          }
  52.  
  53.    lcd_gotoxy(1,1);
  54.    printf(lcd_putc,"Set Time & Date    \n");
  55.    printf(lcd_putc,"Horas: %u    ",Horas);  
  56.    
  57.    }
  58.    
  59.    delay_ms(110);      
  60.  
  61.    printf("DATO= %u \n\r",Horas);         // imprime si hay errores
  62.    
  63. }While(Set==0);
  64.  
  65.  
  66.      
  67.       get_bcd(Horas);
  68. }
« Última modificación: 13 de Julio de 2006, 20:14:22 por pantera »
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
Re: De decimal a BCD en CCS
« Respuesta #6 en: 13 de Julio de 2006, 20:38:21 »
Buenas!!

Prueba con este codigo a ver si te funciona mejor

Código: C
  1. int bin2bcd(int valor){
  2.    int nibh=0;
  3.    int nibl=0;
  4.  
  5.    while (valor>=10){
  6.       valor-=10;
  7.       nibh++;
  8.    }
  9.    nibl=valor;
  10.  
  11.    return (nibh|nibl);
  12. }

Saludos desde Cádiz, España
Web personal: http://www.microtronic.es

Desconectado djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
Re: De decimal a BCD en CCS
« Respuesta #7 en: 14 de Julio de 2006, 10:11:24 »
Hola espero me puedan ayudar con este pequeño detalle.

 :?


Tengo problemas con un cambio de BCD mi codigo es el siguiente estoy haciendo un reloj. El problema que tengo es que todo bien del [0-15] pero cuando pongo un 16 y reviso denuevo el Dato [get_bcd(BYTE data)]. Me devuelve un 10 y pues creo que esta bien el codigo.

Código: Matlab M
  1. /*=======================================================================*/
  2. /*                           Convierte datos a BCD                       */
  3. /*=======================================================================*/
  4.  
  5. int get_bcd(BYTE data)
  6. {
  7.    int nibh;
  8.    int nibl;
  9.  
  10.    nibh=data/10;
  11.    nibl=data-(nibh*10);
  12.  
  13.    printf("nibh= %u \n\r",nibh);         // imprime si hay errores
  14.    printf("nibl= %u \n\r",nibl);         // imprime si hay errores  
  15.    getc();
  16.    return((nibh<<4)|nibl);
  17. }
  18.  
  19.  
  20. #int_EXT
  21. EXT_isr()
  22. {
  23.    lcd_gotoxy(1,1);
  24.    printf(lcd_putc,"Set Time & Date    \n");
  25.    printf(lcd_putc,"Horas: %u    ",Horas);  
  26.  
  27.    while(Set);
  28.    delay_ms(80);
  29.  
  30.      
  31. Do{
  32.  
  33.    if(UP==1){
  34.    Horas=Horas+1;
  35.  
  36.          if(Horas>23){
  37.          Horas=0;
  38.          }
  39.    
  40.    lcd_gotoxy(1,1);
  41.    printf(lcd_putc,"Set Time & Date    \n");
  42.    printf(lcd_putc,"Horas: %u    ",Horas);  
  43.    
  44.    }
  45.      
  46.    if(DOWN==1){
  47.    Horas=Horas-1;
  48.  
  49.          if(Horas==255){
  50.          Horas=23;
  51.          }
  52.  
  53.    lcd_gotoxy(1,1);
  54.    printf(lcd_putc,"Set Time & Date    \n");
  55.    printf(lcd_putc,"Horas: %u    ",Horas);  
  56.    
  57.    }
  58.    
  59.    delay_ms(110);      
  60.  
  61.    printf("DATO= %u \n\r",Horas);         // imprime si hay errores
  62.    
  63. }While(Set==0);
  64.  
  65.  
  66.      
  67.       get_bcd(Horas);
  68. }

Ahora que me fijo mejor en el codigo de tu programa, usa la funcion de "get_bcd(Horas)", pero el valor de retorno no lo llegas a usar  :shock:.
Aparte la función get_bcd la veo bien.

Saludos desde Cádiz, España
Web personal: http://www.microtronic.es

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: De decimal a BCD en CCS
« Respuesta #8 en: 14 de Julio de 2006, 10:53:58 »
Mira la rutina de reloj que estoy utilizando es para el DS1307 y segun la hoja de datos necesito meter los valores en BCD mediante un boton llama una una interrpcion externa para reprogramar la hora.

la funcion       get_bcd(Horas);   lo mando po I2C al DS1307 (Via I2C) pero como decia anteriormente todo bien del [0-15] pero cuando intento con otro numero pasan cosas raras....

Si pongo un 10 todo bien
...
si pongo un 14 => Cuando leo el DS1307  cuenta 14 ... 15 ... y luego 8 ... 9 ... 10 ... y ya se va bien

si pongo un 16 => Cuando leo el DS13607 directamente leo un 10 ... 11 ... 12 ... 13

y pues esto ya me esta volviendo LOCO mmmmm

bueno espero alguien me pueda ayudar ...

El Rock es cultura


« Última modificación: 14 de Julio de 2006, 10:56:31 por pantera »
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: De decimal a BCD en CCS
« Respuesta #9 en: 15 de Julio de 2006, 20:59:23 »
 :-/ ya lo solucione

lo que hice fue utilizar esta funcion. Solo hay que tener cuidado con el valor de retorno. Yo utilizo otra variable para almacenar el dato

Código: Matlab M
  1. /*=======================================================================*/
  2. /*                           Convierte datos a BCD                       */
  3. /*=======================================================================*/
  4.  
  5. char toBCD(char bin_val){
  6. char temp;
  7. char retval;
  8.  
  9. temp = bin_val;
  10. retval = 0;
  11.       while(1){
  12.           if(temp >= 10)   {
  13.           temp -= 10;
  14.           retval += 0x10;  }
  15.           else             {
  16.           retval += temp;
  17.           break;           }
  18.       }
  19. return(retval);
  20. }

El Rock es cultura
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
Re: De decimal a BCD en CCS
« Respuesta #10 en: 06 de Octubre de 2006, 14:59:57 »
Hola de nuevo, se me ocurrió esta rutina para convertir una variable de cualquier longitud (int, int16 o int 32), al numero de digitos BCD necesarios, el inconveniente es que puede necesitar muchos registros.

Código: [Seleccionar]
int32 decimal;
int i, BCD[10];
for(i=0;i<10;i++){
BCD[i]=decimal%10;
decimal=decimal/10;
}

Espero que os sirva.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡


 

anything