Table des matières:

PARTIE 2 - ASSEMBLAGE DU BRAS GPIO - RVB - APPELS DE FONCTION - Commutateurs : 6 étapes
PARTIE 2 - ASSEMBLAGE DU BRAS GPIO - RVB - APPELS DE FONCTION - Commutateurs : 6 étapes

Vidéo: PARTIE 2 - ASSEMBLAGE DU BRAS GPIO - RVB - APPELS DE FONCTION - Commutateurs : 6 étapes

Vidéo: PARTIE 2 - ASSEMBLAGE DU BRAS GPIO - RVB - APPELS DE FONCTION - Commutateurs : 6 étapes
Vidéo: Webinar - MAX78000 Neural Network Accelerator 2024, Novembre
Anonim
PARTIE 2 - ASSEMBLAGE DU BRAS GPIO - RVB - APPELS DE FONCTION - Commutateurs
PARTIE 2 - ASSEMBLAGE DU BRAS GPIO - RVB - APPELS DE FONCTION - Commutateurs

Dans la partie 1, nous avons appris à activer une seule LED rouge sur la carte de développement MSP432 LaunchPad de Texas Instruments, en utilisant l'assemblage au lieu de C/C++.

Dans ce Instructable, nous allons faire quelque chose de similaire - contrôler une LED RVB qui se trouve également sur cette même carte.

En cours de route, nous espérons approfondir nos connaissances sur l'assemblage ARM, et pas seulement nous amuser à allumer certaines LED.

Étape 1: Commençons directement

Vraiment, la première vidéo dit tout. Pas grand chose de plus à ajouter.

Le point principal est de faire comprendre l'idée que chaque port d'E/S sur le MSP432 consiste en un bloc d'adresses de "registre", qui à leur tour se composent de plusieurs bits chacun.

De plus, les bits sont regroupés de manière orthogonale. C'est-à-dire que le bit 0 de chaque adresse de registre fait référence à la même broche d'E/S externe.

Nous avons répété l'idée qu'il faut plusieurs adresses de registre pour ce port, pour faire quelque chose avec ne serait-ce qu'un bit ou une broche.

Mais que dans ce cas, puisque nous avons affaire à une LED RVB, nous devons traiter trois bits pour chaque adresse de registre.

Nous avons renforcé le fait que nous avons besoin de plusieurs registres: le registre DIR, le registre SEL0, le registre SEL1 et le registre OUTPUT. Et trois bits à chaque fois.

Étape 2: Améliorer le code - Ajouter une fonction

Image
Image

Comme vous l'avez vu dans l'étape ci-dessus, la boucle du programme principal avait beaucoup de code répété, à savoir lorsque nous éteignons les LED.

Nous pouvons donc ajouter une fonction au programme. Nous devons toujours appeler cette fonction chaque fois que nous voulons éteindre les voyants, mais cela provoque la réduction d'une partie du code en une seule instruction.

Si notre code LED off avait été plus impliqué dans beaucoup plus d'instructions, cela aurait été un véritable économiseur de mémoire.

Une partie de la programmation embarquée et des microcontrôleurs consiste à être beaucoup plus conscient de la taille du programme.

La vidéo explique.

Essentiellement, nous ajoutons une instruction de branchement à notre code principal, et nous avons un autre bloc de code qui est la fonction vers laquelle nous nous connectons. Et puis une fois que nous avons terminé, ou à la fin de la fonction, nous revenons à l'instruction suivante dans le programme principal.

Étape 3: ajouter un délai de boucle occupée

Dans la section Déclarations du code, ajoutez une constante pour faciliter le tweek pour le timing souhaité:

; tout mot après un point-virgule (';') commence un commentaire.

; le code de cette partie attribue un nom à une valeur.; vous auriez également pu utiliser '.equ' mais ils sont légèrement différents.; '.equ' (je pense) ne peut pas être modifié, alors que '.set' signifie que vous le pouvez; modifiez la valeur de 'DLYCNT' plus tard dans le code si vous le souhaitez.;'DLYCNT' sera utilisé comme valeur de compte à rebours dans le sous-programme de retard. DLYCNT.set 0x30000

Ajouter une nouvelle fonction de délai:

délai:.asmfunc; le début du sous-programme ou de la fonction « retard ».

MOV R5, #DLYCNT; chargez le registre R5 du processeur central avec la valeur affectée à « DLYCNT ». dlyloop; cela marque le début de la boucle de retard. l'assembleur détermine l'adresse. SUB R5, #0x1; soustrayez un 1 de la valeur actuelle dans le registre du processeur central R5. CMP R5, #0x0; comparer la valeur actuelle dans R5 à 0. BGT dlyloop; branchez si la valeur dans R5 est supérieure à 0, à l'étiquette (adresse) 'dlyloop'. BXLR; si nous arrivons ici, cela signifie que la valeur R5 était 0. retour du sous-programme..endasmfunc; marque la fin du sous-programme.

Ensuite, dans le corps principal, dans la boucle principale, invoquez ou appelez cette fonction de délai:

; il s'agit d'un fragment de code, du corps principal ou de la fonction principale (voir le fichier 'main.asm').

; c'est une boucle dans 'main', et montre comment nous appelons ou utilisons cette nouvelle fonction 'delay'.; les '#REDON' et '#GRNON' sont aussi des déclarations (constantes) (voir en haut de 'main.asm').; ils sont juste un moyen facile de définir la couleur spécifiée de la LED RVB. boucle MOV R0, #REDON; Rouge - définit le registre R0 du processeur central avec la valeur affectée à 'REDON'. STRB R0, [R4]; le registre de base R4 était précédemment défini avec une adresse de sortie GPIO.;écrit ce qu'il y a dans R0, dans l'adresse spécifiée par R4. Retard BL; branche à la nouvelle fonction 'delay'. BL ledsoff; branche vers la fonction 'ledsoff' préexistante. Retard BL;idem MOV R0, #GRNON;Vert - idem STRB R0, [R4]; etc. Retard BL DEL BL éteinte Retard BL

