De decimal a BCD en CCS

<< < (2/3) > >>

pantera:
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
GeSHi (matlab):
/*=======================================================================*/
/*                           Convierte datos a BCD                       */
/*=======================================================================*/
 
int get_bcd(BYTE data)
{
  int nibh;
  int nibl;
 
  nibh=data/10;
  nibl=data-(nibh*10);
 
  printf("nibh= %u \n\r",nibh);         // imprime si hay errores
  printf("nibl= %u \n\r",nibl);         // imprime si hay errores  
  getc();
  return((nibh<<4)|nibl);
}
 
 
#int_EXT
EXT_isr()
{
  lcd_gotoxy(1,1);
  printf(lcd_putc,"Set Time & Date    \n");
  printf(lcd_putc,"Horas: %u    ",Horas);  
 
  while(Set);
  delay_ms(80);
 
     
Do{
 
  if(UP==1){
  Horas=Horas+1;
 
        if(Horas>23){
        Horas=0;
        }
 
  lcd_gotoxy(1,1);
  printf(lcd_putc,"Set Time & Date    \n");
  printf(lcd_putc,"Horas: %u    ",Horas);  
 
  }
   
  if(DOWN==1){
  Horas=Horas-1;
 
        if(Horas==255){
        Horas=23;
        }
 
  lcd_gotoxy(1,1);
  printf(lcd_putc,"Set Time & Date    \n");
  printf(lcd_putc,"Horas: %u    ",Horas);  
 
  }
 
  delay_ms(110);      
 
  printf("DATO= %u \n\r",Horas);         // imprime si hay errores
 
}While(Set==0);
 
 
     
     get_bcd(Horas);
}
 

djpalas:
Buenas!!

Prueba con este codigo a ver si te funciona mejor

Código
GeSHi (c):
int bin2bcd(int valor){
  int nibh=0;
  int nibl=0;
 
  while (valor>=10){
     valor-=10;
     nibh++;
  }
  nibl=valor;
 
  return (nibh|nibl);
}
 

djpalas:
Cita de: pantera 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
GeSHi (matlab):
/*=======================================================================*/
/*                           Convierte datos a BCD                       */
/*=======================================================================*/
 
int get_bcd(BYTE data)
{
  int nibh;
  int nibl;
 
  nibh=data/10;
  nibl=data-(nibh*10);
 
  printf("nibh= %u \n\r",nibh);         // imprime si hay errores
  printf("nibl= %u \n\r",nibl);         // imprime si hay errores  
  getc();
  return((nibh<<4)|nibl);
}
 
 
#int_EXT
EXT_isr()
{
  lcd_gotoxy(1,1);
  printf(lcd_putc,"Set Time & Date    \n");
  printf(lcd_putc,"Horas: %u    ",Horas);  
 
  while(Set);
  delay_ms(80);
 
     
Do{
 
  if(UP==1){
  Horas=Horas+1;
 
        if(Horas>23){
        Horas=0;
        }
 
  lcd_gotoxy(1,1);
  printf(lcd_putc,"Set Time & Date    \n");
  printf(lcd_putc,"Horas: %u    ",Horas);  
 
  }
   
  if(DOWN==1){
  Horas=Horas-1;
 
        if(Horas==255){
        Horas=23;
        }
 
  lcd_gotoxy(1,1);
  printf(lcd_putc,"Set Time & Date    \n");
  printf(lcd_putc,"Horas: %u    ",Horas);  
 
  }
 
  delay_ms(110);      
 
  printf("DATO= %u \n\r",Horas);         // imprime si hay errores
 
}While(Set==0);
 
 
     
     get_bcd(Horas);
}
 


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.

pantera:
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


pantera:
 :-/ 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
GeSHi (matlab):
/*=======================================================================*/
/*                           Convierte datos a BCD                       */
/*=======================================================================*/
 
char toBCD(char bin_val){
char temp;
char retval;
 
temp = bin_val;
retval = 0;
     while(1){
         if(temp >= 10)   {
         temp -= 10;
         retval += 0x10;  }
         else             {
         retval += temp;
         break;           }
     }
return(retval);
}
 

El Rock es cultura

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior