Table des matières:

Tutoriel Assembleur AVR 6 : 3 étapes
Tutoriel Assembleur AVR 6 : 3 étapes

Vidéo: Tutoriel Assembleur AVR 6 : 3 étapes

Vidéo: Tutoriel Assembleur AVR 6 : 3 étapes
Vidéo: Atmel Studio 7 et langage assembleur 2024, Juillet
Anonim
Tutoriel Assembleur AVR 6
Tutoriel Assembleur AVR 6

Bienvenue dans le didacticiel 6 !

Le tutoriel d'aujourd'hui sera court où nous développerons une méthode simple pour communiquer des données entre un atmega328p et un autre en utilisant deux ports les reliant. Nous prendrons ensuite le rouleau de dés du didacticiel 4 et l'analyseur de registre du didacticiel 5, les connecterons ensemble et utiliserons notre méthode pour communiquer le résultat des lancers de dés du rouleau à l'analyseur. Nous imprimerons ensuite le rouleau en binaire à l'aide des LED que nous avons construites pour l'analyseur dans le didacticiel 5. Une fois que nous aurons ce travail, nous pourrons construire la prochaine partie de notre projet global dans le prochain didacticiel.

Dans ce tutoriel, vous aurez besoin de:

  1. Votre planche de prototypage
  2. Votre lanceur de dés du Tutoriel 4
  3. Votre analyseur de registre du didacticiel 5
  4. Deux fils de connexion
  5. Une copie de la fiche technique complète (révision 2014):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. Une copie du manuel du jeu d'instructions (révision 2014):

    www.atmel.com/images/atmel-0856-avr-instruc…

Voici un lien vers la collection complète de mes tutoriels d'assembleur AVR:

Étape 1: Comment pouvons-nous faire communiquer deux microcontrôleurs ?

Comment faire communiquer deux microcontrôleurs ?
Comment faire communiquer deux microcontrôleurs ?

