Мазмуну:

AVRSH: Arduino/AVR үчүн Command Interpreter Shell: 6 кадам (Сүрөттөр менен)
AVRSH: Arduino/AVR үчүн Command Interpreter Shell: 6 кадам (Сүрөттөр менен)

Video: AVRSH: Arduino/AVR үчүн Command Interpreter Shell: 6 кадам (Сүрөттөр менен)

Video: AVRSH: Arduino/AVR үчүн Command Interpreter Shell: 6 кадам (Сүрөттөр менен)
Video: AVR Shell Command Interpreter 2024, Июль
Anonim
AVRSH: Arduino/AVR үчүн Command Interpreter Shell
AVRSH: Arduino/AVR үчүн Command Interpreter Shell

Сиз AVR микроконтроллерине "кирүүнү" каалаган белеңиз? Реестрдин мазмунун көрүү үчүн "мышык" кылуу жакшы болот деп ойлодуңуз беле? Сиз ар дайым AVR же Arduino перифериялык чакан системаңызды * реалдуу убакытта * иштетүү жана өчүрүү жолун кааладыңыз беле? Мен да, ошондуктан мен AVR Shell, UNIXке окшош кабык жаздым. Бул UNIXке окшош, анткени ал irc nick кагылышуу ботторуңузду иштетүү үчүн чыгып кеткен жана сатып алган снаряд эсебиңизди эске салат, ошондой эле бир же эки буйрукка ээ. Ал ошондой эле тышкы EEPROMду колдонуп, UNIX extfsке окшош файл тутумуна ээ, бирок бул өзү үчүн долбоор болуп калды, ошондуктан мен ал модулду өндүрүшкө даяр болгондо башка көрсөтмө астында бөлүп чыгарам. Бул жерде сиз азыр AVR Shell менен кыла турган нерселердин тизмеси:

  • Бардык маалыматтар багытынын регистрлерин (DDRn), портторду жана казыктарды реалдуу убакытта окуңуз
  • Кыймылдаткычтарды, светодиоддорду күйгүзүү же сенсорлорду реалдуу убакытта окуу үчүн бардык DDRn'лерге, портторго жана казыктарга жазыңыз.
  • Тутумдагы бардык белгилүү реестрлерди тизмектеңиз
  • EEPROM тарабынан колдоого алынган колдонуучу аныктоочу өзгөрмөлөрдө баалуулуктарды түзүңүз жана сактаңыз.
  • Түпкү сырсөздү түзүңүз жана ага каршы аныктыгын текшериңиз (телнетке кирүү үчүн колдонулат)
  • Конфигурацияланган CPU саат ылдамдыгын окуңуз
  • Prescaler орнотуу менен CPU саат ылдамдыгын өзгөртүү
  • Ар кандай нерселердин убактысы үчүн 16-бит таймерлерди баштаңыз жана токтотуңуз
  • Power and/or power down perifheric sub-systems: Analog to Digital Converters (ADC), Serial Perifheral Interface (SPI), Two-sim Interface (TWI/I2C), UART/USART. Микроконтроллердин энергия керектөөсүн азайтуу же белгилүү функцияларды иштетүү үчүн пайдалуу.
  • Кайра колдонулуучу объекттер менен С ++ тилинде жазылган.

Бул көрсөтмө avrshти орнотуу, колдонуу жана ыңгайлаштыруу аркылуу өтөт.

1 -кадам: Сизге эмне керек

Сизге эмне керек
Сизге эмне керек

Бул үйрөткүч сизден башка көп нерсени талап кылбайт:

  • Arduino же ATmega328P бар. Башка AVR иштеши мүмкүн, бирок сизге MCU үчүн уникалдуу болгон бардык реестрлерди тизмектөө үчүн кодду өзгөртүү керек болушу мүмкүн. Аттар MCUга гана тиешелүү баш файлда көрсөтүлгөн нерселерге дал келиши керек. Реестрлердин аталыштарынын көбү AVRлердин ортосунда бирдей, ошондуктан ташууда сиздин километражыңыз ар кандай болушу мүмкүн.
  • Сиздин Arduino/AVR сериясындагы USART менен туташуунун жолу бар. Система USB же COM портуңуз аркылуу сериялык байланышты түзгөн Windows колдонмосу AVR Терминалы менен эң көп сыналган. USB туташуусу менен Arduinos менен иштейт жана Moderndevice.com сайтынан USB-BUB аркылуу каалаган AVR. Башка терминалдык параметрлерге төмөнкүлөр кирет: Putty, minicom (Linux жана FreeBSD), экран (Linux/FreeBSD), Hyperterminal, Teraterm. Мен туташтырып жатканда заматка менен тератерм таштанды жөнөтүп жатканын таптым, ошондуктан сиздин биринчи буйругуңуз бузулган болушу мүмкүн.
  • AVR Shell камтылган программасын орнотуңуз жана иштетиңиз, аны бул баракчалардан жүктөп алсаңыз болот же BattleDroids.net сайтынан ар дайым акыркы версиясын ала аласыз.

AVR Терминалын орнотуу үчүн, аны ачып, иштетиңиз. AVR Shell камтылган программасын орнотуу үчүн, аны жүктөп алып, же Hex файлын түздөн -түз жүктөп, сериялык терминалыңызды 9600 baudга туташтырыңыз, же өзүңүз "make" менен түзүңүз, анан hexти жүктөө үчүн "программасын түзүңүз". Эскертүү, COM портуңузду чагылдыруу үчүн AVRDUDE орнотууларын өзгөртүүңүз керек болушу мүмкүн. Эскертүү: PROGMEM атрибуту C ++ үчүн учурдагы AVR GCC программасында бузулган жана бул белгилүү ката. Эгер сиз аны түзсөңүз, "эскертүү: программанын эстутумуна инициализацияланган гана өзгөрмөлөрдү жайгаштырууга болот" деген көптөгөн эскертүү билдирүүлөрүн күтүңүз. Көрүүдөн тажагандан тышкары, бул эскертүү зыянсыз. Камтылган платформада C ++ AVR GCC приоритеттер тизмесинде жогору болбогондуктан, бул качан оңдолору белгисиз. Эгерде сиз кодду текшерип көрсөңүз, анда мен бул эскертүүнү азайтуу үчүн өзүмдүн атрибутум боюнча билдирүүлөрдү ишке ашыруу менен кайда иштегенимди көрөсүз. Сизге керектүү болгон нерселерди жүктөп алып, орнотуңуз, анан баракты оодарыңыз, келгиле, кыйрап калалы.

2 -кадам: Окуу жана жазуу реестрлери

Окуу жана жазуу реестрлери
Окуу жана жазуу реестрлери

AVR Shell негизинен менин AVR туташкан кээ бир сенсорлорго жетүү үчүн жазылган. Бул жөнөкөй LED менен башталып, андан кийин жарык сенсорлоруна, температура сенсорлоруна жана акырында эки УЗИ өткөргүчкө которулду. avrsh бул сенсорлордун санарип компоненттерин көзөмөлдөгөн регистрлерге жазуу менен орното алат. Чуркап жүргөндө AVR реестрлерин манипуляциялоо Ардуинодо бардык белгилүү регистрлердин тизмесин алуу үчүн, териңиз:

басып чыгаруу регистрлери жана сиз ушундай окшош басып чыгарууну аласыз

Мен төмөнкү реестрлерди билем:

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 Мезгил 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 АССР TWBR TWSR Twar TWDR TWCR TWAMR UCSR0A UCSR0B UCSR0C UBRR0L UBRR0H UDR0 PORTB тамыры ATmega328p @> Кайсы бир реестрде жеке биттер кантип орнотулганын көрүү үчүн cat же echo командасын колдонуңуз

мышык %GPIOR0 Бул жерде мен буйрук котормочусунан жалпы максаттуу I/O реестринин мазмунун көрсөтүүнү же жаңыртууну суранам #0. Реестр аталышынын алдындагы пайыз белгисине (%) көңүл буруңуз. Сиз бул каттоону аныктоочу резервди ачкыч экенин көрсөтүү үчүн керек. Эхо буйругунан типтүү чыгаруу ушундай көрүнөт

GPIOR0 (0x0) [00000000] деп коюлган Чыгарууда реестрдин аталышы, реестрдеги он алтылык маани жана регистрдин бинардык көрсөтүлүшү көрсөтүлөт (ар бир бит 1 же 0 катары көрсөтүлөт). Кайсы бир реестрде белгилүү бир битти орнотуу үчүн оператордун "индексин" колдонуңуз. Мисалы, мен үчүнчү битти 1ге каалайм дейли

%GPIOR0 [3] = 1 жана кабык сизге анын аракетин жана натыйжасын көрсөтүүчү жооп берет

GPIOR0 (0x0) [00000000] деп коюлган (0x8) [00001000] Регистр менен иштеп жатканыңызды билдирүү үчүн пайыздык белгини унутпаңыз. 3-битти орнотуу менен, бул 4 бит экенин эске алыңыз, анткени биздин AVR нөлгө негизделген индексти колдонот. Башкача айтканда, 3 -битке чейин санап, сиз 0, 1, 2, 3 деп эсептейсиз, бул 4 -орун, бирок 3 -бит. Бир аз нөлгө коюу менен бир аз тазалай аласыз. Мындай биттерди коюу менен сиз AVRдин иштешин дароо өзгөртө аласыз. Мисалы, OCR1A табылган CTC таймер дал келүү наркын өзгөртүү менен. Бул ошондой эле кодуңузду программалык түрдө текшерип турууңуз керек болгон белгилүү бир жөндөөлөрдү карап чыгууга мүмкүнчүлүк берет, мисалы, UBBR сиздин baud ылдамдыгыңыз үчүн. DDRn, PORTn жана PINn менен иштөө Киргизүү/чыгаруу төөнөгүчтөрү да реестрлерге дайындалат жана дал ушундай жол менен коюлушу мүмкүн, бирок бул типтеги регистрлер менен иштөө үчүн атайын синтаксис түзүлгөн. Коддо, айталы, LEDди же санариптик жогорку же төмөндү талап кылган башка түзмөктү күйгүзүү үчүн кадимки процесс бар. Бул пин чыгаруу үчүн экенин көрсөтүү үчүн Маалыматтын багытынын реестрин орнотууну талап кылат, андан кийин туура портко конкреттүү битке 1 же 0 жазууну талап кылат. Бизде санарип пин 13 (PB5) туташкан LED бар деп ойлосок жана аны күйгүзгүбүз келсе, AVR иштеп турганда муну кантип жасоо керек.

pin pin pb5 outputwrite pin pb5 бийик Чыгуу, сиздин LED күйгөнүн көрө албагандан тышкары, ушундай көрүнөт

root@ATmega328p> pin pin pb5 outputSet pb5 outputroot@ATmega328p> pin pb5 high жазуу pb5 пин жазуу "Root@ATmega328p>" - бул сизден буйруктарды кабыл алууга даяр экенин көрсөткөн кабыктын чакырыгы. Светодиодду өчүрүү үчүн, төөнөгүчкө аз жазыңыз. Эгерде сиз пинден санариптик кирүүнү окууну кааласаңыз, окуу буйругун колдонуңуз. Биздин жогорудагы мисалды колдонуу

root@ATmega328p> pin pin pb5Pin: pb5 БИЙИК Же болбосо, ошол пин -портту көзөмөлдөгөн пин реестри жаңырат. Мисалы, бизде 7 жана 8 санариптик пинге (PD7 жана PD8) туташтырылган которгучтар болсо, анда сиз буйрукту жөнөтө аласыз

%PIND жаңырыгы жана кабык ошол регистрдин мазмунун көрсөтүп, туташкан түзмөктөрдүн бардык кириш/чыгуу абалын жана которгучтун күйүк же өчүк экенин көрсөтөт.

3 -кадам: Сактандырууларды окуу жана жазуу

Окутуу жана жазуу сактандыргычтары
Окутуу жана жазуу сактандыргычтары

Сактандыргычтар - реестрлердин өзгөчө түрлөрү. Алар сиздин микроконтроллериңиздин саат ылдамдыгынан тартып, EEPROMду жазуудан коргоо үчүн кандай программалоо ыкмаларына чейин баарын көзөмөлдөйт. Кээде бул орнотууларды өзгөртүүгө туура келет, айрыкча, эгер сиз автономдуу AVR системасын түзүп жатсаңыз. Ардуинодо сактандыруучу жөндөөлөрүңүздү өзгөртүшүңүз керек экенине ишенбейм. Сактандыргычтарыңыз менен сак болуңуз; Эгер сиз аларды туура эмес орнотсоңуз, өзүңүздү кулпулай аласыз. Мурунку көрсөтмөдө, мен сиздин программистиңизди жана avrdude менен кантип сактанууңузду окуп, орното алаарыңызды көрсөттүм. Бул жерде, мен сизге MCU чындыгында аларды кантип орнотконун билүү үчүн, иштөө убагында сактандыруучуңузду кантип кайра окуу керектигин көрсөтөм. Көңүл буруңуз, бул сиз аныктамалардан алынган компиляция убактысы эмес, бирок MCU аларды иштөө убагында окуганда чыныгы сактандыргычтар. ATmega328P маалымат барагындагы 27-9-таблицадан (маалымат базасы, ага окшош) Fuse Low Byte биттери төмөндөгүдөй:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Белгилей кетүүчү кызыктуу нерсе, сактандыргычтар менен 0 программаланган, ал эми 1 бул тигил программаланбаганын билдирет. Бир аз каршы-интуитивдүү, бирок сиз муну билгенден кийин билесиз.

  • CKDIV8 сиздин CPU саатыңызды 8ге бөлүүнү белгилейт. ATmega328P фабрикага келип, өзүнүн ички осцилляторун 8 МГц CKDIV8 менен программаланган (б.а. 0го орнотулган), сизге акыркы F_CPU же CPU жыштыгы 1 МГц. Ардуинодо бул өзгөрөт, анткени алар 16 МГц тышкы осцилляторду колдонууга конфигурацияланган.
  • Программаланганда CKOUT сиздин CPU саатыңызды PB0ге чыгарат, бул Arduinosдогу санарип пин 8.
  • SUT [1..0] AVR үчүн баштоо убактысын аныктайт.
  • CKSEL [3..0] сааттын булагын орнотот, мисалы ички RC осциллятору, тышкы осциллятор ж.

Сиз сактандыргычтарыңызды окуганда, ал сизге он алтылыкта кайтарылып берилет. Бул сиз сакташтарды avrdude аркылуу жазгыңыз келсе, сизге керек формат. Менин ардуинодо, мен төмөнкү сактандыруучу байтты окуганымда:

root@ATmega328p> окуу lfuseLower Fuse: 0xffОшентип, бардык биттер 1ге коюлду. Мен ошол эле процедураны Arduino клонунда жасадым жана ошол эле мааниге ээ болдум. Менин автономдуу AVR тутумдарымдын бирин текшерип жатып, мен 0xDA алдым, бул мен чипти конфигурациялоодо бир аз убакыт мурун орноткон мааним. Ошол эле жол-жобо Жогорку сактандыруучу байтты, Узартылган сактандыруучу байтты жана Кулпу сактандыруучуларын текшерүү үчүн колдонулат. Калибрлөө жана кол тамгалар сакталуу байттары коддо #if 0 препроцессордук директивасы менен өчүрүлгөн, аны сиз өзүңүздү начар сезсеңиз өзгөртө аласыз.

4 -кадам: Башка буйруктар

Башка буйруктар
Башка буйруктар

Демейки буйрук котормочу сизге пайдалуу болушу мүмкүн экенин түшүнгөн дагы бир нече буйруктар бар. Сиз ишке ашырылган жана келечекте чыгарыла турган бардык буйруктарды тез арада жардам же менюну чыгаруу менен көрө аласыз. Мен бул жерде аларды тез эле камтып коём, анткени алар негизинен өзүн-өзү түшүндүрөт. CPU Clock Frequency Орнотуулары Сиз fcpu буйругу менен сиздин программалык камсыздоону CPU саат жөндөөлөрү катары колдонуу үчүн конфигурацияланганын биле аласыз:

root@ATmega328p> fcpuCPU Frek: 16000000Бул 16 миллион же 16 миллион герц, көбүнчө 16 МГц деп аталат. Сиз муну каалаган убакта, сааттын буйругу менен өзгөртө аласыз. Бул буйрук бир аргументти талап кылат: саат ылдамдыгын бөлүштүрүүдө колдонуу үчүн prescaler. Саат буйругу бул prescaler баалуулуктарын түшүнөт:

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

Команданы колдонуу:

саат ckdiv2 cpu ылдамдыгы 16 МГц болгондо, саат ылдамдыгы 8 МГцке өзгөрөт. Баштапкы саат ылдамдыгы 16 МГц болгон ckdiv64тун алдын ала эсептегичтерин колдонуу акыркы сааттын ылдамдыгы 250 КГцге алып келет. Эмне үчүн Жерде MCU жайыраак кылгыңыз келет? Биринчиден, сааттын ылдамдыгы азыраак энергияны керектейт жана эгерде сизде MCU батарейкасы долбоордун корпусунда иштебей калса, анда анын эң жогорку ылдамдыкта иштешинин кереги жок болушу мүмкүн, демек, ылдамдыкты төмөндөтүп, анын энергия керектөөсүн азайтышы мүмкүн., батареянын иштөө мөөнөтүн көбөйтүү. Ошондой эле, эгер сиз саатты башка MCU менен кандайдыр бир убакыт көйгөйлөрү үчүн колдонуп жаткан болсоңуз, айталы, UART программалык камсыздоону же башка нерселерди ишке ашырсаңыз, аны белгилүү бир мааниге коюңуз, аны менен жакшы жыштыктун ылдамдыгын алуу оңой болот. ката көрсөткүчтөрү төмөн. Перифериялык подсистемаларды иштетүү жана өчүрүү Жогоруда айтылган электр энергиясын керектөөнү азайтуу менен бирге, сиз колдонбогон борттогу айрым перифериялык жабууларды өчүрүп, кубатты андан ары азайтууну каалашыңыз мүмкүн. Командалык котормочу жана кабык учурда төмөнкү перифериялык түзүлүштөрдү иштетип жана өчүрө алат:

  • Аналогдук-санариптик конвертер (ADC). Бул перифериялык түзүлүш сизде аналогдук сенсор болсо (температура, жарык, ылдамдатуу ж.
  • Сериялык перифериялык интерфейс (SPI). SPI шинасы башка SPI иштетилген түзмөктөр менен байланышуу үчүн колдонулат, мисалы тышкы эс тутумдар, LED драйверлери, тышкы ADCлер ж. эгер сиз ISP аркылуу программалап жатсаңыз.
  • Эки зымдуу интерфейс. Кээ бир тышкы түзмөктөр I2C автобусун колдонушат, бирок алар SPI иштетилген түзмөктөргө тез алмаштырылып жатат, анткени SPI чоң өткөрүмдүүлүккө ээ.
  • USART. Бул сиздин сериялык интерфейс. Сиз AVRге сериялык туташуу аркылуу туташкан болсоңуз, муну өчүргүңүз келбесе керек! Бирок, мен муну бул жерде ATmega162 же ATmega644P сыяктуу бир нече USART бар түзмөктөргө ташуу үчүн скелет катары коштум.
  • баары. Powerup же powerdown командасынын бул аргументи айтылган бардык перифериялык түзүлүштөрдү күйгүзөт же баарын бир буйрук менен өчүрөт. Дагы, бул буйрукту акылдуулук менен колдонуңуз.

root@ATmega328p> powerdown twi Твинин түшүүсү complete.root@ATmega328p> powerup twi

Таймерлерди баштоо жана токтотуу Кабыкта колдонууга жеткиликтүү 16-биттик таймер бар. Сиз таймерди таймер буйругу менен баштайсыз:

таймердин башталышыжана токтоочу аргумент менен таймерди токтотуңуз

таймерди токтотууБул таймер ички USART таймерине каршы келбейт. USART таймеринин ишке ашуу чоо -жайын билүү үчүн кодду караңыз, эгерде сизди ушундай кооз деталдар кызыктырса

root@ATmega328p> таймердин башталышы timer.root@ATmega328p> таймердин токтошу Өткөн убакыт: ~ 157 секунд Аныктыгын текшерүү Кабык EEPROMда 8 белгиден турган сырсөздү сактай алат. Бул сырсөз механизми telnet кирүү мүмкүнчүлүктөрүн колдоо үчүн түзүлгөн, бирок башка нерселерди коргоо үчүн кеңейтилиши мүмкүн. Мисалы, сиз аутентификация механизми аркылуу регистрдин баалуулугун өзгөртүү сыяктуу кээ бир буйруктарды талап кыла аласыз.

root@ATmega328p> passwd blahWEote root сырсөзүн EEPROMго жазыңызAuth буйругу менен анын сырсөзүнө каршы авторизация (же код аркылуу программалык түрдө уруксат талап кылынат). Эскертүү, эгерде сиз түп сырсөздү өзгөртүүгө аракет кылып жатсаңыз жана мурунтан эле түпнуска сырсөзү коюлган болсо, аны жаңы сырсөзгө алмаштырууга уруксат берүүдөн мурун эски сырсөзгө каршы өзүңүзгө уруксат берүүңүз керек.

root@ATmega328p> passwd blinky Сиз өзүңүздү авторизациялашыңыз керек first.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinkyEEPROMго жаңы тамыр сырсөзүн жазыңызАлбетте, сиз эски баалуулуктарыңызды жана өзгөрмөлөрүңүздү калыбына келтирүү үчүн программаны өчүрсөңүз, avrsh.eep файлын жүктөшүңүз керек болот. Makefile сиз үчүн EEPROM файлын түзөт. Өзгөрмөлөр Кабык колдонуучу тарабынан аныкталган өзгөрмөлөр түшүнүгүн түшүнөт. Код муну 20 менен чектейт, бирок эгер сиз кааласаңыз, script.hдеги MAX_VARIABLES аныктамасын өзгөртүү менен өзгөртө аласыз. Сиз каалаган 16-биттик маанини (башкача айтканда 65, 536га чейинки каалаган санды) кийинчерээк кайра чакыртып алуу үчүн өзгөрмөгө сактай аласыз. Синтаксис регистрлерге окшош, бирок кабыктын өзгөрмөлөрүн белгилөө үчүн доллар белгиси ($) колдонулат. Басма өзгөрмөлөр командасы менен бардык өзгөрмөлөрүңүздү тизмектеңиз

басып чыгаруу өзгөрмөлөрү Колдонуучу тарабынан аныкталган өзгөрмөлөр: Индекстин аты -> Мааниси (01): $ FREE $ -> 0 (02): $ БЕШТИН $ -> 0 (03): $ АКЫСЫЗ $ -> 0 (04): $ АКЫСЫЗ $ -> 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 $ -> 0 Толук. Өзгөрмөнү коюңуз

$ newvar = 25 $ timeout = 23245Берилген өзгөрмөнүн маанисин алыңыз

root@ATmega328p> echo $ newvar $ newvar 25Сиз буга чейин билген бардык буйруктарды басып чыгаруу буйругу менен көрө аласыз

Колдонуучу аныктаган өзгөрмөлөр: Индекс Аты -> Мааниси (01): newvar -> 25 (02): тайм -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 $ -> 0 Толук.$ FREE $ аты жөн эле бул өзгөрүлмө жер бекер экенин жана азырынча өзгөрмө ат берилбегенин көрсөтөт.

5 -кадам: Shellди ыңгайлаштыруу

Shellди ыңгайлаштыруу
Shellди ыңгайлаштыруу

Сиз кааласаңыз, кодду бузуп, аны өз керектөөлөрүңүзгө ылайыкташтырсаңыз болот. Эгерде мен бул кодду чыгарарымды билсем, мен өзүнчө командалык котормочу классын жана буйрук структурасын түзмөкмүн жана функциянын көрсөткүчүн чакыруу аркылуу кайталанмакмын. Бул коддун суммасын азайтат, бирок кабык командалык сапты талдайт жана тийиштүү кабык ыкмасын чакырат. Өзүңүздүн жеке буйруктарыңызды кошуу үчүн, төмөнкүлөрдү аткарыңыз: 1. Командаңызды талдоо тизмесине кошуңуз. буйрук сабын талдап, сизге буйрукту жана ар кандай аргументтерди өзүнчө бериңиз. Аргументтер көрсөткүчтөргө же көрсөткүчтөрдүн массивине берилет, бирок сиз алар менен иштөөнү жактырасыз. Бул shell.cpp табылган. Shell.cpp ачыңыз жана AVRShell классынын ExecCmd ыкмасын табыңыз. Программанын эс тутумуна буйрукту кошууну кааласаңыз болот. Эгер кылсаңыз, буйрукту progmem.h жана progmem.cppке кошуңуз. Сиз түздөн -түз PSTR () макросун колдонуп, программанын эс тутумуна буйрукту кошо аласыз, бирок сиз мурда айтылган типтеги дагы бир эскертүүнү жаратасыз. Дагы, бул C ++ менен иштеген белгилүү мүчүлүштүктөр, бирок буйрукту түздөн -түз progmem.* Файлдарына кошуп, мен кылгандай бул көйгөйдү чече аласыз. Эгерде сиз SRAM колдонууга кошууну каалабасаңыз, анда мен буйрукту "саат" буйругу менен көрсөткөндөй кошо аласыз. "Newcmd" деп аталган жаңы буйрукту кошкуңуз келгенин айт. AVRShell:: ExecCmd'ге өтүңүз жана төмөнкү кодду киргизүү үчүн ыңгайлуу жерди табыңыз:

else if (! strcmp (c, "newcmd")) cmdNewCmd (args);Бул сиздин буйругуңузду кошуп, кийинки кадамда жазыла турган cmdNewCmd ыкмасын чакырат. 2. Ыңгайлаштырылган буйрук кодуңузду жазыңыз Ушул эле файлга өзүңүздүн буйрук кодуңузду кошуңуз. Бул методдун аныктамасы. Сиз дагы эле shell.hге декларацияны кошкуңуз келет. Жөн гана аны башка буйруктарга кошуңуз. Мурунку мисалда, код окшош болушу мүмкүн

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("Сиздин буйругуңуз %s / r / n", args [0]); WriteRAM (buff);}Бул жерде бир нече нерсе бар. Биринчиден, "buff"-бул сиздин колдонууңуз үчүн коддо берилген 40 белгиден турган массив буфери. Биз sprintf программасынын эстутум версиясын колдонобуз, анткени аны PSTR өткөрүп жатабыз. Кааласаңыз, кадимки версияны колдонсоңуз болот, бирок форматты PSTRте өткөрбөңүз. Ошондой эле, аргументтер args массивинде. Эгерде сиз "newcmd arg1 arg2" деп терсеңиз, анда бул аргументтерге args [0] жана args [1] жазуулары менен кире аласыз. Сиз коддо аныкталгандай MAX_ARGS максимумун өткөрүп бере аласыз. WriteLine жана WriteRAM - бул UARTдын бир эле аталыштагы методдорун кайтаруучу глобалдык функциялар. Бул функциянын 2 -аргументи жашыруун. Эгер эч нерсе өтпөсөңүз, андан кийин буйрук сабы жазылат. Эгерде сиз 0ду 2 -аргумент катары берсеңиз, чакыруу жазылбайт. Бул буйрук сабы колдонуучуга кайтарылганга чейин чыгаруу үчүн бир нече өзүнчө саптарды жазгыңыз келгенде пайдалуу. 3. Кабык буйрук кодун аткарсын Сиз буга чейин кабыктын аткаруучусуна cmdNewCmd ыкмасын аткарууну жаңы команданы орнотуп жатканда айткансыз, бирок shell.h файлына аны кабык объектиси түшүнүшү үчүн кошуңуз. Жөн гана акыркы буйруктун астына же биринчи буйруктун алдына, же ошол жерде каалаган жерге кошуңуз. Камтылган программаны Arduinoго кайра чогултуп, жүктөп бериңиз жана сиздин жаңы буйругуңуз кабыктан жеткиликтүү.

6 -кадам: Жыйынтык

Сиз AVR/Arduinoго кантип орнотууну жана туташууну билишиңиз керек жана иштеп жаткан микроконтроллериңизге жандуу чакыруу аласыз. Сиз MCUдан иштөө убактысынын маалыматын тартып ала турган же MCUга баалуулуктарды орното турган бир нече буйруктарды билесиз. Ошондой эле, сиз өзүңүздүн өзгөчө коддоруңузду кабыкка кантип кошуу керектигин көрсөткөнсүз, андан кийин аны өз керектөөлөрүңүзгө ылайыкташтыруу үчүн. Сиз, атүгүл, буйрук котормочуну сиздин керектүү буйруктарыңызды камтуусу үчүн ичке киргизсеңиз болот, эгер бул сиздин керектөөлөрүңүзгө туура келсе. Ар дайымкыдай эле, мен бул көрсөтмөнү кантип жакшыртуу керектиги боюнча комментарийлерди же сунуштарды күтөм! AVR менен көңүл ач!

Сунушталууда: