Quincaillerie XOR pour les broches de sortie sur les microcontrôleurs AVR
Saviez-vous que de nombreuses puces AVR ont un type d’option exclusive matérielle ou (XOR) lorsqu’il s’agit des niveaux logiques des broches de sortie? Si vous regardez dans la fiche technique (l’image ci-dessus est une capture d’écran à partir d’une feuille de données ATTINY13), vous trouverez une section sur la balayage de la broche. Il s’avère que si vous définissez un port en tant que sortie, l’écriture de la logique sur le registre de la broche correspondante bascule les niveaux logiques de cela. C’est vraiment facile à négliger si vous écrivez dans C, mais je travaille sur l’apprentissage d’un peu de langage Assembleur et que cela a été trouvé très utile. Continuez à lire après la pause et je vais vous dire comment je suis arrivé sur cette information et ce que c’est bon.
Alors d’abord, parlons de la raison pour laquelle cela n’a pas beaucoup d’importance si vous écrivez en code C. En règle générale, si vous souhaitez basculer des broches de sortie, vous écrirez simplement une doublure que XOR est avec un masque bit:
1
Portb ^ = 0xFF;
Ceci est un peu de sténographie C (apprendre beaucoup plus à ce sujet de ma série de tutoriels) qui effectue le XOR sur les niveaux de sortie actuels et écrit le résultat du port. Mais la même chose peut être faite dans le matériel en écrivant le bitmask au registre de la broche:
1
Pinb = 0xFF;
Vous ne vous souciez pas vraiment, car ce n’est qu’une ligne de code. En fait, il est probablement plus simple de Xor le portb car il rend beaucoup plus de sens conceptuellement. Mais le compilateur peut finir par utiliser beaucoup plus de cycles que si vous aviez écrit dans le registre des broches.
Je suis arrivé sur cette caractéristique parce que je clignais des voyants comme un moyen d’apprendre l’assembleur. J’ai eu cette jumble de code dans une routine de service d’interruption:
1
2
3
4
LDI MYREG, 0XFF
Dans IntReg, portb
eor intreg, myreg
OUT PORTB, INTREG
Il charge un masque bitmask dans un seul registre, chargé de la logique actuelle de PortB à un autre registre, effectue un XOR des deux et écrit le résultat vers le portb. Cela prend quatre cycles et nécessite deux registres. Buckling Bits est une telle opération rudimentaire que j’ai été émerveillée, il n’y avait aucune commande à Xor Bits directement, alors j’ai commencé à chercher autour de vous. Je suis tombé sur ce court article sur AVR Freaks qui m’a contacté dans la fonction de baisse. Maintenant, j’ai pu diminuer mon code d’assembleur comme suit:
1
2
LDI INTREG2, 0xFF; Temporarité Utilisez INTREG2 comme masque de bit
OUT PINB, INTREG2; Écrire à PINB EFFETIVLED fait un exclusif ou sur PortB
Il en résulte le même effet de basculement, mais ne prend que deux cycles et nécessite l’utilisation d’un seul registre.
Ce que j’ai trouvé beaucoup intéressant, c’est que peu importe combien j’utilise des chips AVR, il n’y a jamais une pénurie de surprises qui attendent d’être trouvée dans la fiche technique.