Përmbajtje:

AVRSH: Shell i përkthyesit të komandës për Arduino/AVR .: 6 hapa (me fotografi)
AVRSH: Shell i përkthyesit të komandës për Arduino/AVR .: 6 hapa (me fotografi)

Video: AVRSH: Shell i përkthyesit të komandës për Arduino/AVR .: 6 hapa (me fotografi)

Video: AVRSH: Shell i përkthyesit të komandës për Arduino/AVR .: 6 hapa (me fotografi)
Video: AVR Shell Command Interpreter 2024, Korrik
Anonim
AVRSH: një Shell Interpretuesi i Komandës për Arduino/AVR
AVRSH: një Shell Interpretuesi i Komandës për Arduino/AVR

Keni dashur ndonjëherë të "regjistroheni" në mikrokontrolluesin tuaj AVR? A keni menduar ndonjëherë se do të ishte mirë të "mahnit" një regjistër për të parë përmbajtjen e tij? A keni kërkuar gjithmonë një mënyrë për të fuqizuar dhe fikur nën-sistemet periferike individuale të AVR ose Arduino tuaj në * kohë reale *? Edhe unë, kështu që kam shkruar AVR Shell, një guaskë e ngjashme me UNIX. UNshtë i ngjashëm me UNIX sepse të kujton llogarinë e guaskës që ke dalë dhe ke blerë për të drejtuar botët e tua të përplasjes, si dhe të kesh një ose dy komanda të përbashkëta. Ai gjithashtu ka një sistem skedarësh që i ngjan ekstfs UNIX, duke përdorur një EEPROM të jashtëm, por që është bërë një projekt më vete, kështu që unë do ta lëshoj atë modul veçmas nën një udhëzim tjetër kur të jetë gati për prodhim. Këtu keni një listë të gjërave që mund të bëni aktualisht me AVR Shell:

  • Lexoni të gjithë regjistrat tuaj të drejtimit të të dhënave (DDRn), portet dhe kunjat në kohë reale
  • Shkruajini të gjitha DDRn-ve, portave dhe kunjave tuaj për të ndezur motorët, LED-të ose sensorët e leximit në kohë reale
  • Listoni të gjithë regjistrat e njohur në sistem
  • Krijoni dhe ruani vlerat në ndryshoret e përcaktuara nga përdoruesit të mbështetura nga EEPROM.
  • Krijoni një fjalëkalim rrënjësor dhe vërtetoni kundër tij (përdoret për qasje në telnet)
  • Lexoni shpejtësinë e konfiguruar të orës së CPU
  • Ndryshoni shpejtësinë e orës së CPU -së tuaj duke vendosur një parashkrues
  • Filloni dhe ndaloni kohëmatësit 16-bit për kohën e gjërave të ndryshme
  • Ndizni dhe/ose fikni nën-sistemet periferike: Konvertuesit analogë në dixhitalë (ADC), ndërfaqen seriale periferike (SPI), ndërfaqen me dy tela (TWI/I2C), UART/USART. E dobishme kur doni të zvogëloni konsumin e energjisë të mikrokontrolluesit ose të aktivizoni funksione të caktuara.
  • Shkruar në C ++ me objekte të ripërdorshme.

Ky udhëzues do të ecë përmes instalimit, përdorimit dhe personalizimit të avrsh.

Hapi 1: Çfarë ju nevojitet

Ajo që do t'ju duhet
Ajo që do t'ju duhet

Ky udhëzues nuk kërkon shumë përveç që ju:

  • Keni një Arduino ose ATmega328P. AVR -të e tjera mund të funksionojnë, por mund t'ju duhet të modifikoni kodin për të listuar çdo regjistër që është unik për MCU -në tuaj. Emrat duhet të përputhen vetëm me atë që është e shënuar në skedarin e titullit unik për MCU -në tuaj. Shumë nga emrat e regjistrave janë të njëjtë midis AVR -ve, kështu që kilometrazhi juaj mund të ndryshojë kur transferoni.
  • Keni një mënyrë për t'u lidhur me USART serik të Arduino/AVR tuaj. Sistemi është testuar më së shumti me Terminalin AVR, një aplikacion Windows që bën një lidhje serike përmes portës tuaj USB ose COM. Punon me Arduinos duke përdorur lidhjen USB dhe çdo AVR duke përdorur USB-BUB nga Moderndevice.com. Opsionet e tjera të terminalit përfshijnë: Stuko, minicom (Linux dhe FreeBSD), ekran (Linux/FreeBSD), Hyperterminal, Teraterm. Kam gjetur që stuko dhe teratermi dërgojnë disa mbeturina kur lidheni, kështu që komanda juaj e parë mund të dëmtohet.
  • Instaloni dhe ekzekutoni firmware AVR Shell, të cilin mund ta shkarkoni nga këto faqe, ose gjithmonë merrni versionin më të fundit në BattleDroids.net.

Për të instaluar Terminalin AVR, thjesht shpaketojeni dhe drejtojeni. Për të instaluar firmware AVR Shell, shkarkojeni atë ose ngarkoni drejtpërdrejt skedarin gjashtëkëndësh dhe lidhni terminalin tuaj serik në 9600 baud, ose përpilojeni vetë me "make" dhe pastaj "bëni program" për të ngarkuar gjashtëkëndëshin. Shënim, mund t'ju duhet të ndryshoni cilësimet AVRDUDE për të pasqyruar portën tuaj COM. Shënim: Atributi PROGMEM është thyer në zbatimin aktual AVR GCC për C ++ dhe ky është një gabim i njohur. Nëse e përpiloni atë, prisni të merrni shumë mesazhe paralajmëruese që thonë "paralajmërim: vetëm variablat e inicializuar mund të vendosen në zonën e kujtesës së programit." Përveç që është i bezdisshëm për tu parë, ky paralajmërim është i padëmshëm. Meqenëse C ++ në platformën e ngulitur nuk është e lartë në listën e përparësive të AVR GCC, nuk dihet kur kjo do të rregullohet. Nëse e kontrolloni kodin, do të shihni se ku kam punuar për të zvogëluar këtë paralajmërim duke zbatuar deklaratat e mia të atributeve. Mjaft e thjeshtë. Shkarkoni dhe instaloni gjithçka që ju nevojitet për të përmbysur faqen dhe le të plasim.

Hapi 2: Leximi dhe Shkrimi i Regjistrave

Leximi dhe Shkrimi i Regjistrave
Leximi dhe Shkrimi i Regjistrave

Shell AVR u shkrua kryesisht për të hyrë në disa sensorë që i kisha lidhur me AVR tim. Filloi me një LED të thjeshtë, pastaj u zhvendos te sensorët e dritës, sensorët e temperaturës dhe më në fund te dy dhënës tejzanor. avrsh mund të vendosë komponentët digjitalë të këtyre sensorëve duke i shkruar në regjistrat që i kontrollojnë ato. Manipulimi i regjistrave AVR gjatë ekzekutimit Për të marrë një listë të të gjithë regjistrave të njohur në Arduino tuaj, shkruani:

shtyp regjistrat dhe do të merrni një printim që duket kështu

Unë di për regjistrat e mëposhtëm:

TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR Pinc EEDR Pind SREG EEARL GPIOR0 EEARH GPIOR1 GTCCR GPIOR2 TCCR0A TCCR0B TCNT0 OCR0A OCR0B SPCR SPDR ACSR SMCR MCUSR MCUCR SPMCSR WDTCSR CLKPR PRR OSCCAL PCICR EICRA PCMSK0 PCMSK1 TIMSK0 TIMSK1 TIMSK2 ADCL ADCH ADCSRA ADCSRB ADMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B ASSR TWBR TWSR TWAR TWDR TWCR TWAMR UCSR0A UCSR0B UCSR0C UBRR0L UBRR0H UDR0 PORTB root @ ATmega328p> Për të parë sesi janë vendosur bitët individualë në çdo regjistër, përdorni komandën cat ose echo

mace %GPIOR0 Këtu po i kërkoj përkthyesit të komandës të shfaqë, ose të bëjë jehonë, përmbajtjen e Regjistrit I/O të Qëllimit të Përgjithshëm #0. Vini re shenjën e përqindjes (%) para emrit të regjistrit. Ju duhet kjo për të treguar në shell se kjo është një fjalë kyçe e rezervuar që identifikon një regjistër. Dalja tipike nga një komandë echo duket kështu

GPIOR0 (0x0) e vendosur në [00000000] Dalja tregon emrin e regjistrit, vlerën heksadecimale të gjetur në regjistër dhe përfaqësimin binar të regjistrit (duke treguar secilin bit si 1 ose 0). Për të vendosur një bit të veçantë në çdo regjistër, përdorni operatorin "index of" . Për shembull, le të themi se dua bitin e tretë në 1

%GPIOR0 [3] = 1 dhe guaska do t'ju japë një përgjigje që tregon veprimin e saj dhe rezultatin

GPIOR0 (0x0) e vendosur në [00000000] (0x8) e vendosur në [00001000] Mos harroni shenjën e përqindjes për t'i thënë guaskës që po punoni me një regjistër. Gjithashtu vini re se duke vendosur bitin e tretë, kjo është 4 bit, sepse AVR-ja jonë përdor një indeks me bazë zero. Me fjalë të tjera, duke numëruar deri në bitin e tretë ju numëroni 0, 1, 2, 3, i cili është vendi i 4 -të, por biti i 3 -të. Ju mund të pastroni pak në të njëjtën mënyrë duke vendosur pak në zero. Duke vendosur copa të tilla, ju mund të ndryshoni funksionimin e AVR tuaj në fluturim. Për shembull, duke ndryshuar vlerën e përputhjes së kohëmatësit CTC që gjendet në OCR1A. Gjithashtu ju lejon të shikoni cilësimet e veçanta që do t'ju duheshin kontrolluar në mënyrë programore në kodin tuaj, siç është vlera UBBR për normën tuaj të baudit. Puna me DDRn, PORTn dhe PINn Kunjat I/O u caktohen gjithashtu regjistrave dhe mund të vendosen saktësisht në të njëjtën mënyrë, por është krijuar një sintaksë e veçantë për të punuar me këto lloje regjistrash. Në kod, ekziston një proces normal për, për shembull, ndezjen e një LED ose pajisje tjetër që kërkon një dixhital të lartë ose të ulët. Kërkon vendosjen e Regjistrit të Drejtimit të të Dhënave për të treguar që kunja është për dalje, dhe pastaj të shkruani 1 ose 0 në bitin e caktuar në portën e duhur. Duke supozuar se kemi një LED të lidhur me pinin digjital 13 (PB5) dhe duam ta ndezim, ja si ta bëni këtë ndërsa AVR juaj është duke funksionuar

vendosni pinin pb5 dalje shkruani pinin pb5 të lartë Prodhimi, përveç të qenit në gjendje të shihni LED tuaj të ndezur, do të duket kështu

root@ATmega328p> caktoni dalje pin pb5 Vendosni pb5 për outputroot@ATmega328p> shkruani pin pb5 të lartë Shkruani logjikë të lartë në pin pb5 "Rrënja@ATmega328p>" është kërkesa e guaskës që tregon se është gati të pranojë komandat nga ju. Për të fikur LED -in, thjesht do të shkruani një pikë të ulët në kunj. Nëse dëshironi të lexoni hyrjen dixhitale nga një kunj, përdorni komandën e leximit. Duke përdorur shembullin tonë të mësipërm

root@ATmega328p> lexoni pinin pb5Pin: pb5 është i LART Përndryshe, thjesht bëni jehonë regjistrit pin që kontrollon atë portë pin. Për shembull, nëse kemi ndërprerës të lidhur me pinin dixhital 7 dhe 8 (PD7 dhe PD8), mund të dërgoni komandën

jehonë %PIND dhe guaska do të shfaqte përmbajtjen e atij regjistri, duke ju treguar të gjitha gjendjet hyrëse/dalëse të pajisjeve të lidhura dhe nëse gjendja e ndërprerës ishte ndezur ose fikur.

Hapi 3: Leximi dhe Shkrimi i Siguresave

Leximi dhe Shkrimi i siguresave
Leximi dhe Shkrimi i siguresave

Siguresat janë lloje të veçanta të regjistrave. Ata kontrollojnë gjithçka, nga shpejtësia e orës së mikrokontrolluesit tuaj deri në metodat e programimit që janë në dispozicion për të shkruar-mbrojtur EEPROM. Ndonjëherë do t'ju duhet të ndryshoni këto cilësime, veçanërisht nëse jeni duke krijuar një sistem AVR të pavarur. Nuk jam i sigurt që duhet të ndryshoni cilësimet e siguresave në Arduino. Kini kujdes me siguresat tuaja; mund ta mbyllni veten nëse i vendosni gabimisht. Në një udhëzues të mëparshëm, unë demonstrova se si mund të lexoni dhe vendosni siguresat tuaja duke përdorur programuesin tuaj dhe avrdude. Këtu, unë do t'ju tregoj se si t'i lexoni siguresat tuaja në kohën e funksionimit për të parë se si i ka vendosur në të vërtetë MCU -ja juaj. Vini re, kjo nuk është cilësimi i kohës së përpilimit që merrni nga përkufizimet, por siguresat aktuale pasi MCU i lexon ato në kohën e funksionimit. Nga Tabela 27-9 në fletën e të dhënave ATmega328P (baza e të dhënave, më shumë si ajo) pjesët e Siguresës së Bajtit të Ulët janë si më poshtë:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Një gjë interesante për tu vënë në dukje është se me siguresat, 0 do të thotë të programuar dhe një 1 do të thotë që ai bit i veçantë është i paprogramuar. Disi kundër-intuitive, por sapo ta dini e dini.

  • CKDIV8 cakton që ora juaj e CPU -së të ndahet me 8. ATmega328P vjen nga fabrika e programuar për të përdorur oshilatorin e saj të brendshëm në 8MHz me CKDIV8 të programuar (dmth. Vendosur në 0) duke ju dhënë një frekuencë F_CPU ose CPU përfundimtare 1MHz. Në Arduino, kjo ndryshon pasi ato janë konfiguruar të përdorin një oshilator të jashtëm në 16MHz.
  • CKOUT kur programohet do të nxjerrë orën tuaj të CPU -së në PB0, e cila është pini dixhital 8 në Arduinos.
  • SUT [1..0] specifikon kohën e fillimit për AVR tuaj.
  • CKSEL [3..0] cakton burimin e orës, të tillë si oshilatori i brendshëm RC, oshilatori i jashtëm, etj.

Kur lexoni siguresat tuaja, do t'ju kthehet në mënyrë heksadecimale. Ky është formati që ju nevojitet nëse doni të shkruani siguresat përmes avrdude. Në arduino -n tim, ja çfarë marr kur lexoj bajtin e siguresës më të ulët:

root@ATmega328p> lexoni lfuse Siguresa e poshtme: 0xffPra, të gjitha bitet janë vendosur në 1. Bëra të njëjtën procedurë në një klon Arduino dhe mora të njëjtën vlerë. Duke kontrolluar një nga sistemet e mia AVR të pavarura, mora 0xDA e cila është vlera që kisha vendosur pak kohë para konfigurimit të çipit. E njëjta procedurë përdoret për të kontrolluar siguresat High Fuse, Extended Fuse Byte dhe Lock siguresat. Bajtët e siguresave të kalibrimit dhe nënshkrimit janë çaktivizuar në kod me një direktivë #if 0 të para -përpunuesit, të cilën mund ta ndryshoni nëse ndiheni të prishur.

Hapi 4: Komanda të tjera

Komandat e tjera
Komandat e tjera

Ekzistojnë disa komanda të tjera që interpretuesi i komandës së paracaktuar i kupton që mund t'i gjeni të dobishme. Ju mund të shihni të gjitha komandat e zbatuara dhe të lëshimit në të ardhmen duke lëshuar ndihmë ose menu në çast. Unë do t'i mbuloj shpejt këtu pasi ato janë kryesisht vetë-shpjeguese. Cilësimet e frekuencës së orës së CPU Mund të zbuloni se çfarë firmueri juaj është konfiguruar të përdorë si cilësimet e orës së CPU me komandën fcpu:

root@ATmega328p> fcpuCPU Frekuenca: 16000000Kjo është 16 milion, ose 16 milion herz, e njohur më shpesh si 16 MHz. Ju mund ta ndryshoni këtë në fluturim, për çfarëdo arsye, me komandën e orës. Ky komandë merr një argument: parashkruesin që duhet përdorur kur ndani shpejtësinë e orës tuaj. Komanda e orës i kupton këto vlera parashkruese:

  • ckdiv2
  • ckdiv4
  • ckdiv8
  • ckdiv16
  • ckdiv32
  • ckdiv64
  • ckdiv128
  • ckdiv256

Duke përdorur komandën:

ora ckdiv2 kur shpejtësia juaj e procesorit është 16MHz do të rezultojë që shpejtësia e orës tuaj të ndryshojë në 8MHz. Përdorimi i një parashkruesi të ckdiv64 me një shpejtësi fillestare të orës 16MHz do të rezultojë në një shpejtësi përfundimtare të orës prej 250 KHz. Pse në Tokë do të donit ta bëni MCU -në tuaj më të ngadaltë? Epo, për një, një shpejtësi më e ulët e orës konsumon më pak energji dhe nëse MCU -ja juaj po mbaron nga një bateri në një rrethim të projektit, mund të mos keni nevojë që ajo të funksionojë me shpejtësinë maksimale, dhe për këtë arsye, mund të ulë shpejtësinë dhe të zvogëlojë konsumin e energjisë së saj, duke rritur jetën e baterisë. Gjithashtu, nëse jeni duke përdorur orën për çdo lloj problemi kohor me një MCU tjetër, të themi, duke zbatuar një softuer UART ose ndonjë gjë të tillë, ju mund të dëshironi ta vendosni atë në një vlerë të veçantë që është e lehtë për të marrë një normë të mirë edhe të baud me norma më të ulëta të gabimeve. Ngritja dhe Çaktivizimi i Nën-Sistemeve Periferike Në të njëjtën shënim si zvogëlimi i konsumit të energjisë të përmendur më parë, ju mund të dëshironi të zvogëloni më tej fuqinë duke fikur disa nga periferikët në bord që nuk po përdorni. Përkthyesi i komandës dhe guaska aktualisht mund të fuqizohen dhe të fiken periferikët e mëposhtëm:

  • Konvertues analog-dixhital (ADC). Kjo pajisje periferike përdoret kur keni një sensor analog që jep të dhëna (si temperatura, drita, nxitimi, etj.) Dhe keni nevojë ta konvertoni atë në një vlerë dixhitale.
  • Ndërfaqja seriale periferike (SPI). Autobusi SPI përdoret për të komunikuar me pajisje të tjera të aktivizuara me SPI, si kujtime të jashtme, drejtues LED, ADC të jashtëm, etj. Pjesë të SPI përdoren për programimin e ISP, ose të paktën kunjat janë, kështu që kini kujdes kur e mbyllni këtë nëse programoni përmes ISP -së.
  • Ndërfaqe me dy tela. Disa pajisje të jashtme përdorin autobusin I2C për të komunikuar, megjithëse këto po zëvendësohen me shpejtësi nga pajisjet e aktivizuara me SPI pasi SPI ka një xhiros më të madhe.
  • USART. Kjo është ndërfaqja juaj serike. Ju ndoshta nuk doni ta fikni këtë nëse jeni të lidhur me AVR përmes lidhjes serike! Sidoqoftë, e shtova këtu si një skelet për të transferuar në pajisjet që kanë shumë USART si ATmega162 ose ATmega644P.
  • te gjitha Ky argument për komandën powerup ose powerdown ndiz të gjitha pajisjet periferike të përmendura ose i fik të gjitha me një komandë. Përsëri, përdorni këtë komandë me mençuri.

