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

AVR
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

Настройка ZOC/Pro

Если этого не сделать, то вместо 0x0D 0x0A (перевод строки) мы будем передавать 0x0D 0x20, что будет потом видно в листинге терминала.

Остальные настройки стандартные:
— скорость: 9600;
— бит данных: 8;
— чётность: none;
— стоп-биты: 1.

Остальные настройки терминала:

Установки сессии\Устройство

Установки сессии\Терминал

Установки сессии\Эмуляция

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

BASINT на Pinboard II (AVR)

Шаг 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 и прошиваем плату:

HappyJTAG2

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

Примечания


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

Лог обмена данными

Кстати, если взять контроллер постарше, приделать работу с флешки и modbus для считывания переменных, то может получиться вполне себе не плохая игрушка в виде ПЛК.
  • +3
  • 25 июля 2012, 06:42
  • uni
  • 2
Файлы в топике: tbs.zip, BASINT_SRC_23B.ZIP

Комментарии (18)

RSS свернуть / развернуть
В этот раз статья получилась лучше и понятней.
Интересный проект, но я так и не смог придумать для себя куда этот интерпретатор можно применить. Может кому-то пригодиться :)
0
В образовательных целях вполне можно. или тем кто только на бейсике и писал :)
Неплохо бы увидеть результаты какого-нибудь синтетического теста. скажем цикл от 0 до 10000 сколько времени займет. Нет, использовать я его не буду, просто для статистики.

P.S.: раза три перечитывал
print «Sending 10 starts to the terminal»
0
Да, я поправил текст программы.

Тест

Тут плохо видно (не знаю как сделать картинки большими), но вот такой тест:

print
print "Begin"
for j = 0 to 3
for i = 0 to 30000
next
next
print "End"


на ATmega16 @ 16 МГц у меня прошёл примерно за 5 секунд. Тут вложенные циклы я сделал, т.к. для 10000 слишком быстро считает.
0
Чтобы картинка была в нормальном качестве, ее надо указать ссылкой на сторонний ресурс, где она размещена.
0
Ну, это то я понял, а если ресурсом является вот эта заметка, тогда как?
0
Только через ссылку. Больше никак.
0
картинку в аттачи и ссылку на него — я обычно так делаю.
0
быстрее чем я ожидал.
Благодарю.
0
Пардоньте, а что за хеппиджитаг на русском?
0
0
комментарий был удален
А че это за УДОТ??? Влепим, товарищи, по ЖиРнОмУ минусу! Совсем ахренели…
+1
Унес в AVR.

Забавная так то вещь. Расковырять ее, добавть в нее команд устройства и получится простой программируемый модуль.
0
Там по стилю кода полная мешанина, но по функционалу и простоте мне понравилось. Попробую постепенно переделать там всё и причесать, оптимизировать, добавить минимальный modbus, а для загрузки лучше xmodem.
Будет компилироваться в двух средах как всегда, но на C++. Обрезать жирок всегда можно, кроме того существуют примитивные алгоритмы сжатия потока байт, которые тут можно использовать для текста программы, записываемой во влеш. Работа же с флешкой в мегу 16 влезет, но вот всё остальное уже вряд ли.
0
Вот тут есть, алгоритм RLE: насчет RLE
Мне там нужно было когда-то, я спросил и мне код написали. Оставляю для памяти, а то потом не найду.
0
Спасибо вам за использование этого материала. Я являюсь одним из авторов — RV3BJ. Проект создавался очень давно. Код действительно написан сумбурно. Очень хорошо, что кому-то он может оказать пользу.
0
Rv3bj, вы ссылаетесь на tiny basic и др., но не упоминаете AttoBasic, хотя проект существует с 2002 года? Он поддерживается и сейчас: AttoBasic home. Исходники на асм, правда.
0
БЕНДЕР: Мне нужен калькулятор.
ФРАЙ: Ты сам калькулятор.
БЕНДЕР: Мне нужен хороший калькулятор.
+1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.