Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Глава 14

.pdf
Скачиваний:
26
Добавлен:
18.02.2016
Размер:
1.11 Mб
Скачать

НИЯ от всех периферийных модулей PIC контроллера. Это делается с помощью обнуления специального регистра INTCON (командой clrf INTCON), обращение к которому НЕ ТРЕБУЕТ предварительной установки страницы памяти данных (как и регистров STATUS, OPTION_REG). Каждый бит этого регистра запрещает обработку прерывания от конкретного периферийного модуля, и, соответственно, установку счетчика команд в значение 0х004 при возникновении прерывания от того или иного периферийного модуля. В то же время флаги прерываний, в нашем случае это TMR2IF, автоматически устанавливаются модулями контроллера в 1, независимо от того разрешены или запрещены прерывания. Перед обработкой этого события (TMR2IF = 1), пользовательское ПО должно сбросить этот флаг в 0, для обеспечения возможности контроля окончания следующего цикла работы соответствующего модуля.

2. Использование директив dt для

 

 

 

 

 

 

создания таблиц в теле процедур

dt 0xXX, 0xYY, 0xZZ,...0xNN

 

 

SineTable_High, SineTable_Low Как уже

 

 

 

отмечалось в п. 8.3, использование дирек-

Адрес в ПЗУ команд

 

тив в теле ПО предназначено лишь повы-

 

 

 

шения удобочитаемости исходного кода,

retlw 0xXX

m

т.к. компилятор все равно «заменяет» ди-

retlw 0xYY

m+1

рективы программы набором соответст-

 

 

 

вующих команд контроллера (и, строго го-

retlw 0xZZ

m+2

воря, делает это без «ведома» разработчи-

 

 

 

ка). В данном примере тоже можно обой-

....... ........

 

 

тись без использования директив, но в [34,

 

 

 

 

 

12] для генерации аналоговых сигналов

 

 

 

производителем контроллеров рекоменду-

retlw 0xNN

m+k

ется излагаемый ниже подход. Директива

 

 

 

dt (data table) имеет формат:

Рис. 169 Формат, действие и

 

размещение команд под дей-

dt 0xXX, 0xYY, 0xZZ, .........0xNN

ствием директивы dt

 

 

 

 

и преобразует массив чисел XX, YY, ZZ,..., NN в последовательность команд retlw как показано на рис. 169. При этом, в теле ПО (или в теле процедуры) команды retlv с константами, указанными в директиве, располагаются в той же самой последовательности, в которой параметры (константы) расположены в директиве. Здесь необходимо напомнить, что команда retlw используется как команда выхода из процедуры, записывая при этом в регистр W константу, которая указана после команды.

3. Возможность управления счетчиком команд PCL. Как уже отмеча-

лось, последовательностью выборки команд из РПЗУ контроллера управляет счетчик команд, который выставляет на шине команд адрес следующей выполняемой команды. Состояние этого счетчика отражается в специальном регистре PCL (адрес 0х02), доступном по шине данных как для чтения, так и для записи. Другими словами, записывая какое-либо число в регистр PCL можно заставить контроллер выполнить команду, расположенную в РПЗУ команд по этому адре-

су, а вовсе не следующую команду из тела ПО (или процедуры). Зная расположение (адреса) команд в памяти команд, можно, таким образом, управлять ходом выполняемой программы, не только используя команды goto или call, но и команды записи адреса в PCL. Однако при работе с регистром PCL необходимо учитывать следующие особенности:

а) при обращении к регистру PCL не надо выбирать банк памяти, т.к. эти регистры находятся во всех 4-х банках с одинаковым смещением относительно начала страницы.

б) в регистре PCL всегда хранится адрес следующей выполняемой коман-

ды;

в) после выполнения любой (кроме goto, call или команд непосредственной записи в PCL) команды значение регистра PCL автоматически увеличивается на единицу:

PCL = PCL + 1

г) после выполнения команд goto, call в регистр PCL записывается адрес первой команды, стоящей после метки или имени вызываемой процедуры. При дальнейшем выполнении тела процедуры, счетчик команд последовательно увеличивает свои показания на 1 (если в теле процедуры нет команд goto, вызова следующей процедуры call или команд непосредственной записи в PCL) до встречи команд retlw, return. Это связано с тем, что компилятор (если нет директив org) располагает команды тела процедуры последовательно, начиная с ее первой команды.

