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
Pat
Débutant
Débutant
Messages : 43
Enregistré en : juillet 2015

#21 Message par Pat » mer. 26 août 2015 11:14

I2C1_Wr( 0b01000000 ); // 0x40 Envoi d'un byte control pour écrire des données


toujours pas corrigé !!!!!!!
I2C1_Wr( 0b10000000 );

0x74 définit sA0 à la masse !
Il y est ?

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 :

#22 Message par Jérémy » mer. 26 août 2015 11:57

toujours pas corrigé !!!!!!!
I2C1_Wr( 0b10000000 ); 

Oups !! . Je pense que c'est une bonne piste.

Ce sera la première chose que je testerais ce soir .

0x74 définit sA0 à la masse !
Il y est ?

J'ai du fonctionner par test , pour en conclure qu'il l’était à la masse, car je n'ai aucun accès à cette broche.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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 :

#23 Message par Jérémy » mer. 26 août 2015 18:34

Pat a écrit :Source du message toujours pas corrigé !!!!!!!
I2C1_Wr( 0b10000000 );


Toujours pas !! . Je commence sérieusement à désespérer de la voir afficher un caractère un jour !

Comme il y a , deux control byte pour la phase d'initialisation j'ai essayer toutes les combinaisons possibles .

J'avais pensé aussi a la fonction contraste, mais d’après ce que j'ai cru comprendre en lisant la DS, après un démarrage par défaut le Vlcd est mis sur oFF pour la gestion de celui ci . Donc je ne devrais pas m'en préoccupé non ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

#24 Message par paulfjujo » mer. 26 août 2015 20:17

bonsoir,


Ma curiosité m'a poussé à jeter un oeil sur la DOC p67-68
ou effectivement le mode I2C est décrit.
Je ne peux malheureusement pas tester le code suivant.. pas de PCF2119 ,ni de simulateur.

Le mode de commande de ton LCD en I2C est relativement transparent pour l'utilisateur,
contrairement à celui necessiatnt un module externe genre PCF8574 .. qui complique bien plus.

Je pense , come PAT, qu'il faut utiliser le STOP au niveau de l'I2C, ne serait que du coté PIC,
pour ne pas perturber l'I2C hardware de celui ci, ne pas oublier qui est le MAITRE : le PIC !

Le LCD a 2 modes , comme tous les autres LCD classiques
Le mode commande .. Clear,Home, deplacer le curseur
et le mode Data pour ecrire un caractere en zone DDRAM ..donc affiché ensuite.
j'ai modifié le code Control qui etait à 0, par CTRL_Mode = 0x80

Dans la boucle while du main programme
il faut bien repositionner le curseur au debut de l'ecran ..ou ailleurs
car avec l'auto increment l'affichage peut "couler "dehors!

nota: usage de LAT au lieu de PORT pour les sorties 18F ...
meme si PORT peut marcher.. evitera de futurs problemes

à tester .. sans garantie !

rajouter eventuellement un petit delay entre chaque ecriture de caractere


Code : Tout sélectionner




#define LCD_ADDR 0x74           // 0b0111 0100
#define LCD_CLEAR 0x01          // 0b0000 0001
#define LCD_HOME  0x02          // 0b0000 0010
#define CTRL_Mode 0x80
#define Function_set 0x20       // 0b0010 0000
#define Display_ctl 0x0E        // 0b0000 1110
#define Entry_mode_set 0x06     // 0b0000 0110
#define DATA_mode  0x40



unsigned int i,j,k;



void Ecran_init()              // routine d'initialisation page 64 de la DS
{
  Delay_ms(50);                // Attente apres l'allumage
  I2C1_Start();
  I2C1_Wr( LCD_ADDR );          // Envoie l'adresse de l'esclave
  Delay_ms(5);
  I2C1_Wr( CTRL_Mode );      // Envoi byte control pour ecrire des fonctions
  Delay_ms(5);
  I2C1_Wr( Function_set );      // Envoi d'un byte function_set
  Delay_ms(5);
  I2C1_Wr( Display_ctl );       // Envoi d'un byte control
  Delay_ms(5);
  I2C1_Wr( Entry_mode_set );    // Envoi d'un Entry_mode_set
  Delay_ms(5);
  I2C1_Stop();
 }




void main()
 {

  ANSELB  = 0;                // Configure les broches en digital
  ANSELC  = 0;
  ANSELE  = 0;

  PORTB = 0;                 // PORTB en sortie
  PORTC = 0;
  PORTE = 0;

  TRISB = 0;                 // Mise a 0 du port B
  TRISC = 0;
  TRISE = 0;


  Delay_ms(150);         // Attente pour stabilisation

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

  Ecran_init();          // Initialisation du LCD


  while(1)
  {
    I2C1_Start();
    I2C1_Wr( LCD_ADDR );
    
    I2C1_Wr
(CTRL_mode);
    I2C1_Wr(LCD_HOME);
    
    I2C1_Wr
(DATA_mode);
    I2C1_Wr(0x50 );         // Affiche la lettre "P"
    I2C1_Wr(0x48 );         // Affiche la lettre "H"
    I2C1_Wr('I');         // Affiche la lettre "I"
    I2C1_Wr('L');
    I2C1_Wr('I');
    I2C1_Wr('P');
    I2C1_Wr('S');
    I2C1_Stop();

    LATE_bit0= 0;             // Pour verifier que le programme tourne
    Delay_ms(500);          // Je fais clignoter une led
    LATE_bit0= 1;
    Delay_ms(500);

  }
}
 
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 :

