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 ---
Modérateur : Jérémy
Créer sa propre librairie pour LCD
Bonjour
la question serait pourquoi 3 fois ?
Sur certain contrôleur 1 fois suffit, pour d'autres ils sont dur d'oreille ,il faut leurs répéter plusieurs fois l'instruction SET après ils ont compris ,le départ est laborieux
Je posterai ma librairie qui tourne finalement sur XC8 pour 16F et 18F a la fin pour me pas trop te gêner dans ton résonnement (fichier h et source)
A+ et bon voyage
la question serait pourquoi 3 fois ?
Sur certain contrôleur 1 fois suffit, pour d'autres ils sont dur d'oreille ,il faut leurs répéter plusieurs fois l'instruction SET après ils ont compris ,le départ est laborieux
Je posterai ma librairie qui tourne finalement sur XC8 pour 16F et 18F a la fin pour me pas trop te gêner dans ton résonnement (fichier h et source)
A+ et bon voyage
Créer sa propre librairie pour LCD
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour à tous,
De retour ........ .
J’ai pu peaufiner un peu ma librairie et je vois qu'en parallèle Pooshy à eu le même soucis ou presque .
Ça va certainement faire rire les plus pêchus en programmation, mais j'ai essayé d'optimiser un peu ma librairie.
Je vais préparer un petit tuto dessus maintenant que je pense avoir compris le principe du LCd en mode 4bits.
je suis ouvert a toute proposition d'optimisation ! Il y a certainement quelques lignes à gagner encore !
Quelques explications sur ma façon de faire :
J'ai fais deux SUB de validation de l'information présent sur le PORT ( ENABLE) pour changer les delays d'attente . Certaine fonctions de commande demande plus de temps que les autres.
Pour les Data j'ai préférè mettre une pause de 1µs afin d’éviter les erreurs mais sa fonctionne sans cette pause ! je suis pas à 1µs pres
Je n'ai pas trouvé d’intérêt à re-créer une SUB pour un seul caractère, a l'endroit du curseur, je ne l'ai donc pas faite!
dans l’exemple qui me servira au Tutoriel , j'écris une phrase sur la première ligne , et sur la seconde je lis la valeur analogique présente sur une entrée , et j'affiche la valeur d'un compteur qui s’incrémente et se décrémente par appui sur des Bp . j'ai rajouter un petit son quand on appui sur les BP.
De retour ........ .
J’ai pu peaufiner un peu ma librairie et je vois qu'en parallèle Pooshy à eu le même soucis ou presque .
Ça va certainement faire rire les plus pêchus en programmation, mais j'ai essayé d'optimiser un peu ma librairie.
Je vais préparer un petit tuto dessus maintenant que je pense avoir compris le principe du LCd en mode 4bits.
je suis ouvert a toute proposition d'optimisation ! Il y a certainement quelques lignes à gagner encore !
Quelques explications sur ma façon de faire :
J'ai fais deux SUB de validation de l'information présent sur le PORT ( ENABLE) pour changer les delays d'attente . Certaine fonctions de commande demande plus de temps que les autres.
Pour les Data j'ai préférè mettre une pause de 1µs afin d’éviter les erreurs mais sa fonctionne sans cette pause ! je suis pas à 1µs pres
Je n'ai pas trouvé d’intérêt à re-créer une SUB pour un seul caractère, a l'endroit du curseur, je ne l'ai donc pas faite!
dans l’exemple qui me servira au Tutoriel , j'écris une phrase sur la première ligne , et sur la seconde je lis la valeur analogique présente sur une entrée , et j'affiche la valeur d'un compteur qui s’incrémente et se décrémente par appui sur des Bp . j'ai rajouter un petit son quand on appui sur les BP.
Code : Tout sélectionner
/*##################################################################################
Programme de test pour librairie ecran LCD en mode 4 bit
Fait par Jérémy pour www.FantasPic.fr
- Version du "05-04-2016"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC a 8MHZ ,Quartz 8Mhz, PLL DISable
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
#################################################################################*/
// Connexions du module LCD
// La broche Read/Write est reliée à la masse pour ecriture permanente
#define LCD_RS LATB.B4 // 1:Data, 0:Cmde
#define LCD_EN LATB.B5 // Impulsion d'envoie
#define DATA4 LATB.B0 // les 4 bits de données
#define DATA5 LATB.B1
#define DATA6 LATB.B2
#define DATA7 LATB.B3
// Fin de connexion
//-------------------- Variables --------------------------------
unsigned int j=0,temp;
unsigned char compteur[7];
//------------------- FIN variables --------------------------------
//############################################################################################################
//------------------ Valide un Envoi de commande --------------------------------------
void Envoi_Cmde(){
LCD_EN = 1; // Broche Enable à 1
delay_us(800); // Pause de 800 µs
LCD_EN = 0; // On passe la broche ENABLE à 0
delay_us(800); // Pause de 800 µs
}
//------------------ Valide un Envoi de donnée ---------------------------------------
void Envoi_Data(){
LCD_EN = 1;
delay_us(1);
LCD_EN = 0;
}
//------------------ Fonction qui envoi une commande ---------------------------------
//--- Parametre d'entree : la commande à envoyer
void LCD_cmde (int donnee) {
LCD_RS = 0 ; // Registre commande
LATB = (LATB & 0xF0) + (donnee >> 4 ) ; // On sort les 4 MSB de la donnée recue et on les affecte au LSB du PORTB sans toucher au MSB du PORTB
Envoi_Cmde(); // On envoi la commande
LATB = (LATB & 0xF0) + (donnee & 0x0F) ; // On sort les 4 LSB et on les affecte au LSB du PORTB sans toucher au MSB du PORTB
Envoi_Cmde(); // On envoi la commande
}
//------------------------- Fonction qui envoi une donnée -----------------------------
//--- Parametre d'entree : (la donnée à envoyer)
void LCD_data (int donnee){
LCD_RS = 1 ; // registre de donnée
LATB = (LATB & 0xF0) + (donnee >> 4 ) ; // On cache les 4 bits inutiles du portB(les 4bits MSB) et on rajoute les 4 bits MSB de la donné a envoyer au LSB au PORTB
Envoi_Data(); // On envoi
LATB = (LATB & 0xF0) + (donnee & 0x0F) ;// On cache les 4 bits inutiles et on affecte le LSB au PORTB pour l'envoyer
Envoi_data(); // On envoi
}
//----------------- Fonction qui positionne le curseur dans la DDRAM ------------------
//--- Parametre d'entree: ( N° de ligne 1 ou 2 , N° de la colonne de 0 à 15)
void LCD_pos (int ligne, int colonne){
char position ;
if (ligne == 2)
position = 0b11000000 + colonne; // Si ligne=2 on rajoute 0x40 pour passer sur la deuxieme ligne
else position = 0b10000000 + colonne ; // Sinon on met seulement 128 pour indiquer que l'on positionne le curseur
LCD_cmde (position);
}
//---------------------------- Fonction qui configure le LCD ----------------------------
void LCD_conf(){
unsigned char i;
LCD_RS = 0 ; // Registre Commande
LATB = (LATB & 0xF0) + 3 ; // On place le portB à 0b:xxxx0011 pour passer en mode 4bits
for (i=0;i<=2;i++) Envoi_data(); // on l'envoie trois fois pour etre certains de passer en mode 4 bits
LCD_cmde (0x02); // Je pense qu'on envoi 2 car on ne sait pas quand le LCD est passé en mode 4 bit au premier deuxieme ou troisieme coup
LCD_cmde (0x28); // On envoi le mode 4 bit, sur 2 lignes et avec Dot5x8
LCD_cmde (0x0C); // Envoi de 0b:0000 puis de 0b:1100 display:On curseur:Off et clignotement:Off
LCD_cmde (0x01); // Envoi de 0b:0000 puis de 0b:0001 pour effacer l'ecran
LCD_cmde (0x06); // Envoi de 0b:0000 puis de 0b:0110 pour direction du curseur et shift auto
}
//---------------------- Fonction qui affiche du texte à la position voulue --------------------
//--- Parametre d'entree : (n° de la ligne 1 ou 2 , n° de la colonne 0 à 15 , texte à afficher entre guillemets ou une variable)
void LCD_txt (int ligne, int colonne, char txt[]){
char i=0 ;
LCD_pos (ligne, colonne); // on positionne le curseur en DDRAM
while (txt[i]!= 0) // On reboucle tant que l'on a pas recu de terminateur de string
{
LCD_data(txt[i]); // On affcihe notre caractere
i++; // On incremente le pointeur du tableau de caracteres
}
}
//#############################################################################################################
//------------------------------ Programme principal --------------------------------------------------
void main() {
ANSELA = 1; // Broche RA0 en analogique pour lecture ADC
ANSELB = 0; // PORTB en digital
ANSELD = 0; // PORTD en digital
TRISA = 1; // Brcohe RA0 en entrée pour lecture de la tension
TRISB = 0; // PORTB en sortie
TRISD = 255; // Le PORTD en Entrée pour les BP
LATB = 0; // RAZ du PORTB
delay_ms(10);
ADC_init(); // Initialisation du registre ADC
LCD_conf(); // Initialisation de l'ecran LCD
Sound_Init(&PORTE, 1);
delay_ms(10);
LCD_txt(1,0,"ceci est un test"); // ligne, colonne, texte
//#############################################################################################################
while(1)
{
temp = ADC_Read(0); // lecture analogique et stockage dans la variable "temp"
IntToStr(temp, compteur); // Conversion de la variable en chaine de caractere
LCD_txt(2,0,compteur); // On affiche la chaine de caractere
if ((PORTD.B0==1) && (j<65535)) // Si le BP(RB0) est appuyé
{
j++; // On incrémente le compteur
Sound_Play(1000, 50); // On fait un BIP à une fréquence de 1000Hz pendant 50ms
while (PORTD.B0==1); // Boucle anti-rebond
}
if ((PORTD.B1==1) && (j>0)) // Si le BP(RB1) est appuyé
{
j--; // On décrémente le compteur
Sound_Play(3000, 50); // On fait un BIP à une fréquence de 3000Hz pendant 50ms
while (PORTD.B1==1); // Boucle anti-rebond
}
IntToStr(j, compteur); // Conversion de la variable en chaine de caractere
LCD_txt(2,10,compteur); // On affiche la chaine de caractere
}
}Créer sa propre librairie pour LCD
Bonjour
Content de te voir de retour
Bon direct c'est pas terrible comme toujours je m'explique POURQUOI
--une librairie doit-être la plus universel possible d'autant que le C par nature est portable ce qui veut dire qu(il doit pouvoir tourner aussi bien pour un pic un arduino ou un sorti du bois, sur un 4470 ou sur un ks0066U pour le cas ici des contrôleur
--Une librairie a un fichier entête je ne le trouve pas.
--Tu es par exemple pour le positionnement en DDRAM sur 2 lignes alors qu'il existe des 1 2 et 4 lignes
si tu le permets un petit retour sur le LCD dans les DS on trouve une suite de fonctions ou instructions du style "efface écran"
--ces instructions doivent au mois se retrouver toutes dans le fichier entête (.h) dans des SPG et donc dans le fichier source .
--Le contrôleur est soumis a une notion de Temps on dois la retrouver dans le h du style ma fréquence est de. Mais tu vas me dire j'ai delay_us toi oui mais moi NON et c'est pas un scoop la plupart des problèmes de NON fonctionnement viennent de la, absence de librairie delay
--Ton traitement sur enable je le trouve aussi très restrictif alors que dans la ds il te dise:
E=1 durée 450ns de mini puis E=0 450ns de mini il te dise aussi que chaque instruction a un delay pour s’exécuter 1.5ms pour un effacement et un retour maison. Réfléchis pour que cela soit plus rapide que tes 800µs
Que tout c'est tempo sont tributaires de horloge du µC car suivant comme tu vas t'organiser tu vas te laisser la possibilité par exemple de faire une fonction busy (lecture du bit pret) a peu de frais tout cela pour te dire d'ouvrir plus LARGE
Alors comment rendre une librairie universel en passant par le PREPROCESSEUR avec des tests, du style: si 4 bits alors je compil cela si 8 bits je compli ceci et si je ne me trompe pas je te l'est déjà dit
Avant de continuer je voulais savoir si tu as bien suivi ?
si oui a toi la mains
A+
PS ah oui une lib est une boite presque ferme ou fermé suivant les cas ,que tu viens déposer dans ton projet alors comment c'est une autre histoire
Content de te voir de retour
Bon direct c'est pas terrible comme toujours je m'explique POURQUOI
--une librairie doit-être la plus universel possible d'autant que le C par nature est portable ce qui veut dire qu(il doit pouvoir tourner aussi bien pour un pic un arduino ou un sorti du bois, sur un 4470 ou sur un ks0066U pour le cas ici des contrôleur
--Une librairie a un fichier entête je ne le trouve pas.
--Tu es par exemple pour le positionnement en DDRAM sur 2 lignes alors qu'il existe des 1 2 et 4 lignes
si tu le permets un petit retour sur le LCD dans les DS on trouve une suite de fonctions ou instructions du style "efface écran"
--ces instructions doivent au mois se retrouver toutes dans le fichier entête (.h) dans des SPG et donc dans le fichier source .
--Le contrôleur est soumis a une notion de Temps on dois la retrouver dans le h du style ma fréquence est de. Mais tu vas me dire j'ai delay_us toi oui mais moi NON et c'est pas un scoop la plupart des problèmes de NON fonctionnement viennent de la, absence de librairie delay
--Ton traitement sur enable je le trouve aussi très restrictif alors que dans la ds il te dise:
E=1 durée 450ns de mini puis E=0 450ns de mini il te dise aussi que chaque instruction a un delay pour s’exécuter 1.5ms pour un effacement et un retour maison. Réfléchis pour que cela soit plus rapide que tes 800µs
Que tout c'est tempo sont tributaires de horloge du µC car suivant comme tu vas t'organiser tu vas te laisser la possibilité par exemple de faire une fonction busy (lecture du bit pret) a peu de frais tout cela pour te dire d'ouvrir plus LARGE
Alors comment rendre une librairie universel en passant par le PREPROCESSEUR avec des tests, du style: si 4 bits alors je compil cela si 8 bits je compli ceci et si je ne me trompe pas je te l'est déjà dit
Avant de continuer je voulais savoir si tu as bien suivi ?
si oui a toi la mains
A+
PS ah oui une lib est une boite presque ferme ou fermé suivant les cas ,que tu viens déposer dans ton projet alors comment c'est une autre histoire
Créer sa propre librairie pour LCD
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Hello Maï ,
Content de tous vous retrouvez aussi.
Du moment que la critique est constructive, ça me plait et je prends note. Même si je ne retiens pas tout , à force ça va rentrer
.
J'ai , il me semble, tout compris a ce que tu as dis . Mais il est vrai que mon but n'est pas de faire une librairie UNIVERSELLE, c'est pourquoi je ne l'ai pas tourner dans ce sens . Celle de mikroC est déjà existante, et je me permettrais pas de dire qu'elle est nulle.
J'ai fait cette librairie pour m'entrainer un peu avec le matériel que je possède, c'est pourquoi j'ai pas créer de fonctions pour 4 lignes par exemple. Je n'ai pas le niveau pour prétendre créer une LIB universelle.
Pour en revenir à tes remarques :
le fichier d'en tête c'est le fichier Header ?
Oui j'ai un peu galérer avec ceci je l'avoue.
Les 800µs ne sont valables que pour quelques instructions, et moi je les utilisent pour tous, donc je perds du temps je le conçois. Je pense qu'il faudrait que je créer une troisième tempo . une tempo pour les data, une pour les commande lentes et une pour les commande rapides ?
Pour l'universalité, je m'y pencherais dans quelques années
car il faut être sur de soi, et je suis en phase d’apprentissage !
Imagine que j'ai créer cette Librairie (si on peut appeler ça , comme ça ), juste pour cet écran et juste pour un programme .
En tout cas merci, je suis d'autant plus content car tu n'as rien dit sur ma façon de détacher mes MSB et LSB afin d'envoyer e n4 bits, et j'ai tout fait tout seul, alors je suis un peu fier d'avoir trouvé ca !
Content de tous vous retrouvez aussi.
Du moment que la critique est constructive, ça me plait et je prends note. Même si je ne retiens pas tout , à force ça va rentrer
J'ai , il me semble, tout compris a ce que tu as dis . Mais il est vrai que mon but n'est pas de faire une librairie UNIVERSELLE, c'est pourquoi je ne l'ai pas tourner dans ce sens . Celle de mikroC est déjà existante, et je me permettrais pas de dire qu'elle est nulle.
J'ai fait cette librairie pour m'entrainer un peu avec le matériel que je possède, c'est pourquoi j'ai pas créer de fonctions pour 4 lignes par exemple. Je n'ai pas le niveau pour prétendre créer une LIB universelle.
Pour en revenir à tes remarques :
Une librairie a un fichier entête je ne le trouve pas.
le fichier d'en tête c'est le fichier Header ?
--Ton traitement sur enable je le trouve aussi très restrictif alors que dans la ds il te dise:
E=1 durée 450ns de mini puis E=0 450ns de mini il te dise aussi que chaque instruction a un delay pour s’exécuter 1.5ms pour un effacement et un retour maison. Réfléchis pour que cela soit plus rapide que tes 800µs
Oui j'ai un peu galérer avec ceci je l'avoue.
Les 800µs ne sont valables que pour quelques instructions, et moi je les utilisent pour tous, donc je perds du temps je le conçois. Je pense qu'il faudrait que je créer une troisième tempo . une tempo pour les data, une pour les commande lentes et une pour les commande rapides ?
Pour l'universalité, je m'y pencherais dans quelques années
Imagine que j'ai créer cette Librairie (si on peut appeler ça , comme ça ), juste pour cet écran et juste pour un programme .
En tout cas merci, je suis d'autant plus content car tu n'as rien dit sur ma façon de détacher mes MSB et LSB afin d'envoyer e n4 bits, et j'ai tout fait tout seul, alors je suis un peu fier d'avoir trouvé ca !
Créer sa propre librairie pour LCD
BONJOUR a tous
NON NON du l’écoute pas le ENABLE c'est 450ns allez on ramène cela a 1µs donc E=1 tempo 1µs E=0 tempo 1µs et affaire réglé maintenant dans la DS il te donne pour les différentes instructions le temps mini pour EXECUTER L'INSTRUCTION pour un retour home c'est 1.5ms pour une écriture c'est 43µS et comme deja dit plus haut tu dois avoir dans le h et le source autant de fonctions que de jeux rien de plus facile de faire:
alors petite explication
en mode donné petit stabilisation
boucle en fonction du nb de caractère a ecrire
le pointeur dans la variable Tempo car la on ne traite pas si 4 ou 8 bits c'est traité dans la fonction Pulse_XC8
cette fonction fait le E=1 tempo1µs E=0 tempo 1µs et le test si 4 ou 8 bits donc assez rapide
puis une tempo de 50µs bon la DS dit 43µS et l'on retourne ou sort de la routine
NON je pense que tu es capable de faire cette librairie le plus dur c'est l'int . Allez tu joues le jeux fait moi pour chaque instruction sur mon modele les différentes routines je viens de te faire écriture
A+
PS tu as remarqué que j'utilise les delay_us
Jérémy a écrit :Hello Maï ,OUIle fichier d'en tête c'est le fichier Header ?
quelle est l'avantage; c'est des macro avec #define tu changes un paramétrés du .h il sera répercuter tout le long de ton source sans qu'il te faille chercher dans ton source pour le modifier par exemple je suis en 8 bits la fréquence de mon quartz est de 20 Mhz teint le delay_us est une MACRO
--
Les 800µs ne sont valables que pour quelques instructions, et moi je les utilisent pour tous, donc je perds du temps je le conçois. Je pense qu'il faudrait que je créer une troisième tempo . une tempo pour les data, une pour les commande lentes et une pour les commande rapides ?
NON NON du l’écoute pas le ENABLE c'est 450ns allez on ramène cela a 1µs donc E=1 tempo 1µs E=0 tempo 1µs et affaire réglé maintenant dans la DS il te donne pour les différentes instructions le temps mini pour EXECUTER L'INSTRUCTION pour un retour home c'est 1.5ms pour une écriture c'est 43µS et comme deja dit plus haut tu dois avoir dans le h et le source autant de fonctions que de jeux rien de plus facile de faire:
Code : Tout sélectionner
void Write_XC8_LCD (unsigned char *pLCD,int NB)
{
RS=1; /*mode donn?e*/
NOP();
for (i=0;i<NB;i++)
{
Tempo=pLCD[i]; /*donn?e sur port du LCD*/
Pulse_XC8_LCD();
__delay_us (50);
}
}
alors petite explication
en mode donné petit stabilisation
boucle en fonction du nb de caractère a ecrire
le pointeur dans la variable Tempo car la on ne traite pas si 4 ou 8 bits c'est traité dans la fonction Pulse_XC8
cette fonction fait le E=1 tempo1µs E=0 tempo 1µs et le test si 4 ou 8 bits donc assez rapide
puis une tempo de 50µs bon la DS dit 43µS et l'on retourne ou sort de la routine
NON je pense que tu es capable de faire cette librairie le plus dur c'est l'int . Allez tu joues le jeux fait moi pour chaque instruction sur mon modele les différentes routines je viens de te faire écriture
A+
PS tu as remarqué que j'utilise les delay_us
Créer sa propre librairie pour LCD
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
J'ai plusieurs doutes :
- Le temps pour exécuter une instruction disons "return home" est de 1.5ms, mais qu'est qui doit être de 1.5ms ? l'état de la broche ENable à 1 ? ou après la pulse une petite pause pour laisser le temps à l'instruction de s’écouler ?
- cette histoire de delay_ en fonction de la vitesse je ne sais pas du tout comment faire cela.
Pourquoi indiquer le nombre de caractères a faire passer, autant envoyé tant qu'il y a des caractères non ? ça évite de faire un test
Pourquoi faire une pause dans la boucle entre chaque caractère envoyés ? car en mode donnée cette pause est inutile ?
- Le temps pour exécuter une instruction disons "return home" est de 1.5ms, mais qu'est qui doit être de 1.5ms ? l'état de la broche ENable à 1 ? ou après la pulse une petite pause pour laisser le temps à l'instruction de s’écouler ?
- cette histoire de delay_ en fonction de la vitesse je ne sais pas du tout comment faire cela.
Pourquoi indiquer le nombre de caractères a faire passer, autant envoyé tant qu'il y a des caractères non ? ça évite de faire un test
Pourquoi faire une pause dans la boucle entre chaque caractère envoyés ? car en mode donnée cette pause est inutile ?
Créer sa propre librairie pour LCD
Bonjour
les 1.5ms c'est le temps qu'il faut au controleur pour exécuter cette instruction ENABLE c'est le temps qu'il faut au controleur pour prendre en compte les données présente sur le port du contrôleur donc 2 choses distinctes
les 1.5ms peut etre remplacé par le test de BUSY c'est pour cela que je fais comme cela car tu as la possibilité la aussi d’utilisé ou pas l'instruction busy toujours pour voir plus large donc passe partout .On ne va pas refaire une lib uniquement parce que on utilise BUSY, non, un test sur w/r va nous dire si l'instruction réception donc busy doit-être utilisé ou pas si pas on utilise la tempo :
avec busy
finalement j'ai mis toute la routine .Petite explication supplémentairement si il n'y a pas attribution a la broche RW dans le .h il n'y a pas de compilation du spg Busy_XC8_LCD mais ce lui de la tempo
Un bout de mon h. ici MYCYCL prend la valeur de 5 pour 20Mhz et de 10 pour 40Mhz et 1 pour 4Mhz et de zero pour < de 4Mhz .
donc MYCYCL représente le nombre de cycles machine a effectuer pour faire 1µs par exemple avec un NOP();
A 20Mhz MYCYCLE=5 donc 5 nop ->1µs (puisque le nop vaut 0.2µs) 0.2*5=1µs
Après tu as plusieurs façon de faire pour exécuter des tempo
-Faire au preprosseur un test sur MYCYCL et en fonction faire 1,2,3;3....10 NOP pour faire 1µS
-toujours avec le preprosseur l'incorporer dans une boucle et bien sur dans une MACRO(pour éviter 'appel et le retour d'un spg)
AMHA on n'utilise pas assez la puissance du prepro.
Mais si tu fais une lib avec delay_us et delay_ms et sans busy avec 4 ou 8 bits pour tout les contrôleurs cela sera très .
C’était juste le coté le plus large possible
A+
PS tu peux virer les posts #25 #26 merci
Jérémy a écrit :J'ai plusieurs doutes :
- Le temps pour exécuter une instruction disons "return home" est de 1.5ms, mais qu'est qui doit être de 1.5ms ? l'état de la broche ENable à 1 ? ou après la pulse une petite pause pour laisser le temps à l'instruction de s’écouler ?
les 1.5ms c'est le temps qu'il faut au controleur pour exécuter cette instruction ENABLE c'est le temps qu'il faut au controleur pour prendre en compte les données présente sur le port du contrôleur donc 2 choses distinctes
les 1.5ms peut etre remplacé par le test de BUSY c'est pour cela que je fais comme cela car tu as la possibilité la aussi d’utilisé ou pas l'instruction busy toujours pour voir plus large donc passe partout .On ne va pas refaire une lib uniquement parce que on utilise BUSY, non, un test sur w/r va nous dire si l'instruction réception donc busy doit-être utilisé ou pas si pas on utilise la tempo :
avec busy
Code : Tout sélectionner
void Write_XC8_LCD (unsigned char *pLCD,int NB)
{
RS=1; /*mode donn?e*/
NOP();
for (i=0;i<NB;i++)
{
Tempo=pLCD[i]; /*donn?e sur port du LCD*/
Pulse_XC8_LCD();
#if RW==0
__delay_us(50);
#elif
while( Busy_XC8_LCD);
#endif
}
}finalement j'ai mis toute la routine .Petite explication supplémentairement si il n'y a pas attribution a la broche RW dans le .h il n'y a pas de compilation du spg Busy_XC8_LCD mais ce lui de la tempo
c'est le rapport cycle machine exemplecette histoire de delay_ en fonction de la vitesse je ne sais pas du tout comment faire cela.
Code : Tout sélectionner
#define _XTAL_FREQ 20000000 // oscillator frequency //.
#define MYCYCL _XTAL_FREQ /4000000 //pour ma lib tempo
Un bout de mon h. ici MYCYCL prend la valeur de 5 pour 20Mhz et de 10 pour 40Mhz et 1 pour 4Mhz et de zero pour < de 4Mhz .
donc MYCYCL représente le nombre de cycles machine a effectuer pour faire 1µs par exemple avec un NOP();
A 20Mhz MYCYCLE=5 donc 5 nop ->1µs (puisque le nop vaut 0.2µs) 0.2*5=1µs
Après tu as plusieurs façon de faire pour exécuter des tempo
-Faire au preprosseur un test sur MYCYCL et en fonction faire 1,2,3;3....10 NOP pour faire 1µS
-toujours avec le preprosseur l'incorporer dans une boucle et bien sur dans une MACRO(pour éviter 'appel et le retour d'un spg)
AMHA on n'utilise pas assez la puissance du prepro.
Mais si tu fais une lib avec delay_us et delay_ms et sans busy avec 4 ou 8 bits pour tout les contrôleurs cela sera très .
C’était juste le coté le plus large possible
A+
PS tu peux virer les posts #25 #26 merci
Créer sa propre librairie pour LCD
- paulfjujo

Maître- Messages : 3261
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir,
Sous MikroC, si on renseigne correctement la frequence du quartz ou FOSC (si usage de l'oscillateur interne)
et donc de la config buit associée ( en particulier si il y a une PLL active ..)
miroc delivre tres bien le bon delay_ms demandé ..
dans tous mes programmes je fais un test de tempo , au moins une fois , pour verifier que la config bit et FOSC sont correctement intialis&é
dans le projet mikroC?
test enlevé des que confirmation OK du delay..
exemple
J'utilise un UART dispo dans tous mes programmes comme outil de debugging et tracage programme..
(
Je n'ai pas d' 'ICD malheureusement ! )
j'utilise la possibilité de rajout "Time" de VBRAY terminal
qui indique l'heure à 50mS pres des qu'il y a un <CR> detecté (Carriage return)
il suffit alors de verifier qu'il y a bien 5 secondes ecoulees entre le # et le $ affiches sur le terminal..
on pourrait aussi chronometrer l'allumage d'une led !
.. ensuite on peut virer ce test qui gaspille 5 seondes au demarrage programme.
il va sans dire que l'UART sera AUSSI mal initialisé si il a un probleme de config FOSC ..
voir multiple ou sous multiple de la vitesse en bauds ( si FOSC multiple de 4 Mhz)
cette histoire de delay_ en fonction de la vitesse je ne sais pas du tout comment faire cela.
Sous MikroC, si on renseigne correctement la frequence du quartz ou FOSC (si usage de l'oscillateur interne)
et donc de la config buit associée ( en particulier si il y a une PLL active ..)
miroc delivre tres bien le bon delay_ms demandé ..
dans tous mes programmes je fais un test de tempo , au moins une fois , pour verifier que la config bit et FOSC sont correctement intialis&é
dans le projet mikroC?
test enlevé des que confirmation OK du delay..
exemple
Code : Tout sélectionner
#ifdef Oscillateur_Interne
OSCTUNE=0 ; // PLLEN_bit=0; TUN5..TUN0 = 0
OSCCON.IRCF2=1; // 4MHz=110 8MHZ = 111
OSCCON.IRCF1=1; // Internal Oscillator Frequency Select bits
OSCCON.IRCF0=0;
OSCCON.SCS1=1; // 11 = Postscaled internal clock
OSCCON.SCS0=1;
#endif
Hardware_Init();
LD2=1;
.....
UART1_Init(19200);
...
// verif FOSC et Delay
UART1_Write('#');CRLF1();
Delay_ms(5000);
UART1_Write('$');CRLF1();
J'utilise un UART dispo dans tous mes programmes comme outil de debugging et tracage programme..
(
j'utilise la possibilité de rajout "Time" de VBRAY terminal
qui indique l'heure à 50mS pres des qu'il y a un <CR> detecté (Carriage return)
il suffit alors de verifier qu'il y a bien 5 secondes ecoulees entre le # et le $ affiches sur le terminal..
on pourrait aussi chronometrer l'allumage d'une led !
.. ensuite on peut virer ce test qui gaspille 5 seondes au demarrage programme.
il va sans dire que l'UART sera AUSSI mal initialisé si il a un probleme de config FOSC ..
voir multiple ou sous multiple de la vitesse en bauds ( si FOSC multiple de 4 Mhz)
Créer sa propre librairie pour LCD
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Merci pour toutes vos indications.
Avant "d'automatiser" le focntionnement, il faudrait que j'arive à trouver les bon delais pour chaque commande , car j'ai m'ipression que le LCD en fait qu'a ca tête par moment . Je penche pour des delais trop juste . car des fois il s'initialise mal, une autre fois la luminosité est faible etc ....
J'ai réellement un problème a déterminer le bon timing. Mais j'y travaille
Ok, Merci Maï, donc je peux faire une pulse trés rapide pour valider les données présentes sur le PORT , et ensuite une fois validé, je dois faire une pause en focntion de la commande( lente ou rapide). Une simple condition de test pour connaitre la commande devrait faire l'affaire
Avant "d'automatiser" le focntionnement, il faudrait que j'arive à trouver les bon delais pour chaque commande , car j'ai m'ipression que le LCD en fait qu'a ca tête par moment . Je penche pour des delais trop juste . car des fois il s'initialise mal, une autre fois la luminosité est faible etc ....
J'ai réellement un problème a déterminer le bon timing. Mais j'y travaille
les 1.5ms c'est le temps qu'il faut au controleur pour exécuter cette instruction ENABLE c'est le temps qu'il faut au controleur pour prendre en compte les données présente sur le port du contrôleur donc 2 choses distinctes
Ok, Merci Maï, donc je peux faire une pulse trés rapide pour valider les données présentes sur le PORT , et ensuite une fois validé, je dois faire une pause en focntion de la commande( lente ou rapide). Une simple condition de test pour connaitre la commande devrait faire l'affaire
Créer sa propre librairie pour LCD
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Suite à vos remarques, j'ai réussis à améliorer mon programme en créant une fonction Pulse, plutôt que deux fonctions différentes.
grâce à test sur la donnée de commande envoyé je rajout une tempo ou non. Ainsi si la commande de donnée est un "return home " ou un "clear display" , je rajoute 1.5ms après l'envoi de l'instruction pour laisser le temps au LCD d’exécuter l’instruction.
Je ne souhaite pas encore gérer la portabilité, juste faire une petit lib perso pour mon écran, mais et surtout pour apprendre. Faire ces propres librairies je le concède est très enrichissant, mais demande un temps de fou ! surtout si on veut de la portabilité, il faut prévoir out les cas de figures; Je n'en suis pas encore la
@Paulfjujo : Pourquoi faire ce test de tempo, si tu es sur que ca fonctionne bien ? A la limite je comprendrais mieux que tu le fasse si y'a problème pour lever le doute non ? Ou peut être qu'il y a une autre raison ?
PS: bel ruse sans ICD . moi j'en ai un et je ne m'en sers jamais ! d'ailleurs je vais peut être ouvrir un post la dessus
Voici mon programme modifié :
grâce à test sur la donnée de commande envoyé je rajout une tempo ou non. Ainsi si la commande de donnée est un "return home " ou un "clear display" , je rajoute 1.5ms après l'envoi de l'instruction pour laisser le temps au LCD d’exécuter l’instruction.
Je ne souhaite pas encore gérer la portabilité, juste faire une petit lib perso pour mon écran, mais et surtout pour apprendre. Faire ces propres librairies je le concède est très enrichissant, mais demande un temps de fou ! surtout si on veut de la portabilité, il faut prévoir out les cas de figures; Je n'en suis pas encore la
@Paulfjujo : Pourquoi faire ce test de tempo, si tu es sur que ca fonctionne bien ? A la limite je comprendrais mieux que tu le fasse si y'a problème pour lever le doute non ? Ou peut être qu'il y a une autre raison ?
PS: bel ruse sans ICD . moi j'en ai un et je ne m'en sers jamais ! d'ailleurs je vais peut être ouvrir un post la dessus
Voici mon programme modifié :
Code : Tout sélectionner
/*##################################################################################
Programme de test pour librairie ecran LCD en mode 4 bit
Fait par Jérémy pour www.FantasPic.fr
- Version du "08-04-2016"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC a 8MHZ ,Quartz 8Mhz, PLL DISable
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
#################################################################################*/
// Connexions du module LCD
// La broche Read/Write est reliée à la masse pour ecriture permanente
#define LCD_RS LATB.B4 // 1:Data, 0:Cmde
#define LCD_EN LATB.B5 // Impulsion d'envoie
#define DATA4 LATB.B0 // les 4 bits de données
#define DATA5 LATB.B1
#define DATA6 LATB.B2
#define DATA7 LATB.B3
// Fin de connexion
//-------------------- Variables --------------------------------
unsigned int j=0,temp;
unsigned char compteur[7];
//------------------- FIN variables --------------------------------
//############################################################################################################
//------------------ Valide un Envoi de donnée ---------------------------------------
void Pulse(){
LCD_EN = 1;
delay_us(1);
LCD_EN = 0;
delay_us(45);
}
//------------------ Fonction qui envoi une commande ---------------------------------
//--- Parametre d'entree : la commande à envoyer
void LCD_cmde (int donnee) {
LCD_RS = 0 ; // Registre commande
LATB = (LATB & 0xF0) + (donnee >> 4 ) ; // On sort les 4 MSB de la donnée recue et on les affecte au LSB du PORTB sans toucher au MSB du PORTB
Pulse(); // On envoi la commande
if ( donnee == (0x01 || 0x02) || (0x03) ) delay_us(1600); //Si la commande est un "clear display" ou un "Return Home" alors grosse pause
LATB = (LATB & 0xF0) + (donnee & 0x0F) ; // On sort les 4 LSB et on les affecte au LSB du PORTB sans toucher au MSB du PORTB
Pulse(); // On envoi la commande
if ( donnee == (0x01 || 0x02) || (0x03) ) delay_us(1600); //Si la commande est un "clear display" ou un "Return Home" alors grosse pause
}
//------------------------- Fonction qui envoi une donnée -----------------------------
//--- Parametre d'entree : (la donnée à envoyer)
void LCD_data (int donnee){
LCD_RS = 1 ; // registre de donnée
LATB = (LATB & 0xF0) + (donnee >> 4 ) ; // On cache les 4 bits inutiles du portB(les 4bits MSB) et on rajoute les 4 bits MSB de la donné a envoyer au LSB au PORTB
Pulse(); // On envoi
LATB = (LATB & 0xF0) + (donnee & 0x0F) ;// On cache les 4 bits inutiles et on affecte le LSB au PORTB pour l'envoyer
Pulse(); // On envoi
}
//----------------- Fonction qui positionne le curseur dans la DDRAM ------------------
//--- Parametre d'entree: ( N° de ligne 1 ou 2 , N° de la colonne de 0 à 15)
void LCD_pos (int ligne, int colonne){
char position ;
if (ligne == 2)
position = 0b11000000 + colonne; // Si ligne=2 on rajoute 0x40 pour passer sur la deuxieme ligne
else position = 0b10000000 + colonne ; // Sinon on met seulement 128 pour indiquer que l'on positionne le curseur
LCD_cmde (position);
}
//---------------------------- Fonction qui configure le LCD ----------------------------
void LCD_conf(){
unsigned char i;
LCD_RS = 0 ; // Registre Commande
LATB = (LATB & 0xF0) + 3 ; // On place le portB à 0b:xxxx0011 pour passer en mode 4bits
for (i=0;i<=2;i++) Pulse(); // on l'envoie trois fois pour etre certains de passer en mode 4 bits
LCD_cmde (0x02); // Je pense qu'on envoi 2 car on ne sait pas quand le LCD est passé en mode 4 bit au premier deuxieme ou troisieme coup
LCD_cmde (0x28); // On envoi le mode 4 bit, sur 2 lignes et avec Dot5x8
LCD_cmde (0x0C); // Envoi de 0b:0000 puis de 0b:1100 display:On curseur:Off et clignotement:Off
LCD_cmde (0x01); // Envoi de 0b:0000 puis de 0b:0001 pour effacer l'ecran
LCD_cmde (0x06); // Envoi de 0b:0000 puis de 0b:0110 pour direction du curseur et shift auto
}
//---------------------- Fonction qui affiche du texte à la position voulue --------------------
//--- Parametre d'entree : (n° de la ligne 1 ou 2 , n° de la colonne 0 à 15 , texte à afficher entre guillemets ou une variable)
void LCD_txt (int ligne, int colonne, char txt[]){
char i=0 ;
LCD_pos (ligne, colonne); // on positionne le curseur en DDRAM
while (txt[i]!= 0) // On reboucle tant que l'on a pas recu de terminateur de string
{
LCD_data(txt[i]); // On affcihe notre caractere
i++; // On incremente le pointeur du tableau de caracteres
}
}
//#############################################################################################################
//------------------------------ Programme principal --------------------------------------------------
void main() {
ANSELA = 1; // Broche RA0 en analogique pour lecture ADC
ANSELB = 0; // PORTB en digital
ANSELD = 0; // PORTD en digital
TRISA = 1; // Brcohe RA0 en entrée pour lecture de la tension
TRISB = 0; // PORTB en sortie
TRISD = 255; // Le PORTD en Entrée pour les BP
LATB = 0; // RAZ du PORTB
delay_ms(10);
ADC_init(); // Initialisation du registre ADC
LCD_conf(); // Initialisation de l'ecran LCD
Sound_Init(&PORTE, 1);
delay_ms(10);
LCD_txt(1,0,"ceci est un test"); // ligne, colonne, texte
//#############################################################################################################
while(1)
{
temp = ADC_Read(0); // lecture analogique et stockage dans la variable "temp"
IntToStr(temp, compteur); // Conversion de la variable en chaine de caractere
LCD_txt(2,0,compteur); // On affiche la chaine de caractere
if ((PORTD.B0==1) && (j<65535)) // Si le BP(RB0) est appuyé
{
j++; // On incrémente le compteur
Sound_Play(1000, 50); // On fait un BIP à une fréquence de 1000Hz pendant 50ms
while (PORTD.B0==1); // Boucle anti-rebond
}
if ((PORTD.B1==1) && (j>0)) // Si le BP(RB1) est appuyé
{
j--; // On décrémente le compteur
Sound_Play(3000, 50); // On fait un BIP à une fréquence de 3000Hz pendant 50ms
while (PORTD.B1==1); // Boucle anti-rebond
}
IntToStr(j, compteur); // Conversion de la variable en chaine de caractere
LCD_txt(2,10,compteur); // On affiche la chaine de caractere
}
} Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités

