A propos des entrées D0 et D1

Bonjour
Après avoir réalisé mes debuts sur une arduino uno je voudrais intégrer dans mon projet une carte Bare Bones Board de ce type: http://shop.moderndevice.com/products/rbbb-kit

Je voudrais essayer le charlieplexing et j'ai besoin d'un maximum de connexion avec la carte. A ce propos pouvez vous m'aider sur le fonctionnement des entrées D0 et D1 ? Je sais que sur la uno elles sont reliées à la gestion de l'usb (si j'ai bien compris). Mais sur ces cartes simplifiées peut on les utiliser comme n'importe quelles autres pins (D3 etc) ou sont elles toujours dédiées a la gestion TX RX?

Merci

Bonjour et bienvenue sur ce forum, emixam.

emixam:
Je sais que sur la uno elles sont reliées à la gestion de l'usb (si j'ai bien compris).

Tu as bien compris et c'est le cas pour toutes les autres Arduino (corrigez-moi si je dis des bêtises).
D0 et D1 peuvent êtres utilisées pour autre chose que l'USB, elles se paramètrent comme les autres, elles sont juste par défaut sur USB.
Cependant, elles sont directement reliées à l'USB (de mémoire...), tu ne peux donc plus utiliser de communication USB.
De même, pour transférer un programme, sois vigilant car ça utilise l'USB.

Bonjour,

emixam:
A ce propos pouvez vous m'aider sur le fonctionnement des entrées D0 et D1 ?

Les broches D0/D1 correspondent aux lignes Rx (réception) et Tx (émission) du port série matériel.

emixam:
Je sais que sur la uno elles sont reliées à la gestion de l'usb (si j'ai bien compris).

En fait ce n'est pas tout à fait vrai.
Les lignes D0/D1 sont connecté à un petit microcontrôleur externe (juste à coté du port usb) qui transforme les données série en "données usb" au travers d'un port série usb virtuel.
Quelque soit la carte (sauf cartes spéciales utilisant un microcontrôleur différent) le port série ce trouve toujours sur les broches D0/D1.

emixam:
Mais sur ces cartes simplifiées peut on les utiliser comme n'importe quelles autres pins (D3 etc) ou sont elles toujours dédiées a la gestion TX RX?

Elles sont toujours dédiés au port série. Si tu n'utilises pas le port série tu peut les utiliser mais c'est risqué.
En bidouillant les sorties D0/D1 tu peut bloquer le bootloader et âpres c'est compliqué d'uploader un nouveau programme.
(il y a une technique pour débloqué la situation mais elle demande de la précision, tout est une question de temps)

Ce sont des ports digitaux qui comme l'explique numero_744 serve également à la liaison série (attention c'est pas de l'usb direct, ici on est sur du série TTL/UART). Donc tu peux t'en servir comme n'importe quel autre port digital mais si tu fais ça tu perds la liaison série via USB. Si tu as des soucis de dispo entrée/sortie tu peux utiliser des multiplexeur ou des I/O expander type PCF8574 pilotable par i2c (d'ailleurs il y a une librairie dispo sur le forum).

1 Like

À propos des multiplexes, j'avoue ne pas comprendre le fonctionnement de cet exemple :

digitalWrite(CONTROL0, (i&15)>>3);

Que signifie (i&15)>>3 ?

Bonsoir
Merci bien pour vos réponses.
Je vais donc me pencher la dessus un peu plus. Si je cherche à les utiliser c'est pour avoir recours à un minimum d'éléments. Je fais cela pour un soucis de place et surtout pour essayer des nouvelles chose (pour moi) comme le charlieplexing. Je vais donc y bancher soit une horloge temps réelle soit des leds, pour la réalisation d'une seconde wordclock mais plus compacte

encore merci je vous tiendrais au courant de l'évolution

Ce sont des opérations logiques (bitwise en anglais, y'a un tuto sur le site). Mais j'avoue que sans le rest edu code j'ai un peu du mal à voir l'utilité ... En tout cas je l'aurais pas écrit comme ça si c'est ce que je pense

Dans le code tu as :

digitalWrite(CONTROL0, (i&15)>>3); //S3
digitalWrite(CONTROL1, (i&7)>>2);  //S2
digitalWrite(CONTROL2, (i&3)>>1);  //S1
digitalWrite(CONTROL3, (i&1));     //S0

avec i qui varie de 0 à 15 pour piloter les 16 premieres io digitales de la carte.

ce code permet d'operer la décomposition binaire pour ensuite mettre les ports selon le canal choisi.

En gros on accede à un canal en mettant s0 s1 s2 s3 avec la decomposition binaire du canal.

Par exemple, on veut le canal 12.

12 en binaire = 1100

Donc il faut que S3 et S2 soient High avec S1 et S0 en LOW.

la fonction >> decale les bits binaire vers la droite. un décalage correspond à une division par 2, donc 3 décalages correspondent à une division par 8.

Suivons ce que fait ce bout de code pour notre exemple avec i=12

i = 1100
(i&15) = 1100 & 1111 = 1100

(i&15)>>3 = (1100)>>3 = 1 donc le bit pour S3 sera HIGH

ensuite :

(i&7) = 1100 & 0111 = 0100
(i&7)>>2 = (0100)>>2 = 1, donc le bit pour S2 sera HIGH

ensuite :

(i&3) = 1100 & 0011 = 0000
(i&3)>>1 = (0000)>>1 = 0, donc le bit S1 est LOW

finalement :

(i&1) = 1100 & 0001 = 0000
blabla.... le bit S0 est LOW

on donc S3S2S1S0 qui vaut 1100 qui est bien la décomposition binaire de 12.

CDFD !

A+

je crois qu'ils se sont un peu compliqué la vide dans le code précédent.

je pense que

if (i&8)
 DigitalWrite(CONTROL0, HIGH);
else
 DigitalWrite(CONTROL0, LOW);

if (i&4)
 DigitalWrite(CONTROL1, HIGH);
else
 DigitalWrite(CONTROL1, LOW);

etc...

fonctionne aussi.

Si on veut écrire encore plus court...

 DigitalWrite(CONTROL0, (i & 8)?HIGH:LOW);
 DigitalWrite(CONTROL1, (i & 4)?HIGH:LOW);
 DigitalWrite(CONTROL2, (i & 2)?HIGH:LOW);
 DigitalWrite(CONTROL3, (i & 1)?HIGH:LOW);

Doit aussi fonctionner, à vérifier.

A+

Grag38:
Si on veut écrire encore plus court...

digitalWrite(CONTROL0, (i & 8) ? HIGH : LOW);

digitalWrite(CONTROL1, (i & 4) ? HIGH : LOW);
digitalWrite(CONTROL2, (i & 2) ? HIGH : LOW);
digitalWrite(CONTROL3, (i & 1) ? HIGH : LOW);




Doit aussi fonctionner, à vérifier.

Non seulement ça fonctionne parfaitement (j'utilise ce genre de bitwise + if inline hyper souvent) mais en plus le code généré est bien plus efficace.
Un décalage de bits c'est lent, très lent, surtout sur un cpu AVR-8, alors qu'un test logique c'est uniquement 1 cycle CPU.

Bonus: en faisant cela, HIGH et LOW peuvent avoir des valeurs différentes de 0 ou 1 sans problème.
(on n'est pas sensé savoir que HIGH = 1 et LOW = 0)

Petite question : sur ces tests logiques, on est faux si c'est 0 et vrai pour toute autre valeur c'est ça ?

B@tto:
Petite question : sur ces tests logiques, on est faux si c'est 0 et vrai pour toute autre valeur c'est ça ?

Exact, en C/C++ toute valeur égale à 0 est fausse et tout autre valeur est vrai.

Hhhaaaan ... Classe ! merci :slight_smile:

Nannn

C'est pas classe, c'est un forum, donc on s'aide les uns les autres, c'est pas plus compliqué que cela.

Vive l'open source et toutce qu'il implique.

Amicalement.

Raph

Je crois qu'au bout de presque 900 posts maintenant j'ai compris la philosophie du forum :wink:

Le "classe" c'est pour la subtilité du C que je ne connaissais pas et qui va me simplifier la vie :slight_smile: