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 avec driver PCF2119
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » dim. 23 août 2015 22:50

Bonsoir à tous,

Voila ce qui m’amène , j'ai acheté des écrans LCD commandé en I²C ( car j'ai besoin de garder l'UART pour autre chose) . Ayant démarré la programmation avec des PICAXE (1ans 1/2 ), j'ai essayé avec ceux ci . Mais je n'ai pas réussis à trouver suffisamment d'aide ( peu répandu les picaxes) pour les faire fonctionner.

Donc je demandais si quelqu'un d'entre vous se sentait en mesure de me filer un coup de main pour réussir à faire fonctionner ces maudits LCD avec un PIC 18F45K22. Mais je n'ai encore jamais fais d'I²C avec des PIC . Ce sera l'occasion de sortir un Tuto si jamais on y arrive .

Voila si vous voulez me guider dans la création d'un programme qui affiche le fameux "Hello World !" , ce serait vraiment sympa.
Image

Pour commencer avec le Hard, je pense pouvoir branché mon LCD sur ma carte EasyPIC, grâce aux connections MikroBUS ( prévues pour des modules en option ), je vais recherché le courant qu'elle peuvent délivrées , il ne s'agirait pas de les cramer.

Il manque l'essentiel pour commencer quoi que se soit, les DS :
L'ecran LCD
Le driver PCF2119

Dans la DS vous pouvez vous rendre directement à la page 44/45 et après la 64-66, je pense que c'est les pages qui nous intéresse le plus . ( Je dis ça pour vous éviter de vous taper les 88 pages) .

Merci à vous si vous trouvez un peu de temps pour m'aider !
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 :

#2 Message par paulfjujo » lun. 24 août 2015 11:27

bonjour,


Peux-tu poster ce que tu as déja fait, ton projet complet (zip)
y compris les bits de config

bien verifier :

l'adresse du LCD
en fonction de la connection SA0
l'adresse de base I2C peut etre
0x74 en ecriture et 0x75 en lecture si SAO=0
ou 0x76 en ecriture ou 0x77 en lecture si SAO=1

Resistance de 2,7K à 4,7K pour tirage SCL et SDA au +5V


ce qui est bizarre c'est que sur le (schema) diagramme LCD , on ne voit pas cette entree SA0
mais ce n'est pas un "vrai" schema!
j'avoue ne pas avoir passé trop de temps à lire la datasheet complet..


tu peux extraire la partie utile de ce projet
en modifiant l'adresse I2C du LCD.
Les fonctions LCD devraient etre semblables .
testé OK aussi avec u 16F1847 et un petit PIC 12F1840.
Aide toi, le ciel ou FantasPic t'aidera

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

#3 Message par Jérémy » lun. 24 août 2015 13:51

Bonjour et merci Paulfjujo,

Peux-tu poster ce que tu as déjà fait, ton projet complet (zip)

Avec les PIC je n'ai encore rien fais , seulement avec les Picaxes qui se programme en Basic . Donc les lignes de code ne seront pas forcement très parlantes

Voici ce que ca donne, il ne faut pas prendre à la lettre , j'ai essayé des dizaines de choses , de configuration etc ...
[spoil]'#################################### Configuration I/O ####################################
symbol compteur = b2
symbol address = w27

'#################################### Initialisation ####################################
setfreq M8

hi2csetup i2cmaster, %0111010 , i2cfast, i2cbyte ' configuration en maitre avec l'adresse de l'esclave . le bit0 est rajouter automatiquement

pause 300

'#################################### Programme Principal ####################################

hi2cout (%01110100) ' Slave address
pause 10

hi2cout (%00000000) ' control byte
pause 10

hi2cout (%00100000) ' Set fonction
pause 10

hi2cout (%00001110) ' Display_ctl notmalement la deja je devrais voir le curseur clignoter . Rien donc ca bug avant surement !
pause 10

hi2cout (%00000110) ' Entry_mode_set
pause 10

' For writing data to DDRAM, RS must be set to 1; therefore a control byte is needed
' Pour ecrire des données sur la RAM le bit RS doit etre mis à 1 . Mais avant un "controle byte" est nécessaire

hi2cout (%01110100) ' Slave address
pause 10

hi2cout (%01000000) ' control byte on passe RS à 1
pause 10

'#################################### Boucle ####################################
do ' Boucle infinie

