Help...

Toutes les discussions sur l'Arduino !

Modérateur : MOD

Avatar du membre
likiki
Causant
Messages : 296
Enregistré le : dim. 29 avr. 2012, 15:21
Echelle pratiquée : H0 3R
Prénom : Christian
Site Internet : http://passionnement.forumactif.org
Localisation : Corbeil Essonne
Âge : 52

Re: Help...

Message par likiki » sam. 06 déc. 2014, 10:05

Merci, je comprend qu'avec cette ligne on évite de taper 6 a 8 lignes dans le langage classic Arduino.

Je n'en suis pas encore arriver a ce stade, mais je ne désespère pas.

Encore merci Jean-Luc

:D
Cordialement,

Christian.

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Help...

Message par jlb » sam. 06 déc. 2014, 10:57

L'informatique est également la science de l'abstraction.

On empile les couches pour attaquer les problèmes avec des outils plus puissants qui permettent de simplifier la vie du programmeur et de le rendre plus productif. Le code est réutilisable en changeant peu de choses et il y a moins de bugs. On peut également attaquer des problème plus complexes.

Si on n'avait pas fait ça on serait encore en train de programmer des PDP 11 avec des interrupteurs et des voyants et vous n'auriez pas la magie qui se déroule tous les jours sous vos yeux.

Le succès de l'Arduino repose sur cette abstraction qui donne plus de pouvoir, sur ces outils plus puissants. Wiring, la partie qui implémente les pinMode, digitalRead, digitalWrite etc et qui permet de programmer sans s'occuper du micro-contrôleur qu'il y a dessous, ça marche pareil sur un 328, un 2560, un SAM (Due), un Teensy (cortex M4 de Freescale) en est un exemple et c'est une excellente chose.

Comprendre les micro-contrôleurs, ok, c'est toujours une bonne chose de comprendre sur quoi le logiciel repose, ça ouvre l'esprit. Attaquer le matériel au plus bas niveau, ok, quand c'est nécessaire. C'est nécessaire pour apprendre, c'est nécessaire si on a désespérément besoin de performances, c'est nécessaire si on porte, par exemple, le logiciel de l'Arduino sur un autre micro-contrôleur. Sinon c'est inutile.

Et c'est une gars qui enseigne l'architecture des ordinateurs et qui travaille dans le logiciel très bas niveau qui vous le dit :)

papou89
Papotier
Messages : 199
Enregistré le : lun. 29 nov. 2010, 20:58

Re: Help...

Message par papou89 » sam. 06 déc. 2014, 11:01

Merci, je comprend qu'avec cette ligne on évite de taper 6 a 8 lignes ...

Et ça permet de lire un byte en parallèle sur le port, et d'obtenir directement la valeur binaire du byte. A terme il y aura 4 bits pour donner une valeur 0-15. Il aurait donc fallu écrire 4 digital read CMD0 à CMD3, et faire une opération du genre CMDE=CMD0+2*CMD1+4*CMD2+8*CMD3...
C'est plus simple et plus rapide en lisant directement le port !

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Help...

Message par jlb » sam. 06 déc. 2014, 11:13

Plus simple je ne pense pas car c'est également :

- moins lisible pour les autres et pour toi,
- non portable,
- plus difficile à débugguer (tu n'aurais pas eu ton pb en utilisant digitalRead),
- pas souple du tout, tu ne peux pas changer de broche comme tu veux.

Le seul cas où ça se justifierait : il est absolument nécessaire de lire tous les bits au même moment ou les écrire au même moment.

Donc je pense que (et je fais exprès de choisir des broches quelconques) :

Code : Tout sélectionner

const byte bitCommande0 = 8;
const byte bitCommande1 = 3;
const byte bitCommande2 = 5;
const byte bitCommande3 = 2;

byte commande()
{
    return (
        digitalRead(bitCommande3) << 3 |
        digitalRead(bitCommande2) << 2 |
        digitalRead(bitCommande1) << 1 |
        digitalRead(bitCommande0)
    );       
}
est mieux.

Pour ce qui est de la rapidité, où as-tu besoin de rapidité pour ton application ?

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Help...

Message par macsddau » sam. 06 déc. 2014, 11:50

likiki a écrit :C'est juste une priorité mathématique en faite.

Moi j'ai une petite question messieurs, que veut dire littéralement ceci :

" ~PINB & 0x03 " ???

Parce que là je sèche.

:ange:
Comme c'est écrit et en fonction des règles de priorité (si je ne me trompe pas) le faut lire :

Code : Tout sélectionner

(~PINB) & 0x03
C'est à dire que l'instruction ~ "NOT bit à bit" est exécuté en premier. Puis c'est au tour du & (AND bit à bit).
Cela donnera le même résultat que :

Code : Tout sélectionner

~(PINB & 0x03)
Je préfère cette solution car avec le & exécuté en premier c'est comme si j'effectue un filtre (masque) sur le bit 0x03, puis je prend l'inverse "~" du résultat précédent.
Je conseille d'encapsuler les macros dans des parenthèses () car une fois résolues par le préprocesseur, les résultats peuvent être surprenants.
Ce qui doit donner dans le code soit

Code : Tout sélectionner

#define CMDE (~PINB & 0x03)
soit

Code : Tout sélectionner

#define CMDE (~(PINB & 0x03))
MS2 CC2 S-DEC-4-DC Rocrail

Avatar du membre
likiki
Causant
Messages : 296
Enregistré le : dim. 29 avr. 2012, 15:21
Echelle pratiquée : H0 3R
Prénom : Christian
Site Internet : http://passionnement.forumactif.org
Localisation : Corbeil Essonne
Âge : 52

Re: Help...

Message par likiki » sam. 06 déc. 2014, 12:14

Je ne veut froisser personne, mais voilà ce que je ressent en lisant vos lignes de programme :

celui de Jean-Luc,

Code : Tout sélectionner

const byte bitCommande0 = 8;
const byte bitCommande1 = 3;
const byte bitCommande2 = 5;
const byte bitCommande3 = 2;

byte commande()
{
    return (
        digitalRead(bitCommande3) << 3 |
        digitalRead(bitCommande2) << 2 |
        digitalRead(bitCommande1) << 1 |
        digitalRead(bitCommande0)
    );       
}
Je le compare a du texte écrit en Français disons normal. :roll:

Celui de Papou89,

Code : Tout sélectionner

#define CMDE (~(PINB & 0x03))
Je le compare a du texte écrit façon SMS du style " O KE c BO " :siffle:

Je doit donc être un vieux crouton :mdr2:
Cordialement,

Christian.

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Help...

Message par macsddau » sam. 06 déc. 2014, 12:37

likiki a écrit :Je ne veut froisser personne, mais voilà ce que je ressent en lisant vos lignes de programme :

celui de Jean-Luc,

Code : Tout sélectionner

const byte bitCommande0 = 8;
const byte bitCommande1 = 3;
const byte bitCommande2 = 5;
const byte bitCommande3 = 2;

byte commande()
{
    return (
        digitalRead(bitCommande3) << 3 |
        digitalRead(bitCommande2) << 2 |
        digitalRead(bitCommande1) << 1 |
        digitalRead(bitCommande0)
    );       
}
Je le compare a du texte écrit en Français disons normal. :roll:

Celui de Papou89,

Code : Tout sélectionner

#define CMDE (~(PINB & 0x03))
Je le compare a du texte écrit façon SMS du style " O KE c BO " :siffle:

Je doit donc être un vieux crouton :mdr2:
Une petite explication de texte du code de Jean-Luc :
considérons que les valeurs retournées par les digitalRead nous donnent 4 lettres a, b, c et d représentant les valeurs 0 ou 1
donc
digitalRead(bitCommande0) donne 0000000a,
digitalRead(bitCommande1) donne 0000000b,
… ainsi de suite …
Lorsque j'applique l'instruction "<<" je décale les bits de la valeur indiquée.
soit:
0000000a << 3 donne 0000a000
0000000b << 2 donne 00000b00
0000000c << 1 donne 000000c0
et 0000000d reste inchangé
effectuons un OU bit à bit

Code : Tout sélectionner

  0000a000
| 00000b00
| 000000c0
| 0000000d
-------------
= 0000abcd
Avec le return est renvoyé dans un seul octet les valeurs lues sur les pins du µContrôleur.
Ainsi on est passé de 4 octets a tester séparément à un seul dont on peut lire la valeur et la traiter par exemple dans une instruction switch...
MS2 CC2 S-DEC-4-DC Rocrail

Avatar du membre
PIC18F
Bavard
Messages : 74
Enregistré le : dim. 01 janv. 2012, 15:50
Echelle pratiquée : HO
Prénom : Philippe
Club : AMHA
Site Internet : http://assoamha.forumactif.org/
Localisation : LE HAVRE (Seine Maririme)
Âge : 65

Re: Help...

Message par PIC18F » sam. 06 déc. 2014, 13:58

Un bug subtile

Opérateurs, du plus prioritaire au moins prioritaire
()
! ~ ++ -- + - sizeof
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
= += -= *= /= %= &= ^= |= <<= >>=

papou89
Papotier
Messages : 199
Enregistré le : lun. 29 nov. 2010, 20:58

Re: Help...

Message par papou89 » sam. 06 déc. 2014, 14:18

Hé les gars, compliquez pas tout, ça l'est déjà assez comme ça !... :siffle:

Likiki : Je le compare a du texte écrit en Français disons normal....
Mais l'Arduino ne comprend pas le français, même normal !.. :ange3:

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Help...

Message par macsddau » sam. 06 déc. 2014, 14:19

PIC18F a écrit :Un bug subtile

Opérateurs, du plus prioritaire au moins prioritaire
()
! ~ ++ -- + - sizeof
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
= += -= *= /= %= &= ^= |= <<= >>=
"+" et "-" sont cités à la deuxième et à la quatrième ligne. En respectant les règles mathématique, je pense que seule la quatrième ligne est convenable. Ai-je tors ?
MS2 CC2 S-DEC-4-DC Rocrail

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Help...

Message par jlb » sam. 06 déc. 2014, 14:38

En un mot oui :)

à la deuxième ligne ce sont les opérateurs unaires :

le - de -2
le + de +3

à la quatrième ligne ce sont les opérateurs binaires, l'addition et la soustraction

Avatar du membre
Francis8
Communicatif
Messages : 848
Enregistré le : jeu. 30 juil. 2009, 16:26
Echelle pratiquée : HO
Club : REV
Site Internet : http://www.association-rev.club
Localisation : Oise
Âge : 47
Contact :

Re: Help...

Message par Francis8 » jeu. 11 déc. 2014, 14:35

jlb a écrit :Attaquer le matériel au plus bas niveau, ok, quand c'est nécessaire. C'est nécessaire pour apprendre, c'est nécessaire si on a désespérément besoin de performances, c'est nécessaire si on porte, par exemple, le logiciel de l'Arduino sur un autre micro-contrôleur. Sinon c'est inutile.
Je partage tout à fait cette pensé.

J'ajouterais, qu'il faut d'abord programmer de façon simple et clair sans trop se soucier d'optimisation.

Cela permet d'aborder toute les phases de création, mise au point et réglages en comprenant rapidement ce qu'on fait et où on le trouve dans le programme.

Une fois le programme OK de bout en bout, on regarde si il y a besoin d'optimiser tel ou tel point (taille du programme, vitesse de calcul, etc...).

Comme le cours des microcontrôleurs l'a bien fait comprendre, un diagramme ou représentation simple des tâches principales à accomplir permet de conditionner les étapes de programmation. On fait du basique simple (schémas) au compliqué (optimisation). Le but est que ça fonctionne avant tout.

Trop souvent, on programme directement en optimisant chaque nouvelle ligne de code sans se soucier que dans quelques jours, on devra retourner sur une ancienne partie de code pour la rendre compatible aux évolutions. A ce moment, bonjour le casse tête pour se remémorer ce qu'on voulait faire et comment on l'a fait.

En tout cas, je pratique ainsi et ça me réussit dans mes expériences.

papou89
Papotier
Messages : 199
Enregistré le : lun. 29 nov. 2010, 20:58

Re: Help...

Message par papou89 » jeu. 11 déc. 2014, 21:02

D'accord avec vous, mais avouez quand même qu'écrire "DDRB=B11100000" est quand même plus simple que 8 lignes de pinMode... Et ça revient au même puisque le compilateur va transformer les 8 lignes en une seule : DDRB=...Non ?
Quand je parle de rapidité, je pense d'abord à la rapidité d'écriture du source. La vitesse de traitement des instructions ne me concerne pas pour le moment, avec mon pont qui va tourner à moins d'un tour par minute !

Répondre