Секунда является очень большим интервалом по сравнению с частотой тактового генератора (4 МГц). Такие задержки сложно реализовать методом вложенных циклов. Поэтому их набирают из точно подстроенных задержек меньшей длительности. Например. задержку в 1с можно реализовать десятикратным вызовом подпрограммы, реализующей задержку 100 мкс.
ONESEC
MOVLW D’10’ ; число вызовов
MOWWF COUNT ; подпрограммы DELAY_100
LOOP
CALL DELAY_100 ; задержка 100 мкс
DECFSZ COUNT,f ; декремент COUNT и цикл,
GOTO LOOP ; если не равно 0
Параметризируемые подпрограммы
Для успешной работы любой подпрограммы необходимо однозначно определить способ передачи в нее исходных данных и способ вывода результата ее работы. Подпрограмма, которой требуется дополнительная информация в виде параметров ее настройки или операндов, называется параметризируемой. Передача параметров в подпрограмму задержки может осуществляется через регистры общего назначения. При передаче входных параметров основная программа обязательно содержит команды загрузки этих регистров, а подпрограмма - команды считывания из этих регистров.
Примером параметризируемой подпрограммы служит подпрограмма задержки Рис. 9.6. Основная программа обеспечивает передачу в подпрограмму загрузку счетчика (MOVLW D’20’), обеспечивая требуемое время задержки. Подпрограмма задержки Рис. 9.6. не возвращает никаких значений в вызывающую программу.
Подпрограмма SVN_SEG при передаче входных параметров загружает рабочий регистр W, а основная программа при выходе считывает его содержимое. Подпрограмма Рис. 9.9.демонстрирует загрузку однобайтного значения в рабочий регистр и используется совместно с семисегментным индикатором.
Системное представление подпрограммы приведено на Рис. 9.7,а.Входным сигналом является 4-х битный двоичный код, находящийся в рабочем регистре: от b’0000’ до b’1001’. Выходным значением, также возвращаемым в рабочий регистр, является соответствующий семисегментный код, необходимый для отображения соответствующей цифры (см. Табл. преобразования).
Рис. 9.7.Семисегментный индикатор
Таблица преобразования 7-сегментного кода приведена на Рис. 9.8. При использовании такой таблицы извлечение k-го элемента таблицы заключается в исполнении N-й команды. При этом константа, находящаяся в команде, будет помещена в W регистр , после чего произойдет возврат в вызывающую программу. В примере k=6, поэтому выполняется 6-я команда RETLW, возвращающая код b’011111000’для символа 6.
Рис. 9.8. Таблица преобразования
Подпрограмма, приведенная ниже, осуществляет выборку элемента таблицы, прибавляя число N, передаваемое через рабочий регистр, к байту счетчика РСL. Поскольку РС уже указывает на 1-ю команду RETLW,то после прибавления Nон будет указывать на N-ю команду, что нам и требуется.
SVN_SEG
ADDWF PCL,f ; прибавляем PCL+W получая PC+N
хgfedcba
RETLW b’00111111’ ; цифра 0, возвращается при N=0
RETLW b’00000110’ ; цифра 1, возвращается при N=1
RETLW b’01011011’ ; цифра 2, возвращается при N=2
RETLW b’01001111’ ; цифра 3, возвращается при N=3
RETLW b’01100110’ ; цифра 4, возвращается при N=4
RETLW b’01101101’ ; цифра 5, возвращается при N=5
RETLW b’01111101’ ; цифра 6, возвращается при N=6
RETLW b’00111111’ ; цифра 7, возвращается при N=7
RETLW b’00111111’ ; цифра 8, возвращается при N=8
RETLW b’00111111’ ; цифра 9, возвращается при N=9
Рис. 9.9. Подпрограмма преобразования двоичного кода в семисегментный
Пример: формирование импульсов прямоугольной формы
Программа должна сформировать импульсы прямоугольной формы частотой 5 КГц на одном из выводов (нулевом) порта В. Инициализация PORTВ выполняется аналогично программе SMOTOR-2 рис.4.7.
Далее следует формирование импульса (высокого уровня) на выводе RB0. Применяется бит - ориентированная команда BSF в которой указывается нулевой бит регистра PORTB, который нужно установить: BSF PORTB,0.
Теперь наша задача сделать так, чтобы с момента установки и до момента сброса вывода RB0 прошло ровно Т/2=1/2F=1/2х5х103 Гц = 100мкс.