Puisque nous commençons à étendre notre projet afin que notre produit final unique soit composé d'une collection de pièces plus petites, nous allons avoir besoin de plus de broches qu'un seul Atmega328P ne peut en fournir. Par conséquent, nous allons faire chaque partie du projet global sur un microcontrôleur séparé, puis leur faire partager les données entre eux. Donc, le problème que nous devons résoudre est de savoir comment trouver une méthode simple pour que les contrôleurs se parlent et transfèrent des données entre eux ? Eh bien, une chose à propos de ces contrôleurs est qu'ils exécutent chacun 16 millions d'instructions par seconde. Ceci est très précisément chronométré et nous pouvons donc utiliser cette synchronisation pour transférer des données. Si nous utilisons des retards en millisecondes pour constituer les données, nous n'avons pas vraiment besoin d'être si précis puisque le processeur exécute 16 000 instructions en une seule milliseconde. En d'autres termes, une milliseconde est une éternité pour le CPU. Essayons donc avec les lancers de dés. Je souhaite transmettre le résultat d'un lancer de dés du jeton du rouleau de dés à la puce de l'analyseur. Supposons que vous vous trouviez de l'autre côté de la rue et que je veuille vous signaler le résultat de mon lancer de dés. Une chose que je pourrais faire, si nous avions tous les deux une montre, c'est que je pourrais allumer une lampe de poche, puis lorsque vous êtes prêt à recevoir mes données, vous allumez votre lampe de poche et nous démarrons tous les deux nos horloges. Ensuite, je garde ma lampe de poche allumée pendant le nombre exact de millisecondes pendant que les dés roulent, puis je l'éteins. Donc, si je faisais un 12, je garderais ma lumière allumée pendant 12 millisecondes. Maintenant, le problème avec ce qui précède est que, pour vous et moi, il n'y a aucun moyen que nous puissions chronométrer les choses avec suffisamment de précision pour faire la distinction entre 5 millisecondes et 12 millisecondes. Mais qu'en est-il de ceci: supposons que nous décidions que je garderais ma lumière allumée pendant un an pour chaque numéro sur les dés ? Ensuite, si je fais un 12, je vous éclairerai pendant 12 ans et je pense que vous conviendrez qu'il n'y a aucune possibilité que vous fassiez une erreur en calculant le nombre, n'est-ce pas ? Vous pouvez faire une pause et aller jouer au baseball, vous pouvez même aller jouer au craps à Vegas pendant 6 mois, du moment qu'à un moment de l'année, jetez un coup d'œil de l'autre côté de la rue pour voir si la lumière est allumée, vous ne manquerez pas un compte. Eh bien, c'est exactement ce que nous faisons pour les microcontrôleurs ! Une seule milliseconde pour le processeur équivaut à un an. Donc, si j'allume le signal pendant 12 millisecondes, il n'y a presque aucune chance que l'autre microcontrôleur le confonde pendant 10 ou 11, quelles que soient les interruptions et tout ce qui se passe entre-temps. Pour les microcontrôleurs, une milliseconde est une éternité. Voici donc ce que nous allons faire. Nous allons d'abord choisir deux ports sur le contrôleur pour être nos ports de communication. J'utiliserai PD6 pour recevoir des données (nous pourrions l'appeler Rx si nous le souhaitons) et je choisirai PD7 pour transmettre des données (nous pourrions l'appeler Tx si nous le souhaitons). La puce de l'analyseur vérifiera périodiquement sa broche Rx et si elle voit un signal, elle passera à un "sous-programme de communication", puis transmettra un signal de retour au lanceur de dés indiquant qu'il est prêt à recevoir. Ils commenceront tous les deux à chronométrer et le lanceur de dés transmettra un signal (c'est-à-dire 5 V) pendant une milliseconde par numéro sur le dé. Donc, si le jet était un double six, ou un 12, alors le lanceur de dés réglerait son PD7 à 5V pendant 12 millisecondes, puis le remettrait à 0V. L'analyseur vérifiera sa broche PD6 toutes les millisecondes, en comptant à chaque fois, et lorsqu'il reviendra à 0 V, il affichera le nombre résultant sur l'écran de l'analyseur, affichant un douze en binaire sur les LED. C'est donc le plan. Voyons si nous pouvons le mettre en œuvre.

Étape 2: Sous-routines de communication

La première chose que nous devons faire est de connecter les deux contrôleurs. Prenez donc un fil de PD6 sur l'un et connectez-le à PD7 sur l'autre, et vice-versa. Ensuite, initialisez-les en réglant PD7 sur OUTPUT sur les deux et PD6 sur INPUT sur les deux. Enfin, réglez-les tous sur 0V. Plus précisément, ajoutez ce qui suit à la section Init ou Reset du code sur chaque microcontrôleur:

sbi DDRD, 7; PD7 réglé sur sortie

cbi PortD, 7; PD7 initialement 0V cbi DDRD, 6; PD6 réglé pour entrer cbi PortD, 6; PD6 initialement 0V clr total; total sur les dés initialement 0

Maintenant, configurons le sous-programme de communication sur la puce du lanceur de dés. Définissez d'abord une nouvelle variable en haut appelée "total" qui stockera le nombre total obtenu sur la paire de dés et l'initialisera à zéro.

Ensuite, écrivez un sous-programme pour communiquer avec l'analyseur:

communiquer:

cbi PortD, 7 sbi PortD, 7; Envoi signal d'attente prêt: sbic PinD, 6; lire PinD et sauter si 0V rjmp wait delay 8; délai pour synchroniser (trouvé ceci expérimentalement) send: dec total delay 2; délai pour chaque décompte cpi total, 0; 0 signifie ici que le nombre "total" de retards a été envoyé breq PC+2 rjmp send cbi PortD, 7; PD7 à 0V total clr; remettre le total des dés à 0 ret

Dans l'analyseur, nous ajoutons un rappel de la routine principale à la sous-routine de communication:

analyseur clr; se préparer pour le nouveau numéro

sbic PinD, 6; vérifier PD6 pour un signal 5V rcall communiquer; si 5V vont communiquer analyseur mov, total; sortie vers l'analyseur d'affichage de l'analyseur de rappel

