Inhoudsopgave:
- Stap 1: Laten we meteen naar binnen springen
- Stap 2: Verbeter code - voeg een functie toe
- Stap 3: Een Busy-Loop-vertraging toevoegen
- Stap 4: ARM Architecture Procedure Call Standard (AAPCS)
- Stap 5: Functie met parameter - geneste functies
- Stap 6: GPIO-invoer - schakelaars toevoegen
Video: DEEL 2 - GPIO ARM MONTAGE - RGB - FUNCTIE OPROEPEN - Schakelaars: 6 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:18
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
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:
Mijn lasergesneden Ray-Gun montage-instructies: 10 stappen
Mijn lasergesneden Ray-Gun montage-instructies: Met excuses voor de vertraging, hier is mijn langverwachte instructies voor het monteren van de Laser Pointer Ray-Gun, u kunt de Vector-tekenplannen kopen om het te laten maken… Op een CNC Laser-Cutter!https://cults3d.com/en/3d-model/gadget/ray-gunDit is hoe
Deel 1 ARM-assemblage TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo - Ajarnpa
Deel 1 ARM-assemblage TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: De focus van deze Instructable is de STM32 Nucleo-microcontroller. De motivatie hiervoor is om van kale botten een montageproject te kunnen maken. Dit zal ons helpen om dieper te graven en het MSP432 Launchpad-project (de TI-RSLK) te begrijpen dat heeft
DIY-oscilloscoopset - handleiding voor montage en probleemoplossing: 10 stappen (met afbeeldingen)
DIY Oscilloscope Kit - Montage- en probleemoplossingsgids: Ik heb heel vaak, bij het ontwerpen van een elektronisch gadget, een oscilloscoop nodig om de aanwezigheid en vorm van de elektrische signalen te observeren. Tot nu toe heb ik een oude Sovjet (jaar 1988) enkelkanaals analoge CRT-oscilloscoop gebruikt. Het is nog steeds functioneel
HOE EEN INDRUKWEKKENDE HOUTEN ROBOT ARM TE MONTEREN (DEEL 3: ROBOT ARM) -- GEBASEERD OP DE MICRO: BITN - Ajarnpa
HOE EEN INDRUKWEKKENDE HOUTEN ROBOT ARM TE MONTEREN (DEEL 3: ROBOT ARM) -- GEBASEERD OP DE MICRO: BITN: Het volgende installatieproces is gebaseerd op het voltooien van de modus voor het vermijden van obstakels. Het installatieproces in de vorige sectie is hetzelfde als het installatieproces in de lijnvolgmodus. Laten we dan eens kijken naar de uiteindelijke vorm van A
HOE EEN INDRUKWEKKENDE HOUTEN ROBOT ARM TE MONTEREN (DEEL 2: ROBOT OM obstakels te vermijden) -- GEBASEERD OP DE MICRO: BIT: 3 stappen
HOE EEN INDRUKWEKKENDE HOUTEN ROBOT ARM TE MONTEREN (DEEL 2: ROBOT OM obstakels te vermijden) -- GEBASEERD OP DE MICRO: BIT: Voorheen introduceerden we Armbit in lijnvolgmodus. Vervolgens introduceren we hoe Armbit te installeren in het vermijden van obstakelmodus