Turinys:

AVRSH: „Arduino“/AVR komandų vertėjo apvalkalas: 6 žingsniai (su paveikslėliais)
AVRSH: „Arduino“/AVR komandų vertėjo apvalkalas: 6 žingsniai (su paveikslėliais)

Video: AVRSH: „Arduino“/AVR komandų vertėjo apvalkalas: 6 žingsniai (su paveikslėliais)

Video: AVRSH: „Arduino“/AVR komandų vertėjo apvalkalas: 6 žingsniai (su paveikslėliais)
Video: Самодельный ISP программатор USBASP для AVR 2024, Liepa
Anonim
AVRSH: komandų vertėjo apvalkalas, skirtas „Arduino“/AVR
AVRSH: komandų vertėjo apvalkalas, skirtas „Arduino“/AVR

Ar kada nors norėjote būti „prisijungęs“prie savo AVR mikrovaldiklio? Ar kada pagalvojote, kad būtų šaunu „katinti“registrą, kad pamatytumėte jo turinį? Ar visada norėjote įjungti ir išjungti atskiras jūsų AVR arba „Arduino“periferines posistemes * realiu laiku *? Aš taip pat, todėl parašiau „UNR“panašų apvalkalą „AVR Shell“. Tai panašu į UNIX, nes tai primena „shell“paskyrą, kurią išėjote ir nusipirkote, kad paleistumėte savo „irc nick“susidūrimo robotus, taip pat turi bendrą komandą ar dvi. Jame taip pat yra failų sistema, panaši į UNIX extfs, naudojant išorinį EEPROM, tačiau tai tapo savaime projektu, todėl šį modulį išleisiu atskirai pagal kitą instrukciją, kai ji bus paruošta gamybai. Štai sąrašas dalykų, kuriuos šiuo metu galite padaryti naudodami „AVR Shell“:

  • Skaitykite visus savo duomenų krypčių registrus (DDRn), prievadus ir kaiščius realiuoju laiku
  • Rašykite į visus savo DDRn, prievadus ir kaiščius, kad įjungtumėte variklius, šviesos diodus ar skaitytų jutiklius realiuoju laiku
  • Išvardykite visus žinomus sistemos registrus
  • Sukurkite ir išsaugokite reikšmes vartotojo apibrėžtuose kintamuosiuose, kurių atsargines kopijas sudaro EEPROM.
  • Sukurkite pagrindinį slaptažodį ir autentifikuokite jį (naudojamas prieigai prie „Telnet“)
  • Perskaitykite sukonfigūruotą procesoriaus laikrodžio greitį
  • Pakeiskite procesoriaus laikrodžio greitį, nustatydami prescaler
  • Įjunkite ir sustabdykite 16 bitų laikmačius įvairiems dalykams nustatyti
  • Įjunkite ir (arba) išjunkite periferinius posistemius: analoginis į skaitmeninį keitiklį (ADC), nuosekliąją periferinę sąsają (SPI), dviejų laidų sąsają (TWI/I2C), UART/USART. Naudinga, kai norite sumažinti mikrovaldiklio energijos suvartojimą arba įjungti tam tikras funkcijas.
  • Parašyta C ++ su daugkartinio naudojimo objektais.

Ši instrukcija padės įdiegti, naudoti ir pritaikyti avrsh.

1 žingsnis: ko jums reikės

Ko jums reikės
Ko jums reikės

Šiam nurodymui nereikia daug, išskyrus tai, kad:

  • Turėkite „Arduino“arba „ATmega328P“. Kiti AVR gali veikti, tačiau gali tekti pakeisti kodą, kad būtų pateikti visi jūsų MCU unikalūs registrai. Pavadinimai turi atitikti tik tai, kas išvardyta jūsų MCU unikaliame antraštės faile. Daugelis registrų pavadinimų yra vienodi tarp AVR, todėl perkėlus jūsų rida gali skirtis.
  • Turėkite būdą prisijungti prie serijinio „Arduino“/AVR USART. Sistema buvo plačiausiai išbandyta naudojant AVR terminalą - „Windows“programą, kuri jungia serijinį ryšį per jūsų USB arba COM prievadą. Veikia su „Arduinos“, naudojant USB jungtį, ir bet kuriuo AVR, naudojant USB-BUB iš Moderndevice.com. Kitos terminalo parinktys: „Putty“, „minicom“(„Linux“ir „FreeBSD“), ekranas („Linux“/„FreeBSD“), „Hyperterminal“, „Teraterm“. Radau, kad glaistas ir teraterm jungdamiesi siunčia šiukšles, kad jūsų pirmoji komanda būtų sugadinta.
  • Įdiekite ir paleiskite „AVR Shell“programinę įrangą, kurią galite atsisiųsti iš šių puslapių arba visada gauti naujausią versiją „BattleDroids.net“.

Norėdami įdiegti AVR terminalą, tiesiog išpakuokite jį ir paleiskite. Norėdami įdiegti „AVR Shell“programinę -aparatinę įrangą, atsisiųskite ją ir tiesiogiai įkelkite šešioliktainį failą ir prijunkite savo serijinį terminalą prie 9600 baudų, arba patys sukompiliuokite jį naudodami „make“ir tada „make program“, kad įkeltumėte šešiakampį. Atminkite, kad gali tekti pakeisti AVRDUDE nustatymus, kad jie atspindėtų jūsų COM prievadą. Pastaba: PROGMEM atributas yra sugadintas dabartiniame AVR GCC diegime C ++ ir tai yra žinoma klaida. Jei ją sudarysite, tikėkitės, kad gausite daug įspėjamųjų pranešimų: „Įspėjimas: į programos atminties sritį galima įdėti tik inicializuotus kintamuosius“. Šis įspėjimas yra ne tik erzinantis, bet ir nekenksmingas. Kadangi C ++ įterptoje platformoje nėra aukštai AVR GCC prioritetų sąraše, nežinoma, kada tai bus ištaisyta. Jei patikrinsite kodą, pamatysite, kur aš stengiausi sumažinti šį įspėjimą, įgyvendindamas savo atributų teiginius. Gana paprasta. Atsisiųskite ir įdiekite viską, ko jums gali prireikti, tada apverskite puslapį ir pradėkime spragtis.

2 žingsnis: registrų skaitymas ir rašymas

Skaitymo ir rašymo registrai
Skaitymo ir rašymo registrai

„AVR Shell“pirmiausia buvo parašytas norint pasiekti kai kuriuos jutiklius, kuriuos prijungiau prie savo AVR. Jis prasidėjo nuo paprasto šviesos diodo, tada persikėlė į šviesos jutiklius, temperatūros jutiklius ir galiausiai į du ultragarsinius keitiklius. „avrsh“gali nustatyti šių jutiklių skaitmeninius komponentus rašydamas juos valdantiems registrams. Valdymas AVR registrais paleidžiant Norėdami gauti visų žinomų „Arduino“registrų sąrašą, įveskite:

spausdinti registrus ir gausite tokį spaudinį

Žinau apie šiuos registrus:

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 TWR TWR TWR TWR TWR TWR TWR TWR TWR TWR TWR TWR TWR Norėdami pamatyti, kaip atskiri bitai yra nustatyti bet kuriame registre, naudokite komandą katė arba aidas

katė %GPIOR0 Čia prašau komandų vertėjo parodyti arba pakartoti bendrosios paskirties įvesties/išvesties registro #0 turinį. Atkreipkite dėmesį į procentinį ženklą (%) prieš registro pavadinimą. To reikia norint, kad apvalkalas nurodytų, jog tai yra rezervuotas raktinis žodis, identifikuojantis registrą. Įprasta aido komandos išvestis atrodo taip

GPIOR0 (0x0) nustatytas į [00000000] Išvestis rodo registro pavadinimą, šešioliktainę vertę, rastą registre, ir dvejetainį registro vaizdą (kiekvieną bitą rodant kaip 1 arba 0). Norėdami nustatyti tam tikrą bitą bet kuriame registre, naudokite operatoriaus „indeksą“. Pvz., Tarkime, kad noriu, kad trečias bitas būtų 1

%GPIOR0 [3] = 1 ir apvalkalas duos jums atsakymą, nurodantį jo veiksmą ir rezultatą

GPIOR0 (0x0) nustatytas į [00000000] (0x8) nustatytas į [00001000] Nepamirškite procentinio ženklo ir nurodykite apvalkalui, kad dirbate su registru. Taip pat atkreipkite dėmesį, kad nustatant trečiąjį bitą, tai yra 4 bitai, nes mūsų AVR naudoja nulinį indeksą. Kitaip tariant, skaičiuodami iki 3 -ojo bito skaičiuojate 0, 1, 2, 3, o tai yra 4 vieta, bet trečiasis bitas. Šiek tiek galite išvalyti taip pat, nustatydami bitą į nulį. Nustatydami tokius bitus, galite greitai pakeisti savo AVR veikimą. Pavyzdžiui, pakeisdami CTC laikmačio atitikties vertę, rastą OCR1A. Tai taip pat leidžia pažvelgti į tam tikrus nustatymus, kuriuos turėsite programiškai patikrinti savo kode, pvz., Jūsų duomenų perdavimo spartos UBBR vertę. Darbas su DDRn, PORTn ir PINn Įvesties/išvesties kaiščiai taip pat priskiriami registrams ir gali būti nustatyti lygiai taip pat, tačiau buvo sukurta speciali sintaksė, skirta dirbti su tokio tipo registrais. Kode yra įprastas procesas, pavyzdžiui, įjungiant šviesos diodą ar kitą įrenginį, kuriam reikalingas skaitmeninis aukštas arba žemas lygis. Tam reikia nustatyti duomenų krypčių registrą, kad būtų nurodytas kaištis išėjimui, ir tada įrašyti 1 arba 0 į tam tikrą bitą teisingame prievade. Darant prielaidą, kad prie skaitmeninio kaiščio 13 (PB5) prijungtas šviesos diodas ir norime jį įjungti, štai kaip tai padaryti veikiant AVR

nustatyti kaištį pb5 išvestį rašyti kaištį pb5 aukštą Išėjimas, be to, kad galėtų matyti jūsų šviesos diodą, atrodytų taip

root@ATmega328p> set pin pb5 output Nustatykite pb5 for outputroot@ATmega328p> write pin pb5 high „Root@ATmega328p>“yra apvalkalo raginimas, rodantis, kad jis yra pasirengęs priimti iš jūsų komandas. Norėdami išjungti šviesos diodą, tiesiog užrašykite mažą kaištį. Jei norite skaityti skaitmeninę įvestį iš kaiščio, naudokite skaitymo komandą. Naudojant mūsų aukščiau pateiktą pavyzdį

root@ATmega328p> skaityti kaištį pb5Pin: pb5 yra AUKŠTAS Arba tiesiog pakartokite kaiščių registrą, valdantį tą kaiščio prievadą. Pvz., Jei prie 7 ir 8 skaitmeninių kaiščių (PD7 ir PD8) prijungti jungikliai, galite nusiųsti komandą

echo %PIND tada apvalkalas parodys to registro turinį, parodydamas visas prijungtų įrenginių įvesties/išvesties būsenas ir tai, ar jungiklio būsena buvo įjungta, ar išjungta.

3 žingsnis: saugiklių skaitymas ir rašymas

Skaitymo ir rašymo saugikliai
Skaitymo ir rašymo saugikliai

