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 : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#61 Message par Jérémy » dim. 30 août 2015 11:38

Je baisse les bras, et rend les armes !
Je vais en acheter d'autres !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en I²C
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#62 Message par paulfjujo » dim. 6 sept. 2015 11:42

bonjour,


Quand on bloque sur un sujet, il vaut mieux le laisser de coté pendant un moment,
et revenir dessus plus tard..
comme on dit, le nez dans le guidon, on ne voit plus rien.

Test en réel sur ton LCD , c'est effectivement plus facile de travailler avec l'objet en question, en main.

Testé OK avec un 18F87J50 , puis avec un 18F45K22 carte Ready for PIC.
Le point bloquant était sur la sequence intermediaire .
I2C1_STOP.. I2C1_START
remplacee par "I2C1_Repeated_Start() ;"

L'adresse est bien 0x74 (sur cet afficheur testé)
les caracteres à afficher doivent bien avoir un offset de 128 (0x80).

En sus l'UART1 géré via le FTDI sur la carte ,pour liaison en USB => terminal vitruel COMxx pour PC WIN8.1 (sans PORT COM RS232)
UART2 activé -> interface 2TR -> COMx PC win XP

attention: test fait avec PIC18F45K22 ayant un bootloader mikroC incorporé..

Version à ameliorer pour exploiter toutes les possiblites de cet afficheur , qui a l'avantage de bien fonctionner en 3,3V
et consomme tres peu . ( le backlight seul consomme 2,3mA (avec R serie =220 ohms).
Contrairement à un autre LCD déja testé sur cette carte COG16x2 ..qui ne marche plus sous 3,3V (5V only !)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

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

#63 Message par Jérémy » lun. 7 sept. 2015 08:48

Bonjour à tous,

Désolé pas présent ce weekend ( 40 ans d'une amie dans l’Ardèche) .

Génial ça , et Bravo à Paul, pour avoir réussis; Je n'ai plus qu'a essayer a mon tour ! . Je vous tiens très vite au courant . Ce soir je pense me jeter dessus a nouveau .
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 : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#64 Message par Jérémy » lun. 7 sept. 2015 21:59

:oops: :?

Bonsoir,

Bon j'accuse un peu de fatigue après un week-end chargé, mais après simplification à l’extrême de ton programme , ça ne fonctionne toujours pas .
Bon je désespère pas car si tu as réussis on devrais pouvoir y arriver. j'ai pas la force d'insister ce soir, je reprendrais mes investigations demain je pense .

Ton programme en PJ est ULTRA pêchu pour mon petit niveau .
Si tu as le temps de faire un programme qui affiche juste une lettre ce serait super sympa.
Il faut aussi que j'inverse le hard car mon connecteur est branché a l'opposé de celui de ta photo ! Histoire qu'on soit sur la même longueur d'onde .

Dans ton programme je ne comprends pas à quoi servent ces lignes :

Code : Tout sélectionner

j=I2C1_Wr(LCD_ADDR); // i2c slave Address
if (j!=0) return k;
k++;
Delay_ms(100);
j=I2C1_Wr(0x00);    // Control byte for Instruction
if (j>0) return k;
k++; 
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 : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#65 Message par Jérémy » mar. 8 sept. 2015 10:24

Alléluia

Enfin !!!!! Enfin j’ai des caractères qui s'affiche........ PWOUAAAAAAA, ça fait vraiment plaisir ça . Je vais etre obligé de sortir un Tuto sur ce module tellement j'ai galéré !!!

Je continue mes test et je vous tiens au courant et post le programme basic
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en I²C
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#66 Message par paulfjujo » mar. 8 sept. 2015 10:28

Code : Tout sélectionner


Dans ton programme je ne comprends pas à quoi servent ces lignes 
: 
CODE 
: TOUT SÉLECTIONNER
j
=I2C1_Wr(LCD_ADDR); // i2c slave Address
if (j!=0) return k;
k++;
Delay_ms(100);
j=I2C1_Wr(0x00);    // Control byte for Instruction
if (j>0) return k;
k++; 



cela servait au debugging , pour verifier que tous les pas de l'init ont été franchis sans probleme
mais tu peux virer ces morceaux, entre les instructions LCD

Code : Tout sélectionner


if 
(j!=0) return k;
k++;
Delay_ms(100);
 


Il faut aussi que j'inverse le hard car mon connecteur est branché a l'opposé de celui de ta photo !

PAS BESOIN !
dans l'init du LCD , activer la bonne ligne en fonction du connecteur utilisé

Code : Tout sélectionner

//I2C1_Wr(0x04); // P: left to right, Q: top to bottom    sur connecteur A
I2C1_Wr(0x06); // P: Right to left ,Q: top to bottom      sur connecteur B




:o il affiche "PWOUAAAAAAA" !

Bravo.
Aide toi, le ciel ou FantasPic t'aidera

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

#67 Message par Jérémy » mar. 8 sept. 2015 21:29

Bonsoir,

Tout le mérite te reviens . Je pense qu'il y avait plusieurs erreur , celle de repeated Start, mais aussi celle du contraste, sans paramétrages de celui ci , mon écran reste vide , même en l'inclinant pour voir en travers .

Concernant les deux broches effectivement ce n'est pas gênant il suffit seulement de retourner l'affichage soit avec la commande 0x06 ou 0x05 ( et non 0x04 comme indiqué) .

J'ai également augmenté la tension du Vlcd, car certain pixel étaient moins allumés que d'autres .

Bref c'est parfait au niveau de la config .

Cependant je sèche sur plusieurs points .

Le premier effectué un clear display : impossible !!! la commande est 0x01 , j'ai essayé de toutes les façons possibles , soit il n'y a aucun effet, soit l’écran ne s'affiche plus du tout .
Le second je n'arrive pas a déplacé le curseur pour par exemple affiché une lettre en plein milieu ? avec du vide autour par exemple.

Voici le programme ULTRA Simplifié ( au du moins le plus que j'ai pus).

Code : Tout sélectionner

/*##################################################################################
##############################     Variable / Constante    ###############################
###################################################################################*/
unsigned int i,j;               //  variable temporaire
unsigned char LCD_ADR 0x74;   // adresse de l'esclave I2C

sbit LED_RA4 at LATA4_bit;

/*##################################################################################
##########################    INITIALISATION DE L'ECRAN    ##############################
##################################################################################*/
    
int Display_init(void)
    {
        
Delay_ms(500);

        
I2C1_Start();

        
I2C1_Wr(LCD_ADR);     // Adresse de l'esclave

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

        // function_set       // bit7 à 5 valeurs fixes : 001
                              // bit4: 0:2x4bit, 1:8 bits
        
I2C1_Wr(0x34);        // 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

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

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

        // Extended instructions
        
I2C1_Wr(0x35);        // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set

        // Disp_config        // bit7à 2: valeur fixe : 000001
        
I2C1_Wr(0x05);        // bit1 : 0=left to right, 1=Right to left
                              // bit0 : 0=top to bottom  1=bottom to t

        // VLCD_SET           // Réglage du contraste  ##### OBLIGATOIRE #######
                              // bit7 : valeur fixe : 1
        
I2C1_Wr(0x97);        // bit6: 0=registre VA ; 1=registre VB
                              // bit5à 0: 000000 jusqu'a 111111 pour le contrtaste

        // Normal instruction
        
I2C1_Wr(0x34);        // DL: 8 bits, M: two line, SL: 1:18, H: normal instruction set

        
I2C1_Wr(0x80);        // DDRAM Address set to 00hex

        
I2C1_Wr(0x02);        // return home

        
I2C1_Stop();
    }

/*##################################################################################
############################   PROGRAMME PRINCIPAL    ###############################
##################################################################################*/
void main ()
{

  
TRISA 0b11101111 ;    // RA4 en sortie  pour la led
  
ANSELA=0;
  
LED_RA4 ;           // On eteint la LED

  
TRISC 0b10111101 ;    // RC1 output ,RC3,RC4 as input
  
ANSELC=0;


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

  
Display_init();        // Initialise et configure l'écran

  
65 ;               // Initialisation de j à 65 pour commencer avec les lettres


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

    
LED_RA4 0;       // Pour verifier que le programme tourne
    
Delay_ms(1000);    // On fait clignoter une led
    
LED_RA4 1;
    
Delay_ms(1000);

    
I2C1_Start();
    
I2C1_Wr(LCD_ADR);     // i2c slave Address
    
I2C1_Wr(0x00);        // Control byte for Instruction
    
I2C1_Wr(0x80);        // DDRAM Address set to 00hex
    
I2C1_Repeated_Start();
    
I2C1_Wr(LCD_ADR);     // i2c slave Adress
    
I2C1_Wr(0x40);        // Control byte for Data

      
I2C1_Wr(0x80+j);    // Write ABCDE....

    
j++;

    
I2C1_Repeated_Start() ;
    
I2C1_Wr(LCD_ADR);
    
I2C1_Wr(0x00);
    
I2C1_Wr(0xc0);
    
I2C1_Repeated_Start() ;
    
I2C1_Wr(LCD_ADR);
    
I2C1_Wr(0x40);

        
I2C1_Wr(0x80+j);

}
}
 


Voila le résultat :

http://www.dailymotion.com/video/x35n0gw

Un grand merci
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 : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#68 Message par Jérémy » mer. 9 sept. 2015 12:01

Bonjour à tous,

Je continue mes investigations , afin de mieux me familiariser avec ce genre d'écran , qui a le mérite d’être très pratique en I2C( seuelment 2 fils) , et peu gourmand en consommation et je rajouterais un gain de place aussi, car pas d'expendeur de bytes derrière.

Ne réussissant pas a effacer l’écran avec la fonction qui va bien:: j'ai rusé en créer une fonction , qui écrit un caractère vide sur toute la plage de l'écran .

Code : Tout sélectionner

  void efface_ecran()
  {
      char i = 0 ;          // Variable temporaire
      
      I2C1_Start
();         // Ouverture d'une Com I2C
      I2C1_Wr(LCD_ADR);     // Envoi de l'adresse esclave
      I2C1_Wr(0x00);        // Byte de controle pour envoyer une instruction
      I2C1_Wr(0x80);        // INSTRUC : position de l'ADDR du curseur 1ere ligne de 80 à 8F
      I2C1_Repeated_Start();// Repetition de l'ouverture de la com I2C
      I2C1_Wr(LCD_ADR);     // Envoi de l'adresse esclave
      I2C1_Wr(0x40);        // Byte de controle pour envoyer une DATA
        for ( i=0;i<=15;i++)// Boucle pour repeter 16 fois l'action sur la premiere ligne
       {
        I2C1_Wr(0xA0);      // Envoie d'un caractére "vide"
       }
       
      I2C1_Repeated_Start
();// Repetition de l'ouverture de la com I2C
      I2C1_Wr(LCD_ADR);     // Envoi de l'adresse esclave
      I2C1_Wr(0x00);        // Byte de controle pour envoyer une instruction
      I2C1_Wr(0xC0);        // INSTRUC : position de l'ADDR du curseur 2ieme ligne de C0 à CF
      I2C1_Repeated_Start();// Repetition de l'ouverture de la com I2C
      I2C1_Wr(LCD_ADR);     // Envoi de l'adresse esclave
      I2C1_Wr(0x40);        // Byte de controle pour envoyer une DATA
        for ( i=0;i<=15;i++)// Boucle pour repeter 16 fois l'action sur la deuxiéme ligne
       {
        I2C1_Wr(0xA0);      // Envoie d'un caractére "vide"
       }
   }


J'ai également réussis a changer l'adresse du curseur .

Par contre quelle est d’après vous la meilleur façon ou la plus pratique pour écrire du texte ?

Par exemple le fameux "HELLO WORLD" . Je pourrais l'écrire lettre par lettre mais c'est pas top , je suppose qu'il y a des solutions ?
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

#69 Message par Pat » mer. 9 sept. 2015 17:10

pour effacer faire code 1 attendre 2ms , puis code 6

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

#70 Message par Jérémy » mer. 9 sept. 2015 19:00

Oui Pat,

J'ai essayé de faire comme dans la DS, à savoir éteindre le display , effacer , et le rallumé . Sans succès . Je crois que je me mélange les pinceaux entre data et instructions .

Pourtant c'est bien des instructions ? les data ne sont la que pour ecrire ?

C'est toujours la même chose soit l'écran reste vide ( sans caractères) , soit il affiche les petites flèches comme sur la vidéo .
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

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