IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Initialisation LCD 4bits PIC32


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Points : 21
    Points
    21
    Par défaut Initialisation LCD 4bits PIC32
    Bonjour, après une semaine de recherche je viens vers vous car je n'arrive pas à initialiser correctement mon LCD en 4 bits

    J'ai recherché tous les protocoles pour différent contrôleur afin de tester. J'ai branché mon écran sur une Arduino et ça marche donc doit y avoir un problème dans mon code je pense.

    Ce que je fais : J'initialise mon écran --> j'écris un caractère 'A'.

    Ce qui se passe : Curseur Clignote --> Ce qui apparaît : '0'.

    L'octet que je veux envoyer est 0100 0001
    Le caractère affiché est l'octet 1111 0001

    Et à l'oscilloscope DB0 à DB3 sont à l'état HAUT. Je précise que je ne les relis pas à la masse, je les laisse en l'air et ça marche avec l'arduino donc aucun soucis. Bien sur j'ai tenté de les mettre à la masse mais DB0 et DB1 n'aime pas du tout et mon écran affiche plus rien (je sais j'ai un truc bizarre ).

    Détail : mon écran est alimenté en 3,3V (compatible) avec UN PIC en 3.3V aussi. Le test arduino a été fait en 5V.

    J'ai l'impression qu'il prend le mode 8 bits alors qu'il me faut le 4 bits... Voici le code :

    La lib :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
     
     
     
    #ifndef TESTLCD_H
    #define	TESTLCD_H
     
    /*************************************************************************************/
    typedef unsigned char byte; 		  //facultatif.
    typedef unsigned int word;       	//facultatif.
    typedef unsigned long dword;     	//facultatif.
     
    /*************************************************************************************/
    /**************************************************************************************
    Afficheur LCD 2x16 caractères
     
    On présente dans ce qui suit une bibliothèque de fonctions et routines gérant un
    afficheur LCD alphanumérique opérant en mode 4 bits. Les broches de commandes et de
    données sont initialisées à l'intérieur de la fonction init_lcd.
     
    Grace à l'utilisation de la technique dite "champ de bits" le choix de brochage des
    bits de données et de commandes entre le LCD et le micro est libre. Ceci permet de
    rendre les broches, spécifiques à d'autres applications, disponibles.
     
    **************************************************************************************/
    /* Déclaration d'un champ de bits */
     
    union {  			  //une union de nom mon_octet constituée par une structure de 8 bits
    				        //et un byte à la même adresse mémoire.
    	struct { 		  //une structure 8 bits (champ de bits).
    		byte bit0:1,
    		bit1:1,
    		bit2:1,
    		bit3:1,
    		bit4:1,
    		bit5:1,
    		bit6:1,
    		bit7:1;
    	}bits;
    	byte octet; 		  //un byte (octet).
    } mon_octet ; 			//accès à l'octet complet par  mon_octet.octet  et
    				            //accès aux bits par mon_octet.bits.bitx .
     
    /*************************************************************************************/
    /* Définition des broches utilisées */
     
    //Le brochage adopté est sur un seul port (PORTB du HC08) du HC08:
     
    #include "HardwareProfile.h"
    #include "fonctions.h"
     
    /* Déclaration des fonctions élaborées */
     
    void ecr_ctrl(byte ctrl);
    void ecr_data(byte data);
    void init_lcd(byte curseur);
    void xy_lcd(byte x, byte y);
    void aff_car(byte c);
    void aff_txt(byte *message);
    void efface_lcd(void);
    void defini_cars(const byte *c, byte char_code);
    void onoff_lcd(byte onoff);
     
    /* Fonctions additionnelles permettant de gérer les différentes conversions HEXA/ASCII,
    FLOAT/ASCII..., et affichage direct dans la RAM du LCD : */
     
    void aff_base(dword hexa, byte base);
    void aff_float(float data, byte decimale);
    void aff_CAN(byte CAN, byte decimal);
    void aff_heure(byte heures, byte minutes, byte secondes);
     
    /* Temporisation logicielle: */
     
    void tempo_ms(word temps);
     
    //*************************************************************************************
    /* Constante utile pour la conversion HEXA/ASCII. Elle contient les codes ascii des
    caractères de 0 à F. ex: h[12]=code ascii (0x43) du caractère C. */
     
    const byte *h="0123456789ABCDEF";
     
     
     
    /**************************************************************************************
    void ecr_ctrl(byte ctrl)
     
    Envoie un octet ctrl de contrôle pour modifier la configuration du LCD. L'envoi au LCD
    de cet octet se fait en mode deux fois 4 bits.
     
    **************************************************************************************/
    void ecr_ctrl(byte ctrl){
     
     
    	//utilise la variable mon_octet.octet pour avoir accès aux bits de ctrl :
    	mon_octet.octet=ctrl;
     
    	//met d'abord les 4 bits de poids forts de ctrl sur les 4 lignes DATA 7-4 utilisées du LCD
      //(mode 4 bits)
     
    	DB4 = mon_octet.bits.bit4;
    	DB5 = mon_octet.bits.bit5;
    	DB6 = mon_octet.bits.bit6;
    	DB7 = mon_octet.bits.bit7;
     
    	RS_LCD=0;				//envoie un octet de commande.
    	Enable_LCD=1; 				  //validation par l'impulsion E.
            delay_us(1);
    	Enable_LCD=0;
     
    	//met par la suite les 4 bits de poids faible de ctrl sur les 4 lignes DATA 7-4
    	//utilisées du LCD (mode 4 bits)
    	DB4 = mon_octet.bits.bit0;
    	DB5 = mon_octet.bits.bit1;
    	DB6 = mon_octet.bits.bit2;
    	DB7 = mon_octet.bits.bit3;
     
    	Enable_LCD=1; 				  //validation par l'impulsion E.
            delay_us(1);
    	Enable_LCD=0;
     
     
     
     
    }
     
    /**************************************************************************************
    void ecr_data(byte data)
     
    Envoie un octet de donnée data dans la RAM du LCD.
     **************************************************************************************/
    void ecr_data(byte data){
     
     
    	//utilise la variable  mon_octet.octet  pour avoir accès aux bits de data.
    	mon_octet.octet=data;
     
    	//met d'abord les 4 bits de poids forts de data sur les 4 lignes DATA 7-4 utilisées du
    	//LCD (mode 4 bits)
    	DB4 = mon_octet.bits.bit4;
    	DB5 = mon_octet.bits.bit5;
    	DB6 = mon_octet.bits.bit6;
    	DB7 = mon_octet.bits.bit7;
     
    	RS_LCD=1;				//envoie un octet de commande.
            delay_us(1);
    	Enable_LCD=1; 				  //validation par l'impulsion E.
            delay_us(1);
    	Enable_LCD=0;
     
    	//met par la suite les 4 bits de poids faible de ctrl sur les 4 lignes DATA 7-4
    	//utilisées du LCD (mode 4 bits)
    	DB4 = mon_octet.bits.bit0;
    	DB5 = mon_octet.bits.bit1;
    	DB6 = mon_octet.bits.bit2;
    	DB7 = mon_octet.bits.bit3;
     
    	Enable_LCD=1; 				  //validation par l'impulsion E.
            delay_us(1);
    	Enable_LCD=0;
     
            delay_ms(2);
     
    }
     
     
    /**************************************************************************************
    void init_lcd(byte curseur)
     
    Initialise le LCD et les PORTs utilisés.
     
    Paramètres
     
            curseur = 0 : curseur fixe hors service, affichage actif.
            curseur = 1 : curseur en service, affichage actif.
            curseur = 2 : curseur clignotant en service, affichage actif.
     
    **************************************************************************************/
    void init_lcd(byte curseur){
     
     
            ecr_ctrl(0x03);
            delay_us(4500);
     
            ecr_ctrl(0x03);
            delay_us(4500);
     
            ecr_ctrl(0x03);
            delay_us(150);
     
            ecr_ctrl(0x02);
     
    	ecr_ctrl(0x28);         //adressage 4 Bits, afficheur 2 lignes.
            delay_ms(1);
     
    	ecr_ctrl(0x06);         //incrémente l'adresse DD-RAM (l'affichage se décale vers la droite).
     
    	ecr_ctrl(0x01);         //effacement de l'écran et curseur positionné en haut à gauche.
     
    	switch(curseur){
     
    	case 0:
    		ecr_ctrl(0x0C);		//curseur hors service, affichage actif.
    		break;
     
    	case 1:
    		ecr_ctrl(0x0E);		//curseur en service, affichage actif.
    		break;
     
    	case 2:
    		ecr_ctrl(0x0F); 	//curseur clignotant en service.
    		break;
     
    	default:
    		break;
    	};
     
     
     
    }
     
    /**************************************************************************************
    void xy_lcd(byte x, byte y)
     
    Positionne le curseur aux coordonnées (x, y) : 1 <= x <= 16 et 1 <= y <= 2.
     
    **************************************************************************************/
    void xy_lcd(byte x, byte y){
     
    	if (y==1)
    		ecr_ctrl(0x80+x-1);               //positionne la ligne 1 aux coordonnées (x, 1).
     
    	if (y==2)
    		ecr_ctrl(0xC0+x-1);               //positionne la ligne 2 aux coordonnées (x, 2).
     
     
     
    }
     
    /**************************************************************************************
    void aff_car(byte c)
     
    Affiche à la position du curseur le caractère dont le code ascii est c.
     
    **************************************************************************************/
    void aff_car(byte c){
     
    	ecr_data (c);
    }
     
    /**************************************************************************************
     
    void aff_txt(byte *message)
     
    Affiche, à la position du curseur, le texte " message ".
     
    *message : pointeur sur le message stocké en ROM (mémoire Flash).
     
    Option
     
    \r placé dans message provoque le retour au début de la ligne suivante.
     
    **************************************************************************************/
    void aff_txt(byte *message){
     
    	while(*message!= '\0'){	        //écriture sur le LCD de toute la chaîne.
     
    		if(*message=='\r')
    			xy_lcd(1,2);
    		else
    			aff_car(*message);          //écriture sur le LCD d'un caractère du message.
     
    		message++;
    	};
    }
     
    /**************************************************************************************
    void efface_lcd(void)
     
    Efface l'écran et positionne le curseur en haut à gauche.
     
    **************************************************************************************/
    void efface_lcd(void){
     
    	ecr_ctrl(0x01);
    }
     
    #endif
    Le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    int main(int argc, char** argv) {
     
     
        SYSTEMConfig (SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
     
        init_Broches();
     
        delay_ms(40);
     
        init_lcd(2);
        delay_ms(5);
     
            aff_car('A');
            delay_ms (1000);
     
        while (1)
        {
     
        }
    }
    Je vous retire les autres includes et tout. J'ai créé mes propres fonctions delay() en fonction de l'horloge du PIC (80MHz).

    Merci à vous de prendre le temps de lire et de m'aider

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Comme par hasard quand je publie je résous une partie du problème...

    J'arrive à afficher le bon caractère, il me faut forcer la commande 0x28 dans la fonction d'initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    void init_lcd(byte curseur){
     
     
            ecr_ctrl(0x03);
            delay_us(4500);
     
            ecr_ctrl(0x03);
            delay_us(4500);
     
            ecr_ctrl(0x03);
            delay_us(150);
     
            ecr_ctrl(0x02);
     
    	ecr_ctrl(0x28);         //adressage 4 Bits, afficheur 2 lignes.
            delay_us(4500);
     
            ecr_ctrl(0x28);         //adressage 4 Bits, afficheur 2 lignes.
            delay_us(150);
     
     	ecr_ctrl(0x28);         //adressage 4 Bits, afficheur 2 lignes.
     
     
    	ecr_ctrl(0x06);         //incrémente l'adresse DD-RAM (l'affichage se décale vers la droite).
     
    	ecr_ctrl(0x01);         //effacement de l'écran et curseur positionné en haut à gauche.
     
    	switch(curseur){
     
    	case 0:
    		ecr_ctrl(0x0C);		//curseur hors service, affichage actif.
    		break;
     
    	case 1:
    		ecr_ctrl(0x0E);		//curseur en service, affichage actif.
    		break;
     
    	case 2:
    		ecr_ctrl(0x0F); 	//curseur clignotant en service.
    		break;
     
    	default:
    		break;
    	};
     
    }
    Sauf que quand je fais cela, le contraste de l'écran est EXTREMEMENT faible... je le vois à peine. Bien sur j'ai mis un potar et j'ai tenté de relié la broche Vo à la masse (avant qu'on me dise "Est ce que tu as.....").

    Par contre quand je change 0x28 par 0x20 le caractère s'affiche correctement et est visible... malheureusement il s'agit d'un afficheur 4 lignes (vous avez compris le problème ^^).

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    salut,

    Datasheet du LCD ?
    Schéma électronique de la connection PIC <=> LCD ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Pas grand chose dessus : http://docs-europe.electrocomponents...6b80f25f62.pdf

    Doc du contrôleur : http://www.hantronix.com/files/down/splc780d.pdf

    Je suis sur une plaque d'essai pour le moment : PIC32MX795F512L

    Les connections :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    // LCD
    #define RS_TRIS                         (TRISGbits.TRISG1)
    #define RS_LCD                          (LATGbits.LATG1)
    #define Enable_TRIS                     (TRISBbits.TRISB2)
    #define Enable_LCD                      (LATBbits.LATB2)
     
    #define DB4_TRIS                        (TRISBbits.TRISB3)
    #define DB5_TRIS			(TRISGbits.TRISG6)
    #define DB6_TRIS                        (TRISGbits.TRISG7)
    #define DB7_TRIS			(TRISEbits.TRISE5)
    #define DB4                             (LATBbits.LATB3)
    #define DB5				(LATGbits.LATG6)
    #define DB6                             (LATGbits.LATG7)
    #define DB7				(LATEbits.LATE5)

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Quand je lis ton code, j'ai l'impression que tu ne suis as les timming décris dans le paragraphe 6.5.6 du contrôleur.

    As-tu essayé de mettre des condensateurs comme décrit en page 17 (je ne pense pas que le problème vienne de là mais on ne sait jamais...)

    Tu suis bien la séquence de démarrage décrite en page 11 ?

    As-tu essayé de faire la séquence décrite en paragraphe 5.5 ? ça donne quoi ?

    Tu n'as pas modifié l'horloge de ton controle entre les deux manip ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    J'ai suivi la doc du contrôleur Je suis passé par plusieurs doc et ce que tu vois sont des tempos minimum. Rien n'empêche de mettre plus comme tu peux le voir sur plein de bibliothèque LCD sur Internet.

    J'ai réaliser la même chose que le schéma dont tu parles. Le code que je vous ai donné est celui avec lequel j'ai réussi à avoir un résultat

    Que veux tu dires par changer la fréquence du contrôleur ? Je sais pas si c'est possible et je ne sais pas si j'ai changé ça fréquence

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Essais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    // initialisation de l'état de demararge du controlleur
    // => fonction a appeler avant ecr_ctrl() et ecr_data()
    void ecr_init(void){
    	Enable_LCD=0;
    	delay_ms(20); // 15ms min
     
    	/*
    	// reset function : utile ?
     
    	ecr_write(0b0011, 0);
    	delay_ms(6); // 4.1ms min
     
     	ecr_write(0b0011, 0);
    	delay_us(150); // 100µs min
     
    	ecr_write(0b0011, 0); // utile ?
    	// */
     
    	ecr_write(0b0010, 0); // active mode 4bits
    	//ecr_ctrl(0b00100000); // active mode 1 ligne, 5x8 dots character font.
    	ecr_ctrl(0b00100000); // active mode 2 lignes, 5x8 dots character font.
    	ecr_ctrl(0b00001110); // active affichage
    	ecr_ctrl(0b00000110); // decremente l'adresse
     
    	//ecr_data(0b01010111); // écrit W (pout test)
    }
    void ecr_write(byte data, bye rs_val){
        // Respecter timing Datasheet 6.5.6
     
    	delay_us(1);
    	RS_LCD = rs_val;
    	// signal R/W vaut toujours 0 ? ... il n'apparait pas dans cette fonction
     
    	delay_us(1);
    	Enable_LCD=1;
     
    	delay_us(1); // utile ? ... a poriori, non
    	if(data & 0x01){
    		DB4 = 1;
    	} else {
    		DB4 = 0;	
    	}
    	if(data & 0x02){
    		DB5 = 1;
    	} else {
    		DB5 = 0;	
    	}
    	if(data & 0x04){
    		DB6 = 1;
    	} else {
    		DB6 = 0;	
    	}
    	if(data & 0x08){
    		DB7 = 1;
    	} else {
    		DB7 = 0;	
    	}
     
    	delay_us(1);
    	Enable_LCD=0; // le controlleur échantillonne les valeurs de DB0-7 sur front descendant
    }
     
    void ecr_ctrl(byte ctrl){
    	ecr_write(ctrl >> 4, 0);
    	ecr_write(ctrl, 0);
    }
    void ecr_data(byte data){
    	ecr_write(ctrl >> 4, 1);
    	ecr_write(ctrl, 1);
    }
     
     
     
    int main(int argc, char** argv) {
        SYSTEMConfig (SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
     
        init_Broches();
    	ecr_init();
     
    	ecr_data('A'); // affiche caratère 'A'
     
    	while (1);
    }
    La ligne R/W est a quel état ? ... il faudrait qu'elle soit forcée à 0V

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par DangerousMic Voir le message
    Bonjour, après une semaine de recherche je viens vers vous car je n'arrive pas à initialiser correctement mon LCD en 4 bits

    J'ai recherché tous les protocoles pour différent contrôleur afin de tester. J'ai branché mon écran sur une Arduino et ça marche donc doit y avoir un problème dans mon code je pense.

    Ce que je fais : J'initialise mon écran --> j'écris un caractère 'A'.

    Ce qui se passe : Curseur Clignote --> Ce qui apparaît : '0'.

    L'octet que je veux envoyer est 0100 0001
    Le caractère affiché est l'octet 1111 0001

    Et à l'oscilloscope DB0 à DB3 sont à l'état HAUT. Je précise que je ne les relis pas à la masse, je les laisse en l'air et ça marche avec l'arduino donc aucun soucis. Bien sur j'ai tenté de les mettre à la masse mais DB0 et DB1 n'aime pas du tout et mon écran affiche plus rien (je sais j'ai un truc bizarre ).

    Détail : mon écran est alimenté en 3,3V (compatible) avec UN PIC en 3.3V aussi. Le test arduino a été fait en 5V.

    J'ai l'impression qu'il prend le mode 8 bits alors qu'il me faut le 4 bits... Voici le code :

    La lib :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
     
     
     
    #ifndef TESTLCD_H
    #define	TESTLCD_H
     
    /*************************************************************************************/
    typedef unsigned char byte; 		  //facultatif.
    typedef unsigned int word;       	//facultatif.
    typedef unsigned long dword;     	//facultatif.
     
    /*************************************************************************************/
    /**************************************************************************************
    Afficheur LCD 2x16 caractères
     
    On présente dans ce qui suit une bibliothèque de fonctions et routines gérant un
    afficheur LCD alphanumérique opérant en mode 4 bits. Les broches de commandes et de
    données sont initialisées à l'intérieur de la fonction init_lcd.
     
    Grace à l'utilisation de la technique dite "champ de bits" le choix de brochage des
    bits de données et de commandes entre le LCD et le micro est libre. Ceci permet de
    rendre les broches, spécifiques à d'autres applications, disponibles.
     
    **************************************************************************************/
    /* Déclaration d'un champ de bits */
     
    union {  			  //une union de nom mon_octet constituée par une structure de 8 bits
    				        //et un byte à la même adresse mémoire.
    	struct { 		  //une structure 8 bits (champ de bits).
    		byte bit0:1,
    		bit1:1,
    		bit2:1,
    		bit3:1,
    		bit4:1,
    		bit5:1,
    		bit6:1,
    		bit7:1;
    	}bits;
    	byte octet; 		  //un byte (octet).
    } mon_octet ; 			//accès à l'octet complet par  mon_octet.octet  et
    				            //accès aux bits par mon_octet.bits.bitx .
     
    /*************************************************************************************/
    /* Définition des broches utilisées */
     
    //Le brochage adopté est sur un seul port (PORTB du HC08) du HC08:
     
    #include "HardwareProfile.h"
    #include "fonctions.h"
     
    /* Déclaration des fonctions élaborées */
     
    void ecr_ctrl(byte ctrl);
    void ecr_data(byte data);
    void init_lcd(byte curseur);
    void xy_lcd(byte x, byte y);
    void aff_car(byte c);
    void aff_txt(byte *message);
    void efface_lcd(void);
    void defini_cars(const byte *c, byte char_code);
    void onoff_lcd(byte onoff);
     
    /* Fonctions additionnelles permettant de gérer les différentes conversions HEXA/ASCII,
    FLOAT/ASCII..., et affichage direct dans la RAM du LCD : */
     
    void aff_base(dword hexa, byte base);
    void aff_float(float data, byte decimale);
    void aff_CAN(byte CAN, byte decimal);
    void aff_heure(byte heures, byte minutes, byte secondes);
     
    /* Temporisation logicielle: */
     
    void tempo_ms(word temps);
     
    //*************************************************************************************
    /* Constante utile pour la conversion HEXA/ASCII. Elle contient les codes ascii des
    caractères de 0 à F. ex: h[12]=code ascii (0x43) du caractère C. */
     
    const byte *h="0123456789ABCDEF";
     
     
     
    /**************************************************************************************
    void ecr_ctrl(byte ctrl)
     
    Envoie un octet ctrl de contrôle pour modifier la configuration du LCD. L'envoi au LCD
    de cet octet se fait en mode deux fois 4 bits.
     
    **************************************************************************************/
    void ecr_ctrl(byte ctrl){
     
     
    	//utilise la variable mon_octet.octet pour avoir accès aux bits de ctrl :
    	mon_octet.octet=ctrl;
     
    	//met d'abord les 4 bits de poids forts de ctrl sur les 4 lignes DATA 7-4 utilisées du LCD
      //(mode 4 bits)
     
    	DB4 = mon_octet.bits.bit4;
    	DB5 = mon_octet.bits.bit5;
    	DB6 = mon_octet.bits.bit6;
    	DB7 = mon_octet.bits.bit7;
     
    	RS_LCD=0;				//envoie un octet de commande.
    	Enable_LCD=1; 				  //validation par l'impulsion E.
            delay_us(1);
    	Enable_LCD=0;
     
    	//met par la suite les 4 bits de poids faible de ctrl sur les 4 lignes DATA 7-4
    	//utilisées du LCD (mode 4 bits)
    	DB4 = mon_octet.bits.bit0;
    	DB5 = mon_octet.bits.bit1;
    	DB6 = mon_octet.bits.bit2;
    	DB7 = mon_octet.bits.bit3;
     
    	Enable_LCD=1; 				  //validation par l'impulsion E.
            delay_us(1);
    	Enable_LCD=0;
     
     
     
     
    }
     
    /**************************************************************************************
    void ecr_data(byte data)
     
    Envoie un octet de donnée data dans la RAM du LCD.
     **************************************************************************************/
    void ecr_data(byte data){
     
     
    	//utilise la variable  mon_octet.octet  pour avoir accès aux bits de data.
    	mon_octet.octet=data;
     
    	//met d'abord les 4 bits de poids forts de data sur les 4 lignes DATA 7-4 utilisées du
    	//LCD (mode 4 bits)
    	DB4 = mon_octet.bits.bit4;
    	DB5 = mon_octet.bits.bit5;
    	DB6 = mon_octet.bits.bit6;
    	DB7 = mon_octet.bits.bit7;
     
    	RS_LCD=1;				//envoie un octet de commande.
            delay_us(1);
    	Enable_LCD=1; 				  //validation par l'impulsion E.
            delay_us(1);
    	Enable_LCD=0;
     
    	//met par la suite les 4 bits de poids faible de ctrl sur les 4 lignes DATA 7-4
    	//utilisées du LCD (mode 4 bits)
    	DB4 = mon_octet.bits.bit0;
    	DB5 = mon_octet.bits.bit1;
    	DB6 = mon_octet.bits.bit2;
    	DB7 = mon_octet.bits.bit3;
     
    	Enable_LCD=1; 				  //validation par l'impulsion E.
            delay_us(1);
    	Enable_LCD=0;
     
            delay_ms(2);
     
    }
     
     
    /**************************************************************************************
    void init_lcd(byte curseur)
     
    Initialise le LCD et les PORTs utilisés.
     
    Paramètres
     
            curseur = 0 : curseur fixe hors service, affichage actif.
            curseur = 1 : curseur en service, affichage actif.
            curseur = 2 : curseur clignotant en service, affichage actif.
     
    **************************************************************************************/
    void init_lcd(byte curseur){
     
     
            ecr_ctrl(0x03);
            delay_us(4500);
     
            ecr_ctrl(0x03);
            delay_us(4500);
     
            ecr_ctrl(0x03);
            delay_us(150);
     
            ecr_ctrl(0x02);
     
    	ecr_ctrl(0x28);         //adressage 4 Bits, afficheur 2 lignes.
            delay_ms(1);
     
    	ecr_ctrl(0x06);         //incrémente l'adresse DD-RAM (l'affichage se décale vers la droite).
     
    	ecr_ctrl(0x01);         //effacement de l'écran et curseur positionné en haut à gauche.
     
    	switch(curseur){
     
    	case 0:
    		ecr_ctrl(0x0C);		//curseur hors service, affichage actif.
    		break;
     
    	case 1:
    		ecr_ctrl(0x0E);		//curseur en service, affichage actif.
    		break;
     
    	case 2:
    		ecr_ctrl(0x0F); 	//curseur clignotant en service.
    		break;
     
    	default:
    		break;
    	};
     
     
     
    }
     
    /**************************************************************************************
    void xy_lcd(byte x, byte y)
     
    Positionne le curseur aux coordonnées (x, y) : 1 <= x <= 16 et 1 <= y <= 2.
     
    **************************************************************************************/
    void xy_lcd(byte x, byte y){
     
    	if (y==1)
    		ecr_ctrl(0x80+x-1);               //positionne la ligne 1 aux coordonnées (x, 1).
     
    	if (y==2)
    		ecr_ctrl(0xC0+x-1);               //positionne la ligne 2 aux coordonnées (x, 2).
     
     
     
    }
     
    /**************************************************************************************
    void aff_car(byte c)
     
    Affiche à la position du curseur le caractère dont le code ascii est c.
     
    **************************************************************************************/
    void aff_car(byte c){
     
    	ecr_data (c);
    }
     
    /**************************************************************************************
     
    void aff_txt(byte *message)
     
    Affiche, à la position du curseur, le texte " message ".
     
    *message : pointeur sur le message stocké en ROM (mémoire Flash).
     
    Option
     
    \r placé dans message provoque le retour au début de la ligne suivante.
     
    **************************************************************************************/
    void aff_txt(byte *message){
     
    	while(*message!= '\0'){	        //écriture sur le LCD de toute la chaîne.
     
    		if(*message=='\r')
    			xy_lcd(1,2);
    		else
    			aff_car(*message);          //écriture sur le LCD d'un caractère du message.
     
    		message++;
    	};
    }
     
    /**************************************************************************************
    void efface_lcd(void)
     
    Efface l'écran et positionne le curseur en haut à gauche.
     
    **************************************************************************************/
    void efface_lcd(void){
     
    	ecr_ctrl(0x01);
    }
     
    #endif
    Le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    int main(int argc, char** argv) {
     
     
        SYSTEMConfig (SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
     
        init_Broches();
     
        delay_ms(40);
     
        init_lcd(2);
        delay_ms(5);
     
            aff_car('A');
            delay_ms (1000);
     
        while (1)
        {
     
        }
    }
    Je vous retire les autres includes et tout. J'ai créé mes propres fonctions delay() en fonction de l'horloge du PIC (80MHz).

    Merci à vous de prendre le temps de lire et de m'aider

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut pic 32
    bonjour , s'il vous plait je suis entrain de travailler actuellement sur le pic 32 ...jai es soucis avec le delay et lcd .j'aurais besoin d'une orientation .merci

Discussions similaires

  1. [Servlet] Fichiers d'initialisation
    Par david71 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/09/2003, 14h47
  2. Créer et initialiser un composant TStatusBar :help:
    Par James_ dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/08/2003, 09h52
  3. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 13h12
  4. Initialisation de XMLModule
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 10
    Dernier message: 01/04/2003, 11h08
  5. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 18h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo