Go Down

Topic: Connections I2C Afficheur + clavier (Read 6938 times) previous topic - next topic

Christophe37

#15
Jan 03, 2011, 05:49 pm Last Edit: Jan 03, 2011, 06:01 pm by Christophe37 Reason: 1
Bonjour,

Si si la DS1307 marche toujours impeccable sauf lorsque l'afficheur reboot (il le fait toute les 10 secondes environ), je pense qu'il doit faire quelque chose sur le bus qui soit bloque la lecture du DS1307, soit mon interrogation vers l'afficheur bloque le programme a ce moment la peut être à cause d'une erreur.

Le 12V sert apparemment qu'a alimenter le rétro éclairage et bien sur le 7805. Mais si je branche que le 5V de l'arduino j'ai rien du tout, les voyants s'allume pas ni l'afficheur. Il m'est difficile de bypassé le 7805 car la plaque ou se trouve le micro-controleur et donc le 7805 est plaqué à l'arrière de l'afficheur et la carte est réalisé en multicouche.

L'afficheur tout seul me fait exactement la même chose qu'avec le DS1307, c'est vrais que j'avais pas essayé

B@tto

J'avais pas vu mais :

Wire.send(1);

A mon avis le bug est à chercher ici ... (je touche pas trop (encore) à l'i2c mais j'ai jamais vu un simple "1", toujours des hexa)
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Christophe37

cela ne change rien même si je met 0x01 ou 0x1,

Je poserais la question à mon boulot jeudi.

B@tto

J'ai vu un autre souci :

Wire.beginTransmission(0x38); //Adresse de l'afficheur
 Wire.send(0x20); //Registre pour le rétroéclairage
 Wire.send(1); //Allumage du rétroéclairage
 Wire.endTransmission();

Dans un message précédent tu dis que :

"L'adresse du contrôleur I2C de la carte afficheur est 0x23".

Sinon pour envoyé le fameux 1 (à la place de Wire.send(1);) essaye plutôt : Wire.send(0b00000001) ou Wire.send(0b10000000) ou bien encore Wire.send(0b11111111)
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Christophe37

#19
Jan 05, 2011, 10:05 am Last Edit: Jan 06, 2011, 08:56 am by Christophe37 Reason: 1
Bonjour effectivement je m'était trompé dans le 1er post sur l'adressage de la carte sur l'I2C, c'est bien 0x38.

Ensuite je bien d'essayé avec 0b00000001 ... mais c'est pas mieux l'afficheur continu sont cycle, il doit surement y avoir un truc à envoyer pour qu'il arrête son boot

Christophe37

Bon en faite j'était a coter de la plaque, car effectivement il y a tout un protocole qui a été mis en place dans le contrôleur de l'afficheur.

Il faut lui dire l'adresse bien sur 0x38 si l'on est en écriture 0x39 si l'on est en lecture car on ajoute un bit d'ecriture et lecture

Ensuite L'adresse du registre puis le type des data ajouter au nombre de Byte à envoyer et enfin le checksum

S'il ne reçoit pas un message complet il ne démarre pas et fait que booter

B@tto

Donc c'est bon maintenant ça fonctionne ?
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Christophe37

#22
Jan 07, 2011, 03:02 pm Last Edit: Jan 07, 2011, 03:05 pm by Christophe37 Reason: 1
Je suis au boulot donc j'ai pas avec moi l'arduino et les interfaces :), mais j'essaie sa se soir ou se week au pire. En tout cas avant cela ne pouvait pas marcher avec ce que je faisais car le microcontroleur ne répondra quelque chose, à la 1ère connexion, uniquement dans le cas d'une trame conforme. Ce qui arrêtera les Boot répété.

Dans un 1er temps je vais essayer d'activer le rétro éclairage.

Apparemment j'ai pas besoin de rajouter des résistance de pull up puisqu'il y a ceux de la DS1307 qui sont sur le 5V.

B@tto

#23
Jan 07, 2011, 05:04 pm Last Edit: Jan 07, 2011, 05:04 pm by B@tto Reason: 1
Il y en a également intégrées à l'arduino ;)
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Christophe37

Bonsoir, j'ai récupéré la documentation des trames à envoyer en I2C.

Voici l'exemple pour l'écriture:

Start

Slave adresse sur 7 bits, le bit faible étant le Read/Write (0 étant apparemment le Write et 1 Read)

Adresse sur 8 bites

Data Type sur 8 bites étant 0x80 + le nombre de data

Data Byte 1

Data Byte n

Cheksum

Stop

Voila bon j'ai essayer des truc mais j'arrive à rien encore. Je me foutrais des claques parfois :)

L'adresse de la carte étant 0x38

Si par exemple on essaye d'allumer le rétroéclairage l'adresse est 0x20 et il comporte 1 bit, 1 pour allumer et 0 pour éteindre

pour le checksum, voici le code que j'ai récupéré:

Code: [Select]


 checksum = slaveAddr | I2C_WRITE;
 for (idx = 0; idx < dataSize + 2; idx++){
   checksum += I2CXD_Message[idx];
 }
checksum = ~checksum;


Avec :
#define I2C_WRITE  0

unsigned char slaveAddr
unsigned char dataSize

unsigned char checksum;
unsigned char idx;


Si vous pouvez m'aider un peut, je pensais avoir compris ce qu' il m'avait dit mais cela marche pas, je pense que je me plante avec l'histoire des adresse en 7bites sans le poids faible


Pour l'envoie j'ai crée un méthode:

Code: [Select]

void I2C_Write(unsigned char Addr, unsigned char * Buff, unsigned char Size)
{
 Wire.beginTransmission(Addr);
 Wire.send(Buff, Size);
 Wire.endTransmission();
 
}

Christophe37

Bonjour,

Voila en fonction de ce que j'ai recuperé, le code que j'ai effectué:

Code: [Select]

/*
*------------------------------------------
*        Include declaration
*------------------------------------------
 */
#include <Wire.h>
#include <stdio.h>
/*
*------------------------------------------
*        Constant declaration
*------------------------------------------
 */
#define I2CXD_MSG_LGTH  21

/*-- Write command I2C 0x20 to 0x2--*/
#define I2C_CMD_BACKLIGHT_ONOFF        (0x20)
#define I2C_CMD_CONSTRAST              (0x21)
#define I2C_CMD_LEDSCONTROL            (0x22)
#define I2C_CMD_WRITE_LINE1            (0x23)
#define I2C_CMD_WRITE_LINE2            (0x24)
#define I2C_CMD_DISPLAY_CONTROL        (0x25)
#define I2C_CMD_SET_CURSOR_PO          (0x26)
#define I2C_CMD_WRITE_SPECIAL_CHAR     (0x27)
#define I2C_CMD_BUTTON_STATUS_REGISTER (0x10)

/*-- Constante --*/
#define I2C_WRITE  0
#define ERROR      (0x01)
#define OK         (0x00)

/*ADDRESS CARTE I2C */
#define LCD_SLAVE_ADRR    (0x38) //display & Keyboard/Led slave address

/*--Variable déclaration--*/
unsigned char * I2CXD_Message;
boolean L;

void setup()
{
 Serial.begin(9600);
 Wire.begin(); // join i2c bus (address optional for master)
 L = false;
}

byte val = 0;

void loop()
{
 unsigned char dt[1];
 dt[0] = (0x80);
 
 if ( L = true){
   dt[0] = (1);
   I2C_WriteCommand(LCD_SLAVE_ADRR, I2C_CMD_BACKLIGHT_ONOFF, 1, dt);
   L = false;
 }else{
   dt[0] = (0);
   I2C_WriteCommand(LCD_SLAVE_ADRR, I2C_CMD_BACKLIGHT_ONOFF, 1, dt);
   L = true;
 }
 
 delay(1500);
}

unsigned char I2C_WriteCommand (unsigned char slaveAddr, unsigned char command, unsigned char dataSize, unsigned char *ptData)
{
 unsigned char idx;
 unsigned char checksum;
 if (dataSize > (I2CXD_MSG_LGTH-3)){
   dataSize = I2CXD_MSG_LGTH-3;
 }
 I2CXD_Message[0] = command >> 1;           /* Commands. */
 I2CXD_Message[1] = 0x80 + dataSize;        /* Byte block 0x80 + data lenght */
 for (idx = 0; idx < dataSize; idx++){
   I2CXD_Message[idx + 2] = *ptData++;
 }
 checksum = slaveAddr | I2C_WRITE;
 for (idx = 0; idx < dataSize + 2; idx++){
   checksum += I2CXD_Message[idx];
 }
 checksum = ~checksum;
 I2CXD_Message[dataSize + 2] = checksum;
 if (I2C_Write(slaveAddr, I2CXD_Message, dataSize +3) != true){
    return ERROR;
 }else{
   return OK;
 }  
}

boolean I2C_Write(unsigned char Addr, unsigned char * Buff, unsigned char Size)
{
 Wire.beginTransmission(Addr >> 1);
 Wire.send(Buff, Size);
 Wire.endTransmission();
 
}


Mais cela marche toujours pas
La méthode I2C_WriteCommand est la même chose que ce que l'on utilise au boulot

Christophe37

Bonsoir,

J'avance un peut,
J'arrive maintenant a allumer le retroéclairage et a envoyer du texte sur la ligne 1 ou la ligne 2.


Pour le moment j'arrive a rien de plus, je n'arrive pas par exemple a modifier le constrast


Command code:       0x21
Length:      1Byte
Byte 0:
     0 (minimum) to 255(maximum)
Contrast values are permanently stored is EEPROM


Ou faire changer les voyants:

Command code:       0x22
Length:      1Byte
Byte 0:
     b0:       0 = Led1 (red) OFF
           1 = Led1 ON
     b1-3: flashing period index for Led1
b4:       0 = Led2 (green) OFF
           1 = Led2 ON
     b5-7:flashing period index for Led2

Flashing period index      Cycle delay (s)
0      (infinite)
1      0.32
2      0.64
3      0.96
4      1.28
5      1.60
6      1.92
7      2.24

Notes:
?      If both LED flash at the same period, b0=b1 make them flash in phase and b0 different from b0 make them flash in phase opposition.
?      Led's flash at startup, so the user should issue a Led control short after to stop it.

Je continu à chercher

Christophe37

#27
Jan 09, 2011, 11:56 pm Last Edit: Jan 10, 2011, 08:43 am by Christophe37 Reason: 1
J'ai réussi a faire fonctionner mes voyant mais je n'y arrive pas encore de façon conventionnel.


Pour allumer les 2 LED en fixe, il faut que j'envoie 0x11

dt[0] = (0x11);
I2C_WriteCommand(LCD_SLAVE_ADRR, I2C_CMD_LEDSCONTROL, 1, dt);

Mais pour que cela marche je suis obligé d'envoyer avant un serial.println(dt[0], HEX)

Comme cela:
dt[0] = (0x11);
 Serial.println(dt[0], HEX),
 I2C_WriteCommand(LCD_SLAVE_ADRR, I2C_CMD_LEDSCONTROL, 1, dt);

Et la cela marche.

J'ai essayé pour la même commande 0x11:
dt[0] = 17;
dt[0] = 0b00010001;
dt[0] = 0x11, HEX,

mais rien



Christophe37

#28
Jan 10, 2011, 09:07 am Last Edit: Jan 10, 2011, 09:08 am by Christophe37 Reason: 1
Pour la récupération des boutons, les trames à envoyer sont plus complexe car il faut le faire en 2 étapes:

Partie - SetDataAdress:

Start
Byte 1 : Adress
Byte 2 : Command
Byte 3 : Data Type + taille
Byte 4 : checksum

Partie - GetData
Start
Byte 1 : Adress
Byte 2 : Error Code
Byte 3 : Byte donnee 1
Byte n : Byte donnee n
Byte n+1: checksum


Voici le code tel qu'il est dans notre programme standard au boulot:
Code: [Select]
unsigned char I2CXD_ReadCommand(unsigned char slaveAddr, unsigned char command, unsigned char dataSize)
{
 unsigned char checksum;

 I2CXD_Message[0] = command;
 I2CXD_Message[1] = 0x80 + dataSize;
 checksum = slaveAddr | I2C_WRITE;
 I2CXD_Message[2] = checksum + I2CXD_Message[0] + I2CXD_Message[1];
 I2CXD_Message[2] = ~I2CXD_Message[2];
 I2C_Write(slaveAddr, I2CXD_Message, 3);
 delay(5);
 I2C_Read(slaveAddr, I2CXD_Message, dataSize + 2);
 
}


Et voici ce que j'ai fait sachant que I2C_Write fonctionne avec l'envoie de commande:

Code: [Select]
boolean I2C_Write(unsigned char Addr, unsigned char * Buff, unsigned char Size)
{
 Wire.beginTransmission(Addr >> 1);
 Wire.send(Buff, Size);
 Wire.endTransmission();
}
boolean I2C_Read(unsigned char Addr, unsigned char * Buff, unsigned char Size)
{
//j'ai mis les tailles en fixe pour les essais
 byte Recep[3];
 Wire.requestFrom(Addr >> 1, 1+2);
 Recep[0] = Wire.receive(); //Code d'erreur
 Recep[1] = Wire.receive(); // Byte de donnée du clavier
 Recep[2] = Wire.receive(); // Checksum
 Serial.print ("Code Erreur = ");
   Serial.println(Recep[0], HEX);
   Serial.print ("Reception = ");
   Serial.print(Recep[1], HEX);
   Serial.print ("Checksum= ");
   Serial.print(Recep[2], HEX);
 Wire.endTransmission();
}


Je fait des essaie avec I2C_Read mais actuellement cela marche pas.
car en code d'erreur il me renvoie 0xAA ce qui correspond a "commande comprise" donc pas d'erreur
en donnée je reçois toujours 0 que je tape ou pas sur le clavier.
en checksum j'ai toujours 0x55

Christophe37

Bonjour,
Vous pourriez me dire pourquoi je suis obliger de faire un Serial.print(xxx), avant d'envoyer m'a commande I2C. Cela marche pas si je le fait pas (voir les post précédent).

Au boulot, ils ne voient pas pourquoi non plus.

Merci

Go Up