Étape 7: Programmer le microcontrôleur
Voici un exemple d’un les contrôles de luminosité des LED dans la boucle principale du programme. Tout d’abord, la « direction » est checed. 1 moyen augmente la luminosité ; un 0 signifie magnitude apparente décroissante. Ensuite, le niveau est augmenté/diminué à un taux basé sur son niveau actuel. Pour maintenir la LED à un état variateur plus longtemps (il est bien vif pendant la majeure partie de son fonctionnement), son niveau change lentement au début. Une fois qu’il arrive aux États plus lumineux, le niveau va changer plus rapidement. Si vous voulez les LEDs à se comporter différemment, c’est l’endroit pour faire les changements.
if(stat_flag & DIRECTION0) {/ / si la LED 0 devrait augmenter en luminosité
Si (brightness0 < 25) brightness0 ++ ; Augmenter lentement au cours des États dim
ElseIf (brightness0 < 40) brightness0 += 5 ; Augmenter un peu plus vite
ElseIf (brightness0 < 100) brightness0 += 10 ; Augmenter rapidement
else CLEAR_BIT (stat_flag, DIRECTION0) ; Temps de changer de direction
}
else {/ / si la LED 0 devrait diminuer de luminosité
Si brightness0 (brightness0 > 40)-= 10 ; Diminuer rapidement
ElseIf (brightness0 > 25) brightness0-= 5 ; Baisse un peu plus lent
ElseIf (brightness0 > 1) brightness0--; Diminuer lentement au cours des États dim
else SET_BIT (stat_flag, DIRECTION0) ; Temps de changer de direction
}
L’exemple suivant est la partie de l’interruption de 100ns qui active ou désactive les voyants. Un compteur pour chaque LED compte jusqu'à 100, date à laquelle il la LED s’allume et remet le compteur. Si le compteur n’est pas à 100, il est vérifié pour voir s’il a atteint le degré de luminosité actuel. En ce moment, le voyant est éteint et reste éteint jusqu'à ce que le compteur atteigne 100. C’est ce qu’on appelle PWM (modulation de largeur d’impulsions) et il contrôle efficacement la luminosité de la LED.
Si (++ cnt0 == 100) {/ / 100 * 100 ns = 10ms (100Hz)
LED_ON(0) ; Allumer LED 0
cnt0 = 0 ; Réinitialiser le compteur
}
ElseIf (cnt0 == brightness0) LED_OFF(0) ; Si a atteint le degré de luminosité désiré, désactiver les LED 0
J’ai joint le fichier principal (valentine.c) ainsi que le makefile nécessaire pour une utilisation avec WinAVR. Le fichier Hex est également disponible si vous voulez juste à programmer la puce et ne toucher à rien du tout. Le schéma pour une utilisation dans Cadsoft Eagle est également inclus dans ce fichier zip.