Partage
  • Partager sur Facebook
  • Partager sur Twitter

Executer action 1 seul fois

Sujet résolu
    5 juin 2019 à 9:58:33

    Bonjour,

    Alors voilà, je travaille avec PsOC5LP et programme avec PsOC Creator. 

    J'aimerais créer une fonction qui suis ce déroulé:

    1- Appui sur Bouton_1

    2- LED_1 s'allume

    3- Écris "test effectué" sur carte SD

    4- Appui sur Bouton_1

    5- LED_1 s'éteint

    Du coup j'ai écris quelques lignes pour réaliser cette fonction mais je me rends compte que lorsque mon bouton reste en position 0 (car relié à la masse) ma Led s'allume mais la ligne 3- n’arrête pas de s'effectuer. Autre problème, il faut que le programme soit dans une boucle car il faut qu'il soit utilisable a tous moment dès que j’alimente mon PsOC.

    Voila du coup ma question : Comment faire en sorte que la ligne 3- s’exécute qu'1 seule fois ?

    for(;;)
    {
    if (BP_1_Read()==0)//Si Bouton_1 en position 
    FS_Write(pFile, "Test Alarme 1\n",15u),//permet d’écrire sur le fichier texte sur la carte SD
    LED_1_Write(1),//Allume la LED
    else
    LED_1_Write (0);//Éteint la LED
    }

    Merci d'avance pour vos réponses et vos question.

    • Partager sur Facebook
    • Partager sur Twitter
      5 juin 2019 à 11:12:42

      Salut,

      Pour éviter de boucler, il faut utiliser un front. Il s'agît d'enregistrer l'état d'une variable en la copiant afin de pouvoir faire une comparaison de son état entre cycle N et cycle N-1.

      début boucle
      {
      
           bool frontMontant = appuie && !memoAppuie;
      
          /** CODE **/
      
         memoAppuie = appuie;
      
      }fin boucle

      Bonne continuation.

      • Partager sur Facebook
      • Partager sur Twitter

      Bonhomme !! | Jeu de plateforme : Prototype.

        5 juin 2019 à 14:01:29

        Salut,

        Merci pour ta réponse, mais je ne comprends pas tous...

        Et j'ai trouvé une solution plus simple: Rajouter un delay pour compenser le temps de retour en position normal du bouton.

        Merci :D

        • Partager sur Facebook
        • Partager sur Twitter
          5 juin 2019 à 14:28:56

          Salut,

          Plus simple, oui, robuste pas certain. Et si on reste le doigt sur le bouton, il se passe quoi à la fin de ton delay ?

          Un front, n'est vrai que sur un cycle de lecture, donc on peut rester appuyé sur le bouton des siècles, ce ne sera que l'évennement "on a appuyé sur le bouton" qui sera pris en compte :

          bool btMem  = !BP_1_Read(),
               btRe   = false,
               ledSts = false;
          
          
          while(true)
          {
             btOn = !BP_1_Read();
             btRe = btOn && !btMem;
          
          
             if (btRe)//Si Bouton_1 change d'état de 0 à 1
             {
          
                 if(!ledSts)
                     FS_Write(pFile, "Test Alarme 1\n",15u),//permet d’écrire sur le fichier texte sur la carte SD
          
                 ledSts ^= true;
             }
             
             LED_1_Write(ledSts);
             btMem = btOn;
          }

          Bonne continuation.

          -
          Edité par drx 5 juin 2019 à 14:36:12

          • Partager sur Facebook
          • Partager sur Twitter

          Bonhomme !! | Jeu de plateforme : Prototype.

            5 juin 2019 à 16:36:23

            Les contacts n'étant pas parfaits, il faut quand même tenir compte des rebonds....
            • Partager sur Facebook
            • Partager sur Twitter
              5 juin 2019 à 17:53:04

              Effectivement, mais le debounce devrait être électrique.

              Dans l'autre cas, il y a du code de debounce sur le site officiel arduino.

              M'enfin, solution électrique à appliquer, ce n'est pas au code de gérer les parasites du circuit, les I/O doivent êtres propres.

              • Partager sur Facebook
              • Partager sur Twitter

              Bonhomme !! | Jeu de plateforme : Prototype.

                17 juin 2019 à 14:12:26

                Salut,

                Désolé d'avoir mis autant de temps à répondre, mais j'étais occupé (examens oblige).

                J'ai essayé d'ajouter le code que tu as écris au miens mais j'ai des erreurs de partout.

                Je ne connais pas du tout le booléen et je pense que c'est pour ça que sa bloque.

                Merci quand même de ton aide.

                M.

                • Partager sur Facebook
                • Partager sur Twitter
                  17 juin 2019 à 14:34:02

                  Tes erreurs de partout, on n'y peut rien surtout si on ne voit pas le code.

                  Pour le booléen : C'est un type de données qui a deux constantes true et false, dont je te laisse deviner la signification. Si tu ne fais pas l'effort de te renseigner de façon un peu active, c'est sûr que la programmation ça va bloquer.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 juin 2019 à 15:09:00

                    Bonjour,

                    Je n'ai jamais dis que je ne me renseignais pas de mon côté, mais j'image que le Booléen en s'apprends pas du jour au lendemain.

                    Bien sûr que je cherche des réponses à mes erreurs mais ce messages avait surtout pour but de répondre à drx pour lui dire que je l'avais bien pris en compte.

                    Je vous poste quand même mon code avec erreurs.

                    J'ai bien compris que les erreurs étaient des erreurs de variable non déclarée, mais je ne sais à qu'elle valeur les déclarer.

                    #include <device.h>
                    #include <FS.h>
                    #include <string.h>
                    #include <Global.h>
                    #include <stdlib.h>
                    #include <stdio.h>
                    #include <stdbool.h>
                    
                    char sdFile[9] = "C-R.txt";
                    char transmittBuffer[30];
                    char pDirName;
                    int(Alarme1) = 0;
                    int(Alarme2) = 0;
                    int(Alarme3) = 0;
                    int(PorteAvant) = 0;
                    int(PorteArriere) = 0;
                    int(HautParleurVoyageurs) = 0;
                    int(HautParleurPorteAvant) = 0;
                    int(CoupureRadio) = 0;
                    int(MuteRadio) = 0;
                    int(BlocageValideur) = 0;
                    
                    
                    void NextStep(U16 step, char * str)
                    {
                        /* Clear LCD after previously completed operation */
                        LCD_ClearDisplay();
                        
                        /* This will display step number on the LCD prior
                        every operation on the SD card.*/
                        LCD_Position(0u, 0u);
                        sprintf(transmittBuffer, "step# %d %s \n\r", step, str);
                        LCD_PrintString("Etape#");
                        LCD_PrintDecUint16(step);
                        LCD_Position(1u, 0u);
                        LCD_PrintString(str);
                        
                        CyDelay(500u);
                        
                        LCD_ClearDisplay();
                    }
                    
                    int main()
                    
                    {
                        LED_Rouge_Write(1);
                        char sdVolName[11];     /* Buffer that will hold SD card Volume name */
                        U16 Etape = 1u;
                        FS_FILE * pFile;
                        
                        
                        /* Allumage LCD */
                        LCD_Start();
                        
                        /* Initatialisation file system */
                        FS_Init();
                        
                        /* Affichage de l'étape */
                        NextStep(Etape++, "Nom de la Carte SD");
                        
                        LCD_Position(0u, 0u);
                        
                        /* Obtention du nom de la carte SD */
                        if(0 != FS_GetVolumeName(0u, &sdVolName[0], 9u))
                            {
                            /* Impression nom carte SD sur l'ecran */
                            LCD_PrintString("Nom de la Carte SD:");
                            LCD_Position(1u, 0u);
                            LCD_PrintString(sdVolName);
                            }
                            else
                            {
                            /* Si erreur d'obtention - Ecrir ceci */
                            LCD_PrintString("Erreur d'obtention");
                            LCD_Position(1u, 0u);
                            LCD_PrintString("Nom de la Carte SD");
                            }
                        
                        CyDelay(500u);
                        
                        /* Affichage du nom de l'étape */
                        NextStep(Etape++, "Format Carte SD");
                            
                        LCD_Position(0u, 0u);
                        LCD_PrintString("Format carte SD:");
                        
                        /* Obtention du nom du Format de la carte SD */
                        if(0 == FS_FormatSD(sdVolName))
                            {
                            /* Impression de la conformité du forma de la carte SD */
                            LCD_Position(1u, 0u);
                            LCD_PrintString("Conforme");
                            }
                            else
                            {
                            /* Impression de la non conformité du forma de la carte SD */
                            LCD_Position(1u, 0u);
                            LCD_PrintString("Erreur");
                            }
                        
                        CyDelay(500u);
                    
                        /* Affichage du nom de l'étape */
                        NextStep(Etape++, "C-R");
                        
                        /* Création du fichier .txt sur la carte SD */
                        pFile = FS_FOpen("C-R.txt", "w+");
                        
                        LCD_Position(0u, 0u);
                        
                        if(pFile)
                            {
                            /* Impression confirmation création du fichier .txt */   
                            LCD_PrintString("Document ");
                            LCD_PrintString(sdFile);
                            LCD_Position(1u, 0u);
                            LCD_PrintString("Dossier Cree");
                            }
                            else
                            {
                            /* Impression erreur de création du fichier .txt */
                            LCD_PrintString("Erreur de Creation");
                            }        
                      
                        CyDelay(2000);
                    
                        LCD_ClearDisplay();
                    
                        LCD_Position(0u, 0u);
                    
                        LCD_PrintString("ECRITURE");
                        
                         
                            /*for(;;)
                    {
                        {
                        if (BP_1_Read()==0)
                            FS_Write(pFile, "Test Alarme 1\r\n",15u),
                            LED_1_Write (1);
                            //CyDelay(500);
                        else
                            LED_1_Write (0);
                        }
                        {
                        if (BP_2_Read()==0)
                            FS_Write(pFile, "Test Alarme 2\r\n",15u),
                            LED_2_Write (1);
                            //CyDelay(500);
                        else
                            LED_2_Write (0);
                        }
                        {
                        if (BP_3_Read()==0)
                            FS_Write(pFile, "Test Alarme 3\r\n",15u),
                            LED_3_Write (1);
                            //CyDelay(500);
                        else
                            LED_3_Write (0);
                        }
                        {
                        if (BP_4_Read()==0)
                            FS_Write(pFile, "Test Porte Avant\r\n",18u),
                            LED_4_Write (1);
                            //CyDelay(500);
                        else
                            LED_4_Write (0);
                        }
                        {
                        if (BP_5_Read()==0)
                            FS_Write(pFile, "Test Porte Arriere\n",20u),
                            LED_1_Write (1),
                            CyDelay(500);
                        else
                            LED_1_Write (0);
                        }
                        {
                        if (BP_6_Read()==0)
                            FS_Write(pFile, "Test Haut-Parleur Voyageur\n",28u),
                            LED_1_Write (1),
                            CyDelay(500);
                        else
                            LED_1_Write (0);
                        }
                        {
                        if (BP_7_Read()==0)
                            FS_Write(pFile, "Test Haut-Parleur Porte Avant\n",31u),
                            LED_1_Write (1),
                            CyDelay(500);
                        else
                            LED_1_Write (0);
                        }
                        {
                        if (BP_8_Read()==0)
                            FS_Write(pFile, "Test Coupure Radio\n",20u),
                            LED_2_Write (1),
                            CyDelay(500);
                        else
                            LED_2_Write (0);
                        }
                        {
                        if (BP_9_Read()==0)
                            FS_Write(pFile, "Test Mute Radio\n",17u),
                            LED_3_Write (1),
                            CyDelay(500);
                        else
                            LED_3_Write (0);
                        }
                        {
                        if (BP_10_Read()==0)
                            FS_Write(pFile, "Test Blocage Valideur\n",23u),
                            LED_1_Write (1),
                            CyDelay(500);
                        else
                            LED_1_Write (0);
                        }
                        
                        {
                        if (BP_Sortie_Read()==0)
                            break;
                        }
                    }*/
                    
                    bool btMem = !BP_1_Read(),
                        btRe = false,
                        ledSts = false;
                    
                        while(true)
                        {
                            btOn = !BP_1_Read();//Erreur variable btOn non déclaré
                            btRe = btOn && !btMem;//Erreur variable btOn non déclaré
                            
                            if (btRe)
                            {
                                if(!ledSts)
                                    FS_Write(pFile, "Test Alarme1\n",15u),//permet d'écrir sur le fichier txt
                    
                                ledSts ^= true;
                            }
                            LED_1_Write(ledSts);
                            btMem = btOn//Erreur variable btOn non déclaré
                    
                        CyDelay(800);
                    
                        LCD_ClearDisplay();
                        
                        LCD_Position(0u, 0u); 
                        {
                        if(0 == FS_FClose(pFile))
                            {
                            LCD_PrintString("Dossier fermee");
                            LED_Vert_Write(1);
                            LED_Rouge_Write(0);
                            }
                       else
                            {
                            LCD_PrintString("Erreur fermeture");
                            LED_Vert_Write(0);
                            LED_Rouge_Write(1);
                            }
                        }
                        }
                    /* [] END OF FILE */



                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juin 2019 à 15:21:32

                      * tu as déjà une erreur ligne 12, qui montre que tu ne sais pas déclarer une variable. Il faudrait commencer par ça : les bases.

                      * Désolé mais le type booleen s'apprend en 5 minutes. Une fois qu'on a dit qu'il s'appelait bool, qu'il avait deux constantes true et false, et les opérations &&, || et !, on a tout dit.

                      Pour faire bon poids, on peut parler de ses usages, comme stocker le résultat d'une condition

                      bool trop_petit =  x < minimum;
                      bool trop_grand =  x > maximum; 


                      et bien sur, c'est pour l'utiliser ensuite

                      if (trop_petit || trop grand) {
                          ...
                      }
                      

                      mais pour ça, il faut se donner la peine de lire un peu.



                      -
                      Edité par michelbillaud 17 juin 2019 à 15:23:28

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 juin 2019 à 15:54:54

                        Je ne vois pas le problème avec ma ligne 12, j'utilise cette variable depuis 4 mois dans un autre programme, écris exactement pareil, et je n'ai jamais eu de problème.

                        Aussi je ne pense pas avoir a justifier le fait d'avoir lu des articles sur le bool. 

                        Car au risque de t'étonner, je prends la peine de lire un peu 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 juin 2019 à 16:15:08

                          Salut,

                          Et les prenthèses dans les déclarations, c'est pour... ? Elles  n'ont rien à faire ici.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Bonhomme !! | Jeu de plateforme : Prototype.

                            17 juin 2019 à 16:18:41

                            Effectivement, la syntaxe

                            int (truc) = 0;
                            

                            est acceptée pour une déclaration. Mais quel avantage par rapport à

                            int truc = 0;

                            ?

                            La norme C11 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

                            ----

                            Tu n'as a te justifier de rien, je réagis simplement quand tu dis qu'on ne peut pas apprendre à se servir de booléens du jour au lendemain.

                            Si tu n'as pas lu d'article dessus, il y a sans doute plusieurs raisons

                            • tu lis des articles trop vieux (bool est dans C depuis 20 ans), écrit par des gens pas compétents
                            • pas de quoi en faire tout un tuto, tellement c'est simple.

                            ----

                            pour le message

                                    btOn = !BP_1_Read();//Erreur variable btOn non déclaré

                            le remède est simple : déclarer la variable. Si c'est un bool :

                                    bool btOn = !BP_1_Read();


                            ce qui est la même chose que 5 lignes au dessus, pour l'autre variable.



                            -
                            Edité par michelbillaud 17 juin 2019 à 16:32:39

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 juin 2019 à 7:46:26

                              Les parenthèses sont là car sur PsOC Creator il est souvent demandé de mettre entre parenthèses tous et n'importe. 

                              Enfin bref, je cloture le sujet et vous remercie de votre participation

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Executer action 1 seul fois

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown