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 I2C
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 364
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#31 Message par venom » jeu. 12 avr. 2018 19:19 lien vers la Data-Sheet : Cliquez ici

Bonsoir,

Merci pour vos retours d'expérience. :wink: je vous avoue que vos de suppositions m'ont traverser l'esprit.

Pour ceux qui est de la breadbord, mon projet est loin, très loin d'être aboutit. C'est donc pour ça que je suis encore dessus :wink:

Et pour le délai, je vais tester ça et vous dire quoi
Merci






@++

LCD I2C
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1010
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#32 Message par paulfjujo » jeu. 12 avr. 2018 20:13 lien vers la Data-Sheet : Cliquez ici

au fait,

as-tu rajouté un circuit de reset (pin MCLR) sur ce PIC
(pas vu sur ton 1er schema)
le circuit RC permetant d' attendre la fin de mise sous tension pour démmarrer l'oscillateur le PIC

il est aussi possible d'associer le Power up timer = enable dans la config ..

exemple:

reset.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

LCD I2C
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 364
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#33 Message par venom » jeu. 12 avr. 2018 21:22 lien vers la Data-Sheet : Cliquez ici

Ah non, je n'ai pas un tel circuit de reset. :? J'ai juste une résistance sur MCLR.
Ok pour le Power up timer, je prend note :wink:
Merci






@++

LCD I2C
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 364
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#34 Message par venom » sam. 14 avr. 2018 20:21 lien vers la Data-Sheet : Cliquez ici

Bonsoir,

Bon j'ai ajouté un délai comme le dit paulfjujo + augmenter les délai déjà présent dans la procédure init du LCD Rien a faire. Je ne vois plus rien lol.

Je pensai une chose; si j'alimente le lcd avant sur une autre alim pensez-vous que ça puisse résoudre le problème ? En gros j'alimente le module pcf8574AT quelques seconde avant ma breadbord ou il y a le pic ?
Merci

Après le code n'est pas de moi, donc je ne saisis pas encore toutes les étapes. Et il est fait pour un LCD en 16x4 et moi j'ai un 16x2. Au cas où je préfère le préciser :wink:






@++

LCD I2C
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1010
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#35 Message par paulfjujo » sam. 14 avr. 2018 20:59 lien vers la Data-Sheet : Cliquez ici

venom a écrit :
Je pensai une chose; si j'alimente le lcd avant sur une autre alim pensez-vous que ça puisse résoudre le problème ? En gros j'alimente le module pcf8574AT quelques seconde avant ma breadbord ou il y a le pic ?



ça ne changera rien ...

pourtant au post #27 , il semblait que ton LCD affichait quelque chose ?

quelle est ta tension d'alimentation VCC ( et donc LCD) ?
Est-tu sur de ton FOSC ? 32MHz ?
remet un test tempo et led pour verifier

nota; la 1ere chos à faire dans le main()
est de regler FOSC .. ensuite les registres hardware ..

Code : Tout sélectionner

test FOSC visuel avec une  led

for 
(i=0;i<4;i++)
{
LED=1;
Delay_ms(2000);
LED=0;
Delay_ms(2000);
}


pour etre sur de la valeur FOSC (et de tous les delay qui suivent ..)
tu peux enlever toute la partie test adresses I2C ..puisque que le LCD est reconnu en 0x7E .


essaie d'adapter cette init, prevue pour un LCD 2116 2x16
qui est bien plus complete ..


Code : Tout sélectionner



int Display_init
(void)
{
int j,k;
k=0;
Delay_ms(500);
I2C1_Start();
j=I2C1_Wr(LCD_ADR); // 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++;
//Delay_ms(100);
I2C1_Wr(0x34);    // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
//Delay_ms(100);
I2C1_Wr(0x0C); // D: Display on, C: curser off, B: blink off
//Delay_ms(100);
I2C1_Wr(0x06);    // I/D: increment, S: no shift
//Delay_ms(100);
I2C1_Wr(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
//Delay_ms(100);
//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
//Delay_ms(100);
I2C1_Wr(0x11); // TC1: 0, TC0: 1
//Delay_ms(100);
I2C1_Wr(0x42); // HV Stages 3
//Delay_ms(100);
//I2C1_Wr(0x9f); // set Vlcd, store to VA
I2C1_Wr(0x96); // set Vlcd, store to VA
//Delay_ms(100);
j=I2C1_Wr(0x34); // DL: 8 bits, M: two line, SL: 1:18, H: normal instruction set
if (j>0) return k;
k++;
//Delay_ms(100);
j=I2C1_Wr(0x80); // DDRAM Address set to 00hex
if (j>0) return k;
k++;
//Delay_ms(100);
j=I2C1_Wr(0x02); // return home
if (j>0) return k;
k++;
//Delay_ms(100);
I2C1_Stop();
return k;
}
 


ou potasser ce document :

Afficheur_LCD.pdf
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

LCD I2C
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 364
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#36 Message par venom » dim. 15 avr. 2018 13:51 lien vers la Data-Sheet : Cliquez ici

Bonjour a tous,
paulfjujo a écrit :pourtant au post #27 , il semblait que ton LCD affichait quelque chose ?


Oui ça fonctionne mais pas a chaque démarrage de la breadbord :wink:

paulfjujo a écrit :quelle est ta tension d'alimentation VCC ( et donc LCD) ?

5V j'utilise les platines conçu pour les breadbords. Qui délivre du 5V ou 3.3V


Pour ce qui est de ta procédure int Display_init tu souhaite que le la mettre a la place de void I2C_LCD_Init() Si j'ai bien compris ?

Encore merci pour ta patience et tes explications. :+1: Je vais voir pour tester le fosc avec une led.

je vais potasser le PDF je vous tiens au courant (continue) :-D


Ps: vous allez me dire que je suis surement trop en avance par rapport a mes compétences :oops: Mais il y a t'il une "norme" pour choisir la vitesse de l'oscillation ? :oops: Je veux dire si je passe mon projet en 4Mhz par exemple. Sa change quoi concrètement ? Désolé de mes maigres connaissances. car un projet a lcd n'est pas le même qu'un projet a led. Je sais que l'oscillation fait varié l’exécution du code, mais quel valeur mettre en fonction du projet ?
Si vous avez un bon french tuto je suis preneur :sifflotte:






@++

LCD I2C
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1010
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#37 Message par paulfjujo » dim. 15 avr. 2018 15:35 lien vers la Data-Sheet : Cliquez ici

venom a écrit : Mais il y a t'il une "norme" pour choisir la vitesse de l'oscillation ? :oops: Je veux dire si je passe mon projet en 4Mhz par exemple. Sa change quoi concrètement ?


On choisit la frequence d'horloge en fonction des contraintes imposées par un cahier des charges ( qui definit les details du projet),
d'un temps d'execution imperativement inferieur à une certaine limite ..
ou tout un tas de fonction à realiser en un temps imparti.

Dans ton cas, y a pas le feu au lac ..d'autant que qand on veut afficher un resultat sur un LCD, il faut mettre une tempo
pour avoir le temps de le visualiser ..

donc 32MHz n'est pas un bon choix , dans ce cas là.
4MHz nettement suffisant et assez couramment utilisé.

NE PAS OUBLIER de definir FOSC dans le projet .. qui conditionne les valeurs reelle des delais (Delay_ms(xx);
ou le fonctionnement d'un UART (vitesse en bauds)

***********************************

dans cet autre exemple d'init d'un afficheur 2x16 cars,
Init LCD en mode 8 bits !pour pouvoir ensuite le passer en mode 4 bits...
dans cet exemple, il est plus facile de lire la commande envoyée au LCD, que
que de voir une succession , combinaison logique avec des OU

et il ne faut pas oublier d' ACTIVER l'ecran en fin d'init
avec LCD_putcmd(0x0C,1);


Code : Tout sélectionner



void LCD_init_2x16
(void)
{
  // Wait for more than 15 ms after VCC rises to 4.5 V
  Delay_ms(1000);
  // Send Command 0x30
  LCD_putcmd(0x30,0);
  // Wait for more than 4.1 ms
  Delay_ms(100);
  // Send Command 0x30
  LCD_putcmd(0x30,0);
  // Wait for more than 100 us
  Delay_ms(100);
  // Send Command 0x30
  LCD_putcmd(0x30,0);
    Delay_ms(100);
  // Function set: Set interface to be 4 bits long (only 1 cycle write).
  LCD_putcmd(0x25,0);
    Delay_ms(20);
  // Function set: DL=0;Interface is 4 bits, N=1; 2 Lines, F=0; 5x8 dots font)
  LCD_putcmd(0x28,1);
    Delay_ms(20);
  // Display Off: D=0; Display off, C=0; Cursor Off, B=0; Blinking Off
  LCD_putcmd(0x08,1);
    Delay_ms(20);
  // Display Clear
  LCD_putcmd(LCD_CLEAR,1);
    Delay_ms(100);
  // Entry Mode Set: I/D=1; Increament, S=0; No shift
  LCD_putcmd(0x06,1);
    Delay_ms(20);
  // Display On, Cursor Off
  LCD_putcmd(0x0C,1);
    Delay_ms(20);
}



un cas similaire ICI

LCD I2C
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 364
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#38 Message par venom » dim. 15 avr. 2018 21:57 lien vers la Data-Sheet : Cliquez ici

Merci pour tes précisions paulfjujo. J'en prend note, j’avoue ne pas voir fait de cahier des charges :oops:
Merci pour tes exemples de code (tu est une vrai mine d'or a code) :-D D'ailleurs dans mes recherches je retombe souvent sur ton site. :sifflotte:

Je vais mettre tout ça à plat.






@++

LCD I2C
venom
Avatar de l’utilisateur
Passioné
Passioné
Messages : 364
Âge : 32
Enregistré en : avril 2016
Localisation : . <------ ici
Contact :

#39 Message par venom » mar. 17 avr. 2018 22:49 lien vers la Data-Sheet : Cliquez ici

Bonjour,

Bon j'ai un peu regarder, pour le moment j'ai laisser le code tel quel. J'y ai juste ajouter la boucle pour faire clignoter une led. Voici mes 2 cas de figure :
1er test j'ai fait ainsi :

Code : Tout sélectionner

void main() {
    OSCCON = 0b01101000;                   // configuration OSCCON interne 4mhz
                                           
    ANSEL  
= 0;                            // Configure AN pins as digital I/O
    ANSELH = 0;
    TRISC = 0x00;
    PORTC = 0x00;
    
    
      
//test FOSC visuel avec une  led
      for (i=0;i<4;i++)
      {
       LED=1;
        Delay_ms(2000);
       LED=0;
        Delay_ms(2000);
      }



    I2C1_Init(100000);
    Delay_ms(500);                         // laisser le temps au LCD de s'alimenter correctement
    
    I2C_LCD_Init
();
    I2C_LCD_Cmd(_LCD_CURSOR_OFF);
    I2C_LCD_Cmd(_LCD_CLEAR);
    I2C_Lcd_Out(1,1,txt1);                 // Write text in first row
    I2C_Lcd_Out(2,1,txt2);                 // Write text in second row

    while(1) {

    }
}


Quand je fait ce-ci, la led ne s'allume pas et le texte ne s'affiche pas. :mur:


Quand je fait ça :

Code : Tout sélectionner

void main() {
    OSCCON = 0b01101000;                   // configuration OSCCON interne 4mhz
                                           
    ANSEL  
= 0;                            // Configure AN pins as digital I/O
    ANSELH = 0;
    TRISC = 0x00;
    PORTC = 0x00;


    I2C1_Init(100000);
    Delay_ms(500);                         // laisser le temps au LCD de s'alimenter correctement
    
    I2C_LCD_Init
();
    I2C_LCD_Cmd(_LCD_CURSOR_OFF);
    I2C_LCD_Cmd(_LCD_CLEAR);
    I2C_Lcd_Out(1,1,txt1);                 // Write text in first row
    I2C_Lcd_Out(2,1,txt2);                 // Write text in second row

    while(1) {

     //test FOSC visuel avec une  led
      for (i=0;i<4;i++)
      {
       LED=1;
        Delay_ms(2000);
       LED=0;
        Delay_ms(2000);
      }
      
    
}
}


La led se met bien a clignoter pendant 2 secondes quand le texte s'affiche bien a l’écran :?
Dans ce deuxième cas, j'ai l'impression que quand la communication i2c ne passent pas le code reste bloquer dans I2C_LCD_Init() ??
Et quand la communication i2c passe, le code boucle bien. Ma réflexion est elle bonne ?






@++

LCD I2C
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1010
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#40 Message par paulfjujo » mer. 18 avr. 2018 20:36 lien vers la Data-Sheet : Cliquez ici

bonsoir,


Comment est defini LED ?
sur quel port, et quelle pin

pour l'I2C
mets TRISC=0xFF; // en entree par defaut

I2C1_Init(100000);
se charge de configurer les pins ...


Retourner vers « Langage C »

Qui est en ligne

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