Taula de continguts:

PART 2 - ASSEMBLEA DE BRAÇOS GPIO - RGB - CONVOCATUNRIES DE FUNCIÓ - Interruptors: 6 passos
PART 2 - ASSEMBLEA DE BRAÇOS GPIO - RGB - CONVOCATUNRIES DE FUNCIÓ - Interruptors: 6 passos

Vídeo: PART 2 - ASSEMBLEA DE BRAÇOS GPIO - RGB - CONVOCATUNRIES DE FUNCIÓ - Interruptors: 6 passos

Vídeo: PART 2 - ASSEMBLEA DE BRAÇOS GPIO - RGB - CONVOCATUNRIES DE FUNCIÓ - Interruptors: 6 passos
Vídeo: you can become a GIGACHAD assembly programmer in 10 minutes (try it RIGHT NOW) 2024, Desembre
Anonim
PART 2 - ASSEMBLEA DE BRAÇOS GPIO - RGB - CONVOCATUNRIES DE FUNCIÓ - Interruptors
PART 2 - ASSEMBLEA DE BRAÇOS GPIO - RGB - CONVOCATUNRIES DE FUNCIÓ - Interruptors

A la primera part, vam aprendre a canviar un sol LED vermell a la placa de desenvolupament MSP432 LaunchPad de Texas Instruments, utilitzant el conjunt en lloc de C / C ++.

En aquest instructiu, farem alguna cosa similar: controlar un LED RGB que també es troba a la mateixa placa.

Al llarg del camí, esperem ampliar el nostre coneixement del muntatge ARM i no només divertir-nos encenent alguns LED.

Pas 1: saltem directament

Realment, el primer vídeo ho diu tot. No hi ha molt més que afegir.

L'objectiu principal és portar a casa la idea que cada port d'E / S del MSP432 consisteix en un bloc d'adreces "registre", que al seu torn consten de diversos bits cadascun.

A més, els bits s'agrupen de manera ortogonal. És a dir, el bit 0 de cada adreça de registre fa referència al mateix pin d'E / S extern.

Hem repetit la idea que es necessiten diverses adreces de registre per a aquest port, per fer alguna cosa amb només un bit o un pin.

Però, en aquest cas, ja que tractem d'un LED RGB, hem de tractar tres bits per a cada adreça de registre.

Vam reforçar que necessitem diversos registres: el registre DIR, el registre SEL0, el registre SEL1 i el registre OUTPUT. I tres bits cada vegada.

Pas 2: Milloreu el codi: afegiu una funció

Image
Image

Com heu vist al pas anterior, el bucle del programa principal tenia molts codis repetits, és a dir, quan apaguem els LED.

Per tant, podem afegir una funció al programa. Encara hem de trucar a aquesta funció cada vegada que volem apagar els LED, però fa que alguns dels codis es redueixin a una sola sentència.

Si el nostre codi d’apagat LED s’hagués implicat més amb moltes més instruccions, hauria estat un estalvi de memòria real.

Part de la programació i els microcontroladors incrustats és molt més conscient de la mida del programa.

El vídeo explica.

Bàsicament, afegim una sentència de ramificació al nostre codi principal i tenim un altre bloc de codi que és la funció a la qual ens ramifiquem. I, un cop acabem, o al final de la funció, tornem a la següent instrucció del programa principal.

Pas 3: afegiu un retard de bucle ocupat

A la secció Declaracions del codi, afegiu una constant per facilitar la tweek durant el temps desitjat:

; qualsevol paraula després d'un punt i coma (';') inicia un comentari.

; el codi d'aquesta part assigna un nom a un valor.; també podríeu haver utilitzat ".equ", però són lleugerament diferents.; '.equ' (crec) no es pot canviar, mentre que '.set' vol dir que podeu; canvieu el valor de "DLYCNT" més endavant al codi, si voleu.; 'DLYCNT' s'utilitzarà com a valor de compte enrere a la subrutina de retard. DLYCNT.set 0x30000

Afegiu una nova funció de retard:

retard:.asmfunc; l'inici de la subrutina o funció "endarreriment".

MOV R5, #DLYCNT; carrega el registre de la CPU central R5 amb el valor assignat a "DLYCNT". dlyloop; això marca l'inici del bucle de retard. el muntador determina l'adreça. SUB R5, # 0x1; restar un 1 del valor actual al registre central de la CPU R5. CMP R5, # 0x0; compareu el valor actual de R5 a 0. BGT dlyloop; branca si el valor a R5 és superior a 0, per etiquetar (adreça) "dlyloop". BX LR; si arribem aquí, significa que el valor R5 era 0. retorn de la subrutina..endasmfunc; marca el final de la subrutina.

A continuació, al cos principal, dins del bucle principal, invoqueu o truqueu aquesta funció de retard:

; es tracta d'un fragment de codi, del cos principal o de la funció principal (vegeu el fitxer 'main.asm').

; es tracta d'un bucle a "principal" i mostra com anomenem o utilitzem aquesta nova funció de "retard".; el #REDON i el #GRNON també són declaracions (constants) (vegeu la part superior de 'main.asm').; només són una manera senzilla d'establir el color especificat del LED RGB. bucle MOV R0, #REDON; vermell: estableix el registre central de la CPU R0 amb el valor assignat a 'REDON'. STRB R0, [R4]; el registre central R4 es va configurar prèviament amb una adreça de sortida GPIO.; escriviu el que hi ha a R0, a l'adreça especificada per R4. Retard BL; derivació de la nova funció "delay". BL ledsoff; branca a la funció 'ledsoff' preexistent. BL delay; idem MOV R0, #GRNON; Verd - idem STRB R0, [R4]; etcètera. BL delay BL ledsoff BL delay

