INHOUDSOPGAWE:
- Stap 1: Kom ons probeer skryf na / lees uit RAM
- Stap 2: 'n Paar basiese poortinligting
- Stap 3: Het u die een fout in die video opgelos?
Video: GPIO ARM VERGADERING - T.I. ROBOTIESE STELSELSTEL - LAB 6: 3 Stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:26
Hallo, In 'n vorige instruksie oor die leer van ARM-samestelling met behulp van die Texas Instruments TI-RSLK (gebruik die MSP432-mikrobeheerder), ook bekend as Lab 3 as u die T. I. Natuurlik het ons 'n paar basiese instruksies nagegaan, soos om na 'n register te skryf en om voorwaardelike lus te maak. Ons het die uitvoering uitgevoer met behulp van die Eclipse IDE.
Die tienerprogramme wat ons uitgevoer het, het niks met die buitewêreld te doen gehad nie.
Soet vervelig.
Kom ons probeer om dit vandag 'n bietjie te verander deur 'n bietjie te leer oor die invoer/uitset -poorte, spesifiek die digitale GPIO -penne.
Dit gebeur dat hierdie MSP432 op 'n ontwikkelingsbord reeds twee drukknopskakelaars, 'n RGB-LED en 'n rooi LED het, wat almal aan 'n paar GPIO-poorte gekoppel is.
Dit beteken dat terwyl ons leer om hierdie penne op te stel en te manipuleer deur middel van montering, ons die effekte visueel kan sien.
Baie interessanter as om net deur die ontfouter te stap.
(Ons gaan nog steeds stap - dit sal ons 'vertragings' -funksie wees):-D
Stap 1: Kom ons probeer skryf na / lees uit RAM
Voordat ons toegang tot die GPIO verkry en dit beheer, moet ons 'n klein stap neem.
Kom ons begin deur net te lees en te skryf na 'n standaard geheue adres. Ons weet uit die vorige Instructable (sien prente daar) dat RAM by 0x2000 0000 begin, so laat ons die adres gebruik.
Ons gaan data tussen 'n kernregister (R0) en 0x2000 0000 skuif.
Ons begin met 'n basiese lêerstruktuur of inhoud van 'n samestellingsprogram. Verwys na hierdie instruksies om 'n monteerprojek te skep met behulp van TI's Code Composer Studio (CCS), en 'n paar voorbeeldprojekte.
.duim
.text.align 2.global main.thumbfunc main main:.asmfunc; ---------------------------------- -----------------------------------------------; (ons kode sal hierheen gaan); ------------------------------------------ ---------------------------------------.endasmfunc.end
Ek wil iets nuuts by die boonste afdeling voeg, as daar 'n paar verklarings (voorskrifte) is. Dit sal later duideliker word.
ACONST.stel 0x20000000; ons sal dit verder gebruik (dit is 'n konstante)
; Dit is duidelik dat '0x' 'n hekswaarde aandui.
Ons inhoud van die beginlêer lyk dus so:
.duim
.text.align 2 ACONST.set 0x20000000; ons sal dit verder gebruik (dit is 'n konstante); Dit is duidelik dat '0x' 'n hekswaarde aandui..global main.thumbfunc main main:.asmfunc; --------------------------------------- --------------------------------------------------; (ons kode sal hierheen gaan); ------------------------------------------ ---------------------------------------.endasmfunc.end
Noudat ons die bogenoemde het, laat ons kode tussen die stippellyne byvoeg.
Ons begin met skryf na 'n RAM -plek. Eerstens bepaal ons die gegewenspatroon, 'n waarde wat ons in die RAM sal skryf. Ons gebruik 'n kernregister om die waarde of data vas te stel.
Let wel: onthou dat in die kode, enige reël met 'n semi-dubbelpunt (';') beteken dat dit alles 'n opmerking is na die halfpunt.
;-----------------------------------------------------------------------------------------------
; SKRYF; ------------------------------------------------- ---------------------------------------------- MOV R0, #0x55; kernregister R0 bevat die data wat ons na die RAM -plek wil skryf.; Dit is duidelik dat '0x' 'n hekswaarde aandui.
Kom ons kyk vervolgens na stellings wat NIE werk nie.
; MOV MOV kan nie data na 'n RAM -plek skryf nie.
; MOV is slegs vir onmiddellike data in die register; of van een register na 'n ander; dit wil sê MOV R1, R0.; STR moet STR gebruik.; STR R0, = ACONST; Slegte term in uitdrukking (die '='); STR R0, 0x20000000; Onwettige aanspreekmodus vir winkelinstruksies; STR R0, ACONST; Onwettige aanspreekmodus vir winkelinstruksies
Sonder om te veel te verduidelik, het ons probeer om die 'ACONST' hierbo te gebruik. In wese is dit 'n stand-in of konstante in plaas van 'n letterlike waarde soos 0x20000000 te gebruik.
Met die bogenoemde kon ons nie skryf om na die RAM -ligging te skryf nie. Kom ons probeer iets anders.
; dit lyk asof ons 'n ander register moet gebruik wat die RAM -ligging bevat
; om op die RAM -plek MOV R1, #0x20000000 te stoor; stel RAM -ligging (nie die inhoud nie, maar die ligging) in op R1.; Dit is duidelik dat '0x' 'n hekswaarde aandui. STR R0, [R1]; skryf wat in R0 (0x55) in die RAM (0x20000000) in is, met R1.; ons gebruik 'n ander register (R1) met 'n RAM -liggingadres; om na die RAM -ligging te skryf.
'N Ander manier om bogenoemde te doen, maar met' ACONST 'in plaas van die letterlike adreswaarde:
; laat ons weer die bogenoemde doen, maar laat ons 'n simbool gebruik in plaas van 'n letterlike RAM -liggingwaarde.
; ons wil 'ACONST' gebruik as 'n stand-in vir 0x20000000.; ons moet nog steeds die '#' doen om 'n onmiddellike waarde aan te dui; dus (sien bo), ons moes die '.set' -richtlijn gebruik.; Om dit te bewys, laat ons die gegewenspatroon in R0 verander. MOV R0, #0xAA; ok, ons is gereed om na RAM te skryf met die simbool in plaas van letterlike adreswaarde MOV R1, #ACONST STR R0, [R1]
Die video gaan meer in detail, sowel as lees deur die geheue.
U kan ook die aangehegte bron.asm -lêer sien.
Stap 2: 'n Paar basiese poortinligting
Noudat ons 'n goeie idee het hoe om van 'n RAM -plek af te skryf / te lees, sal dit ons help om beter te verstaan hoe u die GPIO -pen kan beheer en gebruik
Hoe reageer ons dan met die GPIO -penne? Uit ons vorige blik op hierdie mikrobeheerder en die ARM -instruksies daarvan, weet ons hoe ons die interne registers moet hanteer, en weet ons hoe ons met geheue (RAM) adresse moet omgaan. Maar GPIO -penne?
Dit gebeur so dat die penne geheue-gekarteer is, sodat ons dit op dieselfde manier as geheue-adresse kan behandel.
Dit beteken dat ons moet weet wat die adresse is.
Hieronder is die beginadresse van die poort. Terloops, vir die MSP432 is 'n "poort" 'n versameling penne, en nie net een pen nie. As u die Raspberry Pi ken, glo ek dat dit anders is as die situasie hier.
Die blou sirkels in die prent hierbo toon die opskrif op die bord vir die twee skakelaars en LED's. Die blou lyne dui op die werklike LED's. Ons hoef nie aan die kopspringers te raak nie.
Ek het die poorte waaroor ons bekommerd vet gemaak hieronder.
- GPIO P1: 0x4000 4C00 + 0 (ewe adresse)
- GPIO P2: 0x4000 4C00 + 1 (onewe adresse)
- GPIO P3: 0x4000 4C00 + 20 (ewe adresse)
- GPIO P4: 0x4000 4C00 + 21 (onewe adresse)
- GPIO P5: 0x4000 4C00 + 40 (ewe adresse)
- GPIO P6: 0x4000 4C00 + 41 (onewe adresse)
- GPIO P7: 0x4000 4C00 + 60 (ewe adresse)
- GPIO P8: 0x4000 4C00 + 61 (onewe adresse)
- GPIO P9: 0x4000 4C00 + 80 (ewe adresse)
- GPIO P10: 0x4000 4C00 + 81 (onewe adresse)
Ons is nog nie klaar nie. Ons benodig meer inligting.
Om 'n poort te beheer, benodig ons verskeie adresse. Daarom sien ons 'ewe adresse' of 'onewe adresse' in die lys hierbo.
I/O Register Address Blocks
Ons benodig ander adresse, soos:
- Poort 1 Invoerregisteradres = 0x40004C00
- Poort 1 Uitvoerregisteradres = 0x40004C02
- Poort 1 Rigtingregisteradres = 0x40004C04
- Poort 1 Kies 0 Register adres = 0x40004C0A
- Poort 1 Kies 1 Register adres = 0x40004C0C
En ons het dalk ander nodig.
Ok, ons ken nou die reeks GPIO -registeradresse om die enkele rooi LED te beheer.
'N Baie belangrike opmerking: Elke I/O -poort op die MSP432 LaunchPad -bord is 'n versameling van verskeie (gewoonlik 8) penne of lyne, en elkeen kan afsonderlik as 'n invoer of uitset gestel word.
Dit beteken byvoorbeeld dat as u waardes vir die "Poort 1 -rigtingregisteradres" stel, u moet bekommerd wees oor watter bit (of stukkies) u by daardie adres instel of verander. Meer hieroor later.
GPIO -poortprogrammeringsvolgorde
Die laaste stuk wat ons nodig het, is 'n proses of algoritme om die LED te beheer.
Eenmalige inisialisering:
- Stel P1.0 op (P1SEL1REG: P1SEL0REG Register) <--- 0x00, 0x00 vir normale GPIO-funksionaliteit.
- Stel die rigtingregisterbit 1 van P1DIRREG as afvoer, of HOOG.
Lus:
Skryf HOOG na bit 0 van P1OUTREG -register om die Rooi LED aan te skakel
- Bel 'n vertragingsfunksie
- Skryf LOW tot bit 0 van P1OUTREG register om die Rooi LED uit te skakel
- Bel 'n vertragingsfunksie
- Herhaal lus
Watter invoer- / uitvoerfunksie (stel SEL0 en SEL1 op)
Baie van die penne op die LaunchPad het verskeie gebruike. Byvoorbeeld, dieselfde pen kan standaard digitale GPIO wees, of dit kan ook gebruik word in UART- of I2C -seriële kommunikasie.
Om 'n spesifieke funksie vir die pen te gebruik, moet u die funksie kies. U moet die funksie van die pen instel.
Daar is 'n prent hierbo vir hierdie stap wat probeer om hierdie konsep in visuele vorm te verduidelik.
Die SEL0- en SEL1 -adresse vorm 'n paarkombinasie wat dien as 'n soort funksie / funksie -keuse.
Vir ons doeleindes wil ons standaard digitale GPIO vir bit 0. Dit beteken dat ons bit 0 nodig het vir SEL0 en SEL1 om 'n LAAG te wees.
Poortprogrammeringsvolgorde (weer)
1. Skryf 0x00 na P1 SEL 0 Register (adres 0x40004C0A). Dit stel 'n LOW vir bit 0
2. Skryf 0x00 na P1 SEL 1 Register (adres 0x40004C0C). Dit stel 'n LOW vir bit 0, instelling vir GPIO.
3. Skryf 0x01 na P1 DIR Register (adres 0x40004C04). Dit stel 'n HOOG vir bit 0, wat UITPUT beteken.
4. Skakel die LED aan deur 'n 0x01 na P1 OUTPUT Register te skryf (adres 0x40004C02)
5. Doen 'n mate van vertraging (of net 'n enkele stap deur tydens ontfouting)
6. Skakel die LED uit deur 'n 0x00 na P1 OUTPUT Register te skryf (adres 0x40004C02)
7. Doen 'n mate van vertraging (of net 'n enkele stap deur tydens ontfouting)
8. Herhaal stappe 4 tot 7.
Die gepaardgaande video vir hierdie stap neem ons deur die hele proses in 'n lewendige demo, terwyl ons elke monteerinstruksie deurloop en deurloop, en die LED-aksie wys. Verskoon asseblief die lengte van die video.
Stap 3: Het u die een fout in die video opgelos?
In die video wat deur die hele proses van programmering en aansteek van die LED loop, was daar 'n ekstra stap in die hooflus, wat moontlik na die eenmalige inisialisering kon verskuif word.
Dankie dat u die tyd geneem het om deur hierdie instruksies te gaan.
Die volgende brei uit oor wat ons hier begin het.
Aanbeveel:
Desktop Pi hardeware vergadering: 12 stappe (met foto's)
Desktop Pi Hardware Assembly: ek vind die Raspberry Pi en die wêreld van enkelbordrekenaars (SBC's) fassinerend. Die integrasie van al die basiese komponente wat nodig is vir 'n tipiese rekenaar vir tuisgebruik in 'n kompakte en selfstandige stelsel, was 'n spelwisselaar vir hardeware en
Eenvoudige robotiese Arduino -arm: 5 stappe
Eenvoudige robotiese Arduino -arm: Hier sal ek jou wys hoe om 'n basiese arduino -robotarm te maak wat deur 'n potensiometer beheer word. Hierdie projek is ideaal om die basiese beginsels van arduino aan te leer, as u oorweldig word deur die hoeveelheid opsies op instruksies en nie weet waar u moet gaan nie
Robotiese servo -arm: 5 stappe
Robotiese servo -arm: Ons gaan 'n robuuste robotarm maak wat gewigte kan optel en beweeg. Kom ons begin met hierdie lekker dinge
DEEL 2 - GPIO ARM VERGADERING - RGB - FUNKSIE OPROEP - Skakelaars: 6 stappe
DEEL 2 - GPIO ARM -VERGADERING - RGB - FUNKSIEOPROEPE - 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 samestelling in plaas van C / C ++. In hierdie instruksies het ons sal iets soortgelyks doen - beheer 'n RGB -LED wat ook op die selfoon is
IOT123 - D1M BLOCK - ADS1115 Vergadering: 7 stappe (met foto's)
IOT123 - D1M BLOCK - ADS1115 Montage: D1M BLOCKS voeg tasbare kaste, etikette, polariteitsgidse en uitbrekings by vir die gewilde Wemos D1 Mini SOC/Shields/Clones. Een van die probleme met die ESP8266 -chip is dat dit slegs een analoog IO -pen beskikbaar het. Hierdie instruksie wys hoe u die ADS kan saamstel