Étape 5: Logiciel montage
Le flux de la logique du SW pour la montre est représenté ci-dessus. La programmation a été fait entièrement en Assemblée, mettre en œuvre les fonctionnalités Interrupt, convertisseurs a/n, Power Management, GPIO et Timer de la ATmega328P. Les raisons que j’ai choisi que l’Assemblée pour mon langage de programmation a été d’optimiser mon programme le meilleur que j’ai pu et parce que je suis fier de moi en travaillant dans les plus difficiles, niveaux inférieurs pour les projets.
5.1. premier Prototype
Un système de développement qui imitait grossièrement le ChronosMEGA final a été construit pour mettre en œuvre le SW qui course sur la montre. L’alimentation de la montre a été créée tout d’abord séparément sur un PCB fabriqué, j’ai conçu et a été utilisée pour alimenter le circuit. Cette unité a été ensuite incorporée au produit final.
Une vidéo montrant le circuit de la maquette est illustrée ci-dessous :
5.2. interruptions
Il y a 4 routines d’interruption différentes pour le ChronosMEGA : un pour les RH + et MIN + boutons, un pour le sommeil et la dernière pour le Timer1 comparer match afficher les boutons, un pour le Timer2 comparer match.
Le module Timer2 de 8 bits est programmé pour compter les 10èmes de seconde manière asynchrone à partir du système. Quand ça compte un 10ème de seconde il interrompt et incrémente le 10e jour d’une seconde valeur.
Le module de Timer1 16 bits est utilisé pour aller dans les 5 secondes lorsque l’utilisateur appuie sur la touche time Display pour voir le temps. Lorsque cette minuterie coupe, il désactive l’affichage et le ChronosMEGA revient à son état de repos.
5.3. power Management et Mode veille
Un grand objectif était de faire le ChronosMEGA aussi efficace que possible, avec une grande 400mAh batterie, la montre a la capacité de durer très longtemps sur une seule charge. Avec le projet terminé, la ChronosMEGA attire un microampères 4 désintéressé dans son mode "veille" et est calculée pour une durée de 11 ans sur une seule charge.
Le ChronosMEGA suit toujours temps dans cette étape de sommeil, réveillant seulement d’incrémenter le compteur de second et pour les touches. L’horloge système est complètement stoppé, et seul le module Timer2 avec son cristal de 32,768 kHz asynchrone continue à fonctionner.
Lorsque l’utilisateur appuie sur la touche « Sleep », le programme définit un indicateur et désactive l’affichage LED. Dans la boucle principale, le programme vérifie l’indicateur de sommeil et commence les préparatifs de couchage si c’est 0 x 01. Voici la boucle principale :
Les registres de sommeil sont mis en place avant la boucle principale quant à entrer dans le mode "Économie d’énergie" en attribuant à la SM bits [2:0] 0b011. Mode « Économie d’énergie » désactive le ATmega328P mais permet le Timer2 de courir à la condition qu’il soit asynchrone. Comparez match et les interruptions externes seront réveillera le ATmega328P temporairement, afin de la routine d’interruption de service et de se pour rendormir si nécessaire.
5.4. un problème de clignotement de la LED et la gigue
Après avoir téléchargé le programme initial de la ChronosMEGA, j’ai remarqué certains faible scintillement dans certains des LEDs quand ils ne devaient pas être sur. Cela m’a dérangé et je suis venu à la conclusion qu’il doit y avoir quelque chose de mal avec mes conventions de programmation qui a provoqué le problème.
La source du problème a été découvert lorsque j’ai constaté la pile lors de simulations et remarqué que mon généraliste registres étaient ne pas être poussé et dépilé, vissage donc mon traitement. Ceci a été résolu en poussant les registres dans la pile lorsqu’une routine d’interruption du service est appelée et éclater les registres au terme de la procédure. Un exemple d’interruption est illustré ci-dessous :
Lorsque la fonction « IncSec10 » est appelée, la pile s’affiche comme ci-dessous :
Après que « IncSec10 » est terminée, les registres sont sautés hors de la pile afin de restaurer leur valeur d’origine.