В этом разделе, мы представляем программу для управления парящим роботом на языке Си. Программа была первоначально написана Джоулом Перлином, одним из наших студентов, и скорректирована авторами настоящей книги.
//********************************************************************
// filename: flying.с
// Описание программы: Эта программа запускает четыре двигателя и затем
// управляет скоростью вращения каждого из них. После взлета робота
// программа проверяет каждый из датчиков для определения положения
// робота. При обнаружении преграды или крыши, скорости вращения двигателей
// корректируются, чтобы обеспечить правильное направление движения.
//
// Авторы: Джоэль Перлин, Даниэль Пак, Стив Барретт
// Дата создания: 27 июля 2004
// используемая память: программа - 0x1000, данные - 0x3000 и
// стек - 0x4000
//********************************************************************
#include stdio.h
#include "hcs12dp256.h"
#pragma abs_address 0x3000
unsigned int count1; //счетчики переменных
unsigned int count2;
unsigned int sensor;
char sensoravg; //сохраняют данные датчиков в виде 8-разрядных чисел
volatile unsigned p; // текущий счетчик
#pragma end_abs_address
//********************************************************************
void main(void) {
//Инициализация робота
PWME = 0x00; //запрет ШИМ
DDRA = 0xFF; //конфигурирование портов A и В как выходных
DDRB = 0xFF;
PORTA = 0xAA; //подача питания на датчики
PORTB = 0xFF; //индикация режима программы на линейке светодиодов
//Инициализация модуля ATD
PORTAD1 = 0x00; //конфигурирование портов как входных
ATD1CTL2 = 0xC2; //инициализация ATD с установкой флагов
//преобразования в каналах
ATD1CTL3 = 0x00; // функция установки ATD
ATD1CTL4 = 0x80; //установить 8-разрядный режим
PORTB = 0xFE; //показать состояние программы на линейке
// светодиодов
// Инициализация режима входного захвата
TSCR1 = 0x80; //включение таймера (нормальный режим)
TSCR2 = 0x80; //установить период переполнения счетчика временной
// базы 8.192 мс, коэффициент деления = 1
TIOS = 0x00; //установить каналы таймера в режим входного захвата
TMSK1 = 0xE0;//биты разрешения прерывания по событиям на линиях [7:5]
TFLG1 = 0xE0; //очистить флаги прерываний TFLG1
PORTB = 0xFC; // показать состояние программы на линейке светодиодов
// инициализация ШИМ
PWMCTL = 0x00; //установить 8-разрядный режим
PWMCAE = 0x10; //установить фронтовую ШИМ
PWMPOL = 0x5F; //выбрать активным высокий логический уровень
//назначить режим ШИМ для каналов 0,1,2,3,4 и 6
PWMCLK = 0x50; //каналы 0,1,4 тактируются CLOCK_A и каналы
//2,3,6 - CLOCK_В
PWMSCLA = 0x20; //период A 0x20 = 4.1 мс