Pages: [1]   Go Down
Author Topic: [Résolu]Problème de débutant sur I2C et LCD  (Read 1122 times)
0 Members and 1 Guest are viewing this topic.
Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir à tous,
Je dispose d'un afficheur CLCD de Comfile destiné à être mis en œuvre avec les modules Cubloc via Cunet. Le bus Cunet n'est rien d'autre qu'un bus I2C.
J'ai écrit quelques fonctions pour piloter l'afficheur CLCD et tout fonctionne parfaitement.
Mon problème se situe au niveau de l'appel de la fonction "Print"

Code:
CLCDPrint("Bonjour");
CLCDPrint("Z");

Les deux exemples ci-dessus fonctionnent parfaitement.

L'afficheur CLCD permet de programmer des caractères personnalisés qui se situe aux adresses ascii 8 à 15 (décimal). Comment faire pour afficher ce caractère ascii de l'adresse 8.

J'ai essayé plusieurs formes d'écriture, mais cela ne fonctionne pas.

Code:
CLCDPrint(char(8));

Le compilateur ne veut rien savoir  smiley-mr-green

Pour information, je suis novice en C et je fais mes premiers pas avec ce langage et Arduino !
Merci pour votre aide.
« Last Edit: May 06, 2012, 02:20:55 pm by icare » Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 863
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lol ^^ écoute un caractère ascii c'est un octé donc deux chiffres en hexa, en C ça s'écrit "0x09" "0xB1" le "0x" et ton chiffre hexa ( il sont toujours écrit dans les table de caractère ascii) donc pour de 8 a 15 tu écrira de 0x08 à 0x15  ^^

voila salut =)

Skizo !
« Last Edit: May 06, 2012, 12:57:37 pm by skizoh » Logged

Un tien vaux mieux que deux tu l'auras !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour

la fonction CLCDPrint() c'est toi qui l'a codée ?

Si c'est une fonction unique prenant une chaine de caractère en entrée CLCDPrint( char *str ) c'est normal que tu ne puisse pas lui passer un caractère unique.
Il faut lui passer une chaine.
Par exemple faire ce que tu veux faire avec une chaîne ca devient :
Code:
CLCDPrint( "\x08" );

Où \x08 représente le caractère de code ASCII 0x08 dans une chaine de caractère.

je te suggère de regarder aussi le post http://arduino.cc/forum/index.php/topic,104227.0.html où j'ai guidé SilverBeach pour écrire une lib pour un autre type d'écran à interface I2C.
Le principe pour écrire des fonctions multiples pouvant prendre des chaines, des caractères ou des nombres restent valides.

A+
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir barbudor

Quote
la fonction CLCDPrint() c'est toi qui l'a codée ?

Oui - il faut bien se faire la main car pour moi C c'est étrange par rapport au Basic !!!
Ci-dessous, j'insère les fonctions CLCDPrint(...)  et CLCDCarac(...)

Code:
/*
Fonction destinée à créer un caractère personnalisé sur l'afficheur CLCD Comfile
*/
void CLCDCarac(byte NumCar, byte b0, byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7) {
  Wire.beginTransmission(0x00);       //Adresse esclave 0x00 et Start
  Wire.write(0x1B);                   //Envoi ESC
  Wire.write(0x44);                   //Envoi "D"
  Wire.write(NumCar);                 //Numéro caractère de 8 à 15 (0x08 à 0x0F)
  Wire.write(b0);                     //Pixels allumés ou éteints sur la première ligne
  Wire.write(b1);                     //Pixels allumés ou éteints
  Wire.write(b2);                     //Pixels allumés ou éteints
  Wire.write(b3);                     //Pixels allumés ou éteints
  Wire.write(b4);                     //Pixels allumés ou éteints
  Wire.write(b5);                     //Pixels allumés ou éteints
  Wire.write(b6);                     //Pixels allumés ou éteints
  Wire.write(b7);                     //Pixels allumés ou éteints sur la dernière ligne
  Wire.endTransmission();             //Stop 
}

Code:
/*
Fonction destinée à afficher du texte sur l'afficheur CLCD Comfile
*/
void CLCDPrint(char Texte[]) {
  Wire.beginTransmission(0x00);  //Adresse esclave 0x00 et Start
  Wire.write(Texte);             //Envoi texte sur I2C
  Wire.endTransmission();        //Stop   
}

Quote
Par exemple faire ce que tu veux faire avec une chaîne ca devient :
Code:

CLCDPrint( "\x08" );

Où \x08 représente le caractère de code ASCII 0x08 dans une chaine de caractère.

Effectivement, avec ce format cela fonctionne.
Merci pour cet éclaircissement  smiley

Je vais étudier avec soin le lien que tu signales car j'ai certainement beaucoup de chose à apprendre.
Encore merci
Icare
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu commence très bien.

Petite optimization possible sur la première fonction car il te sera plus facile d'utiliser un tableau d'octets.
Par ailleurs petite erreur sur la seconde : telle qu'elle est écrite tu n'affichera qu'un seul caractère.
Voici mes corrections :

Code:
// Définit un caractère grisé (damier de pixels blanc et noirs)
byte CarreGris[8] = { 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA };

/*
Fonction destinée à créer un caractère personnalisé sur l'afficheur CLCD Comfile
*/
void CLCDCarac(byte NumCar, byte *carTab ) {
  Wire.beginTransmission(0x00);       //Adresse esclave 0x00 et Start
  Wire.write(0x1B);                   //Envoi ESC
  Wire.write(0x44);                   //Envoi "D"
  Wire.write(NumCar);                 //Numéro caractère de 8 à 15 (0x08 à 0x0F)
  for ( int i = 0 ; i < 8 ; i++ )
    Wire.write(carTab[i]);         //Pixels allumés
  Wire.endTransmission();             //Stop 
}

/*
Fonction destinée à afficher un caractere sur l'afficheur CLCD Comfile
*/
void CLCDPrint(char c) {
  Wire.beginTransmission(0x00);  //Adresse esclave 0x00 et Start
  Wire.write(c);             //Envoi caractere
  Wire.endTransmission();        //Stop   
}

/*
Fonction destinée à afficher une chaîne de caracteres sur l'afficheur CLCD Comfile
*/
void CLCDPrint(char *str) {
  Wire.beginTransmission(0x00);  //Adresse esclave 0x00 et Start
  while( *str )                             // on s'arrete sur le caractère nul '\0' marqueur de fin d'une chaine de caractère en C
      Wire.write(*str++);             //Envoi caractere et passe au suivant
  Wire.endTransmission();        //Stop   
}

void setup()
{
  // définit le cartèere 8 comme un gris :
  CLCDCarac( 8, CarreGris );
  // Afficher des 8 caractères gris
  CLCDPrint( "\0x08\0x08\0x08\0x08\0x08\0x08\0x08\0x08\0x08" );
}

void loop()
{
}

Comme tu peux le voir j'ai définit 2 fonctions qui portent le même nom mais en C++ cela est autorisé car on distingue les 2 fonctions parce qu'elles ne prennent pas le même type de paramètre : l'une prend un charactère et l'aure un pointeur sur caractère caractéristique en C/C++ d'une chaine de caractères.

En C/C+ une chaine de caractère est une suite de caractères consécutivement placés en mémoire, terminée par le caractère nul '\0' (code 0x00) et identifioée par l'adresse (pointeur) du 1ere caractère de la chaine.
Toutes ces écritures sont plus ou moins équivalents mais avec des subtilités :
Code:
char *str1 = "Une chaîne";
char str2[] = "Une chaîne";
char str3[] = { 'U', 'n', 'e', ' ', 'c', 'h', 'a', 'î', 'n', 'e', '\0' };

Dans les 2 premiers cas, l'usage des guillemets définissant une chaîne de caractère rend implicite qu'un caractère '\0' est ajouté à la fin.
Dans le 3eme cas, c'est un tableau de caractères "discrets". Il faut donc explicitement ajouter le caractère nul à la fin si cela doit definir une chaîne. En pratique on n'utilise jamais cette syntaxe pour définir une chaîne.

Il légal d'appeller CLCDPrint( ) avec n'importe laquelle de ces variables :
Code:
CLCDPrint( str1 );
CLCDPrint( str2 );
CLCDPrint( str3 );


Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1238
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour barbudor,
Merci pour tes conseils.
 smiley-cool
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Pages: [1]   Go Up
Jump to: