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 ---
- 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
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
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
librairie lcd.h
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
Ben ouais, le temps avance.....
A+
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+
librairie lcd.h
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.
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.
librairie lcd.h
Bonsoir satinas,
Tout ce qui est en C je connais pas, sory
A+
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+
librairie lcd.h
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
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.
librairie lcd.h
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
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
librairie lcd.h
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 ?
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 ?
librairie lcd.h
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
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
librairie lcd.h
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 :
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
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
librairie lcd.h
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.
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 0 invité