в последних двух статьях, в чем вперед, я поглаживал, как он потрясающий, но странно, а затем получил вас на базовой системе и моргнул некоторые светодиоды. И пока я указал вам на мультитаски, мы еще не сделали много реального использования. Начало работы с четвертой системы, как это около половины битвы. Работа внутри микроконтроллера отличается от компиляции для микроконтроллера и выяснение рабочего процесса, как к технике проблемы, и где благотворные ресурсы не обязательно очевидны. Кроме того, есть некоторые потрясающие особенности Mecrisp-Stellaris, которые вы не можете заметить, пока вы не вскрываете систему некоторое время.
В идеале вы бы заглядывали носитель кого-то, и вы увидите некоторые из того, как они работают. Это цель этой части. Если вы уже прогнорили в нашей версии Mecrisp-Stellaris-Plus-Embello, вы готовы следовать. Если нет, вернитесь и сделайте свою домашнюю работу очень быстро. Мы все равно будем здесь, когда вы закончите. Многие из этого поста будут очень уверены, что в аромате Mecrisp-Stellaris аромат с четвертом, но, учитывая, что он проходит на тонны чипсы рук, это не плохое место.
Получать акклиматизированные
Первое, что вам нужно, чтобы привыкнуть к данному, это стек. Вы знаете, что старый каштан о людях только в состоянии сохранить пять (семь?) Вещей в их разуме одновременно? Далее ставит это к тесту.
В прошлый раз я кратко отметил команду .s («Print Stack»). В издании Hackaday я переопределил обычную Mecrisp. Около немного меньше многословного, и к моим глазам намного более читаемое. Если вы обнаружите, что вы попадаете. Подскажите, добавляя распечатка стека к нему, когда вы попадаете в Enter. Введите Print.Stack и нажмите введите еще один раз, чтобы увидеть, как он работает. Установка кнопки сброса или набрав набор набрав, будет стереть все в оперативной памяти, и это включает в себя подсказку для печати стека, поэтому вы вернетесь к чистоту.
Теперь, наверное, хорошее время для игры с операторами стека. Вы прочитали GeCrisp Glossary? Проверьте список операций жонглирования стека там. Включите Print.Stack и играйте вокруг, пока все они не имеют смысла.
Вы уже запустили слова? Он выделяет связанный список каждого слова, который далее знает, наряду с местами памяти, где они живут, и некоторые дополнительные детали – слишком много подробностей, если вы не отладки самой системы. Есть дополнительный, нестандартный, слово в Mecrisp, который только что печатает имена функций: список. Дайте это выстрел сейчас. Если вы еще не определили несколько слов, сделайте это.
: hw. “Привет, мир!” CR;
хороший, чтобы иметь на руку.
Слои в памяти
Память Mecrisp-Stellaris разделена на два валовых места: RAM и Flash. Все слова, которые предоставляются до метки «- Mecrisp-STellaris Core -», находятся в оперативной памяти, и будут потеряны при сбросе или отключении. Новые функции RAM будут добавлены к передней части списка.
После «- Mecrisp-Stellaris Core -» отмечают функции в Flash. В ранних частях вспышки раньше «- флэш-словарь -» является обычным ядром Mecrisp. Оттуда до «<>» – это слова, взятые из распределения Mecrisp, которые обычно полезны, включая некоторые функции отладки и многозадачность. Предыдущий «<>» – это вклад из библиотек Embello, в том числе множество определений GPIO, а тем до «<>» были добавлены только для этой почтовой серии.
Что не очевидно, состоит в том, что все эти маркеры с кронштейнами, окружающими их, являются краеугольными камнями. Они позволяют очистить вспышку до места памяти. Поэтому, если вы добавили некоторые дополнительные функции в Flash, и хотите уточнить обратно в состояние по умолчанию HackaDay Edition, вы можете ввести << HackAday-etts >>. Дополнительные функции будут удалены и сброс чипа. (Обратите внимание, что это теряет все, что было в оперативной памяти!) Команда Eraseflash вернет вас к маркеру «- флэш-словарь -».
Перезаписи истории
Если вы определяете слово дважды с тем же именем, у вас будут две версии слова в словаре. Когда слово называется или компилярный, интерпретатор просматривает память, от верхней части барамеривы вниз, а затем с конца вспышки обратно к началу. Слова с тем же именем в памяти, таким образом, вызываются перед тем, как они в Flash. Что может быть особенно нечетным в отношении далее, так это то, что, поскольку он компилируется в режиме реального времени, слово, которое упоминается в любом вызывающем словом, является той, который был на вершине в то время, когда было определено вызывающее слово. Занятие запутанных историй – верный способ сойти с ума.
: foo. “Foo!” ;
: бар foo. “Бар!” ;
Bar Foo! бар! Ok.
: foo. “Bizzle!” ; Переопределить фу. Ok.
Foo Bizzle! Ok.
Bar Foo! бар! Ok.
С другой стороны, вот отличный способ работы, который использует эти различные функции памяти. ОЗУ стирается на каждом сброшенном сбросе, давая вам чистый сланец, но, используя краеугольные камни, вспышка тоже не неизменна. Конечно, глубже в Flash вы должны стереть,the a lot more words you have to redefine later, assuming that some of them were useful. This suggests a layered technique to development, with the most “core” words innermost in flash. That’s also natural because words need to be defined to be called, so defining the basics first makes sense anyway.
You can compile a new word to RAM (the default) by calling compiletoram or to flash by invoking compiletoflash. Prototype your words in RAM. feel complimentary to overwrite them as lots of times as you want, but remember that you have to redefine any dependent words after you change something upstream to keep the calling history intact. once you’re made with a chunk of development, type reset and clear RAM. now redefine these words into flash. If you develop your application from the bottom up, you’ll find that this all hangs together nicely. When you’ve discovered a bug in something that’s already written to flash, the cornerstones come to the rescue.
Finally, this layered nature of Forth definitions can be really handy. For example, a function init that’s defined in flash gets run on each reset. It includes things like setting the processor speed and the system tick, that you probably don’t want to mess with. because you can overwrite init, and any compilation uses the words available at the time of compilation, you can simply layer your functionality onto init: : init init .” howdy!” cr ;. The first “init” is the name of the new word, and the second is calling the pre-existing init, and doing all of the setup. The remainder of the definition is yours to play with. On restart, everything will get carried out in the buy it was defined.
Земные блага
I write a lot of code in an editor (Vim) and then send it over to the chip to play around with. very specifically, I wrote a script called forth_upload.sh that contains the following:
[[ $1 ]] && TERM=$1 || TERM=/dev/ttyUSB0
DELAY=0.2
while read -r f; do echo “$f” ; echo “$f” > $TERM ; sleep ${DELAY}s ; Готово
To send a file to the serial port, and thus to Forth, forth_upload.sh < myfunctions.fs will work. It loops through each line in the file, allowing a 0.2 second delay for the system to compile anything. This delay is too long, in my experience, but the bugs from having it short are lousy to find. Folie takes the technique of trying to find the “ok.” prompt to speed things up, but this has issues of its own. If you’re using Vim, you can send individual words or a full file with the following: nnoremap u vip:silent w !forth_upload.sh inoremap u :silent .w !forth_upload.sh nnoremap U :silent w !forth_upload.sh This setup lets me develop and tweak functions in an editor that I like, and then send them nearly quickly into the Forth system to test out. I keep a terminal window open that’s always logged into the Forth system, so I can enjoy the new words get defined in, and then start playing around with them interactively. It’s pretty sweet. The Solar Cell Tester Now to a quick real example that will make use of all of the above. I recently made a decision to characterize a bunch of small solar panels that I had in my junk drawer. This indicates adjusting the load on the panel and noting down the voltage generated by the panel and the current through the load. I hooked up two multimeters and wrote down some numbers, but this is undoubtedly a job for a microcontroller. As is clear from the image, this is a quick lashup. The larger chunk of copper-clad has a current-measurement resistor and a pair of resistors configured as a voltage divider to step down the panel voltage to something the 3.3 V ADC can handle. Dangling off that is the (silvered) variable load circuit, which is entirely sub-optimal: a MOSFET dissipates the heat by being turned half on by a PWM’ed voltage fiiltered by that 100 uF capacitor. The 9 V battery and optoisolator were cobbled on to make sure a high enough voltage to fully open the MOSFET, which wanted a lot more than 3.3 V. This horrible, but functional, load circuit was a later addition — the first version just had a potentiometer here, until that got smoked by running too much current through it. The pushbuttons are used to start and stop recordings from the device out on the balcony without having to run back inside. The procedure was to alligator-clip in a new panel, and hold the white button while it made recordings. The small black button is pressed once to demarcate a new cell’s data. The data goes back to my laptop over UART serial through an ESP8266 running esp-link as a transparent WiFi serial bridge, seen in the upper left, ideal next to the recycled laptop batteries. hot glue and cardboard round out the state-of-the-art build. To the Datasheet! This kind of quick and hands-on tool-building is where Forth shines. The Jeelabs Forth libraries already have some functions that simplify the ADC setup, but they actually didn’t work for me, so I looked to the datasheet.Минимальный минимум, который нужно получить работу ADC, заключается в включении периферийных часов ADC, включите блок ADC, а затем выберите время выборки ADC. Мы также можем захотеть запустить процедуру калибровки ADC, чтобы убедиться, что наши чтения были правильными. Это все виды низкоуровневых деталей, которые вам придется сделать с любым микроконтроллером - или опираться на библиотеку, которая делает это для вас. Чтение таблицы данных, чтобы включить системные часы ADC, нам нужно установить бит ADC1EN в регистре памяти RCC-APB2ENR. Что бы ни. Mecrisp-Stellaris имеет какой-то код поддержки, который читает эти значения из файлов, которые поставляются производителем. Я включил их в Core / Reginers / Directory. Файл карты памяти имел отличную Mnemonics для всех регистров, но я не в восторге от того, как обрабатываются отдельные битовые имена. Это як для бритья в другой день, я пытаюсь получить вещи. Вот набор слов ADC Beat ADC, которые я придумал: \ Монтировать \ Pb0 - Ain8 подключен к напряжению панели \ Pb1 - Ain9 подключен к текущему смыслу резистора : adc.rcc-enable 9 бит RCC-APB2ENR BIS! ; \ set adc1en. : Adc.et-Adon 0 бит ADC1-CR2 BIS! ; \ set Adon, чтобы включить ADC : adc.set-cal-bit 2 бит adc1-cr2 bis! ; : adc.cal - сделано? 2 бит ADC1-CR2 бит @ 0 =; : adc.isdone? 1 бит ADC1-SR BIT @; 9 бит создает номер с девятом битовым набором и все остальным нулем, а RCC-APB2ENR BIS! Устанавливает нужный бит в соответствующем регистре управления ADC. Все во всем, довольно непрозрачно, но и один на один с инструкциями с табличкой. Хорошее название этих нижних слоев слов делает вещи немного лучше одного слоя вверх. Например, слово, которое отвечает за управление калибровкой (установить один бит, подождать, пока другой не понятен) относительно читается :: adc.cal adc.set-cal-bit начал adc.cal-conten? до ;. И здесь мы видим наш первый контроль потока, начало ... до построения. Купить странно, верно? Начать запускает петлю, тестовая функция ADC-CAL-CARE - Выполняется, оставляя истинное или ложное значение в стеке, а затем до тех пор, пока не прочитайте это значение и петли назад, чтобы начать, пока значение не будет верно. Это то же самое, что и C, в то время как (! ADC-CAL-CONED ()) {;} Занятая петля. И это введение в другую ИДИУ: Использование? Для всего, что возвращает логию. Тест, исправить и тестируйте снова Итак, давайте проверим эти слова. Инициализация АЦП и прочтения легко: теперь давайте возьмем их для пробега и убедитесь, что значения - это то, что мы ожидаем. Сборка быстрого тестового приспособления в четвертом является одним из его основных сил. : test-adc Начните ADC @. CR 10 мс ключ? до ; Определяет слово, которое читает ADC, печатает значение и повторяет каждые десять миллисекунд, пока вы не ударите в Enter. Если вы сделаете это с панелью солнечной панели под флуоресцентным светом, вы выберете пульсацию частоты сети, поскольку они попадают в вашу панель, что то, о чем вы, возможно, не думали. Способность играть с вашими новыми словами, как только вы определяете их, делает этот вид следовательного кодирования, естественно. Истинное время истории. Когда я писал этот код, я установил слишком короткое время выборки на входах ADC. Это вызывает значение из одного чтения, чтобы повлиять на следующую, поскольку внутренний конденсатор ACC не имеет времени, чтобы полностью заряжать или разрядить. Я получал слишком высокие чтения для тока, когда напряжение было высоким, и слишком низкие показания для тока, когда напряжение было низким. Я бродил это довольно быстро, написав рутину, которая читала каждый канал несколько раз подряд и напечатала значения, и я оставил эти слова для потомки. (Возьмите 8 образцов каждого, для отладки) : READ - И 8 0 DO READ-V. Структура 8 0 сделать чтение-я. петля ; : readLoop начать чтение - оба CR 100 мс ключ? до ; Обратная связь с этого тестирования упражнения приведет меня к тому, чтобы переключать время образца на АЦП на их максимальное значение, потому что ничто здесь не было времени, и я использовал довольно высокий импедансный источник. (По умолчанию является проб, так быстро, как P