Le ChromoDisk (7 / 8 étapes)

Étape 7: Une promenade à travers le Code

Un des points de la conception de cet appareil était de rendre « hackable. »  J’ai fourni le code source afin que vous puissiez les deux apprendre comment ces choses sont programmées et aussi de le modifier comme vous le souhaitez.  Si vous êtes comme moi, il vous est difficile de lire le code de quelqu'un d’autre, indépendamment de la langue.  Langage d’assemblage est peut-être un peu plus difficile, mais il est rapide et vous avez le contrôle complet.

Le code est structuré à un niveau élevé en paramètres, le code et données.  la section de paramètres est censée apporter tous les contacts clés qui affectent comment les modes de couleur marche jusqu’au sommet où vous pouvez facilement les modifier sans plonger dans le code.  La première partie de la section de paramètre adapte le code pour le matériel et, bien que vous êtes les bienvenus pour concevoir votre propre carte comme je l’ai fait, j’ai je vais supposer que vous voulez utiliser pour ce Conseil et remplacer un des modes qui est déjà là, ou écrire vos propres.  Alors sauter vers le bas pour :

.EQU initialMode = 4
.EQU maxModes = 6

Le premier EQU définit le mode de que la ChromoDisk saute lorsque la première mise sous tension ou lorsque vous appuyez sur le bouton de réinitialisation.  4 est le mode de couleurs ondoyantes.  La prochaine EQU est juste le nombre de modes implémentée dans le code.  N’oubliez pas de changer cela, si vous ajoutez un mode de votre propre conception.

Le reste des EQUs sont spécifiques à chaque mode.  Dans un premier temps, j’ai envie d’écrire un programme générique qui m’a permis de générer de nouveaux modes juste en changeant quelques paramètres.  Je n’a pas trouver un moyen de le faire, pour chaque mode a sa propre section de code spécial que vous verrez plus tard.  J’ai autant de commentaires qui j’espère sont assez faciles à comprendre, une fois que vous savez comment fonctionne le mode.

Vous verrez qu’il y a des équations arithmétiques dans certains des EQUs.  Il y a deux choses à retenir ici et partout dans le code : le microcontrôleur est une machine entière, et il sait deux méthodes de base pour travailler avec des nombres.  Si vous écrivez une équation qui entraîne un nombre par une fraction, il va être tronqué.  Ne vous attendez pas 2/3 de te faire 0.666667.  Il vous donnera 0.  Cela peut sembler évident, mais à un moment donné vous allez oublier et je me demande pourquoi un bout de code ne fonctionne pas correctement.  En ce qui concerne les systèmes de numération : vous pouvez interpréter un nombre 8 bits comme un nombre absolu (0-255) ou comme un entier signé (0 - 127 et -128-1).  Je le sais bien, et pourtant j’ai encore parfois reçois déclenché vers le haut à ce sujet.  Une question encore plus subtile, c’est que le processeur traite un entier comme absolue ou signé selon quel ordre vous utilisez.  La ramification est un excellent exemple.  Vous vous en doutez que si vous lisez la minuterie et obtenez 132, que se vous comparé 120 avec direction si elle est inférieure et 132 BRLT (branche si inférieur), il prendrait la direction.  Pas si vite.  BRLT suppose que les nombres sont signés, donc 132 est réellement -125.  Pour des nombres non signés, comme dans ce cas, vous devez utiliser BRLO (branche s’il est inférieur).  Tenez-en compte lorsque vous lisez le code.

La section exécutable commence par l’instruction .cseg.  Le code contient, dans l’ordre :
-l’interruption des vecteurs pointant vers les routines de service d’interruption (ISR)
-le code d’initialisation, exécuté après une réinitialisation
-le code principal
-le code d’initialisation pour chaque mode
-les rapports de recherche internationale
-la zone de données, qui commence par .dseg

Je ne veux pas faire trop long, donc je vais essayer de résumer.  Le programme est entièrement axée sur l’interruption, donc tout se passe dans les routines de service d’interruption.  Le code principal met juste le processeur pour dormir.  Il se réveille lorsque vous appuyez sur le bouton Mode, ou lorsqu’une minuterie expire.  Minuterie 0 sert à debounce le commutateur de Mode.  Minuterie 1 est utilisée pour modifier les couleurs en utilisant une seule ligne de commande PWM et la couleur marche/arrêt sorties.

Le commutateur de Mode illustre le matériel / compromis logiciel mentionné précédemment.  Manocontacts rebondissent lorsque vous appuyez sur eux, donc vous devez être capable de gérer une série de courtes impulsions plutôt que juste une entrée haute ou basse.  J’ai fini par faire cela dans le logiciel parce que je ne pouvais pas trouver un moyen facile de le faire avec l’espace et le matériel que j’ai eu.  Fondamentalement, le commutateur de mode réinitialise le Timer 0.  Si le timer 0 arrive à expiration avant il se réinitialise, le code suppose que les contacts ont cessé de rebondir et le code peut prendre des mesures.  Il s’agit d’un peu d’un hack et vous devrez choisir avec soin la valeur de délai d’attente.  Vous verrez que l’appareil saute parfois un mode, pour la réglage de la minuterie n’est pas parfaite.  C’est un compromis entre temps de réponse en appuyant sur le bouton et à quelle fréquence il saute un mode.

Si vous voulez voir comment chaque mode est mis en place, regardez l’EIS de 1 Timer.  Il y a une variable en mémoire qui garde la trace de quel mode il est dans.  L’ISR se penche sur ce nombre et saute à la partie droite du code, sorte de comme une instruction CASE ou commutateur.  Chaque mode a besoin de garder une trace de son propre État, stocké en RAM, par exemple de quelle couleur c’est sur.  Plupart des modes de tourner sur le rouge, puis le vert et le bleu, puis revenez vers le rouge.  En général, ils ne peut pas tous activés en même temps car il n’y a qu’une seule sortie PWM contrôle tout et il la largeur dépend de la luminosité de la couleur qui est sur.

Voilà donc un aperçu rapide, sans écrire un livre.  I ' l essayer de répondre à des questions plus détaillées si vous les poster.   Amusez-vous!

Articles Liés