Съдържание:

AVRSH: обвивка на командния преводач за Arduino/AVR .: 6 стъпки (със снимки)
AVRSH: обвивка на командния преводач за Arduino/AVR .: 6 стъпки (със снимки)

Видео: AVRSH: обвивка на командния преводач за Arduino/AVR .: 6 стъпки (със снимки)

Видео: AVRSH: обвивка на командния преводач за Arduino/AVR .: 6 стъпки (със снимки)
Видео: Настя и сборник весёлых историй 2024, Юли
Anonim
AVRSH: обвивка на командния преводач за Arduino/AVR
AVRSH: обвивка на командния преводач за Arduino/AVR

Искали ли сте някога да бъдете „влезли“във вашия AVR микроконтролер? Някога мислили ли сте, че ще бъде готино да „котете“регистър, за да видите съдържанието му? Винаги ли сте искали начин за включване и изключване на отделни периферни подсистеми на вашия AVR или Arduino в * реално време *? Аз също, затова написах AVR Shell, подобна на UNIX обвивка. Той е подобен на UNIX, защото напомня акаунта на обвивката, който сте излезли и закупили, за да стартирате вашите irc nick сблъскващи ботове, както и да имате обща команда или две. Той също така има файлова система, която прилича на UNIX extfs, използвайки външен EEPROM, но това се превърна в проект за себе си, така че ще пусна този модул отделно под различна инструкция, когато е готов за производство. Ето списък на нещата, които в момента можете да правите с AVR Shell:

  • Прочетете всичките си регистри за посоки на данни (DDRn), портове и пинове в реално време
  • Пишете на всичките си DDRn, портове и щифтове, за да включите двигатели, светодиоди или сензори за четене в реално време
  • Избройте всички известни регистри в системата
  • Създавайте и съхранявайте стойности в дефинирани от потребителя променливи, архивирани от EEPROM.
  • Създайте основна парола и се удостоверете срещу нея (използва се за достъп до telnet)
  • Прочетете конфигурираната тактова честота на процесора
  • Променете тактовата честота на процесора си, като зададете предварително мащабиране
  • Стартиране и спиране на 16-битови таймери за синхронизиране на различни неща
  • Захранване и/или изключване на периферни подсистеми: аналогово-цифрови преобразуватели (ADC), сериен периферен интерфейс (SPI), двужичен интерфейс (TWI/I2C), UART/USART. Полезно, когато искате да намалите консумацията на енергия на микроконтролера или да активирате определени функции.
  • Написано на C ++ с обекти за многократна употреба.

Тази инструкция ще премине през инсталирането, използването и персонализирането на avrsh.

Стъпка 1: Какво ще ви трябва

Какво ще ви трябва
Какво ще ви трябва

Тази инструкция не изисква много, освен че вие:

  • Имайте Arduino или ATmega328P. Други AVR могат да работят, но може да се наложи да промените кода, за да изброите всички регистри, които са уникални за вашия MCU. Имената трябва само да съвпадат с това, което е посочено в заглавния файл, уникален за вашия MCU. Много от имената на регистрите са еднакви между AVR, така че вашият пробег може да варира при пренасяне.
  • Имате начин да се свържете със серийния USART на вашия Arduino/AVR. Системата е тествана най -широко с AVR Terminal, приложение за Windows, което прави серийна връзка през вашия USB или COM порт. Работи с Arduinos, използвайки USB връзка и всеки AVR, използващ USB-BUB от Moderndevice.com. Други терминални опции включват: Putty, minicom (Linux и FreeBSD), екран (Linux/FreeBSD), Hyperterminal, Teraterm. Открих, че kit и teraterm изпращат боклуци при свързване, така че първата ви команда може да бъде объркана.
  • Инсталирайте и стартирайте фърмуера на AVR Shell, който можете да изтеглите от тези страници, или винаги получавайте най -новата версия на BattleDroids.net.

