Étape 3: Le logiciel
J’ai inclus le code ci-dessous, en plus d’une version en surbrillance de la syntaxe que je trouve plus facile
à lire.
J’ai décidé d’utiliser un timer pour générer une interruption chaque 1mS ou ainsi. Cela donne environ un millier
cycles (le compilateur va sauver/restaurer registres sur interruption, il y a moins d’un millier)
entre les interruptions. Cela devrait être suffisant pour n’importe quelle lumière raisonnable clignotant annexe !
Vous devez lire la spec soigneusement pour configurer le minuteur et les interruptions. N’oubliez pas d’activer
interruptions dans la boucle principale. Le lien de la norme est http://www.atmel.com/dyn/resources/prod_documents/doc2543.pdf .
La première image ci-dessous montre les temps d’allumage décalé pour chaque LED et le heavy duty
pour chacun. Pour vous simplifier la vie, j’ai décidé d’utiliser une période de 16mS, donc le rapport cyclique peut être défini
pour toutes le valeurs n/16, avec n = 1,..., 16. Une variable count_ms est incrémenté à chaque fois
la routine d’interruption terminé. J’ai choisi 16 car je peux masquer juste au dessus du fond 4 bits
count_ms pour savoir où nous sommes dans l’obligation de période de cycle. Les données de structurent a conduit
(voir les fichiers .h ci-dessous) indique le quinconce commencer à temps pour chaque LED et combien de temps il
doit rester sur.
J’ai un code supplémentaire d’alterner les LEDs jaunes, donc au maximum une LED jaune
est à tout moment. La variable slow_count active ou désactive chaque 256mS, environ un quart d’un
en second lieu.
À l’aide de la première image ci-dessous, vous pouvez comprendre le maximum et moyenne total LED actuels.
Le tirage moyen (y compris le microcontrôleur) est sur 22mA, ce qui donne environ 4 heures
de la lumière. Étant donné que la valeur maximale est 42mA seulement, il n’y a pas besoin d’un condensateur à travers la
bloc d’alimentation (pour supprimer les transitoires de commutation).
J’ai ajusté les sur-fois donc la luminosité de chaque LED était sensiblement le même. Le jaune
et LEDs rouges ont des diffuseurs, le LED blanc doté d’un objectif, qui fonctionne un peu comme
une vraie voiture. Les LED blanches ont été très brillants. Il y a un scintillement légèrement visible (à 1000/16 Hz),
mais c’est tolérable et attire l’attention quand la voiture se déplace.
Une portée de plusieurs canaux facilite le travail de débogage. Je ne sais pas comment j’aurais trouvé
Mon bugs sinon. Il y a effectivement un bug subtil dans le code, mais il n’importe pas dans ce
C’est une affaire d’angle qui n’est pas pertinente. Si la pulse_on_time est définie sur 0, puis le correspondant
LED reste allumé tout le temps ! La solution consiste à vérifier aussi qu’un voyant est allumé seulement si le
valeur de pulse_on_time est différent de zéro. Toutefois, cela allonge le code inutilement, si vous
envie d’un temps de 0, juste Commentez cet LED !
Les fusibles de ATtiny2313 doivent avoir la valeur appropriée pour sélectionner l’horloge interne de 1 Mhz. le
suivant le lien http://www.engbedded.com/fusecalc/ est utile pour simplifier le légèrement confus
inverser la logique utilisé pour la programmation de fusible. Le fichier fuse.txt ci-dessous montre la commande que j’ai utilisé
pour programmer le microcontrôleur.
Les instructions de compilation sont dans le fichier build.txt ci-dessous. (Juste pour un test de validation, j’ai imprimer la
tailles de code et la carte variable.)