Innholdsfortegnelse:

DEL 2 - GPIO ARM MONTERING - RGB - FUNKSJONSOPPKALL - Brytere: 6 trinn
DEL 2 - GPIO ARM MONTERING - RGB - FUNKSJONSOPPKALL - Brytere: 6 trinn

Video: DEL 2 - GPIO ARM MONTERING - RGB - FUNKSJONSOPPKALL - Brytere: 6 trinn

Video: DEL 2 - GPIO ARM MONTERING - RGB - FUNKSJONSOPPKALL - Brytere: 6 trinn
Video: Знакомство с платой разработки Heltec LoRa CubeCell HTCC-AB01 2024, November
Anonim
DEL 2 - GPIO ARM MONTERING - RGB - FUNKSJONSOPPKALL - Brytere
DEL 2 - GPIO ARM MONTERING - RGB - FUNKSJONSOPPKALL - Brytere

I del 1 lærte vi hvordan du bytter en enkelt rød LED på MSP432 LaunchPad -utviklingskortet fra Texas Instruments, ved å bruke montering i stedet for C / C ++.

I denne instruksen vil vi gjøre noe lignende - kontrollere en RGB -LED som også er på det samme kortet.

Underveis håper vi å videreutvikle vår kunnskap om ARM -montering, og ikke bare ha det gøy med å tenne noen lysdioder.

Trinn 1: La oss hoppe rett inn

Virkelig, den første videoen sier alt. Ikke mye mer å legge til.

Hovedpoenget med det er å drive hjem ideen om at hver I/O -port på MSP432 består av en blokk med "register" -adresser, som igjen består av flere biter hver.

Videre grupperes bitene på en ortogonal måte. Det vil si at bit 0 i hver registeradresse refererer til den samme eksterne I/O -pinnen.

Vi gjentok ideen om at det krever flere registeradresser for den porten, for å gjøre noe med bare en bit eller pin.

Men at i dette tilfellet, siden vi har å gjøre med en RGB LED, må vi forholde oss til tre biter for hver registeradresse.

Vi forsterket at vi trenger flere registre: DIR -registeret, SEL0 -registeret, SEL1 -registeret og OUTPUT -registeret. Og tre biter hver gang.

Trinn 2: Forbedre kode - Legg til en funksjon

Image
Image

Som du så i trinnet ovenfor, hadde hovedprogramsløyfen mye gjentatt kode, nemlig når vi slår av lysdiodene.

Så vi kan legge til en funksjon i programmet. Vi må fortsatt kalle den funksjonen hver gang vi vil slå av lysdiodene, men det får noen av koden til å kollapse til en enkelt setning.

Hadde vår LED-off-kode vært mer involvert med mange flere instruksjoner, hadde dette vært en skikkelig minnesparing.

En del av innebygd programmering og mikrokontrollere er å være mye mer bevisst på programstørrelse.

Videoen forklarer.

I hovedsak legger vi til en forgreningserklæring til hovedkoden vår, og vi har en annen kodeblokk som er funksjonen vi forgrener oss til. Og så når vi er ferdige, eller på slutten av funksjonen, går vi tilbake til neste setning i hovedprogrammet.

Trinn 3: Legg til en opptatt forsinkelse

I delen Deklarasjoner i koden, legg til en konstant for å gjøre det enkelt å tweek for ønsket timing:

; noen ord etter et semikolon (';') starter en kommentar.

; koden i denne delen tilordner et navn til en verdi.; du kunne også ha brukt '.equ', men de er litt forskjellige.; '.equ' (tror jeg) kan ikke endres, mens '.set' betyr at du kan; endre verdien av 'DLYCNT' senere i koden hvis du ønsker det.; 'DLYCNT' vil bli brukt som nedtellingsverdi i forsinkelsesprogrammet. DLYCNT. Sett 0x30000

Legg til en ny forsinkelsesfunksjon:

forsinkelse:.asmfunc; starten på 'forsinkelsen' underrutinen eller funksjonen.

MOV R5, #DLYCNT; load core cpu register R5 med verdi tildelt 'DLYCNT'. dlyloop; dette markerer starten på forsinkelsessløyfen. assembler bestemmer adressen. SUB R5, #0x1; trekker en 1 fra gjeldende verdi i kjernecpu -registeret R5. CMP R5, #0x0; sammenligne nåværende verdi i R5 til 0. BGT dlyloop; gren hvis verdien i R5 er større 0, for å merke (adresse) 'dlyloop'. BX LR; hvis vi kom hit, betyr det at R5 -verdien var 0. retur fra subrutine..endasmfunc; markerer slutten på subrutinen.

Deretter påkaller eller kaller du forsinkelsesfunksjonen i hoveddelen, i hovedløkken:

; dette er et kodefragment, av hoveddelen eller hovedfunksjonen (se filen 'main.asm').

; dette er en sløyfe i "main", og viser hvordan vi kaller eller bruker den nye "forsinkelses" -funksjonen.; '#REDON' og '#GRNON' er også erklæringer (konstanter) (se toppen av 'main.asm').; de er bare en enkel måte å angi den angitte fargen på RGB LED. sløyfe MOV R0, #REDON; Rød - sett kjernecpu -register R0 med verdi tildelt 'REDON'. STRB R0, [R4]; kjerneregister R4 ble tidligere angitt med en GPIO -utgangsadresse.; skriv hva som er i R0, til adressen spesifisert av R4. BL forsinkelse; gren til den nye "forsinkelses" -funksjonen. BL ledsoff; gren til den allerede eksisterende "ledsoff" -funksjonen. BL forsinkelse; ditto MOV R0, #GRNON; Grønn - ditto STRB R0, [R4]; og så videre. BL forsinkelse BL ledsoff BL forsinkelse

Videoen går i detalj.

Trinn 4: ARM Architecture Procedure Call Standard (AAPCS)

Det er sannsynligvis en god tid å introdusere noe. Det er et forsamlingsspråklig stevne. Også kjent som Procedure Call Standard for ARM Architecture.

Det er mye i dette, men det er bare en standard. Det forhindrer oss ikke i å lære montering av programmering, og vi kan ta i bruk deler av den standarden når vi går, når vi føler oss komfortable med noen begreper vi lærer.

Ellers kan vi føle at vi drikker fra en stor vannslange. For mye informasjon.

Kjerneregistre

Siden vi har blitt kjent med MSP432s kjerneregistre, la oss prøve å nå vedta noen av disse standardene. Vi følger dette når vi skriver den neste funksjonen (slå på / av en LED).

1) Vi skal bruke R0 som funksjonsparameter. Hvis vi ønsker å overføre en verdi til funksjonen (subrutine), bør vi bruke R0 for å gjøre det.

2) Vi skal bruke lenkeregisteret til det tiltenkte formålet - det inneholder adressen som angir hvor du skal gå tilbake til etter at subrutinen er fullført.

Du vil se hvordan vi bruker disse.

Trinn 5: Funksjon med parameter - nestede funksjoner

Vi kan rydde opp i koden vår og redusere mengden minne den opptar ved å kombinere gjentatte seksjoner til en enkelt funksjon. Den eneste forskjellen i hovedløyfekroppen er at vi trenger en parameter slik at vi kan passere de forskjellige fargene vi vil se på RGB LED.

Ta en titt på videoen for detaljer. (beklager lengden)

Trinn 6: GPIO -inngang - Legg til brytere

La oss gjøre det mer interessant. Det er på tide å legge til litt bryterkontroll i vårt monteringsprogram.

Denne instruksen har bilder som viser hvordan de to innebygde bryterne er koblet til MSP432.

I hovedsak: Bryter 1 (SW1 eller S1) er koblet til P1.1, og bryter 2 (SW2 eller S2) er koblet til P1.4.

Dette gjør ting litt interessant, ikke bare fordi vi har å gjøre med innganger i stedet for utganger, men også fordi disse to bryterne opptar eller tar opp to biter av den samme registeradresseblokken som den eneste røde LED -en som er en utgang.

Vi jobbet med å bytte den eneste røde LED -en i denne instruksjonsboken, så vi trenger bare å legge til kode for å håndtere bryterne.

Port 1 Registrer adresseblokk

Husk at vi dekket disse i forrige Instructable, men vi må inkludere en ny:

  • Port 1 Inngangsregisteradresse = 0x40004C00
  • Port 1 Utgangsregisteradresse = 0x40004C02
  • Port 1 Retning Registeradresse = 0x40004C04
  • Port 1 Resistor Enable Register address = 0x40004C06
  • Port 1 Velg 0 Registrer adresse = 0x40004C0A
  • Port 1 Velg 1 Registrer adresse = 0x40004C0C

Når du bruker portene som innganger, er det godt å bruke MSP432s interne pull-up eller pull-down motstander.

Siden Launchpad -utviklingsbordet har koblet de to bryterne til bakken (LOW når den trykkes), betyr det at vi bør bruke pull UP -motstander for å sikre at vi har en solid HIGH når de ikke er presset.

Trekk opp / trekk ned motstander

Det tar to forskjellige Port 1 Register-adresser for å knytte disse bryterinngangene til opptrekkbare motstander.

1) Bruk Port 1 Resistor-Enable register (0x40004C06) for å bare indikere at du vil ha motstander (for de to bitene), 2) og bruk deretter Port 1 Output-registeret (0x40004C02) til å sette motstandene som enten pull-up eller pull-down. Det kan virke forvirrende at vi bruker et Output-register på innganger. Utdataregisteret har nesten et dobbelt formål.

Så, for å angi en annen måte, kan Output-registeret enten sende ut en HIGH eller LOW til en utgang (for eksempel den eneste røde LED-en), og / eller den brukes til å stille opp- eller nedtrekksmotstander for innganger, MEN KUN hvis denne funksjonen er aktivert via motstandskontrollregistret.

Viktig i det ovennevnte-når du sender/setter en LAV eller HØY til en hvilken som helst utgangsbit, må du opprettholde pull-up/pull-down-tilstanden til inngangsbitene samtidig.

(videoen prøver å forklare)

Lese en portinngangsbit

  • Still inn SEL0 / SEL1 for GPIO -funksjonalitet
  • Sett DIR -registeret som inngang for bryterbitene, men som utgang for LED -en (samtidig i samme byte)
  • Aktiver motstander
  • Sett dem som opptrekkmotstander
  • Les porten
  • Det kan være lurt å filtrere verdien som er lest for å isolere bare bitene du trenger (bryter 1 og 2)

Anbefalt: