Модуль EEPROM памяти данных

 

Принцип работы модуля является обычным для устройств такого типа и выполняется при номинальном напряжении микроконтроллера. Запись информации осуществляется по одному байту по принципу «стирание – запись», т.е. адресуемая ячейка вначале стирается, а потом в нее записывается новая информация. При чтении информация сохраняется. Функции записи/чтения осуществляются через 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, просмотров: 3.