Microcontroladores PIC > Lenguaje C para microcontroladores PIC

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: Matlab M ---/*=======================================================================*//*                           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_EXTEXT_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: 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: Matlab M ---/*=======================================================================*//*                           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_EXTEXT_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);} 
--- Fin de la cita ---

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: Matlab M ---/*=======================================================================*//*                           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

Ir a la versión completa