Étape 5: Le groupe de travail de programmation
Voici un guide à la programmation de cet appareil. Je vais commencer avec le programme utilisé pour générer l’onde sinusoïdale de 1,7 Mhz :DÉPART :
comprennent « m8515def.inc » ; Il s’agit d’un fichier de définition, une chose très utile à utiliser. Si vous avez besoin d’une copie, google le nom de fichier
REGISTERS0 :
LDI r16, 0 x 00
LDI r17, 0 x 25
LDI r18, 0x7F
LDI r19, 0xD9 ; Charge s’inscrit tout d’abord, de cette façon par la suite, que votre code peut produire une sortie ~ 1 par cycle d’horloge
LDI r20, 0xFF ; Ces valeurs ont été déterminées par 127*sin(x)(pi/4), pour les valeurs entières positives de x.
sur DDRB, r20
Sine0 de 2Mhz :
sur le PORTB, r18
sur le PORTB, r19
sur le PORTB, r20
sur le PORTB, r19
sur le PORTB, r18
sur le PORTB, r17
sur le PORTB, r16
sur le PORTB, r17 ; une période du sine wave @ 2Mhz si vous utilisez une vitesse d’horloge de 16Mhz
rjmp 2Mhz sine0
Ce qui suit est des exemples d’ondes sinusoïdales de 1Mhz, générés de deux façons différentes.
Sine0 de 1Mhz :
sur le PORTB, r18
NOP
sur le PORTB, r19
NOP
sur le PORTB, r20
NOP
sur le PORTB, r19
NOP
sur le PORTB, r18
NOP
sur le PORTB, r17 ; une période du sine wave @ 1Mhz si vous utilisez une vitesse d’horloge de 16Mhz
NOP
sur le PORTB, r16 ; C’est la manière paresseuse.
NOP
sur le PORTB, r17 ; L’exemple suivant montrera le meilleur chemin.
rjmp 1Mhz sine0
REGISTERS1 :
LDI r16, 0x7F
LDI r17, 0xAB
LDI r18, 0xD1
LDI r19, 0xF6
LDI r20, 0xFE
LDI r21, 0 x 53 ; Notez que nous avons chargé les 9 registres de mémoire ! Notez combien registres vous avez, et
LDI r22, 0x2D ; faire bon usage. Où 127*sin(x)(pi/n), n peut être n’importe quel nombre de registres
LDI r23, 0 x 08 ; où nombre de registres plus 1 divisé par 2... sauf si je me trompe !
LDI r24, 0 x 00
Sine1 de 1Mhz :
sur le PORTB, r16
sur le PORTB, r17
sur le PORTB, r18
sur le PORTB, r19
sur le PORTB, r20
sur le PORTB, r19
sur le PORTB, r18
sur le PORTB, r17
sur le PORTB, r16
sur le PORTB, r21
sur le PORTB, r22
sur le PORTB, r23
sur le PORTB, r24
sur le PORTB, r23
sur le PORTB, r22
sur le PORTB, r21
rjmp 1Mhz sine1
Ce qui précède est un bel exemple du compromis entre la résolution et la fréquence. De réduire de moitié la résolution, vous pouvez doubler la fréquence. Un lecteur perspicace
auront remarqué que les deux formes d’onde utilisent 0x7F (127) comme un zéro point indépendamment de l’ordre que les registres sont chargés... Vous pouvez déterminer qu’un autre
point zéro est plus utile pour certaines formes d’onde... mais pour ceux symétrique comme vous êtes le plus susceptible d’utiliser, 0x7F est optimale.
Maintenant, nous passons à un sujet plus compliqué... Comment produisons-nous une forme d’onde de 1,5 Mhz ? Tenir compte :
sine(x)(pi/6)
qui serait la résolution correcte à utiliser... mais, étant donné que cette résolution divise équitablement dans 2pi, mais pas dans p/2... notre forme d’onde se penchera étrange,
parce qu’à aucun moment la sortie est égal au minimum ou le maximum de la fonction, ce qui veut dire quelque chose près 0 x 00 et 0xFF ! Pour la grande
fréquences, la forme d’onde peut être approximativement correcte de toute façon, en raison de la capacité naturelle et l’inductance dans n’importe quel circuit. Il résiste à tout changement
en courant ou en tension, donc à des fréquences plus élevées, si vous copiez 0 x 00 dix fois, puis deux fois 0xFF... la deuxième 0xFF vous donnera une valeur un peu supérieure
que la première. Essayez-le et voyez, il peut ou peut ne pas fonctionner selon des variables qui sont trop complexes pour discuter ici.
Le fait est qu’il est difficile, voire impossible de générer des fréquences qui ne sont pas des fractions binaires de la vitesse d’horloge... À très haute
fréquences, vous pourriez être en mesure de « tricher » à l’aide de la capacité parasite et inductance... et certainement à des fréquences plus basses, la question devient sans importance
comme nous le verrons dans le prochain exemple... mais certainement il y a certaines fréquences qui ne peut pas être générés.
Un ingénieur astucieux (c’est à dire: pas moi) va installer une prise de courant pour maintenir l’oscillateur à quartz utilisé dans cet appareil... de cette façon, il/elle peut trivialement changer le
la fréquence fondamentale de l’appareil et obtenir essentiellement n’importe quelle fréquence ils veulent conformes aux spécifications du microcontrôleur
(J’ai vu bon marché... 2$... atmels qui fonctionnent à des vitesses d’horloge jusqu'à 20 Mhz).
Maintenant, voici un code pour une forme d’onde de fréquence nettement inférieure. C’est fondamentalement code depuis le site Web que j’ai répertorié comme une référence :
http://www.avr-ASM-Tutorial.net/avr_en/AVR_DAC.html
La forme d’onde est une onde en dents de scie. Allez visiter le site Web car il est très utile et le code, il est vraiment bon pour des signaux de fréquence basse-moyenne.
comprennent « m8515def.inc »
DÉPART :
LDI r18, 0xFF
sur DDDR, r18
EN DENTS DE SCIE :
sur PORTD, r18
r18 Inc
rjmp en dents de scie
Cela génère une forme d’onde d’environ 2,5 kilohertz. Vous pourriez augmenter/diminuer le fréquence en ajoutant des pauses (nop) ou minuteries, ou vous pouvez augmenter la fréquence
en diminuant la résolution... au lieu de inc (incrémentation) simple ajouter un numéro à r18. Si vous ajoutez 2, la fréquence doublerait. Si vous ajoutez 3 et une pause
(nop), la fréquence augmentera de 1,5 fois.
Pour faire un triangle de vague, ajouter un IPC instruction pour tester si la r18 est égal à 0xFF et dans l’affirmative, effectue un branchement dans une fonction similaire qui décrémente ou soustrait de la r18. Que fonction doit bien sûr tester si r18 = 0 x 00 et si ce branche à la fonction de premier.
Je vais finir ce tutoriel avec quelques indices sur la façon d’utiliser intelligemment cet appareil :
-Appliquer les fonctions du programmateur adéquat pour créer correctement des signaux de basse fréquence. Il est plus difficile que vous pensez à garder une trace de cycles d’horloge de programmes dans votre tête.
-Si les fonctions de minuterie vous effraient (ils me font peur), comte de cycles d’horloge dans votre tête et puis testez-le sur votre portée pour s’assurer que c’est correct.
-A decimal Converter hexagonale est une chose très utile pour déterminer ce que devraient être les valeurs des registres.
-Ne pas raccorder cet appareil à une antenne et utilisez-le pour communications sans fil, sauf si vous disposez d’une licence et savez ce que vous faites.
-Vous pouvez probablement programmer jusqu'à une onde carrée de 4 Mhz avec cet appareil... est utilisé comme une source d’horloge variable, ou pour injecter des communications série dans un circuit.
-8 d'entre eux avec une horloge commune ferait une source logique parallèle programmable vraiment cool.
-Générer des potentiels d’action de neurone avec elle et sans doute votre laboratoire de biologie d’économiser beaucoup d’argent.
-Faire un piano avec elle.
-Ce dispositif laisse plusieurs entrées sur l’atmega inutilisés. Si vous souhaitez que l’appareil d’être plus pratique, mais ont limité les fonctions, vous pourriez construire une
interface pour elle et un programme intelligent, donc vous pouvez générer un éventail de formes d’onde et fréquences sans reprogrammation.
-N’oubliez pas que rjmp prend des cycles d’horloge et crée un artefact ! Contourner ce problème en incluant de nombreuses périodes dans votre programme avant une boucle. Faire bon usage
de toute cette mémoire sur l’atmegas !
Obsolète (Légion Labs est un effort de recherche nouveau, sans but lucratif, aucun-degrés-requis actuellement situé à Montréal. Nous ne sommes pas affiliés avec d’autres organismes.
Il a actuellement un membre, étant donné que j’ai considéré que très récemment élargit la portée de cette opération.)
Actuellement : Légion Labs est membre d’une montréalaise à but non lucratif recherche/ingénierie effort avec un certain nombre d’autres personnes, qui loue un atelier industriel comme un endroit pour bricoler.