Obsah:

AVRSH: shell príkazového tlmočníka pre Arduino/AVR .: 6 krokov (s obrázkami)
AVRSH: shell príkazového tlmočníka pre Arduino/AVR .: 6 krokov (s obrázkami)

Video: AVRSH: shell príkazového tlmočníka pre Arduino/AVR .: 6 krokov (s obrázkami)

Video: AVRSH: shell príkazového tlmočníka pre Arduino/AVR .: 6 krokov (s obrázkami)
Video: PHP Syntax 2024, Júl
Anonim
AVRSH: shell príkazového tlmočníka pre Arduino/AVR
AVRSH: shell príkazového tlmočníka pre Arduino/AVR

Chceli ste niekedy byť „prihlásení“do svojho mikrokontroléra AVR? Uvažovali ste niekedy o tom, že by bolo skvelé „mačkovať“register, aby ste videli jeho obsah? Vždy ste chceli spôsob, ako napájať a vypínať jednotlivé periférne podsystémy vášho AVR alebo Arduina v * reálnom čase *? Ja tiež, preto som napísal AVR Shell, shell podobný UNIXu. Je podobný UNIXu, pretože pripomína účet shell, ktorý ste si kúpili a kúpili na spustenie svojich robotov na zrážku irc nick, a tiež jeden alebo dva spoločné príkazy. Má tiež súborový systém, ktorý sa podobá súborom UNIX extfs, pomocou externej EEPROM, ale to sa stalo projektom samo o sebe, takže keď bude modul pripravený na produkciu, vydám tento modul oddelene pod iným pokynom. Tu je zoznam vecí, ktoré môžete v súčasnej dobe robiť s AVR Shell:

  • Prečítajte si všetky svoje smerovače údajov (DDRn), porty a piny v reálnom čase
  • Zapisujte si všetky svoje pamäte DDRn, porty a piny a zapnite motory, LED diódy alebo snímače v reálnom čase
  • Vytvorte zoznam všetkých známych registrov v systéme
  • Vytvárajte a ukladajte hodnoty do premenných definovaných používateľom zálohovaných pomocou pamäte EEPROM.
  • Vytvorte heslo root a autentifikujte sa proti nemu (používa sa na prístup k telnetu)
  • Prečítajte si nakonfigurovanú rýchlosť procesora
  • Zmeňte rýchlosť svojho procesora nastavením predvoľby
  • Spustite a zastavte 16-bitové časovače na načasovanie rôznych vecí
  • Napájanie a/alebo vypínanie periférnych subsystémov: analógovo-digitálne prevodníky (ADC), sériové periférne rozhranie (SPI), dvojvodičové rozhranie (TWI/I2C), UART/USART. Je to užitočné vtedy, keď chcete znížiť spotrebu energie mikrokontroléra alebo povoliť určité funkcie.
  • Napísané v C ++ s opakovane použiteľnými objektmi.

Tento návod vás prevedie inštaláciou, používaním a prispôsobením programu avrsh.

Krok 1: Čo budete potrebovať

Čo budete potrebovať
Čo budete potrebovať

Tento návod nevyžaduje veľa, okrem toho, že:

  • Máte Arduino alebo ATmega328P. Fungovať môžu aj iné AVR, ale možno budete musieť kód upraviť tak, aby uvádzal všetky registre, ktoré sú jedinečné pre váš MCU. Mená sa musia zhodovať iba s názvami uvedenými v hlavičkovom súbore jedinečnom pre váš MCU. Mnoho názvov registrov je medzi AVR rovnakých, takže sa počet najazdených kilometrov môže pri prenose líšiť.
  • Nájdite spôsob, ako sa pripojiť k sériovému USART vášho Arduino/AVR. Systém bol testovaný najrozsiahlejšie s AVR Terminal, aplikáciou pre Windows, ktorá vytvára sériové pripojenie prostredníctvom vášho portu USB alebo COM. Funguje s Arduinos pomocou USB pripojenia a akýmkoľvek AVR pomocou USB-BUB od Moderndevice.com. Medzi ďalšie možnosti terminálu patria: Putty, minicom (Linux a FreeBSD), obrazovka (Linux/FreeBSD), Hyperterminál, Teraterm. Zistil som, že tmel a teraterm po pripojení posielajú nejaké odpadky, takže váš prvý príkaz môže byť skomolený.
  • Nechajte si nainštalovať a spustiť firmvér AVR Shell, ktorý si môžete stiahnuť z týchto stránok, alebo vždy získať najnovšiu verziu na BattleDroids.net.

