Inhoudsopgave:

DEEL 2 - GPIO ARM MONTAGE - RGB - FUNCTIE OPROEPEN - Schakelaars: 6 stappen
DEEL 2 - GPIO ARM MONTAGE - RGB - FUNCTIE OPROEPEN - Schakelaars: 6 stappen

Video: DEEL 2 - GPIO ARM MONTAGE - RGB - FUNCTIE OPROEPEN - Schakelaars: 6 stappen

Video: DEEL 2 - GPIO ARM MONTAGE - RGB - FUNCTIE OPROEPEN - Schakelaars: 6 stappen
Video: 7. How to Output to a Pin to Blink an LED for Arm Microcontrollers - GPIO Tutorial Part 2 2024, November
Anonim
DEEL 2 - GPIO ARM MONTAGE - RGB - FUNCTIE OPROEPEN - Schakelaars
DEEL 2 - GPIO ARM MONTAGE - RGB - FUNCTIE OPROEPEN - Schakelaars

In deel 1 hebben we geleerd hoe je een enkele rode LED op het MSP432 LaunchPad-ontwikkelbord van Texas Instruments kunt schakelen, met behulp van assembly in plaats van C / C++.

In deze Instructable zullen we iets soortgelijks doen - een RGB-LED bedienen die zich ook op datzelfde bord bevindt.

Onderweg hopen we onze kennis van ARM-assemblage te vergroten en niet alleen plezier te hebben met het aansteken van enkele LED's.

Stap 1: Laten we meteen naar binnen springen

Echt, de eerste video zegt alles. Niet veel meer aan toe te voegen.

Het belangrijkste punt is om het idee naar voren te brengen dat elke I/O-poort op de MSP432 bestaat uit een blok "register"-adressen, die op hun beurt uit verschillende bits bestaan.

Verder zijn de bits orthogonaal gegroepeerd. Dat wil zeggen, bit 0 van elk registeradres verwijst naar dezelfde externe I/O-pin.

We herhaalden het idee dat er meerdere registeradressen nodig zijn voor die poort om iets te doen met zelfs maar één bit of pin.

Maar dat we in dit geval, aangezien we te maken hebben met een RGB-led, te maken hebben met drie bits voor elk registeradres.

We hebben benadrukt dat we verschillende registers nodig hebben: het DIR-register, het SEL0-register, het SEL1-register en het OUTPUT-register. En telkens drie bits.

Stap 2: Verbeter code - voeg een functie toe

Image
Image

Zoals je in de bovenstaande stap hebt gezien, had de hoofdprogrammalus veel herhaalde code, namelijk wanneer we de LED's uitschakelen.

We kunnen dus een functie aan het programma toevoegen. We moeten die functie nog steeds elke keer aanroepen als we de LED's willen uitschakelen, maar het zorgt ervoor dat een deel van de code instort tot een enkele instructie.

Als onze LED-off-code meer betrokken was geweest bij veel meer instructies, zou dit een echte geheugenbesparing zijn geweest.

Onderdeel van embedded programmering en microcontrollers is dat we ons veel meer bewust zijn van de programmagrootte.

De video legt het uit.

In wezen voegen we een vertakkingsinstructie toe aan onze hoofdcode en we hebben nog een codeblok dat de functie is waarnaar we vertakken. En als we dan klaar zijn, of aan het einde van de functie, gaan we terug naar de volgende instructie in het hoofdprogramma.

Stap 3: Een Busy-Loop-vertraging toevoegen

Voeg in het gedeelte Verklaringen van de code een constante toe om het gemakkelijk te maken om te tweeken voor de gewenste timing:

; elk woord na een puntkomma (';') begint een opmerking.

; de code in dit deel kent een naam toe aan een waarde.; je had ook '.equ' kunnen gebruiken, maar ze zijn iets anders.; '.equ' (denk ik) kan niet worden gewijzigd, terwijl '.set' betekent dat je; wijzig desgewenst de waarde van 'DLYCNT' later in de code.;'DLYCNT' wordt gebruikt als aftelwaarde in de vertragingssubroutine. DLYCNT.set 0x30000

Voeg een nieuwe vertragingsfunctie toe:

vertraging:.asmfunc; de start van de 'vertraging' subroutine of functie.

MOV R5, #DLYCNT; laad core cpu register R5 met waarde toegewezen aan 'DLYCNT'. dlyloop; dit markeert het begin van de vertragingslus. assembler bepaalt adres. SUB R5, #0x1; trek een 1 af van de huidige waarde in core cpu register R5. CMP R5, #0x0; vergelijk de huidige waarde in R5 met 0. BGT dlyloop; vertakking als de waarde in R5 groter is dan 0, naar label (adres) 'dlyloop'. BX LR; als we hier komen, betekent dat de R5-waarde 0 was. terugkeer van de subroutine..endasmfunc; markeert het einde van de subroutine.

Roep vervolgens in het hoofdgedeelte, binnen de hoofdlus, die vertragingsfunctie aan of roep deze aan:

; dit is een codefragment, van hoofdtekst of hoofdfunctie (zie bestand 'main.asm').

; dit is een lus in 'main' en laat zien hoe we die nieuwe 'delay'-functie aanroepen of gebruiken.; de '#REDON' en '#GRNON' zijn ook declaraties (constanten) (zie bovenaan 'main.asm').; ze zijn gewoon een gemakkelijke manier om de gespecificeerde kleur van RGB LED in te stellen. lus MOV R0, #REDON;Rood - stel core cpu register R0 in met de waarde toegewezen aan 'REDON'. STRB R0, [R4];core register R4 was eerder ingesteld met een GPIO-uitgangsadres.;schrijf wat er in R0 staat, naar het adres gespecificeerd door R4. BL delay;vertakking naar de nieuwe 'delay' functie. BL ledsoff;vertakking naar de reeds bestaande 'ledsoff'-functie. BL vertraging;idem MOV R0, #GRNON;Groen - idem STRB R0, [R4]; enzovoort. BL vertraging BL ledsoff BL vertraging

De video gaat in detail.

Stap 4: ARM Architecture Procedure Call Standard (AAPCS)

Het is waarschijnlijk een goed moment om iets te introduceren. Het is een conventie in assembler. Ook bekend als de Procedure Call Standard voor de ARM-architectuur.

Er komt veel bij kijken, maar het is maar een standaard. Het weerhoudt ons er niet van om assemblageprogrammering te leren, en we kunnen stukjes van die standaard overnemen als we ons eenmaal op ons gemak voelen met enkele concepten die we aan het leren zijn.

Anders zouden we het gevoel kunnen hebben dat we uit een enorme waterslang drinken. Te veel informatie.

Kernregisters

Nu we bekend zijn geraakt met de kernregisters van de MSP432, gaan we nu proberen enkele van deze standaarden over te nemen. We zullen hieraan voldoen wanneer we de volgende functie schrijven (een LED in- / uitschakelen).

1) Het is de bedoeling dat we R0 gebruiken als functieparameter. Als we een waarde willen doorgeven aan de functie (subroutine), moeten we R0 gebruiken om dat te doen.

2) We moeten het Link Register gebruiken voor het beoogde doel - het bevat het adres dat aangeeft waarheen we moeten terugkeren nadat de subroutine is voltooid.

U zult zien hoe we deze toepassen.

Stap 5: Functie met parameter - geneste functies

We kunnen onze code opschonen en de hoeveelheid geheugen die deze in beslag neemt verminderen door herhaalde secties te combineren in een enkele functie. Het enige verschil in de hoofdlus is dat we een parameter nodig hebben, zodat we de verschillende kleuren kunnen doorgeven die we van de RGB-LED willen zien.

Bekijk de video voor details. (sorry voor de lengte)

Stap 6: GPIO-invoer - schakelaars toevoegen

Laten we het interessanter maken. Het is tijd om wat schakelaarbesturing toe te voegen aan ons montageprogramma.

Deze Instructable heeft afbeeldingen die laten zien hoe de twee ingebouwde schakelaars zijn aangesloten op de MSP432.

In wezen: schakelaar 1 (SW1 of S1) is verbonden met P1.1 en schakelaar 2 (SW2 of S2) is verbonden met P1.4.

Dit maakt de zaken een beetje interessant, niet alleen omdat we te maken hebben met ingangen in plaats van uitgangen, maar ook omdat deze twee schakelaars twee bits van hetzelfde registeradresblok bezetten of innemen als de enkele rode LED die een uitgang is.

We hebben te maken gehad met het omschakelen van de enkele rode LED in deze Instructable, dus we hoeven alleen maar code toe te voegen om de schakelaars af te handelen.

Poort 1 Adresblok registreren

Onthoud dat we deze in de vorige Instructable hebben behandeld, maar we moeten een nieuwe opnemen:

  • Poort 1 Invoer Register adres = 0x40004C00
  • Poort 1 Uitgang Register adres = 0x40004C02
  • Poort 1 Richting Register adres = 0x40004C04
  • Poort 1 Weerstand inschakelen Registeradres = 0x40004C06
  • Poort 1 Selecteer 0 Registeradres = 0x40004C0A
  • Poort 1 Selecteer 1 Registeradres = 0x40004C0C

Als je de poorten als input gebruikt, is het goed om de interne pull-up of pull-down weerstanden van de MSP432 te gebruiken.

Omdat het Launchpad-ontwikkelbord de twee schakelaars op aarde heeft aangesloten (LOW wanneer ingedrukt), betekent dit dat we UP-weerstanden moeten gebruiken om ervoor te zorgen dat we een solide HIGH hebben als ze niet worden ingedrukt.

Pull-up / pull-down weerstanden

Er zijn twee verschillende poort 1-registeradressen nodig om die schakelaaringangen te koppelen aan pull-up-weerstanden.

1) Gebruik het Port 1 Resistor-Enable register (0x40004C06) om aan te geven dat je weerstanden wilt (voor die twee bits), 2) en gebruik vervolgens het poort 1 uitgangsregister (0x40004C02) om de weerstanden in te stellen als pull-up of pull-down. Het lijkt misschien verwarrend dat we een uitgangsregister op ingangen gebruiken. Het uitvoerregister heeft bijna een tweeledig doel.

Dus, om het op een andere manier weer te geven, kan het uitgangsregister ofwel een HOOG of een LAAG naar een uitgang sturen (zoals de enkele rode LED), en/of het wordt gebruikt om pull-up of pull-down weerstanden in te stellen voor ingangen, MAAR ALLEEN als die functie is ingeschakeld via het Resistor-Enable register.

Belangrijk in het bovenstaande - wanneer u een LAAG of HOOG naar een uitvoerbit verzendt/instelt, moet u de pull-up/pull-down-status van de invoerbits tegelijkertijd behouden.

(de video probeert het uit te leggen)

Een poortinvoerbit lezen

  • Stel de SEL0 / SEL1 in voor GPIO-functionaliteit
  • Stel het DIR register in als ingang voor de schakelbits, maar als uitgang voor de LED (tegelijk in dezelfde byte)
  • Schakel weerstanden in
  • Stel ze in als pull-up-weerstanden
  • Lees de poort
  • Misschien wilt u de gelezen waarde filteren om alleen de bits te isoleren die u nodig hebt (schakelaar 1 en 2)

Aanbevolen: