Étape 2: logiciel
Les fusibles de ATtiny2313 doivent avoir la valeur appropriée pour sélectionner l’horloge interne de 1Mhz. Le suivant lien www.engbedded.com/fusecalc est utile afin de simplifier la logique inverse légèrement confuse, utilisée pour la programmation de fusible. Le fichier fuse.txt ci-dessous montre la commande que j’ai utilisé pour programmer les fusibles.
Une autre chose est que les ports de programmation flash se chevauchent avec PORTB, vous devrez peut-être débrancher le LED pendant la programmation de la ATtiny2313. Les instructions de compilation sont dans le fichier build.txt ci-dessous. (Juste comme un test de validation, j’imprime les tailles de code et le plan variable.)
J’ai utilisé une portée multicanal pour le débogage. Il aurait été difficile pour moi de trouver certains des « bogues » dans le cas contraire. Il m’a fallu un certain temps pour comprendre que l’effet stroboscopique LED interférait avec la conversion. Pour déboguer ce problème, dont je me doutais portait sur les interruptions, j’ai utilisé le port inutilisé de PORTD et réglez-le au début de l’interruption et débranché il juste avant la fin. Le problème était que, bien que le code d’effet stroboscopique dans la routine d’interruption du service était facile à lire et à comprendre, il a fallu environ 500μS à exécuter. J’ai réécrit le code afin qu’il avait moins de lignes (mais plus complexe et moins compréhensible), et cela est devenu moins une question. J’ai également décidé de désactiver les interruptions stroboscopique pendant la conversion.
L’installation est simple, timer1 est utilisée pour déclencher l’interruption de l’effet stroboscopique (1000 cycles à 1Mhz). Le comparateur est activé pour déclencher une capture de minuterie sur un front montant. Tous les bits du port et PORTD sont initialement tri-indiqué. Les lecteurs de LED (6 bits sur PORTB, 4 sur PORTD) sont activés. Les ports les résistances de charge et de décharge de conduite sont retrouvent haute et basse respectivement. Le condensateur est déchargé, puis les interruptions sont activées. Elle est suivie d’une boucle infinie de conversions suivies en affichant le résultat.
L’effet stroboscopique LED est conceptuellement simple, mais un peu compliqué par le fait des bits sont fractionnés sur deux ports. L’effet stroboscopique travaille dans un cycle de 10 ms. Dans le premier cycle, LED0 & LED1 sont activés, lors du prochain cycle, LED1 & LED2 sont activés, et ainsi de suite, jusqu'à ce que le dernier cycle dans lequel LED9 & LED0 sont activés. Les masques d’activer sont stockés dans un tableau statique pré-calculée display_mask_B et display_mask_D et les cycles de routine interruption par l’intermédiaire de chacune des 10 masques.
La conversion ADC fonctionne en désactivant l’interruption timer1, charge le condensateur (et l’enregistrement de l’heure de début, qui est la valeur de timer1) jusqu'à ce que la sortie du comparateur est réglée. Puis le condensateur est déchargé pour 5 * R_DIS * C_CHR qui est d’environ 60μS. Le temps nécessaire à la conversion est mesuré par l’interruption de capture de timer1 (déclenchée par un front montant sur la sortie du comparateur). L’interruption du timer1 est activée et que le décalage horaire calculé. Le calcul est simple puisque la conversion prend moins de 1 ms. (N’oubliez pas que le compteur entoure chaque 1000 tiques.)
Au départ j’ai essayé calibrer la sortie en mesurant et en informatique, mais il a commencé à devenir trop compliqué, alors j’ai décidé d’afficher temporairement le résultat à l’aide d’une routine de debug_led_value (qui affiche la valeur en 10-bit binaire, maintenez l’écran pendant une seconde) et de jouer avec certains statique. Ceci a donné une gamme (subjective) de temps des tiques 136-351. Puis, j’ai écrit un code de branchement pour mapper cette gamme dans un nombre compris entre 0 et 10 et cela permet d’afficher les barres. Cela a fonctionné de façon satisfaisante. (J’ai calibré l’appareil avant l’Assemblée, qu’il s’agissait de reflasher le ATtiny2313).