Ces commandes changent l'état de la sortie 13 mais quelqu'un pourrait m'expliquer comment ça fonctionne?
Car j'aimerais pouvoir l'appliquer à d'autres sortie digitales...
J'ai compris que c'est de la manipulation de ports de l'arduino mais je n'ai pas saisi réellement comment ça fonctionne?
Il te faut lire la datasheet du micro.
Lire la datasheet
Hors de la datasheet point de salut !
Tu y trouvera la description et le rôle des registres DDRB, DDRC et DDRD ainsi que PORTB, PORTC, PORTD
PORTB &= ~(1<<5)
(1<<5) c'est 1 décalé 5 fois à gauche soit 00100000
~ complémente la valeur soit 11011111
PORTB &= ~(1<<5) c'est équivalent à PORTB = PORTB & ~(1<<5)
soit PORTB = PORTB & 11011111
Cette opération sert à mettre à 0 le bit 6ème bit du port
Avec les explications ci-dessus tu devrais pouvoir interpréter facilement la seconde commande
Bonjour les copains,
Les instructions que tu présentes sont particulièrement illisibles à mon sens. Franchement, si je devais inverser la sortie 13 je coderais plus "directement".
Bon, je suis très débutant en langage C, mais ayant plus ou moins quelques instructions qui semblent contenues dans ces codes je vais t'exprimer ce que je crois.
PORTB est un registre à six bits qui est directement représentatif des E/S de 8 à 13 :
Le bit de poids faible est en relation directe avec la sortie binaire 8.
Le bit de poids fort est en liaison avec l'E/S binaire 13 qui sur Arduino pilote la LED soudée sur le circuit imprimé.
<< est le décalage de tous les bits d'un registre vers "la gauche", c'est à dire vers le poids fort. Le poids fort initial est perdu et l'on "entre" un "0" dans le poids faible.
1<<5 je ne suis pas certain, mais je crois que ça veut dire que l'on prend la valeur 1 que l'on décale 5 fois à gauche.
On obtient alors 100000. Si je ne me trompe pas, on force à 1 précisément le représentant binaire de la sortie 13 sur un registre de six bits. (J'imagine que l'on construit un masque logique en vue d'effectuer ensuite un ET logique.
Par contre, je ne comprend pas vraiment toute l'instruction PORTB I= (1<<5), cette affectation complexe échappe à mes notions actuelles sur le langage C.
L'instruction PORTB &= ~(1<<5) est une forme d'écriture qui est équivalete à :
PORTB = PORTB & ~(1<<5) que je trouve bien plus lisible personnellement.
Donc, PORTB reçoit sa valeur actuelle avec laquelle on fait un ET logique avec le résultat de (~(1<<5)).
L'opérateur ~ inverse tous les bits d'un registre.
Pour obtenir un "1" avec le ET logique il faut que les deux bits en vis à vis soient égals à "1".
Je ne suis pas capable d'en décortiquer plus, mais c'est un déjà début.
P.S : Quand j'ai rédigé cette réponse, pour une raison qui m'échappe il n'y avait que la première question sur mon écran. ce qui explique mes informations "saugrenues".
john_lenfr:
Par exemple je pars de B01110101
Je veux forcer les bits 5 et 6 à 0 sans toucher les autres pour obtenir: B00010101 sans toucher les autres.
V &= ~((1 << 6) | (1 <<5 ))
Les détails du fonctionnement ont été donnés par fdunews ci-dessus.
Comment je peux l'adapter pour pouvoir remplacer les pins par des constantes?
La méthode V &= ~((1 << LEDROUGE) | (1 <<LEDVERTE )) fonctionne pour mettre une couleur mais pour faire le changement d'état avec PIND je n'ai pas trouvé comment faire?
Dans le mçeme temps je me rend compte que je suis de toute façon un peut bridé car je ne prend en compte que les pins 0 à 7, pour les pins 8 à 13 il faudrait faire avec PORTB mais je ne sais pas comment on peut le prendre en compte en fonction des pins choisis?
nulentout:
PORTB est un registre à six bits qui est directement représentatif des E/S de 8 à 13 :
Le bit de poids faible est en relation directe avec la sortie binaire 8.
Le bit de poids fort est en liaison avec l'E/S binaire 13 qui sur Arduino pilote la LED soudée sur le circuit imprimé.
après, il faut connaître les registres (datasheet...), car tu parles de PIND, sais-tu à quoi il correspond?
après, 0<<5 = 0, et même que 0<<x = O quelque soit x. d'où l'utilisation de ~ là où il faut.