Глава 14
.pdfНИЯ от всех периферийных модулей 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......