Глава 6. Программирование в RobotC



Введение

Язык программирования RobotC отличается от стандартного C расширенным набором команд по работе с устройствами микроконтроллера. Опытный программист найдет эту среду гораздо более удобной, чем пакеты графического программирования. Для тех же, кто не знаком с языком C, текстовое программирование микроконтроллеров может показаться недостаточно наглядным. Однако именно в текстовом режиме можно составлять наиболее сложные и эффективные       программы.

Firmware

Операционная система, предназначенная для исполнения на NXT программ, написанных на RobotC, отличается от аналогичных прошивок микроконтроллера для Robolab или NXT-G. Хотя внешнее сходство присутствует. Однако при попытке исполнения программы, загруженной из другой среды, будет выдаваться сообщение об ошибке. Поэтому перед началом работы необходимо обеспечить загрузку соответствующего Firmware (рис. 6.1).

 

Рис. 6.1. Загрузка операционной системы на NXT.

Hello, world!

Традиционно первая программа на языке Си должна вывести на экран приветствие миру: «Hello, world!». Воспользовавшись возможностями NXT, исполним традицию:

 task main() {

nxtDisplayTextLine(0, "Hello, world!"); wait1Msec(5000);

}

Команда nxtDisplayTextLine(0, "Hello world!"); выведет в строку экрана NXT с номером ноль сообщение «Hello world!». По прошествии 5 с программа закончит выполнение и текст исчезнет. Сохраните программу на жесткий диск с именем "hello.c".

Для загрузки в микроконтроллер подключите его к компьютеру, включите NXT и нажмите на клавиатуре компьютера клавишу F5. Если программа загрузилась успешно, на экране компьютера появится окно отладки Program Debug (рис. 6.2).

 

Рис. 6.2. Окно отладки программы.

Если нажать в нем кнопку Start, программа запустится на NXT. Можно игнорировать это окно, найти в меню микроконтроллера файл hello и запустить его оранжевой кнопкой.

Усовершенствуем программу. То же сообщение можно вывести по центру экрана: 

 task main() {

nxtDisplayCenteredTextLine(3, "Hello world!"); wait1Msec(5000);

}

На этот раз сообщение будет выведено в третьей строке дисплея NXT с выравниванием посередине.

Используя набор команд по работе с экраном NXT, в том числе и графических, можно написать собственные миниигры для микроконтроллера. Но это тема отдельной главы или даже книжки.

Структура программы

Теперь обратим внимание на структуру исходного кода. Главная задача, с которой начинается выполнение программы в RobotC, называется task main(). Тело задачи располагается между двумя фигурными скобками: открывающей и закрывающей. Все команды должны быть размещены между ними. 

Более подробно о задачах написано в разделе «Параллельные задачи».

Управление моторами

Состояние моторов

Простейшая задача: вращать мотор C вперед 3 с:

 

task main() {

motor[motorC] = 100; wait1Msec(3000); }

 

Команда motor[] представляет собой массив из трех элементов, каждый из которых определяет текущее состояние вращения моторов A, B и C. Действие «полный вперед» задается числом 100, «полный  назад» — числом –100, остановка — числом 0. Действие этой команды можно считать мгновенным. После ее выполнения мотор включается и продолжает работать до тех пор, пока не будет остановлен другой аналогичной командой.

Команда wait1Msec() задает время ожидания в миллисекундах (1 мс = 1/1000 с). Таким образом, wait1Msec(3000) означает «ждать   3 секунды».

Теперь сформулируем задачу для робота более четко: проехать вперед 2 секунды со средней скоростью и остановиться. В программе последовательно включаются моторы C и B с мощностью 50, работают в течение 2 с, после чего последовательно выключаются. По сути включение обоих моторов произойдет практически одновременно, как и их выключение:

 task main() {

motor[motorC] = 50; motor[motorB] = 50; wait1Msec(2000); motor[motorC] = 0; motor[motorB] = 0;

}

Следующий пример демонстрирует возожность бесконечного вращения мотора с помощью цикла while. Остановить его можно, прервав выполнение программы на NXT:

 

task main() { while (true) motor[motorA]=100;

}

Следующий пример работает аналогично:

 

task main() {

motor[motorA]=100; while (true) wait1Msec(1);

}

Миллисекундная задержка полезна для разгрузки контроллера при работе бесконечного цикла.

Встроенный датчик оборотов

Команда nMotorEncoder[] — это обращение к датчику оборотов мотора, который возвращает значение в градусах. Каждый из трех элементов этого массива имеет 16-битное значение, что дает возможность хранить число в диапазоне –32768...32767, это соответствует 95 полным (360 градусов) оборотам моторов. В длительно работающих программах следует время от времени обнулять значения массива во избежание переполнения. 

 

nMotorEncoder[motorA] = 0;

 

Этим же действием датчик оборотов инициализируется для начала измерений. 

Следующая программа обеспечит вращение мотора A на 1000 градусов.

 task main() {

motor[motorA]=50;

while (nMotorEncoder[motorA] < 1000)

{


Дата добавления: 2019-02-22; просмотров: 2597; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!