Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

LCD en I²C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#31 Message par Jérémy » jeu. 27 août 2015 11:47

paulfjujo a écrit :Source du message extended mode ...

Code : Tout sélectionner
I2C1_Wr(0b00100100); // =0x24 .... was 0x34 !


Oups ,erreur de commentaire . Il faut bien le mettre en 0x34 . Je fais tellement de test que je ne sais plus si j'ai essayé en mettant extended_mode ... . Ça ferais un 0x35 .
Erreur corrigé dans le code .

A essayé, ce soir on ne sait jamais ! , je suis prêt a tout essayer au point oui j'en suis !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en I²C
Pat
Débutant
Débutant
Messages : 43
Enregistré en : juillet 2015

#32 Message par Pat » jeu. 27 août 2015 17:11

inspire toi de ce code trouvé sur le net !




Code : Tout sélectionner



Fichier http
://www.jacquet80.eu/pic/prgm/lcd_i2c.c, affiché grâce au splendide SyntaxHighlighter d'Alex Gorbatchev.
view source
print
?
001    /*
002        Programme de démonstration de pilotage d'un afficheur LCD I2C avec un
003        PIC 18F2455. Pour le schéma et les explications, voir :
004     
005        <http://www.jacquet80.eu/pic/>
006     
007        L'afficheur LCD I2C utilisé était le BTHQ 21605AV-YETF-LED04-I2C-5V de
008        Batron. Le programme et/ou le schéma sera à adapter pour un autre modèle
009        d'afficheur (brochage différent, timing différent, etc.)
010     
011        Copyright (C) 2009 Christophe Jacquet <http://www.jacquet80.eu/>
012     
013        This program is free software: you can redistribute it and/or modify
014        it under the terms of the GNU General Public License as published by
015        the Free Software Foundation, either version 3 of the License, or
016        (at your option) any later version.
017     
018        This program is distributed in the hope that it will be useful,
019        but WITHOUT ANY WARRANTY; without even the implied warranty of
020        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
021        GNU General Public License for more details.
022     
023        You should have received a copy of the GNU General Public License
024        along with this program.  If not, see <http://www.gnu.org/licenses/>.
025    */
026     
027     
028    
#include <p18f4550.h>
029    #include <i2c.h>
030     
031    
#pragma config FOSC = HSPLL_HS // mode oscillateur extérieur HS, PLL activée, HS utilisé pour l'USB ;
032    #pragma config PLLDIV = 5 // division par 5 de la fréquence avant la PLL (prescaler) car il FAUT TOUJOURS du 4 MHz. Quartz à 20 MHz => PLLDIV = 5
033    #pragma config CPUDIV = OSC4_PLL6 // division par 4 de la fréquence en sortie de la PLL (postscaler).
034     
035    
#pragma config MCLRE = OFF
036    #pragma config WDT = OFF
037    #pragma config LVP = OFF
038     
039     
040    
// Adresse I2C standard des afficheurs LCD
041    #define LCDADDR 0x76
042     
043    
// Redéfinition des trois fonctions write(), stop() et start()
044    // pour qu'elles fassent d'abord un idle()
045    void iic_write(unsigned char c) {
046        IdleI2C();
047        WriteI2C(c);
048    }
049     
050    void iic_stop
(void) {
051        IdleI2C();
052        StopI2C();
053    }
054     
055    void iic_start
(void) {
056        IdleI2C();
057        StartI2C();
058    }
059     
060    void Display_init
(void);
061    void Write_text(void);
062     
063     
064    
// Initialise le LCD
065    void Display_init(void) {
066        iic_start();
067        iic_write(LCDADDR);  // LCD's I2C slave address
068        iic_write(0x00);     // Control byte for instruction
069        iic_write(0x34);     // DL: 8 bits, M:  16 by two line  display, SL: 1:18, H: normal instruction set
070        iic_write(0x0C);     // D: Display on, C: curser off, B: blink off
071        iic_write(0x06);     // I/D: increment, S: no shift
072     
073        iic_write
(0x35);     // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
074        iic_write(0x04);     // P: left to right, Q: top to bottom
075        iic_write(0x10);     // TC1: 0, TC2: 0
076        iic_write(0x42);     // HV Stages 3
077        iic_write(0x9f);     // set Vlcd, store to VA
078        iic_write(0x34);     // DL: 8 bits, M:  two line, SL: 1:18, H: normal instruction set
079     
080        iic_write
(0x80);     // DDRAM Address set to 00hex
081        iic_write(0x02);     // return home
082        iic_stop();
083    } 
084     
085     
086    
// Affiche des caractères
087    void Write_text(void) {
088        int i;
089        iic_start();
090        iic_write(LCDADDR);  // I2C slave Address
091        iic_write(0x00);     // Control byte for Instruction
092        iic_write(0x80);     // DDRAM Address set to 00hex
093        iic_stop();
094     
095        iic_start
();
096        iic_write(LCDADDR);  // I2C slave Adress
097        iic_write(0x40);     // Control byte for Data
098        for (i=1;i<=16;i++) {
099            iic_write(0xC0+i);      // Write ABCDE....
100        }
101        iic_stop();
102     
103        iic_start
();
104        iic_write(LCDADDR);  // I2C slave Adress
105        iic_write(0x00);     // Control byte for Instruction
106        iic_write(0xc0);     // DDRAM Address set to 10hex
107        iic_stop();
108     
109        iic_start
();
110        iic_write(LCDADDR);  // I2C slave Address
111        iic_write(0x40);     // Control byte for Data
112        for (i=1;i<=16;i++) {
113            iic_write(0xe0+i);      // Write abcde....
114        }
115        iic_stop();
116    }
117     
118     
119    
// Affiche deux lignes de texte
120    void Write_2lines(const rom char* t, const rom char*b) {
121        int i;
122        iic_start();
123        iic_write(LCDADDR);  // LCD's I2C slave Address
124        iic_write(0x00);     // Control byte for Instruction
125        iic_write(0x80);     // DDRAM Address set to 00hex
126        iic_stop();
127     
128        iic_start
();
129        iic_write(LCDADDR);  // I2C slave Adress
130        iic_write(0x40);     // Control byte for Data
131        for (i=0;i<16 && t[i] !=0;i++) {
132            iic_write(0x80+t[i]);      // Write ABCDE....
133        }
134        iic_stop();
135     
136        iic_start
();
137        iic_write(LCDADDR);  // I2C slave Adress
138        iic_write(0x00);     // Control byte for Instruction
139        iic_write(0xc0);     // DDRAM Address set to 10hex
140        iic_stop();
141     
142        iic_start
();
143        iic_write(LCDADDR);  // I2C slave Address
144        iic_write(0x40);     // Control byte for Data
145        for (i=0;i<16 && b[i] != 0;i++) {
146            iic_write(0x80+b[i]);      // Write abcde....
147        }
148        iic_stop();
149    }
150     
151     
152    void main
(void)
153    {
154        // PORTB en entrée numérique
155        TRISB = 0xFF;
156        ADCON1 = 0xE;
157     
158        
// En mode I2C Master, SSPADD contient la valeur de configuration
159        // du générateur de débit binaire (baud rate generator). La valeur
160        // suivante donne de bons résultats
161        SSPADD = 0x27;
162     
163        OpenI2C
(MASTER, SLEW_OFF);
164     
165        Display_init
();
166        //Write_text();
167        Write_2lines("I2C LCD Display ", "www.jacquet80.eu");
168     
169        for
(;;) {}
170    }

LCD en I²C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#33 Message par Jérémy » jeu. 27 août 2015 20:54

Bonsoir,

Merci Pat pour le lien . Je l'avais déjà essayé, mais par acquis de conscience, j’ai ré-essayé ce soir. Toujours rien, cet écran reste inexorablement vide!

Code : Tout sélectionner

#define LCD_ADDR 0x74           // 0b0111 0100
#define LCD_CLEAR 0x01          // 0b0000 0001

/*################################################################################*/
/*#########################     INITIALISATION     ###############################*/
/*################################################################################*/
void Ecran_init()              // routine d'initialisation page 64 de la DS
{
  
I2C1_Start();

  
I2C1_Wr(LCD_ADDR);          // Envoie l'adresse de l'esclave  0b0111 0100 = 0x74

  // Envoi CONTROL_Mode       // bit7 -> 0=last control byte, 1=another control byte
                              // bit6 -> 0=registre inst , 1=registre Data
  
I2C1_Wr(0b00000000);        // bit5à0 -> 0
                              // 0b00000000 = 0x00

  // Envoi d'un function_set  // bit7à5 valeurs fixes : 001
                              // bit4: 0:2x4bit, 1:8 bits
  
I2C1_Wr(0b00110100);        // bit3: 0 Non utilisé
                              // bit2: 0: 1ligne/32char, 1: 2lignes/16char
                              // bit1: 0: 1/18 multiplex, 1: 1/9 multiplex
                              // bit0: 0: standard instr., 1: extended instr.
                              // 0b00110100 = 0x34

  // Envoi d'un display_ctl   // bit7à3: valeur fixe : 00001
                              // bit2: 0:display off, 1:display On
  
I2C1_Wr(0b00001100);        // bit1: 0:cursor off, 1:cursor On
                              // bit0: 0:clignotement off, 1:On
                              // 0b00001110 = 0x0C

  // Envoi Entry_mode_set     // bit7à2: valeur fixe : 000001
                              // bit1: 0:Decremente l'adresse , 1:Incremente (curseur vers la droite)
  
I2C1_Wr(0b00000110);        // bit0: 0:No shift , 1: Shift display
                              // 0b00000110 = 0x06
  
I2C1_Wr(0x35);
  
I2C1_Wr(0x04);
  
I2C1_Wr(0x10);
  
I2C1_Wr(0x42);
  
I2C1_Wr(0x9f);
  
I2C1_Wr(0x34);

  
I2C1_Wr(0x80);
  
I2C1_Wr(0x02);
  
I2C1_Stop();                // Fin de l'I2C
}
/*################################################################################*/
/*######################     PROGRAMME PRINCIPAL     #############################*/
/*################################################################################*/
void main()
{

  
ANSELD  0;
  
PORTD 0;
  
TRISD 0;

  
Delay_ms(100);         // Attente  pour stabilisation apres l'allumage

  
I2C1_Init(100000);     // Initialisation de l'I2C

  
LATD 1;             // Allume une led pour declenchement analyseur logique
  
Ecran_init();          // On va initialiser notre écran


/*################################################################################*/
/*#########################     BOUCLE INFINIE     ###############################*/
/*################################################################################*/
  
while(1)
  {




   
// Affiche des caractères

        
int i;
        
I2C1_Start();
       
I2C1_Wr(LCD_ADDR);  // I2C slave Address
        
I2C1_Wr(0x00);     // Control byte for Instruction
       
I2C1_Wr(0x80);     // DDRAM Address set to 00hex
        
I2C1_Stop();

        
I2C1_Start();
        
I2C1_Wr(LCD_ADDR);  // I2C slave Adress
        
I2C1_Wr(0x40);     // Control byte for Data
        
for (i=1;i<=16;i++) {
            
I2C1_Wr(0xC0+i);      // Write ABCDE....
        
}
        
I2C1_Stop();

        
I2C1_Start();
        
I2C1_Wr(LCD_ADDR);  // I2C slave Adress
        
I2C1_Wr(0x00);     // Control byte for Instruction
        
I2C1_Wr(0xc0);     // DDRAM Address set to 10hex
        
I2C1_Stop();

        
I2C1_Start();
        
I2C1_Wr(LCD_ADDR);  // I2C slave Address
        
I2C1_Wr(0x40);     // Control byte for Data
        
for (i=1;i<=16;i++) {
            
I2C1_Wr(0xe0+i);      // Write abcde....
        
}
        
I2C1_Stop();


   
/* //------------------ INSTRUCTION POUR EFFACER L'ECRAN --------------------------
    I2C1_Start();
    I2C1_Wr(LCD_ADDR);      // Adresse esclave
    I2C1_Wr(0b10000000);    // on passe en  mode Control pour envoyer des instructions
    I2C1_Wr(LCD_CLEAR);     // Efface l'écran
    I2C1_Wr(LCD_HOME);      // replace le curseur au début
    I2C1_Stop();

    //------------------  ENVOI DES DATAS POUR AFFICHAGE  --------------------------
    I2C1_Start();
    I2C1_Wr( LCD_ADDR );      // Envoie l'adresse de l'esclave  0b01110100 = 0x74
    
    // Envoi DATA_Mode        // bit7 -> 0=last control byte, 1=another control byte
                              // bit6 -> 0=registre inst , 1=registre Data
    I2C1_Wr( 0b01000000 );    // bit5à0 -> 0
                              // 0b01000000 = 0x40

    I2C1_Wr(0x50 );           // Affiche la lettre "P"
    I2C1_Wr(0x48 );           // Affiche la lettre "H"
    I2C1_Wr(0x53 );           // Affiche la lettre "S"
    I2C1_Stop();

    //------------------  VERIFIE QUE LE PROGRAMME TOUNE  --------------------------
    LATD = 1;                // Allume une led test
    delay_ms(150);
    LATD = 0;                // Pour verifier que le programme tourne
    delay_ms(150);           // Je fais clignoter une led  */

  
}


J'ai bien évidemment essayé en changeant des variables entre chaque test . genre 0x00 en 0x80 . 0x34 en 0x35 etc ... toutes les variables qui pouvaient être ambiguë je les ai modifier .

Je crois que je suis obligé de poster sur futura , voir si quelqu'un connait ce module PCF2119 . Ça m’embête un peu de créer un forum , et d'aller cherche les soluces ailleurs 8-)