hi2cout (%01010000) ' write_data , ici on ecrit un "P", le curseur est automatiquement incrementer et décaler vers la droite .
pause 5
hi2cout (%01001000) ' write_data , ici on ecrit un "H"
pause 5


loop[/spoil]

l'adresse du LCD en fonction de la connection SA0

J'ai essayé avec les deux adresses possibles étant donné que je n'ai pas accès à SA0
Resistance de 2,7K à 4,7K pour tirage SCL et SDA au +5V

Quand j'ai fais mes premiers tests, elles y étaient , mais à 3.3V car l'ecran fonctionne en 3.3V

ce qui est bizarre c'est que sur le (schema) diagramme LCD , on ne voit pas cette entree SA0

Oui je l'ai dans la main, et je ne vois pas de broches SA0

tu peux extraire la partie utile de ce projet en modifiant l'adresse I2C du LCD.

Oui c'est pour cela que j'ai fais appelle à toi . Donc tu veut que j'essaye de reecrire le même programme seulement en changeant l'adresse esclave ? c'est bien ca ?

Pour ne pas te taper toutes les pages, je pense que tu peux aller directement à la page 44 et 45 , il parle du protocole I²C utilisé . Apparement il n'est pas "courant" , plus precisement dans le Paragraphe 11.2.1
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 :

#4 Message par paulfjujo » lun. 24 août 2015 18:01

Jérémy a écrit :Source du message Oui c'est pour cela que j'ai fais appelle à toi . Donc tu veut que j'essaye de reecrire le même programme seulement en changeant l'adresse esclave ? c'est bien ca ?


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

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

#5 Message par Jérémy » lun. 24 août 2015 18:23

Ok ca marche , je fais ça tout de suite et je post le programme.
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

#6 Message par Pat » lun. 24 août 2015 19:49

il ne faut pas confondre UART et I2C c'est pas du tout pareil !

L'adresse 0xA0 c est généralement une EEPROM genre 24Cxx, pour l'afficheu,r il y en a surement une autre , voir le datasheet.
Cette est dans le protocole de communication ce n'est pas hard
Sur les eeproms il y a la possibilité de mettre en plus 1 à trois fils hard ce qui permet de mettre 2 exp 3 soit 8 chips sur le même bus.
peut être que le LCd n'a qu'une seule et unique adresse.

Sur le premier site trouvé sur ggogle , il dit 0x27;
http://www.pobot.org/LCD-sur-I2C-simplement.html

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

#7 Message par paulfjujo » lun. 24 août 2015 20:18

bonsoir


L'adresse 0x27 est pour un LCD equipé de :
//#define LCD_ADDR 0x27 // PCF85741


mon LCD 4x20 avec PCF8754 repond à l'adresse

Code : Tout sélectionner

[b] 0x4E[/b] ( car  PCF8574  avec et A0,A1,A2 reliees au +VCC)
#define LCD_ADDR 0x4E     // PCF8574 on pigboard YwRobot back located  on LCD4x20
// PCF8574 I2C LCD Port Definition
// P7,P6,P5,P4 = Data, P3=Backlight (BL), P2=E, P1=RW, P0=RS


le probleme est aussi de verifier l'affectation des 4 bits datas
et des 2 ou 3 bits de commande
qui serait interne au circuit LCD, puisqu'il n'y a pas de PCF .. externe

la doc technique de son LCD donne :

LCD_adresse.jpg


adresse I2C : 0x74 ou 0x76 ...

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

#8 Message par Jérémy » lun. 24 août 2015 20:52

Bon, dis donc c'est du lourd ton programme , chapeau . Malheureusement j'ai pas compris grand chose . Je débute en PIC !!

Alors j'a iquand même essayé de faire ceci :
j'ai repéré ceci(ligne 98):

Code : Tout sélectionner

#define LCD_ADDR 0x4E   

et j'ai remplacé par

Code : Tout sélectionner

#define LCD_ADDR 0x74   


Lors de la compilation j'ai eu des erreurs .

j'ai du supprimer :

Code : Tout sélectionner

sbit LED_Sup at LATB3_bit;
sbit LED_Inf at LATA1_bit;
  LED_Sup=0;
  LED_Inf=0;


Code : Tout sélectionner

unsigned char readbuff[64]  absolute 0x500; 
  HID_Enable
(&readbuff,&writebuff);  
     LCD_puts
( &readbuff);
        k=strlen(&readbuff);


ça ne s’arrête jamais, d'avoir des problèmes de compilations ; j'ai supprimer la moitie du programme et ça ne compile toujours pas .

Je vais essayer ne gardant que la partie I2C pourvoir si j'arrive a vous montrer quelques choses
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 : 2722
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#9 Message par Jérémy » lun. 24 août 2015 20:59

Pat a écrit :Source du message Sur le premier site trouvé sur ggogle , il dit 0x27;

PAt tu te trompe de driver , sur mon LCd il s'agit d'un PCF2119 et non d'un PCF8574 de ton lien

@Paulfjujo : je pense que la solution ce trouve dans ces lignes que je n'arrive pas a comprendre correctement !:

Bit 1 of the slave address byte, that a PCF2119x will respond to, is defined by the level tied to its SA0 input (VSS for logic 0 and VDD for logic 1).
Before any data is transmitted on the I2C-bus, the device which should respond is addressed first. The addressing is always carried out with the first byte ransmitted after the START procedure.


En page 27 il parle de ca aussi , qui me parait important .

When using the I2C-bus, the instruction has to be commenced with a control byte as shown in Ta b l e 9. Details about the I2C-bus interface can be ound in Section 11.2. An example of operations on the I2C-bus is given in Ta b l e 4 4.
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 : 2722
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#10 Message par Jérémy » lun. 24 août 2015 23:36

Bonsoir,

Pardonnez mes essais infructueux de débutants.

j'ai essayé de m'inspirer de ton code paulfjujo, en le modifiant et surtout en le simplifiant. je me suis également inspiré de la DS du PCF2119 et de l'exemple qu'il donne en page 64 .

Niveau HARD j'ai fabriquer un câble pour me connecter un port MiroBUS ( image de mon #1).
J'ai activé les Pull-UP sur la plaque easyPIC pour RC3 et RC4 ( SDA et SCL).

j'avoue avoir un doute sur un switch d'un cote c'est marqué SDA et SCL , et de l'autre je bascule en RC3 et RC4. J'ai laissé sur SDA et SCL.

Voila ce que j'ai fais .

Déjà l'adresse à de forte change d'être 0x74 . quand je mets 0x76 ma led test ne clignote pas,et le programme est comme bloqué ! avec 0x74 comme adresse esclave de l'écran ça clignote bien .

Code : Tout sélectionner



#define LCD_ADDR 0x74           // ou 0x76 définition de l’adresse esclave du PCF2119
#define LCD_CLEAR 0x01          // 0b0000 0001
#define LCD_HOME  0x02          // 0b0000 0010
#define Control_byte 0x00       // 0b0000 0000
#define Function_set 0x20       // 0b0010 0000
#define Display_ctl 0x0E        // 0b0000 1110
#define Entry_mode_set 0x06     // 0b0000 0110


void Ecran_init()              // routine d'initialisation page 64 de la DS
{
  
Delay_ms(500);                // Attente apres l'allumage
  
I2C1_Start();
  
I2C1_WrLCD_ADDR );          // Envoie l'adresse de l'esclave
  
Delay_ms(10);
  
I2C1_WrControl_byte );      // Envoi byte control pour ecrire des fonctions
  
Delay_ms(10);
  
I2C1_WrFunction_set );      // Envoi d'un byte function_set
  
Delay_ms(10);
  
I2C1_WrDisplay_ctl );       // Envoi d'un byte control
  
Delay_ms(10);
  
I2C1_WrEntry_mode_set );    // Envoi d'un Entry_mode_set
  
Delay_ms(10);
  
I2C1_Start();
  
Delay_ms(10);
  
I2C1_WrLCD_ADDR );
  
Delay_ms(10);
  
I2C1_Wr0b01000000 );      // Envoi d'un byte control pour écrire des données
  
Delay_ms(10);
 }

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_Wr(0x50 );         // Affiche la lettre "P"
    I2C1_Wr(0x48 );         // Affiche la lettre "H"
    
    PORTE 
= 0;              // Pour vérifier que le programme tourne
    delay_ms(100);          // Je fais clignoter une led
    PORTE = 1;
    delay_ms(100);
  }
}


L’écran est avec le rétro éclairage. Tout s'allume bien, mais rien ne s'affiche.
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 48 invités