La vidéo rentre dans les détails.

Étape 4: Norme d'appel de procédure d'architecture ARM (AAPCS)

C'est probablement le bon moment pour présenter quelque chose. C'est une convention en langage assembleur. Également connu sous le nom de norme d'appel de procédure pour l'architecture ARM.

Il y a beaucoup de choses à cela, mais ce n'est qu'une norme. Cela ne nous empêche pas d'apprendre la programmation en assembleur, et nous pouvons adopter des éléments de cette norme au fur et à mesure, une fois que nous nous sentons à l'aise avec certains concepts que nous apprenons.

Sinon, nous pourrions avoir l'impression de boire dans un énorme tuyau d'eau. Trop d'informations.

Registres de base

Puisque nous nous sommes familiarisés avec les registres de base du MSP432, essayons maintenant d'adopter certaines de ces normes. Nous nous conformerons à cela lorsque nous écrirons la prochaine fonction (allumer / éteindre une LED).

1) Nous sommes censés utiliser R0 comme paramètre de fonction. Si nous souhaitons passer une valeur dans la fonction (sous-routine), nous devons utiliser R0 pour le faire.

2) Nous devons utiliser le registre de liens aux fins prévues - il contient l'adresse qui indique où revenir une fois le sous-programme terminé.

Vous verrez comment nous les appliquons.

Étape 5: Fonction avec paramètre - Fonctions imbriquées

Nous pouvons nettoyer notre code et réduire la quantité de mémoire qu'il occupe en combinant des sections répétées en une seule fonction. La seule différence dans le corps de la boucle principale est que nous avons besoin d'un paramètre pour pouvoir transmettre les différentes couleurs que nous voulons voir de la LED RVB.

Jetez un œil à la vidéo pour plus de détails. (désolé pour la longueur)

Étape 6: Entrée GPIO - Ajouter des commutateurs

Rendons-le plus intéressant. Il est temps d'ajouter un contrôle de commutateur à notre programme d'assemblage.

Ce Instructable a des images montrant comment les deux commutateurs intégrés sont connectés au MSP432.

Essentiellement: le commutateur 1 (SW1 ou S1) est connecté à P1.1 et le commutateur 2 (SW2 ou S2) est connecté à P1.4.

Cela rend les choses un peu intéressantes non seulement parce que nous avons affaire à des entrées au lieu de sorties, mais aussi parce que ces deux commutateurs occupent ou occupent deux bits du même bloc d'adresses de registre, tout comme la seule LED rouge qui est une sortie.

Nous avons traité du basculement de la seule LED rouge dans ce Instructable, nous avons donc juste besoin d'ajouter du code pour gérer les commutateurs.

Bloc d'adresse de registre du port 1

N'oubliez pas que nous les avons couverts dans le précédent Instructable, mais nous devons en inclure un nouveau:

  • Adresse du registre d'entrée du port 1 = 0x40004C00
  • Adresse du registre de sortie du port 1 = 0x40004C02
  • Adresse du registre de direction du port 1 = 0x40004C04
  • Adresse du registre d'activation de la résistance du port 1 = 0x40004C06
  • Port 1 Sélectionnez 0 Adresse de registre = 0x40004C0A
  • Port 1 Sélectionnez 1 Adresse de registre = 0x40004C0C

Lorsque vous utilisez les ports comme entrées, il est bon d'utiliser les résistances de pull-up ou de pull-down internes du MSP432.

Étant donné que la carte de développement Launchpad a câblé les deux commutateurs à la terre (LOW lorsqu'ils sont enfoncés), cela signifie que nous devons utiliser des résistances pull UP pour nous assurer que nous avons un HIGH solide lorsqu'ils ne sont pas enfoncés.

Résistances Pull Up / Pull Down

Il faut deux adresses de registre de port 1 différentes pour lier ces entrées de commutateur à des résistances de rappel.

1) Utilisez le registre Port 1 Resistor-Enable (0x40004C06) pour indiquer simplement que vous voulez des résistances (pour ces deux bits), 2), puis utilisez le registre de sortie du port 1 (0x40004C02) pour définir les résistances comme pull-up ou pull-down. Il peut sembler déroutant que nous utilisions un registre de sortie sur les entrées. Le registre de sortie a presque comme un double objectif.

Ainsi, pour reformuler d'une autre manière, le registre de sortie peut soit envoyer un HAUT ou un BAS à une sortie (comme la LED rouge unique), et / ou il est utilisé pour définir des résistances pull-up ou pull-down pour les entrées, MAIS UNIQUEMENT si cette fonction a été activée via le registre Resistor-Enable.

Important dans ce qui précède - lors de l'envoi / du réglage d'un LOW ou d'un HIGH à n'importe quel bit de sortie, vous devrez maintenir l'état pull-up/pull-down des bits d'entrée simultanément.

(la vidéo essaie d'expliquer)

Lecture d'un bit d'entrée de port

  • Définir le SEL0 / SEL1 pour la fonctionnalité GPIO
  • Définir le registre DIR comme entrée pour les bits de commutation, mais comme sortie pour la LED (simultanément dans le même octet)
  • Activer les résistances
  • Définissez-les comme des résistances de pull-up
  • Lire le port
  • Vous pouvez filtrer la valeur lue pour isoler uniquement les bits dont vous avez besoin (commutateur 1 et 2)

Conseillé: