Интегрирование подпрограмм USB в программу

Выбор страниц/Выбор банков

Микропрограммные библиотеки выполнены с осторожным использованием битов переключения банков и страниц. При переключении банков должен обеспечиваться вызов правильных регистров. Регистр PCLATH изменяется, когда выполняются операции CALL или GOTO за пределы текущего сегмента памяти программ. ServiceUSBInt изменяет W, STATUS, FSR и PCLATH, следовательно, они должны быть сохранены при входе в программу обработки и восстановлены при выходе.

При написании подпрограммы обслуживания прерывания необходимо принять во внимание, что регистры W, STATUS, FSR и PCLATH могут быть разрушены при обслуживании прерывания USB, поэтому они должны быть сохранены. Библиотека предлагает скелет подпрограммы обслуживания прерывания (файл USB_INT.ASM), которая сохраняет и восстанавливает эти регистры, а также выполняет проверку каждого из возможных флажков прерывания. Эта программа может быть включена в начало основной программы.

Интерфейс между основной программой и уровнем протокола происходит при помощи трех основных функций: InitUSB, PutUSB, и GetUSB.

Работа USB зависит от описателей, представляющих собой параметры устройства, которые передаются главной ЭВМ и содержащие информацию об устройстве и способе связи с ним. Программа должна быть дополнена модулем Deskript.asm, который должен установить параметры устройства для команды SetConfiguration. Команды главы 9 вызывают SetConfiguration, когда получена соответствующая команда. Функция InitUSB инициализирует модуль USB, таблицу дескрипторов буферов и разрешает прерывание USB, так что процесс нумерации может быть начат.

Фактический процесс нумерации происходит автоматически под управлением главной ЭВМ в программе обработки прерывания. Макрокоманда ConfiguredUSB ожидает, пока устройство не будет сконфигурировано и готово к продолжению. Время, требуемое для процесса нумерации, полностью зависит от загрузки шины и главной ЭВМ.

Далее представлен демонстрационный пример использования функций USB. В этом примере сначала инициализируется модуль USB, что позволяет главной ЭВМ выполнить процесс нумерации устройства. Процесс нумерации происходит в программе обработки прерывания. Затем ожидается завершение процесса нумерации. После того как устройство готово, выполняется опрос оконечной точки ЕР1 OUT для того, чтобы определить имеются ли какие-либо данные. Если данные получены, то они копируются в буфер оконечной точки ЕР1 IN для передачи.

Демонстрационная программа, которая инициализирует модуль USB, позволяет главной ЭВМ выполнить процесс нумерации устройства, затем копирует буфер EP1OUT в EP1IN.

main

call InitUSB; Инициализация модуля USB.

ConfiguredUSB; Ожидание окончания нумерации

idleloop

call CheckSleep; Останов, если шина неактивна,

CheckEPl; Проверка транзакции ЕР1 OUT

bcf STATUS,IRP; Указатель на младшие банки

movlw buffer

movwf FSR; Указать на буфер в FSR

movlw 1; номер оконечной точки 1

call GetUSB; Если данные готовы, будут скопированы.

btfss STATUS,С; Имелись ли данные?

goto idleloop; Нет, проверить снова.

PutBuffer

bcf STATUS,IRP; Указатель на младшие банки

movwf bufferlen; Сохранить длину буфера

movlw buffer

movwf FSR; Указать на буфер в FSR

swapf bufferlen,W; Старший нибл W длина буфера

iorlw 1; Младший нибл W номер оконечной точки.

call PutUSB

btfss STATUS,С; Передача успешна?

goto PutBuffer; Нет, повторить попытку.

goto idleloop; Да, переход к началу цикла

end

Модуль USB обнаруживает некоторые ошибки и обрабатывает их. Прерывание USB_ERR сообщает микроконтроллеру, что произошла ошибка. Если происходит ошибка, то никаких действий со стороны устройства не требуется. Ошибки просто фиксируются и считаются. Нет никакого механизма для того, чтобы отключить устройство от шины, если фиксируется слишком много ошибок. Если это необходимо, то это должно быть реализовано в основной программе.

Подпрограмма CheckSleep анализирует состояние шины и, если обнаруживает простой, переводит устройство в режим останова. Она должна вызываться в основном цикле программы, когда вся остальная обработка завершена. Это позволяет, в некоторой степени, снизить потребляемый устройством ток.

Дополнительные возможности

Для работы с приложениями в реальном масштабе времени микроконтроллер должен иметь дополнительные возможности. Семейство PIC16X7XX имеет возможности, позволяющие максимизировать надежность системы, минимизировать стоимость (поскольку они не нуждаются во внешних компонентах), снизить потребление с сохранением операционных режимов и обеспечить защиту программы от копирования. Эти возможности предполагают:

1. выбор режима генератора,

2. сброс:

- сброс при включении питания (POR),

- таймер включения питания (PWRT),

- таймер запуска генератора (OST),

- сброс при снижении питания (BOR),

- сброс при ошибках контроля по четности памяти программ (только PIC16C715),

3. прерывания,

4. сторожевой таймер (WDT),

5. режим останова (SLEEP),

6. защита программы от копирования,

7. запись идентификатора,

8. внутрисхемное последовательное программирование.

Все микроконтроллеры семейства PIC16X7XX имеют сторожевой таймер (WDT), который может быть включен установкой соответствующих разрядов в слове конфигурации. Сторожевой таймер работает от собственного RC-генератора и сбрасывает микроконтроллер при зацикливании.

Имеются два таймера, которые обеспечивают необходимые задержки при включении питания. Таймер запуска генератора (OST) удерживает микроконтроллер в состоянии сброса, пока не стабилизируется частота колебаний кварцевого резонатора. Таймер включения питания (PWRT) обеспечивает фиксированную задержку состояния внутреннего сброса после включения питания на 72 мс. Эти два таймера в большинстве приложений позволяют исключить внешние схемы сброса.

Режим останова (SLEEP) предназначен для снижения потребления питания. Пользователь может вызывать микроконтроллер из останова без внешнего сброса. Вызов может осуществляться сторожевым таймером или прерыванием.

Выбор режима генератора позволяет удовлетворить требования приложения. Использование RC-генератора снижает стоимость системы, а использование режима LP с кварцевым резонатором обеспечивает снижение потребляемой мощности.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: