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

Embarqué Discussion :

Programmation d'un processeur avec son afficheur


Sujet :

Embarqué

  1. #41
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : mai 2013
    Messages : 335
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    pic_adress --> serait l'adresse du tableau gauge vide ? OUI
    tab_gauge --> serait l'adresse du tableau gauge à remplir ? OUI
    n correspond à quoi ? C'est le niveau de la batterie dans l'espace du dessin. J'avais remarqué qu'il semblait y avoir une erreur de projection car il y très peu de valeurs en partant d'un octet d'où les ??? ( tu peux le tester avec des valeurs de n arbitraires de 0 à 48)

    Salut
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  2. #42
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    août 2008
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2008
    Messages : 348
    Points : 50
    Points
    50
    Par défaut
    j'ai quelques petites erreur en remettant ton code en forme, car les indentations ce place pas forcement bien et ne sait pas trop si je les bien interpréter du coup

    Code C++ : 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
    void DoImgLevel(uint8_t niveau_bat, unsigned char *tab_gauge)
    {
       uint8_t ix, msk,y8;
       unsigned char *pEmpty = &Image_batterie_vide2648+ 0x3;             // Premier octet intérieur 0:W, 1:H, 2:bord,...
       unsigned char *pGauge = &tab_gauge+ 0x3;
       uint8_t n = 25;
     
       if(n > 47) n = 47;  // niveau de la batterie projeté entre 0 et 47
     
       int ndiv8 = n >> 3;  // Niveau = combien d'octets pleins en vertical
     
       for (y8 = 0; y8 < 6; y8++) 
       {               // De 8 points en 8 points verticalement
                if (y8 < ndiv8) msk = 255; 
                else if(y8 > ndiv8) msk = 0; 
                else msk = (2 << (n & 7)) - 1;
     
                for(ix = 20; ix==0; ix--) 
                {
                *pGauge++; 
                pEmpty++;
                *pGauge = uint8_t(msk) | *pEmpty;
                } 
     
                pGauge =pGauge+ 2;                               // Sauter le bord droit puis le bord
                pEmpty =pGauge+ 2;
                // gauche de la ligne suivante.
       }
     
    }


    mes erreurs :

    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
    nbproject/Makefile-pic32mx_eth_sk.mk:375: recipe for target 'build/pic32mx_eth_sk/production/_ext/526112495/fonction.o' failed
    make[2]: Leaving directory 'C:/microchip/harmony/v2_06/apps/examples/peripheral/D-20200615_1_V1.02/D-20200615_1_V1.02/firmware/lcd128.X'
    nbproject/Makefile-pic32mx_eth_sk.mk:90: recipe for target '.build-conf' failed
    make[1]: Leaving directory 'C:/microchip/harmony/v2_06/apps/examples/peripheral/D-20200615_1_V1.02/D-20200615_1_V1.02/firmware/lcd128.X'
    nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
    ../../../../../../../framework/system/fonction.c: In function 'DoImgLevel':
    ../../../../../../../framework/system/fonction.c:78:28: error: initialization from incompatible pointer type [-Werror]
        unsigned char *pEmpty = &Image_batterie_vide2648+ 0x3;             // Premier octet int�rieur 0:W, 1:H, 2:bord,...
                                ^
    ../../../../../../../framework/system/fonction.c:79:28: error: initialization from incompatible pointer type [-Werror]
        unsigned char *pGauge = &tab_gauge+ 0x3;
                                ^
    ../../../../../../../framework/system/fonction.c:94:13: error: value computed is not used [-Werror=unused-value]
                 *pGauge++; 
                 ^
    In file included from ../../../../../../../framework/system/fonction.h:21:0,
                     from ../../../../../../../framework/system/fonction.c:1:
    ../../../../../../../framework/system/fonction.c:96:23: error: expected expression before '__uint8_t'
                 *pGauge = uint8_t(msk) | *pEmpty;
                           ^
    ../../../../../../../framework/system/fonction.c:77:16: error: variable 'msk' set but not used [-Werror=unused-but-set-variable]
        uint8_t ix, msk,y8;
                    ^
    cc1.exe: all warnings being treated as errors
    make[2]: *** [build/pic32mx_eth_sk/production/_ext/526112495/fonction.o] Error 1
    make[1]: *** [.build-conf] Error 2
    make: *** [.build-impl] Error 2
    
    BUILD FAILED (exit value 2, total time: 561ms)

  3. #43
    Membre confirmé
    Femme Profil pro
    ..
    Inscrit en
    décembre 2019
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 91
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : décembre 2019
    Messages : 203
    Points : 451
    Points
    451
    Par défaut
    Essaye ceci en parallèle de ce que tu fais, puis montre ce que ça donne sur l’écran :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        uint8_t gauge_map[146]= {24, 46, 0};
        for (size_t i= 2; i< sizeof(gauge_map); ++i)
            gauge_map[i]= 255;
        //picture(x, y, gauge_map);

  4. #44
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : mai 2013
    Messages : 335
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour David,
    Citation Envoyé par davidif Voir le message
    j'ai quelques petites erreur en remettant ton code en forme, car les indentations ce place pas forcement bien et ne sait pas trop si je les bien interpréter du coup.
    Les indentations ne devraient pas générer de problème ce n'est, dans ce langage, qu'un élément de lisibilité.

    En revanche, le code suivant ne peut pas fonctionner :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
       unsigned char *pEmpty = &Image_batterie_vide2648+ 0x3;             // Premier octet intérieur 0:W, 1:H, 2:bord,...
       unsigned char *pGauge = &tab_gauge+ 0x3;...

    Image_batterie_vide (2648 ??) et tab_gauge sont des tableaux d'octets donc des pointeurs. &tab_gauge est donc un pointeur sur un pointeur. D'où l'erreur signalée.
    Si on veut utiliser ce type de notation on utilisera plutôt :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
       unsigned char *pEmpty = &(Image_batterie_vide[3]);
       unsigned char *pGauge = &(tab_gauge[3]);

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  5. #45
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    août 2008
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2008
    Messages : 348
    Points : 50
    Points
    50
    Par défaut
    bonsoir et merci encore pour votre disponibilité,

    pour répondre à l'urgence d'une présentation, j'ai mis temporairement de côté la fonction digne de ce nom pour aller au plus rapide, mais apparemment un truc m'échappe de nouveau mais là je comprend pas

    J'ai laborieusement écrit 16 tableau dans le même modèle des existant qui s'affiche bien en les remplissant en fonction d'une valeur de pourcentage puis fait la même fonction qui liste de simple if sur des intervalles de niveau.

    Rien de bien compliqué, enfin je croyais

    exemple de tableau
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define Image_batterie_vide2648_LEN_12  158
     
    unsigned char Image_batterie_vide2648_12[Image_batterie_vide2648_LEN_12] =
    {
       26, 48,
      255,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,255,
      255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
      255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
      255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
      255,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,255,
      255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
    };

    la fonction

    Code C++ : 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
    void niv_bat(uint8_t niveau_bat,unsigned char *tab_gauge) 
    {
    uint8_t i;
     
        /*if(niveau_bat==0){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648[i]; } 
        if((niveau_bat>0)&&(niveau_bat<=6)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_3[i]; } 
        if((niveau_bat>6)&&(niveau_bat<=12)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_6[i]; } 
        if((niveau_bat>12)&&(niveau_bat<=18)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_9[i]; } */
     
        if((niveau_bat>18)&&(niveau_bat<=24))
            {
                for(i=0;i<258;i++)
                {tab_gauge[i]=Image_batterie_vide2648_12[i];} 
            } 
     
     
     
     
        /*if((niveau_bat>24)&&(niveau_bat<=30)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_15[i]; } 
        if((niveau_bat>30)&&(niveau_bat<=36)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_18[i]; } 
        if((niveau_bat>36)&&(niveau_bat<=42)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_21[i]; } 
        if((niveau_bat>42)&&(niveau_bat<=48)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_24[i]; } 
        if((niveau_bat>48)&&(niveau_bat<=54)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_27[i]; } 
        if((niveau_bat>54)&&(niveau_bat<=60)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_30[i]; } 
        if((niveau_bat>60)&&(niveau_bat<=66)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_33[i]; } 
        if((niveau_bat>66)&&(niveau_bat<=72)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_36[i]; } 
        if((niveau_bat>72)&&(niveau_bat<=78)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_39[i]; } 
        if((niveau_bat>78)&&(niveau_bat<=84)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_42[i]; } 
        if((niveau_bat>84)&&(niveau_bat<=90)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_45[i]; } 
        if((niveau_bat>90)&&(niveau_bat<=100)){for(i=0;i<258;i++)tab_gauge[i]=Image_batterie_vide2648_48[i]; }*/ 
     
    }

    problème, ça plante mon process ,... le micro bloque ...

    J'ai donc afficher les différents tableau isolement, ça fonctionne bien ...
    j'isole mon if en dehors de la fonction et là ça plante de nouveau ... je laisse donc le for toujours en dehors et pareil ... ça plante

    au final
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                for(i=0;i<258;i++)
                {tab_bat1[i]=Image_batterie_vide2648_12[i];}

    ça me plante le micro, alors que depuis le début, mon tableau ce rempli bien avec les valeur correspondant au niveau demandé et même dans la fonction mais bizarrement une fois rempli plus rien ....

  6. #46
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Ancien développeur matériel électronique (Hard/Soft)
    Inscrit en
    avril 2002
    Messages
    2 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ancien développeur matériel électronique (Hard/Soft)
    Secteur : Service public

    Informations forums :
    Inscription : avril 2002
    Messages : 2 951
    Points : 10 633
    Points
    10 633
    Par défaut
    Bonjour,
    A vérifier avec ton compilateur mais il est probable qu'un uint8_t ne puisse pas aller au-delà de 255 (de 0 à 255)
    Donc tes boucles for ne s'arrêteront jamais.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  7. #47
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    août 2008
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : août 2008
    Messages : 348
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Bonjour,
    A vérifier avec ton compilateur mais il est probable qu'un uint8_t ne puisse pas aller au-delà de 255 (de 0 à 255)
    Donc tes boucles for ne s'arrêteront jamais.
    En fait, j'ai résolu mon problème, le for incrémente jusqu'a 256 un tableau de 156, et ça mon micro n'aimait pas ça apparemment (:

  8. #48
    Membre confirmé
    Femme Profil pro
    ..
    Inscrit en
    décembre 2019
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 91
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : décembre 2019
    Messages : 203
    Points : 451
    Points
    451
    Par défaut
    Je m'étais dit encore un qu'on ne va plus revoir ! Mais non.

    Code c : 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
    void display_gauge(uint8_t x, uint8_t y,  uint8_t batt_level)
    {
        enum {oct_width= 22, px_height= 48, oct_height= px_height/8};
        uint8_t gauge_map[oct_width*oct_height+2]= {oct_width, px_height, 0};
        int computed_level= (batt_level*px_height)/100;
        uint8_t gauge_level=
            uint8_t(computed_level<=px_height?computed_level:px_height);
        uint8_t main_level= gauge_level/8;
        uint8_t sub_level= gauge_level%8;
        uint8_t (*payload)[oct_width]= (uint8_t (*)[oct_width])(&gauge_map[2]);
        for (size_t j= 1; j< (oct_width-1); ++j) {
            payload[oct_height-1][j]= 128;
            payload[0][j]= 1;
        }
     
        for (size_t i= oct_height, n= oct_width-1; i--;) {
            payload[i][0]= 255;
            payload[i][n]= 255;
            if (main_level) {
                for (size_t j= 1; j< n; ++j)
                    payload[i][j]= 255;
                --main_level;
            }
            else if (sub_level) {
                for (size_t j= 1; j< n; ++j)
                    payload[i][j]|= uint8_t((1<<sub_level)-1);
                sub_level= 0;
            }
        }
     
        picture(x, y, gauge_map);
    }

  9. #49
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : mai 2013
    Messages : 335
    Points : 1 188
    Points
    1 188
    Par défaut Un dessin vaut mieux...
    Bonjour,

    Si on suppose que le début du tableau correspond au bas de l'image on a :
    Nom : ImgBat.png
Affichages : 19
Taille : 62,4 Ko

    Le dessin permet de concrétiser les rôles des paramètres.

    Si l'hypothèse du sens bas/haut est erroné soit on retourne l'écran soit on adapte les formules en commençant par le dessin.
    • Y mod 8 <=> Y & 7
    • Y div 8 <=> Y >> 3


    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

Discussions similaires

  1. [JSmooth] Bien intégrer la JRE avec son programme
    Par Ceubex dans le forum EDI et Outils pour Java
    Réponses: 0
    Dernier message: 31/03/2012, 00h01
  2. Liste des fichiers ouverts avec son programme
    Par z4k4r14 dans le forum Langage
    Réponses: 3
    Dernier message: 27/02/2012, 15h41
  3. Utiliser 2 processeurs avec un programme en C
    Par frogway dans le forum C
    Réponses: 4
    Dernier message: 04/04/2009, 20h05
  4. Réponses: 1
    Dernier message: 23/07/2007, 12h00
  5. Ouvrir un fichier avec son programme
    Par aliwassem dans le forum Delphi
    Réponses: 1
    Dernier message: 21/10/2006, 22h26

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