root@ATmega328p> powerdown twiPowerdown of twi complete.root@ATmega328p> powerup twiPërforcimi i twi i plotë.

Fillimi dhe ndalimi i kohëmatësve Shell ka një kohëmatës të integruar 16-bit që është i disponueshëm për përdorim. Ju filloni kohëmatësin me komandën e kohëmatësit:

fillimi i kohëmatësitdhe ndaloni kohëmatësin me argumentin e ndalimit

ndalesa e kohëmatësitKy kohëmatës nuk bie ndesh me kohëmatësin e brendshëm USART. Shikoni kodin për detajet e zbatimit të kohëmatësit USART, nëse ju intereson ky lloj detaji i keq

root@ATmega328p> kohëmatësi i filluar Filloi timer.root@ATmega328p> kohëmatësi i ndaluar Koha e kaluar: ~ 157 sekonda Vërtetimi Shell mund të ruajë një fjalëkalim me 8 karaktere në EEPROM. Ky mekanizëm fjalëkalimi u krijua për të mbështetur aftësitë e hyrjes në telnet, por mund të zgjerohet për të mbrojtur gjëra të tjera. Për shembull, mund të kërkoni komanda të caktuara, si ndryshimi i vlerave të regjistrit, përmes mekanizmit të vërtetimit. Vendosni fjalëkalimin me komandën e fjalëkalimit

root@ATmega328p> passwd blah Shkruani fjalëkalimin e rrënjës në EEPROMAutorizoni kundër fjalëkalimit (ose kërkoni autorizim programor përmes kodit) me komandën autor. Vini re, nëse përpiqeni të ndryshoni fjalëkalimin rrënjë dhe tashmë është vendosur një fjalëkalim rrënjë, duhet të autorizoni veten kundër fjalëkalimit të vjetër para se të lejoheni ta ndryshoni atë në një fjalëkalim të ri

root@ATmega328p> passwd blinky Ju duhet të autorizoni veten në radhë të parë.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinky Shkruani fjalëkalim të ri të rrënjës në EEPROMSigurisht, do t'ju duhet të ngarkoni skedarin avrsh.eep nëse fshini firmware -in për të rivendosur vlerat dhe ndryshoret tuaja të vjetra. Makefile do të krijojë skedarin EEPROM për ju. Variablat Shell kupton nocionin e ndryshoreve të përcaktuara nga përdoruesi. Kodi e kufizon këtë në 20, por ju mund ta ndryshoni atë nëse ju pëlqen duke ndryshuar përcaktimin MAX_VARIABLES në skriptin.h. Ju mund të ruani çdo vlerë 16-bit (domethënë çdo numër deri në 65, 536) në një ndryshore që do të kujtohet më vonë. Sintaksa është e ngjashme me regjistrat, përveçse një shenjë dollari ($) përdoret për të treguar ndryshoret në guaskë. Listoni të gjitha ndryshoret tuaja me komandën e ndryshoreve të printimit

variablat e printimit Ndryshoret e përcaktuara nga përdoruesi: Emri i indeksit -> Vlera (01): $ FALAS $ -> 0 (02): $ FALAS $ -> 0 (03): $ FALAS $ -> 0 (04): $ FALAS $ -> 0 (05): $ FALAS $ -> 0 (06): $ FALAS $ -> 0 (07): $ FALAS $ -> 0 (08): $ FALAS $ -> 0 (09): $ FALAS $ -> 0 (10): $ FALAS $ -> 0 (11): $ FALAS $ -> 0 (12): $ FALAS $ -> 0 (13): $ FALAS $ -> 0 (14): $ FALAS $ -> 0 (15): $ FALAS $ -> 0 (16): $ FALAS $ -> 0 (17): $ FALAS $ -> 0 (18): $ FALAS $ -> 0 (19): $ FALAS $ -> 0 (20): $ FALAS $ -> 0Kompletuar. Vendosni një ndryshore

$ newvar = 25 $ timeout = 23245Merrni vlerën e një ndryshoreje të caktuar

root@ATmega328p> jehonë $ newvar $ newvar 25Ju mund të shihni se cilat variabla aktualisht keni krijuar me komandën e printimit që tashmë i njihni

Ndryshoret e përcaktuara nga përdoruesi: Emri i Indeksit -> Vlera (01): newvar -> 25 (02): timeout -> 23245 (03): $ FALAS $ -> 0 (04): $ FALAS $ -> 0 (05): $ FALAS $ -> 0 (06): $ FALAS $ -> 0 (07): $ FALAS $ -> 0 (08): $ FALAS $ -> 0 (09): $ FALAS $ -> 0 (10): $ FALAS $ -> 0 (11): $ FALAS $ -> 0 (12): $ FALAS $ -> 0 (13): $ FALAS $ -> 0 (14): $ FALAS $ -> 0 (15): $ FALAS $ -> 0 (16): $ FALAS $ -> 0 (17): $ FALAS $ -> 0 (18): $ FALAS $ -> 0 (19): $ FALAS $ -> 0 (20): $ FALAS $ -> 0Kompletuar. Emri $ FALAS $ thjesht tregon se ajo vendndodhje e ndryshueshme është falas dhe nuk i është caktuar ende një emër variabli.

Hapi 5: Përshtatja e Shell

Përshtatja e Shell
Përshtatja e Shell

Ju jeni të lirë të hakoni kodin dhe ta rregulloni atë sipas nevojave tuaja, nëse dëshironi. Nëse do ta kisha ditur që do ta lëshoja këtë kod, do të kisha bërë një klasë të veçantë të interpretuesit të komandës dhe strukturën e komandës dhe thjesht do të përsërisja përmes kësaj thirrjeje të një treguesi të funksionit. Kjo do të zvogëlonte sasinë e kodit, por ashtu siç qëndron, shell analizon vijën e komandës dhe thërret metodën e duhur të shell. Për të shtuar komandat tuaja të personalizuara, bëni sa më poshtë: 1. Shtoni komandën tuaj në listën e analizës Parser komandës do analizoni vijën e komandës dhe ju jap komandën dhe çdo argument veç e veç. Argumentet kalohen si tregues tek treguesit, ose një grup treguesish, megjithatë ju pëlqen të punoni me ta. Kjo gjendet në shell.cpp. Hapni shell.cpp dhe gjeni metodën ExecCmd të klasës AVRShell. Ju mund të dëshironi të shtoni komandën në kujtesën e programit. Nëse e bëni këtë, shtoni komandën në progmem.h dhe progmem.cpp. Ju mund të shtoni komandën në programin e kujtesës direkt duke përdorur PSTR () makro, por do të gjeneroni një paralajmërim tjetër të llojit të përmendur më parë. Përsëri, ky është një gabim i njohur që punon me C ++, por ju mund ta kapërceni këtë duke shtuar komandën direkt në skedarët e programeve.*, Siç kam bërë unë. Nëse nuk e keni problem të shtoni në përdorimin tuaj SRAM, mund të shtoni komandën siç e kam ilustruar me komandën "orë". Thuaj që dëshironi të shtoni një komandë të re të quajtur "newcmd". Shkoni te AVRShell:: ExecCmd dhe gjeni një vend të përshtatshëm për të futur kodin e mëposhtëm:

