BASINT на Pinboard II (AVR). Тестовый пример


Аннотация
Показан демонстрационный пример работы с интерпретатором бейсика BASINT на Pinboard II + AVR в стандартной комплектации (ATmega16 @ 16 МГц).
Исходники
Все исходники были выложены авторами вот по этой ссылке.
Авторы: Александр Костюк (UA6ANN), Евгений Фадеев (RV3BJ)
Документация
1. Кто не знает что такое Pinboard II и с чем его едят, то вам сюда.
2. Описание на BASINT доступно в архиве: tbs.zip
Инструменты
1. Стандартный или не очень Блокнот — редактор текстовых файлов в Windows.
2. Программа терминал. В документации поясняют как работать с Hyper Terminal, но я покажу на примере ZOC/Pro 5.05 (rus).
3. Желателен монитор COM портов. Я использую Serial Monitor 3.15.
4. Среда разработки IAR AVR 5 или 6.
Описание
Нашёл на просторах рунета такой интересный проект как AVR BASIC interpreter BASINT. Если вкратце, то мы можем загружать программу на бейсике во флеш контроллера и далее, в зависимости от установки специальной перемычки либо отлаживать программу, либо ввести контроллер в режим интерпретации записанной во флеш программы.
Выглядит это так. Покажу сначала как пользоваться, а потом что нужно изменить в исходниках, чтобы пример заработал.
Шаг 1. Запускаем монитор COM-порта и наш терминал. Мониторинг нужен, чтобы отслеживать то, как передаются данные из буфера напрямую в COM-порт посредством терминала. Некоторые терминалы нужно немного настроить, чтобы они не транслировали некоторые символы на свой лад. К таким терминалам относится и ZOC/Pro 5.05. После того как выбрали порт и эмуляцию ANSI-терминала нужно зайти в пункт меню Установки сессии, вкладка Передача и внизу выбрать маркер CR/LF

Если этого не сделать, то вместо 0x0D 0x0A (перевод строки) мы будем передавать 0x0D 0x20, что будет потом видно в листинге терминала.
Остальные настройки стандартные:
— скорость: 9600;
— бит данных: 8;
— чётность: none;
— стоп-биты: 1.
Остальные настройки терминала:



Шаг 2. Допустим, что мы имеем уже прошитый контроллер. Если мы не установим перемычку Write Protect (см. схему), то у нас на терминале появится такой вот вывод:

Шаг 3. Теперь создадим программу и загрузим её в контроллер. Программка будет такая (взята из описания):
print
print "Sending 10 stars to the terminal"
for i=1 to 10
print "*";
next
Выбираем в терминале пункт 2 — Load:

Появится надпись Reflash, т.е. сейчас контроллер ожидает ввода программы. Для этого копируем текст программы в Блокнот, оттуда в буфер обмена и вставляем её в окно терминала (в моём случае Shift + Ins):

Контроллер ответит, что всё ОК, жмём на клавишу и возвращаемся в основное меню.
Шаг 4. Теперь мы проверим листинг загруженной программы, выбрав пункт 1 — List:

После того как программа загружена (записана во флеш) можно её отладить.
Шаг 5. Для этого запускаем её на выполнение, выбрав пункт 3 — Run:

Короче говоря, всё как по документации. Эта штука работает. Единственно, о чём я хотел предупредить, так это то, что у меня Write Protect работал наоборот: когда был высокий уровень на выбранном мною выводе, тогда меню не было. Но это не суть важно.
Компиляция
Интерпретатор написан на языке C в среде IAR, поэтому качаем и устанавливаем себе доступную версию с рутрекера. Там есть IAR 6.10.2.
Далее нам нужно чуть-чуть настроить сборку в файле hwdef.h. Найдите там похожий код и сделайте изменения:
#ifdef DBOARD_40PIN_MEGA16
//#define FOSC 14745600
#define FOSC 16000000
#define LED_RUN_INIT() { DDRC |= (1 << PC7); PORTC |= (1 << PC7); }
#define LED_RUN_ON() PORTC &= ~(1 << PC7)
#define LED_RUN_OFF() PORTC |= (1 << PC7)
#define CTS_INIT() DDRD |= (1 << PD2)
#define CTS_LOW() PORTD |= (1 << PD2)
#define CTS_HIGH() PORTD &= ~(1 << PD2)
#define PROTECT_PIN_INIT() {PORTC |= (1 << PC0);DDRC &= ~(1 << PC0);}
#define PROTECT_PIN() (PINC & (1 << PC0))
#endif
Настройка скорости находится в core.c в функции main():
#ifdef IO_CONTROLLER_WITH_ATMEGA64
open_port(0, 57600,64, 64);
#else
UBRRL = br9600; // set Baud rate
UCSRB = 0x98; // enable uart receive + transmit + rxc interrupt
#endif
После того как мы выбрали частоту кварца, PROTECT_PIN и скорость работы по USART, можно компилировать таргет BASINTM16 — HEX, который и создаст нам необходимый для Pinboard II файл прошивки. После компиляции получим статистику:
IAR Universal Linker V5.2.3.14
Copyright 1987-2011 IAR Systems AB.
12 559 bytes of CODE memory
997 bytes of DATA memory (+ 37 absolute )
Errors: none
Warnings: none
В папке проекта ищем файл HEX\Exe\BASINTM16.HEX и прошиваем плату:

Вот в общем-то и всё. Проект этот староват уже и заброшен, но достаточно интересен и может сподвигнуть кого-нибудь на новые подвиги, взяв всё хорошее у старших товарищей и добавив чего-то нового.
Примечания
Если кому нужны какие из приведённых инструментов, то я могу их выложить к себе на ftp. Остальное читайте в сопроводительной документации. Там есть чего почитать про поддерживаемый диалект бейсика. Если что-то не получается, то не забывайте смотреть логи:

Кстати, если взять контроллер постарше, приделать работу с флешки и modbus для считывания переменных, то может получиться вполне себе не плохая игрушка в виде ПЛК.
- +3
- 25 июля 2012, 06:42
- uni
- 2
Файлы в топике:
tbs.zip, BASINT_SRC_23B.ZIP
В этот раз статья получилась лучше и понятней.
Интересный проект, но я так и не смог придумать для себя куда этот интерпретатор можно применить. Может кому-то пригодиться :)
Интересный проект, но я так и не смог придумать для себя куда этот интерпретатор можно применить. Может кому-то пригодиться :)
В образовательных целях вполне можно. или тем кто только на бейсике и писал :)
Неплохо бы увидеть результаты какого-нибудь синтетического теста. скажем цикл от 0 до 10000 сколько времени займет. Нет, использовать я его не буду, просто для статистики.
P.S.: раза три перечитывал
Неплохо бы увидеть результаты какого-нибудь синтетического теста. скажем цикл от 0 до 10000 сколько времени займет. Нет, использовать я его не буду, просто для статистики.
P.S.: раза три перечитывал
print «Sending 10 starts to the terminal»
Да, я поправил текст программы.

Тут плохо видно (не знаю как сделать картинки большими), но вот такой тест:
на ATmega16 @ 16 МГц у меня прошёл примерно за 5 секунд. Тут вложенные циклы я сделал, т.к. для 10000 слишком быстро считает.

Тут плохо видно (не знаю как сделать картинки большими), но вот такой тест:
print
print "Begin"
for j = 0 to 3
for i = 0 to 30000
next
next
print "End"
на ATmega16 @ 16 МГц у меня прошёл примерно за 5 секунд. Тут вложенные циклы я сделал, т.к. для 10000 слишком быстро считает.
комментарий был удален
Унес в AVR.
Забавная так то вещь. Расковырять ее, добавть в нее команд устройства и получится простой программируемый модуль.
Забавная так то вещь. Расковырять ее, добавть в нее команд устройства и получится простой программируемый модуль.
Там по стилю кода полная мешанина, но по функционалу и простоте мне понравилось. Попробую постепенно переделать там всё и причесать, оптимизировать, добавить минимальный modbus, а для загрузки лучше xmodem.
Будет компилироваться в двух средах как всегда, но на C++. Обрезать жирок всегда можно, кроме того существуют примитивные алгоритмы сжатия потока байт, которые тут можно использовать для текста программы, записываемой во влеш. Работа же с флешкой в мегу 16 влезет, но вот всё остальное уже вряд ли.
Будет компилироваться в двух средах как всегда, но на C++. Обрезать жирок всегда можно, кроме того существуют примитивные алгоритмы сжатия потока байт, которые тут можно использовать для текста программы, записываемой во влеш. Работа же с флешкой в мегу 16 влезет, но вот всё остальное уже вряд ли.
Вот тут есть, алгоритм RLE: насчет RLE
Мне там нужно было когда-то, я спросил и мне код написали. Оставляю для памяти, а то потом не найду.
Мне там нужно было когда-то, я спросил и мне код написали. Оставляю для памяти, а то потом не найду.
Спасибо вам за использование этого материала. Я являюсь одним из авторов — RV3BJ. Проект создавался очень давно. Код действительно написан сумбурно. Очень хорошо, что кому-то он может оказать пользу.
Rv3bj, вы ссылаетесь на tiny basic и др., но не упоминаете AttoBasic, хотя проект существует с 2002 года? Он поддерживается и сейчас: AttoBasic home. Исходники на асм, правда.
Комментарии (18)
RSS свернуть / развернуть