Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
, в старший разряд которого записывается количество переполнений, произошедших за интервал времени счета, в средний разряд записывается число, зафиксировавшееся в TMR0 на момент окончания счета, в младший разряд записывается число, зафиксировавшееся в байте предделителя на момент окончания счета . Для детального разбирательства с механизмом высокоскоростного счета, используется файл (находится в папке " Тексты программ. Это выглядит так ;******************************************************************************** ; Tmr0.asm ИЛЛЮСТРАЦИЯ ПРИНЦИПА ВЫСОКОСКОРОСТНОГО СЧЕТА ИМПУЛЬСОВ ; ОТ ВНЕШНЕГО ИСТОЧНИКА ИМПУЛЬСОВ С ИСПОЛЬЗОВАНИЕМ ТАЙМЕРА TMR0 ;******************************************************************************** ; "Заготовка" "программы, в которой осуществляется высокоскоростной счет импульсов от внешнего источника импульсов с использованием таймера TMR0. ; Используется PIC16F84A. ; Корабельников Е . А . г . Липецк http://ikarab.narod.ru E-mail: karabea@lipetsk.ru ;******************************************************************************** ; " ШАПКА ПРОГРАММЫ " ;******************************************************************************** ;............................................................. ;............................................................. ;================================================================================ ; Определение положения регистров специального назначения. ;================================================================================ Tmr0 equ 01h ; Регистр TMR0. OptionR equ 01h ; Регистр Option - банк 1. Status equ 03h ; Регистр Status. PortA equ 05h ; Регистр PortA. TrisA equ 05h ; Регистр TrisA - банк 1. IntCon equ 0Bh ; Регистр IntCon. ;............................................................. ;================================================================================ ; Определение названия и положения регистров общего назначения. ;================================================================================ TimerL equ 1Bh ; Регистр младшего разряда 3- байтного ; двоичного числа. TimerM equ 1Ch ; Регистр среднего разряда 3- байтного ; двоичного числа. TimerH equ 1Dh ; Регистр старшего разряда 3- байтного ; двоичного числа. ;............................................................. ;================================================================================ ; Определение места размещения результатов операций. ;================================================================================ W equ 0 ; Результат направить в аккумулятор . F equ 1 ; Результат направить в регистр . ;================================================================================ 269 ; Присваивание битам названий. ;================================================================================ Z equ 2 ; Флаг нулевого результата. RP0 equ 5 ; Выбор банка. ;............................................................. ;================================================================================ org 0 ; Начать выполнение программы goto START ; с подпрограммы START. ;******************************************************************************** ;******************************************************************************** ; РАБОЧАЯ ЧАСТЬ "ПРОГРАММЫ" ;******************************************************************************** START ..................................... ; ..................................... ;.... ..................................... ; ..................................... ;.... ..................................... ; ..................................... ;================================================================================ ; Подготовительные операции. ;================================================================================ clrf IntCon ; Запрет всех прерываний. clrf Tmr0 ; Сброс в 0 содержимого регистра TMR0. clrf TimerH ; Сброс в 0 содержимого регистра TimerH. bsf Status,RP0 ; Переход в й банк. movlw b'00100111' ; Предделитель с коэффициентом деления 256 movwf OptionR ; включен перед TMR0, выбор внешнего тактового сигнала с вывода RA4/TOCKI, ; приращение TMR0 - по переднему фронту. ;================================================================================ ; Начало счета (обозначено меткой On). ;================================================================================ movlw b'00011000' ; Запись в регистр W константы b'00011000' ; (выводы RA3 и RA4/TOCKI работают "на вход, ; остальные - "на выход. On movwf TrisA ; Копирование содержимого регистра W в регистр ; TrisA (начало счета. bcf Status,RP0 ; Переход в й банк. ;******************************************************************************** ; НАЧАЛО ГРУППЫ ПП ДИНАМИЧЕСКОЙ ИНДИКАЦИИ (вход в малое и большое кольцо динамической индикации. ;******************************************************************************** ; ..................................... ;.... ..................................... ; ..................................... ;.... ..................................... ; ..................................... ;================================================================================ ; Первая проверка на переполнение TMR0 ;================================================================================ btfss IntCon,2 ; TMR0 переполнен или нет goto DoNothing ; Нет, не переполнен --> безусловный переход ; в ПП DoNothing. incf TimerH,F ; Да, переполнен --> инкремент содержимого ; регистра TimerH с сохранением результата ; инкремента в нем же. bcf IntCon,2 ; Сброс флага переполнения TMR0. goto O_K ; Безусловный переход в ПП O_K. DoNothing nop ; Выравнивающий NOP. nop ; Выравнивающий NOP. nop ; Выравнивающий NOP. O_K ..................................... ; ..................................... ;.... ..................................... 270 ; ..................................... ;******************************************************************************** ; НИЖНЯЯ ГРАНИЦА МАЛОГО КОЛЬЦА ДИНАМИЧЕСКОЙ ИНДИКАЦИИ . ;******************************************************************************** ; ..................................... ;******************************************************************************** ; НИЖНЯЯ ГРАНИЦА БОЛЬШОГО КОЛЬЦА ДИНАМИЧЕСКОЙ ИНДИКАЦИИ . ;******************************************************************************** ; Группа команд точной "доводки" величины интервала времени основного счета до расчетного значения. ;================================================================================ ; ..................................... ; ..................................... ;================================================================================ ; Конец счета (обозначен меткой Off). ;================================================================================ clrw ; Сброс в 0 содержимого регистра W. movwf PortA ; Копирование нуля из регистра W ; в регистр PortA. bsf Status,RP0 ; Переход в й банк. movlw b'00010000' ; Запись в регистр W константы b'00010000' ; (вывод RA4/TOCKI работает "на вход, ; остальные - "на выход. Off movwf TrisA ; Копирование содержимого регистра W в регистр ; TrisA (конец счета. bcf Status,RP0 ; Переход в й банк. ;================================================================================ ; Вторая проверка на переполнение TMR0 ;================================================================================ btfss IntCon,2 ; TMR0 переполнен или нет goto Analyse ; Нет, не переполнен --> безусловный переход ; в ПП Analyse. incf TimerH,F ; Да, переполнен --> инкремент содержимого ; регистра TimerH, с сохранением результата ; инкремента в нем же. bcf IntCon,2 ; Сброс флага переполнения TMR0. ;================================================================================ ; Копирование содержимого регистра TMR0 в регистр TimerM. ;================================================================================ Analyse movf Tmr0,W ; Копирование содержимого регистра TMR0 ; в регистр W. movwf TimerM ; Копирование содержимого регистра W ; в регистр TimerM. ;================================================================================ ; Сброс в 0 содержимого регистра TimerL. ;================================================================================ clrf TimerL ; Сброс в 0 содержимого регистра TimerL. ;================================================================================ ; Подпрограмма досчета . ;================================================================================ CountIt incf TimerL,F ; Инкремент содержимого регистра TimerL с ; сохранением результата инкремента в нем же. ;-------------------------------------------------------------------------------- ; Кратковременная разблокировка счетного входа TMR0. ;-------------------------------------------------------------------------------- bsf PortA,3 ; Формирование на выводе RA3 единицы. nop ; Временной "зазор. bcf PortA,3 ; Формирование на выводе RA3 нуля. nop ; Временной "зазор. ;-------------------------------------------------------------------------------- ; Досчет . ;-------------------------------------------------------------------------------- movf Tmr0,W ; Копирование содержимого регистра TMR0 ; в регистр W. bcf Status,Z ; Сброс флага нулевого результата Z. subwf TimerM,W ; Вычесть из содержимого регистра TimerM 271 ; содержимое регистра W. btfsc Status,Z ; Результат операции вычитания равен ; или нет нулю goto CountIt ; Да, равен ---> переход в ПП CountIt. comf TimerL,F ; Нет, неравен инвертировать все биты регистра TimerL, с сохранением результата ; инвертирования в нем же. incf TimerL,F ; Инкремент содержимого регистра TimerL, c ; сохранением результата инкремента в нем же. ;================================================================================ ; На данный момент, в 3- байтном регистре TimerH/TimerM/TimerL сформирован результат подсчета в виде 3- байтного двоичного числа, которое, далее, можно обрабатывать в группе подпрограмм преобразования двоичных чисел в двоично - ; десятичные или в группах подпрограмм другого предназначения (в зависимости от специфики разрабатываемого устройства. ; ..................................... ; ..................................... ;.... ..................................... ; ..................................... ;.... ..................................... ; ..................................... ;******************************************************************************** end ; Конец программы. Разбираем текст программы Tmr0.asm Группа команд счета начинается с команд подготовительных операций, сразу же после которых следуют команды начала счета Группа команд подготовительных операций состоит из команды запрета прерываний IntCon ), команды сброса в 0 содержимого регистра ( clrf Tmr0 ), команды сброса в 0 содержимого регистра ( clrf TimerH ) и двух команд записи константы в регистр специального назначения OPTION Регистр OPTION "лежит " в 1- м банке , следовательно, перед работой с ним , нужно перейти в- й банк ( bsf Status,RP0 ). После исполнения команды Option , - вывод RA4/TOCKI подключится к входу предделителя , а выход предделителя подключится к входу TMR0 , - коэффициент деления предделителя будет равен 256, - приращение содержимого TMR0 будет происходить по перепаду от 0 к 1. Есть 2 способа обозначения перепадов импульса. - смена 0 на 1 передний фронт импульса, смена 1 на 0 задний фронт импульса. - смена 0 на 1 фронт импульса, смена 1 на 0 спад импульса. После исполнения команд подготовительных операций, начинается формирование интервала времени счета Для этого необходимо, чтобы вывод (счетный вход ПИКа / вход предделителя ) и вывод блокировки RA3 работали "на вход ". В этом случае, сопротивление между выводом RA3 и корпусом велико ( разблокировка счета. Регистр "лежит " также в 1- м банке , поэтому банк менять ненужной банк был установлен ранее. Константа, через регистр, "переправляется " в регистр TrisA , после чего, выводы RA3 и RA4/TOCKI настраиваются на работу "на вход ", а все остальные выводы порта А , на работу "на выход ". Так как далее будут производиться операции с регистрами 0- го банка, в конце группы команд начала счета, необходимо "вернуться " в 0- й банк ( bcf Status,RP0 ). Убедитесь, что в тексте программы Tmr0.asm, эта последовательность действий соблюдается Счет разрешается после того, как константа будет записана в регистр TrisA , то есть, после исполнения команды TrisA В тексте программы, для удобства, я пометил эту команду меткой (начало основного счета. Если эта метка ненужна, то ее можно убрать, так как в тексте программы, обращений к ней нет 272 Тоже самое относится и к метке, которой помечен конца основного счета Примечание : установка метки (меток, к которой нет обращения, не является ошибкой, и работа программы от этого не нарушится Ошибкой является обращение к метке , которой нет (которая не установлена. Итак, перед входом рабочей точки программы в ПП динамической индикации, произведены подготовительные операции и разрешен счет В соответствии со сказанным выше, далее, должна быть произведена первая проверка на переполнение TMR0 Она должна "врезана " в малое кольцо динамической индикации В этом случае, обеспечивается периодичность проверок, гарантирующая безошибочный подсчет количества переполнений (см сказанное ранее. Первая проверка на переполнение TMR0 начинается с опроса состояния флага прерывания по переполнению ( btfss IntCon,2 ), поднятие которого не зависит оттого, разрешены прерывания или нет, а зависит только от факта переполнения TMR0 Ранее , в подготовительных операциях, все биты регистра IntCon были сброшены в 0, следовательно, на момент разрешения счета, флаг прерывания по переполнению) будет опущен Напоминаю , что флаг T0IF это флаг 2- й группы , и если он поднялся, то опускать его нужно программно Команда ветвления IntCon,2 "разветвляет " программу на 2 сценария, которые, ниже по тексту программы, снова сходятся на первой команде ПП с условным названием О _ К (или на команде, помеченной меткой О _ К , если это считать меткой. В случае наличия подобного рода "разветвления " на 2 сценария, с последующим их "схождением " (а это и имеет место быть, необходимо принять меры по "затяжке " времени исполнения сценария с меньшим временем исполнения (выравнивание. То есть, интервал времени исполнения этого сценария нужно сделать в точности равным интервалу времени исполнения другого сценария (о такой необходимости говорилось ранее. Оба этих сценария исполняются внутри такого " важняка ", как малое кольцо динамической индикации, и поэтому они сильно влияют на процесс формирования калиброванного интервала времени счета Следовательно , выравнивание необходимо Что Вы и видите в тексте программы ( см выравнивающие |