Ak chcete nainštalovať terminál AVR, stačí ho rozbaliť a spustiť. Ak chcete nainštalovať firmvér AVR Shell, stiahnite si ho a buď priamo nahrajte hexadecimálny súbor a pripojte sériový terminál na 9600 baudov, alebo ho skompilovajte sami „make“a potom „make program“na nahranie hexu. Upozorňujeme, že možno budete musieť zmeniť nastavenia AVRDUDE tak, aby zodpovedali vášmu portu COM. Poznámka: Atribút PROGMEM je v súčasnej implementácii AVR GCC pre C ++ poškodený a je to známa chyba. Ak ho skompilováte, očakávajte veľa varovných hlásení s upozornením „varovanie: do oblasti pamäte programu je možné umiestniť iba inicializované premenné“. Okrem toho, že je toto varovanie nepríjemné, je neškodné. Pretože C ++ na vstavanej platforme nie je na zozname priorít AVR GCC, nie je známe, kedy to bude opravené. Ak sa pozriete na kód, uvidíte, kde som pracoval na obmedzení tohto varovania implementáciou vlastných vyhlásení o atribútoch. Docela jednoduché. Stiahnite si a nainštalujte všetko, čo budete potrebovať, potom prevráťte stránku a začneme pracovať.

Krok 2: Registre na čítanie a zápis

Registre na čítanie a zápis
Registre na čítanie a zápis

Shell AVR bol napísaný predovšetkým kvôli prístupu k niektorým senzorom, ktoré som pripojil k svojmu AVR. Začalo sa to jednoduchou diódou LED, potom sa prešlo na svetelné senzory, snímače teploty a nakoniec na dva ultrazvukové prevodníky. avrsh môže nastaviť digitálne komponenty týchto senzorov zápisom do registrov, ktoré ich ovládajú. Manipulácia s registrom AVR za chodu Ak chcete získať zoznam všetkých známych registrov vo vašom Arduine, zadajte:

tlačové registre a dostanete výtlačok, ktorý vyzerá takto

Viem o nasledujúcich registroch:

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 ZPS SPDR ACSR smeru 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 OCR2A OCR2B ASSR Ak chcete vidieť, ako sú jednotlivé bity nastavené v ľubovoľnom registri, použite príkaz mačka alebo ozvena

mačka %GPIOR0 Tu žiadam tlmočník príkazov, aby zobrazil alebo zopakoval obsah registra I/O univerzálneho účelu č. 0. Všimnite si znak percenta (%) pred názvom registra. Potrebujete to, aby ste shellu naznačili, že ide o vyhradené kľúčové slovo identifikujúce register. Typický výstup z príkazu echo vyzerá takto

GPIOR0 (0x0) nastavený na [00000000] Na výstupe je uvedený názov registra, hexadecimálna hodnota nájdená v registri a binárna reprezentácia registra (každý bit je zobrazený ako 1 alebo 0). Ak chcete nastaviť konkrétny bit v ľubovoľnom registri, použite operátor „index“. Povedzme napríklad, že chcem tretí bit na 1

%GPIOR0 [3] = 1 a shell vám odpovie, že je to akcia a výsledok

GPIOR0 (0x0) nastavený na [00000000] (0x8) nastavený na [00001000] Nezabudnite na znak percenta, aby ste shellu povedali, že pracujete s registrom. Všimnite si tiež, že nastavením 3. bitu sú to 4 bity, pretože naše AVR používajú index založený na nule. Inými slovami, počítaním do 3. bitu počítate 0, 1, 2, 3, čo je 4. miesto, ale 3. bit. Trochu môžete vymazať rovnakým spôsobom tým, že nastavíte bit na nulu. Nastavením týchto bitov môžete za chodu zmeniť fungovanie svojho AVR. Napríklad zmenou hodnoty zhody časovača CTC nájdenej v OCR1A. Umožňuje vám tiež nahliadnuť do konkrétnych nastavení, ktoré by ste museli programovo skontrolovať vo svojom kóde, ako je napríklad hodnota UBBR pre vašu prenosovú rýchlosť. Práca s DDRn, PORTn a PINn Vstupno -výstupné piny sú tiež priradené k registrom a dajú sa nastaviť úplne rovnakým spôsobom, ale na prácu s týmito typmi registrov bola vytvorená špeciálna syntax. V kóde existuje normálny proces, povedzme, zapnutie diódy LED alebo iného zariadenia, ktoré vyžaduje digitálne zvýšenie alebo zníženie. Vyžaduje nastavenie Registra smeru údajov tak, aby indikoval, že pin je na výstup, a potom zapísanie 1 alebo 0 na konkrétny bit na správny port. Za predpokladu, že máme diódu LED pripojenú na digitálny pin 13 (PB5) a chceme ju zapnúť, postupujte takto, keď je váš AVR spustený

nastavte pin pb5 outputwrite pin pb5 vysoký Výstup okrem toho, že uvidíte, ako sa rozsvieti vaša LED dióda, bude vyzerať takto

root@ATmega328p> nastaviť výstup pin pb5 Nastaviť pb5 pre výstup root@ATmega328p> napísať pin pb5 high Zapísať logiku high to pin pb5 "Root@ATmega328p>" je výzva shellu, ktorá naznačuje, že je pripravený prijímať príkazy od vás. Ak chcete LED vypnúť, jednoducho by ste na kolík zapísali nízky. Ak chcete čítať digitálny vstup z pinu, použite príkaz na čítanie. Použitím nášho vyššie uvedeného príkladu

root@ATmega328p> čítajte pin pb5Pin: pb5 je VYSOKÝ Prípadne stačí zopakovať register pinov, ktorý ovláda tento pinový port. Ak napríklad máme prepínače prepínača pripojené k digitálnemu pinu 7 a 8 (PD7 a PD8), môžete odoslať príkaz

echo %PIND a shell by potom zobrazil obsah tohto registra a ukázal vám všetky vstupné/výstupné stavy pripojených zariadení a či bol stav prepínača zapnutý alebo vypnutý.

Krok 3: Poistky na čítanie a písanie

Poistky na čítanie a písanie
Poistky na čítanie a písanie

Poistky sú špeciálne typy registrov. Ovládajú všetko od rýchlosti hodín vášho mikrokontroléra po to, aké metódy programovania sú k dispozícii na ochranu pamäte EEPROM proti zápisu. Niekedy budete musieť tieto nastavenia zmeniť, najmä ak vytvárate samostatný systém AVR. Nie som si istý, či by ste mali zmeniť nastavenia poistiek na Arduine. Buďte opatrní so svojimi poistkami; Ak ich nastavíte nesprávne, môžete sa zablokovať. V predchádzajúcom návode som ukázal, ako môžete čítať a nastavovať svoje poistky pomocou programátora a avrdude. Tu vám ukážem, ako čítať vaše poistky za chodu, aby ste zistili, ako ich váš MCU skutočne nastavil. Všimnite si toho, že toto nie je nastavenie času kompilácie, ktoré získate z definícií v, ale skutočné poistky, ako ich MCU číta za behu. Z tabuľky 27-9 v technickom liste ATmega328P (údajový list, jemu podobnejšie) sú bity Fuse Low Byte nasledujúce:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Zaujímavou vecou je, že pri poistkách 0 znamená naprogramované a 1 znamená, že konkrétny bit nie je naprogramovaný. Trochu neintuitívne, ale keď to poznáte, poznáte to.

  • CKDIV8 nastaví delenie hodín CPU na 8. ATmega328P pochádza z výrobného závodu naprogramovaného tak, aby používal svoj interný oscilátor na 8 MHz s naprogramovaným CKDIV8 (tj. Nastaveným na 0), čím získate konečnú frekvenciu F_CPU alebo CPU 1 MHz. Na Arduino sa to zmenilo, pretože sú nakonfigurované tak, aby používali externý oscilátor na 16 MHz.
  • Keď je CKOUT naprogramovaný, vyvedie hodiny vášho CPU na PB0, čo je digitálny pin 8 na Arduinos.
  • SUT [1..0] určuje čas spustenia vášho AVR.
  • CKSEL [3..0] nastavuje zdroj hodín, ako je interný RC oscilátor, externý oscilátor atď.

Keď prečítate svoje poistky, vráti sa vám to v hexadecimálnom formáte. Toto je formát, ktorý potrebujete, ak chcete napísať poistky prostredníctvom avrdude. Na mojom arduine dostanem toto, keď prečítam dolný poistkový bajt:

root@ATmega328p> prečítajte lfuse Spodná poistka: 0xffVšetky bity sú teda nastavené na 1. Rovnaký postup som urobil na klone Arduino a získal som rovnakú hodnotu. Pri kontrole jedného z mojich samostatných systémov AVR som dostal 0xDA, čo je hodnota, ktorú som už nejaký čas nastavil pri konfigurácii čipu. Rovnaký postup sa používa pri kontrole poistiek High Fuse Byte, Extended Fuse Byte a Lock. Bajty kalibrácie a podpisovej poistky boli v kóde deaktivované smernicou o preprocesore #if 0, ktorú môžete zmeniť, ak sa budete cítiť skúpo.

Krok 4: Ostatné príkazy

Ostatné príkazy
Ostatné príkazy

Existuje niekoľko ďalších príkazov, ktoré predvolený interpret príkazov chápe ako užitočné. Všetky implementované príkazy a príkazy budúcej verzie môžete zobraziť vydaním pomoci alebo ponuky na výzve. Rýchlo ich tu uvediem, pretože sú väčšinou samovysvetľujúce. Nastavenia frekvencie hodín CPU Môžete zistiť, čo bol váš firmvér nakonfigurovaný na použitie ako nastavenia hodín CPU, pomocou príkazu fcpu:

root@ATmega328p> Frekvencia fcpuCPU: 16000000To je 16 miliónov alebo 16 miliónov herzov, bežnejšie známych ako 16 MHz. Môžete to zmeniť za behu, z akéhokoľvek dôvodu, pomocou príkazu hodín. Tento príkaz má jeden argument: prescaler, ktorý sa má použiť pri delení rýchlosti hodín. Príkaz hodiny rozumie týmto hodnotám predzvárača:

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

Pomocou príkazu:

