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?
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.
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).
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
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.
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);
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)