movlw |
DELAYHI |
;Старший байт |
movwf |
CounterHi |
; |
Del05 |
|
|
decfsz |
CounterLo,1 |
;Декремент младшего |
; байта счетчика. Выполняется до тех пор, пока он не станет |
||
;равным нулю, |
|
|
goto |
Del05 |
; после чего |
;декрементируется |
|
|
decfsz |
CounterHi,1 |
;старший байт |
goto |
Del05 |
|
return |
|
;После того как оба байта |
;станут равными нулю, возврат из ПП
;Инициализация
Init
bsf |
STATUS,RP0 ;Выбор первого |
;банка ОЗУ
movlw INIT_PORTA ;Инициализация
;регистров выбора направления линий
movwf TRISA ^80h ;ввода/вывода movlw INIT_PORTB
movwf TRISB ^80h
movlw INIT_OPTION ;Инициализация
;регистра OPTION
movwf OPTION_REG ^80h
clrf |
STATUS |
;Переключение на |
;нулевой банк ОЗУ
movlw INIT_INTCON ;Инициализация
;регистра INTCON
movwf INTCON
return |
;Возврат |
10
Begin |
|
|
call |
Init |
;Инициализация |
bsf |
PORTB,0 |
;Включить светодиод |
call |
Delay05 |
;Подождать 0,5 с |
bcf |
PORTB,0 |
;Выключить светодиод |
call |
Delay05 |
;Подождать 0,5 с |
goto |
Begin |
;Переход на начало |
end |
|
;Конец программы |
2.2.2. Алгоритм расчета констант подпрограммы задержки
Для синтеза алгоритма сначала подсчитаем, за сколько машинных циклов производится декремент регистра CounterLo.
Так если результат выполнения команды decfsz CounterLo,1 не равен 0, то эта команда занимает один цикл, а за ней следует goto Del05, которая выполняется за два цикла. Если результат равен нулю, то команда decfsz CounterLo,1 выполняется за два цикла. Таким образом, получается, что все время декремент CounterLo выполняется за три цикла, за исключением последнего раза, когда это происходит за два цикла, то есть
N1 = 3 · DELAYLO-1, |
(1) |
где N1 – количество циклов декремента CounterLo.
Далее подсчитаем число циклов декремента регистра CounterHi. Так как каждый декремент этого регистра производится только после обнуления регистра CounterLo, то при первом декременте получим 3 · DELAYLO-1 + 3, а последующие декременты будут выполняться за (256 · 3 – 1 + 3)(DELAYHI-1) – 1 циклов.
Команды инициализации регистров, входа в подпрограмму и выхода из нее занимают 8 циклов. Добавив их к общему числу, и обозначив общее число как N, получим искомую зависимость:
N = (3 * DELAYLO-1 + 3) + |
|
+ ((256 * 3 – 1 + 3)(DELAYHI-1) – 1) + 8. |
(2) |
11
Или:
N = 3 * DELAYLO + 770 * DELAYHI – 761. |
(3) |
Если в эту формулу подставить константы из программы, то получится N = 4096, что и соответствует действительности.
Произведем теперь обратную операцию – рассчитаем константы, требующиеся для заданного числа циклов N. Для этого приведем формулу к виду:
(N + 761) / 770 = 3 * DELAYLO / 770 + DELAYHI. |
(4) |
Слагаемое 3 · DELAYLO / 770 меньше единицы, поэтому для определения старшего байта счетчика его можно отбросить. В ре-
зультате получится: DELAYHI = (N + 761) / 770.
Далее, зная значение DELAYHI, находим DELAYLO:
DELAYLO = (N + 761 – DELAYHI · 770) / 3 |
(5) |
Приняв N = 4096, получим DELAYHI = 6, DELAYLO = 79, что со-
ответствует нашей программе.
3. ЛАБОРАТОРНЫЕ ЗАДАНИЯ И МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ИХ ВЫПОЛНЕНИЮ
1.Изучить структуры команд микроконтроллера PIC16С84.
2.Ознакомиться с основными принципами формирования команд микроконтроллера и изучить особенности их обработки.
3.Используя алгоритм расчета констант и методику, описанную в тестовом примере, создать проект в соответствии с пунктом «Задание».
4.Сделать вывод по проделанной работе.
5.Оформить отчет и сдать его преподавателю.
4. ЗАДАНИЕ
Создайте проект. В исходном файле проекта напишите программу, приведенную в качестве тестового примера.
Проассемблируйте программу (клавиша <F10>). В окне Build results Вы не должны получить никаких сообщений.
12
Рис. 3. Окно Program Memory Window
Откройте окно Program Memory Window (рис. 3). В нем Вы сможете увидеть расположение программы в ПЗУ контроллера.
Первой после сброса будет исполнена команда goto Begin. Произведите сброс клавишей F6. После этого строка goto Begin выделится темной линией.
Нажмите F7 для выполнения текущей команды, после чего программа совершит переход по адресу ПЗУ, обозначенному меткой Begin, обойдя подпрограммы Delay05 и Init.
Для того чтобы увидеть работу подпрограммы инициализации, откройте окно просмотра содержимого регистров ОЗУ (Watch).
Типичное для отладчиков окно Watch (рис. 4) позволяет просматривать значения переменных и содержимое регистров управления во время выполнения программы.
13
Рис. 4. Окно Watch
Введите регистр STATUS, установите отображение текущего значения в двоичной форме. Добавьте так же регистр WREG, а также ре-
гистры trisa, trisb, option_reg, INTCON, PORTB в двоичных форматах.
Последовательно исполняя команды подпрограммы инициализации, проследите изменения регистров в окне просмотра.
После возврата из подпрограммы и установки нулевого бита регистра PORTB в логическую единицу команда call Delay05 осуществит переход по адресу ПЗУ, обозначенному меткой Delay05, при этом адрес, на котором находилась команда call, записывается в стек. Чтобы это увидеть, откройте окно просмотра стека в меню Stack. Сравните адрес, отображаемый в этом окне, и адрес в памяти микроконтроллера, по которому расположена следующая после call команда.
Добавьте регистры CounterLo и CounterHi в окно Watch и выполните первые четыре команды подпрограммы Delay05. Проконтролируйте выполнение одного цикла декремента значений регистра
CounterLo.
Дальнейшее выполнение программы посредством нажатия клавиши F7 нецелесообразно, так как для выхода из подпрограммы Delay05 придется нажать F7 достаточно большое число раз, что неудобно. Рациональнее задать точку останова. Для этого щелкните правой кнопкой мыши по строке с командой Return. В появившемся меню выберите Break Point(s). После этого данная строка выделится крас-
14