hodiny ckdiv2 keď je rýchlosť vášho procesora 16 MHz, dôjde k zmene rýchlosti hodín na 8 MHz. Použitie prescaleru ckdiv64 s počiatočnou rýchlosťou 16 MHz bude mať konečný takt 250 KHz. Prečo by ste na Zemi chceli spomaliť svoj MCU? Po prvé, nižší takt spotrebuje menej energie a ak máte v MCU vybitú batériu v projektovom puzdre, nemusí byť potrebné, aby bežal na maximálnu rýchlosť, a preto by mohol znížiť rýchlosť a znížiť spotrebu energie., čím sa zvyšuje životnosť batérie. Tiež, ak používate hodiny na akékoľvek problémy s načasovaním s iným MCU, povedzme, implementáciou softvérového UART alebo niečoho podobného, môžete ho nastaviť na konkrétnu hodnotu, pomocou ktorej je ľahké dosiahnuť peknú dokonca prenosovú rýchlosť s nižšia chybovosť. Zapínanie a vypínanie periférnych podsystémov Na základe vyššie uvedenej zásady zníženia spotreby energie by ste mali možno ešte viac znížiť výkon vypnutím niektorých zabudovaných periférií, ktoré nepoužívate. Tlmočník príkazov a shell môžu v súčasnosti zapínať a vypínať nasledujúce periférie:

  • Analógovo-digitálny prevodník (ADC). Táto periféria sa používa, ak máte analógový snímač poskytujúci údaje (ako je teplota, svetlo, zrýchlenie atď.) A potrebujete ich previesť na digitálne hodnoty.
  • Sériové periférne rozhranie (SPI). Zbernica SPI sa používa na komunikáciu s inými zariadeniami s podporou SPI, ako sú externé pamäte, ovládače LED, externé ADC atď. Časti SPI sa používajú na programovanie ISP alebo aspoň piny, takže pri vypínaní buďte opatrní ak programujete cez ISP.
  • Dvojvodičové rozhranie. Niektoré externé zariadenia používajú na komunikáciu zbernicu I2C, aj keď sú rýchlo nahradené zariadeniami s podporou SPI, pretože SPI má väčšiu priepustnosť.
  • USART. Toto je vaše sériové rozhranie. Ak ste k AVR pripojení prostredníctvom sériového pripojenia, pravdepodobne to nechcete vypnúť! Tu som to však pridal ako kostru pre prenos na zariadenia, ktoré majú viacero USART, ako napríklad ATmega162 alebo ATmega644P.
  • všetky. Tento argument príkazu powerup alebo powerdown zapne všetky uvedené periférne zariadenia alebo ich všetky vypne jedným príkazom. Tento príkaz znova používajte múdro.

root@ATmega328p> powerdown twiPowerdown of twi Complete.root@ATmega328p> powerup twiPowerup of twi Complete.

Časovače na spustenie a zastavenie Plášť má vstavaný 16-bitový časovač, ktorý je k dispozícii na použitie. Časovač spustíte príkazom časovača:

spustenie časovačaa zastavte časovač argumentom stop

zastavenie časovačaTento časovač nebude v rozpore s interným časovačom USART. Ak vás tento druh krutých podrobností zaujíma, pozrite si kód pre podrobnosti o implementácii časovača USART

root@ATmega328p> spustenie časovača Spustené timer.root@ATmega328p> zastavenie časovača Uplynutý čas: ~ 157 sekúnd Autentifikácia Shell môže do EEPROM uložiť 8-znakové heslo. Tento mechanizmus hesla bol vytvorený na podporu možností prihlásenia do telnetu, ale mohol byť rozšírený tak, aby chránil ďalšie veci. Prostredníctvom mechanizmu autentifikácie môžete napríklad vyžadovať určité príkazy, napríklad zmenu hodnôt registra. Heslo zadajte pomocou príkazu heslo

root@ATmega328p> passwd blah Zapíšte heslo root do EEPROMAutorizujte proti heslu (alebo vyžadujte autorizáciu programovo prostredníctvom kódu) pomocou príkazu auth. Upozorňujeme, že ak sa pokúsite zmeniť heslo používateľa root a heslo root je už nastavené, musíte sa autorizovať voči starému heslu a až potom ho môžete zmeniť na nové heslo.

root@ATmega328p> passwd blinky Najprv sa musíte autorizovať.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinky Napísať NOVÉ heslo root do EEPROMAk vymažete firmvér, aby ste obnovili svoje staré hodnoty a premenné, budete samozrejme musieť načítať súbor avrsh.eep. Makefile pre vás vytvorí súbor EEPROM. Premenné Shell rozumie pojmu užívateľom definovaných premenných. Kód to obmedzuje na 20, ale môžete to zmeniť, ak chcete, zmenou definície MAX_VARIABLES v script.h. Môžete uložiť ľubovoľnú 16-bitovú hodnotu (tj. Akékoľvek číslo až do 65, 536) do premennej, ktorá sa má vyvolať neskôr. Syntax je podobná registrom, ibaže na označenie premenných v shelli sa používa znak dolára ($). Vytvorte zoznam všetkých svojich premenných pomocou príkazu print variables

tlačené premenné Užívateľom definované premenné: Názov indexu -> Hodnota (01): $ ZDARMA $ -> 0 (02): $ ZADARMO $ -> 0 (03): $ ZADARMO $ -> 0 (04): $ ZADARMO -> 0 (05): $ ZDARMA $ -> 0 (06): $ ZADARMO $ -> 0 (07): $ ZADARMO $ -> 0 (08): $ ZADARMO $ -> 0 (09): $ ZADARMO $ -> 0 (10): $ ZDARMA $ -> 0 (11): $ ZADARMO $ -> 0 (12): $ ZADARMO $ -> 0 (13): $ ZADARMO $ -> 0 (14): $ ZADARMO $ -> 0 (15): $ ZADARMO $ -> 0 (16): $ ZADARMO $ -> 0 (17): $ ZADARMO $ -> 0 (18): $ ZADARMO $ -> 0 (19): $ ZADARMO $ -> 0 (20): $ ZADARMO $ -> 0 Dokončené. Nastavte premennú

$ newvar = 25 $ časový limit = 23245Získajte hodnotu danej premennej

root@ATmega328p> echo $ newvar $ newvar 25Pomocou príkazu print, ktorý už poznáte, môžete vidieť, aké všetky premenné ste v súčasnosti vytvorili

Užívateľom definované premenné: Index Name -> Hodnota (01): newvar -> 25 (02): timeout -> 23245 (03): $ FREE $ -> 0 (04): $ FREE $ -> 0 (05): $ ZADARMO $ -> 0 (06): $ ZADARMO $ -> 0 (07): $ ZADARMO $ -> 0 (08): $ ZADARMO -> 0 (09): $ ZADARMO $ -> 0 (10): $ ZDARMA $ -> 0 (11): $ ZADARMO $ -> 0 (12): $ ZADARMO $ -> 0 (13): $ ZADARMO -> 0 (14): $ ZADARMO $ -> 0 (15): $ ZDARMA $ -> 0 (16): $ ZDARMA $ -> 0 (17): $ ZADARMO $ -> 0 (18): $ ZADARMO -> 0 (19): $ ZADARMO $ -> 0 (20): $ ZADARMO $ -> 0 Dokončené. Názov $ FREE $ iba naznačuje, že umiestnenie premennej je bezplatné a zatiaľ mu nebol priradený názov premennej.

Krok 5: Prispôsobenie škrupiny

Prispôsobenie škrupiny
Prispôsobenie škrupiny

Ak chcete, môžete kód hacknúť a prispôsobiť si ho podľa vlastných potrieb. Keby som vedel, že tento kód uvoľním, urobil by som samostatnú triedu a štruktúru príkazov pre interpret príkazov a jednoducho by som iteroval prostredníctvom tohto volania ukazovateľa funkcie. Znížilo by to množstvo kódu, ale v súčasnom stave shell analyzuje príkazový riadok a volá príslušnú metódu shellu. Ak chcete pridať svoje vlastné vlastné príkazy, postupujte takto: 1. Pridajte svoj príkaz do zoznamu analýzy Analyzátor príkazov bude analyzujte príkazový riadok a zadajte príkaz a všetky argumenty oddelene. Argumenty sa odosielajú ako ukazovatele na ukazovatele alebo pole ukazovateľov, bez ohľadu na to, ako s nimi pracujete. Toto sa nachádza v shell.cpp. Otvorte shell.cpp a nájdite metódu ExecCmd triedy AVRShell. Možno budete chcieť pridať príkaz do pamäte programu. Ak to urobíte, pridajte príkaz do progmem.h a progmem.cpp. Príkaz môžete pridať do programovej pamäte priamo pomocou makra PSTR (), ale vygenerujete ďalšie varovanie vyššie uvedeného typu. Opäť je to známa chyba fungujúca v C ++, ale môžete to obísť pridaním príkazu priamo do súborov progmem.*, Ako som to urobil. Ak vám nevadí pridanie k používaniu SRAM, môžete pridať príkaz, ako som to ilustroval pomocou príkazu „hodiny“. Povedzme, že chcete pridať nový príkaz s názvom „newcmd“. Prejdite na AVRShell:: ExecCmd a nájdite vhodné miesto na vloženie nasledujúceho kódu:

