Принцип работы модуля является обычным для устройств такого типа и выполняется при номинальном напряжении микроконтроллера. Запись информации осуществляется по одному байту по принципу «стирание – запись», т.е. адресуемая ячейка вначале стирается, а потом в нее записывается новая информация. При чтении информация сохраняется. Функции записи/чтения осуществляются через 6 регистров специального назначения:
-EEDATA – регистр хранения данных при записи и чтении,
-EEDATH – регистр старшего байта данных (при работе с FLASH – памятью),
-EEADR - регистр адреса ячейки памяти,
-EEADRH – регистр старшего байта адреса (при работе с FLASH – памятью),
-EECON1 - регистр управления модулем,
-EECON2 - вспомогательный регистр для предотвращения случайной записи.
Формат регистра EECON1:
Таблица 32
Номер разряда | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Обозн. разряда | EEPGD | - | - | - | WRERR | WREN | WR | RD |
7 бит: EEPGD – выбор типа памяти: 0 – EEPROM, 1 – FLASH,
3 бит: WRERR – флаг ошибки записи данных: 1 – запись прервана (MCLR, WDT),
2 бит: WREN – разрешение записи: 1 – запись разрешена, 0 – запись запрещена,
1 бит: WR – инициализация записи: 1 – запись производится, сбрасывается в 0 автоматически после окончания записи, 0 – запись завершена, (установка флага EEIF),
0 бит: RD – инициализация чтения: 1 –инициализировать чтение, сбрасывается в 0 по окончанию чтения (установка флага EEIF).
Прерывания.
В микроконтроллерах PIC16F873 (PIC16F876) реализованы 14 источников прерывания. Источниками прерываний могут быть как внутренние устройства (память, функциональные блоки), так и внешние устройства, формирующие сигналы прерывания в виде сигнала INT на входе RB0 или в виде перепада уровня сигналов на входах RB4…RB7. Структурная схема системы прерываний приведена на рис.26 Как видно из схемы, прерывания от всех источников возникают после установки соответствующего флага (сигналы флагов оканчиваются символом F). Установка флага в каждом устройстве производится после готовности устройства к обслуживанию его процессором. Все прерывания могут быть замаскированы (отменены) путем установки в 0 соответствующего сигнала (сигналы маски оканчиваются символом E). Все без исключения прерывания могут быть замаскированы сигналом GIE (установкой его в 0), кроме того прерывания от функциональных модулей могут быть замаскированы сигналом PEIE.
Флаги и маски прерываний хранятся в регистрах INTCON, PIE1, PIR1, PIE2, PIR2. При разработке подпрограмм обслуживания прерываний необходимо помнить, что при переходе на подпрограмму в стеке сохраняется только адрес возврата, поэтому, при необходимости, надо позаботиться о сохранении содержимого некоторых ключевых регистров, например, рабочего регистра W и регистра состояния процессора STATUS.
EEIF EEIE EEPR PSPIF PSPIE Парал |
ADIF ADIE АЦП |
RCIF RCIE ПРМ |
TXIF TXIE ПРД SSPIF SSPIE MSSP CCP1IF CCP1IE CCP1 |
TMR2IF TMR2IE |
TMR1IF TMR1IE |
CCP2IF CCP2IE Конф.I2C BCLIF BCLIE |
TOIF TOIE TMR0 INTF INTE Внеш RBIF RBIE RB4.. |
PEIE |
GIE |
Выход из SLEEP |
Прерывание CPU |
Рис.26. Структурная схема логики прерываний. |
Кнс Кнп |
П1 Р1 Р2 Кн1 Р3 РТ |
Кп |
Кп1 |
+Е |
--Е |
Ав |
Рис. 9. Принципиальная схема логической части блока управления подсистемой СОЖ.
Ав. Кнопка аварийного отключения.
02 03 04 05 06 07 21 22 23 24 25 26 27 28 |
+5v R1 01 |
C1 C2 |
Q1 |
09 10 20 19 08 |
PIC16F873 RA0 MCLR1 RA1 RA2 RA3 RA4 RA5 OSC1 RB0 RB1 OSC2 RB2 RB3 Vdd RB4 RB5 Vss RB6 Vss RB7 |
Кc |
Кп |
+24v R2 Кнп R4 Кнав Кнс R10 Кн1 |
Ав. |
Рис. 10. Принципиальная схема бока управления.
Текст программы.
#define XTAL_FREQ 4MHZ
#define byte unsigned char
#define word unsigned int
#include <pic.h>
#include <stdio.h>
__CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROTECT & PWRTEN);
char shet; // счетчик циклов срабатывания таймера
interrupt isr(void);
Void main()
{
ANSELH = 0; // настройка порта B в цифровой режим
ANSEL =0; // настройка порта А в цифровой режим
TRISB = 0xFF; // настройка порта В вход
TRISA = 0x10;
PEIE=1; // разрешение прерывания от функциональных модулей
GIE=1; // разрешение глобального прерывания
INTE =1; // разрешение прерывания от внешнего источника
for (; !RA0 ;) { //цикл программы работы фрагмента
RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3 RB1&&RA1&&RA4)|| (RB2&&RB3&& RB1&&RA1&&RA0);
}
} // конец main
interrupt isr(void)
{
GIE = 0; //запрет всех прерываний
RA0 = 0; //отключение Кп
RA2 = 1; // Включение аварийной сигнализации
TMR1IF =0; //сброс флага TMR1 - предварительный
T1CON = 0x30; // настройка таймераTMR1
For (shet = 0x00; shet<0x0F; shet ++){
TMR1IF = 0;
TMR1H = 0xFF;
TMR1L = 0xFF; //настройка таймера TMR1 на максимальную задержку
TMR1ON =1; // пуск таймера TMR1
For (; !TMR1IF;) { }
}
RA2 =0; //отключение аварийной сигнализации
INTF =0; //сброс флага внешнего прерывания.
GIE = 1; // восстановление разрешения прерываний
} //выход из прерывания
Сторожевой таймер.
Сторожевой таймер WDT предназначен для повышения надежности работы микроконтроллера. Он работает от внутреннего RC-генератора, поэтому не зависит от работы основной программы. При переполнении сторожевого таймера происходит общий сброс микроконтроллера. Для надежной работы устройства с использованием микроконтроллера необходимо в рабочей программе предусмотреть периодический сброс сторожевого таймера командой CLRWDT, предупредив таким образом непредвиденный общий сброс микроконтроллера. Сторожевой таймер при необходимости может быть включен или выключен установкой бита WDTE (2 бит в слове конфигурации, записанном по адресу 2007h) при программировании микроконтроллера. Для увеличения периода срабатывания сторожевого таймера к его входу может быть подключен предделитель (см. раздел таймер TMR0).
Дата: 2019-04-23, просмотров: 256.