Saugikliai yra specialūs registrų tipai. Jie valdo viską-nuo jūsų mikrovaldiklio laikrodžio greičio iki galimų programavimo metodų iki EEPROM apsaugos nuo rašymo. Kartais šiuos nustatymus reikės pakeisti, ypač jei kuriate atskirą AVR sistemą. Nesu tikras, ar turėtumėte pakeisti „Arduino“saugiklių nustatymus. Būkite atsargūs su saugikliais; galite užrakinti save, jei juos nustatėte neteisingai. Ankstesnėje instrukcijoje parodžiau, kaip galite skaityti ir nustatyti saugiklius naudodami savo programuotoją ir avrdude. Čia parodysiu, kaip nuskaityti saugiklius paleidimo metu, kad pamatytumėte, kaip jūsų MCU juos iš tikrųjų nustatė. Atminkite, kad tai nėra kompiliavimo laiko nustatymas, kurį gaunate iš apibrėžimų, bet tikrasis saugiklis, kai MCU juos skaito vykdymo metu. Iš „ATmega328P“duomenų lapo (duomenų knygos, panašesnės į jį) 27–9 lentelės „Fuse Low Byte“bitai yra tokie:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Įdomu pastebėti tai, kad naudojant saugiklius 0 reiškia užprogramuotą, o 1 reiškia, kad tas konkretus bitas yra neužprogramuotas. Šiek tiek priešinga intuityviai, bet kai tai žinai, tai žinai.

  • CKDIV8 nustato, kad jūsų procesoriaus laikrodis būtų padalintas iš 8. ATmega328P yra gamykloje užprogramuotas naudoti savo vidinį osciliatorių 8MHz dažniu su CKDIV8 užprogramuotu (ty nustatytu 0), o galutinis F_CPU arba CPU dažnis yra 1 MHz. „Arduino“atveju tai pasikeitė, nes jie sukonfigūruoti naudoti išorinį osciliatorių 16 MHz dažniu.
  • CKOUT, kai užprogramuotas, išves jūsų procesoriaus laikrodį PB0, kuris yra skaitmeninis 8 kaištis „Arduinos“.
  • SUT [1..0] nurodo jūsų AVR paleidimo laiką.
  • CKSEL [3..0] nustato laikrodžio šaltinį, pvz., Vidinį RC generatorių, išorinį generatorių ir kt.

Kai perskaitysite saugiklius, jie bus grąžinti šešioliktainiais skaičiais. Tai formatas, kurio jums reikia, jei norite rašyti saugiklius per avrdude. Mano „arduino“štai ką aš gaunu, kai skaitau apatinį saugiklio baitą:

root@ATmega328p> skaityti lfuseLower Fuse: 0xffTaigi, visi bitai nustatyti į 1. Aš padariau tą pačią procedūrą su „Arduino“klonu ir gavau tą pačią vertę. Tikrindamas vieną iš savo autonominių AVR sistemų, gavau 0xDA, tai yra vertė, kurią buvau nustatęs prieš kurį laiką konfigūruodamas lustą. Ta pati procedūra naudojama tikrinant aukšto saugiklio baitą, išplėstinį saugiklio baitą ir užrakto saugiklius. Kalibravimo ir parašo saugiklių baitai kode buvo išjungti naudojant #if 0 išankstinio apdorojimo direktyvą, kurią galite pakeisti, jei jaučiatės nulaužti.

4 žingsnis: kitos komandos

Kitos komandos
Kitos komandos

Yra keletas kitų komandų, kurias numatytasis komandų vertėjas supranta ir kurios jums gali būti naudingos. Visas įdiegtas ir būsimas išleidimo komandas galite pamatyti išleidę pagalbą arba meniu. Greitai juos aprašysiu, nes jie dažniausiai savaime suprantami. CPU laikrodžio dažnio nustatymai Galite sužinoti, kokia jūsų programinė įranga buvo sukonfigūruota naudoti kaip CPU laikrodžio nustatymai, naudodami komandą fcpu:

root@ATmega328p> fcpuCPU dažnis: 16000000Tai yra 16 milijonų arba 16 milijonų hercų, dažniau žinomų kaip 16 MHz. Dėl bet kokios priežasties galite tai pakeisti skrisdami, naudodami laikrodžio komandą. Ši komanda turi vieną argumentą: išankstinį skaliklį, kurį reikia naudoti dalijant laikrodžio greitį. Laikrodžio komanda supranta šias prescaler reikšmes:

  • ckdiv2
  • ckdiv4
  • ckdiv8
  • ckdiv16
  • ckdiv32
  • ckdiv64
  • c8d812
  • c6d625

Naudojant komandą:

laikrodis ckdiv2 kai jūsų procesoriaus greitis yra 16 MHz, jūsų laikrodžio greitis bus pakeistas į 8 MHz. Naudojant „ckdiv64“prescalerį, kurio pradinis laikrodžio dažnis yra 16 MHz, galutinis laikrodžio dažnis bus 250 KHz. Kodėl žemėje norėtumėte, kad jūsų MCU būtų lėtesnis? Na, pirma, mažesnis laikrodžio greitis sunaudoja mažiau energijos, o jei jūsų MCU išsikrauna akumuliatorius projekto korpuse, gali prireikti, kad jis veiktų didžiausiu greičiu, todėl gali sumažėti greitis ir sumažinti energijos suvartojimą, prailgina baterijos veikimo laiką. Be to, jei jūs naudojate laikrodį bet kokioms laiko problemoms su kitu MCU, tarkime, diegdami programinę UART ar pan., Galbūt norėsite jį nustatyti į tam tikrą vertę, kurią lengva pasiekti, kad būtų pasiektas gražus tolygus duomenų perdavimo greitis mažesnis klaidų lygis. Periferinių posistemių įjungimas ir išjungimas Ta pačia pastaba, kaip anksčiau minėtas energijos suvartojimo mažinimas, galbūt norėsite dar labiau sumažinti galią išjungdami kai kuriuos nenaudojamus išorinius įrenginius. Komandų vertėjas ir apvalkalas šiuo metu gali įjungti ir išjungti šiuos išorinius įrenginius:

  • Analoginis-skaitmeninis keitiklis (ADC). Šis išorinis įrenginys naudojamas, kai turite analoginį jutiklį, teikiantį duomenis (pvz., Temperatūrą, šviesą, pagreitį ir tt), ir reikia juos konvertuoti į skaitmeninę vertę.
  • Serijinė periferinė sąsaja (SPI). SPI magistralė naudojama bendrauti su kitais SPI palaikančiais įrenginiais, pvz., Išorinėmis atmintinėmis, LED tvarkyklėmis, išoriniais ADC ir tt jei programuojate per IPT.
  • Dviejų laidų sąsaja. Kai kurie išoriniai įrenginiai bendravimui naudoja I2C magistralę, nors jie greitai keičiami įrenginiais, turinčiais SPI, nes SPI turi didesnį pralaidumą.
  • USART. Tai jūsų nuosekli sąsaja. Tikriausiai nenorite to išjungti, jei esate prijungtas prie AVR per nuoseklųjį ryšį! Tačiau aš čia pridėjau kaip karkasą, skirtą perkelti į įrenginius, turinčius kelis USART, tokius kaip ATmega162 arba ATmega644P.
  • visi. Šis argumentas įjungimo arba išjungimo komandai įjungia visus minėtus išorinius įrenginius arba išjungia juos viena komanda. Vėlgi, protingai naudokitės šia komanda.

root@ATmega328p> „powerdown twi“„twi“išjungimas užbaigtas. šaknis@ATmega328p> „powerup twi“

Laikmačių paleidimas ir sustabdymas Korpusas turi įmontuotą 16 bitų laikmatį, kurį galima naudoti. Laikmatį paleidžiate naudodami laikmačio komandą:

laikmačio paleidimasir sustabdykite laikmatį su sustabdymo argumentu

laikmačio sustojimasŠis laikmatis neprieštaraus vidiniam USART laikmačiui. Žiūrėkite USART laikmačio diegimo informacijos kodą, jei jus domina tokia kraupi detalė

root@ATmega328p> laikmačio paleidimas Pradėtas timer.root@ATmega328p> laikmačio sustabdymas Praėjęs laikas: ~ 157 sekundės Autentifikavimas Korpusas gali saugoti 8 simbolių slaptažodį EEPROM. Šis slaptažodžio mechanizmas buvo sukurtas palaikyti „telnet“prisijungimo galimybes, tačiau jį galima išplėsti siekiant apsaugoti kitus dalykus. Pavyzdžiui, galite reikalauti tam tikrų komandų, pvz., Keisti registro reikšmes, naudodami autentifikavimo mechanizmą. Nustatykite slaptažodį naudodami slaptažodžio komandą

root@ATmega328p> passwd blah Parašė root slaptažodį į EEPROMĮgalinti prieš slaptažodį (arba reikalauti leidimo programiškai naudojant kodą) naudojant komandą auth. Atminkite, kad jei bandote pakeisti pagrindinį slaptažodį ir jau yra nustatytas pagrindinis slaptažodis, prieš leisdami jį pakeisti nauju, turite įgalioti senąjį slaptažodį

root@ATmega328p> passwd blinky Pirmiausia turite įgalioti save.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinkyŽinoma, turėsite įkelti failą avrsh.eep, jei ištrinsite programinę -aparatinę įrangą, kad būtų atkurtos senosios vertės ir kintamieji. „Makefile“sukurs jums EEPROM failą. Kintamieji Korpusas supranta vartotojo apibrėžtų kintamųjų sąvoką. Kodas apriboja tai iki 20, bet jūs galite tai pakeisti, jei norite, pakeisdami scenarijų MAX_VARIABLES scenarijuje.h. Galite išsaugoti bet kokią 16 bitų vertę (ty bet kokį skaičių iki 65, 536) į kintamąjį, kuris bus primintas vėliau. Sintaksė yra panaši į registrus, išskyrus dolerio ženklą ($), naudojamą žymėti apvalkalo kintamuosius. Išvardykite visus savo kintamuosius naudodami spausdinimo kintamųjų komandą

vartotojo kintamieji: Indekso pavadinimas -> Vertė (01): $ FREE $ -> 0 (02): $ FREE $ -> 0 (03): $ FREE $ -> 0 (04): $ FREE $ -> 0 (05): $ FREE $ -> 0 (06): $ FREE $ -> 0 (07): $ FREE $ -> 0 (08): $ FREE $ -> 0 (09): $ FREE $ -> 0 (10): $ FREE $ -> 0 (11): $ FREE $ -> 0 (12): $ FREE $ -> 0 (13): $ FREE $ -> 0 (14): $ FREE $ -> 0 (15): $ FREE $ -> 0 (16): $ FREE $ -> 0 (17): $ FREE $ -> 0 (18): $ FREE $ -> 0 (19): $ FREE $ -> 0 (20): NEMOKAMAI $ -$ 0Nustatykite kintamąjį

$ newvar = 25 $ timeout = 23245Gaukite tam tikro kintamojo vertę

root@ATmega328p> echo $ newvar $ newvar 25Galite pamatyti, kokie visi kintamieji, kuriuos šiuo metu įkūnijote naudodami spausdinimo komandą, kurią jau žinote

Vartotojo nustatyti kintamieji: Indekso pavadinimas -> Vertė (01): newvar -> 25 (02): skirtasis laikas -> 23245 (03): $ FREE $ -> 0 (04): $ FREE $ -> 0 (05): $ FREE $ -> 0 (06): $ FREE $ -> 0 (07): $ FREE $ -> 0 (08): $ FREE $ -> 0 (09): $ FREE $ -> 0 (10): $ FREE $ -> 0 (11): $ FREE $ -> 0 (12): $ FREE $ -> 0 (13): $ FREE $ -> 0 (14): $ FREE $ -> 0 (15): $ FREE $ -> 0 (16): $ FREE $ -> 0 (17): $ FREE $ -> 0 (18): $ FREE $ -> 0 (19): $ FREE $ -> 0 (20): $ FREE $ -> 0Baigti.$ FREE $ pavadinimas tik nurodo, kad ta kintamoji vieta yra nemokama ir jai dar nebuvo priskirtas kintamojo pavadinimas.

5 žingsnis: apvalkalo pritaikymas

„Shell“pritaikymas
„Shell“pritaikymas

Jei norite, galite laisvai įsilaužti į kodą ir pritaikyti jį pagal savo poreikius. Jei būčiau žinojęs, kad išleisiu šį kodą, būčiau sukūręs atskirą komandų vertėjo klasę ir komandų struktūrą ir tiesiog pakartojęs šį funkcijų rodyklę. Tai sumažintų kodo kiekį, tačiau esantis apvalkalas analizuoja komandų eilutę ir iškviečia atitinkamą apvalkalo metodą. Norėdami pridėti savo pasirinktines komandas, atlikite šiuos veiksmus: 1. Pridėkite komandą prie analizės sąrašo Komandų analizatorius išanalizuokite komandų eilutę ir pateikite komandą bei visus argumentus atskirai. Argumentai perduodami kaip rodyklės rodyklėms arba rodyklių masyvas, tačiau jums patinka su jais dirbti. Tai galima rasti shell.cpp. Atidarykite shell.cpp ir raskite AVRShell klasės ExecCmd metodą. Galbūt norėsite įtraukti komandą į programos atmintį. Jei tai padarysite, pridėkite komandą programmem.h ir progmem.cpp. Komandą galite pridėti prie programinės atminties tiesiogiai naudodami makrokomandą PSTR (), tačiau sugeneruosite dar vieną anksčiau minėto tipo įspėjimą. Vėlgi, tai yra žinoma klaida dirbant su „C ++“, tačiau tai galite apeiti pridėję komandą tiesiai į programos.* Failus, kaip aš padariau. Jei neprieštaraujate pridėti prie SRAM naudojimo, galite pridėti komandą, kaip aš parodžiau komandą „clock“. Tarkime, kad norite pridėti naują komandą „newcmd“. Eikite į „AVRShell:: ExecCmd“ir raskite patogią vietą įterpti šį kodą:

else if (! strcmp (c, "newcmd")) cmdNewCmd (args);Tai pridės jūsų komandą ir iškvies „cmdNewCmd“metodą, kurį parašysite atlikdami kitą veiksmą. 2. Įrašykite pasirinktinį komandos kodą Tame pačiame faile pridėkite pasirinktinį komandos kodą. Tai yra metodo apibrėžimas. Jūs vis tiek norėsite pridėti deklaraciją prie apvalkalo.h. Tiesiog pridėkite jį prie kitų komandų. Ankstesniame pavyzdyje kodas gali atrodyti maždaug taip

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("Jūsų komanda yra %s / r / n", args [0]); WriteRAM (buff);}Čia yra keletas dalykų. Pirma, „buff“yra 40 simbolių masyvo buferis, pateiktas jūsų naudojamame kode. Mes naudojame „sprintf“programos atminties versiją, nes perduodame jai PSTR. Jei norite, galite naudoti įprastą versiją, tačiau įsitikinkite, kad neperduodate formato PSTR. Be to, argumentai yra argų masyve. Jei įvedėte „newcmd arg1 arg2“, šiuos argumentus galite gauti naudodami args [0] ir args [1] indeksus. Galite perduoti daugiausia MAX_ARGS argumentų, kaip apibrėžta kode. Jei norite iš karto perduoti daug daugiau argumentų, pakeiskite šią vertę, jei reikia perrašyti daugiau. „WriteLine“ir „WriteRAM“yra visuotinės funkcijos, kurios grąžina to paties pavadinimo UART metodus. Antrasis šios funkcijos argumentas yra numanomas. Jei nieko nepraleisite, vėliau bus parašyta komandinė eilutė. Jei antruoju argumentu pateiksite 0, raginimas nebus parašytas. Tai naudinga, kai norite parašyti keletą atskirų eilučių, prieš išleidžiant komandų eilutę vartotojui. 3. Leiskite apvalkalui vykdyti komandos kodą Jūs jau nurodėte apvalkalo vykdytojui, kad jis, atlikdamas naują komandą, vykdytų metodą cmdNewCmd, bet pridėkite jį prie failo shell.h, kad jį suprastų apvalkalo objektas. Tiesiog pridėkite jį po paskutine komanda arba prieš pirmąją komandą arba bet kur ten. Ir viskas. Iš naujo sukompiliuokite ir įkelkite programinę -aparatinę įrangą į „Arduino“, o jūsų nauja komanda bus prieinama iš apvalkalo, kai būsite paraginti.

6 žingsnis: Santrauka

Turėtumėte žinoti, kaip įdiegti ir prisijungti prie savo AVR/„Arduino“, ir gauti tiesioginį pranešimą apie veikiantį mikrovaldiklį. Jūs žinote keletą komandų, kurios skris vykdymo laiko duomenis iš MCU arba nustatys reikšmes į MCU. Jums taip pat buvo parodyta, kaip pridėti savo pasirinktinį kodą, kad sukurtumėte savo unikalias komandas į apvalkalą ir toliau pritaikytumėte jį savo poreikiams. Jūs netgi galite atsikratyti komandų vertėjo, kad jame būtų tik jūsų pasirinktinės komandos, jei tai tinka jūsų poreikiams. Tikiuosi, kad jums patiko šis nurodymas ir kad „AVR Shell“gali būti jums naudingas kaip realaus laiko komandų vertėjas arba kaip mokymosi procesas įgyvendinant savo. Kaip visada, laukiu komentarų ar pasiūlymų, kaip galima patobulinti šį pamokomą dalyką! Smagiai praleiskite laiką su savo AVR!

Rekomenduojamas: