Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
NOP ы ). Разбираем сценарии 1- й сценарий Если произошло переполнение ( флаг T0IF поднялся ), то команда не исполняется (вместо нее исполняется "виртуальный " NOP ), и рабочая точка программы "встает " на команду После исполнения этой команды, происходит инкремент содержимого регистра TimerH, с сохранением результата инкремента в нем же Так как входе отработки ПП динамической индикации, формируется большое количество малых колец динамической индикации, то будет происходить и такое же большое количество проверок на переполнение TMR0 В любом из случаев обнаружения факта поднятия флага, будет осуществлен инкремент содержимого регистра TimerH Таким образом, к моменту выхода рабочей точки программы из большого кольца динамической индикации, в регистре TimerH "осядет " число, равное количеству переполнений, произошедших с момента разрешения основного счета и до момента выхода рабочей точки программы из большого кольца динамической индикации Это "осевшее " число находится в прямо пропорциональной зависимости от частоты импульсной последовательности, подаваемой на счетный вход ПИКа После инкремента содержимого регистра, для обеспечения необходимого условия осуществления следующей проверки ( флаг T0IF должен быть опущен, с помощью команды IntCon,2, бит флага T0IF сбрасывается в 0. После этого происходит безусловный переход в ПП О _ К 2- й сценарий Если переполнения TMR0 не произошло ( флаг T0IF не поднялся, то команда инкремента содержимого регистра TimerH не выполняется, а происходит безусловный переход в ПП " выравнивания " с названием DoNothing ( goto DoNothing ). О "выравнивающих " ах говорилось ранее 273 Почему именно три NOP а ? Давайте разбираться Если считать "точкой разветвления ", на 2 сценария, команду ветвления IntCon,2 , а "точкой их слияния " первую команду ПП О _ К (а это таки есть, то исполнение самого короткого из этих двух сценариев ( btfss - 1 м ц . / goto - 2 м ц .) займет 3 м . ц ., а исполнение самого длинного ( btfss - 1 м ц . / "виртуальный " NOP - 1 м ц . / incf - 1 м ц . / bcf - 1 м ц . / goto - 2 м ц .) займет 6 м . ц .. 6-3=3. Следовательно, для "подтягивания " времени исполнения короткого сценария, к времени исполнения длинного сценария, необходимо 3 "выравнивающих " а, что Вы и видите в тексте программы Соответственно , ПП DoNothing должна исполняться только при отработке короткого сценария После группы команд 1- й проверки на переполнение, следуют остальные команды ПП динамической индикации и группа команд точной "доводки " интервала времени основного счета до расчетного значения После отработки цикла динамической индикации и исполнения группы команд точной "доводки " интервала времени счета до расчетного значения, необходимо завершить счет Перед тем как это сделать, необходимо, на выходе защелки вывода, установить нулевой (блокирующий) уровень В данном случаев сбрасывается не один только бит регистра (можно сделать итак bcf PortA,3 ), а весь байт Причем , эта операция организована нес использованием команды плюс, movwf PortA ), ас использованием команды сброса в 0 содержимого регистра. Посмотрите как это сделано в тексте "программы " (и PortA ). Это можно считать примером использования команды clrw Установка , на выходе защелки порта А , нулевого уровня не есть окончание счета, так как вывод RA3 работает "на вход " (выход защелки отключен от вывода. Счет заканчивается тогда, когда этот вывод переключится с работы "на вход " на работу "на выход ". Команда, после исполнения которой счет прекращается, помечена меткой Off Так как в процессе выхода рабочей точки программы из ПП динамической индикации (на "участке " последнего "витка " большого кольца динамической индикации, который отрабатывается после 1- й проверки ) и дальнейшего исполнения группы команд точной "доводки " интервала времени счета до расчетного значения, может произойти переполнение, то необходимо организовать вторую проверку на переполнение TMR0 Принцип ее организации такой же, как и первой проверки В этом случае (проверка 2), нет необходимости в выравнивании сценариев, так как проверка производится тогда, когда основной счет закончен Если исполняется один сценарий ( переполнения TMR0 нет ), то инкремента содержимого регистра TimerH не происходит и осуществляется безусловный переход в ПП Analyse Если исполняется другой сценарий ( переполнение TMR0 есть ), то происходит инкремент содержимого регистра, флаг T0IF программно опускается и начинается отработка всё той же ПП Analyse все пути ведут в Рим "). Входе 2- й проверки на переполнение, количество инкрементов не может быть больше одного, так как после первого же инкремента, рабочая точка программы выходит из проверки 2. После окончания этой проверки, содержимое регистра TimerH будет окончательно сформировано и можно перейти к формированию содержимого регистра TimerM В этом случае, все просто содержимое регистра TMR0 копируется (через регистр) в регистр TimerM ( movf и TimerM ). После этого, в регистре TimerM, будет "лежать " содержимое TMR0 на момент окончания основного счета Вопрос : "Почему, перед проведением столь ответственной операции с содержимым регистра, его содержимое предварительно не было сброшено в 0, как например, перед проведением не менее ответственной операций с содержимым регистра Ответ : А зачем ? Ведь происходит запись поверху" (то, что "лежало до того ", не имеет значения. 274 Что касается содержимого регистра TimerL на момент начала ПП досчета CountIt , то его, перед началом этой ПП , обязательно нужно сбросить в 0, так как далее будут производиться операции с "привязкой к начальной точке отсчета " (счет от нуля. Что и сделано ( clrf TimerL ). Теперь можно перейти к формированию содержимого регистра TimerL Работа подпрограммы досчета Итак , функция ПП досчета ( CountIt ) заключается в "выталкивании " числа, зафиксировавшегося в байте предделителя (на момент окончания основного счета, в регистр TimerL То есть, ПП досчета CountIt является специфической (изощренной ") разновидностью копирования этого числа в регистр общего назначения Это копирование происходит не напрямую, а косвенно , то есть, посредством организации "принудиловки ", смысл которой "заложен " в той "математике ", которая описана выше ПП досчета CountIt начинается с инкремента содержимого регистра, с сохранением результата инкремента в нем же ( incf TimerL,F ). Далее, путем смены уровней на выходе защелки порта А (вывод, формируется короткий счетный импульс Ничего сложного в процессе его формирования нет (см комментарии в тексте программы. По переднему фронту этого импульса, происходит приращение (инкремент) числового значения байта предделителя Далее , с целью ответа на вопрос "Изменилось или не изменилось числовое значение байта регистра, организуется проверка Для осуществления этой проверки, необходимо произвести сравнение числа, "лежащего " в регистре TMR0 до прохождения счетного импульса, с числом , "лежащим " в регистре TMR0 после прохождения счетного импульса (отслеживание факта приращения. Ранее, число, "осевшее " в регистре TMR0 на момент окончания счета, было скопировано из регистра TMR0 в регистр ( см ПП Analyse ). Это "эталон " (он не изменяется, с которым будет производиться сравнение С этим "эталоном " будет сравниваться содержимое регистра TMR0, которое , в итоге отработки ПП неизбежно увеличится на 1. Это произойдет в случае смены числового значения байта предделителя сна, после чего будет осуществлено числовое преобразование, и рабочая точка программы выйдет из ПП по сценарию "программа исполняется далее ". Во всех остальных случаях, инкремента содержимого регистра (возможен только один инкремент) производится не будет (будут производиться инкременты содержимого байта предделителя ), и рабочая точка программы будет "мотать витки " в ПП CountIt На каждом таком "витке ", формируется один счетный импульс ( см ПП CountIt ), который инкрементирует содержимое регистра TimerL В процессе "намотки этих витков ", инкременты содержимого регистра TimerL будут происходить до тех пор, пока числовое значение байта предделителя не сменится сна. В момент этой смены, по определению, происходит инкремент содержимого регистра TMR0 Это приведет к тому , что входе следующей проверки, будет обнаружено числовое расхождение между "эталоном " (числовым значением байта регистра) и числовым значением байта регистра TMR0 После этого, будет осуществлено числовое преобразование, и рабочая точка программы выйдет из ПП по сценарию "программа исполняется далее ". На момент начала исполнения этого сценария, числовое значение байта регистра TimerL будет в точности равно числовому значению байта предделителя на момент окончания основного счета "Мотание колец " происходит в группе команд, реализующих специфическую, циклическую ПП задержки Величина этой задержки зависит от числового значения байта предделителя на момент окончания основного счета Чем бОльшим будет это значение, тем меньшей будет задержка (и наоборот. Эту группу команд можно классифицировать как группу команд, реализующих однобайтный , суммирующий счетчик с "плавающей" предустановкой 275 То есть, от "витка квитку " полного цикла программы, числовое значение предустановки может быть различным Этот счетчик как бы работает в режиме "автономного самообслуживания ". То есть, досчет не влияет на результаты подсчета, произведенного ранее (входе процедуры досчета , не вносится погрешностей в результат основного счета. Процедура досчета является чисто технической процедурой "переправки " числа из байта предделителя в байт регистра TimerL Вернемся к тексту ПП досчета После формирования счетного импульса, исполняется команда То есть, содержимое регистра TMR0 копируется в регистр W Тем самым, обеспечивается дальнейшая возможность сравнения числа, записанного в регистре TMR0 , с "эталоном ". Для обеспечения комфортности отслеживания работы подпрограммы, флаг нулевого результата Z предварительно сбрасывается в 0: bcf Status,Z (если эта комфортность ненужна, то команду можно "выкинуть " из текста программы. Далее, при помощи команды TimerM,W , производится сравнение чисел, записанных в байтах регистров W и TimerM Сравнение производится путем вычитания содержимого регистра W, из содержимого регистра, с последующей проверкой на нулевой результат В регистре TimerM находится "эталон ", то есть, число, " зафиксировавшееся " в TMR0 после окончания счета В регистре W, может находиться либо число равное "эталону " (если переполнения байта предделителя нет, либо число отличное от "эталона " (если переполнение байта предделителя есть. Если после исполнения команды TimerM,W ( команда subwf воздействует на флаг, произвести проверку состояния флага ( btfsc Status,Z ), что в тексте ПП CountIt и сделано, тов первом случае, будет исполнен сценарий "намотки витков ", а во втором случае, сценарий "программа исполняется далее ". В сценарии "намотки витков ", по команде CountIt , происходит переход рабочей точки программы на начало исполнения ПП досчета , после чего, ПП досчета исполняется снова, и содержимое регистра TimerL еще раз инкрементируется И так далее Такие "витки " будут "наматываться " до тех пор, пока числовое значение байта предделителя не изменится сна (переполнение, после чего произойдет инкремент содержимого регистра TMR0 На этот момент времени, содержимое регистра TimerL будет инкрементировано количество раз, равное разнице между числом 256 и числом , зафиксировавшимся в байте предделителя на момент окончания основного счета После инкремента содержимого, результат исполнения команды TimerM,W , станет не =0, и произойдет переход на сценарий "программа исполняется далее ". После этого, рабочая точка программы "зайдет " в группу команд числового преобразования Далее все очень просто вспомните, как, занимаясь математикой, мы " химичили " с числом .192 (см выше. То есть, последовательность действий должна быть следующей Инверсия всех битов содержимого регистра, с сохранением результата инверсии в нем же ( comf TimerL,F ). Инкремент содержимого регистра TimerL, с сохранением результата инкремента в нем же ( incf TimerL,F ). После этого, рабочая точка программы, по сценарию "программа исполняется далее ", выходит из ПП досчета и "дальше бежит делать свои дела ". Вопрос "Можно ли обойтись без второй проверки на переполнение Ответ : можно , если сразу же после первой проверки на переполнение TMR0, счет прекратить Если организуются 2 проверки на переполнение, то время прохождения рабочей точкой программы участка программы, между окончанием проверки 1 и началом проверки 2, не должно превышать времени двойного переполнения TMR0 на самой высокой, расчетной скорости счета, а иначе , 2 переполнения посчитаются как одно При выборе частоты проверок на переполнение 1, следует учитывать то, что чем 276 чаще они следуют, тем бОльшую программную скорость счета можно достигнуть, но и слишком частыми их делать не стОит , так как превышение программной скорости счета над предельно допустимой скоростью счета применяемого ПИКа , в практическом отношении, выигрыша не даст (выше того, на что "способен " счетный вход ПИКа , не "прыгнешь "). Процесс счета происходит в границах интервала времени счета, и именно в этих границах, должны быть организованы проверки на переполнение TMR0 Это предполагает наличие, в этих границах, циклической подпрограммы, в которую и нужно "врезать " группу команд проверки 1 на переполнение TMR0 Количество "витков, наматываемых " в ней рабочей точкой программы, в интервале времени между ее " влётом " в нее и "вылетом " из нее, есть количество проверок ( № 1) на переполнение, плюс, одна проверка 2. Если речь идет о " влёте " в циклическую ПП , с последующим "вылетом " из нее, то это предполагает наличие счетчика внутренних циклов (постановка циклов на счетчик "). В конечном итоге, задача сводится к недопущению переполнения TimerH во всем диапазоне частот работы ПИКа и к подбору оптимального времени отработки одного цикла ПП CYCLE Этот интервал времени должен быть стабилен (напоминаю про выравнивание сценариев. Врезать " что- то дополнительное, в "промежуток " от начала и до конца счета, можно, но нужно учитывать то, что после этого, нужно производить калибровку В следующем разделе, я расскажу , как работает "полноценная " программа частотомера. ………………………………………………………. ………………………………………………………. То, что Вы прочитали, написано в довольно - таки сдержанном тоне Далее , постепенно, будет "вводиться в эксплуатацию " образное мышление Появятся различные "персонажи ". То, что жизнь нужно разнообразить, понятно, но дело не только в этом Речь идет о "вводе в эксплуатацию " такого мощнейшего "инструмента ", как подсознание Многие не осознают его мощи А зря Остальная информация Самоучителя по программированию PIC контроллеров для начинающих, а также вся информация Практикума по конструированию устройств на PIC контроллерах , Самоучителя по программно - аппаратному анализу и информация Обмена информацией и идеями предоставляется только пользователям CD. Разъяснения : karabea@lipetsk.ru " Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru 277 Заключение Уважаемые читатели Работа над "Самоучителем" функционально закончена Я объяснил работу всех составных частей "начинки " PIC16F84A , основы конструирования устройств нам контроллерах и "провел " Вас по всей "цепочке " от возникновения нескольких идей и до их практической реализации, с постепенным наращиванием сложности решаемых задач Это чисто авторская информация, иона является редкой в том смысле, что насколько я знаю , никто кроме меня таки не отважился "броситься на эту амбразуру " (подробное описание процесса конструирования достаточно сложного устройства нам контроллере, с предъявлением к этому описанию высоких требований по "детализации " и "удобоваримости "). Покажите мне этого человека, и я буду уважать его до конца жизни, так как знаю, какой это большой труд Я постарался обеспечить Вам доступ в "святая святых " процесса конструирования устройств нам контроллерах, то есть туда, где на "входе стоит огромный шлагбаум, и его сторожит куча свирепых псов ". Детальное описание этой "ужасной картины " вовсе не есть процесс легкий и приятный , но "врага нужно знать в лицо ", а иначе с собственным лицом будут большие проблемы Без хорошего "пулемета и гранаты ", будет та же ситуация, что и с Матросовым : чести много, а толку , лично для него, никакого Гораздо прагматичнее и разумнее , с комфортом , спокойно и по - деловому, "перестрелять этих псов из пулемета и шлагбаум взорвать ". Вот это уже деловой подход сильного и уважающего себя мужика (в самом лучшем смысле этого слова, который, лично мне, больше по душе На эту работу я потратил почти 2 года "плотной " работы При этом, я стремился вложить в нее свою душу, сделать информацию максимально понятной и создать "климат " доброжелательности и дружелюбия , основанный на взаимном уважении к труду друг друга В любом случае, за свою работу мне не стыдно, так как я делал ее с удовольствием и добросовестно Огромное , человеческое спасибо всем тем, кто меня, в том или ином виде, поддерживали поддерживает в работе Без этого, я не смог бы осилить эту "глыбу " информации Если говорить откровенно, тов течение некоторого времени, я считал себя "лохом ". В том смысле, что "выдаю на гора " такую информацию, которую "днем согнем не сыщешь ", и делаю ту работу, за которую, ввиду ее высокой трудоемкости, никто не берется И переубедили меня в этом Вы Если работа востребована, то все видится в другом свете В основном , трудности "въезда в м / контроллеры " связаны с отсутствием понятной и доступной , русскоязычной "школы ", способной "пробить мозги до самого гипофиза ". Имеющиеся в наличии курсы обучения, в том числе и в ВУЗах , крайне неэффективны, так как они представляют собой форму без осмысленного и понятного содержания, да к тому же еще и не очень- то "привязанную " к реальным , жизненным потребностям Я это знаю совершенно точно, так как общаюсь со студентами ВУЗов Дело доходит даже до того, что преподаватели сами признают неэффективность того, что они преподают Вокруг этой "железяки " с названием м / контроллер , из- за нашего страха, природной лени и бездумного "поклонения идолу ", создан такой ажиотаж (о, этот "великий и ужасный " м / контроллер !!!), что просто диву даешься Нет в нем ничего "великого и ужасного ". Это же "тупая железяка " !!! Что Вы ей приказали, то она и сделает Проблема только в том , как научиться толково и грамотно приказывать Но из- за отсутствия продуманной и эффективной системы обучения, на "фоне " полнейшей анархии (кто во что горазд, попытки этому научиться, во многих случаях, заканчиваются тем, что человек начинает чувствовать себя дебилом (условно. Это не "осчастливливает ", а "отбивает почки ". Все это я капитально прочувствовал еще до того, как затеял свою работу (имею огромный 278 опыт "вождения носом по батарее " и "битья головой о стену ", что кстати, не есть однозначно плохо. Но кто- тоже ведь должен положить конец этому "безобразию " или, по крайней мере, попытаться это сделать А там , глядишь, и дело с мертвой точки сдвинется Обращаю Ваше внимание на то, что конструирование устройств нам контроллерах (и вообще конструирование) это искусство, то есть, удел людей творческих и увлеченных Если вы относитесь к этой категории "гусаров- схимников ", то "милости просим к нашему шалашу " и давайте "кучковаться ". Так выжить легче Свою главную задачу я вижу в том , чтобы внести свой посильный вклад в работу по созданию качественной информации, реально помогающей людям "Самоучитель" можно рассматривать как первый этап этой помощи Образно выражаясь, те из Вас , кто его изучили поняло чем шла речь, уже являются, хотя и "зелеными ", но "лейтенантами ". Можете смело праздновать "выпускной бал " и любоваться "виртуальной корочкой " об окончании серьезного "ВУЗа ", которая и есть "пропуск " в интересный , увлекательный и своеобразный мир м / контроллеров Успехов Вам в работе ! С уважением , Корабельников Евгений Александрович (родом из СССР ). Самоучитель по программированию PIC контроллеров для начинающих" |