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

masque sous arduino



  1. #1
    cougar73

    masque sous arduino


    ------

    bonjour

    je voudrais faire clignoté une led avec un mot binaire par exemple 0b00010010 avec le masque qui ce deplace de <<n 7 positions max a gauche avec une boucle for.
    mon probleme la led reste toujours allumé je vous joint le code
    Code:
    #define L1 4
    #define Led1On digitalWrite(L1,1)
    #define Led1Off digitalWrite(L1,0)
    void setup() {
      pinMode(L1,OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      for (int i = 0; i < 8; i++) {
        byte mask = 0b00000001;
        byte data = 0b00010010;
        byte a = (data & (mask <<i)) ;
        Serial.print("i=");
        Serial.println(i);
        Serial.print("a=");
        Serial.println(a, BIN); // put your main code here, to run repeatedly:
        if (a = 1) {
          Led1On;
          delay(1000);
        } else {
          Led1Off;
          delay(1000);
        }
      }
    }
    merci de votre aide

    bonne journée

    -----

  2. Publicité
  3. #2
    SofEvans

    Re : masque sous arduino

    Bonjour,

    Je n'ai aucune expérience avec du code C pour µC, mais je me débrouille en C.
    Voila ce que je peux te dire :

    * Tu n'as pas besoin de la variable "mask".
    Tu peux écrire "1" directement dans ton code.
    Tout comme tu n'as pas besoin de "data" et tu peux le remplacer par 17.

    En fait, que tu écrive "1", "0b00000001" ou "0x01", cela importe peu, c'est la même chose.

    * Ensuite, et c'est là ton erreur je pense, "=" est utilisé pour faire une affectation, "==" est utilisé pour faire une comparaison.
    Je tiens aussi à te dire que avec "a == 1", tu ne détectera que "0b00000001" et non "0b00010010".
    Si tu veux détecter quand tu as un bit à 1, tu peux utiliser "if (a != 0)", ce qui revient à "if (a)".

    * Essaye d'éviter de déclarer des variable dans le corps de la boucle (byte a) ou même carrément dans la boucle '(int i).
    Cela a pour effet de détruire la variable à la fin de la boucle pour l'allouer de nouveau au début de boucle.
    Sur un PC, ca n'as que très peu de conséquence, mais j'ai déjà entendu un de mes prof raconter qu'il avait eu de grave lag sur une appli critique et qu'après avoir débuggé le code et fait des profilage pour voir où se situé le goulot d'étranglement, ils se sont aperçu que c'était la destruction/création des variables qui pompé une grosse partie des ressource de l'µc.

    * Une autre chose, au vu de tes define Led1On et Led1Off, tu peux simplifier l'écriture par
    digitalWrite(L1, a ? 1 : 0);
    Cette forme de condition est appelé condition ternaire.

    Dernièrement, et c'est un détail, "delay(1000);" est présent dans les deux cas du if, dans tu peux le mettre après le if.

    edit : fait aussi attention à tes commentaire, je suppose que "// put your main code here, to run repeatedly:" doit se situer au debut de la fonction loop, mais en tout cas pas sur un simple Serial.print.


    Code:
    #define L1 4
    
    void setup() {
      pinMode(L1,OUTPUT);
      Serial.begin(9600);
    }
    
    // put your main code here, to run repeatedly:
    void loop()
    {
      int i;
      byte a;
    
      for (i = 0; i < 8; ++ i) {
        a = (0b00010010 & (1 << i)) ;
        Serial.print("i=");
        Serial.println(i);
        Serial.print("a=");
        Serial.println(a, BIN);
        digitalWrite(L1, a ? 1 : 0);
        delay(1000);
      }
    }
    Edit : Attention, j'ai fait ce code de tête, sans compilateur.
    Donc test et rectifie les bourde que j'aurais pu y glisser.
    Dernière modification par SofEvans ; 05/12/2014 à 06h42.

  4. #3
    SofEvans

    Re : masque sous arduino

    Hello,

    Ça n'as pas manqué, il y a un soucis avec mon code : dans le if, au lieu de "++i" j'ai mit "++ i".
    Il faut enlever l'espace.

  5. #4
    cougar73

    Re : masque sous arduino

    hello

    merci pour ton aide, non meme avec l espace ça marche.

    dis moi pourquoi ++i et non i++ y a t il une difference ?
    pourquoi ça ne marche pas avec a==1 on est bien d accord 1&1=1?

    merci en tout cas SofEvan

  6. #5
    SofEvans

    Re : masque sous arduino

    Citation Envoyé par cougar73 Voir le message
    hello

    merci pour ton aide, non même avec l espace ça marche.
    oO
    J'aurais appris quelque chose, je ne sais pas quoi te dire pour le coup.

    Citation Envoyé par cougar73 Voir le message
    dis moi pourquoi ++i et non i++ y a t il une difference ?
    Oui.
    Ce code

    Code:
    int i = 5;
    printf("%d\n", ++i);
    équivaut à

    Code:
    int i = 5;
    i = i + 1;
    printf("%d\n", i);
    et affichera 6 alors que ce code

    Code:
    int i = 5;
    printf("%d\n", i++);
    équivaut à

    Code:
    int i = 5;
    printf("%d\n", i);
    i = i + 1;
    et affichera 5.

    J'utilise ++i par habitude.


    Citation Envoyé par cougar73 Voir le message
    pourquoi ça ne marche pas avec a==1
    Parce que quand i vaudra 5, alors l'expression

    a = (0b00010010 & (1 << i)) ;

    vaudra

    a = (0b00010010 & (1 << 5)) ;
    a = (0b00010010 & (0b0001000)) ;
    a = (0b00010010 & 0b0001000) ;
    a = 0b0001000;
    a = 16

    Or, 16 != 1

    Ce que tu cherche à faire, c'est détecter si un bit est a 1.
    Si le bit est à 0, alors a vaudra 0.
    Si un bit est à 1, alors a vaudra, selon la position du bit, 2 puissance "position bit" (2 puissance i autrement dit).
    Donc au choix, 1, 2, 4, 8, 16, 32, 64 ou 128.

    Donc, tu cherche a détecter si a est différent de 0.


    Citation Envoyé par cougar73 Voir le message
    on est bien d accord 1&1=1?
    Tu confond &&, ||, &, |, = et ==.
    = sert a faire une affectation.

    i = 5;

    i vaut 5 après cette instruction.
    == sert a faire une comparaison

    i == 5

    cette expression vaudra 0 si elle est fausse et sera différente de 0 si elle est vrai.
    & et | sont le ET et le OU des operateur de bit

    1 & 1 == 1 sera vrai.
    1 & 2 == 1 sera faux.
    1 | 1 == 1 sera vrai.
    1 | 2 == 1 sera vrai.
    && et || sont des operateur logique

    val1 == 10 && val2 == 12, cette expression ne sera vrai que si val1 vaut 10 ET val2 vaut 12.
    val1 == 10 || val2 == 12, cette expression sera vrai si val1 vaut 10 ou si val2 vaut 12.
    donc, faire 1&1 = 1 est illogique et te claquera une erreur (certainement avec le mot "lvalue").


    merci en tout cas SofEvan
    SofEvans, avec un s.

    De rien cougar73.

    N'oublie pas de faire une recherche avec les mot clé "operateur langage C" si tu as encore quelques zone d'ombre.

  7. A voir en vidéo sur Futura
  8. #6
    cougar73

    Re : masque sous arduino

    merci pour tes reponses qio sont clair et net.

    ça marche a merveille voici le prog

    Code:
    #define L1 4  // actif à 1
    #define Led1On  digitalWrite (L1,1);    //  Allume
    #define Led1Off digitalWrite (L1,0);    //  Eteint
    #define Led1Toggle  digitalWrite (L1,!digitalRead(L1))
    int datas = 0b11100101000; int datao = 0b11111001000;
    int mask = 0b10000000000 ;
    int compt=0;
    void setup() {
      pinMode (L1, OUTPUT);
      Serial.begin(9600);
    }
    byte a; byte i;
    void c() {
      Serial.println("jesuis dans s");
      for ( i = 0; i < 11; i++) {
        a = (datas & (mask >> i)) ;
        Serial.print("i=");
        Serial.println(i);
        Serial.print("a=");
        Serial.println(a, BIN);
        if (a) {               // ou if = ( !=0 )
          Led1Off;
          delayMicroseconds(3000);
        } else {
          Led1On;
          delayMicroseconds(3000);
        }
      }
    }
    
    void d() {
      Serial.println("jesuis dans o");
      for ( i = 0; i < 11; i++) {
        a = (datao & (mask >> i)) ;
        Serial.print("i=");
        Serial.println(i);
        Serial.print("a=");
        Serial.println(a, BIN);
        if (a) {               // ou if = ( !=0 )
          Led1Off;
          delayMicroseconds(3000);
        } else {
          Led1On;
          delayMicroseconds(3000);
        }
      }
    }
    
    char car;
    void loop() {
      if (Serial.available() > 0) { // lecture des caractères éventuels
        car = Serial.read();
          switch (car) { // décodage des commandes
          case 's' : c(); break;
          case 'o' : d(); break;}
          
        }
        
        }
    j aimerais mettre une pose entre chaque mot j ai essayé plusieur chose soit j ai la tempo 1s enfin de mot par contre le suivant a la tempo a
    chaque lettre.
    je voulais essayé default avec caise ça ne marche pas, parcontre je ne comprens pas comment relier default avec caise, comment ça marche.

    merci de ton aide

  9. Publicité
  10. #7
    SofEvans

    Re : masque sous arduino

    Bonjour,

    Fais attention à ton écriture, il m'est très difficile de comprendre ce que tu me demande.
    Prends 5 minutes de plus la prochaine fois pour te relire, "qio" à la place de "qui", "pose/pause", "enfin/en fin (j'imagine ?)", "default avec caise" -> "defaut avec case" ...
    Bref, fais des phrases propres, s'il te plait.

    Concernant le code :

    * n’hésite pas à aérer le code.
    Un gros pâté comme ça, ça donne pas forcement envie.
    Sépare les #define des déclarations de variable, sépare les déclarations de variable des fonctions, etc etc.

    * fais attention à l'indentation.
    Je pense à la fonction loop, difficile de lire d'un trait le déroulement du programme.

    * Les define ne sont pas vraiment utile ...
    Led1Toggle ne sert pas, Led1On et Led1Off sont juste un sucre syntaxique.
    Je te laisse L1 ^^

    * Même remarque que précedemment.
    Avec la condition ternaire (fait une recherche google) et le fait que le code se répete dans le if et le else, on peut factoriser et se passer de la condition.

    Code:
    #define L1 4  // actif à 1
    
    int datas = 0b11100101000; int datao = 0b11111001000;
    int mask = 0b10000000000 ;
    int compt=0;
    
    void setup() {
      pinMode (L1, OUTPUT);
      Serial.begin(9600);
    }
    
    
    byte a;
    byte i;
    
    void c() {
      Serial.println("jesuis dans s");
      for ( i = 0; i < 11; i++) {
        a = (datas & (mask >> i)) ;
        Serial.print("i=");
        Serial.println(i);
        Serial.print("a=");
        Serial.println(a, BIN);
        digitalWrite (L1, a ? 0 : 1);
        delayMicroseconds(3000);
      }
    }
    
    void d() {
      Serial.println("jesuis dans o");
      for ( i = 0; i < 11; i++) {
        a = (datao & (mask >> i)) ;
        Serial.print("i=");
        Serial.println(i);
        Serial.print("a=");
        Serial.println(a, BIN);
        digitalWrite (L1, a ? 0 : 1);
        delayMicroseconds(3000);
      }
    }
    
    char car;
    
    void loop() {
      if (Serial.available() > 0) { // lecture des caractères éventuels
        car = Serial.read();
        switch (car) { // décodage des commandes
          case 's' : c(); 
            break;
          case 'o' : d();
            break;
        }
      }
    }
    j aimerais mettre une pose entre chaque mot j ai essayé plusieur chose soit j ai la tempo 1s enfin de mot par contre le suivant a la tempo a
    chaque lettre.
    Désolé, j'ai rien compris.
    C'est quoi un mot, c'est ce que tu rentre dans le serial.read() ?
    C'est normal qu'il y ait une tempo a chaque fois que tu rencontre la lettre s ou o, c'est ce que tu as codé ...

    je voulais essayé default avec caise ça ne marche pas, parcontre je ne comprens pas comment relier default avec caise, comment ça marche.
    Comprends pas.
    Defaut, c'est le label qui est exécuté si aucun case ne corresponds.

    Code:
    char car = 'c';
    
    switch(car) {
      case 'a':
        /* code a */
        break;
      case 'b':
        /* code b */
        break;
      case 'c':
        /* code c */
      case 'd':
        /* code d */
      case 'e':
         /* code e */
       break;
    
      defaut:
        break;
    }
    le label defaut sera executé a chaque fois qu'une lettre autre que a, b, c, d ou e sera dans "car".
    Le break sert a sortir du switch directement.
    Cela permet au code correspondant au case 'b' de ne pas etre executé si car == 'a'.
    Note aussi que si car == 'c', alors /* code c */ sera executé, mais aussi /* code d */ et /* code e */ du fait qu'il n'y a pas de break.


    Une dernière petite chose.
    Au vu de la ressemblance ultra flagrante entre la fonction c() et d(), je te conseil d'utiliser des arguments dans ta fonction et de fusionner tes des fonctions, histoire de factoriser un peu quand même.

  11. #8
    cougar73

    Re : masque sous arduino

    ok

    ok compris pour default.

    ce que je voulais dire : quand je tape le mot sos, à la fin il doit y avoir une pause de 1s que je n arrive pas à faire,
    dans mon programme actuel, la pause se fait entre chaque lettre, ce qui n'est pas bon, je ne vois pas comment faire.

  12. #9
    SofEvans

    Re : masque sous arduino

    C'est à toi de définir ce qu'est la fin d'un mot.
    Si tout tes mot font trois lettres, alors tu mets un compteur et tout les % 3 == 0, une pause.
    Si tout tes mots sont composé de lettre, alors dès que tu récupère autre chose qu'une lettre, une pause.

    C'est à toi de gérer.

    Par curiosité, pour 's' tu utilise '0b11100101000' comme data et pour 'o' tu utilise '0b11111001000'.
    D'où sorte ces chiffres ? D'une table précise ?

  13. #10
    cougar73

    Re : masque sous arduino

    pour s = 53 en hexa plus start bit et stop bit sa simule une liaison serie et o idem

    voilas

Sur le même thème :

Discussions similaires

  1. Utiliser un Arduino uno sous Windows 8 ?
    Par matinfrarouge dans le forum Électronique
    Réponses: 3
    Dernier message: 11/09/2013, 19h41
  2. Exercice réseau : binaire et masque sous réseau
    Par Bond70 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 0
    Dernier message: 18/01/2013, 19h41
  3. PHP expression régulière (compatible-Perl) sous masque
    Par lahmed dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 17/09/2009, 01h21
  4. masque sous réseau
    Par shawnX dans le forum Internet - Réseau - Sécurité générale
    Réponses: 2
    Dernier message: 30/03/2009, 10h40
Découvrez nos comparatifs produits sur l'informatique et les technologies.