INHOUDSOPGAWE:

DEEL 2 - GPIO ARM VERGADERING - RGB - FUNKSIE OPROEP - Skakelaars: 6 stappe
DEEL 2 - GPIO ARM VERGADERING - RGB - FUNKSIE OPROEP - Skakelaars: 6 stappe

Video: DEEL 2 - GPIO ARM VERGADERING - RGB - FUNKSIE OPROEP - Skakelaars: 6 stappe

Video: DEEL 2 - GPIO ARM VERGADERING - RGB - FUNKSIE OPROEP - Skakelaars: 6 stappe
Video: BTT Manta M8P v2 - Basics with CB1 v2.2 2024, Julie
Anonim
DEEL 2 - GPIO ARM VERGADERING - RGB - FUNKSIE OPROEP - Skakelaars
DEEL 2 - GPIO ARM VERGADERING - RGB - FUNKSIE OPROEP - Skakelaars

In deel 1 het ons geleer hoe om 'n enkele rooi LED op die MSP432 LaunchPad -ontwikkelbord uit te skakel van Texas Instruments, met behulp van assemblage in plaas van C / C ++.

In hierdie instruksies sal ons iets soortgelyks doen - 'n RGB -LED wat ook op dieselfde bord is, beheer.

Onderweg hoop ons om ons kennis van ARM -montering te versterk, en om nie net LED's te verlig nie.

Stap 1: Kom ons spring regs in

Die eerste video sê regtig alles. Nie veel meer om by te voeg nie.

Die belangrikste punt daarvan is om die idee tuis te kry dat elke I/O -poort op die MSP432 bestaan uit 'n blok "register" -adresse, wat weer uit verskeie stukkies bestaan.

Verder word die stukkies op 'n ortogonale manier gegroepeer. Dit wil sê, bit 0 van elke registeradres verwys na dieselfde eksterne I/O -pen.

Ons het die idee herhaal dat dit verskeie registeradresse vir die poort nodig het om iets met net 'n bietjie of 'n pen te doen.

Maar dat ons in hierdie geval met 'n RGB LED te doen het, vir elke registeradres drie bits moet hanteer.

Ons het beklemtoon dat ons verskeie registers benodig: die DIR -register, die SEL0 -register, die SEL1 -register en die OUTPUT -register. En elke keer drie stukkies.

Stap 2: Verbeter kode - voeg 'n funksie by

Image
Image

Soos u in die bogenoemde stap gesien het, het die hoofprogramlus baie herhaalde kode, naamlik wanneer ons die LED's uitskakel.

Ons kan dus 'n funksie by die program voeg. Ons moet die funksie nog steeds bel elke keer as ons die LED's wil afskakel, maar dit veroorsaak dat sommige van die kode tot 'n enkele verklaring val.

As ons LED-off-kode meer betrokke was by baie meer instruksies, sou dit 'n ware geheue-besparing gewees het.

'N Deel van die ingebedde programmering en mikrobeheerders is baie meer bewus van die programgrootte.

Die video verduidelik.

In wese voeg ons 'n vertakkingsverklaring by ons hoofkode, en ons het nog 'n blok kode wat die funksie is waarna ons vertak. En as ons klaar is, of aan die einde van die funksie, gaan ons terug na die volgende stelling in die hoofprogram.

Stap 3: Voeg 'n Busy-Loop-vertraging by

Voeg in die gedeelte Verklarings van die kode 'n konstante by om dit maklik te maak om te twiek vir die gewenste tydsberekening:

; enige woorde na 'n semi-dubbelpunt (';') begin 'n opmerking.

; die kode in hierdie deel ken 'n naam toe aan 'n waarde.; jy kon ook '.equ' gebruik het, maar dit verskil effens.; '.equ' (ek dink) kan nie verander word nie, terwyl '.set' beteken dat u kan; verander die waarde van 'DLYCNT' later in die kode as u wil.; 'DLYCNT' sal gebruik word as die aftellingwaarde in die vertraagde subroutine. DLYCNT.stel 0x30000

Voeg 'n nuwe vertragingsfunksie by:

vertraging:.asmfunc; die begin van die 'vertraging' subroutine of funksie.

MOV R5, #DLYCNT; laai kern -CPU -register R5 met waarde toegeken aan 'DLYCNT'. dlyloop; dit dui die begin van die vertragingslus aan. samesteller bepaal adres. SUB R5, #0x1; trek 'n 1 af van die huidige waarde in die kern -CPU -register R5. CMP R5, #0x0; vergelyk huidige waarde in R5 met 0. BGT dlyloop; tak as die waarde in R5 groter is 0, om 'dlyloop' (adres) te benoem. BX LR; as ons hier gekom het, beteken dit dat R5 waarde 0. terugkeer uit subroutine was..endasmfunc; dui die einde van die subroutine aan.

Dan, in die hoofliggaam, binne die hooflus, roep of noem die vertragingsfunksie:

; dit is 'n kodefragment van die hoofliggaam of hooffunksie (sien lêer 'main.asm').

; dit is 'n lus in 'main' en wys hoe ons die nuwe 'vertragings' -funksie noem of gebruik.; die '#REDON' en '#GRNON' is ook verklarings (konstantes) (sien boaan 'main.asm').; dit is net 'n maklike manier om die gespesifiseerde kleur van RGB LED in te stel. lus MOV R0, #REDON; Rooi - stel kern -CPU -register R0 met waarde toegeken aan 'REDON'. STRB R0, [R4]; kernregister R4 was voorheen ingestel met 'n GPIO -uitvoeradres.; skryf wat in R0 is, in die adres gespesifiseer deur R4. BL vertraging; vertakking na die nuwe 'vertragings' -funksie. BL ledsoff; vertakking na die reeds bestaande 'ledsoff'-funksie. BL vertraging; dieselfde MOV R0, #GRNON; Groen - dieselfde STRB R0, [R4]; en so aan. BL vertraging BL ledsoff BL vertraging

Die video gaan in detail.

Stap 4: ARM Architecture Procedure Call Standard (AAPCS)

Dit is waarskynlik 'n goeie tyd om iets bekend te stel. Dit is 'n vergaderingstaalbyeenkoms. Ook bekend as die Procedure Call Standard vir die ARM Architecture.

Daar is baie hieraan verbonde, maar dit is net 'n standaard. Dit weerhou ons nie van die leer van monteerprogrammering nie, en ons kan stukkies van die standaard aanneem, sodra ons gemaklik voel met 'n paar konsepte wat ons leer.

Andersins kan ons voel dat ons uit 'n groot waterslang drink. Te veel inligting.

Kernregisters

Aangesien ons kennis gemaak het met die MSP432 se kernregisters, probeer ons nou 'n paar van hierdie standaarde aanneem. Ons sal hieraan voldoen as ons die volgende funksie skryf ('n LED aan / uit).

1) Ons moet R0 as funksieparameter gebruik. As ons 'n waarde in die funksie (subroutine) wil oordra, moet ons R0 gebruik om dit te doen.

2) Ons moet die skakelregister gebruik vir die beoogde doel - dit bevat die adres wat aandui waarheen ons moet terugkeer nadat die subroutine voltooi is.

U sal sien hoe ons dit toepas.

Stap 5: Funksie met parameter - geneste funksies

Ons kan ons kode skoonmaak en die hoeveelheid geheue wat dit beslaan verminder deur herhaalde gedeeltes in 'n enkele funksie te kombineer. Die enigste verskil in die hooflus -liggaam is dat ons 'n parameter benodig sodat ons die verskillende kleure wat ons wil sien van die RGB LED kan deurgee.

Kyk na die video vir meer inligting. (jammer vir die lengte)

Stap 6: GPIO -invoer - Voeg skakelaars by

Kom ons maak dit meer interessant. Dit is tyd om 'n skakelaarbeheer by ons monteerprogram te voeg.

Hierdie instruksies bevat beelde wat wys hoe die twee boordskakelaars aan die MSP432 gekoppel is.

In wese: skakelaar 1 (SW1 of S1) is gekoppel aan P1.1, en skakelaar 2 (SW2 of S2) is gekoppel aan P1.4.

Dit maak dinge 'n bietjie interessant, nie net omdat ons te doen het met insette in plaas van uitsette nie, maar ook omdat hierdie twee skakelaars twee stukkies van dieselfde registeradresblok inneem of opneem, net soos die enkele rooi LED wat 'n uitset is.

Ons het die rooi LED in hierdie instruksies aangeskakel, sodat ons net kode moet byvoeg om die skakelaars te hanteer.

Poort 1 Register adresblok

Onthou dat ons dit in die vorige Instructable behandel het, maar ons moet 'n nuwe een insluit:

  • Poort 1 Invoerregisteradres = 0x40004C00
  • Poort 1 Uitvoerregisteradres = 0x40004C02
  • Poort 1 Rigtingregisteradres = 0x40004C04
  • Poort 1 Weerstand Aktiveer registeradres = 0x40004C06
  • Poort 1 Kies 0 Register adres = 0x40004C0A
  • Poort 1 Kies 1 Register adres = 0x40004C0C

As u die poorte as insette gebruik, is dit goed om die interne trek- of aftrekweerstand van die MSP432 te gebruik.

Aangesien die Launchpad -ontwikkelingsbord die twee skakelaars met die aarde bedraad het (LOW as dit ingedruk word), beteken dit dat ons pull UP -weerstande moet gebruik om seker te maak dat ons 'n soliede HIGH het as hulle nie ingedruk word nie.

Weerstands omhoog / af te trek

Dit neem twee verskillende Port 1 Register-adresse om die skakelaarinsette aan optrekweerstands te koppel.

1) Gebruik die Port 1 Resistor-Enable register (0x40004C06) om net aan te dui dat u weerstande wil hê (vir die twee bisse), 2) en gebruik dan die poort 1-uitvoerregister (0x40004C02) om die weerstande as optrek- of aftrek-afstelling in te stel. Dit lyk miskien verwarrend dat ons 'n uitsetregister op insette gebruik. Die uitsetregister het amper 'n dubbele doel.

Om 'n ander manier weer te stel, kan die uitvoerregister 'n HOOG of LAAG na 'n uitset stuur (soos die enkele rooi LED), en / of dit word gebruik om optel- of aftrekweerstands vir insette in te stel, MAAR SLEGS as die funksie via die Resistor-Enable-register geaktiveer is.

Belangrik in die bogenoemde-as u 'n LOW of HIGH na enige uitvoerbit stuur/instel, moet u die optel-/aftrek-toestand van die invoerbits gelyktydig handhaaf.

(die video probeer verduidelik)

Lees 'n poortinvoerbit

  • Stel die SEL0 / SEL1 in vir GPIO -funksionaliteit
  • Stel die DIR -register as invoer vir die skakelbits, maar as uitvoer vir die LED (gelyktydig in dieselfde byte)
  • Aktiveer weerstande
  • Stel hulle as optrekweerstands
  • Lees die poort
  • Miskien wil u die geleesde waarde filter om net die stukkies wat u benodig te isoleer (skakelaar 1 en 2)

Aanbeveel: