Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 3597
Скачиваний: 3
Врегистре STATUS расположены три рабочих бита (5,6,7), из которых нас, пока, интересует только 5-й бит с названием RP0.
Именно этим битом переключаются банки (0 - нулевой банк, 1 - первый банк).
На момент старта (начала исполнения) программы, в ПИКе всегда автоматически (по умолчанию) выставляется нулевой банк.
Бит RP1 устанавливается равным нулю и для смены банка достаточно изменять только значение бита RP0 (по умолчанию RP0 устанавливается в 0).
Учитывая то, что 7-й бит (IRP) также, по умолчанию, устанавливается в 0, и в PIC16F84A 2-го и 3-го банка просто нет (они есть в более сложных ПИКах), то про биты 6 и 7 можно просто "забыть" (конечно, условно, до поры до времени) и пока не "забивать себе ими голову". Итак: в регистре STATUS, в приложении к PIC16F84A, имеется всего один рабочий бит переключения банков RP0.
Регистр OPTION.
Все 8 битов - рабочие.
Биты PS0,PS1,PS2 определяют коэффициент деления предделителя (см. таблицу в распечатке).
Предделитель это последовательная цепочка из 8-ми триггеров, каждый из которых делит на 2.
Таким образом, максимальный коэффициент деления предделителя = 256, и он, в пределах разрешенных таблицей значений, может задаваться значениями битов PS0,PS1,PS2. Предделитель может быть включен либо перед таймером TMR0, либо после сторожевого таймера WDT.
Это определяет 3-й бит регистра OPTION (PSA).
Таймер TMR0 - то же самое, что и предделитель (Кделения = 256), но с возможностью предустановки (предварительной установки) и синхронизации.
Предустановка это есть запись в таймер числа, начиная с которого происходит счет. Обычно, такого рода загрузку (числовую коррекцию) производят для задания некой начальной точки отсчета.
Если таймер TMR0 работает без предустановки, его коэффициент деления всегда равен 256 и не меняется.
Достаточно специфическим случаем изменения Кделения TMR0 является случай работы с периодическими предустановками. Это применяется относительно редко.
Вбольшинстве же случаев, перед TMR0 включается предделитель с заданным Кделения. Если предделитель включен перед TMR0, то, при поступлении команды сброса (уст. 0), они сбрасываются одновременно.
Команду сброса можно рассматривать как разновидность предустановки. Основная функция таймера TMR0 - подсчет количества импульсов за определенное программой время.
Через каждые 256 импульсов (при переходе из состояния FFh в состояние 00h) происходит так называемое переполнение таймера (переход на новое кольцо счета), количество которых (при необходимости подсчета количества импульсов большего, чем 256) подсчитывается. Например: за 1сек. произошло 10 переполнений, значит TMR0 посчитал 2560 импульсов. Если приплюсовать к этому количеству содержимое TMR0 на момент окончания счета, то получим точное количество импульсов, поступивших на вход TMR0 за 1сек.
Если перед TMR0 включен предделитель, то в итог подсчета вносятся соответствующие коррективы, определяемые заданным коэффициентом деления предделителя и числом, "лежащим" в предделителе на момент окончания счета.
На такого рода подсчете и основывается принцип работы устройств, производящих подсчет импульсов за заданный интервал времени.
Сторожевой таймер WDT это RC-одновибратор (RC-ждущий мультивибратор) с перезапуском, формирующий импульс длительностью примерно 18мс.
Если работа WDT разрешена (а она может быть и запрещена), то после старта программы, он запускается, и если его, в интервале времени 18мс., не перезапустить, то он окончит формирование импульса, и по его заднему фронту, сформируется сигнал сброса, после чего программа начнет исполняться со своего начала.
Зачем это нужно?
Вслучае "зависания" программы, WDT, сбросив программу на начало, может вывести ее из этого нехорошего состояния.
Именно поэтому таймер WDT и назван сторожевым.
17
Он как бы "сторожит глюк", и как только он происходит (при этом, сброса WDT не происходит), "говорит свое веское слово".
Для обеспечения этого сторожевого режима, в ходе выполнения программы, необходимо периодически (через время не более 18мс.) сбрасывать WDT (не допускать его срабатывания).
Если после WDT поставить предделитель, то период сброса WDT можно увеличить (это зависит от заданного Кделения предделителя).
3-й бит (RSA) регистра OPTION определяет, к чему подключить предделитель (к TMR0 или
WDT).
Если предделитель включен после WDT, то они оба сбрасываются по команде сброса WDT. 4-м битом регистра OPTION (TOSE) устанавливается момент срабатывания таймера TMR0. При установке бита TOSE в 1, счет происходит по спадам импульсной последовательности (переход от 1 к 0), присутствующей на выводе RA4/TOCKI, а при установке его в 0 - по фронтам (переход от 0 к 1).
Значение 5-го бита регистра OPTION (TOCS) определяет, какой сигнал будет подаваться на вход TMR0: либо внешний сигнал со счетного входа RA4/TOCKI (бит устанавливается в 1), либо внутренний тактовый сигнал CLKOUT (бит устанавливается в 0).
Вкачестве внутреннего тактового сигнала используется сигнал с частотой опорного генератора ПИКа, разделенной на 4, то есть, в этом случае, TMR0 будет считать каждый машинный цикл (1мкс. при применении кварца на 4мГц).
Это - для случая работы TMR0 без предделителя.
Если используется предделитель, то нужно учесть его коэффициент деления.
6-й бит регистра OPTION (INTEDG) определяет, по какому именно перепаду, на входе внешнего прерывания INT, будет начинаться выполнение подпрограммы прерывания (о прерываниях - позднее).
1 – "уход" в подпрограмму прерывания будет происходить по фронту сигнала на выводе
RB0/INT, 0 - по спаду.
Взависимости от состояния 7-го бита регистра OPTION (-RBPU), к выводам порта В либо подключаются, либо не подключаются подтягивающие резисторы (между выводами порта В и плюсом источника питания).
ВPIC16F84A, они подключаются или отключаются "оптом", то есть, все 8, а не выборочно.
Обращаю Ваше внимание на то, что подтягивающие резисторы могут быт подключены, к выводам порта В, только в случае установки режимов их работы "на вход".
Поясняю: выводы порта В могут работать как "на вход", так и "на выход".
При работе "на выход", подтягивающие резисторы автоматически отключаются (если они были подключены), так как выходы защелок портов имеют свои подтягивающие резисторы, включенные постоянно (нагрузки защелок).
При работе "на вход" подтягивающие резисторы, если они были подключены, не отключаются.
Таким образом, подтягивающие резисторы, если они подключены, могут быть нагрузкой выходных каскадов внешних устройств, подключенных к выводам порта В, работающим "на вход".
Это удобно в случаях отсутствия, в этих каскадах, "своей" нагрузки.
То есть, подтягивающие резисторы необходимо включить, если к выводу порта В, работающему "на вход", подключается выход внешнего (по отношению к ПИКу) устройства с открытым коллектором или открытым стоком.
Вэтом случае, соответствующий подтягивающий резистор порта В будет являться нагрузкой внешнего устройства с открытым коллектором или открытым стоком.
Если выходные каскады внешних устройств имеют "свою" нагрузку, то подтягивающие резисторы подключать не нужно.
Иначе, не во всех, но в некоторых случаях, это может привести к изменению режима работы выходного каскада внешнего устройства по постоянному току.
Регистр EECON1 управляет чтением - записью в EEPROM память данных.
Он имеет 3 рабочих бита, манипуляции со значениями которых необходимы при организации процедур чтения - записи.
Пока, не нужно "забивать себе голову" информацией об этих битах.
Причина простая: при чтении и записи данных в EEPROM память данных, применяются рекомендуемые разработчиками стандартные процедуры (эти биты в них участвуют) и вносить в них коррективы просто нет необходимости.
18
Если нужно произвести чтение или запись, то в программу просто вставляется соответствующая стандартная процедура, рекомендованная разработчиками, в которой все действия стандартно "расписаны" (включая и работу с этими битами).
Об этих процедурах я расскажу позднее. Сказанное выше относится и к регистру EECON2. Регистр INTCON имеет 5 рабочих битов.
Это регистр управления прерываниями.
После возникновения факта прерывания, за счет "ухода" рабочей точки программы в подпрограмму прерываний, происходит временная приостановка выполнения "основной" (условно) программы.
После возврата из подпрограммы прерываний, отработка "основной" программы продолжается.
Если в составе программы имеется подпрограмма прерываний, то в "шапке" программы (пока привыкните к этому названию, а объяснение будет позднее) устанавливается так называемый вектор прерываний, который также, как и команда старта для "основной" программы, определяет начальный адрес счетчика команд для первой команды, но только не "основной" программы, а подпрограммы прерываний.
"Основная" программа стартует и выполняется до тех пор, пока рабочая точка программы не войдет в "зону" разрешения прерываний.
Если в этой "зоне" происходит, например, внешнее прерывание по входу RB0/INT, то адрес следующей команды "основной" программы запоминается (адрес возврата записывается в стек - об этом позднее), выполнение "основной" программы приостанавливается, и происходит переход (по вектору прерывания) на начало исполнения подпрограммы прерывания.
Далее, подпрограмма прерываний выполняется по такому же принципу, как и "основная" программа, вплоть до окончания этой подпрограммы.
Вконце подпрограммы прерываний всегда исполняется специальная команда возврата. При этом, из стека извлекается адрес возврата, после чего "основная" программа начинает исполняться далее.
Таким образом, прерывание - это специфический переход, в большинстве случаев, по внешнему воздействию, из "основной" программы, на выполнение подпрограммы прерывания, с последующим возвратом из не в "основную" программу.
ВПИКах имеется несколько источников прерываний.
Для того, чтобы произошло любое из них, сначала нужно установить бит глобального разрешения прерываний GIE (установить в 7-м бите регистра INTCON единицу).
6-й бит (EEIE) разрешает/запрещает прерывания по окончанию цикла записи в EEPROM память данных.
5-й бит (TOIE) разрешает/запрещает прерывания по переполнению TMR0, то есть, если этот вид прерываний разрешен, то уход в подпрограмму прерывания произойдет при смене содержимого TMR0 с FFh на 00h (при переполнении).
4-й бит (INTE) разрешает/запрещает внешнее прерывание по входу RB0/INT.
3-й бит (RBIE) разрешает/запрещает прерывания по изменению уровня сигнала на любом из выводов RB4…RB7 .
Примечание: направление работы выводов портов А и В можно устанавливать в любых комбинациях (см. регистры PORTA и PORTB. О них - ниже).
Те выводы портов, на которые поступают сигналы, инициирующие прерывания, должны работать "на вход".
Это относится к выводам RB0/INT, RB4...RB7 порта В и выводу RA4/TOCKI порта А.
Что касается последнего, то импульсную последовательность, подаваемую на счетный вход TMR0 (вывод RA4/TOCKI), вполне можно считать сигналом прерываний, только косвенно, так как прерывание наступает не по факту подсчета отдельного импульса, а по факту подсчета группы импульсов (переполнение TMR0).
Регистры TRISA и TRISB имеют 5 и 8 рабочих бита соответственно (по количеству выводов портов А и В). Их адреса - 85h и 86h (см. область оперативной памяти).
Распечатки на них нет, но Вы без труда поймете их функции.
Биты регистров TRISA и TRISB управляют направлением работы выводов портов А и В. Если какой-нибудь из этих битов устанавливается в 1, то соответствующий вывод порта работает "на вход", то есть, принимает данные с выхода внешнего устройства, подключенного к этому выводу.
19
Если бит TRISA/TRISB устанавливается в 0, то соответствующий вывод порта уже сам является источником сигнала для подключенного к этому выводу, входа внешнего устройства, и программа может управлять этим внешним устройством (например, светодиодом или каким-то другим исполнительным устройством).
При помощи этих битов, в пределах каждого из портов, можно устанавливать различные комбинации направлений работы их выводов, а также и менять их (направления) в ходе исполнения программы.
Так как регистры TRISA и TRISB находятся в 1-м банке, то, при работе с ними, необходимо перейти в 1-й банк, произвести необходимые изменения битов и вернуться в 0-й банк (если далее работа происходит в нулевом банке).
Регистры PORTA и PORTB (см. распечатку: ниже регистра STATUS) управляют защелками портов А и В.
Количество рабочих битов в них такое же, как и количество выводов портов (5 и 8). Защелка это аппаратно реализованное устройство оперативной памяти, а проще говоря, триггер.
Биты регистров PORTA и PORTB управляют этими триггерами.
Если какой-либо из этих битов установить в 1, то на выходе защелки (а значит и на соответствующем выводе порта, настроенном "на выход") также установится 1 (а для ноля - ноль).
Так как защелки являются триггерами, то перевод их выходов из одного состояния в другое происходит "одномоментно".
Это означает то, что, например, для вывода цифры на 7-сегментный индикатор, в течение определенного программой интервала времени, достаточно одной команды на вывод цифры (байта) в начале этого интервала времени, и одной команды на ее сброс в конце этого интервала времени.
Впромежутке времени между этими двумя командами, программа может выполнять какиелибо другие действия, формируя за счет этих действий данный интервал времени, причем эти действия могут быть напрямую не связанными с работой по выводу цифры в 7-сегментный индикатор (например, может производиться подсчет количества импульсов, операции с регистрами, работа с EEPROM памятью и т.д.).
Следует четко уяснить следующее: биты регистров PORTA и PORTB защелками управляют всегда, но не всегда данные с выходов защелок присутствуют на выводах портов.
Выходы защелок портов подключаются к выводам портов только при работе этих выводов "на выход".
При работе выводов портов на вход, выходы защелок от соответствующих выводов портов отключаются.
Вотличие от выводов порта В, к которым могут быть либо подключены, либо отключены внутренние, подтягивающие резисторы, выводы порта А внутренней "подтяжки" не имеют. Таким образом, если они настроены на работу на вход, то к ним нужно подключать внешние подтягивающие резисторы.
Если нужно организовать счет импульсов (задействован TMR0), то роль подтягивающего резистора для вывода RA4/TOCKI может выполнять, например, коллекторная нагрузка внешнего устройства.
Регистр счетчика команд PC (13 бит) разделен на 2 регистра.
В регистре счетчика команд PC с названием PCL (младший байт счетчика команд PC) находится младшие 8 битов адреса команды.
Остальные 5 битов (старшие) "лежат" в старшем байте счетчика команд PC с названием PCH (3 старших его бита не используются).
Изначально, "понятийновыгодно" представить себе 13-битное слово регистра PC как "неразделимый массив" с одним исключением (о нем - ниже), что (без учета этого исключения) означает: если команды отрабатываются последовательно (без "прыжков") и произошло переполнение PCL (состояние 255 сменилось на состояние 0), то содержимое PCH инкрементируется (увеличивается на 1).
13-разрядное слово позволяет организовать максимальный объем памяти программ до 256х2х2х2х2х2=8192 слов (в тексте программы можно использовать до 8192-х команд). Для 5-битного PCH, это "потолок".
Могут использоваться не все 5 бит, а меньшее их количество. Соответственно, объем памяти программ, в этих случаях, будет меньше.
20