За да инсталирате AVR терминала, просто го разопаковайте и стартирайте. За да инсталирате фърмуера на AVR Shell, изтеглете го или директно качете шестнадесетичния файл и свържете серийния си терминал на 9600 бода, или го компилирайте сами с „make“и след това „make program“, за да качите hex. Обърнете внимание, че може да се наложи да промените настройките на AVRDUDE, за да отразяват вашия COM порт. Забележка: Атрибутът PROGMEM е счупен в текущата AVR GCC реализация за C ++ и това е известна грешка. Ако го компилирате, очаквайте да получите много предупредителни съобщения, казващи „предупреждение: само инициализирани променливи могат да бъдат поставени в областта на паметта на програмата“. Освен че е досадно да се види, това предупреждение е безобидно. Тъй като C ++ на вградената платформа не е високо в списъка с приоритети на AVR GCC, не е известно кога това ще бъде поправено. Ако проверите кода, ще видите къде съм работил, за да намаля това предупреждение, като внедря моите собствени изявления за атрибути. Изтеглете и инсталирайте всичко, което може да ви се наложи, след което обърнете страницата и нека да пропукаме.

Стъпка 2: Четене и писане на регистри

Четене и писане на регистри
Четене и писане на регистри

AVR Shell е написан предимно за достъп до някои сензори, които бях свързал към моя AVR. Започна с обикновен светодиод, след което се премести към светлинни сензори, температурни сензори и накрая към два ултразвукови преобразувателя. avrsh може да настрои цифровите компоненти на тези сензори, като запише в регистрите, които ги контролират. Манипулиране на AVR регистри по време на работа За да получите списък с всички известни регистри на вашия Arduino, въведете:

печатни регистри и ще получите разпечатка, изглеждаща така

Знам за следните регистри:

TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR примерна ядрена програма 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 OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B UPS TWC UBR За да видите как отделните битове са зададени във всеки регистър, използвайте командата cat или echo

котка %GPIOR0 Тук питам командния интерпретатор да покаже или ехо съдържанието на I/O регистъра за общо предназначение № 0. Забележете знака за процент (%) пред името на регистъра. Това ви е необходимо, за да посочите на черупката, че това е запазена ключова дума, идентифицираща регистър. Типичният изход от команда echo изглежда така

GPIOR0 (0x0) е зададено на [00000000] Изходът показва името на регистъра, шестнадесетичната стойност, намерена в регистъра, и двоичното представяне на регистъра (показващ всеки бит като 1 или 0). За да зададете определен бит във всеки регистър, използвайте оператора "index of" . Например, да кажем, че искам третият бит да е 1

%GPIOR0 [3] = 1 и черупката ще ви даде отговор, показващ нейното действие и резултата

GPIOR0 (0x0) настроено на [00000000] (0x8) зададено на [00001000] Не забравяйте знака за процент, за да кажете на черупката, че работите с регистър. Също така имайте предвид, че като зададете 3-ти бит, това е 4 бита, тъй като нашите AVR използват нулев индекс. С други думи, броейки към 3 -тия бит, броите 0, 1, 2, 3, което е 4 -то място, но 3 -тото битово. Можете да изчистите малко по същия начин, като зададете бит на нула. Чрез задаване на битове по този начин можете да промените функционирането на вашия AVR в движение. Например, чрез промяна на стойността на съвпадение на таймера CTC, намерена в OCR1A. Той също така ви позволява да надникнете в определени настройки, които ще трябва да проверите програмно във вашия код, като например стойността на UBBR за скоростта на предаване. Работа с DDRn, PORTn и PINn Входно -изходните щифтове също се присвояват на регистрите и могат да бъдат зададени по абсолютно същия начин, но е създаден специален синтаксис за работа с тези типове регистри. В кода има нормален процес за, да речем, включване на светодиод или друго устройство, което изисква цифрово високо или ниско ниво. Изисква се настройка на регистъра за посока на данни, за да се посочи, че щифтът е за извеждане, и след това записване на 1 или 0 към конкретния бит в правилния порт. Ако приемем, че имаме светодиод, свързан към цифров щифт 13 (PB5) и искаме да го включим, ето как да направите това, докато вашият AVR работи

задайте щифт pb5 изход пиши пин pb5 високо Изходът, освен че може да види как LED светва, ще изглежда така

root@ATmega328p> задаване на извод pb5 изход Задаване на pb5 за изход root@ATmega328p> запис пин pb5 високо Писане на логика високо до пин pb5 "Root@ATmega328p>" е подканата на черупката, която показва, че е готова да приема команди от вас. За да изключите светодиода, просто бихте написали ниско на щифта. Ако искате да прочетете цифровия вход от щифт, използвайте командата за четене. Използвайки горния ни пример

root@ATmega328p> прочетете щифта pb5Pin: pb5 е ВИСОК Друга възможност е просто да повторите регистъра на пиновете, който контролира този порт за пинове. Например, ако имаме dip превключватели, свързани към цифров извод 7 и 8 (PD7 и PD8), можете да изпратите командата

ехо %PIND и черупката след това ще покаже съдържанието на този регистър, показвайки всички състояния на входа/изхода на свързаните устройства и дали състоянието на превключвателя е включено или изключено.

Стъпка 3: Предпазители за четене и писане

Предпазители за четене и писане
Предпазители за четене и писане

Предпазителите са специални видове регистри. Те контролират всичко-от тактовата честота на вашия микроконтролер до какви методи за програмиране са налични за защита на EEPROM за защита от запис. Понякога ще трябва да промените тези настройки, особено ако създавате самостоятелна AVR система. Не съм сигурен, че трябва да промените настройките на предпазителите си в Arduino. Внимавайте с предпазителите си; можете да се заключите, ако сте ги задали неправилно. В предишна инструкция, аз демонстрирах как можете да четете и настройвате предпазителите си с помощта на вашия програмист и avrdude. Тук ще ви покажа как да прочетете предпазителите си по време на работа, за да видите как вашият MCU всъщност ги е настроил. Обърнете внимание, че това не е настройката за време на компилиране, която получавате от определенията, а действителните предпазители, докато MCU ги чете по време на изпълнение. От таблица 27-9 в листа с данни ATmega328P (книга с данни, повече като нея) битовете на ниския байт на предпазителя са както следва:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Интересно нещо, което трябва да се отбележи, е, че с предпазители 0 означава програмиран, а 1 означава, че този конкретен бит е непрограмиран. Донякъде контраинтуитивно, но щом го разберете, го знаете.

  • CKDIV8 настройва часовника на вашия процесор да бъде разделен на 8. ATmega328P идва от фабрично програмиран да използва своя вътрешен осцилатор на 8MHz с CKDIV8 програмиран (т.е. настроен на 0), което ви дава краен F_CPU или честота на процесора от 1MHz. На Arduino това се променя, тъй като те са конфигурирани да използват външен осцилатор на 16MHz.
  • CKOUT, когато е програмиран, ще изведе вашия часовник на процесора на PB0, който е цифров пин 8 на Arduinos.
  • SUT [1..0] определя времето за стартиране на вашия AVR.
  • CKSEL [3..0] задава източника на часовник, като например вътрешен RC осцилатор, външен осцилатор и т.н.

Когато прочетете предпазителите си, те ще ви бъдат върнати в шестнадесетично число. Това е форматът, от който се нуждаете, ако искате да напишете предпазителите чрез avrdude. На моя arduino ето какво получавам, когато чета долния байт на предпазителя:

root@ATmega328p> прочетете lfuse Долен предпазител: 0xffТака че всички битове са настроени на 1. Направих същата процедура на клонинг на Arduino и получих същата стойност. Проверявайки една от моите самостоятелни AVR системи, получих 0xDA, което е стойността, която бях задал известно време при конфигурирането на чипа. Същата процедура се използва за проверка на байта на високия предпазител, разширения байт на предпазителя и заключването на предпазителите. Байтовете на предпазителя за калибриране и подпис са деактивирани в кода с директива на препроцесора #if 0, която можете да промените, ако се почувствате оскъдни.

Стъпка 4: Други команди

Други команди
Други команди

Има няколко други команди, които интерпретаторът на команди разбира, че може да ви бъде полезен. Можете да видите всички изпълнени и бъдещи команди за издаване, като изпратите помощ или меню в подканата. Набързо ще ги разгледам тук, тъй като те са самопоясними. Настройки на честотата на тактовата честота на процесора Можете да разберете какъв е вашият фърмуер е конфигуриран да използва като настройки на часовника на процесора с командата fcpu:

