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

librairie lcd.h

https://circuitdigest.com/microcontroller-projects/16x2-lcd-interfacing-with-pic-microcontroller

Idée, bugs, propositions .......
jym83
Membre
Membre
Messages : 10
Enregistré en : novembre 2023

librairie lcd.h

Messagepar jym83 » sam. 23 déc. 2023 17:11

Bonjour à toutes et tous,

j'ai déjà qq expérience en prgrammations diverses (vb, python, arduino) je découvre les pics.
j'utilise mplabx (V6.10) et xc8 (V2.41) . j'essaie de travailler avec du pic16f628A et/ou du 16f84A (parceque j'en ai..)
j'ai trouvé sur le net des exemples et j'ai pu faire fonctiionner des bricoles avec des leds et des transistors, ça fonctionne.
Mon problème :
je voudrais faire fonctionner ce pic avec un afficheur LCD 1602 classique de base.
J'ai trouvé sur le net pas mal d'exemples avec l'utilisation d'une librairie LCD.h/lcd.c
problème : je n'ai pas touvé comment inclure cette librairie sur mon PC.
La commande #include<lcd.h> me donne l'erreur file not found.
y a t'il un lieu où télécharger les librairies (comme arduino..)
cette librairie semble "native" avec mplab, y a t'il un chemin à spécifier?

J'ai aussi trouvé un code qui inclu une pseudo librairie (les fonctions de l'écran sont dans des void du main). Je n'arrive pas à faire fonctionner ce code écrit initialement pour un 877A sur mon 628A. (j'ai changé les affectations des pins). ça se compile, ça se téléverse, mais ça ne fait ..rien.

Merci pour un conseil éclairé qui pourrait me faire avancer un peu.

Bonnes journée et bonnes fêtes, ça approche.

jym83

Avatar de l’utilisateur
Temps-x
Expert
Expert
Messages : 2624
Enregistré en : juillet 2016
Localisation : Terre

librairie lcd.h

Messagepar Temps-x » sam. 23 déc. 2023 18:28

Bonjour jym83, et tout le forum,

Bienvenue sur le forum,

Quelle est ton langage de programmation ?

Je soupçons que c'est du C

J'ai des exemples que j'ai fait, mais que en ASM, as tu un schéma, car le brachement est capitale, mode 8 bits, ou 4 bits pour le LCD

Les pics son plus capricieux qu'un Arduino


jym83 a écrit :Source du message Bonnes fêtes, ça approche.


Ben ouais, le temps avance.....

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

librairie lcd.h

Messagepar satinas » sam. 23 déc. 2023 19:15

Bonsoir et bonnes fêtes à tous

Temps-x c'est du xc8, il l'a spécifié :)
jym83, peux-tu nous donner le lien concernant la bibliothèque dont tu parles.
Si elle pose problème, on pourra adapter celle que j'avais faite pour des pics 18F avec xc8.
Ne pas oublier que l'on trouve des lcd 1602 avec module i2c, cela permet de les piloter avec 2 fils seulement. Là aussi il y a des exemples sur Fantaspic et ailleurs.

Avatar de l’utilisateur
Temps-x
Expert
Expert
Messages : 2624
Enregistré en : juillet 2016
Localisation : Terre

librairie lcd.h

Messagepar Temps-x » sam. 23 déc. 2023 19:30

Bonsoir satinas,

satinas a écrit :Source du message Temps-x c'est du xc8, il l'a spécifié :)


Tout ce qui est en C je connais pas, sory

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

jym83
Membre
Membre
Messages : 10
Enregistré en : novembre 2023

librairie lcd.h

Messagepar jym83 » dim. 24 déc. 2023 09:16

Bonjour Satinas et temps-x,

j'ai "pompé" le code de l'adresse ci dessous, je trouve que c'est bien fait et didactique.

//code source https://circuitdigest.com/microcontroll ... controller

j'ai mis une fréquence interne de 4mhz.

j'ai câblé ce schéma mais j'ai remplacé les ports RDxx par RBxx et TRISD par TRISB. j'ai ajouté le rétro éclairage . ça s'allume et le contraste des caractères fonctionne.

j'ai regardé avec un analyseur logique et je n'ai pas de datas sur les 4 pattes de commande. Je n'ai qu'un niveau haut.
ci dessous le code adapté (pas d'erreur de compil, transfert ok). j'ai supprimé la bib pic16f628A.h qui est "duplicate functions" avec xc.h

D'avance merci.
JYM83

Code : Tout sélectionner

**************************************début de mon fichier main***********************************
*****
les  //  sont des commentaires pas considérés comme code, mais bon ça tu sais!******

//code source https://circuitdigest.com/microcontroller-projects/16x2-lcd-interfacing-with-pic-microcontroller        ceci est le site source de mon code


//#include<pic16f628A.h>         cette lib  n'est pas utilisée



#define _XTAL_FREQ 4000000


//affectation des bornes du lcd au pic 628A
#define RS RB4 
#define EN RB5
#define D4 RB0
#define D5 RB1
#define D6 RB2
#define D7 RB3


#include <xc.h>


//programation bits   pic16f628A
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)


//LCD Functions Developed by Circuit Digest.

void Lcd_SetBit(char data_bit) //Based on the Hex value Set the Bits of the Data Lines

{

    if(data_bit& 1) 

        D4 
= 1;

    else

        D4 
= 0;


    if(data_bit& 2)

        D5 = 1;

    else

        D5 
= 0;


    if(data_bit& 4)

        D6 = 1;

    else

        D6 
= 0;


    if(data_bit& 8) 

        D7 
= 1;

    else

        D7 
= 0;

}


void Lcd_Cmd(char a)

{

    RS = 0;           

    Lcd_SetBit
(a); //Incoming Hex value

    EN  = 1;         

        __delay_ms
(4);

        EN  = 0;         

}


void Lcd_Clear()

{

    Lcd_Cmd(0); //Clear the LCD

    Lcd_Cmd(1); //Move the curser to first position

}


void Lcd_Set_Cursor(char a, char b)

{

    char temp,z,y;

    if(a== 1)

    {

      temp = 0x80 + b - 1; //80H is used to move the curser

        z = temp>>4; //Lower 8-bits

        y = temp & 0x0F; //Upper 8-bits

        Lcd_Cmd(z); //Set Row

        Lcd_Cmd(y); //Set Column

    }

    else if(a== 2)

    {

        temp = 0xC0 + b - 1;

        z = temp>>4; //Lower 8-bits

        y = temp & 0x0F; //Upper 8-bits

        Lcd_Cmd(z); //Set Row

        Lcd_Cmd(y); //Set Column

    }

}


void Lcd_Start()

{

  Lcd_SetBit(0x00);

  //for(int i=1065244; i<=0; i--)  NOP();
  for(int i=16668; i<=0; i--)  NOP();  

  Lcd_Cmd
(0x03);

    __delay_ms(5);

  Lcd_Cmd(0x03);

    __delay_ms(11);

  Lcd_Cmd(0x03); 

  Lcd_Cmd
(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD

  Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD

  Lcd_Cmd(0x08); //Select Row 1

  Lcd_Cmd(0x00); //Clear Row 1 Display

  Lcd_Cmd(0x0C); //Select Row 2

  Lcd_Cmd(0x00); //Clear Row 2 Display

  Lcd_Cmd(0x06);

}


void Lcd_Print_Char(char data)  //Send 8-bits through 4-bit mode

{

   char Lower_Nibble,Upper_Nibble;

   Lower_Nibble = data&0x0F;

   Upper_Nibble = data&0xF0;

   RS = 1;             // => RS = 1

   Lcd_SetBit(Upper_Nibble>>4);             //Send upper half by shifting by 4

   EN = 1;

   //for(int i=2130483; i<=0; i--)  NOP(); 
   for(int i=-5655; i<=0; i--)  NOP(); 
   EN 
= 0;

   Lcd_SetBit(Lower_Nibble); //Send Lower half

   EN = 1;

   for(int i=-32205; i<=0; i--)  NOP();

   EN = 0;

}


void Lcd_Print_String(char *a)

{

    int i;

    for(i=0;a[i]!='\0';i++)

       Lcd_Print_Char(a[i]);  //Split the string using pointers and call the Char function 

}


 



int main
()

{

    unsigned int a;

    TRISB = 0x00;

    Lcd_Start();

    while(1)

    {

        Lcd_Clear();

        Lcd_Set_Cursor(1,1);

        Lcd_Print_String("Circuit Digest");

        Lcd_Set_Cursor(2,1);

        Lcd_Print_String("WORKING!!");

        __delay_ms(2000);

    }

    return 0;

}
Modifié en dernier par jym83 le dim. 24 déc. 2023 11:10, modifié 1 fois.

jym83
Membre
Membre
Messages : 10
Enregistré en : novembre 2023

librairie lcd.h

Messagepar jym83 » dim. 24 déc. 2023 09:27

Pour Satinas,

j'ai aussi fait avec de l'i2c et j'ai prévu d'essayer aussi avec un module i2c dispo, mais je suis parti sur cette maquette pour commencer.

je n'ai pas cherché de code I2C pour l'instant.

Je suis plus habitué aux arduinos, les pics ça semble "susceptible"..

ça manque de "portabilité" d'un pic à l'autre.

73 JYM83

satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

librairie lcd.h

Messagepar satinas » dim. 24 déc. 2023 10:27

Bonjour,
Peux-tu modifier ton post plus haut en cliquant sur l'icône du haut "Modifier le message".
Tu écris la balise [ code] juste avant la première ligne de ton programme, et [/code] juste après la fin du programme (sans l'espace que j'ai ajouté après le premier crochet [).

Je ne vois pas ce qu'il a voulu faire avec les boucles d'instructions NOP(). Tu peux remplacer ces lignes par __delay_ms(1); en attendant mieux (voir doc afficheur). L'instruction __delay_us(); sera plus adaptée et rendra le programme indépendant de la fréquence d'horloge.

Si aucun signal n'est détecté, ce n'est pas encore un problème d'affichage, plutôt de pilotage des ports. Les pins de commande RS et EN doivent passer périodiquement de 0 à 1.
Ensuite idem pour les 4 pins data, tu es sûr qu'aucune ne bouge ?

jym83
Membre
Membre
Messages : 10
Enregistré en : novembre 2023

librairie lcd.h

Messagepar jym83 » dim. 24 déc. 2023 11:16

pour Satinas,

re bonjour et merci de la réponse.

Je n'ai pas compris l'info avec le [code]. il n'y a pas de "balise" dans le code (au sens HTML j'entends). j'ai des fonctions et un int_main, je pense que c'est correct. j'ai modifié le message précédent, j'espère que c'est ce que tu attendais.

peux tu m'éclairer sur la commande NOP, j'avoue ne pas avoir compris non plus.

je vais modifier avec tes infos avec du delay. je te dirai.

Merci cdlmt jym83

satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

librairie lcd.h

Messagepar satinas » dim. 24 déc. 2023 11:32

Tout cela c'est du détail, ce qui est important c'est la question "tu es sûr que rien ne bouge ?"
Ajoute une led :

Code : Tout sélectionner

#define LED RB7
int main()
{
  TRISB = 0x00;
  for (int i=0; i<6; i++) {
    LED ^=  1; __delay_ms(200);
  }
  while (1) {
    LED ^=  1;
    __delay_ms(2000);
  }
}

Quand la led clignotera correctement, on passera à l'afficheur
Pour afficher mon programme ci-dessus en mode "code" coloré en bleu, j'ai écris dans mon message les 2 balises citées pour délimiter le texte du message à mettre en bleu. L'éditeur de texte du site est en partie compatible HTML.
En plus simple viewtopic.php?p=1020#p1020

satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

librairie lcd.h

Messagepar satinas » dim. 24 déc. 2023 15:11

Vérifie ton câblage parce que ton programme marche, je viens de le tester sur un 16F84.
La durée minimale de l'impulsion EN est de 300ns, j'ai mis __delay_us(1) à la place des boucles NOP(), et c'est bon.

La boucle for qui fait plein de NOP() permet de créer une temporisation très courte, de l'ordre de quelques us. l'instruction NOP() correspond à l'instruction machine nop du pic, elle ne fait rien à part consommer 1 cycle cpu, soit 1us à 4MHz. On peut ainsi ajuster la durée de la temporisation. xc8 fournit la fonction __delay_us() qui fait pareil, autant l'utiliser.
__delay_ms() et __delay_us() tiennent compte du define _XTAL_FREQ. Ainsi si tu changes de fréquence d'horloge, il suffit de mettre à jour ce define et les fonctions suivront.


Retourner vers « Le forum Fantas-PIC »

Qui est en ligne

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