д) после выполнения команд возврата из процедуры retlw, return в счетчик команд записывается адрес следующей за call команды. Также следует иметь в виду, что при моделировании ПО в среде MPLAB остановки отладчика на командах return, retlw не происходит.

е) после выполнения команд непосредственного изменения содержимого регистра PCL (разумеется, через регистр W, как и для любого другого регистра) его значение становится равным:

PCL = (PCL +1) + W

т.е. к содержимому регистра PCL добавляется (вычитается, заменяется и т.д. в зависимости от команды с помощью которой изменяют содержимое регистра PCL) содержимое регистра W.

4. Для управления длительностью импульсов, в зависимости от номера дискрета, использованы процедуры записи требуемых значений длительности из 2-х таблиц в W с последующей загрузкой этих значений в CCPR2L и CCP2CON для запуска модуля ШИМ. Таблицы (формально – это строки из директив dt с параметрами) содержат заранее рассчитанные значения длительности в позициях, номера которых соответствуют номеру дискрета, для которого формируется требуемая скважность выходных импульсов. В нашем случае, это процедуры Sine_Table_High и Sine_Table_Low, осуществляющие запись рассчитанных значений 8 и 2-х бит длительности в регистр W, затем соответственно в регистры CCPR2L и CCP2CON. Учитывая, что принцип их функционирования одинаков, рассмотрим более подробно работу процедуры Sine_Table_High.

В теле процедуры с помощью директивы dt последовательно располагают-

ся 64 команды retlw (не считая первой retlw .0) с параметрами равными рассчитанным значениям 8-ми старших бит длительности импульса ШИМ (колонка CCPR2L из Таблицы №12).

Примечание: параметры (в десятичной форме) директивы dt для процедуры Sine_ Table_Low берутся из колонки «Значение регистра CCP2CON» Таблицы №12.

Перед этой «таблицей» вставлена команда retlw .0, назначение которой рассмотрено ниже. Перед вызовом процедуры в W загружен номер дискрета STEPCOUNT (при первом вызове равный 64). Первая команда, которая выполняется в теле процедуры, это команда addwf PCL, F. После выполнения этой команды в регистр счетчика числа команд запишется число PCL=PCL+1+(W=STEPCOUNT), т.е. следующей выполнится не «следующая по очереди» команда в теле процедуры – retlw .0, а команда из тела процедуры, отстоящая от данной на (STEPCOUNT+1) ячеек. Т.е. при первом выполнении этой процедуры, PCL станет равным 64+1=65 и выполнится команда retlw .28, начав формирование синусоиды. Для этого в тело процедуры вставлена «пустая» команда retlw .0. Если бы ее не было, выполнилась бы команда по 65-му адресу, которой нет в теле процедуры. При втором проходе ПО, номер дискрета будет на 1 уменьшен, следовательно, в счетчик команд запишется число PCL=63+1=64 и выполнится команда retlw .25 и т.д. Таким образом, для 64-го дискрета, когда STEPCOUNT = 1 (при выполнении этого условия командой decfsz STEPCOUNT, F последний раз произойдет переход на метку New_Off_Duty_Factor и формирование последней 64-ой «пачки» из 5-ти периодов ШИМ), выполнится команда, retlw .31, закончив формирование одного периода синуса.

Когда переменная STEPCOUNT станет равной 0, произойдет переход на метку Beginning и начнется 1-ый дискрет «второго» периода выходного сигнала. Таким образом, всегда (за счет того, что выход из процедуры на каждом следующем дискрете STEPCOUNT осуществляется по следующей команде retlw с записью «нужной» константы в W) после выхода из процедуры требуемое значение длительности переписывается в регистр CCPR2L, начиная формирование следующих 5-ти циклов формирования периода ШИМ в пределах одного из 64-х дискретов.

5. В теле ПО отсутствуют команды отключения режима ШИМ (путем обнуления битов СCCP2M.... в регистре CCP2CON) в связи с тем, что при включении контроллера этот регистр обнуляется автоматически, а следовательно, модуль ШИМ – выключен. Таким образом, настройка модуля ЩИМ (путем установки битов DC2B...) осуществляется одновременно с его включением после вызова процедур Sine_Table......

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]