else if (! strcmp (c, "newcmd")) cmdNewCmd (args);Tým sa pridá váš príkaz a zavolá metódu cmdNewCmd, ktorú napíšete v nasledujúcom kroku. 2. Napíšte kód vlastného príkazu. Do rovnakého súboru pridajte kód vlastného príkazu. Toto je definícia metódy. Naďalej budete chcieť pridať deklaráciu do súboru shell.h. Stačí ho pripojiť k ostatným príkazom. V predchádzajúcom príklade môže kód vyzerať takto

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("Váš príkaz je %s / r / n", args [0]); WriteRAM (buff);}Tu je niekoľko vecí. Po prvé, „buff“je 40-znaková vyrovnávacia pamäť poľa poskytovaná v kóde na použitie. Používame verziu programu sprintf s programovou pamäťou, pretože jej odovzdávame PSTR. Ak chcete, môžete použiť bežnú verziu, ale uistite sa, že formát neodošlete v jazyku PSTR. Argumenty sú tiež v poli args. Ak ste zadali „newcmd arg1 arg2“, môžete tieto argumenty získať pomocou predplatného args [0] a args [1]. Môžete zadať maximálne MAX_ARGS argumentov, ako sú definované v kóde. Ak potrebujete znova odoslať oveľa viac argumentov naraz, túto hodnotu môžete pri rekompilovaní zmeniť. WriteLine a WriteRAM sú globálne funkcie, ktoré vracajú metódy UART s rovnakým názvom. Druhý argument tejto funkcie je implicitný. Ak nič neprevediete, potom bude napísaný príkazový riadok. Ak zadáte 0 ako druhý argument, výzva sa nenapíše. To je užitočné, ak chcete napísať niekoľko oddelených reťazcov na výstup predtým, ako sa príkazový riadok vráti používateľovi. 3. Nechajte shell spustiť príkazový kód Už ste povedali vykonávateľovi shellu, aby pri nastavovaní nového príkazu vykonal metódu cmdNewCmd, ale pridajte ho do súboru shell.h, aby ho objekt shell pochopil. Stačí ho pridať pod posledný príkaz alebo pred prvý príkaz alebo kdekoľvek inde. A je to. Znovu skompilujte a nahrajte firmvér do svojho Arduina a váš nový príkaz je k dispozícii z shellu na výzvu.

Krok 6: Zhrnutie

Mali by ste vedieť, ako nainštalovať a pripojiť sa k vášmu AVR/Arduino a získať okamžitú výzvu k spustenému mikrokontroléru. Poznáte niekoľko príkazov, ktoré budú za behu sťahovať údaje o behu z MCU alebo nastavovať hodnoty do MCU. Tiež vám bolo ukázané, ako pridať svoj vlastný vlastný kód na vytvorenie vlastných jedinečných príkazov do shellu a ďalej ho prispôsobiť svojim vlastným potrebám. Môžete dokonca vymazať príkazový interpret, aby obsahoval iba vaše vlastné príkazy, ak to vyhovuje vašim potrebám. Dúfam, že sa vám tento návod páčil a že shell AVR môže byť pre vás užitočný, či už ako príkazový interpret v reálnom čase alebo ako proces učenia sa pri implementácii vlastného. Ako vždy, teším sa na akékoľvek pripomienky alebo návrhy, ako je možné tento pokyn zlepšiť! Bavte sa so svojim AVR!

Odporúča: