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 :

Notion d'utilisation d'un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 30
    Par défaut Notion d'utilisation d'un tableau
    Bonjour,

    mon objectif est de faire fonctionner un afficheur (NHD-0420CW-Ax3) en I2C sur mon STM32. J'ai pour cela récupéré du code que j'essaye de faire fonctionner mais il y a une chose que je n'arrive pas à comprendre.

    Dans mon fichier .h je déclare :

    - le nombre de ligne, de colonne, l'adresse esclave, le string sur mon afficheur, les adresses DDRAM, le mode, mais SURTOUT les paquets qui seront transmis :

    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
     
    /** @brief Number of display rows */
    const   uint8_t     ROW_N = 4;
     
    /** @brief Number of display columns */
    const   uint8_t     COLUMN_N = 20;
     
    /** @brief pin assigned to the Reset line (optional, can be always high) */
    const   uint8_t     RES = 16;
     
    /** @brief Display I2C Slave address, in 7-bit form: 0x3C if SA0=LOW, 0x3D if SA0=HIGH */
    const   uint8_t     SLAVE2W = 0x3C;
     
    /** @brief Strings to be displayed */
    const   uint8_t     TEXT[4][21] =             {"1-Newhaven Display--",
                                                   "2-------Test--------",
                                                   "3-16/20-Characters--",
                                                   "4!@#$%^&*()_+{}[]<>?"};
     
    /** @brief DDRAM address for each line of the display */
    uint8_t new_line[4] = {0x80, 0xA0, 0xC0, 0xE0};
     
    /** @brief Display mode: 1/3 lines or 2/4 lines; default 2/4 (0x08) */
    uint8_t rows = 0x08;
     
    /** @brief Packet to be transmitted (max 20 bytes) */
    uint16_t tx_packet[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    j'ai donc un tableau nommé tx_packet, de type uint16_t

    Dans stdint.h on a =

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef unsigned char uint8_t ;
     
    typedef unsigned short uint16_t;
     
    typedef unsigned long uint32_t;
    J'ai choisi uint16_t pour mon tableau des paquets qui seront sous forme d'octets, et uint8_t pour les caractères sur mon afficheur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uint16_t tx_packet[]
     
    const   uint8_t     TEXT[4][21]
    Cela vous semble t'il correct ?

    Dans mon fichier .c, j'utilise la fonction command comme ceci :

    Et lors de la déclaration de cette fonction je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void command(uint8_t commandByte)
    {
       tx_packet[0] = 0x00; // Control Byte; C0_bit=0, D/C_bit=0 -> following Data Byte contains command
       tx_packet[1] = commandByte;
       send_packet(2);  // Transmits the two bytes
    }
    Voilà ma question, est-il possible de faire cela en C, je veux dire remplir le tableau comme ceci [0] [1] sa OK, mais le send_packet(2) envoie-t-il les deux paquets du dessus à ma fonction send_packet ? C'est ça que j'ai du mal à comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void send_packet(uint8_t byteStored)
    {
       uint8_t index = 0;  
     
       I2C_GenerateSTART(I2CM_MODULE, ENABLE);
       I2C_SendData(I2CM_MODULE, SLAVE2W);
    }
    Je tiens à préciser que j'ai récupéré ça en Arduino, c'est pour ça peut être que le fonctionnement ici ne fonctionne pas en C pur !

    J'espère avoir était compréhensible, merci beaucoup pour votre aide !

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par LEROYLudovic Voir le message
    Cela vous semble t'il correct ?
    Non, dans un fichier d'entête on ne doit pas mettre des définitions de variables; seulement des déclarations.
    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
    /** @brief Number of display rows */
    extern const   uint8_t     ROW_N;
     
    /** @brief Number of display columns */
    extern const   uint8_t     COLUMN_N;
     
    /** @brief pin assigned to the Reset line (optional, can be always high) */
    extern const   uint8_t     RES;
     
    /** @brief Display I2C Slave address, in 7-bit form: 0x3C if SA0=LOW, 0x3D if SA0=HIGH */
    extern const   uint8_t     SLAVE2W;
     
    /** @brief Strings to be displayed */
    extern const   uint8_t     TEXT[4][21];
     
    /** @brief DDRAM address for each line of the display */
    extern uint8_t new_line[4];
     
    /** @brief Display mode: 1/3 lines or 2/4 lines; default 2/4 (0x08) */
    extern uint8_t rows;
     
    /** @brief Packet to be transmitted (max 20 bytes) */
    extern uint16_t tx_packet[20];
    Les définitions doivent être mise dans un fichier C.
    Citation Envoyé par LEROYLudovic Voir le message
    Voilà ma question, es t’il possible de faire cela en C, je veut dire remplir le tableau comme ceci [0] [1] sa OK, mais le send_packet(2) envoie t'il les deux paquets du dessus à ma fonction send_packet ? C'est ça que j'ai du mal à comprendre.
    En effet, rien ne relie apparemment tx_packet à la fonction send_packet, il faudrait regarder si la fonction I2C_SendData n'a pas un accès direct au tableau tx_packet, il n'y a rien de "magique".

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 30
    Par défaut
    Voilà j'ai modifié les définitions (maintenant dans le .c) et les déclarations de variables(dans le .h). Merci beaucoup !

    Il n y a rien qui relie send_packet et tx_packet donc la a proprement parler ça ne fonctionne pas j'en suis bien conscient mais je veut dire admettons que j'ai une fonction du genre recupere_packet (uint8_t number) et number étant le nombre de paquet que je souhaite récupérer, ce serait possible d'utiliser send_packet(2), cette syntaxe d'utilisation de fonction parait cohérente en C ?

    J'aimerai tant réussir à faire cette fonction me permettant de récupérer mes paquets et démarrer la transmission I2C afin de faire marcher mon afficheur mais je ne sais pas encore faire !

    Merci beaucoup ! A bientôt, je l'espère.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    En faisant send_packet(2), la seule chose que l'on transmet à la fonction c'est le nombre 2. Si on veut transmettre aussi le tableau, il faudrait faire send_packet( tx_packet , 2 ); et la fonction devrait être définie comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void send_packet( const uint16_t tx_pack[] , uint8_t byteStored ) { .........

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 30
    Par défaut
    Ok oui d'accord je vois mieux merci beaucoup, on est bien d'accord que dans le paramètre de la fonction tu l'as mit en const mais c'est une petite erreur d’inattention :p car la valeur sera changée au cours du temps donc elle ne doit pas être constante c'est bien ça ?

    Et également dans le send_packet(tx_packet, 2); tx_packet est inséré sans tableau ? Ce n'est pas plutôt send_packet(tx_packet[], 2); ?

    Merci
    Cordialement

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par LEROYLudovic Voir le message
    Ok oui d'accord je vois mieux merci beaucoup, on est bien d'accord que dans le paramètre de la fonction tu l'as mit en const mais c'est une petite erreur d’inattention :p car la valeur sera changée au cours du temps donc elle ne doit pas être constante c'est bien ça ?
    le const ici dit que le tableau ne sera pas modifié par la fonction, le tableau peut être modifié ailleurs et être lui-même non constant.
    Citation Envoyé par LEROYLudovic Voir le message
    Et également dans le send_packet(tx_packet, 2); tx_packet est inséré sans tableau ? Ce n'est pas plutôt send_packet(tx_packet[], 2); ?
    Non, il faut indiquer le nom du tableau sans les []. Dans la déclaration de la fonction, on doit par contre indiquer que ce qui est reçu permet d'accéder à un tableau et il faut [].

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E] Utilisation d'un tableau en réseau (multi-utilisateurs)
    Par Mourne dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 15/02/2007, 00h37
  2. [Tableaux] Utilisation d'un tableau
    Par Skippy1 dans le forum Langage
    Réponses: 7
    Dernier message: 04/01/2007, 09h07
  3. probléme dans l'utilisation d'un tableau
    Par hamoudasafira dans le forum C++
    Réponses: 10
    Dernier message: 13/12/2006, 08h50
  4. [Tableaux] utilisation d'un tableau à deux dimensions
    Par calitom dans le forum Langage
    Réponses: 1
    Dernier message: 28/11/2006, 18h01
  5. [C#]Quel objet utiliser pour un tableau..
    Par Jinroh77 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/10/2006, 20h22

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