|
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:328
|
|
10-06-2015, 01:39 PM
المشاركة 1
|
|
التعامل مع ذاكرة EEPROM الداخلية وأمثلة على البرمجة بالمترجم CCS C :
يمكن للمستخدم الوصول لذاكرة EEPROM من خلال الدوال التالية ، ضمن المترجم CCS C :
دالة القراءة : وتكون بالصيغة التالية :
كود:
value = read_eeprom (address )
• وظيفة هذه الدالة قراءة read بايت من عنوان address معين بذاكرة EEPROM . يبدأ العنوان من عند الصفر ومداه يعتمد على الميكروكونترولر المستخدم .
• بارامتر "العنوان" address هو عدد صحيح 8 بت أو 16 بت ، يعتمد على الميكروكونترولر المستخدم .
• هذه الدالة عند تنفيذها تعود بعدد صحيح 8 بت (بايت) .
مثال :
كود:
#define LAST_VOLUME 10
volume = read_EEPROM (LAST_VOLUME); //Read byte from address “10”
دالة الكتابة : وتكون بالصيغة التالية :
كود:
write_eeprom (address, value)
• وظيفة هذه الدالة كتابة بايت إلى عنوان محدد بذاكرة EEPROM . هذه الدالة قد تأخذ عدة ملى ثوانى للتنفيذ .
• البارامتر "العنوان" address يكون عدد صحيح 8 بت أو 16 بت بناء على الميكروكونترولر المستخدم ، والبارامتر "القيمة" value يكون عدد صحيح 8 بت .
• هذه الدالة لا تعود بأى شىء عند تنفيذها (كتابة) .
مثال :
كود:
#define LAST_VOLUME 10 // Location in EEPROM
volume++;
write_eeprom(LAST_VOLUME,volume);
//write the byte value in volume variable to address 10 of EEPROM
تدريب : على التعامل مع الذاكرة EEPROM ، واكتساب بعض مهارات تقنيات البرمجة :
كود:
#include <16F877A.h>
#use delay(clock=4000000)
#use rs232(baud=2400,xmit=PIN_C6,rcv=PIN_C7)
void main() {
int i = 0, m;
printf("R(ead or W(rite? \n\r"); m = getc();
//1- Writing
if ((m==87)||(m==119)) // 87 = w OR 119 = W
{
printf("Content? \n\r"); m = getc(); // inter a character , say "A"
do
{
write_EEPROM(i,m);// Write this character to EEPROM locations from address 0 to adress 255 = FF for 16F877A
printf("Writing %X to addr %X\n\r",m,i);// Writing "the character ASCII value in HEX formte" to addr "i in HEX"
} while(++i>0); // Repeat 255 times (end of byte range)
}
//2- Reading
do
{
m = read_EEPROM(i);
printf("Addr = %X Content = %X\n\r",i,m);
} while(++i>0);
while(TRUE);
}
نتيجة المحاكاة ببرنامج Proteus :
كود:
#include <16F877A.h>
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
كود:
printf("R(ead or W(rite? \n\r"); m = getc();
كود:
if ((m==87)||(m==119)) // 87 = w OR 119 = W
{
printf("Content? \n\r"); m = getc();
// Only Press ‘w’ or ‘W’ give :
كود:
do
{
write_EEPROM(i,m);// Write this character to EEPROM locations from address 0 to adress 255 = FF for 16F877A
printf("Writing %X to addr %X\n\r",m,i);// Writing "the character ASCII value in HEX formte" to addr "i in HEX"
} while(++i>0); // Repeat 255 times (end of byte range)
}
Writing ‘A’ to EEPROM address from 0 to 255 , ‘A’ = 0x41
كود:
//2- Reading
do
{
m = read_EEPROM(i);
printf("Addr = %X Content = %X\n\r",i,m);
} while(++i>0);
|