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 ---
Idée, bugs, propositions .......
librairie lcd.h
jym83
Membre
Membre
Messages : 10
Enregistré en : novembre 2023

#11 Message par jym83 » dim. 24 déc. 2023 18:02 lien vers la Data-Sheet : Cliquez ici

Pour Satinas,
Je reviens de la cuisine..et ta remarque m'a mis la puce à l'oreille.

je suis une buse, je suis une buse, je suis une buse.. oops

A force d'intervertir mes maquettes de test, je me suis mélangé et j'ai interverti des étiquettes..

Je te cconfirme que ça marche.
En réalité, je mettais un 16f84A dans un montage et avec un code 16f628A, donc sans xtal de toute façon..ça peut pas marcher!
la bonne puce avec le bon code dans la bonne maquette ça marche. Donc les adaptations du code que j'avais faites fonctionnent.

Ta as éclairé ma lanterne sur le NOP, merci. J'étais un peu découragé et je tournais en rond. Je vais bricoler un peu là dessus et A suivre je me mettrai sur l I2C.
Comment se fait il que certains exemple de code appellent directement une librairie appelée "lcd.h"?

Un joyeux Noel pour toi et les tiens.

Cordialement.

librairie lcd.h
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#12 Message par satinas » lun. 25 déc. 2023 08:54 lien vers la Data-Sheet : Cliquez ici

Bonjour, tout va bien, j'ai survécu au repas :)

Pour ta question sur "lcd.h", cela foisonne d'infos sur le net, aucun standard.

Bon, cela marche, mais c'est assez bancal.
Il faut respecter les temps de traitement par le lcd des commandes ou données reçues. On peut aussi attendre en scrutant le flag busy du lcd, mais c'est une autre histoire.

En gros, il est nécessaire d'attendre 4ms après envoi d'une commande, et 100us après envoi d'un caractère à afficher. Dans le programme d'origine, il applique ces tempos à la largeur du signal EN, pour ma part je ne les mettrais pas là. C'est après que EN est descendu que la tempo doit démarrer.

Donc il faut ajouter une tempo de 100us à la fin de Lcd_Print_Char(), et pour Lcd_Cmd() je mettrais plutôt là aussi un EN de 1us et une tempo de 4ms à la fin.

Pour l'I2C voilà des infos Microchip sur la communication bitbang pour les pics ne possédant pas de module I2C dédié.
https://www.microchip.com/en-us/applica ... tes/an1488
https://ww1.microchip.com/downloads/en/ ... AN1488.zip
https://www.youtube.com/watch?v=wTyx9aime38

Joyeuses fêtes à tous

librairie lcd.h
jym83
Membre
Membre
Messages : 10
Enregistré en : novembre 2023

#13 Message par jym83 » lun. 25 déc. 2023 09:15 lien vers la Data-Sheet : Cliquez ici

Bonjour Satinas,

ici aussi il y a des survivants!

arrivant des arduinos, je n'étais pas descendu aussi bas dans le protocole de communication avec le lcd en mode //. j'utilise la bib et j'avoue ne pas avoir épluché le code de la bib.


Dans le code de la led clignotante que tu m'as fait passer, il faut ajouter Pour un 16f628A :

#include<xc.h>
#define _XTAL_FREQ 4000000

Je vais travailler un peu ce code car pour l'instant il affiche le texte car/car et c'est lent. On est plus proche de l'animation que de l'écriture. Bon , ça exxiste ça me fait une base à modifier en fonction de mon besoin, en respectant les tempos que tu donnes.

Maintenant que ça fonctionne, je vais pouvoir tester un autre code qui utilise des fichiers externes à ajouter au projet.



Merci pour les liens, je m'y mets après les fêtes.

Bonne journe.

cordialement.

librairie lcd.h
jym83
Membre
Membre
Messages : 10
Enregistré en : novembre 2023

#14 Message par jym83 » mer. 27 déc. 2023 12:02 lien vers la Data-Sheet : Cliquez ici

Pour Salinas, mais les autres aussi!!

Bonjour,

j'ai eu un peu de temps pour me remttre sur ce code et appliquer les consignes.
ci dessous le code remanié, très stable, pas de défaut sur le lcd, je peux intercepter des datas sur les ports //


Code : Tout sélectionner


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


//#include<pic16f628A.h>