root@ATmega328p> fcpu Честота на процесора: 16000000Това е 16 милиона, или 16 милиона херца, по -известни като 16 MHz. Можете да промените това в движение, по някаква причина, с командата часовник. Тази команда взема един аргумент: предсказващото устройство за използване при разделяне на тактовата честота. Командата часовник разбира тези стойности за предварително деклариране:

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

Използвайки командата:

часовник ckdiv2 когато скоростта на процесора ви е 16MHz, това би довело до промяна на тактовата честота на 8MHz. Използването на предварително деклариране на ckdiv64 с начална тактова честота 16MHz ще доведе до крайна тактова честота от 250 KHz. Защо на Земята бихте искали да направите своя MCU по -бавен? Е, от една страна, по -ниската тактова честота консумира по -малко енергия и ако вашият MCU се изтощава от батерия в корпус на проект, може да не се нуждаете от него да работи с максимална скорост и следователно може да намали скоростта и да намали консумацията на енергия, увеличавайки живота на батерията. Също така, ако използвате часовника за някакви проблеми с времето с друго MCU, да речем, внедряване на софтуер UART или нещо подобно, може да искате да го настроите на определена стойност, която е лесна за получаване на хубава равномерна скорост на предаване с по -ниски проценти грешки. Захранване и изключване на периферни подсистеми Същото, както и споменатото по-горе намаляване на консумацията на енергия, може да искате да намалите допълнително захранването, като изключите някои от вградените периферни устройства, които не използвате. Интерпретаторът на командите и черупката в момента могат да включват и изключват следните периферни устройства:

  • Аналогово-цифров преобразувател (ADC). Това периферно устройство се използва, когато имате аналогов сензор, предоставящ данни (като температура, светлина, ускорение и т.н.) и трябва да ги преобразувате в цифрова стойност.
  • Сериен периферен интерфейс (SPI). SPI шината се използва за комуникация с други устройства, поддържащи SPI, като външна памет, LED драйвери, външни ADC и т.н. ако програмирате чрез ISP.
  • Двупроводен интерфейс. Някои външни устройства използват шината I2C за комуникация, въпреки че те бързо се заменят с устройства, поддържащи SPI, тъй като SPI има по-голяма производителност.
  • USART. Това е вашият сериен интерфейс. Вероятно не искате да изключите това, ако сте свързани към AVR чрез серийната връзка! Въпреки това, добавих това тук като скелет за пренасяне към устройства, които имат множество USART, като ATmega162 или ATmega644P.
  • всичко. Този аргумент към командата за включване или изключване включва всички споменати периферни устройства или ги изключва с една команда. Отново използвайте тази команда разумно.

root@ATmega328p> powerdown twiPowerdown на twi complete.root@ATmega328p> powerup twiPowerup на twi завършен.

Стартиране и спиране на таймери Черупката има вграден 16-битов таймер, който е достъпен за използване. Стартирате таймера с командата таймер:

таймер старти спрете таймера с аргумента стоп

таймер спиранеТози таймер няма да влиза в конфликт с вътрешния USART таймер. Вижте кода за подробности за внедряването на USART таймера, ако този вид кървава подробност ви интересува

root@ATmega328p> таймер старт Стартиран timer.root@ATmega328p> таймер стоп Изминало време: ~ 157 секунди Удостоверяване Черупката може да съхранява 8-знакова парола в EEPROM. Този механизъм за парола е създаден, за да поддържа възможностите за влизане в telnet, но може да бъде разширен, за да защити други неща. Например, можете да изисквате определени команди, като промяна на стойностите на регистъра, чрез механизма за удостоверяване. Задайте паролата с командата за парола

root@ATmega328p> passwd blah Написа парола за root в EEPROMОторизирайте срещу паролата (или изисквайте оторизация програмно чрез кода) с командата auth. Обърнете внимание, че ако се опитате да промените основната парола и вече е зададена парола за root, трябва да се оторизирате срещу старата парола, преди да ви бъде позволено да я промените на нова парола

root@ATmega328p> passwd blinky Трябва първо да се оторизирате. root_ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinky Написа нова парола за root на EEPROMРазбира се, ще трябва да заредите файла avrsh.eep, ако изтриете фърмуера, за да възстановите старите си стойности и променливи. Makefile ще създаде EEPROM файла за вас. Променливи Черупката разбира понятието дефинирани от потребителя променливи. Кодът ограничава това до 20, но можете да го промените, ако желаете, като промените дефинирането MAX_VARIABLES в script.h. Можете да запишете всяка 16-битова стойност (т.е. всяко число до 65, 536) в променлива, която да бъде извикана по-късно. Синтаксисът е подобен на регистрите, с изключение на знак за долар ($), който се използва за обозначаване на променливи към черупката. Избройте всичките си променливи с командата print variables

печат на променливи Променливи, определени от потребителя: Име на индекса -> Стойност (01): $ БЕЗПЛАТНО $ -> 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): $ БЕЗПЛАТНО $ -> 0Попълнете. Задайте променлива

$ newvar = 25 $ таймаут = 23245Вземете стойността на дадена променлива

root@ATmega328p> ехо $ 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): $ БЕЗПЛАТНО $ -> 0Попълнете. Името $ FREE $ просто показва, че тази променлива местоположение е безплатна и все още не е присвоена на променлива.

Стъпка 5: Персонализиране на черупката

Персонализиране на Shell
Персонализиране на Shell

Можете да хакнете кода и да го персонализирате според вашите собствени нужди, ако желаете. Ако знаех, че ще пусна този код, щях да направя отделен клас интерпретатор на команди и структура на командите и просто да повторя това извикване на показалец на функция. Това би намалило количеството на кода, но докато стои, черупката анализира командния ред и извиква подходящия метод на обвивката. За да добавите свои собствени персонализирани команди, направете следното: 1. Добавете вашата команда към списъка за анализ анализирайте командния ред и ще ви даде командата и всички аргументи поотделно. Аргументите се предават като указатели към указатели или масив от указатели, както и да искате да работите с тях. Това се намира в shell.cpp. Отворете shell.cpp и намерете метода ExecCmd от класа AVRShell. Може да искате да добавите командата към паметта на програмата. Ако го направите, добавете командата в progmem.h и progmem.cpp. Можете да добавите командата към програмната памет директно с помощта на макроса PSTR (), но ще генерирате друго предупреждение от типа, споменат по -рано. Отново, това е известна грешка, работеща с C ++, но можете да заобиколите това, като добавите командата директно в progmem.* Файловете, както направих аз. Ако нямате нищо против да добавите към използването на SRAM, можете да добавите командата, както съм илюстрирал с командата "часовник". Кажете, че искате да добавите нова команда, наречена "newcmd." Отидете на AVRShell:: ExecCmd и намерете удобно място за вмъкване на следния код:

иначе 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 със същото име. Вторият аргумент на тази функция е неявен. Ако не предадете нищо, след това ще бъде написан команден ред. Ако предадете 0 като 2 -ри аргумент, подканата няма да бъде записана. Това е полезно, когато искате да напишете няколко отделни низове за извеждане, преди командният ред да бъде върнат на потребителя. 3. Накарайте черупката да изпълни кода на командата Вече казахте на изпълнителя на обвивката да изпълни метода cmdNewCmd, когато настройвате новата команда, но го добавете към файла shell.h, за да го разбере обектът на черупката. Просто го добавете под последната команда или пред първата команда, или където и да е там. И това е всичко. Прекомпилирайте и качете фърмуера на вашия Arduino и новата ви команда е достъпна от черупката в подканата.

Стъпка 6: Обобщение

Трябва да знаете как да инсталирате и да се свържете с вашия AVR/Arduino и да получите подкана на живо на вашия работещ микроконтролер. Познавате няколко команди, които ще изтеглят данни по време на работа от MCU или задават стойности в MCU в движение. Също така ви беше показано как да добавите свой собствен персонализиран код, за да създадете свои собствени уникални команди в черупката, за да го персонализирате допълнително за вашите собствени нужди. Можете дори да изчистите интерпретатора на команди, така че да съдържа само вашите персонализирани команди, ако това отговаря на вашите нужди. Надявам се, че сте се насладили на тази инструкция и че AVR Shell може да ви бъде полезен, или като интерпретатор на команди в реално време или като процес на обучение при прилагане на вашите собствени. Както винаги, очаквам с нетърпение всякакви коментари или предложения за това как тази инструкция може да бъде подобрена! Забавлявайте се с вашия AVR!

Препоръчано: