Étape 2: Le code Source a expliqué
Le programme s’écoule comme suit :Départ :
Registres de claires
Définir la direction de données sur les ports d’intérêt
Loop0 :
Si aucune entrée, ne produit aucune sortie
si input, continuer
NOTE0 :
est entrée = note0 ?
dans l’affirmative, les valeurs de charge dans des registres de minuterie qui permettent les fonctions de sortie produisent la fréquence de l’onde carrée correcte
Sinon, poursuivez
(Produire une boucle NoteX pour chaque note possible sur 8 octaves)
Salut:
relance de sortie haute (1)
Timerhi :
définit combien de temps la sortie reste élevée
NOx
Restituer la sortie pour basse (0)
timerlo :
définit combien de temps la sortie reste faible (0)
entrée :
Vérifiez si l’entrée a changé
dans l’affirmative, utilisez sales coups pour revenir à loop0
Si non, allez à Salut
Il y a plusieurs « rjmp îles » qui permettent au programme retour au début... Ce microcontrôleur ne supporte pas l’opcode jmp et rjmp ne peut que vous faire à une fonction à une distance d’un certain nombre d’instructions. Nous résoudre ce problème en « semis » le programme avec des instructions de rjmp qui sont ignorés sur le chemin « down » au programme, mais peut être utilisé pour monter retour jusqu’au début de programme.
ATTENTION BUG : Quelque part 3/4 vers le bas de l’échelle, il y a un groupe de quelques notes (3-4) qui ne sont pas tout à fait raison. Sur les 3 valeurs utilisées pour r30, je soupçonne le plus utilisé est incorrect (trop bas), j’ai probablement mal calculé le nombre d’horloge cycles quelque part, ou peut-être mettre une valeur erronée pour r29 quelque part... Je vais me contenter de travailler autour de lui, corrigez-le si vous le souhaitez (et dites-moi où l’erreur a été!)
Avertissement d’inefficacité : Je sais, j’aurais pu juste utiliser PWM et autres tables d’EEPROM, mais au moment où j’ai pensé à elle, elle travaillait déjà de cette façon.