Deuligne en C

Forum spécifique au shield Deuligne

Deuligne en C

Message non lude triaxx » Mar 19 Fév 2013 09:11

Bonjour.

Je suis en train d'écrire des programmes en C pour l'Arduino Uno en utilisant gcc-avr et l'avr-libc. Voulant utiliser le Deuligne, j'essaye donc de faire (en quelques sortes) un portage de la bibliothèque C++ du Deuligne en C. Après avoir parcouru les docs de l'ATmega328P, du MCP23008 et du HD44780, je me pose quelques petites questions.

Code: Tout sélectionner
SetMCPReg(myAddress,0x05,0x0C);

Cet appel active les bits suivants au niveau du MCP23008 :
  • HAEN: Hardware Address Enable bit (MCP23S08 only)
  • ODR: This bit configures the INT pin as an open-drain output
Si je ne dis pas de bêtise, le Deuligne communique bien avec l'Arduino en I²C et activer le bit HAEN ne sert que dans le cas du SPI. J'aurais donc envie de remplacer cet appel par :
Code: Tout sélectionner
SetMCPReg(myAddress,0x05,0x04);

Ce n'est bien sûr qu'un détail. C'est juste pour être sûr que j'ai bien tout suivi ...

En voyant cette fonction :
Code: Tout sélectionner
void WriteLCDByte( byte deviceAddr, byte bdata ) {
  SendToLCD(deviceAddr,bdata >> 4);
  SendToLCD(deviceAddr,bdata & 0x0F);
}

je comprends que l'on s'adresse à l'afficheur LCD en mode 4-bit. Mais l'Arduino Uno a un MCU ATmega 8-bit et le Microchip qui sert de périphérique I²C esclave semble aussi fonctionner en 8-bit. D'après la doc, le HD44780 peut fonctionner dans les 2 modes 4-bit ou 8-bit. Est-ce que l'afficheur du Deuligne n'a qu'un seul mode de fonctionnement ? Ou est-ce que le câblage fait qu'on ne peut l'utiliser qu'en 4-bit ?

Alors que là :
Code: Tout sélectionner
void Deuligne::backLight( bool turnOn ) {
  dataPlusMask = turnOn ? (dataPlusMask | 0x80) : (dataPlusMask & ~0x80);
  SetMCPReg(myAddress,0x0A,dataPlusMask); 
}

on envoie directement une donnée 8-bit à l'adresse 0x0A du MCP23008 ... J'aurais bien envie de ne communiquer avec le LCD uniquement en 8-bit, histoire de gagner quelques petits délais d'attente (même si c'est pas grand chose).

Enfin :
Code: Tout sélectionner
void SendToLCD( byte deviceAddr, byte data ) {
  data |= dataPlusMask;
  SetMCPReg(deviceAddr,0x0A,data);
  data ^= 0x10; // E
  delayMicroseconds(1);
  SetMCPReg(deviceAddr,0x0A,data);
  data ^= 0x10; // E
  delayMicroseconds(1);
  SetMCPReg(deviceAddr,0x0A,data);
  delay(1);
}

je ne comprends pas bien l'utilité de cette fonction, puisqu'on envoie la donnée, puis on la renvoie en faisant un OU EXCLUSIF, puis on la renvoie enfin avec un OU EXCLUSIF. Finalement, la donnée du dernier envoie correspond à celle du premier ... Est-ce pour exciter le bus I²C (sinon, il regarde ailleurs :D) ?. L'explication est sûrement dans une des datasheet, mais je ne l'ai pas trouvée.

Merci par avance.
Frédéric Fauberteau
triaxx
 
Messages: 9
Inscription: Dim 23 Sep 2012 09:48
Localisation: Meaux

Retourner vers Deuligne

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron