Étape 5: Alors à quoi alors ?
Il devrait être assez clair qu’écrit directement aux registres peut économiser de l’espace dans la mémoire de votre puce. L’esquisse abrégée prend aussi moins de temps pour exécuter simplement parce qu’il n’y a pas de bibliothèque de chercher pour chaque appel de fonction. Pour la grande majorité des applications, cela n’aura pas toute utilisation réelle car éliminant une fonction comme pinMode() ne sauvera pas beaucoup l’espace ou le temps dans un sketch complex. Toutefois, dans certaines applications temps de traitement est un problème énorme, et réduisant la quantité de temps perdu dans les fichiers de bibliothèque permet plusieurs cycles d’horloge être disponible pour d’autres choses. Ce que j’entends par là est que même si vous devez inclure une fonction de bibliothèque et donc prendre place dans la mémoire avec elle, si vous n’appelez pas il très souvent et plutôt utiliser les registres directement, au moins, vous économisez temps (mais pas d’espace) par ne pas en la levant.
Une autre option est la possibilité d’utiliser des épingles de façons qu'ils ne peuvent pas ont été initialement prévus, mais sans aucun effet secondaire. Par exemple, les broches associés PWM sur le chipKIT Uno32 dispose d’un registre supplémentaire qui leur sont associé qui s’arrime le module de comparaison de sortie (OCMP) appelé la sortie comparent Registre (OCxR). Le OCMP a certains registres plus qui traitent de la synchronisation du signal PWM, mais le OCxR est le registre de sortie de signal réel, semblable au LATx (PIC32) ou registres de PORTx (ATMEL). La période PWM est calculée en multipliant... (facile, mais déroutant trucs de math ici)... et que la valeur est entrée dans la période s’inscrire (PRy). PRy raconte le registre minuterie (TMRy) qui anime la OCMP spécifique quand à remettre à 0, mais vous devez ajouter un supplément de 1. Le rapport cyclique est ensuite écrite dans le registre secondaire comparer (OCxRS), qui est essentiellement un tampon car cette valeur est presque immédiatement transférée au comparer (OCxR), mais vous ne pouvez pas écrire directement parce que OCxR est en lecture seule.
Exemple : si PRy a une valeur de 5, et OCxRS est chargé d’une valeur de 2, OCxR est tout d’abord chargé avec 2 établissements. TMRy commence à compter à 0. 1, OCx affiche une valeur élevée et y reste. Au temps 2, rien ne change, OCx a été élevé pour 1 chef d’accusation. Au temps 3, OCx descend bas car elle a été élevée pour 2 chefs d’accusation. Au moment, 3, 4 et 5, rien ne change mais TMRy = PRy, afin qu’il se réinitialise et démarre puis retour à 0 sur le prochain décompte. 1 battement d’horloge passe, qui est comte 0 encore une fois et au nombre 1, OCx sorties haute à nouveau. Voici la figure 16-18 de Section 16 : sortie comparer du Manuel de référence de famille PIC32:
Définition PRy à 5 et OCxRS 2 donne vraiment un cycle de 33 % (2/6) et non de 40 % (2/5). C’est là que 1 supplémentaire entre en jeu. Il est ajouté à la valeur de PRy. C’est juste un exemple simple, et si PRy et OCxRS étaient beaucoup plus importants, la différence de % serait beaucoup, beaucoup plus petite.
Eh bien, c’est simple n’était pas elle ? Oui, no, je pouvais entendre les engrenages meulage à mettre un terme au « Pour exemple... » Quand le professeur nous a montré cela la première fois, vous auriez dû voir le regard sur mon visage de ses camarades de classe. Mais c’est pourquoi nous avons des bibliothèques. Tous ces trucs est gérée par les bibliothèques lorsque nous disons le servo de tourner à une certaine vitesse ou nous voulons jouer une mélodie avec des nuances différentes. Mais 1) nous sommes limités à seulement être capable d’utiliser les broches PWM, et bibliothèques 2) prennent place dans la mémoire. Que faire si nous avons besoin de plus d’options PWM ? Utiliser les registres.
L’esquisse suivante est un générateur de sons simples. Je ne vais pas faire un servo par exemple parce que je ne recommande pas l’utilisation de servos sans la bibliothèque servo.h, bien qu’avec quelques travaux, il est certainement possible. C’est beaucoup trop facile d’étendre sur le servo au-delà de ses butées internes. Si vous voulez le faire, vous devrez écrire tous les trucs de fond que gère le servo.h dans votre dessin, mais plus esquisses seront traduira par différentes périodes PWM parce que chaque ligne prend un peu de temps.
Avant de voir le croquis, quelques calculs simples rapide. Tout d’abord déterminer la fréquence de sortie souhaitée. Divisez 1 par votre fréquence pour obtenir votre période et puis divisez-le en deux. Assurez-vous que la valeur est en microsecondes, puis mettre cette valeur à la fois des implémentations delayMicroseconds() fonction. Si nous voulons générer un cycle d’utilisation autre que de 50 %, multipliez votre valeur de période par le cycle de devoir que vous voulez élevé. Entrer cette nouvelle valeur dansla fonction delayMicrosecondsà l’intérieur de l’instruction if() . Entrez le reste dans la delayMicroseconds() fonction à l’intérieur de l’instruction else .
Exemple : Vous voulez une sortie de 1kHz. 1/1000 Hz = 1 milliseconde = 1000 microsecondes = période. 1000μs/2 = 500 μs ⇒ delayMicroseconds(). Si vous souhaitez que le rapport cyclique de 60 %: 1000μs * 60 % = 600 μs ⇒ si() Déclaration delayMicroseconds() valeur. 1000μs - 600μs = 400μs ⇒ d’autre instruction delayMicroseconds() valeur. Agréable et facile.
Voici le code de générateur de tonalité :
Vous trouverez ci-dessous des images de la sortie, tout d’abord de la chipKIT Uno32 o-portée...
.. .et puis à partir de l’Arduino UNO.
Assez fou, ces images ont été générés à l’aide de l’esquisse de manipulation du Registre comme indiqué ci-dessus, et quand j’ai examiné l’esquisse de la fonction standard, l’image exacte même sauté vers le haut. Bizarre, droite ? Alors j’ai pensé que j’ai épargnerait vous avoir à perdre de temps à la recherche à un doublon. J’ai aucune idée pourquoi l’Arduino UNO est assez instable à la puissance de crête, donc si quelqu'un a une explication légitime, s’il vous plaît préciser dans les commentaires.