Chapter 6 (Non-Volatile Memory)

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

‫‪DR.

Hesham Gad‬‬

‫الباب السادس )‪CHAPTER (6‬‬

‫الذاكرات الغير متطايرة‬

‫‪D‬‬
‫‪Non-Volatile Memories‬‬

‫‪A‬‬
‫عرفنا فى الباب األول أن الـ ‪ PIC18F452 Microcontroller‬يوجد بداخلها نواعان من‬
‫الذاكرة وهم‪ :‬الذاكرة المتطايرة ‪ Volatile memory‬والتى تمحى محتوياتها بفصل الكهرباء عن‬

‫‪G‬‬
‫الـميكروكنترولر مثل الـ ‪ ،RAM‬حيث تستخدم هذه الذاكرة لتخزين البيانات ‪ Data‬أو المتغيرات‬
‫‪ .Variables‬والذاكرة الدائمة ‪ Non-volatile‬ويوجد منها نوعين وهم الـ ‪Flash memory‬‬

‫‪M‬‬
‫وتستخدم لتخزين البرنامج والـ ‪ EEPROM‬ييستخدم لتخزين فى الـ ‪ Data‬المهمة التى ال تريد مسحها‬
‫عن فصل الكهرباء من الـ ‪ Microcontroller‬مثل الـ ‪ .Password‬ولكن يجب أن تعرف أن الـ‬
‫‪A‬‬
‫‪ Flash memory‬يمكن أن يستخدم لتخزين البيانات المهمة عن طريق البرنامج ولكن هذه الجزئية‬
‫خارج نطاق هذا الباب‪ .‬لذلك فى هذا الباب سوف نتعلم كيفية تخزين البيانات التى نريد الحفاظ عليها‬
‫‪H‬‬
‫فى الـ ‪.EEPROM‬‬
‫‪S‬‬

‫‪6.1-Reading and Writing Data to and from EEPROM‬‬


‫‪E‬‬

‫‪Memory‬‬
‫‪.H‬‬

‫الغالبية العظمى من عائلة الـ ‪ PIC18‬تحتوى على ‪ .EEPROM‬وحجم هذه الذاكرة يتراوح من ‪256‬‬
‫‪ bytes‬إلى أكثر من ‪ .1KB‬وحيث أننا سوف نتعامل مع الـ ‪ ،PIC18F452‬فإننا يجب أن تعرف أن‬
‫حجم الـ ‪ EEPROM‬الموجودة ‪ 256 bytes‬كما هو موضح فى شكل )(‪ .‬وبسبب أن الـ ‪EEPROM‬‬
‫‪R‬‬

‫أبطأ بكثير من الـ ‪ ،RAM‬فإن الـ ‪ CPU‬ال يستطيع التعامل معه بشكل مباشر إال عن طريق مجموعة‬
‫من الـ ‪ Registers‬وهم‪:‬‬
‫‪D‬‬

‫‪ :EEADR register .1‬وهو الـ ‪ Register‬المسئول عن تحديد المكان الذى نريد أن نقرأ أو‬
‫نسجل عليه فى الـ ‪.EERPOM‬‬

‫‪-1-‬‬
‫‪DR. Hesham Gad‬‬

‫‪ :EEDATA register .2‬وهو الـ ‪ Register‬الذى سوف يحتوى على الـ ‪ Data‬التى تريد‬
‫تخزينها أو التى تم قرائتها من الـ ‪.EEPROM‬‬
‫‪ :EECON1 register .3‬يستخدم هذا الـ ‪ Register‬للتحكم بالـ ‪ EEPROM‬والـ ‪Flash‬‬
‫‪ memory‬أيضا‪.‬‬
‫‪ :EECON2 register .4‬هذا الـ ‪ Register‬وهمى (أى أنه ال يوجد فى األساس) ولكن يتم‬

‫‪D‬‬
‫إستخدامه عند التعامل مع كال الذاكرتين )‪.(Flash and EEPROM‬‬

‫‪A‬‬
‫قبل أن يتم البدء فى التعامل مع الـ ‪ EEPROM‬يجب أن نتعرف على أوال الـ ‪EECON1 register‬‬
‫وهو المسئول عن التحكم فى القراءة والكتابة على الـ ‪ EEPROM‬والـ ‪ .Flash memory‬وفيما يلى‬

‫‪G‬‬
‫شرح الـ ‪.EECON1 register‬‬

‫‪M‬‬
‫‪A‬‬
‫‪H‬‬
‫‪S‬‬
‫‪E‬‬
‫‪.H‬‬

‫شكل )‪ :(6-1‬تركيب الـ ‪.EEPROM‬‬


‫‪R‬‬
‫‪D‬‬

‫‪-2-‬‬
‫‪DR. Hesham Gad‬‬

‫‪EECON1 Register‬‬

‫شرح الـ ‪EECON1 Register‬‬

‫‪D‬‬
‫‪EEPGD (Flash program or Data EERPOM memory select) bit:‬‬

‫يستخدم هذا الـ ‪ Bit‬إلختيار هل نريد التعامل مع الـ ‪ Flash memory‬أو ‪ ،EEPROM‬فإذا كانت‬

‫‪A‬‬
‫‪ EEPGD=1‬فهذا يعنى أننا نريد التعامل مع الـ ‪ Flash memory‬وإذا كانت قيمة الـ ‪EEPGD=0‬‬

‫‪G‬‬
‫فهذا يعنى أننا نريد التعامل مع الـ ‪ .EEPROM‬وحيت أننا نريد التعامل فى هذه الجزئية مع الـ‬
‫‪ ،EEPROM‬فإننا سوف نجعل ‪.EEPGD=0‬‬

‫‪M‬‬
‫‪CFGS (Flash Program/Data EE or Configuration Select) bit:‬‬

‫يستخدم هذا الـ ‪ Bit‬إلختيار هل نريد الدخول على الـ ‪ Configuration Registers‬المسئولة عن‬
‫‪A‬‬
‫التحكم فى الـ ‪ Microcontroller‬بشكل عام أو الدخول على كال الذاكرتين ‪(Flash and‬‬
‫)‪ .EEPROM‬فإذا كانت قيمة ‪ CFGS=1‬فهذا يعنى أننا سوف نتعامل مع الـ ‪Configuration‬‬
‫‪H‬‬
‫‪ ،registers‬وإذا كانت الـ ‪ CFGS=0‬فهذا يعنى أننا سوف نتعامل مع الـ ‪ Flash‬أو ‪.EEPROM‬‬
‫‪S‬‬

‫لذلك يجب جعل ‪ CFGS=0‬وذلك لفتح إمكانية التعامل مع كال الذاكرتين‪.‬‬


‫‪E‬‬

‫‪FREE (Flash Row Erase Enable bit) bit:‬‬

‫يستخدم هذا الـ ‪ Bit‬لمسح أجزاء من الـ ‪( Flash memory‬لذلك هذا خارج نطاق الشرح هنا)‪.‬‬
‫‪.H‬‬

‫‪WRERR (Write Error) bit:‬‬

‫يستخدم هذا الـ ‪ Bit‬للتعرف على حدوث خطا أثناء عملية الكتابة على كال الذاكرتين‪ .‬فإذا كانت قيمة‬
‫‪R‬‬

‫هذا ‪ WRERR=1‬فهذا يعنى أن عملية الكتابة ‪ Writing‬على أحدى الذاكرتين لم تتم بشكل جيد (قد‬
‫يحدث نتيجة عمل ‪ Reset‬أو فصل الكهرباء عن الـ ‪ Microcontroller‬أثناء عملية الـ ‪.)Writing‬‬
‫‪D‬‬

‫وإذا كانت قيمة الـ ‪ WRERR=0‬فهذا يعنى أن عملية الكتابة تمت بشكل جيد‪.‬‬

‫‪-3-‬‬
‫‪DR. Hesham Gad‬‬

‫‪WREN (Write Enable) bit:‬‬

‫يستخدم هذا الـ ‪ Bit‬للسماح بإمكانية الكتابة على كال الذاكرتين‪ ،‬فإذا كانت قيمة ‪ WREN=1‬فهذا يعنى‬
‫السماح بإمكانية الكتابة على كال الذاكرتين‪ .‬وإذا كانت قيمة الـ ‪ WREN=0‬فهذا يعنى عدم السماح‬
‫بالكتابة على كال الذاكرتين‪.‬‬

‫‪D‬‬
‫‪WR (Write control) bit:‬‬
‫يستخدم هذا الـ ‪ Bit‬لبدء عملية الـ ‪ Writing‬على كال الذاكرتين‪ .‬لذلك عندما يتم جعل ‪ WR=1‬فهذا‬

‫‪A‬‬
‫يعنى أننا نريد بدء عملية الكتابة ‪ Writing‬على إحدى الذاكرتين‪ .‬وعند إنتهاء عملية الـ ‪،Writing‬‬

‫‪G‬‬
‫فإن هذا الـ ‪ Bit‬يتحول بشكل ألى إلى صفر‪.‬‬

‫‪RD (Read control) bit:‬‬

‫‪M‬‬
‫يستخدم هذا الـ ‪ Bit‬لبدء عملية الـ ‪ Reading‬من كال الذاكرتين‪ .‬لذلك عندما يتم جعل ‪ RD=1‬فهذا‬
‫يعنى أننا نريد بدء عملية الـ ‪ Reading‬من إحدى الذاكرتين‪ .‬وعند إنتهاء عملية الـ ‪ ،Reading‬فإن‬
‫‪A‬‬ ‫هذا الـ ‪ Bit‬يتحول بشكل ألى إلى صفر‪.‬‬

‫‪6.1.1 Writing Data to EEPROM‬‬


‫‪H‬‬
‫)‪Example (6.1‬‬
‫‪S‬‬

‫‪Write a microcontroller program to store the value (44) in location (0) in the‬‬
‫‪E‬‬

‫‪EERPROM memory.‬‬
‫‪.H‬‬

‫‪Solution:‬‬

‫فى هذا المثال يريد تسجيل قيمة ‪ 44‬فى المكان ‪ 0‬بداخل الـ ‪ EEPROM‬لذلك يجب أن يتم عمل‬
‫الخطوات اآلتية‪:‬‬
‫‪R‬‬

‫‪ .1‬يتم تخزين العنوان المطلوب فى الـ ‪.EEADR‬‬


‫‪ .2‬يتم تخزين الـقيمة المطلوبة فى الـ ‪.EEDATA‬‬
‫‪D‬‬

‫‪ .3‬يتم إختيار التعامل مع الـ ‪ EEPROM‬عن طريق (‪ EEPGD=0‬و ‪ )CFGS=0‬مع تفعيل‬


‫خاصية الكتابة على الـ ‪ EEPROM‬عن طريق )‪ (WREN=1‬وهذه الـ ‪ Bits‬موجودة بداخل‬
‫الـ ‪ EECON1 register‬وبذلك سوف تكون قيمة الـ ‪.EECON1=0x04‬‬

‫‪-4-‬‬
‫‪DR. Hesham Gad‬‬

‫‪ .4‬يتم تحميل قيمة ‪ 0x55‬على ‪.EECON2‬‬


‫‪ .5‬ثم يتم تحميل قيمة ‪ 0xAA‬على ‪.EECON2‬‬

‫‪D‬‬
‫‪ .6‬يتم بدأ الـ ‪ Writing‬على الـ ‪ EEPROM‬عن طريق جعل ‪ WR bit=1‬والموجود بداخل‬
‫الـ ‪.EECON1‬‬

‫‪A‬‬
‫‪G‬‬
‫‪ .7‬يتم اإلنتظار حتى تصبح قيمة ‪ WR=0‬وهذا يعنى إنتهاء عملية الكتابة على الـ ‪.EEPROM‬‬

‫‪M‬‬
‫‪A‬‬
‫‪H‬‬
‫‪S‬‬
‫‪E‬‬
‫‪.H‬‬
‫‪R‬‬
‫‪D‬‬

‫‪-5-‬‬
DR. Hesham Gad

Program:

void main()
{
EEADR=0; ‫ وضع العنوان المطلوب‬.1

EEDATA=44; .‫ وضع القيمة المطلوبة‬.2

D
EECON1 ‫ ضبط الـ‬.1
EECON1=0x04;

A
EECON2 ‫ فى الـ‬0X55 ‫ وضع‬.2
EECON2=0X55;
EECON2=0XAA; EECON2 ‫ فى الـ‬0XAA ‫ وضع‬.3

G
EECON1=0X06; .writing ‫ بدء عملية الـ‬.4

.5
while (EECON1.b1==1); .Writing ‫اإلنتظار حتى تنتهى عنلية الـ‬

M
while(1)
{
A
}
H
}
Example (6.2)
S

Write a microcontroller program to store the values (56, 77, 49, 66, 105) in
E

locations (0 to 4) in the EEPROM memory.


.H

Solution:
R
D

-6-
DR. Hesham Gad

D
A
G
M
A
H
Program:
S

void main()
E

{
char i; .‫ إنشاء مخزن للعد‬.1
.H

char x[]={56, 77, 49, 66, 105 }; .‫ تخزين القيم المطلوبة فى عداد‬.2

for(i=0;i<=4;i++)
{
R

EEADR=i; ‫ وضع العنوان المطلوب‬.1

EEDATA=x[i]; .Array ‫ وضع القيمة المطلوبة من‬.2


D

EECON1 ‫ ضبط الـ‬.6


EECON1=0x04;
EECON2 ‫ فى الـ‬0X55 ‫ وضع‬.7
EECON2=0X55;
EECON2=0XAA; EECON2 ‫ فى الـ‬0XAA ‫ وضع‬.8

EECON1=0X06; .writing ‫ بدء عملية الـ‬.9

-7- .10
‫‪DR. Hesham Gad‬‬

‫;)‪while (EECON1.b1==1‬‬ ‫اإلنتظار حتى تنتهى عنلية الـ ‪.Writing‬‬


‫}‬

‫)‪while(1‬‬

‫‪D‬‬
‫{‬

‫‪A‬‬
‫}‬
‫}‬

‫‪G‬‬
‫‪6.1.2-Reading Data From EEPROM‬‬
‫)‪Example (6.3‬‬

‫‪M‬‬
‫‪Write a microcontroller program to read from the location (0x04) in the‬‬
‫‪EEPROM memory and put the result on the LEDs connected to PORTB pins.‬‬
‫‪A‬‬
‫‪Solution:‬‬
‫‪H‬‬
‫فى هذا المثال يريد قراءة القيمة المخزنة فى المخزن الذى عنوانة ‪ 0x04‬فى الـ ‪ EEPROM‬وإخراجها‬
‫على الـ ‪ LEDs‬لذلك يجب أن يتم أن يتم عمل الخطوات اآلتية‪:‬‬
‫‪S‬‬

‫‪ .1‬يتم تخزين العنوان المطلوب فى الـ ‪.EEADR‬‬


‫‪E‬‬

‫‪ .2‬يتم إختيار التعامل مع الـ ‪ EEPROM‬عن طريق (‪ EEPGD=0‬و ‪)CFGS=0‬‬


‫‪.H‬‬

‫‪ .3‬يتم بدء عملية القراءة عن طريق جعل )‪ (RD=1‬والموجودة بداخل الـ ‪EECON1 register‬‬
‫‪R‬‬

‫وبذلك سوف تكون قيمة الـ ‪.EECON1=0x01‬‬


‫‪D‬‬

‫‪ .4‬يتم اإلنتظار حتى تصبح قيمة الـ ‪ RD=0‬وهذا يعنى أنه تم اإلنتهاء من عملية القراءة‪.‬‬

‫‪-8-‬‬
‫‪DR. Hesham Gad‬‬

‫‪ .5‬يتم قراءة القيمة من الـ ‪ EEDATA‬وإخراجها على ‪.LEDs‬‬

‫‪D‬‬
‫‪A‬‬
‫‪G‬‬
‫‪M‬‬
‫‪A‬‬
‫‪Program:‬‬
‫‪H‬‬
‫)(‪void main‬‬
‫{‬
‫‪S‬‬

‫;‪TRISB=0‬‬
‫‪E‬‬

‫;‪PORTB=0‬‬
‫‪.H‬‬

‫;‪EEADR=0x04‬‬ ‫وضع العنوان المطلوب‬

‫)‪while(1‬‬
‫{‬
‫‪R‬‬

‫;‪EECON1=0x01‬‬
‫‪ .1‬ضبط الـ ‪ EECON1‬مع بدء عملية القراءة‪.‬‬
‫;)‪while(EECON1.RD==1‬‬ ‫‪ .2‬يتم اإلنتظار حتى تنتهى عملية القراءة‪.‬‬
‫‪D‬‬

‫;‪PORTB=EEDATA‬‬ ‫‪ .3‬إخراج القيمة على الـ ‪LEDs‬‬

‫}‬
‫}‬

‫‪-9-‬‬

You might also like