El vídeo entra en detall.

Pas 4: Estàndard de trucades de procediment d'arquitectura ARM (AAPCS)

Probablement sigui un bon moment per introduir alguna cosa. És una convenció en llenguatge assembleari. També conegut com a Procediment de trucada estàndard per a ARM Architecture.

Hi ha moltes coses, però només és un estàndard. No ens impedeix aprendre la programació de muntatges i podem adoptar peces d’aquest estàndard a mesura que avancem, un cop ens sentim còmodes amb alguns conceptes que estem aprenent.

En cas contrari, podríem sentir que bevem d’una enorme mànega d’aigua. Massa informació.

Registres bàsics

Com que ens hem familiaritzat amb els registres bàsics de l'MSP432, intentem adoptar ara alguns d'aquests estàndards. Ens conformarem amb això quan escrivim la següent funció (encendre / apagar un LED).

1) Se suposa que utilitzem R0 com a paràmetre de funció. Si volem passar un valor a la funció (subrutina), hauríem d’utilitzar R0 per fer-ho.

2) Utilitzarem el registre d'enllaços per al propòsit previst: conté l'adreça que indica a on tornar després de completar la subrutina.

Veureu com els apliquem.

Pas 5: Funció amb paràmetres: funcions imbricades

Podem netejar el nostre codi i reduir la quantitat de memòria que ocupa combinant seccions repetides en una sola funció. L’única diferència del cos del bucle principal és que necessitem un paràmetre per poder passar els diferents colors que volem veure del LED RGB.

Mireu el vídeo per obtenir més informació. (perdó per la longitud)

Pas 6: Entrada GPIO: afegiu commutadors

Fem-ho més interessant. És hora d’afegir algun control de commutació al nostre programa de muntatge.

Aquesta instrucció té imatges que mostren com es connecten els dos commutadors integrats al MSP432.

Essencialment: el commutador 1 (SW1 o S1) està connectat a P1.1 i el commutador 2 (SW2 o S2) està connectat a P1.4.

Això fa que les coses siguin una mica interessants no només perquè ens ocupem d’entrades en lloc de sortides, sinó també perquè aquests dos commutadors ocupen o ocupen dos bits del mateix bloc d’adreça de registre, igual que el LED vermell únic que és una sortida.

Vam tractar de canviar el LED vermell únic en aquest manual, de manera que només cal afegir codi per gestionar els commutadors.

Port 1 Registre de blocs d'adreces

Recordeu que els vam tractar a l’anterior Instructable, però n’hem d’incloure un de nou:

  • Adreça del registre d'entrada del port 1 = 0x40004C00
  • Adreça del registre de sortida del port 1 = 0x40004C02
  • Adreça del registre de direcció del port 1 = 0x40004C04
  • Port 1 Resistor Enable Register address = 0x40004C06
  • Port 1 Seleccioneu 0 Adreça de registre = 0x40004C0A
  • Port 1 Seleccioneu 1 Adreça de registre = 0x40004C0C

Quan s’utilitzen els ports com a entrades, és bo utilitzar les resistències internes de pujada o baixada de l’MSP432.

Com que la placa de desenvolupament de Launchpad ha connectat els dos commutadors a terra (BAIX quan es prem), això vol dir que hauríem d’utilitzar resistències pull UP per assegurar-nos que tinguem un HIGH alt quan no es premen.

Resistències de tracció cap amunt / cap avall

Es necessiten dues adreces de registre de port 1 diferents per lligar aquestes entrades de commutador a resistències de pujada.

1) Utilitzeu el registre habilitat per resistències del port 1 (0x40004C06) per indicar només que voleu resistències (per a aquests dos bits), 2) i, a continuació, utilitzeu el registre de sortida del port 1 (0x40004C02) per configurar les resistències com a pull-up o pull-down. Podria semblar confús que utilitzem un registre de sortida a les entrades. El registre de sortida té gairebé un doble propòsit.

Per tant, per tornar a afirmar d’una altra manera, el registre de sortida pot enviar un HIGH o LOW a una sortida (com el LED vermell únic) i / o s’utilitza per configurar resistències pull-up o pull-down per a les entrades, PERUT NOMÉS si aquesta característica s'ha habilitat mitjançant el registre habilitador de resistències.

Important a l’anterior: quan envieu / configureu BAIX o ALT a qualsevol bit de sortida, haureu de mantenir l’estat de pujada / baixada dels bits d’entrada simultàniament.

(el vídeo intenta explicar)

Lectura d’un bit d’entrada de port

  • Configureu SEL0 / SEL1 per a la funcionalitat GPIO
  • Estableix el registre DIR com a entrada per als bits de commutació, però com a sortida per al LED (simultàniament en el mateix byte)
  • Activa les resistències
  • Configureu-los com a resistències de tracció
  • Llegiu el port
  • És possible que vulgueu filtrar el valor llegit per aïllar només els bits que necessiteu (commutador 1 i 2)

Recomanat: