URC220 (Раздаточный материал по URC220), страница 4
Описание файла
Файл "URC220" внутри архива находится в следующих папках: Раздаточный материал по URC220, Documents, URC220 Documentation. Документ из архива "Раздаточный материал по URC220", который расположен в категории "". Всё это находится в предмете "программное обеспечение управляющих комплексов (поук)" из 6 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "программное обеспечение управляющих комплексов (поук)" в общих файлах.
Онлайн просмотр документа "URC220"
Текст 4 страницы из документа "URC220"
// Прототипы функций
void PIO_Config(uint32 InputPins, uint32 OutputPins);
void PIO_Set(uint32 Bit, uint32 Value);
uint32 PIO_Get(uint32 Bit);
void PIT_Init();
uint32 PIT_GetCount();
void PIT_Sleep(uint32 mSecs);
//-------------------------------------------------------
// Инициализирует PIO
// InputPins - сочетание (через ИЛИ) бит, соответствующих выводам
// процессора, которые должны быть установления в режим ввода
// OutputPins - сочетание (через ИЛИ) бит, соответствующих выводам
// процессора, которые должны быть установления в режим вывода
// Ножки процессора, не указанные в InputPins и OutputPins не меняют
// своего состояния (т.е. вызов PIO_Config(0, 0) не даст никакого эффекта)
void PIO_Config(uint32 InputPins, uint32 OutputPins)
{
// Инициализируем контроллер портов ввода-вывода
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);
// Инициализируем контакты для вывода
if(OutputPins)
AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OutputPins);
// Инициализируем контакты для ввода
if(InputPins)
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, InputPins);
}
//-------------------------------------------------------
// Устанавливает уровень на выводе процессора
// Bit - сочетание (через ИЛИ) бит, соответствующих выводам
// процессора, значения на которых должны быть изменены
// Value - новое значение: 0 - низкий уровень, !0 - высокий
void PIO_Set(uint32 Bit, uint32 Value)
{
// Если нужно установить лог. 1, то пишем
// соответствубщий бит в регистр SODR контроллера
// портов ввода-вывода
if((Value)) AT91C_BASE_PIOA->PIO_SODR = Bit;
// Аналогично для установки лог. 0 (пишем в Clear-регистр)
else AT91C_BASE_PIOA->PIO_CODR = Bit;
}
//-------------------------------------------------------
// Определяет уровень на выводе процессора
// Bit - сочетание (через ИЛИ) бит, соответствующих выводам
// процессора, значения на которых должны быть определены
// 0 - низкий уровень, !0 - высокий
uint32 PIO_Get(uint32 Bit)
{
return (AT91C_BASE_PIOA->PIO_PDSR & (Bit));
}
//-------------------------------------------------------
// Функция инициализирует таймер для работы
// на макс. частоте - MCK / 16
// (если ядро процессора работает на 48 MHz, то
// таймер работает на частоте 3 MHz)
void PIT_Init()
{
// Включаем таймер
AT91F_PITC_CfgPMC();
// Устанаволиваем таймер: сначала целиком заполняется
// 20-ти битная часть (0xFFFFF - предел заполнения),
// затем она обнуляется и инкрементируется старшая
// 12-ти битная часть.
AT91PS_PITC pPITC = AT91C_BASE_PITC;
pPITC->PITC_PIMR = 0xFFFFF | AT91C_PITC_PITEN;
// Выключаем прерывание для таймера
AT91F_PITDisableInt(AT91C_BASE_PITC);
}
//-------------------------------------------------------
// Текущий счётчик таймера
uint32 PIT_GetCount()
{
// Находится в регистре PIIR контроллера таймера
return AT91C_BASE_PITC->PITC_PIIR;
}
//-------------------------------------------------------
// Пауза, mSecs - время в мс
void PIT_Sleep(uint32 mSecs)
{
// Домножаем число милисекунд на количество
// тиков таймера в 1 мс, чтобы получить величину
// задержки не в мс, а в тиках таймера
mSecs *= PIT_TICKS_PER_mSEC;
// Запоминаем время начала ожидания
uint32 StartTime = PIT_GetCount();
// Ждём, пока не пройдёт нужно число тиков
while(PIT_GetCount() - StartTime < mSecs) ;
}
//-------------------------------------------------------
int32 main()
{
// Текущее состояние светодиода - горит (1)
int32 Value = 1;
// Инициализируем таймер
PIT_Init();
// Устанавливаем ножку PA17 на вывод
PIO_Config(0, BIT17);
// Начинаем бесконечный цикл
while(1)
{
// Устанавливаем уровень на ножке PA17
PIO_Set(BIT17, Value);
// Если установили лог. 1, то текущий уровень
// будет лог. 0
if(Value == 1) Value = 0;
// И наоборот
else Value = 1;
// Ждём 1 секунду
PIT_Sleep(1000);
}
}
//-------------------------------------------------------
3.3 Отладка программы
Для того чтобы загрузить программу в контроллер и запустить отладчик, необходимо настроить параметры отладки.
1. Для этого в настройках проекта в списке слева нужно выбрать “Debugger”, а справа выбрать вкладку “Setup”. Параметр “Driver” установить на “J-Link/J-Trace”.
2. Во вкладке “Download” установить флаг “Use flash loader(s)”.
Если в меню слева выбрать пункт “J-Link/J-Trace”, то справа будут показаны все настройки отладчика J-Link. Подходят настройки по умолчанию.
Теперь можно выбрать пункт меню “Project”->”Debug” (или просто нажать Ctrl+D). Появится окно индикации загрузки программы в контроллер, а далее, после окончания загрузки, выполнение программы автоматически дойдёт до начала функции “main” и остановится. С этого момента отладка программа происходит аналогично отладке программы под Windows (F10 и F11 – Step over и Step into, F9 – установить точку прерывания выполнения программы, F5 – запуск программы) – см. рис. 3.6
Рис.3.6 Отладка готовой программы
4. Библиотека для работы с платой на компьютере
Для многих задач не всегда требуется писать программу именно для микроконтроллера, иногда достаточно простого управления с компьютера. Для этого была реализована программа для микроконтроллера, которая принимает команды от компьютера по USB интерфейсу и управляет всеми периферийными устройствами. Для компьютера написана библиотека, которая позволяет легко управлять платой из любой программы под Windows.
4.1 Алгоритм работы
Взаимодействие программы с драйвером устройства происходит через объект класса CURC220. Прототип класса находится в заголовочном файле “URC220.h”:
#include “URC220.h”
CURC220 urc;
После того, как плата подключается к компьютеру, программа на компьютере должна обновить список подключённых устройств, вызвав функцию UpdateDeviceList объекта класса. Узнать количество подключённых устройств можно с помощью функции GetDeviceCount. Далее, при необходимости, можно определить имя каждого устройства с помощью функций GetDeviceNameLen и GetDeviceName. Для начала работы с платой нужно открыть устройство функцией Open, а по окончании работы вызвать функцию Close. Если устройство успешно открыто, то записывать и считывать данные можно при помощи функций DeviceRead и DeviceWrite. Сначала вызывается функция для чтения (DeviceRead), далее производятся необходимые действия (функции DeviceGetInput, DeviceSetOutput, DeviceGetOutput, DeviceGetADC и т.д.), а по окончании всех действий вызывается функция для записи (DeviceWrite). Затем цикл повторяется.
4.2 Описание функций класса
Функция DeleteDeviceList
Прототип:
void CURC220::DeleteDeviceList();
Описание:
Функция удаляет список подключенных устройств
Принимаемые параметры: нет
Возвращаемое значение: нет
Функция UpdateDeviceList
Прототип:
int CURC220::UpdateDeviceList();
Описание:
Функция обновляет список подключенных устройств: определяет их количество и имена
Принимаемые параметры: нет
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция GetDeviceCount
Прототип:
int CURC220::GetDeviceCount(ULONG *Count);
Описание:
Функция возвращает количество подключенных устройств
Принимаемые параметры:
Count - указатель на число для записи
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция GetDeviceNameLen
Прототип:
int CURC220::GetDeviceNameLen(ULONG Index, ULONG *Len);
Описание:
Функция возвращает длину имени устройства
Принимаемые параметры:
Index - номер устройства в списке (начиная с 0)
Len - указатель на число для записи длины имени
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция GetDeviceName
Прототип:
int CURC220::GetDeviceName(ULONG Index, char *pBuffer, ULONG BufferSize);
Описание:
Функция для определения имени устройства по номеру
Принимаемые параметры:
Index - номер устройства в списке (начиная с 0)
pBuffer - буфер для записи имени
BufferSize - максимальное число байт, которое можно записать в буфер
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция GetPipeObject
Прототип:
CURCPIPE* CURC220::GetPipeObject();
Описание:
Функция возвращает указатель на объект CURCPIPE
Принимаемые параметры: нет
Возвращаемое значение:
Указатель на объект CURCPIPE
Функция Close
Прототип:
void CURC220::Close();
Описание:
Функция закрывает устройство
Принимаемые параметры: нет
Возвращаемое значение: нет
Функция Open
Прототип:
int CURC220::Open(ULONG Index);
Описание:
Функция открывает устройство
Принимаемые параметры:
Index - номер устройства в списке (начиная с 0)
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция DeviceRead
Прототип:
int CURC220::DeviceRead();
Описание:
Считывает текущее состояние устройства
Принимаемые параметры: нет
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция DeviceWrite
Прототип:
int CURC220::DeviceWrite();
Описание:
Записывает внесенные изменения параметров в устройство
Принимаемые параметры: нет
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция DeviceGetInput
Прототип:
int CURC220::DeviceGetInput(ULONG Index, UCHAR *Value);
Описание:
Считывает значение на порту ввода
Принимаемые параметры:
Index - номер порта: 0..3
Value - указатель на число для записи значения: 0 или !0
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция DeviceSetOutput
Прототип:
int CURC220::DeviceSetOutput(ULONG Index, UCHAR Value);
Описание:
Записывает значение в порт вывода
Принимаемые параметры:
Index - номер порта: 0..7
Value - число для записи в порт: 0 или !0
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция DeviceGetOutput
Прототип:
int CURC220::DeviceGetOutput(ULONG Index, UCHAR *Value);
Описание:
Возвращает значение, которое сейчас установлено на порту вывода
Принимаемые параметры:
Index - номер порта: 0..7
Value - указатель на число для записи значения: 0 или !0
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция DeviceGetADC
Прототип:
int CURC220::DeviceGetADC(ULONG Channel, USHORT *Value);
Описание:
Считывает значение АЦП
Принимаемые параметры:
Channel - номер канала: 0..3
Value - указатель на число для записи значения: 0..1023
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция DeviceSetPWM
Прототип:
int CURC220::DeviceSetPWM(ULONG Channel, SHORT Value);
Описание:
Устанавливает значение ШИМ
Принимаемые параметры:
Channel - номер канала: 0..3
Value - новое значение ШИМ: -1000...+1000
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция DeviceGetPWM
Прототип:
int CURC220:: DeviceGetPWM(ULONG Channel, SHORT *Value);
Описание:
Возвращает установленое значение ШИМ
Принимаемые параметры:
Channel - номер канала: 0..3
Value - указатель на число для записи значения: -1000...+1000
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
Функция DeviceGetEnc
Прототип:
int CURC220::DeviceGetEnc(ULONG Index, LONG *Value);
Описание:
Считывает значение энкодеров
Принимаемые параметры:
Index - номер энкодера: 0..1
Value - указатель на число для записи значения
Возвращаемое значение:
Функция возвращает 0 в случае ошибки
5. Применение библиотеки
5.1 Создание нового проекта в Microsoft Visual Studio 2003
1. Для начала нужно открыть Microsoft Visual Studio 2003. После этого необходимо создать новый проект File–>New–>Project (рис 5.1.1).
Рис. 5.1.1 |
2. Далее следует указать тип проекта (Visual Studio C++ –> Win32)и в соседнем поле выбрать Win32 Console Project. В соответствующих текстовых полях указать название проекта (в данном случае «Test») и директорию, в которой будет создан проект. После нажатия на Ok появиться новое окошко (Рис.5.1.2).
Рис. 5.1.2 |
3. В этом окне (Рис. 5.1.2) выбрать закладку Application Settings (находится под Overview). Установить галочку напротив пункта Empty project (Рис. 5.1.3) и нажать Finish.
Рис. 5.1.3. |
4. После этих операций будет создан пустой проект. На рисунке 5.1.4 показано как он выглядит.
Рис. 5.1.4. |
5. В проект необходимо добавить .cpp файл, в котором будет написан исходный код программы. Для этого надо воспользоваться меню Project–>Add New Item. На Рисунке 5.1.5 показана структура меню.
Рис. 5.1.5. |
6. Далее необходимо ввести имя создаваемого файла, например, «main.cpp». Для этого следует выбрать категорию файла «Code» в левой половине окна и тип файла «С++ File (.cpp)». В текстовом поле «Name:» ввести имя создаваемого файла и нажать «Open». Рисунок 5.1.6 иллюстрирует это.
Рис. 5.1.6. |
7. После этих операций будет создан файл main.cpp и добавлен к текущему проекту. В этом файле можно написать код простой программ, которая выводит в консоль строчку (Рис. 5.1.7).
Рис. 5.1.7. |
Привожу код, чтобы можно было скопировать.