Salutations brésiliennes!
Merci tout d'abord Joby pour votre exemple. Deuxièmement, son exemple ne comporte qu'une erreur mineure. Le nombre 0x20 n'est pas correct. Il doit s'agir de 0x04. De plus, à titre de suggestion, je n'utiliserais pas de nombres hexadécimaux comme 0xFB, 0x20 ou 0x04 dans le code. Je suggérerais d'utiliser les définitions de port PIN trouvées dans l'io.h et d'autres référencées par le fichier d'en-tête. J'ai réécrit l'exemple de Joby ci-dessous, avec quelques commentaires pour les débutants.
# include <avr/io.h>
int main (void)
{
// set all pins on PORTB for output
DDRB = 0xFF;
// set port pin PORTD2 as input and leave the others pins
// in their originally state (inputs or outputs, it doesn't matter)
DDRD &= ~(1 << PD2); // see comment #1
while (1)
{
if (PIND & (1<<PD2)) // see comment #2
PORTB |= (1<<PB2); // see comment #3
else
PORTB &= ~(1<<PB2); // see comment #4
}
return 0;
}
/ *
commentaires pour les débutants
commentaire # 1: (1 << PD2) génère le binaire 00000100. L'opération "~" inverse tous les chiffres, c'est-à-dire que le binaire est maintenant 11111011. Enfin le & = applique la logique "ET" entre DDRD et 11111011 et le résultat est à nouveau placé dans la mémoire DDRD. Remarque: ce que l'opérateur "ET" fait pour chaque bit de la mémoire DDRD, il le compare au nombre binaire ci-dessus. Si le bit dans DDRD est 0 et le bit dans le binaire à la même position de morsure est 1, alors le bit résultant est 0, si le DDRD est 1 et le bit dans le binaire est 1, le bit résultant est 1, et si le bit dans le DDRD est 1 ou 0 et le bit dans le binaire est 0 alors le bit résultant est toujours 0. En résumé, la commande DDRD & = ~ (1 << PD2) modifie uniquement le bit PD2 à zéro et laisse les autres (zéros ou uns) intacts. Cela semble un peu compliqué, mais après vous y être habitué, c'est le meilleur moyen de changer un peu en une bouchée sans changer les autres bits.
commentaire # 2 : (1 << PD2) génère le binaire 00000100. En utilisant la même logique "ET" décrite dans le commentaire # 1, la commande "PIND & 0000100" vérifie uniquement si le PIND2 (notre broche d'entrée où le bouton-poussoir est connecté) to) est réglé sur élevé ou non. Toutes les autres broches seront FAUX puisque les bits binaires sont mis à 0, et puisque le bit binaire # 2 est mis à 1, l'instruction IF ne sera VRAIE que si l'entrée PD2 est réglée à haut ou FAUX si l'entrée PD2 est réglé sur faible.
commentaire # 3 : En suivant la logique expliquée dans le commentaire # 1, cette commande définit la broche de sortie PINB2 dans le port PORTB sur haute tension. Si votre LED est correctement connectée à ce port de broche avec une résistance de ~ 300 ohms et que cette résistance est connectée à la masse, la LED doit s'allumer.
commentaire # 4 : La LED devrait s'éteindre pour les mêmes raisons expliquées dans les commentaires précédents.
Considérations finales:
a) Pour éviter l'oscillation de tension dans la broche d'entrée PD2 lorsque le bouton-poussoir n'est pas enfoncé (circuit ouvert), je recommande fortement de placer une résistance de rappel (1 kOhm ou plus), afin que la LED ne s'allume pas accidentellement en raison à cette oscillation de tension aléatoire.
b) Une note de non-responsabilité: Les idées décrites ici doivent être utilisées uniquement à des fins éducatives et elles ne doivent PAS être utilisées dans un système réel avant de consulter un expert en électronique.
* /