Mais vraiment la je sèche ! ca même avoir de caractères , je devrais voir le curseur à minima !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en I²C
Pat
Débutant
Débutant
Messages : 43
Enregistré en : juillet 2015

#34 Message par Pat » jeu. 27 août 2015 20:58

recopie la séquence tel qu'il l'a fait et aussi les stop et start.

Bon ok apparemment c est pareil

Test 0x76 à la place de 0x74 , si ça séquence est bonne il y plus que ça qui peut changer.

Tu es sur de ton câblage et des résistances de rappel ?

LCD en I²C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#35 Message par Jérémy » jeu. 27 août 2015 21:56

Test 0x76 à la place de 0x74 , si ça séquence est bonne il y plus que ça qui peut changer.

Oui j'ai essayé . RIEN !!!!

Quand je mets 0x76 en adresse slave, les accusés de réception ne se font pas à l'analyseur ( No ACK) . Je suis quasiment sur que mon adresse est 0x74 .

Tu es sur de ton câblage et des résistances de rappel ?

Je pense qu'en ayant ma trame I²C a l'analyseur , il n'y as pas de problème avec le hard . De plus je me sert des connectiques déjà existante sur ma plaque d'essai , à la place de l'eeprom j'ai branché l’écran pour me servir des R de pull up et de la tension !

Vraiment je sais plus quoi faire
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en I²C
Pat
Débutant
Débutant
Messages : 43
Enregistré en : juillet 2015

#36 Message par Pat » ven. 28 août 2015 11:05

temps de réponse 250ms
tu devrais attendre plusieurs secondes entre chaque boucle

tension d'alime 4V
max 4.2V !!


http://www.farnell.com/datasheets/1722538.pdf

LCD en I²C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#37 Message par Jérémy » ven. 28 août 2015 11:23

Bonjour Pat, et merci encore de continuer a m'aider en tout cas

J'en ai acheté 5 de ces écrans , ca m’embête de baisser les bras . Mais bon, j'ai posté sur FUTURA pour essayer de trouver des gens qui connaissent ce driver "particulier".

Je ne suis pas certain à 100% de mon montage hard. C'est possible mais ça me parait quand même peu probable . Je vais vous faire une photo + un schéma de ce que j'ai fait . exactement .

tension d'alime 4V
max 4.2V !!

J'alim tout en 3.3V sur ma carte . Schéma à suivre .

temps de réponse 250ms
tu devrais attendre plusieurs secondes entre chaque boucle

D'accord je mettrais une seconde de 1 delay pour le clignotement . c'est une bonne idée
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en I²C
Pat
Débutant
Débutant
Messages : 43
Enregistré en : juillet 2015

#38 Message par Pat » ven. 28 août 2015 11:59

delay_ms(150);
LATD = 0; // Pour verifier que le programme tourne
delay_ms(150); // Je fais clignoter une led */

}


met plus d' 1 seconde.
5 secondes par exemple
avec un coup flash sur une led pour voir quand sa boucle.

LCD en I²C
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3260
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#39 Message par paulfjujo » ven. 28 août 2015 14:40

bonjour,


j'ai trouvé un fil sur un LCD similaire BATRON
le probleme serait sur un decalage de 0xC0 des caracteres ! pour afficher 'A'
en fait le decalage de base serait plutot de 127
127 + 65 (code de A) =192 = 0xC0


Code : Tout sélectionner


The LCD display is working
.
There is indeed a difference in the Batron LCD display used in Avr Applnote AVR155, and the batron that i used.
AVR155 uses Batron BT21605V-SRE-I2C-COG
I Use BATRON BTHQ 21605AV
-YETF-LED04-I2C-5V
The 
..COG type means Chip-On-Glas. While
mine is an LCD mounted on a PCB
.
The contrast LCD reset and the Contrast steering signals are brought outside on the COG type. On the PCB version these features have to be set via I2C commands.
So the fact that my LCD screen stayed BLANK was due to a contrast problem.
After initialising the constrast Values the LCD worked.
You can find a list of initialisation command on the website DATA-MODULE AG
www
.data-module.de Click further on
- Support
- Driver
- PCF2119 BT21605
Here they are anyhow
.
//Initialisation sample and Ram writing routine for PCF2119
void Display_init(void)
{
Reset=1;
delay_ms(5);
Reset=0;
delay_ms(5000);
iic_start();
iic_write(0x76); // i2c slave Address
iic_write(0x00);    // Control byte for Instruction
iic_write(0x34);    // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
iic_write(0x0C); // D: Display on, C: curser off, B: blink off
iic_write(0x06);    // I/D: increment, S: no shift
iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
iic_write(0x04); // P: left to right, Q: top to bottom
iic_write(0x10); // TC1: 0, TC2: 0
iic_write(0x42); // HV Stages 3
iic_write(0x9f); // set Vlcd, store to VA
iic_write(0x34); // DL: 8 bits, M: two line, SL: 1:18, H: normal instruction set
iic_write(0x80); // DDRAM Address set to 00hex
iic_write(0x02); // return home
iic_stop();
}
void Write_text(void)
{
int i;
iic_start();
iic_write(0x76); // i2c slave Address
iic_write(0x00); // Control byte for Instruction
iic_write(0x80); // DDRAM Address set to 00hex
iic_stop();
iic_start();
iic_write(0x76); // i2c slave Adress
iic_write(0x40); // Control byte for Data
for (i=1;i<=16;i++)
{
iic_write(0xC0+i); // Write ABCDE....
}
iic_stop();
iic_start();
iic_write(0x76); // i2c slave Adress
iic_write(0x00); // Control byte for Instruction
iic_write(0xc0); // DDRAM Address set to 10hex
iic_stop();
iic_start();
iic_write(0x76); // i2c slave Address
iic_write(0x40); // Control byte for Data
for (i=1;i<=16;i++)
{
iic_write(0xe0+i); // Write abcde....
}
iic_stop();
}
void upside_down(void)
{
iic_start();
iic_write(0x76);
iic_write(0x00); // Control byte for Instruction
iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
iic_write(0x07); // P=1; Q=1;
iic_stop();
}
void normal(void)
{
iic_start();
iic_write(0x76);
iic_write(0x00); // Control byte for Instruction
iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
iic_write(0x04); // P=0; Q=0;
iic_stop();
}
Thanks for all reply's
Fabrizio
Aide toi, le ciel ou FantasPic t'aidera

LCD en I²C
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#40 Message par Jérémy » ven. 28 août 2015 14:55

Merci aussi paulfjujo ,

j'ai essayé ce code aussi, en le modifiant pour mikroC . Je reste persuadé qu'une fois qu'on aura réussit à afficher ( donc initialiser) le curseur ce sera bon.
Je crois que j’ai essayé tout les codes du net, en fait ! :lol:

Je me dis que ça ne peut etre qu'un probléme hard du coup . mes trames I2C ça c'est une certitude, elle partent bien, et comme j'ai l'ACK, normalement c'est quelle sont bien reçu ! donc je ne vois vraiment pas a part le contraste . Mais j’ai essayé d'incliner l’écran pour avoir un autre angle de vision , histoire de voir si je ne voyais pas un petit quelques choses s'affiché . Rien du tout sur tous les essais que j'ai fais .

PS : sur futura mon post a été fermé :oops: , je m'en doutais un peu !
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Bing [Bot] et 4 invités