pages

14 mars 2016

Le codage BCD utilisé dans le circuit DS1307

Un petit article pour expliquer la conversion BCD/Décimal et inversement.


Codage BCD et DS1307


Codage BCD : 


Dans le circuit DS1307 les données sont stockées en BCD ce qui nécessite une conversion pour être utilisées dans notre programme.
Rapidement, un nombre est représenté par les chiffres qui le compose suivant le tableau ci dessous :


Chiffre
BCD
0
0000
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
8
1000
9
1001


Chaque chiffre est donc codé sur 4 bits, pour coder un nombre il suffit de coder chaque chiffre, par ex 56 sera codé suivant le tableau ci dessus :

    5       6
    |        |
 
0101 0110

Il faut donc convertir de BCD vers décimal et l'inverse de décimal vers BCD.

Reprenons notre exemple précédent avec le nombre en décimal 56 que nous voulons convertir en 01010110 (86) représentation en BCD de ce nombre.

Pour le chiffre des dizaines (5) il faut diviser par 10 le nombre et effectuer un décalage de 4 positions vers la gauche ( multiplication par 16), cela donne en C :
  (data / 10) << 4).

Pour le chiffre des unités on remarque que celui ci est égal au reste de la division du nombre par 10, il existe un opérateur en C qui permet d'effectuer  cette opération c'est l'opérateur modulo (%  ), dans notre cas nous pouvons écrire :
  (data %10).

Maintenant une simple addition et nous obtenons le nombre en BCD, ce qui donne :

return (((data / 10) << 4) + (data %10));

on peut également écrire :

return (((data /10) * 16) | (data %10));

Pour notre nombre 56 :

(data / 10 ) : 56 / 10 = 5 soit 0101
<< 4           : 01010000
+ (data %10) : 01010000 + 00000110 soit 01010110 ou 86 en BCD

Dans le sens inverse on commence par diviser par 16 le nombre en BCD puis on multiplie par 10 avant d'ajouter le reste de la division par 16 du nombre BCD, ceci donne en C :

return (((data / 16) * 10) + (data %16))

Ceci nous donne  pour 01010110 (86)
(data / 16)    : 5
* 10             : 50
+ (data %16) : 50 + 6 soit en décimal 56

Il est possible de remplacer (data %16) par (data & 0x00001111)

Les fonctions sont :

int DecBcd (int a)
{
    return((a/10*16)+(a%10));
}
/*----------------------------------------------------------------------*/
int BcdDec (int a)
{
    return((a/16*10)+(a%16));
}

Après relecture de cet article je ne suis pas sûr d'avoir été très clair ?




Aucun commentaire:

Enregistrer un commentaire