Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Syntaxe programme C++



  1. #1
    Paulochon

    Syntaxe programme C++


    ------

    Bonjour à tous,

    Voila je ne vois pas ou peut venir mon erreur,

    J'expliqe le fonctionnement de mon programe,
    J'ai deux boutons, mais je veux que c'est bouton soit à logique séquentielle,
    Alors j'ai fais un petit programme pour pouvoir allé voir les bit du port concerné et donc de réalisé cette fontion,

    C'est bouton permette l'allumage du backlite du lcd et le controle du mute de mon Amplificateur Audio.

    Voila mon programme

    Ici le sous-programme de lecture des bite et donc de l'affection des valeurs de a et b
    void cmdall_back ( unsigned char port_cmd ) // Lecture Ampli et Backlite
    {

    unsigned char a, b;

    if ( (PINB & 0x10) == 0x10 ) // Test du bit PB5
    {~b;}
    else {b=b;}

    if ( (PINB & 0x20) == 0x20 ) // Test du bit PB6
    {~a;}
    else {a=a;}
    }
    Ici l'affichage sur le LCD
    (il n'y a pas encore les tempo mais je les rajouterai après)
    void Affichage_cmdb ( unsigned char b )
    {

    switch (b)
    {
    case 1 :

    aff_ligne0(" AMPLI ");
    aff_ligne1(" ON ");

    break;
    case 0 :

    aff_ligne0(" AMPLI ");
    aff_ligne1(" OFF ");

    break;
    }
    }

    void Affichage_cmda ( unsigned char a )
    {

    switch (a)
    {
    case 1 :

    aff_ligne0(" BACKLITE ");
    aff_ligne1(" ON ");

    break;
    case 0 :

    aff_ligne0(" BACKLITE ");
    aff_ligne1(" OFF ");

    break;
    }
    }
    Voici le sous-programme de scrutage ci-dessous
    void scrutages_cmd ( unsigned char port_cmd )
    {

    unsigned char a, b;

    do
    {
    a= cmdall_back(PINB);
    b= cmdall_back(PINB);
    Affichage_cmdb(b);
    Affichage_cmda(a);

    }while( (PINB & 0x30) > 0x00) ;
    }
    Donc je le rapelle je travaille sous WinAVR et la j'ai tellment le nez sur mon programe depuis des jours que je fini par ne plus rien voir

    En vous remerciant de votre aide
    Cordialement
    Paulochon

    -----
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  2. Publicité
  3. #2
    Paulochon

    Re : Syntaxe programme C++

    Bonsoir à tous,

    j'esère que quelqu'un pourras venir me secourir,
    Je cherche toujours de mon coté

    En vous remerciant de l'aide que vous allez m'apporté
    Cordialement Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  4. #3
    lolomatic

    Re : Syntaxe programme C++

    Salut !

    Je n'ai pas examiné ton programme en détail car je n'ai pas le temps, mais j'ai noté quelques erreurs qui pourraient te permettre déjà d'y voir plus clair.

    Dans un premier temps : le langage dans lequel ton programme est écrit est du C et pas du C++, car c'est un programme procédural et non objet . C'est important pour les puristes

    Citation Envoyé par Paulochon Voir le message

    void cmdall_back ( unsigned char port_cmd ) // Lecture Ampli et Backlite
    {

    unsigned char a, b;

    if ( (PINB & 0x10) == 0x10 ) // Test du bit PB5
    {~b;}
    else {b=b;}

    if ( (PINB & 0x20) == 0x20 ) // Test du bit PB6
    {~a;}
    else {a=a;}
    }
    Soit! On a là une fonction qui prend un paramètre (unsigned char port_cmd)... Mais où est utilisé ensuite ce paramètre ???

    On reste dans la même fonction et on constate que celle-ci ne renvoie rien (void)
    Et pourtant, tu l'utilises en récupérant une valeur de retour dans l'extrait ci-dessous (le dernier listing de ton post) :

    Citation Envoyé par Paulochon Voir le message
    void scrutages_cmd ( unsigned char port_cmd )
    {

    unsigned char a, b;

    do
    {
    a= cmdall_back(PINB);
    b= cmdall_back(PINB);

    Affichage_cmdb(b);
    Affichage_cmda(a);

    }while( (PINB & 0x30) > 0x00) ;
    }
    Je n'ai pas poussé plus loin l'analyse du code, et j'espère que ces remarques te seront utiles...
    Ceci dit, les erreurs que j'ai relevées sont normalement averties par tout bon compilateur qui se respecte !
    Même si ce n'est pas tentant de lire les "Warning" lorsque le message de fin anonce une compilation réussie, ces derniers peuvent facilement éviter des erreurs qui se voient ensuite sur platine !

    Maintenant, si tu as "le nez dans le guidon" après une séance intensive de programmation, il vaut mieux faire autre chose un moment, ça peut éviter des nuits blanches

    Bon courage pour la suite !

  5. #4
    Paulochon

    Re : Syntaxe programme C++

    Merci pour ces conseil,
    je pense que je vais lever le piedun petit peu et prendre du recul sur le programme c'est vrai que quandon es trop sur son trvaille on finie par ne plus rien voir
    Même les erreur les plusflagrante vienne a me passé sous le nez certaine fois
    Après quelque jours sans y toucher je pense y voir plus claire

    Cordialement
    Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

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

    Re : Syntaxe programme C++

    Code:
    void cmdall_back ( unsigned char port_cmd ) // Lecture Ampli et Backlite
    {
    
    unsigned char a, b;
    
    if ( (PINB & 0x10) == 0x10 ) // Test du bit PB5
    {~b;}
    else {b=b;}
    
    if ( (PINB & 0x20) == 0x20 ) // Test du bit PB6
    {~a;}
    else {a=a;}
    }
    a et b sont des variables locales, donc sur la pile, et n'existent que durant l'exécution de la routine puis "disparaissent", donc, c'est fort probablement pas bon.
    si a et b existent ailleurs, il faut:
    • que se soient des variables globales (déclarées hors bloc fonction)
    • de préférence avoir un nom plus parlant
    • être déclarées dans un fichier .h inclus là où il y en a besoin

    {~a;} ne modifie pas a, éventuellement fait le calcul mais comme il n'y a pas de "=", il n'y a pas d'affectation.
    {a = ~a;} (accolades optionnelles, mais non génantes)

    else {a=a;} inutile, sauf si a est déclaré volatile, c'est à dire que a peut changer indépendamment du programme courant (par le hard ou le code d'une it) et/ou que l'action d'écrire une donnée fait plus qu'écrire (par exemple acquitter une interruption ou reseter un compteur...) mais je ne pense pas que ce soit le cas ici.

    Mais si tu veux "bouton à logique séquentielle" (un appui: on, un appui: off)
    En fait, ton code devrait scruter ET mémoriser les changements d'état des boutons, ainsi que mémoriser l'état des commandes car actuellement si bouton on, il y a clignotement de la commande.

    Code:
    #define CMD_BACK 0x10 // backlight a passer en paramètre de cmdall_back
    #define CMD_AMPLI 0x20 // ampli
    
    unsigned char cmdall_back ( unsigned char port_cmd ) // Lecture Ampli et Backlite
    {
    unsigned static char oldP=0, mem=0; //memo du port et des etat (init à 0)
    unsigned char curP, Pmont; // etat courant du port
    
    curP = PINB;
    switch(port_cmd)
    {
    case CMD_BACK:
     if (( curP & CMD_BACK ) && !(oldP & CMD_BACK)) // Test du bit montant
      mem ^= CMD_BACK; // changement de l'état
     oldP = (oldP & ~CMD_BACK) | (curP & CMD_BACK); // old prend la valeur de cur pour le prochain tour (sur le bit traité)
     return (mem & CMD_BACK); // renvoi vrai si memo, faux sinon
     break; // pas vraiment utile vu qu'il y a return avant
    case CMD_AMPLI:
    ... idem avec a et CMD_AMPLI
      break; // pas vraiment utile vu qu'il y a return avant
     default:
     return 0;  // ou gestion de bug vu qu'on a rien à faire ici ...
    }
    
    }
    avec appel de la fonction avec les paramètres CMD_AMPLI ou CMD_BACK (extensible à plus de bits) dans scrutages_cmd ():

    et sans (PINB & 0x30) dans le while sinon, il n'y a pas de relâché de bouton pris en compte...

    mais ce n'est pas optimisé, et de loin
    car il faut bien t'en laisser découvrir...
    donc bon courage et bonne continuation...

  8. #6
    m'enfin

    Re : Syntaxe programme C++

    Salut,
    Lolomatic a déjà pointé quelques petites erreurs.
    J'ajouterais:

    Code:
    void cmdall_back ( unsigned char port_cmd ) // Lecture Ampli et Backlite
    {
    
    unsigned char a, b;
    
    if ( (PINB & 0x10) == 0x10 ) // Test du bit PB5
    {~b;}
    else {b=b;}
    
    if ( (PINB & 0x20) == 0x20 ) // Test du bit PB6
    {~a;}
    else {a=a;}
    }
    Les test sont faux, le poids de PB5 est 0x20 et celui de PB6 est 0x40
    Les lignes rouges ne servent à rien, les contenus de a et b ne sont pas affectés, il faut écrire a=~a;
    les lignes bleues peuvent être supprimées, aucune changement n'étant opéré la présence du else n'est pas obligatoire .

    Code:
    void scrutages_cmd ( unsigned char port_cmd )
    {
    
    unsigned char a, b;
    
    do
    { 
    a= cmdall_back(PINB);
    b= cmdall_back(PINB);
    Affichage_cmdb(b);
    Affichage_cmda(a);
    
    }while( (PINB & 0x30) > 0x00) ;
    le while devient: while((PINB & 0x60)==0); // attente d'une commande

    Petite astuce: le C considère comme "vraie" toute valeur différente de 0, on peut donc écrire:
    if (PINB & 0x20) // Test du bit PB5
    et aussi
    while(!(PINB & 0x60));

    A+

    grillé par polo !!!

  9. Publicité
  10. #7
    Paulochon

    Re : Syntaxe programme C++

    Merci m'enfin et Polo pourc'es précieuse information

    Je posterai la fin du programme des que j'orai fini

    je pense qu'avec vos conseil, il ne devrai pas y avoir de problême.

    Cordialement
    Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

Discussions similaires

  1. Question de syntaxe
    Par Bernouilly dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 25/10/2007, 12h30
  2. Syntaxe interruption MPLAB
    Par arcane86 dans le forum Électronique
    Réponses: 6
    Dernier message: 25/04/2007, 09h46
  3. Syntaxe mutation
    Par brunop dans le forum Biologie
    Réponses: 4
    Dernier message: 11/04/2006, 16h53
  4. Syntaxe
    Par brunop dans le forum Chimie
    Réponses: 1
    Dernier message: 17/01/2006, 16h33
Découvrez nos comparatifs produits sur l'informatique et les technologies.