tjetër nëse (! strcmp (c, "newcmd")) cmdNewCmd (args);Kjo do të shtojë komandën tuaj dhe do të thërrasë metodën cmdNewCmd që do të shkruani në hapin tjetër. 2. Shkruani kodin tuaj të komandës me porosi Në të njëjtin skedar, shtoni kodin tuaj të komandës me porosi. Ky është përcaktimi i metodës. Ju ende do të dëshironi të shtoni deklaratën në shell.h. Thjesht shtojeni atë në komandat e tjera. Në shembullin e mëparshëm, kodi mund të duket diçka si kjo

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("Komanda juaj është %s / r / n", args [0]); WriteRAM (buff);}Ka disa gjëra këtu. Së pari, "buff" është një tampon i grupit me 40 karaktere i dhënë në kodin për përdorimin tuaj. Ne përdorim versionin e kujtesës së programit të sprintf pasi ne po e kalojmë atë një PSTR. Nëse dëshironi, mund të përdorni versionin e zakonshëm, por sigurohuni që të mos e kaloni formatin në një PSTR. Gjithashtu, argumentet janë në grup args. Nëse keni shtypur "newcmd arg1 arg2" ju mund të merrni në këto argumente me args [0] dhe args [1] nënshkrimet. Mund të kaloni një maksimum prej MAX_ARGS argumentesh, siç përcaktohet në kod. Ndjehuni të lirë ta ndryshoni atë vlerë kur rikompiloni nëse keni nevojë për shumë argumente të tjerë që të kalohen njëherësh. WriteLine dhe WriteRAM janë funksione globale që kthejnë metodat e UART me të njëjtin emër. Argumenti i dytë për këtë funksion është i nënkuptuar. Nëse nuk kaloni asgjë, një komandë e shpejtë do të shkruhet më pas. Nëse kaloni një 0 si argumenti i dytë, një kërkesë nuk do të shkruhet. Kjo është e dobishme kur doni të shkruani disa vargje të veçanta në dalje para se komanda e komandës t'i kthehet përdoruesit. 3. Bëni shell -in të ekzekutojë kodin e komandës Ju tashmë i keni thënë ekzekutuesit të shell -it që të ekzekutojë metodën cmdNewCmd kur konfiguroni komandën e re, por shtojeni atë në skedarin shell.h për ta kuptuar atë nga objekti shell. Thjesht shtojeni atë nën komandën e fundit ose para komandës së parë, ose kudo atje. Dhe kjo është ajo. Ripërpiloni dhe ngarkoni firmware -in në Arduino -n tuaj dhe komanda juaj e re është e disponueshme nga guaska menjëherë.

Hapi 6: Përmbledhje

Ju duhet të dini se si të instaloni dhe lidheni me AVR/Arduino tuaj dhe të merrni një njoftim të drejtpërdrejtë në mikrokontrolluesin tuaj të funksionuar. Ju dini disa komanda që do të tërheqin të dhënat e ekzekutimit nga MCU ose do të vendosin vlera në MCU në fluturim. Gjithashtu ju është treguar se si të shtoni kodin tuaj personal për të krijuar komandat tuaja unike në shell për ta personalizuar më tej atë për nevojat tuaja. Ju madje mund të nxisni përkthyesin e komandës që ai të përmbajë vetëm komandat tuaja të personalizuara, nëse kjo i përshtatet nevojave tuaja. Shpresoj që të keni shijuar këtë udhëzues dhe se AVR Shell mund të jetë i dobishëm për ju, ose si një përkthyes komandash në kohë reale ose si një proces mësimi në zbatimin tuaj. Si gjithmonë, mezi pres çdo koment apo sugjerim se si mund të përmirësohet ky udhëzues! Argëtohuni me AVR tuaj!

Recommended: