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
LCD en I²C
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
toujours pas corrigé !!!!!!!
I2C1_Wr( 0b10000000 );
Oups !! . Je pense que c'est une bonne piste.
Ce sera la première chose que je testerais ce soir .
0x74 définit sA0 à la masse !
Il y est ?
J'ai du fonctionner par test , pour en conclure qu'il l’était à la masse, car je n'ai aucun accès à cette broche.
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Pat a écrit :Source du message toujours pas corrigé !!!!!!!
I2C1_Wr( 0b10000000 );
Toujours pas !! . Je commence sérieusement à désespérer de la voir afficher un caractère un jour !
Comme il y a , deux control byte pour la phase d'initialisation j'ai essayer toutes les combinaisons possibles .
J'avais pensé aussi a la fonction contraste, mais d’après ce que j'ai cru comprendre en lisant la DS, après un démarrage par défaut le Vlcd est mis sur oFF pour la gestion de celui ci . Donc je ne devrais pas m'en préoccupé non ?
LCD en I²C
- paulfjujo

Maître- Messages : 3260
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir,
Ma curiosité m'a poussé à jeter un oeil sur la DOC p67-68
ou effectivement le mode I2C est décrit.
Je ne peux malheureusement pas tester le code suivant.. pas de PCF2119 ,ni de simulateur.
Le mode de commande de ton LCD en I2C est relativement transparent pour l'utilisateur,
contrairement à celui necessiatnt un module externe genre PCF8574 .. qui complique bien plus.
Je pense , come PAT, qu'il faut utiliser le STOP au niveau de l'I2C, ne serait que du coté PIC,
pour ne pas perturber l'I2C hardware de celui ci, ne pas oublier qui est le MAITRE : le PIC !
Le LCD a 2 modes , comme tous les autres LCD classiques
Le mode commande .. Clear,Home, deplacer le curseur
et le mode Data pour ecrire un caractere en zone DDRAM ..donc affiché ensuite.
j'ai modifié le code Control qui etait à 0, par CTRL_Mode = 0x80
Dans la boucle while du main programme
il faut bien repositionner le curseur au debut de l'ecran ..ou ailleurs
car avec l'auto increment l'affichage peut "couler "dehors!
nota: usage de LAT au lieu de PORT pour les sorties 18F ...
meme si PORT peut marcher.. evitera de futurs problemes
à tester .. sans garantie !
rajouter eventuellement un petit delay entre chaque ecriture de caractere
Ma curiosité m'a poussé à jeter un oeil sur la DOC p67-68
ou effectivement le mode I2C est décrit.
Je ne peux malheureusement pas tester le code suivant.. pas de PCF2119 ,ni de simulateur.
Le mode de commande de ton LCD en I2C est relativement transparent pour l'utilisateur,
contrairement à celui necessiatnt un module externe genre PCF8574 .. qui complique bien plus.
Je pense , come PAT, qu'il faut utiliser le STOP au niveau de l'I2C, ne serait que du coté PIC,
pour ne pas perturber l'I2C hardware de celui ci, ne pas oublier qui est le MAITRE : le PIC !
Le LCD a 2 modes , comme tous les autres LCD classiques
Le mode commande .. Clear,Home, deplacer le curseur
et le mode Data pour ecrire un caractere en zone DDRAM ..donc affiché ensuite.
j'ai modifié le code Control qui etait à 0, par CTRL_Mode = 0x80
Dans la boucle while du main programme
il faut bien repositionner le curseur au debut de l'ecran ..ou ailleurs
car avec l'auto increment l'affichage peut "couler "dehors!
nota: usage de LAT au lieu de PORT pour les sorties 18F ...
meme si PORT peut marcher.. evitera de futurs problemes
à tester .. sans garantie !
rajouter eventuellement un petit delay entre chaque ecriture de caractere
Code : Tout sélectionner
#define LCD_ADDR 0x74 // 0b0111 0100
#define LCD_CLEAR 0x01 // 0b0000 0001
#define LCD_HOME 0x02 // 0b0000 0010
#define CTRL_Mode 0x80
#define Function_set 0x20 // 0b0010 0000
#define Display_ctl 0x0E // 0b0000 1110
#define Entry_mode_set 0x06 // 0b0000 0110
#define DATA_mode 0x40
unsigned int i,j,k;
void Ecran_init() // routine d'initialisation page 64 de la DS
{
Delay_ms(50); // Attente apres l'allumage
I2C1_Start();
I2C1_Wr( LCD_ADDR ); // Envoie l'adresse de l'esclave
Delay_ms(5);
I2C1_Wr( CTRL_Mode ); // Envoi byte control pour ecrire des fonctions
Delay_ms(5);
I2C1_Wr( Function_set ); // Envoi d'un byte function_set
Delay_ms(5);
I2C1_Wr( Display_ctl ); // Envoi d'un byte control
Delay_ms(5);
I2C1_Wr( Entry_mode_set ); // Envoi d'un Entry_mode_set
Delay_ms(5);
I2C1_Stop();
}
void main()
{
ANSELB = 0; // Configure les broches en digital
ANSELC = 0;
ANSELE = 0;
PORTB = 0; // PORTB en sortie
PORTC = 0;
PORTE = 0;
TRISB = 0; // Mise a 0 du port B
TRISC = 0;
TRISE = 0;
Delay_ms(150); // Attente pour stabilisation
I2C1_Init(100000); // Initialisation de l'I2C
Ecran_init(); // Initialisation du LCD
while(1)
{
I2C1_Start();
I2C1_Wr( LCD_ADDR );
I2C1_Wr(CTRL_mode);
I2C1_Wr(LCD_HOME);
I2C1_Wr(DATA_mode);
I2C1_Wr(0x50 ); // Affiche la lettre "P"
I2C1_Wr(0x48 ); // Affiche la lettre "H"
I2C1_Wr('I'); // Affiche la lettre "I"
I2C1_Wr('L');
I2C1_Wr('I');
I2C1_Wr('P');
I2C1_Wr('S');
I2C1_Stop();
LATE_bit0= 0; // Pour verifier que le programme tourne
Delay_ms(500); // Je fais clignoter une led
LATE_bit0= 1;
Delay_ms(500);
}
}
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonsoir,
Toujours pas. la led ne clignote pas. mais je pense que le secret de ce maudit écran est par la .
Je vérifie ton code ligne par ligne et je reviens.
quand tu ecris "j'ai regarder page 66/67",mais ces lignes ne sont pas applicable pour l'I²C ?
Toujours pas. la led ne clignote pas. mais je pense que le secret de ce maudit écran est par la .
Je vérifie ton code ligne par ligne et je reviens.
quand tu ecris "j'ai regarder page 66/67",mais ces lignes ne sont pas applicable pour l'I²C ?
Table 46. Initialization by instruction, 4-bit interface; not applicable for I2C-bus operation
LCD en I²C
LCD en I²C
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Je donne ma langue au chat, pour un premier projet , c'est plutôt raté ! je n'arrive même pas à faire fonctionner un LCD.
J'ai essayer plein de combinaison, voir toutes . avec le control bite et les autre aussi . Aucune n'a fonctionnées. j'ai testé plein de code du net et essayer de les adapter à mikroC, sans succès . J'ai respecter à la lettre l'exemple de la DS , RIEN .
Il y à forcement quelques chose qui nous échappe . MAIS quoi ! ? le contraste , je pense pas . Y'a une histoire de stockage de données en DDRAM que j'ai pas compris . Ne faudrait-il pas aller les lires pour les affichées, un truc du genre ?
cette histoire de control_byte a 0x80 plutot que 0x00 , j'ai pas compris non plus l'interet du bit 7 de cette fonction ( CO)
Ce qui m'agace ce que même sans écrire une lettre, je devrais voir mon curseur apparaitre au bout de 3 commandes seulement !! je comprends pas ...
J'ai commenter mon programme, corrigé les erreurs ca donne ca.
- A l'analyseur logique , les trames sont parfaites et renvoyés avec l'ACK .
- J'ai changer d'écran , le résultat est le même , au cas ou ils sotn defectueux .
J'ai essayer plein de combinaison, voir toutes . avec le control bite et les autre aussi . Aucune n'a fonctionnées. j'ai testé plein de code du net et essayer de les adapter à mikroC, sans succès . J'ai respecter à la lettre l'exemple de la DS , RIEN .
Il y à forcement quelques chose qui nous échappe . MAIS quoi ! ? le contraste , je pense pas . Y'a une histoire de stockage de données en DDRAM que j'ai pas compris . Ne faudrait-il pas aller les lires pour les affichées, un truc du genre ?
cette histoire de control_byte a 0x80 plutot que 0x00 , j'ai pas compris non plus l'interet du bit 7 de cette fonction ( CO)
Ce qui m'agace ce que même sans écrire une lettre, je devrais voir mon curseur apparaitre au bout de 3 commandes seulement !! je comprends pas ...
J'ai commenter mon programme, corrigé les erreurs ca donne ca.
Code : Tout sélectionner
#define LCD_ADDR 0x74 // 0b0111 0100
#define LCD_CLEAR 0x01 // 0b0000 0001
#define LCD_HOME 0x02 // 0b0000 0010
#define Control_byte 0x00 // 0b0000 0000
#define Function_set 0x34 // 0b0011 0000
#define Display_ctl 0x0E // 0b0000 1110
#define Entry_mode_set 0x06 // 0b0000 0110
/*################################################################################*/
/*######################### INITIALISATION ###############################*/
/*################################################################################*/
void Ecran_init() // routine d'initialisation page 64 de la DS
{
I2C1_Start();
I2C1_Wr(LCD_ADDR); // Envoie l'adresse de l'esclave 0b0111 0100 = 0x74
// Envoi CONTROL_Mode // bit7 -> 0=dernier octet de la série, 1=d'autre octet vont suivre après celui ci.
// bit6 -> 0=registre inst , 1=registre Data
I2C1_Wr(0b10000000); // bit5à0 -> 0
// 0b10000000 = 0x80
// Envoi d'un function_set // bit7à5 valeurs fixes : 001
// bit4: 0:2x4bit, 1:8 bits
I2C1_Wr(0b00110100); // bit3: 0 Non utilisé
// bit2: 0: 1ligne/32char, 1: 2lignes/16char
// bit1: 0: 1/18 multiplex, 1: 1/9 multiplex
// bit0: 0: standard instr., 1: extended instr.
// 0b00110100 = 0x34
// Envoi d'un display_ctl // bit7à3: valeur fixe : 00001
// bit2: 0:display off, 1:display On
I2C1_Wr(0b00001110); // bit1: 0:cursor off, 1:cursor On
// bit0: 0:clignotement off, 1:On
// 0b00001110 = 0x0E
// Envoi Entry_mode_set // bit7à2: valeur fixe : 000001
// bit1: 0:Decremente l'adresse , 1:Incremente (curseur vers la droite)
I2C1_Wr(0b00000110); // bit0: 0:No shift , 1: Shift display
// 0b00000110 = 0x06
I2C1_Stop(); // Fin de l'I2C
}
/*################################################################################*/
/*###################### PROGRAMME PRINCIPAL #############################*/
/*################################################################################*/
void main()
{
ANSELB = 0; // Configure les broches en digital
ANSELC = 0;
ANSELD = 0;
PORTD = 0;
TRISD = 0;
Delay_ms(100); // Attente pour stabilisation apres l'allumage
I2C1_Init(100000); // Initialisation de l'I2C
LATD = 1; // Allume une led pour declenchement analyseur logique
Ecran_init(); // On va initialiser notre écran
/*################################################################################*/
/*######################### BOUCLE INFINIE ###############################*/
/*################################################################################*/
while(1)
{
//------------------ INSTRUCTION POUR EFFACER L'ECRAN --------------------------
I2C1_Start();
I2C1_Wr(LCD_ADDR); // Adresse esclave
I2C1_Wr(0b10000000); // on passe en mode Control pour envoyer des instructions
I2C1_Wr(LCD_CLEAR); // Efface l'écran
I2C1_Wr(LCD_HOME); // replace le curseur au début
I2C1_Stop();
//------------------ ENVOI DES DATAS POUR AFFICHAGE --------------------------
I2C1_Start();
I2C1_Wr( LCD_ADDR ); // Envoie l'adresse de l'esclave 0b01110100 = 0x74
// Envoi DATA_Mode // bit7 -> 0=last control byte, 1=another control byte
// bit6 -> 0=registre inst , 1=registre Data
I2C1_Wr( 0b01000000 ); // bit5à0 -> 0
// 0b01000000 = 0x40
I2C1_Wr(0x50 ); // Affiche la lettre "P"
I2C1_Wr(0x48 ); // Affiche la lettre "H"
I2C1_Wr(0x53 ); // Affiche la lettre "S"
I2C1_Stop();
//------------------ VERIFIE QUE LE PROGRAMME TOUNE --------------------------
LATD = 1; // Allume une led test
delay_ms(150);
LATD = 0; // Pour verifier que le programme tourne
delay_ms(150); // Je fais clignoter une led
}
}- A l'analyseur logique , les trames sont parfaites et renvoyés avec l'ACK .
- J'ai changer d'écran , le résultat est le même , au cas ou ils sotn defectueux .
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Après RE-RE-RE-RE lecture, j'ai insisté sur les points qui me paraissait flous .
par exemple ce fameux bytes C0 ( bit 7) du "CONTROL_MODE"
Je viens de comprendre que quand il est à 1 , cela signifie que derrière l'octet il y aura encore une commande de contrôle, si on le met à 0, cela signifie que ce byte est le dernier de la série ;
Mais cela veut dire aussi qu'il faut mettre un control_mode avant chaque fonction ?
Un autre truc ma chagrine, Pourquoi on écrit "I2C1" ? car il y a plusieurs I2C sur le PIC18F45K22 .
Que signifie cette ligne "I2C1_Init(100000);"
Sinon sur la démarche et le déroulement, je ne trouve pas de probléme.
par exemple ce fameux bytes C0 ( bit 7) du "CONTROL_MODE"
Je viens de comprendre que quand il est à 1 , cela signifie que derrière l'octet il y aura encore une commande de contrôle, si on le met à 0, cela signifie que ce byte est le dernier de la série ;
Mais cela veut dire aussi qu'il faut mettre un control_mode avant chaque fonction ?
Un autre truc ma chagrine, Pourquoi on écrit "I2C1" ? car il y a plusieurs I2C sur le PIC18F45K22 .
Que signifie cette ligne "I2C1_Init(100000);"
Sinon sur la démarche et le déroulement, je ne trouve pas de probléme.
LCD en I²C
- paulfjujo

Maître- Messages : 3260
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
j'indiquais juste que les pages qu'indiquait paulfjujo etait pour le mode 4 bit et non pour l'I2C .
je me suis trompé sur le numero des pages, mais c'est bien sur l'exemple Table 44 I2C
pages 64 et 65 que je me suis basé !
extended mode ...
Code : Tout sélectionner
I2C1_Wr(0b00100100); // =0x24 .... was 0x34 ! Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités

