Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
X, Y, Z (их можно назвать как угодно, это дело вкуса программиста) собран 3- х разрядный вычитающий счетчик, то следует иметь ввиду, что эти регистры, сами по себе, таковым счетчиком не являются Этим счетчиком их делает программа, а если конкретнее, то программист Именно программа (соответствующие ее команды и последовательность их исполнения) определяет порядок взаимодействия разрядов счетчика (старший, средний, младший, направление счета, точку начала и конца отсчета, наличие или отсутствие предварительной установки, момент сброса и т д Откройте " Приложение № 2". На этой картинке Вы видите область оперативной памяти PIC16F84A Регистры общего назначения находятся в пустых клеточках Каждой такой клеточке соответствует свой адрес Пустые (без названий) они потому, что названия им назначает программист Например , для работы в программе , необходим регистр буферной памяти, в котором нужно "попридержать " число, с целью его использования в дальнейшем Назовем его, например, Mem и присвоим ему адрес 0Ch (это делается в "шапке " программы, о чем - позже. Это означает то, что регистр займет в области оперативной памяти ту клеточку, которая расположена правее желтой клеточки с надписью INTCON Всё Регистр буферной памяти условно "прописан " (ему назначено название и присвоен адрес в области оперативной памяти) и теперь с ним можно работать "Условно " потому, что пока он "прописан " на бумаге, а не в тексте программы ( об этой "технологии " – позже. Эту картинку я делал для себя, и кроме обучения, она полезна в работе Распечатайте ее в нескольких экземплярах При составлении программы, в пустые клетки этой таблицы, можно заносить названия регистров общего назначения, а при необходимости, и какие - либо пояснительные надписи Это удобно, и лично я, частенько так делаю Я надеюсь , что Вы без труда поймете, как определяется адрес той или иной пустой клетки ( да и закрашенной тоже. В конце адреса стоит буква (признак 16- ричной системы исчисления. Именно в таком виде лучше всего указывать адрес регистра в "шапке " программы Например , 0Ch, 14h, 29h, 2Ch ... Можно использовать и прописные буквы 0ch, 2dh, 1fh ... Хотя в распечатке области оперативной памяти указаны 36 регистров общего назначения, нона самом деле их 68 (еще плюс 2 ряда по 16 штук ниже нижнего ряда. Таким образом, 68 регистров общего назначения, в области оперативной памяти, имеют адреса банк 0 - с 0Ch по 4Fh, банк 1 - c 8Ch по CFh. При составлении программ, редко когда возникает необходимость в задействовании всех- ми регистров общего назначения, и поэтому , в распечатке области оперативной памяти, я указал не 68, а 36 регистров общего назначения, чего вполне достаточно для составления даже достаточно сложных программ Имейте это ввиду Область оперативной памяти, "во всей своей полномасштабной красе ", можно наблюдать в, речь о которой пойдет ниже Область оперативной памяти разделена на 2 так называемых банка (в таблице их разделяет черная, жирная линия. Банк они есть банк, то есть, некое "хранилище задействованных или незадействованных активов " (в виде регистров общего и специального назначения. Сверху расположен самый "ходовой ", нулевой банк, в котором программы работают бОльшую часть своего времени Что касается регистров общего назначения, тов части касающейся, все они расположены в нулевом банке, а в первом банке просто дублируются (повторяются или, как часто говорят, отображаются. Такого рода дублирование позволяет работать с регистрами общего назначения как в нулевом , таки в первом банке, "не забивая себе голову " переходами из банка в банк , чего не 15 скажешь о недублирующихся регистрах специального назначения Регистры специального назначения Детали нашего ПИК - конструктора состоят не из одних регистров общего назначения Это - самые простые "детали ". По большому счету, к его "деталям " относится практически вся электронная "начинка " PIC контроллера тактовый генератор, система сброса, АЛУ, память, устройства, обеспечивающие прерывания, порты ввода - вывода, таймер, предделитель , сторожевой таймер (перечислен минимальный "набор " для PIC16F84A Для более сложных ПИКов этот набор еще больше. Перечисленные выше устройства имеют по нескольку режимов работы, конкретный режим работы которых выбирает программист Этот выбор режимов происходит в регистрах специального назначения, путем установки соответствующих их битов вили, а также путем установки вили соответствующих битов в так называемом слове конфигурации Что касается последнего, тона первых порах, для простоты понимания, можно условно считать, что биты конфигурации "лежат " в дополнительном регистре " суперспециального " назначения, который не отображается в области оперативной памяти Не отображается потому, что биты конфигурации расположены в специальном "секторе " энергонезависимой памяти микроконтроллера В дальнейшем , такое упрощение позволит, без особого " напряга ", представить себе механизм работы с битами конфигурации Рассмотрим регистры специального назначения ( SFR ). Взгляните в область оперативной памяти Эти регистры находятся в закрашенных желтым цветом клеточках (адреса 07h и 87h – пустышки "), ив них же находятся их названия Названия и адреса этих регистров стандартны (неизменны) и манипулировать ими (назначать свои, в отличие от регистров общего назначения, нельзя А раз это так, то единственное, что можно сними сделать, так это только изменить их содержимое, то есть, произвести те или иные манипуляции сих битами (установить те или иные из них их вили. В зависимости от этих манипуляций, электронная "начинка " ПИКа приобретает свойства, обеспечивающие функционирование программы (а значит и устройства ) по замыслу программиста Регистры SFR с названиями, выделенными красным цветом, дублируются (отображаются) в обеих банках Черным цветом выделены названия регистров, которые не дублируются Работа с большей частью регистров SFR происходит в нулевом банке При этом, содержимое регистров SFR нулевого банка, выделенных красным цветом, дублируется (отображается) в первом банке Для работы с регистрами SFR 1- го банка, выделенными черным цветом, необходимо (при обращении к любому из них) перейти в 1- й банк , произвести сих содержимым необходимые действия, и вернуться после этого назад, в нулевой банк В нулевом банке, действий сих содержимым производить нельзя Таких регистров 5 (см область оперативной памяти, и их названия нужно хорошо запомнить именно по причине необходимости смены банка Во всех остальных случаях работа происходит в нулевом банке Некоторые регистры специального назначения, кроме битов, непосредственно влияющих на настройки "начинки " ПИКа, имеют еще и биты , которые на эти настройки не влияют Их называют флагами Проще говоря, эти биты не производят действий, непосредственно приводящих к каким - либо изменениям, но обращаясь к их содержимому, можно считать информацию о результате какой- либо операции (например, является ли результатом этой операции ноль или нет, а затем использовать эту информацию при выборе одного из нескольких сценариев дальнейшей работы программы Таким образом, флаги могут опосредованно (косвенно) участвовать в рабочих действиях и вовсе не являются чем- то бесполезным При отладке программы, проанализировав состояния соответствующих флагов, можно узнать много полезной информации 16 В свое время, я долго и нудно перерабатывал информацию, из различных источников, в поисках наиболее наглядного и понятного варианта распечатки состава регистров, после чего плюнул на это дело и самостоятельно составил эту распечатку для себя Мне она сослужила "хорошую службу ", пусть послужит и Вам Совет : изначально, Вам будет сложновато запомнить то, что Вы увидите Поэтому сделайте так, как сделал я на Вашем рабочем месте, прикрепите эти листы так, чтобы они висели перед Вами и постоянно бросались Вам в глаза Общая информация по SFR: " Приложение № 3". Регистр OPTION: " Приложение № 4". Регистр STATUS: " Приложение № 5". Регистр INTCON: " Приложение № 6". Регистр EECON1: " Приложение № 7". Биты конфигурации " Приложение № 8". Все эти файлы относятся к PIC16F84A Таблица перевода чисел из одной системы исчисления в другую : Приложение. Это - одна из наиболее востребованных таблиц, и при работе с программой , Выбудете часто к ней обращаться В ней расписан "расклад " чисел в пределах одного байта В большинстве случаев, этого достаточно, но если Вы будете работать с числами , "находящимися за пределами " одного байта, то используйте конвертор систем исчисления Буквами D, B, обозначены десятичная, бинарная, 16- ричная системы исчисления соответственно Небольшое "лирическое отступление " для поднятия боевого духа если, после прочтения изложенной выше информации, Вы начнете ощущать, что ожидаемое понимание не приходит, то особо не расстраивайтесь На данной стадии "въезда ", "бардак в мозгах " нормален и естественен Я очень удивлюсь, если этого не будет В такого рода информации нужно немного " повариться ", что предполагает приложение некоторых усилий "Кавалерийским наскоком " такие дела не делаются Сейчас "выстраивается скелет " и нужно отдельно разобраться с каждой "косточкой ". Дело это конечно "муторное ", но совершенно необходимое, а "прозрение " придет позднее Желаю Вам терпения, усидчивости и хорошей злости Пошли дальше Разбираемся с битами регистров SFR Сразу расставлю приоритеты в первую очередь, с целью недопущения "бардака ", сначала я буду рассказывать о рабочих битах, а о флагах расскажу отдельно С этой же целью, на первых порах, я не буду вдаваться в некоторые необязательные, для начинающих, детали (о них - позднее. Сразу обращаю Ваше внимание нумерация битов в байте происходит не слева - направо, а справа - налево Это означает то, что бит младшего разряда (бит с номером ноль) - крайний справа, а не слева- бит - самый старший Про нумерацию битов слева направо - забудьте В распечатках , красным цветом обозначены рабочие биты, зеленым цветом - флаги, серым цветом – пустышки " (не используются. 17 В регистре PS0,PS1,PS2'>STATUS_расположены_три_рабочих_бита_(5,6,7_),_из_которых_нас,_пока,_интересует_только-_йбит_сназваниемRP0'>STATUS расположены три рабочих бита ( 5,6,7 ), из которых нас, пока, интересует только- й бит с названием RP0 Именно этим битом переключаются банки (0 - нулевой банк, 1 - первый банк. На момент старта (начала исполнения) программы, в ПИКе всегда автоматически (по умолчанию) выставляется нулевой банк Бит RP1 устанавливается равным нулю и для смены банка достаточно изменять только значение бита (по умолчанию RP0 устанавливается в 0). Учитывая то, что- й бит ( IRP ) также, по умолчанию, устанавливается в 0, ив 2- го иго банка простонет (они есть в более сложных ПИКах ), то пробиты b6bиb7bможно просто "забыть " (конечно, условно, до поры до времени) и пока не "забивать себе ими голову ". Итак в регистре STATUS , в приложении к, имеется всего один рабочий бит переключения банков RP0 Регистр OPTION Все 8 битов - рабочие Биты PS0,PS1,PS2 определяют коэффициент деления предделителя (см таблицу в распечатке ). Предделитель это последовательная цепочка из 8- ми триггеров, каждый из которых делит на 2. Таким образом, максимальный коэффициент деления предделителя = 256, ион, в пределах разрешенных таблицей значений, может задаваться значениями битов PS0,PS1,PS2 Предделитель может быть включен либо перед таймером, либо после сторожевого таймера WDT Это определяет- й бит регистра ( PSA ). Таймер - тоже самое, что и предделитель ( Кделения = 256), нос возможностью предустановки (предварительной установки) и синхронизации Предустановка это есть запись в таймер числа, начиная с которого происходит счет Обычно , такого рода загрузку (числовую коррекцию) производят для задания некой начальной точки отсчета Если таймер TMR0 работает без предустановки , его коэффициент деления всегда равен 256 и не меняется Достаточно специфическим случаем изменения Кделения TMR0 является случай работы с периодическими предустановками Это применяется относительно редко В большинстве же случаев, перед TMR0 включается предделитель с заданным Кделения Если предделитель включен перед, то, при поступлении команды сброса (уст. 0), они сбрасываются одновременно Команду сброса можно рассматривать как разновидность предустановки Основная функция таймера - подсчет количества импульсов за определенное программой время Через каждые 256 импульсов (при переходе из состояния FFh в состояние 00h) происходит так называемое переполнение таймера (переход на новое кольцо счета, количество которых ( при необходимости подсчета количества импульсов большего, чем 256) подсчитывается Например : засек произошло 10 переполнений, значит TMR0 посчитал 2560 импульсов Если приплюсовать к этому количеству содержимое TMR0 на момент окончания счета, то получим точное количество импульсов, поступивших на вход TMR0 за 1 сек Если перед TMR0 включен предделитель , тов итог подсчета вносятся соответствующие коррективы, определяемые заданным коэффициентом деления предделителя и числом , лежащим " в предделителе на момент окончания счета На такого рода подсчете и основывается принцип работы устройств, производящих подсчет импульсов за заданный интервал времени Сторожевой таймер это RC- одновибратор (RC- ждущий мультивибратор) с перезапуском , формирующий импульс длительностью примерно мс Если работа WDT разрешена (а она может быть и запрещена ), то после старта программы, он запускается, и если его, в интервале времени мс, не перезапустить, то он окончит формирование импульса, и по его заднему фронту, сформируется сигнал сброса, после чего программа начнет исполняться со своего начала Зачем это нужно В случае "зависания " программы, WDT , сбросив программу на начало, может вывести ее из этого нехорошего состояния Именно поэтому таймер WDT и назван сторожевым 18 Он как бы "сторожит глюк ", и как только он происходит (при этом, сброса WDT не происходит, говорит свое веское слово ". Для обеспечения этого сторожевого режима, входе выполнения программы, необходимо периодически (через время не более мс) сбрасывать (не допускать его срабатывания. Если после WDT поставить предделитель , то период сброса WDT можно увеличить (это зависит от заданного Кделения предделителя ). 3 - й бит ( RSA ) регистра OPTION определяет , к чему подключить предделитель (кили. Если предделитель включен после, то они оба сбрасываются по команде сбросам битом регистра ( TOSE ) устанавливается момент срабатывания таймера TMR0 При установке бита TOSE в 1, счет происходит по спадам импульсной последовательности ( переход от 1 к 0), присутствующей на выводе, а при установке его в 0 - по фронтам (переход от 0 к 1). Значение- го бита регистра ( TOCS ) определяет, какой сигнал будет подаваться на вход либо внешний сигнал со счетного входа (бит устанавливается в 1), либо внутренний тактовый сигнал (бит устанавливается в 0). В качестве внутреннего тактового сигнала используется сигнал с частотой опорного генератора ПИКа , разделенной на 4, то есть, в этом случае, будет считать каждый машинный цикл (мкс при применении кварца на мГц. Это - для случая работы TMR0 без предделителя Если используется предделитель , то нужно учесть его коэффициент деления- й бит регистра ( INTEDG ) определяет, по какому именно перепаду, на входе внешнего прерывания, будет начинаться выполнение подпрограммы прерывания ( о прерываниях - позднее. 1 – "уход " в подпрограмму прерывания будет происходить по фронту сигнала на выводе, 0 - по спаду В зависимости от состояния- го бита регистра ( -RBPU ), к выводам порта В либо подключаются, либо не подключаются подтягивающие резисторы (между выводами порта В и плюсом источника питания. Вони подключаются или отключаются "оптом ", то есть, все 8, а не выборочно Обращаю Ваше внимание на то, что подтягивающие резисторы могут быт подключены, к выводам порта В , только в случае установки режимов их работы "на вход. Поясняю выводы порта В могут работать как "на вход ", таки "на выход ". При работе "на выход ", подтягивающие резисторы автоматически отключаются (если они были подключены, так как выходы защелок портов имеют свои подтягивающие резисторы, включенные постоянно (нагрузки защелок. При работе "на вход " подтягивающие резисторы, если они были подключены, не отключаются Таким образом, подтягивающие резисторы, если они подключены, могут быть нагрузкой выходных каскадов внешних устройств, подключенных к выводам порта В , работающим "на вход ". Это удобно в случаях отсутствия, в этих каскадах, "своей " нагрузки То есть, подтягивающие резисторы необходимо включить, если к выводу порта В , работающему "на вход ", подключается выход внешнего (по отношению к ПИКу ) устройства с открытым коллектором или открытым стоком В этом случае, соответствующий подтягивающий резистор порта В будет являться нагрузкой внешнего устройства с открытым коллектором или открытым стоком Если выходные каскады внешних устройств имеют "свою " нагрузку, то подтягивающие резисторы подключать ненужно Иначе, не во всех, нов некоторых случаях, это может привести к изменению режима работы выходного каскада внешнего устройства по постоянному току Регистр |