Аппаратные средства микроконтроллеров серии PIC
Структура модуля таймера /счетчика TIMER0 и его взаимосвязь с регистрами TMR0 и OPTION показаны на рис. 5.12. TIMER0 является программируемым модулем и содержит следующие компоненты:
- 8-разрядный таймер /счетчик TMR0 с возможностью чтения и записи как регистр ;
- 8-разрядный программно управляемый предварительный делитель (предделитель);
- мультиплексор входного сигнала для выбора внутреннего или внешнего тактового сигнала ;
- схему выбора фронта внешнего тактового сигнала ;
- формирователь запроса прерывания по переполнению регистра TMR0 с FFh до 00h .
Режим таймера выбирается путем сбрасывания в ноль бита T0CS регистра OPTION <5> . В режиме таймера TMR0 инкрементируется каждый командный цикл (без пределителя). После записи информации в TMR0 инкрементирование его начнется после двух командных циклов. Это происходит со всеми командами, которые производят запись или чтение-модификацию-запись TMR0 (например, MOVF TMR0 , CLRF TMR0 ). Избежать этого можно при помощи записи в TMR0 скорректированного значения. Если TMR0 нужно проверить на равенство нулю без останова счета, следует использовать инструкцию MOVF TMR0,W .
Режим счетчика выбирается путем установки в единицу бита T0CS регистра OPTION<5> . В этом режиме регистр TMR0 будет инкрементироваться либо нарастающим, либо спадающим фронтом на выводе RA4/T0CKI от внешних событий. Направление фронта определяется управляющим битом T0SE в регистре OPTION<4> . При T0SE = 0 будет выбран нарастающий фронт.
Предделитель может использоваться или совместно с TMR0 , или со сторожевым ( Watchdog ) таймером . Вариант подключения делителя контролируется битом PSA регистра OPTION<3> . При PSA =0 делитель будет подсоединен к TMR0 . Содержимое делителя программе недоступно. Коэффициент деления пределителя программируется битами PS2…PS0 регистра OPTION<2:0> .
Прерывание по TMR0 вырабатывается тогда, когда происходит переполнение регистра таймера /счетчика при переходе от FFh к 00h . Тогда устанавливается бит запроса T0IF в регистре INTCON<2> . Данное прерывание можно замаскировать битом T0IE в регистре INTCON<5> . Бит запроса T0IF должен быть сброшен программно при обработке прерывания . Прерывание по TMR0 не может вывести процессор из режима SLEEP потому, что таймер в этом режиме не функционирует.
При PSA =1 делитель будет подсоединен к сторожевому таймеру как постделитель (делитель на выходе). Возможные варианты использования пределителя показаны на рис. 5.13.
При использовании пределителя совместно с TMR0 , все команды, изменяющие содержимое TMR0 , обнуляют предделитель. Если предделитель используется совместно с WDT , команда CLRWDT обнуляет содержимое пределителя вместе с WDT .
При использовании модуля TIMER0 в режиме счетчика внешних событий необходимо учитывать то, что внешний тактовый сигнал синхронизируется внутренней частотой Fosc. Это приводит к появлению задержки во времени фактического инкрементирования содержимого TMR0 .
Синхронизация происходит по окончании 2-го и 4-го тактов работы МК, поэтому, если предделитель не используется, то для фиксации входного события необходимо, чтобы длительности высокого и низкого состояний сигнала на входе RA4/T0CKI были бы не менее 2 периодов тактовой частоты Tosc плюс некоторая задержка (
Если модуль TIMER0 используется совместно с пределителем, то частота входного сигнала делится асинхронным счетчиком так, что сигнал на выходе пределителя становится симметричным. При этом необходимо, чтобы длительности высокого и низкого уровней сигнала на входе RA4/T0CKI были бы не менее 10 нс. Синхронизация сигнала происходит на выходе пределителя, поэтому существует небольшая задержка между фронтом внешнего сигнала и временем фактического инкремента таймера /счетчика. Эта задержка находится в диапазоне от 3 до 7 периодов колебаний тактового генератора . Таким образом, измерение интервала между событиями будет выполнено с точностью .
5.2.11. Память данных в РПЗУ (EEPROM)Микроконтроллеры подгруппы PIC16F8X имеют энергонезависимую память данных 64х8 EEPROM бит, которая допускает запись и чтение во время нормальной работы (во всем диапазоне питающих напряжений). Эта память не принадлежит области регистровой памяти ОЗУ. Доступ к ней осуществляется посредством косвенной адресации через регистры специальных функций: EEDATA <08h> , который содержит 8-битовые данные для чтения/записи и EEADR <09h> , включающий адрес ячейки, к которой идет обращение. Для управления процессом чтения/записи используются два регистра : EECON1 <88h> и EECON2 <89h> .
При записи байта автоматически стирается предыдущее значение, и записываются новые данные (стирание перед записью). Все эти операции производит встроенный автомат записи EEPROM . Содержимое ячеек этой памяти при выключении питания сохраняется.
Регистр EEADR может адресовать до 256 байт данных EEPROM . В МК подгруппы PIC16F8X используются только первые 64 байта, адресуемые шестью младшими битами EEADR<5:0> . Однако старшие два бита также декодируются. Поэтому эти два бита должны быть установлены в ‘0’, чтобы адрес попал в доступные 64 бита адресного пространства.
Назначение бит регистра EECON1 приведено в табл. 5.6.
Бит 4: EEIF : бит запроса прерывания по записи в EEPROM
0 = операция записи не завершена или не начиналась
1 = операция записи завершена (должен быть сброшен программно)
Бит 3: WRERR : бит признака ошибки записи в EEPROM
0 = операция записи завершена
1 = операция записи прервана преждевременно (сбросом по /MCLR или сбросом от WDT )
Бит 2: WREN : бит разрешения записи в EEPROM
0 = запрещена запись в EEPROM
1 = разрешены циклы записи
Бит 1: WR : бит управления записью
0 = цикл записи данных в EEPROM завершен
1 = инициирует цикл записи (сбрасывается аппаратно по завершении записи. Бит WR может быть только установлен (но не сброшен) программно)
Бит 0: RD : бит управления чтением
0 = чтение данных EEPROM не инициировано
1 = инициирует чтение данных EEPROM (чтение занимает один цикл. Бит RD сбрасывается аппаратно. Бит RD может быть только установлен (но не сброшен) программно)
Регистр EECON2 не является физическим регистром . Он используется исключительно при организации записи данных в EEPROM . Чтение регистра EECON2 дает нули.
При считывании данных из памяти EEPROM необходимо записать нужный адрес в EEADR регистр и затем установить бит RD EECON1<0> в единицу. Данные появятся в следующем командном цикле в регистре EEDATA и могут быть прочитаны. Данные в регистре EEDATA фиксируются.
При записи в память EEPROM необходимо сначала записать адрес в EEADR- регистр и данные в EEDATA - регистр . Затем следует выполнить специальную последовательность команд, производящую непосредственную запись:
Во время выполнения этого участка программы все прерывания должны быть запрещены, для точного выполнения временной диаграммы. Время записи – примерно 10 мс. Фактическое время записи может изменяться в зависимости от напряжения, температуры и индивидуальных свойств кристалла. В конце записи бит WR автоматически обнуляется, а флаг завершения записи EEIF , он же запрос на прерывание , устанавливается.
Для предотвращения случайных записей в память данных предусмотрен специальный бит WREN в регистре EECON1 . Рекомендуется держать бит WREN выключенным, кроме тех случаев, когда нужно обновить память данных . Более того, кодовые сегменты, которые устанавливают бит WREN , и те, которые выполняют запись, следует хранить на различных адресах, чтобы избежать случайного выполнения их обоих при сбое программы.
5.2.12. Организация прерыванийМК подгруппы PIC16F8X имеют четыре источника прерываний :
- внешнее прерывание с вывода RB0/INT ;
- прерывание от переполнения счетчика/ таймера TMR0 ;
- прерывание от изменения сигналов на линиях порта RB<7:4> ;
- прерывание по окончании записи данных в EEPROM .
Все прерывания имеют один и тот же вектор/адрес – 0004h . Однако в управляющем регистре прерываний INTCON соответствующим битом-признаком записывается, от какого именно источника поступил запрос прерывания . Исключение составляет прерывание по завершении записи в EEPROM , признак которого находится в регистре EECON1 .
Бит общего разрешения/запрещения прерывания GIE ( INTCON <7> ) разрешает (если = 1) все индивидуально незамаскированные прерывания или запрещает их (если = 0). Каждое прерывание в отдельности может быть дополнительно разрешено/запрещено установкой/сбросом соответствующего бита в регистре INTCON .
Бит GIE при сбросе обнуляется. Когда начинает обрабатываться прерывание , бит GIE обнуляется, чтобы запретить дальнейшие прерывания , адрес возврата посылается в стек, а в программный счетчик загружается адрес 0004h . Время реакции на прерывание для внешних событий, таких как прерывание от ножки INT или порта B , составляет приблизительно пять циклов. Это на один цикл меньше, чем для внутренних событий, таких как прерывание по переполнению от таймера TMR0 . Время реакции всегда одинаковое.
В подпрограмме обработки прерывания источник прерывания может быть определен по соответствующему биту в регистре признаков. Этот флаг-признак должен быть программно сброшен внутри подпрограммы. Признаки запросов прерываний не зависят от соответствующих маскирующих битов и бита общего маскирования GIE .
Команда возврата из прерывания RETFIE завершает прерывающую подпрограмму и устанавливает бит GIE , чтобы опять разрешить прерывания .
Логика прерываний контроллера изображена на рис. 5.14.
Внешнее прерывание на ножке RB0/INT осуществляется по фронту: либо по нарастающему (если в регистре OPTION бит INTEDG=1 ), либо по спадающему (если INTEDG=0 ). Когда фронт обнаруживается на ножке INT , бит запроса INTF устанавливается в единицу ( INTCON <1> ). Это прерывание может быть замаскировано сбросом управляющего бита INTE в ноль ( INTCON <4> ). Бит запроса INTF необходимо очистить прерывающей программой перед тем, как опять разрешить это прерывание . Прерывание INT может вывести процессор из режима SLEEP , если перед входом в этот режим бит INTE был установлен в единицу. Состояние бита GIE также определяет, будет ли процессор переходить на подпрограмму прерывания после выхода из режима SLEEP .
Переполнение счетчика TMR0 ( FFh->00h ) устанавливает в единицу бит запроса T0IF ( INTCON<2> ). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски T0IE ( INTCON<5> ). Сброс запроса T0IF – дело программы обработки.
Любое изменение сигнала на одном из четырех входов порта RB<7:4> устанавливает в единицу бит RBIF ( INTCON<0> ). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски RBIE ( INTCON<3> ). Сброс запроса RBIF – дело программы обработки.
Признак запроса прерывания по завершении записи в EEPROM , EEIF ( EECON1<4> ) устанавливается в единицу по окончании автоматической записи данных в EEPROM . Это прерывание может быть замаскировано сбросом бита EEIE ( INTCON<6> ). Сброс запроса EEIF – дело программы обработки.