Deux " if " en C
Répondre à la discussion
Affichage des résultats 1 à 26 sur 26

Deux " if " en C



  1. #1
    invite3570b5f7

    Deux " if " en C


    ------

    Bonjour, je suis entrain de faire un système avec un micro contrôleur et je me confronte à une situation que je n'ai jamais vue.

    En effet je me demande si c'est possible de mettre 2 IF ensemble comme le montre l'image.

    Si oui comment ?

    Je programme en C avec AVR.

    Merci

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

  2. #2
    invitee05a3fcc

    Re : Deux " if " en C

    Quelque soit le langage, tu ne peux pas faire ça (qui n'a pas de signification au sens humain !)

    Explique mieux, en Français, ce que tu veux faire

  3. #3
    fouga

    Re : Deux " if " en C

    D'accord avec toi, à une exception près:

    le grafcet!
    Dans ce cas là on a une divergence (nature OU/ET je sais plus, pas touché au grafcet depuis longtemps).

    Il faudrait effectivement être plus clair dans la demande,

    s'il s'agit de mettre un if à 2 conditions et suivre le processus derrière si condition remplie, un simple: if(condition1 OR condition 2) suffit mais ça me parait trop simple.

    S'il s'agit de scinder à ce moment l'exécution du programme en 2 processus distincts, on se retrouve dans le cas d'une divergence si on parle de grafcet.

    Alors la question, est-ce réalisable? probablement, c'est de la programmation parallèle, maintenant j'en ai jamais fait et d'après ce que j'ai eu comme écho, c'est pas trivial trivial à faire!

  4. #4
    invitee05a3fcc

    Re : Deux " if " en C

    Je ne connais pas le grafcet , mais un double IF doit inclure un raisonnement caché. Un IF a une réponse vraie ou fausse. C'est bon ou c'est mauvais .... il n'y a pas de troisième hypothèse.

    On peut faire des "IF imbriqués" ou mieux des "select case" si un test peut avoir plus de 2 résultats
    • SI X <= 2 je fais ça
    • SI 2< X <5 je fais ça
    • SI X = 5 je fais ça
    • SI X > 5 je fais ça

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

    Re : Deux " if " en C

    Citation Envoyé par DAUDET78 Voir le message
    Quelque soit le langage, tu ne peux pas faire ça (qui n'a pas de signification au sens humain !)
    Sauf si on envisage que l'embranchement est un fork... Mais bon, c'est un peu tiré par les cheveux

  7. #6
    mat64

    Re : Deux " if " en C

    .... en tous cas ça implique la présence d'un OS multitaches...

  8. #7
    invitee05a3fcc

    Re : Deux " if " en C

    Citation Envoyé par Faith Voir le message
    Sauf si on envisage que l'embranchement est un fork... Mais bon, c'est un peu tiré par les cheveux
    Vu ce qui me reste ... tirez pas trop.
    Dire que l'on dédouble le programme, le processus ... c'est un peu pousser loin le bouchon pour la question posée. Revenons au débat :
    Quand notre ami joey57 a t'il besoin de ce double losange ? il a besoin de faire quoi ?

  9. #8
    invite29971eb1

    Re : Deux " if " en C

    Citation Envoyé par fouga Voir le message
    D'accord avec toi, à une exception près:

    le grafcet!
    Ben non, le Grafcet a une exécution séquentielle aussi...la condition de gauche est évaluée en premier et si elle est vraie, peu importe que celle de droite soit vraie ou pas, la seconde branche ne sera pas exécutée....enfin dans mes souvenirs aussi

    @joey57 si tu nous disais un peu ce que tu veux faire, on pourra peut-être te trouver une alternative

  10. #9
    fouga

    Re : Deux " if " en C

    Tu me mets un doute là

    En fait d'après mes souvenirs... (j'ai fait du grafcet la dernière fois il y a 3 ans, et le cours sur ces systèmes en école ne vient que cette année...) il y a 2 divergences possibles:

    -Celle que tu cites où effectivement c'est l'un ou l'autre cas et on exécute alors un protocole.

    -Celle où les 2 conditions sont remplies (volontairement, c'est dans le but du système) et on exécute 2 processus en parallèle.
    Je me souviens d'ailleurs qu'il fallait faire attention avec la dernière transition pour synchroniser les 2 processus quand on revenait sur un même tronc... après le nom de chaque divergence, j'ai oublié!

    Comme dit c'est vieux, donc, à vérifier!

    Toujours est il que tant qu'on en saura pas plus sur le besoin réel de joey57, ça fera pas avancer le bidule

  11. #10
    Jack
    Modérateur

    Re : Deux " if " en C

    A mon avis, vu la question, on peut abandonner l'OS multitâche, donc l'exécution de processus ou de threads concurrents.

    Je dirais donc que non, la programmation de l'algorigramme proposé n'est pas possible.

    Le mieux serait de décrire sous forme textuelle le but de la manœuvre.

    A+

  12. #11
    invite29971eb1

    Re : Deux " if " en C

    Citation Envoyé par Jack Voir le message
    A mon avis, vu la question, on peut abandonner l'OS multitâche, donc l'exécution de processus ou de threads concurrents.

    Je dirais donc que non, la programmation de l'algorigramme proposé n'est pas possible.

    Le mieux serait de décrire sous forme textuelle le but de la manœuvre.

    A+
    Bah le multitache, c'est jouable: http://www.femtoos.org/

  13. #12
    Jack
    Modérateur

    Re : Deux " if " en C

    oui, je connais ce type d'OS pour petits µC.

    Ce que je voulais dire c'est qu'il y avait un grand décalage entre la demande et le niveau de compétence attendu pour gérer un OS multitâche.

    A+

  14. #13
    invite29971eb1

    Re : Deux " if " en C

    Citation Envoyé par Jack Voir le message
    oui, je connais ce type d'OS pour petits µC.

    Ce que je voulais dire c'est qu'il y avait un grand décalage entre la demande et le niveau de compétence attendu pour gérer un OS multitâche.

    A+
    Nous sommes d'accord

  15. #14
    invite7a49d0d5

    Cool Re : Deux " if " en C

    Salut,

    pour "bien" dériver...
    il y a pas que des OS "multigrossestâches"...
    il y a même des µC...
    par exemple le P8X32A-D40 (x8µC 32bits en //, dispo en PDIP40 à environ 20 roros)...

    et la prochaine mode c'est les µC+FPGA...
    un petit µC 8bits (pour le programme de base (main))
    couplé à
    un petit FPGA (pour les GROS calculs optimisés(genre 64x64bits"câblés"))

    ça va faire un malheur ;O]

    après, même sans connaître le contenu des "losanges" on
    pourrait en écrire des pages... car si il le faut, ben un "simple"
    if/else suffira largement... hein joey...

    vede
    ;O]

    .

  16. #15
    invite3570b5f7

    Re : Deux " if " en C

    Hé bien ! j'ai eu de la lecture

    Merci pour vos réponses, et d'ailleurs c'est vrai qu'en y réfléchissant c'est pas terrible ce que je proposais du coup j'ai fait autrement.

    Le multi-tâches ca seras pour euh une prochaine fois

    Dans mes losange il y'a 2 boutons poussoirs mais c'est bon j'ai réglé le problème.

    Par contre j'ai écris ce bout de programme en sous programme et j'ai 2 questions :

    1) Je suis sure qu'il y'a moyen de faire la même manip mais en écrivant seulement 3 4 lignes... j'ai cherché mais je trouve pas. Je pensais faire un décalage vers la droite mais ça ne va pas.

    2) Comment ressortir du sous programme ?
    J'ai lu qu'il fallait une condition. Donc je me suis dit que je pouvait incrémenter une variable et que quand elle arrive à 9 je sors mais ca revient au même lol.

    #include <mega8535.h>
    #include <delay.h>

    unsigned int a =0;

    //****************************
    // Sous programmes
    //****************************

    void Act_Relais (void )

    {
    delay_ms(2000);
    PORTA = 0x80;
    a=a++;
    delay_ms(2000);
    PORTA = 0xc0;
    a=a++;
    delay_ms(2000);
    PORTA = 0xe0;
    a=a++;
    delay_ms(2000);
    PORTA = 0xf0;
    a=a++;
    delay_ms(2000);
    PORTA = 0xf8;
    a=a++;
    delay_ms(2000);
    PORTA = 0xfc;
    a=a++;
    delay_ms(2000);
    PORTA = 0xfe;
    a=a++;
    delay_ms(2000);
    PORTA = 0xff;
    a=a++;
    }

  17. #16
    polo974

    Re : Deux " if " en C

    pour incrémenter une variable, il y a trois écritures (de base) au choix :
    Code:
    a=a+1;
    a+=1;
    a++;
    ensuite, on peut faire une boucle:
    Code:
    char b;
    b=-128;    // ou 0x80
    do {
        delay_ms(2000);
        PORTA = b;
        a++;
        b=b/2;
    } while (b != -1)
    b étant un char signé, on obtient bien la suite demandée.
    le décalage >> ne garanti pas ce qui rentre à gauche, la division par 2 si.
    par contre -1 /2 risque de donner -1, donc on ne peut pas tester b==0 comme fin de boucle...

    mais si a peut être utilisé comme compteur:
    Code:
    char b;
    for (a=0, b=0x80; a<8; a++, b/=2){
        delay_ms(2000);
        PORTA = b;
    }
    Jusqu'ici tout va bien...

  18. #17
    invite3570b5f7

    Re : Deux " if " en C

    Salut POLO 974

    Merci pour tes exemples je note ça dans un coin( j'imprime ).

    Par contre je ne suis pas sure que tu ai compris ce que je veux faire je me suis peu être mal expliqué.

    En gros, je dois obtenir cette séquence :

    10000000
    Tempo 2 sec.
    11000000
    Tempos 2 sec.
    11100000
    Tempo 2 sec.
    11110000
    etc...

    Jusqu'à obtenir :
    11111111.

    Ce qui reviendrait à faire ( je penses )

    128
    Tempo 2 sec.
    128 + 64
    Tempo 2 sec.
    128 + 64 + 32

    Etc. Nan ?

    Cette idée m'est venue en regardant tes exemples.

  19. #18
    invite3c35244f

    Re : Deux " if " en C

    Et bien c'est ce que te propose POLO974 ici:

    char b;
    for (a=0, b=0x80; a<8; a++, b/=2){
    delay_ms(2000);
    PORTA = b;
    }

  20. #19
    invite3570b5f7

    Re : Deux " if " en C

    Re bonjours les gents

    Bon ! J'ai inclu ce petit bout de programme dans mon ensemble et :

    - l'appel au sous programme fonctionne.
    - La séquence s'enclenche bien.
    - Le retour au programme principal se fait bien.

    MAIS :

    - comme je le disais, vous avez mal compris ce que je voulais faire lol.

    je vais tenter d'expliquer mieux.

    Là ce que j'obtient avec cette boucle c'est un chenillard.
    Hors moi ce que je veux c'est que les LEDs s'allument les unes après les autres ( comme ce que fait cette boucle FOR ) mais que les LEDs d'avant RESTENT allumées

  21. #20
    Jack
    Modérateur

    Re : Deux " if " en C

    partons du programme proposé:
    Code:
    char b;
    for (a=0, b=0x80; a<8; a++, b/=2){
        delay_ms(2000);
        PORTA = b;
    }
    Il ne me semble pas très compliqué d'adapter ce programme à ce que tu veux, ce qui donne (je n'aime pas trop mettre un tas d'instruction dans la ligne du for):
    Code:
    char b;
    b=0x80;
    for (a=0; a<8; a++){
        PORTA = b;
        b = (b >> 1) + 0x80;
        delay_ms(2000);
    }
    A+

  22. #21
    invite3570b5f7

    Re : Deux " if " en C

    Parfait ! Je viens de l'éssayer sur ma maquette et ca fonctionne au poile

    J'ai passé l'aprem à chercher sur du papier et j'étais vraiment pas loin, juste pas pensé au décalage.

    Bon maintenant, un rappuis sur le BP devrais me faire la séquence inverse.

    Je m'y met

    PS : Merci

  23. #22
    Jack
    Modérateur

    Re : Deux " if " en C

    J'ai passé l'aprem à chercher sur du papier et j'étais vraiment pas loin, juste pas pensé au décalage.
    la division par 2 convenait également si le compilateur est normalement "intelligent". Il traduira la division par 2 en un décalage à droite.

    Je remplacerais toutefois le
    Code:
    char b;
    par
    Code:
    unsigned char b;
    C'est mieux.

    A+

  24. #23
    polo974

    Re : Deux " if " en C

    Citation Envoyé par Jack Voir le message
    la division par 2 convenait également si le compilateur est normalement "intelligent". Il traduira la division par 2 en un décalage à droite.

    Je remplacerais toutefois le
    Code:
    char b;
    par
    Code:
    unsigned char b;
    C'est mieux.

    A+
    Ben non, il faut un signed et normalement un char est signed par défaut,
    au pire il faut le déclarer explicitement
    signed char b;
    mais comme on calcule dessus, juste:
    signed b;
    et normalement le compilo doit se débrouiller.

    donc quand on divise par 2, le signe reste là et donc les 1 remplissent au fur à mesure l'octet depuis la gauche.
    ça aurait dû marcher.
    Jusqu'ici tout va bien...

  25. #24
    invite3570b5f7

    Re : Deux " if " en C

    Re salut

    Effectivement avec un " char " ca fonctionne très bien et pareil pour " unsigned char" .

    Les 2 fonctionnent.

    Bon je vous poste mon programme au cas où il y aurait des remarques à faire et y'en aura surement lol

    En tout cas le but de début est atteint ca fonctionne très bien

    while (1)
    {

    if ( PINB.0 == 0 )
    {
    delay_ms(5);
    BP = ~BP;

    if ( BP == 1 )
    {
    activ_rel ();
    };

    if ( BP == 0 )
    {
    desact_rel ();
    };

    };

    while ( PINB.0 == 1 )
    {
    PORTC.0 = ~ PORTC.0;
    delay_ms(2000);
    };

    }




    }
    Et les 2 sous programmes :

    void activ_rel()
    {

    b = 0x80;

    for (a=0; a<8; a++)
    {
    PORTA = b;
    b = (b >> 1) + 0x80;
    delay_ms(2000);
    };
    }
    void desact_rel ()
    {

    b = 0xfe;

    for (a=0; a<8; a++)
    {
    PORTA = b;
    b = (b<<1);
    delay_ms(100);
    };
    }

  26. #25
    Jack
    Modérateur

    Re : Deux " if " en C

    tu as raison, je n'avais pas percuté sur la recopie du bit de signe.

    Donc Joey, tu as dû mal recopier de code de polo.

    A+

    PS: j'étais en train de rédiger mon message et je n'avais vu que tu avais déjà répondu.

  27. #26
    Jack
    Modérateur

    spi sur ATmega

    si tu veux que ton code soit lisible, utilise les balises "code" au lieu des balises "quote". Ca permet de conserver l'indentation.

    A+

Discussions similaires

  1. "fondamentales", "dures", "molles" ... : comment classer les sciences ?
    Par invite3e35cfa1 dans le forum Epistémologie et Logique (archives)
    Réponses: 13
    Dernier message: 22/04/2017, 23h41
  2. Deux individus, deux vies, deux "formes"
    Par invitecd0f7919 dans le forum Psychologies (archives)
    Réponses: 4
    Dernier message: 17/08/2007, 13h50
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...