J'utilise un microcontrôleur AVR pour écrire sur un diviseur de fréquence programmable via le bus I2C. A certains intervalles, j'essaie de faire en sorte que la fonction suivante soit appelée pour mettre à jour la fréquence de sortie de la puce :
void 1077WriteDiv(int16_t data)
{
uint8_t upperByte = (uint8_t)((uint16_t)data>>2);
i2c_start(DS1077_BASE_ADDRESS);
i2c_write(DIVIDE_REGISTER);
i2c_write(upperByte);
i2c_write(0x0);
i2c_stop();
}
J'essaie de récupérer les 8 bits supérieurs d'une valeur de 10 bits dans la variable "data" et de l'écrire. La deuxième commande "write" écrit les 8 bits inférieurs du registre "divide" de la puce, 0 dans ce cas.
En guise de test, j'incrémente la variable "data" (qui doit être signée pour certaines raisons) à partir de zéro, je la décale de 2 bits vers la gauche et j'appelle cette fonction à chaque fois. J'obtiens des déchets. Cependant, lorsque je fais ceci :
void 1077WriteDiv(int16_t data)
{
//uint8_t upperByte = (uint8_t)((uint16_t)data>>2);
static uint8_t thing = 0;
i2c_start(DS1077_BASE_ADDRESS);
i2c_write(DIVIDE_REGISTER);
i2c_write(thing++);
i2c_write(0x0);
i2c_stop();
}
Tout fonctionne comme prévu. Il est évident qu'il y a un problème dans la façon dont je décale et classe la variable "data" originale, mais j'ai essayé toutes sortes de permutations avec les mêmes résultats. J'apprécierais beaucoup si quelqu'un pouvait m'indiquer où je me trompe.