Étape 3: Bit Banging et sauver quelques cycles d’horloge plus
800kHz sur un Mhz 16 AVR est 20 cycles d’horloge.
20 cycles d’horloge sur un AVR est beaucoup. Nous ne parlons pas sur PIC12/16C ici avec 4 tiques par instruction et qu’un seul registre réel. L’AVR beaucoup par cycle cycle. S’il y n'avait pas l’obligation de mélanger l’ordre RGB alors l’AVR pourrait faire ce travail de série sans broncher.
En fait la seule chose que l’AVR ne brille pas au change de bits dans les registres de I/O. Cela prend deux cycles d’horloge, comme indiqué dans les détails pour l’instruction de SBI ci-dessous. Le CPU doit lire le registre, le modifier et écrire de nouveau. Il est l’un des rares instructions non ramifiée dans l’AVR de prendre deux horloges. (Note : le XMega AVR a corrigé ce problème et est maintenant seulement 1 horloge)
À l’aide de cette instruction dans les chemins critiques de temps n’est pas amusant comme code Alains a montré. Il devait sauter et hop partout pour que les longueurs de chemin d’accès.
sbrc r19, 7 ; test Salut peu clair
rjmp 3f ; vrai, sauter broche Salut -> lo
DRAS [port], % [pin] ; faux, broche Salut -> lo
3: sbrc r19, 7 ; égaliser le retard de deux chemins de code
rjmp 4f
4: nop ; retard de calendrier de pouls
Donc si les instructions réelles de la CBI et SBI vont prendre 2 cycles d’horloge de toute façon et puis vous avez à perdre 2 cycles d’horloge pour égaliser les longueurs de chemin, pourquoi ne pas juste la lecture modifier écrire vous-même. Cela prendra un total de 3 cycles.
EN R16, PortX ; Lire l’état actuel du Registre
ORI R16, PinX ; Définir le bit Xth haut
SUR PortX, R16 ; Écrire la nouvelle valeur dans le registre
La prochaine chose que vous pouvez faire pour gagner du temps, c’est tout à l’extérieur de la boucle, que vous pouvez déplacer. Parce que ce code utilise 100 % du temps CPU, il y a aucun risque autre chose ne va changer PortX. Aussi parce qu’aucun autre code ne s’exécute, nous pouvons utiliser des registres CPU autant que nous aimons.
Donc faire cette façon IN-ing et AND/OR-ment hors de la boucle.
DANS PinLo, PortX ; Faites une copie de l’octet dans PortX
ANDI PinLo, 0xFE ; Modifiez la valeur à écrire pour faire des broches lo
DANS PinHi, PortX ; Faites une copie de l’octet dans PortX
ORI PinHi, 0 x 01 ; Modifiez la valeur à écrire pour faire des broches Salut
Boucle :
bla
bla
sur PortX, PinLo ; La valeur de l’axe de sortie faible
bla
bla
rjmp boucle :
Cela a maintenant rendu l’ensemble bits vers tête basculante, série, peu compter et prendre seulement 9 horloges en boucle. Cela laisse 11 horloges gratuites pour le chargement des données et de brassage.
Encore une fois, ce serait les tas de temps sinon la chose RGB dans le désordre. En raison de la chose de RVB en panne nous ne pouvons pas juste traiter chaque octet lu comme celle qui suit sortir. Nous devons prendre une décision sur l’endroit où enregistrer l’octet nouvellement lu dans une mémoire tampon et où d’une mémoire tampon pour obtenir l’octet suivant à envoyer.
C’est où l’instruction IJMP vient à la rescousse. Sa page du jeu d’instructions AVR est montré ci-dessus. Nous l’utilisons comme une instruction case/switch dans une machine d’état des logiciels. Dans chaque État, nous pouvons définir ce que l’état suivant devrait être sans avoir à faire des évaluations.
Nous pouvons le faire parce que nous savons toujours quelle couleur l’octet suivant va être
Si nous traitons actuellement l’octet rouge l’octet suivant sera vert
Si nous traitons actuellement l’octet vert l’octet suivant sera bleu
Si nous traitons actuellement l’octet bleu l’octet suivant sera rouge
par exemple. Dans l’état rouge, nous pouvons simplement dire
ÉTAT = VERT
Il ne faut pas dire
Si (quelque chose) puis État = État d’autre vert = bleu
Cela permet d’économiser quelques horloges de ne pas avoir à évaluer quoi que ce soit.
La totalité du code s’affiche comme une image ici. Encore une fois de m’envoyer un MP si vous voulez me faire envoyer par courriel à vous.
Les commentaires dans le code sont je l’espère assez même laisser quelqu'un peu familiers avec AVR-ASM le comprendre.