#25 Message par Jérémy » mer. 26 août 2015 20:34

Bonsoir,

:(

Toujours pas. la led ne clignote pas. mais je pense que le secret de ce maudit écran est par la .

Je vérifie ton code ligne par ligne et je reviens.

quand tu ecris "j'ai regarder page 66/67",mais ces lignes ne sont pas applicable pour l'I²C ?

Table 46. Initialization by instruction, 4-bit interface; not applicable for I2C-bus operation
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

#26 Message par Pat » mer. 26 août 2015 22:10

pour le HD44780 quand on passe en mode 4 bits, il faut envoyer 2 commandes pour faire 8 bits et selon le câblage ce sont les poids fort ou poids faibles

par exemple on veut envoyer
0x1234
en poids forts
0x1200
0X3400

en poids faible
0X0012
0x0034



il vaudrait mieux rester en mode 8 bits ...

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 :

#27 Message par Jérémy » mer. 26 août 2015 22:31

il vaudrait mieux rester en mode 8 bits ...

Oui t u as raison, mais on à jamais de mode . j'indiquais juste que les pages qu'indiquait paulfjujo etait pour le mode 4 bit et non pour l'I2C .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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 :

#28 Message par Jérémy » jeu. 27 août 2015 00:52

Je donne ma langue au chat, pour un premier projet , c'est plutôt raté ! je n'arrive même pas à faire fonctionner un LCD.

J'ai essayer plein de combinaison, voir toutes . avec le control bite et les autre aussi . Aucune n'a fonctionnées. j'ai testé plein de code du net et essayer de les adapter à mikroC, sans succès . J'ai respecter à la lettre l'exemple de la DS , RIEN .

Il y à forcement quelques chose qui nous échappe . MAIS quoi ! ? le contraste , je pense pas . Y'a une histoire de stockage de données en DDRAM que j'ai pas compris . Ne faudrait-il pas aller les lires pour les affichées, un truc du genre ?
cette histoire de control_byte a 0x80 plutot que 0x00 , j'ai pas compris non plus l'interet du bit 7 de cette fonction ( CO)

Ce qui m'agace ce que même sans écrire une lettre, je devrais voir mon curseur apparaitre au bout de 3 commandes seulement !! je comprends pas ...

J'ai commenter mon programme, corrigé les erreurs ca donne ca.

Code : Tout sélectionner

#define LCD_ADDR 0x74           // 0b0111 0100
#define LCD_CLEAR 0x01          // 0b0000 0001
#define LCD_HOME  0x02          // 0b0000 0010
#define Control_byte 0x00       // 0b0000 0000
#define Function_set 0x34       // 0b0011 0000
#define Display_ctl 0x0E        // 0b0000 1110
#define Entry_mode_set 0x06     // 0b0000 0110


/*################################################################################*/
/*#########################     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=dernier octet de la série, 1=d'autre octet vont suivre après celui ci.
                              // bit6 -> 0=registre inst , 1=registre Data
  I2C1_Wr(0b10000000);        // bit5à0 -> 0
                              // 0b10000000 = 0x80

  // 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(0b00001110);        // bit1: 0:cursor off, 1:cursor On
                              // bit0: 0:clignotement off, 1:On
                              // 0b00001110 = 0x0E

  // 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_Stop();                // Fin de l'I2C
}
/*################################################################################*/
/*######################     PROGRAMME PRINCIPAL     #############################*/
/*################################################################################*/
void main()
{
  ANSELB  = 0;           // Configure les broches en digital
  ANSELC  = 0;
  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)
  {
    //------------------ 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

  }
}


- A l'analyseur logique , les trames sont parfaites et renvoyés avec l'ACK .
- J'ai changer d'écran , le résultat est le même , au cas ou ils sotn defectueux .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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 :

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

Après RE-RE-RE-RE lecture, j'ai insisté sur les points qui me paraissait flous .

par exemple ce fameux bytes C0 ( bit 7) du "CONTROL_MODE"
Je viens de comprendre que quand il est à 1 , cela signifie que derrière l'octet il y aura encore une commande de contrôle, si on le met à 0, cela signifie que ce byte est le dernier de la série ;
Mais cela veut dire aussi qu'il faut mettre un control_mode avant chaque fonction ?

Un autre truc ma chagrine, Pourquoi on écrit "I2C1" ? car il y a plusieurs I2C sur le PIC18F45K22 .
Que signifie cette ligne "I2C1_Init(100000);"

Sinon sur la démarche et le déroulement, je ne trouve pas de probléme.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

#30 Message par paulfjujo » jeu. 27 août 2015 11:40

j'indiquais juste que les pages qu'indiquait paulfjujo etait pour le mode 4 bit et non pour l'I2C .


je me suis trompé sur le numero des pages, mais c'est bien sur l'exemple Table 44 I2C
pages 64 et 65 que je me suis basé !

extended mode ...

Code : Tout sélectionner

I2C1_Wr(0b00100100);   //  =0x24 .... was 0x34  !      
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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