Problème afficheur LCD en C
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 33

Problème afficheur LCD en C



  1. #1
    invitee66c9895

    Problème afficheur LCD en C


    ------

    Bonjour cela fais deux/trois jours que j'essaye d'utiliser un afficheur LCD avec un pic 16f628a en programmant en C mais là je suis bloqué, j'ai fini d'écrire la fonction d'initialisation du LCD mais je pense que celle ci n'est pas bonne.

    Voici mon code, celui-ci est commenté (pour une fois que je commente un truc), notez que le fichier lcd.h contient les prototypes des fonctions en dessous de la fonctions principale:
    Code:
    #define D_LCD PORTB
    #define D4 PORTB.4
    #define D5 PORTB.5
    #define D6 PORTB.6
    #define D7 PORTB.7
    #define RS PORTB.2
    #define E PORTB.3
    
    #include "lcd.h" // Inclusion des prototypes des fonctions
    
    void main (void){
        
        D_LCD = 0; // Initialisation des variables, mise à zéro des broches du PORTB.
        TRISB = 0b00000000;// Toutes les broches du port B sont en sortie.
    
        init_lcd(); // Appelle de la fonction d'initialisation de l'afficheur LCD
    
    }
    
    /**
    * Permet de consommer environ 45µs
    * @author ******
    **/
    void short_wait(void) {
        char temps; // Déclaration de temps, permet de faire des boucles de nop pour consommer du temps.
        for(temps=0;temps<3;temps++); // La boucle met environ 36µs pour s'executer et la fonction 6µs pour être appelé ce qui donne 42µs
         nop();
        
        //On rajoute 3 nop(); pour consommer 3µs en plus (12 périodes à 4MHz) et ainsi atteindre 45µs
            nop();nop();nop();
    }
    
    /**
    * Permet de consommer environ 1,5ms
    * @author ******
    **/
    void long_wait(void) {
        char temps; // Déclaration de temps, permet de faire des boucles de nop pour consommer du temps.
        for(temps=0;temps<165;temps++); // La boucle met environ 1,494 ms pour s'executer et la fonction 6µs pour être appelé ce qui donne 1,5ms pile.
         nop();
    }
    
    /**
    * Fonction permettant de crée une pulsation sur la broche e pour valider une action
    * @author ******
    **/
    void enable(void) {
        nop();
        nop();
        E = 1;    // On met E au niveau haut pour créer l'impulsion
        nop();
        nop();
        E = 0;    // On le remet au niveau bas pour finir l'impulsion
    }
    
    /**
    * Fonction permettant d'effacer l'afficheur LCD
    * @author ******
    **/
    void clear_display(void) {
        // Commande pour effacer l'écran sur 8 bits : 0000 0001
        D_LCD = 0b00000000;
        enable();
        nop();
        nop();
        D_LCD = 0b00010000;
        enable();
        nop();
        nop();
        // Pas besoin de temps d'attente pour cette commande    
    }
    
    /**
    * Fonction permettant d'initialiser le LCD en mode 4 bits
    * @author ******
    **/
    void init_lcd(void) {
        unsigned temps : 16;
        for(temps=0;temps<2118;temps++); // Boucle consommant environ 30ms permettant d'attendre que l'afficheur LCD se réveille
            long_wait();
        // On force l'afficheur LCD à passer en mode 8 bits 3 fois
        D_LCD = 0b00110000; // = mode 8 bits
        enable();
        // 3 long_wait() pour consommer 4.5ms (4.1ms mini marqué sur la doc)
        long_wait(); 
        long_wait();
        long_wait();
        D_LCD = 0b00110000;
        enable();
        // 3 short_wait() pour consommer 135µs (10*s mini sur la doc)
        short_wait();
        short_wait();
        short_wait();
        D_LCD = 0b00110000;
        enable();
        nop();
        nop();
        short_wait();
    
        // Maintenant on passe l'afficheur LCD en mode 4 bits
        D_LCD = 0b0010000; // = mode 4 bits
        enable();
        nop();
        nop();
        short_wait();
        // On ré-envoie les paramètres de l'afficheur mais en deux parties cette fois et entier surtout
        D_LCD = 0b00100000;// Envoie des 4 bits de poids forts
        enable();
        nop();
        nop();
        D_LCD = 0b10000000; // N = 1 --> deux lignes et F n'est important que si une ligne est utilisé
        enable();
        nop();
        nop();
        short_wait(); // On attends un peu le temps que l'afficheur prenne la commande en compte
        clear_display(); // On efface l'écran
        
        // Paramètre d'affichage
            // Commande sur 8 bits : 0000 1000
    
        D_LCD = 0b0000000; // Envoie des 4 bits de poids forts
        enable();
        nop();
        nop();
        D_LCD= 0b10000000; // 4 bits de poids faible
        enable();
        nop();
        nop();
        short_wait();
    
        // Mode d'entrée 
            // Commande sur 8 bits : 0000 0110
        D_LCD = 0b00000000; // Envoie des 4 bits de poids forts
        enable();
        nop();
        nop();
        D_LCD = 0b01100000;// 4 bits de poids faible
        enable();
        nop();
        nop();
        short_wait();
        
        D_LCD = 0; // On remet les broches à zéro (facultatif)
    
        // L'afficheur LCD est maintenant initialisé !!!
        }
    Je vous ai aussi mis le schéma du montage bien qu'avec les define l'on peut savoir où sont relié les broches.
    Donc c'est un afficheur 2*16 et je l'utilise en mode 4 bits, en faite quand dans l'initialisation
    D = 1 et C = 1 (donc display sur on et cursor sur on) je devrais voir un curseur s'afficher non ?

    -----
    Images attachées Images attachées  

  2. #2
    invitef86a6203

    Re : Problème afficheur LCD en C

    // Maintenant on passe l'afficheur LCD en mode 4 bits
    D_LCD = 0b0010000; // = mode 4 bits

    Manque un zéro;
    // Maintenant on passe l'afficheur LCD en mode 4 bits
    D_LCD = 0b00100000; // = mode 4 bits

  3. #3
    invitef86a6203

    Re : Problème afficheur LCD en C

    Attention au RS qui est aussi sur le PORTB en mode data il faudra ajouter 0X04 a tout envoie sur le port pour avoir RS=1

    perso je le met sur un autre port ainsi que le enable .

  4. #4
    invitee66c9895

    Re : Problème afficheur LCD en C

    Citation Envoyé par freepicbasic Voir le message
    // Maintenant on passe l'afficheur LCD en mode 4 bits
    D_LCD = 0b0010000; // = mode 4 bits

    Manque un zéro;
    // Maintenant on passe l'afficheur LCD en mode 4 bits
    D_LCD = 0b00100000; // = mode 4 bits
    J'ai corrigé merci.

    Citation Envoyé par freepicbasic Voir le message
    Attention au RS qui est aussi sur le PORTB en mode data il faudra ajouter 0X04 a tout envoie sur le port pour avoir RS=1

    perso je le met sur un autre port ainsi que le enable .

    Oui je sais mais je comptes laisser le port A pour une autre application

    Sinon sous isis je n'ai toujours rien qui s'affiche sur l'écran (enfin je n'ai pas de curseur en mettant D et C à 1... faut-il envoyer des données avant ?

  5. A voir en vidéo sur Futura
  6. #5
    umfred

    Re : Problème afficheur LCD en C

    hum question bête..
    tu forces ton afficheur en mode 8 bits alors que tu n'utilises que 4 bits.... il doit attendre une commande sur 8 bits ensuite, non ?
    pour moi, il faudrait mettre le mode 4 bits dès le début (même si c'est marqué 8 dans la doc).
    pour savoir si le LCD a fini de traiter l'opération, plutôt que faire des tempo, je regarderai le bit BF (Busy Flag) du LCD. Pour cela, il faut que tu rapportes le RW sur le PIC. (cf la doc du HD44780)

  7. #6
    invitef86a6203

    Re : Problème afficheur LCD en C

    non sous isis je n'ai toujours rien qui s'affiche sur l'écran (enfin je n'ai pas de curseur en mettant D et C à 1... faut-il envoyer des données avant ?
    dans le prog du post#1 tu envoie rien non plus à afficher..., juste une init
    envoie une lettre au moins.
    le quartz fait combien ?
    il y en a pas sur le schéma.
    les bits de config sont bon ?
    met une led qui clignote pour voir si ça tourne

    mettre B aussi pour le blink histoire de le voir clignoter.

  8. #7
    invitee66c9895

    Re : Problème afficheur LCD en C

    Citation Envoyé par umfred Voir le message
    hum question bête..
    tu forces ton afficheur en mode 8 bits alors que tu n'utilises que 4 bits.... il doit attendre une commande sur 8 bits ensuite, non ?
    pour moi, il faudrait mettre le mode 4 bits dès le début (même si c'est marqué 8 dans la doc).
    pour savoir si le LCD a fini de traiter l'opération, plutôt que faire des tempo, je regarderai le bit BF (Busy Flag) du LCD. Pour cela, il faut que tu rapportes le RW sur le PIC. (cf la doc du HD44780)

    ça ne change rien si je dis de passer en mode 4 bits dès le début.
    Et pour le BF non merci, je veux le faire sans utiliser le RW.

    Citation Envoyé par freepicbasic Voir le message
    dans le prog du post#1 tu envoie rien non plus à afficher..., juste une init
    envoie une lettre au moins.
    le quartz fait combien ?
    il y en a pas sur le schéma.
    les bits de config sont bon ?
    met une led qui clignote pour voir si ça tourne

    mettre B aussi pour le blink histoire de le voir clignoter.

    Alors le quartz est celui interne au pic donc 4MHz

    Les bits de config sûrement :

    Field - Category - Setting

    OSC - Oscillator - XT
    WDT - Watchdog Timer - Off
    PUT - Power Up Timer - Disabled
    MCLRE - Master Clear Enable - Enabled
    BODEN - Brown Out Detect - Enabled
    LVP - Low Voltage Program - Enabled
    CPD - Data EE Read Protect - Disabled
    CP - Code Protect - Off

    Après pour envoyer quelque chose à afficher je ne sais pas encore comment faire vu que je débute :s et pour la LED pas de problème, je fais une boucle qui fait que de changer l'état d'une broche après l'initialisation c'est bien ça ?

  9. #8
    invitee66c9895

    Re : Problème afficheur LCD en C

    Sous ISIS j'ai deux messages : controller received message whilst busy - LCD1

    J'ai donc des tempo trop courte ...

  10. #9
    invitef86a6203

    Re : Problème afficheur LCD en C

    le mode oscillateur interne est INTRC pas XT qui nécessite un quartz externe.
    MCLRE enable signifie qu'il faut câbler un res sur MCLR.
    La tempo au RESET est de 15ms avant de faire quoi que soit 250khz de clock c est lent.

  11. #10
    invitee66c9895

    Re : Problème afficheur LCD en C

    Citation Envoyé par freepicbasic Voir le message
    le mode oscillateur interne est INTRC pas XT qui nécessite un quartz externe.
    MCLRE enable signifie qu'il faut câbler un res sur MCLR.
    La tempo au RESET est de 15ms avant de faire quoi que soit 250khz de clock c est lent.


    hum... je vais m'informer sur les bits de configuration parce que là j'avoue avoir recopié sans savoir ^^

    Sinon que pensez vous de l'outil Maestro ? je pense l'utiliser pour mon afficheur LCD vu que là je débute vraiment en pic et que je ne veux pas rester 2 mois sur un afficheur LCD non plus ^^

  12. #11
    invitee66c9895

    Re : Problème afficheur LCD en C

    Je vais me coucher, et finalement je vais relier R/W au pic pour pouvoir lire BF au lieu d'utiliser les tempos parce que là j'en chie >< et vais profiter du blocus de demain pour réécrire le tout tranquillement.

  13. #12
    invitee66c9895

    Re : Problème afficheur LCD en C

    C'est bon j'ai réussi à initialiser l'afficheur j'ai le curseur qui clignote sous isis en faite ça venait de deux instructions qui avait des tempos trop courtes en sortie, par contre maintenant je vais devoir trier un peu parce que je pense avoir mis des tempos trop longue par moment.... et aussi j'ai un petit soucis quand je compile ça me marque BUILD FAILED sans m'indiquer d'erreur mais ça compile comme il faut.

  14. #13
    invitee66c9895

    Re : Problème afficheur LCD en C

    J'ai une question, comment fonctionne les routines d'affichage de texte ?
    Parce que je ne me sens pas d'écrire send_data(0x12) ... pour chaque caractère mais je pense plutôt pouvoir faire une fonction de ce style afficher("Bonjour !");

  15. #14
    sdec25

    Re : Problème afficheur LCD en C

    Citation Envoyé par Wapaca Voir le message
    J'ai une question, comment fonctionne les routines d'affichage de texte ?
    Parce que je ne me sens pas d'écrire send_data(0x12) ... pour chaque caractère mais je pense plutôt pouvoir faire une fonction de ce style afficher("Bonjour !");
    Pour chaque caractère de la chaîne, on envoie le caractère à l'écran et on s'arrête en fin de chaîne (caractère '\0').
    Attention, sur les PIC on différencie les variables dans la RAM et la ROM. Exemple :
    Code:
    afficher("salut");
    est différent de
    Code:
    char chaine[10];
    // copie d'une valeur dans chaine
    ...
    afficher(chaine);
    Il faudra 2 fonctions : 1 pour les constantes ("chaine") avec un paramètre en rom char*, l'autre pour les variables en ram.

  16. #15
    invite7a536414

    Re : Problème afficheur LCD en C

    Salut,
    J'ai pas tout suivis la discussion mais peut être ça pourra t'aider :

    http://www.hoffmanncorporation.com/b...ectronique.php

    Il y a dedans des fonctions pour initialiser l'écran... mais aussi pour envoyer un char, ou un int, ou une chaine de caractère...


    J'espère que ça pourra t'être utile...

  17. #16
    invitee66c9895

    Re : Problème afficheur LCD en C

    @sdec25 :

    Je n'ai pas très bien compris, en gros je deux tableaux de constante avec leurs adresse dans la mémoire du LCD en hexa et l'autres tableau avec le caractère correspondant (bien sûr si caractere[50] = "a"; ben adresse_hexa[50] = 0x<adresse de "a">; ) et après je parcours ma chaîne à afficher en cherchant la correspondance des caractères 1 par 1 avec deux boucles (1 pour faire défiler les lettes de la chaîne et un à l'intérieur pour comparer la lettre aux autres caractères de la constantes par exemple) puis dès que ça trouve la correspondance de la lettre ça fait send_data(adresse_hexa[50]); ?

    Je ne sais pas si je me suis bien expliqué mais j'espère que tu comprendras ^^

    @hoffmann : Pour l'instant je pense pouvoir gérer sans tuto, par contre dès que je ne comprends plus ce que je fais je veux bien ^^

  18. #17
    Murayama

    Re : Problème afficheur LCD en C

    Bonjour!

    Je n'ai pas tout détaillé le code, mais voici quelques remarques.

    1. Tous les LCDs que j'ai utilisés (dont quelques uns alphanumériques
    il y a longtemps) ont un CS (chip select) qui me semble correspondre
    à votre E (Enable). Je ne peux pas être catégorique puisque je ne
    connais pas votre LCD, mais vérifiez dans la doc comment fonctionne
    le E. Vous mettez une impulsion dessus 1 puis 0, mais je crois que ce
    n'est pas correct. Il faut (probablement) le laisser à un certain niveau
    pendant toute la transaction. Dans ce cas, votre fonction enable serait
    fausse. À vérifier.
    Je pense qu'on peut écrire un enable qui met le E dans la position
    idoine et un disable qui fait l'operation inverse. Ou bien écrire une
    fonction avec un paramètre, dans le genre enable(yes);

    2. Remarques de forme
    Vous écrivez 2 fonctions de délai, et apparemment ce n'est pas
    encore suffisant puisque vous les utilisez en combinaison avec
    d'autres nop().
    Je suggère (par exemple):
    Code:
    void wait(uint16 us) {
    	uint16 i;
    	uint16 loopcount = us/42;
    	loopcount += 1;
    	for(i = 0 ; i < loopcount ; i++) nop();
    }
    La ligne loopcount += 1 vous dispense d'ajouter des nop()
    supplémentaires. De toute façon, le temps n'a pas besoin d'être
    précis.

    3. Vous utilisez des instructions codées en dur. Par exemple:
    D_LCD = 0b00110000 pour mettre le LCD en mode 8 bits.
    En faisant comme ça, vous avez toutes les chances de vous
    tromper. Si le code est un peu long, et si à un moment vous
    vous trompez et écrivez D_LCD = 0b00011000, (le 11 est
    décalé sur la droite), l'erreur sera très difficile à trouver.

    Je vous conseille donc;

    #define LCD_8bits 0b00110000

    et ensuite dans le code: D_LCD = LCD_8bits

    Un autre avantage, c'est que le code sera plus lisible, même sans
    commentaire.

    Pascal

  19. #18
    invitee66c9895

    Re : Problème afficheur LCD en C

    Citation Envoyé par Murayama Voir le message
    Bonjour!

    Je n'ai pas tout détaillé le code, mais voici quelques remarques.

    1. Tous les LCDs que j'ai utilisés (dont quelques uns alphanumériques
    il y a longtemps) ont un CS (chip select) qui me semble correspondre
    à votre E (Enable). Je ne peux pas être catégorique puisque je ne
    connais pas votre LCD, mais vérifiez dans la doc comment fonctionne
    le E. Vous mettez une impulsion dessus 1 puis 0, mais je crois que ce
    n'est pas correct. Il faut (probablement) le laisser à un certain niveau
    pendant toute la transaction. Dans ce cas, votre fonction enable serait
    fausse. À vérifier.
    Je pense qu'on peut écrire un enable qui met le E dans la position
    idoine et un disable qui fait l'operation inverse. Ou bien écrire une
    fonction avec un paramètre, dans le genre enable(yes);

    2. Remarques de forme
    Vous écrivez 2 fonctions de délai, et apparemment ce n'est pas
    encore suffisant puisque vous les utilisez en combinaison avec
    d'autres nop().
    Je suggère (par exemple):
    Code:
    void wait(uint16 us) {
    	uint16 i;
    	uint16 loopcount = us/42;
    	loopcount += 1;
    	for(i = 0 ; i < loopcount ; i++) nop();
    }
    La ligne loopcount += 1 vous dispense d'ajouter des nop()
    supplémentaires. De toute façon, le temps n'a pas besoin d'être
    précis.

    3. Vous utilisez des instructions codées en dur. Par exemple:
    D_LCD = 0b00110000 pour mettre le LCD en mode 8 bits.
    En faisant comme ça, vous avez toutes les chances de vous
    tromper. Si le code est un peu long, et si à un moment vous
    vous trompez et écrivez D_LCD = 0b00011000, (le 11 est
    décalé sur la droite), l'erreur sera très difficile à trouver.

    Je vous conseille donc;

    #define LCD_8bits 0b00110000

    et ensuite dans le code: D_LCD = LCD_8bits

    Un autre avantage, c'est que le code sera plus lisible, même sans
    commentaire.

    Pascal
    Alors je vais te répondre point par point

    1. J'ai vu sur la doc 290ns mini donc un simple E=1; E=0; aurait suffit logiquement

    2. Je ne sais pas si les nop() sont obligés, j'ai vu ça sur un tuto donc j'ai refait pareil.

    3. Le code à changé depuis, maintenant j'ai des fonctions pour agir sur l'afficheur.

    Là en faite je cherche un méthode pour écrire simplement la fonction permettant d'afficher une chaîne de caractère

  20. #19
    sdec25

    Re : Problème afficheur LCD en C

    Citation Envoyé par Wapaca Voir le message
    Je n'ai pas très bien compris, en gros je deux tableaux de constante avec leurs adresse dans la mémoire du LCD en hexa et l'autres tableau avec le caractère correspondant (bien sûr si caractere[50] = "a"; ben adresse_hexa[50] = 0x<adresse de "a">; ) et après je parcours ma chaîne à afficher en cherchant la correspondance des caractères 1 par 1 avec deux boucles (1 pour faire défiler les lettes de la chaîne et un à l'intérieur pour comparer la lettre aux autres caractères de la constantes par exemple) puis dès que ça trouve la correspondance de la lettre ça fait send_data(adresse_hexa[50]); ?
    Si tu veux envoyer la lettre a : send_data('a');
    Envoyer Bonjour :
    Code:
    send_data('B');
    send_data('o');
    send_data('n');
    ...
    ou alors avoir une chaîne de caractères "Bonjour" et envoyer les caractères un par un.
    Qu'est-ce que tu ne comprends pas ?

  21. #20
    invitee66c9895

    Re : Problème afficheur LCD en C

    Non mais si je met send_data('a'); ça ne va pas fonctionner car il faut indiquer l'adresse du caractère 'a' dans la mémoire de l'afficheur LCD pour l'afficher et je cherche justement une méthode qui sert de determiner cette adresse pour pouvoir ensuite afficher facilement une chaîne de caractères sans devoir chercher l'adresse de tous les caractères.

    Je pense à une solution mais je pense pas que ce soit la meilleure.

    EDIT : En faite ça fonctionne mea culpa

  22. #21
    invitee66c9895

    Re : Problème afficheur LCD en C

    Par contre le compilateur me fais chier avec les tableaux je ne peux pas faire par exemple :

    char chaine[] = "Coucou";
    char chaine[7] = "Coucou";

    Mais par contre je peux faire

    char chaine[7];
    chaine[0] = "C";
    chaine[1] = "o";
    chaine[2] = "u";
    chaine[3] = "c";
    chaine[4] = "o";
    chaine[5] = "u";
    chaine[6] = "\0";

    Mais bon ce n'est pas très pratique :s des idées ?

  23. #22
    sdec25

    Re : Problème afficheur LCD en C

    Citation Envoyé par Wapaca Voir le message
    EDIT : En faite ça fonctionne mea culpa
    Ce n'est pas par hasard, la table des caractères de l'écran LCD est la table standard ASCII (à peu de choses près) pour les 128 premiers caractères (donc les chiffres, les lettres non accentuées, ...). C'est fait exprès pour ne pas avoir à traduire de l'ASCII vers un autre code. Par contre les autres caractères ne sont pas standard, certains doivent même être définis car ils ne sont pas présents dans la table de l'écran (àéè...). Pour simplifier l'envoi de chaîne avec caractères accentuées, j'avais proposé une solution assez simple :http://forums.futura-sciences.com/el...odule-lcd.html

    Par contre le compilateur me fais chier avec les tableaux je ne peux pas faire par exemple :

    char chaine[] = "Coucou";
    char chaine[7] = "Coucou";
    Il y a une erreur de compilation quand tu fais char chaine[] = "Coucou" ou c'est juste que ça n'affiche rien ?
    Essaie :
    Code:
    char* chaine = "Coucou";
    Cependant, en faisant comme ça, la variable chaine sera placée en ROM, donc pour passer ce paramètre à la fonction Afficher(), il faut que cette fonction ait un paramètre de type rom char* :

    Code:
    void afficher1(const rom char* chaine) {
    // on affiche la chaîne
    }
    
    void afficher2(ram char* chaine) {
    // on affiche la chaîne
    }
    
    void main() {
    char* chaine = "bonjour";
    char chaine2[10];
    chaine2[0]='a';
    chaine2[1]='b';
    chaine2[2]='c';
    chaine2[3]='\0';
    afficher1("salut"); // fonctionne
    afficher1(chaine); // fonctionne
    afficher1(chaine2); // ne fonctionne pas
    afficher2(chaine2); // fonctionne
    afficher2("salut"); // ne fonctionne pas
    }
    Dernière modification par sdec25 ; 20/10/2010 à 20h26.

  24. #23
    invitee66c9895

    Re : Problème afficheur LCD en C

    Pour l'erreur j'ai ça :
    Array size is required

    Si je met

    char* chaine = "Coucou";

    Incompatible storage, 'const *' is required

    Après je n'ai pas testé pour les fonctions étant donné que la déclaration de la chaine en elle même ne passe pas :s

  25. #24
    sdec25

    Re : Problème afficheur LCD en C

    Dans ce cas il faut mettre
    Code:
    const char* chaine = "Coucou";
    Ou mettre directement la valeur dans le paramètre :
    Code:
    Afficher("Coucou");
    Dernière modification par sdec25 ; 20/10/2010 à 21h12.

  26. #25
    invitee66c9895

    Re : Problème afficheur LCD en C

    Cette fois c'est sur les prototypes des fonctions que ça coince

    void send_data(char data);
    void send_data_chaine(const rom char* chaine);
    ^------
    Error[1] D:\Programmes\files\Labcenter Electronics\projet\afficheur_l cd\FP3\programme_pic\prototype .h 8 : Syntax error
    (The expression must be corrected. The marker ^------ shows
    the approximate position where CC5X gives up. The documentation
    should be checked if the cause is not obvious)

    Error options: -ew: no warning details -ed: no error details -eL: list details
    BUILD FAILED: Wed Oct 20 21:12:41 2010


    prototype.h
    Code:
    void short_wait(void);
    void long_wait(void);
    void enable(void);
    void clear_display(void);
    void init_lcd(void);
    void send_instruction(char mot);
    void send_data(char data);
    void send_data_chaine(const rom char* chaine);
    void send_data_chaine2(ram char* chaine);

  27. #26
    sdec25

    Re : Problème afficheur LCD en C

    Ça doit être le rom qui n'est pas reconnu par CC5X. Il faut consulter la doc du compilateur pour voir comment se nomment les types de variables rom/ram.

  28. #27
    invitee66c9895

    Re : Problème afficheur LCD en C

    Ah ok, par contre je verrais ça demain je vais dormir là.

    Logiquement il y a encore blocus demain donc je pourrais prendre le temps de lire la doc

    Merci et bonne soirée.

  29. #28
    invitee66c9895

    Re : Problème afficheur LCD en C

    Code:
    void main (void){
        
        D_LCD = 0; // Initialisation des variables, mise à zéro des broches du PORTB.
        TRISB = 0b00000000;// Toutes les broches du port B sont en sortie.
    
        init_lcd(); // Appelle de la fonction d'initialisation de l'afficheur LCD
    	display_on(); 
        static const char chaine[7] = "Coucou";
    	send_data_chaine(&chaine[0]);
    }
    
    
    void send_data_chaine(int *adresse_tableau) {
    	int caractere=0;
        
    	do
        {	
    		adresse_tableau++;
            caractere = *adresse_tableau;
    		send_data(caractere);
        }
        while(caractere != '\0'); // On boucle tant qu'on n'est pas arrivé à l'\0
    }

    Alors j'ai essayé de bidouiller avec les pointeurs mais ça bloque :

    static const char chaine[7] = "Coucou";
    send_data_chaine(&chaine[0]);
    ^------
    Error[1] D:\Programmes\files\Labcenter Electronics\projet\culture_ind oor\FP3\programme_pic\culture. c 19 : Incompatible storage classes (const needed)
    (A RAM pointer can not be assigned a const pointer or const data addresses)


    EDIT : Je viens de capter que j'incrémente adresse_tableau trop tôt dans la boucle, pas la peine de me faire une remarque j'ai corrigé

  30. #29
    sdec25

    Re : Problème afficheur LCD en C

    Error[1] D:\Programmes\files\Labcenter Electronics\projet\culture_ind oor\FP3\programme_pic\culture. c 19 : Incompatible storage classes (const needed)
    (A RAM pointer can not be assigned a const pointer or const data addresses)
    Ça devient plus clair, apparemment le compilateur considère que les variables const sont en ROM, donc pas de mot-clé rom mais la fonction doit attendre un paramètre const.

    Sinon quelques remarques :
    Ta chaîne est en char*, la fonction attend un int*, ce n'est pas la même chose. Un int est sur 2 octets ou +, un char sur 1 octet. Quand on incrémente un pointeur sur int, on ajoute 2 à l'adresse mémoire, et on afficherait donc un caractère sur 2.

    EDIT : Je viens de capter que j'incrémente adresse_tableau trop tôt dans la boucle, pas la peine de me faire une remarque j'ai corrigé
    ok, et dans ce cas là on met while au début de la boucle car si la chaîne est vide on n'a rien à faire.

    Tu peux aussi remplacer &chaine[0] par chaine tout simplement.
    Et quand on déclare une chaîne constante, pas besoin de déclarer la taille.
    Dernière modification par sdec25 ; 21/10/2010 à 23h27.

  31. #30
    invitee66c9895

    Re : Problème afficheur LCD en C

    Effectivement je n'ai pas fais gaf pour le int* en paramètre j'avais mis ça pour faire des essais.... pour le while aussi bien vu et quand je met chaine à la place de &chaine[0] c'est pareil j'ai :

    Incompatible storage classes (const needed)
    (A RAM pointer can not be assigned a const pointer or const data addresses)


    Sinon dans le pire des cas, quel compilateur prend en charge les tableaux dynamique ? (même s'il ne s'intègre pas à MPLAB pas grave, ça me laissera l'occasion de prendre un meilleure IDE comme ça )

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. problème afficheur LCD
    Par invitee8b4fb3e dans le forum Électronique
    Réponses: 4
    Dernier message: 04/06/2010, 07h57
  2. afficheur LCD problème affichage
    Par invitec205d090 dans le forum Électronique
    Réponses: 28
    Dernier message: 15/05/2010, 15h50
  3. Problème afficheur LCD
    Par invite7daf4c9b dans le forum Électronique
    Réponses: 9
    Dernier message: 04/05/2010, 10h58
  4. probléme afficheur LCD
    Par invitea8b2e1f5 dans le forum Électronique
    Réponses: 2
    Dernier message: 18/12/2009, 16h00
  5. Probleme afficheur lcd
    Par invite456a9298 dans le forum Électronique
    Réponses: 5
    Dernier message: 24/08/2008, 15h23
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...