#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(); 
  __delay_us(100);
  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();
   __delay_us(100);
   EN = 0;

   Lcd_SetBit(Lower_Nibble); //Send Lower half

   EN = 1;

   //for(int i=-32205; i<=0; i--)  NOP();
   __delay_us(100);
   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);

       
                Lcd_Clear();

        Lcd_Set_Cursor(1,1);

        Lcd_Print_String("Radio F5NZZ!!!!!");

        Lcd_Set_Cursor(2,1);

        Lcd_Print_String("WORKING!! well");

        __delay_ms(2000);
       
       
                Lcd_Clear();

        Lcd_Set_Cursor(1,1);

        Lcd_Print_String("1 2 3 4 5 6 7 8 ");

        Lcd_Set_Cursor(2,1);

        Lcd_Print_String("WORKING!!10 13 2");

        __delay_ms(2000);
       
       
    }

    return 0;

}






j'espère que mes balises fonctionneront avec le code.

Merci pour le coup de main.
Je vais tester avec un 16f84A sur l'autre maquette avec le xtal..

C'est quand même bien sioux pour juste écrie sur un LCD.

prochaine étape : J'ai prévu de lire une tension via les broches analogiques. Après qq recherches, ça parait pas bien simple encore cette histoire avec un pic 16f628A... Du reste je n'ai trouvé du code que pour le 877? je pense que ça doit être adaptable.
je pense que je vais te solliciter encore un peu!

Existe t'il une librairie à télécharger pour cette fonction basique?

Bonnes fêtes de fin d'année à toutes et tous.

Cordialement.

jym83

librairie lcd.h
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#15 Message par satinas » mer. 27 déc. 2023 12:30 lien vers la Data-Sheet : Cliquez ici

Bonjour jym83,
Il n' y a pas de convertisseur analogique-numérique sur le 16F628A. Par contre il a 2 comparateurs analogiques.
Voilà comment je voyais les choses pour le lcd. Un petit programme vaut mieux qu'un long discours :)

Code : Tout sélectionner

void Lcd_Cmd(char a)
{
  RS = 0;           

  Lcd_SetBit(a);                //Incoming Hex value
  EN  = 1;         
  __delay_us(1);
  EN  = 0;         

  __delay_ms(4);
}

void Lcd_Print_Char(char data)  //Send 8-bits through 4-bit mode
{
  RS = 1;

  Lcd_SetBit(data>>4);          //Send upper half by shifting by 4
  EN = 1;
  __delay_us(1);
  EN = 0;

  Lcd_SetBit(data);             //Send Lower half
  EN = 1;
  __delay_us(1);
  EN = 0;

  __delay_us(100);
}

Les __delay_us(1) sont là pour faire joli car à la vitesse actuelle de ton pic, rien que EN=1 suivi de EN=0 va produire une impulsion de 1us ou plus, selon le niveau d'optimisation du compilateur. Le lcd nécessite une impulsion EN de 300ns minimum. Les __delay_us(1) peuvent donc être enlevés.

librairie lcd.h
jym83
Membre
Membre
Messages : 10
Enregistré en : novembre 2023

#16 Message par jym83 » dim. 21 janv. 2024 10:20 lien vers la Data-Sheet : Cliquez ici

Bonjour et meilleurs voeux,

je m'apperçois que je n'ai pas envoyé de réponse..avec mes excuses.
Le problème était bien dans le câblage. ma breadboard était capricieuse. depuis j'ai investi un peu..

J'ai depuis fai fonctionné l'écran lcd avec un 84, 628 et un 877.
je suis sur la mesure adc avec le 877,mais ça c'est pas facile de trouver du code qui fonctionne..pas évident pour progresser.

Sur les différents tutos il n'y a bien souvent pas de code disponible et surtout pas les lib qui vont avec..

On persévère.

merci.

jym83

librairie lcd.h
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#17 Message par satinas » dim. 21 janv. 2024 10:56 lien vers la Data-Sheet : Cliquez ici

Bonjour et bonne année :-)

Si tu veux des bibliothèques toutes faites, il faut faire de l'Arduino ou du MikroC. Avec les outils Microchip je trouve plus intéressant d'étudier par soi-même les différents périphériques et ensuite mettre cela dans des fichiers sources séparés que l'on compile avec le programme principal selon les besoins. On peut voir cela plus tard.

Pour l'ADC, les années passent mais les références restent. Cours Bigonoff sur les pics 16F87X chapitre 19 Le convertisseur Analogique/Numérique.

Courage !


Retourner vers « Le forum Fantas-PIC »

Qui est en ligne

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