puis écrivez le sous-programme de communication comme suit:

communiquer:

total clr; remettre le total à 0 délai 10; délai pour se débarrasser des rebonds sbi PortD, 7; régler PB7 à 5V pour signaler prêt à recevoir: délai 2; attendre le prochain nombre inc total; incrément total sbic PinD, 6; si PD6 repasse à 0V on a fini de recevoir rjmp; sinon reboucler pour plus de données cbi PortD, 7; réinitialiser PD7 lorsque vous avez terminé ret

Voilà! Maintenant, chaque microcontrôleur est configuré pour communiquer le résultat du lancer de dés, puis l'afficher sur l'analyseur.

Nous mettrons en œuvre un moyen de communication beaucoup plus efficace plus tard lorsque nous aurons besoin de transférer le contenu d'un registre entre contrôleurs au lieu d'un simple jet de dé. Dans ce cas, nous n'utiliserons toujours que deux fils pour les connecter mais nous utiliserons 1, 1 pour signifier « commencer la transmission »; 0, 1 pour signifier "1"; 1, 0 pour signifier « 0 »; et enfin 0, 0 pour signifier "fin de transmission".

Exercice 1: voyez si vous pouvez implémenter la meilleure méthode et l'utiliser pour transférer le jet de dés sous forme de nombre binaire de 8 bits.

Je joins une vidéo qui montre le mien en fonctionnement.

Étape 3: Conclusion

Conclusion
Conclusion

J'ai joint le code complet pour votre référence. Ce n'est pas aussi propre et bien rangé que je le souhaiterais, mais je le nettoierai au fur et à mesure que nous le développerons dans les futurs didacticiels.

À partir de maintenant, je joindrai simplement les fichiers contenant le code plutôt que de tout taper ici. Nous allons simplement taper les sections qui nous intéressent.

Il s'agissait d'un court didacticiel où nous avons proposé une méthode simple pour indiquer à notre microcontrôleur d'analyse le résultat de notre lancer de dés à partir de notre microcontrôleur de rouleau de dés tout en utilisant seulement deux ports.

Exercice 2: Au lieu d'utiliser un signal prêt pour indiquer quand le lanceur de dés est prêt à émettre et un autre quand l'analyseur est prêt à recevoir, utilisez une « interruption externe » appelée « interruption de changement de broche ». Les broches de l'atmega328p peuvent être utilisées de cette façon, c'est pourquoi elles ont PCINT0 à PCINT23 à côté d'elles dans le schéma de brochage. Vous pouvez l'implémenter en tant qu'interruption de la même manière que nous l'avons fait avec l'interruption de débordement du temporisateur. Dans ce cas, le "gestionnaire" d'interruption sera le sous-programme qui communique avec le lanceur de dés. De cette façon, vous n'avez pas besoin d'appeler le sous-programme de communication à partir de main: il y ira chaque fois qu'il y aura une interruption provenant d'un changement d'état sur cette broche.

Exercice 3: Une bien meilleure façon de communiquer et de transférer des données entre un microcontrôleur et un ensemble d'autres est d'utiliser l'interface série à 2 fils intégrée sur le microcontrôleur lui-même. Essayez de lire la section 22 de la fiche technique et voyez si vous pouvez comprendre comment la mettre en œuvre.

Nous utiliserons ces techniques plus sophistiquées à l'avenir lorsque nous ajouterons d'autres contrôleurs.

Le fait que tout ce que nous ayons fait avec notre analyseur soit de prendre le total du jet de dés et de l'imprimer ensuite en binaire à l'aide de LED n'est pas ce qui est important. Le fait est que maintenant notre analyseur "sait" ce qu'est le jet de dés et peut l'utiliser en conséquence.

Dans le prochain tutoriel, nous allons changer le but de notre "analyseur", introduire quelques éléments de circuit supplémentaires et utiliser le lancer de dés d'une manière plus intéressante.

Jusqu'à la prochaine fois…

Conseillé: