قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 01-07-2017, 11:17 PM المشاركة 1   
افتراضي التعامل مع ذاكرة EEPROM الداخلية Twitter FaceBook Google+



التعامل مع ذاكرة EEPROM الداخلية :
ذاكرة EEPROM الموجودة داخل الميكروكونترولر هى ذاكرة يمكن برمجتها ومسحها كهربائيا ، وهى ذاكرة غير متطايرة ، أى أنه عند فصل القدرة عن الميكروكونترولر فإن المعلومات الموجودة بداخلها لا يتم فقدها . ذاكرة EEPROM صغيرة نسبيا وتستخدم لتخزين معلومات المبرمج مثل إعدادات وبيانات المتغيرات التى لا ينبغى فقدها . تختلف سعة الذاكرة من ميكروكونترولر لآخر إعتمادا على نوعه .
تعامل مترجم الميكروسى مع هذه الذاكرة يتم من خلال مكتبة تسمى EEPROM وبها دالتين ، لقراءة بيانات محفوظة فى عنوان وكتابة بيانات على عنوان من هذه الذاكرة .

دالة القراءة من ذاكرة EEPROM :

كود:
// for PIC16
unsigned short EEPROM_Read(unsigned short address); 
// for PIC18
unsigned short EEPROM_Read(unsigned int address);

• تستخدم هذه الدالة لقراءة وإرجاع البيانات من عنوان محدد بالبارامتر address . البارامتر address يعتمد على الميكروكونترولر ، من أجل العائلة PIC16 يكون من النوع short ( الذاكرة لا تتعدى 256 بايت) ، ومن أجل العائلة PIC18 يكون من النوع int ( الذاكرة تتعدى 256 بايت ) .
• هذه الدالة تعود ببايت byte من العنوان address المحدد .
• هذه الدالة تتطلب وجود موديول EEPROM داخلى .
• يجب ضمان تأخير لا يقل عن 20ms بين الاستخدام المتعاقب لدالة الكتابة ودالة القراءة . فعلى الرغم من أن الميكروكونترولر سوف يكتب القيمة الصحيحة من خلال دالة الكتابة ، إلا أن دالة القراءة قد تعود بنتائج غير محددة .
ملاحظة : العناوين فى المدى من 0x00 إلى 0xFF من أجل الأجهزة التى بها 256 بايت ، فى حين يكون فى المدى من 0x00 إلى 0x7F من أجل الأجهزة التى بها 128 بايت .

مثال :

كود:
unsigned short take;
...
take = EEPROM_Read(0x3F);
دالة الكتابة إلى ذاكرة EEPROM :

كود:
  // for PIC16
void EEPROM_Write(unsigned short address, unsigned short data); 
// for PIC18
void EEPROM_Write(unsigned int address, unsigned short data);
• تستخدم هذه الدالة فى كتابة البيانات data إلى العنوان address . البارامتر address يعتمد الميكروكونترولر . كن حذرا حيث أن جميع المقاطعات سوف يتم تعطيلها خلال تنفيذ دالة الكتابة ( مسح بت عموم المقاطعة GIE بالسجل INTCON ) . سوف تقوم الدالة باسترجاع الحالة السابقة لهذه البت عند انتهائها .
• هذه الدالة لا تعود بأى بيانات .
• هذه الدالة تتطلب وجود موديول EEPROM داخلى .
• يجب ضمان تأخير لا يقل عن 20ms بين الاستخدام المتعاقب لدالة الكتابة ودالة القراءة . فعلى الرغم من أن الميكروكونترولر سوف يكتب القيمة الصحيحة من خلال دالة الكتابة ، إلا أن دالة القراءة قد تعود بنتائج غير محددة .
مثال :

كود:
EEPROM_Write(0x32, 19);

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً khamis54 ( شكر العضو على هذه المشاركة )
اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 01-07-2017, 11:34 PM المشاركة 2   
افتراضي


تدريب تمهيدى 1 :

كود:
unsigned short data = 0xAA, address=0x00;

void main() {
PORTB = 0x00;
TRISB = 0x00;

//writes 0xAA into the location 0x00
EEprom_Write(address,data); 

//insert 20 or 30 ms delay between every read and write cycle
Delay_ms(20);

// the following delay is just for making a feel
Delay_ms(1000); 

//reads the data from 0x00 and send it to PORTB
PORTB = Eeprom_Read(address); 
Delay_ms(1000);
تدريب تمهيدى 2 :
للفهم الصحيح لعمل هذه المكتبة راقب وحلل كود المصدر للبرنامج التالى :

كود:
void main (void)
{
	// Configure ports.
	TRISB = 0;
	PORTB = 0;
	while (1) // infinite loop.
	{
		// Displays the value on port B 
		// From address 0 of the EEPROM.
		PORTB =EEPROM_Read (0);
		// The if statement evaluates if the button is pressed.
		if (! PORTC.F0)
		{
			// Increase the value of port B.
			PORTB ++;
			// Store the new port value
			// At address 0 of the EERPOM.
			EEPROM_Write (0, PORTB);
			// Wait up to release.
			while (! PORTC.F0);
		}
	}
}
لمحاكاة هذا البرنامج يتم جلب العناصر التالية لبرنامج ISIS :
لمحاكاة هذا البرنامج يتم جلب العناصر التالية لبرنامج ISIS :
16F877A, IC, LED-RED, BUTTON .

الدائرة الكهربية :



عند المحاكاة : تبين الليدات القيمة الموجودة بالعنوان صفر address 0 للذاكرة EEPROM هذه القيمة يتم تزايدها فى كل مرة تقوم فيها بالضغط على المفتاح الضاغط ويتم تحديث الذاكرة EEPROM بها بعملية كتابة على العنوان صفر .
خلال المحاكاة يمكنك التوقف وهذا يعطل الطاقة ، وعند تشغيل المحاكاة مرة أخرى يمكنك أن ترى نفس قيمة المعلومات التى تم حفظها .

تدريب تمهيدى 3 : مثال مكتبة EEPROM

كود:
char ii;                                 // loop variable

void main(){
  
  PORTB = 0;
  PORTC = 0;
  PORTD = 0;

  TRISB = 0;
  TRISC = 0;
  TRISD = 0;
   
  for(ii = 0; ii < 32; ii++)             		// Fill data buffer
    EEPROM_Write(0x80+ii, ii);          	 // Write data ii to address 0x80+ii

  EEPROM_Write(0x02,0xAA);              	 // Write some data 0xAA at address 0x02
  EEPROM_Write(0x50,0x55);               	// Write some data 0x55 at address 0x50

  Delay_ms(1000);                        		// Blink PORTB and PORTC LEDs
  PORTB = 0xFF;                          		//   to indicate reading start
  PORTC = 0xFF;
  Delay_ms(1000);
  PORTB = 0x00;
  PORTC = 0x00;
  Delay_ms(1000);

  PORTB = EEPROM_Read(0x02);            // Read data from address 2 and display it on PORTB
  PORTC = EEPROM_Read(0x50);      // Read data from address 0x50 and display it on PORTC

  Delay_ms(1000);

  for(ii = 0; ii < 32; ii++) {           // Read 32 bytes block from address 0x80
    PORTD = EEPROM_Read(0x80+ii);        //   and display data on PORTD
    Delay_ms(250);
    }
}
تدريب تمهيدى 4 :
فى هذا التدريب نقوم بكتابة (00000001) إلى أول موقع ذاكرة EEPROM ، و (00000010) إلى ثانى موقع و (00000100) إلى ثالث موقع وهكذا على التتابع حتى (10000000) ، ثم بعد ذلك يتم القراءة المتتابغة لمحتويات هذه المواقع وإخراجها إلى المنفذ PORTC .


كود:
void main() 
{
   unsigned int a, i;
   TRISC  = 0;
   do
   {
      for(i=0,a=1;i<8;i++)
      {
        EEPROM_Write(i, a);
        a = a<<1;
      }
      
      for(i=0;i<8;i++)
      {
         PORTC = EEPROM_Read(i);
         Delay_ms(1000);
      }
   }while(1);
}

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 02-07-2017, 11:11 AM المشاركة 3   
افتراضي


تدريب :
المرجع : http://embedded-lab.com/blog/lab-13-...ternal-eeprom/
فى هذا التدريب سوف نستعرض كيفية تنفيذ عمليات القراءة من والكتابة إلى الذاكرة الداخلية للميكروكونترولر PIC16F628A ، والذى يمتلك 128 بايت من ذاكرة البيانات نوع EEPROM بعناوين فى المدى من 00h إلى 7Fh .

الدائرة الكهربية :



البرنامج :
سوف نكتب برنامج لتطبيق صغير من أجل الميكروكونترولر PIC16F628A والذى يقوم بعمليات القراءة Read والكتابة Write والمسح Delete لمواقع ذاكرة EEPROM المختارة ( 00h إلى 0Fh ) .
• عند الضغط على المفتاح Read ، يتم قراءة معلومات 16 بايت المخزنة عند المواقع (العناوين) 00h-0Fh وعرضها على شاشة LCD .
• عند الضغط على المفتاح Write سوف يتم كتابة السلسلة ‘Embedded-Lab.com’ إلى هذه المواقع .
• عند الضغط على المفتاح Delete يتم استبدال القيم الموجودة فى هذه المواقع بأصفار .
ملحوظة :
القيم الافتراضية فى مواقع ذاكرة EEPROM ممسوحة erased تكون كلها FFh (255) . عند عرض هذه القيم على شاشة LCD تجعل جميع نقط الشاشة فعالة . ولذلك ، عندما تقرأ ذاكرة EEPROM لأول مرة ، حيث تكون فى حالة المسح ، سوف تقراء جميهعا FFh كما هو موضح بالشكل أدناه .





بمجرد أن تتم عملية الكتابة ، قم بفصل القدرة لعدة ثوانى ، ثم قم بإعادة توصيل القدرة مرة أخرى ، واضغط على مفتاح القراءة ، سوف ترى السلسلة Embedded-Lab.com ما زالت محفوظة داخل ذاكرة EEPROM .

كود:
/* Project name:
     Use of internal EEPROM for storing information
 * Copyright:
     (c) Rajendra Bhatt, 2011.
 * Description:
     This code demonstrates how to perform basic Read and Write operations
     with the internal EEPROM of PIC16F628A.
     MCU:             PIC16F628A
     Oscillator:      XT, 4.0 MHz
*/
// LCD connections definitions
sbit LCD_RS at RA0_bit;
sbit LCD_EN at RA1_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISA0_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD connections definitions

// Other connections
sbit SW1 at RB0_bit;
sbit SW2 at RB1_bit;
sbit SW3 at RB2_bit;
/*
// String array to store 3 digit access code
char message1[] = "1.READ";
char message2[] = "2.WRITE";
char message3[] = "3.Delete";
char message4[] = "WRITE COMPLETED";
char message5[] = "Read Data";
char message6[] = "Data Deleted";
*/
char message7[] = "Embedded-Lab.com";
char Edata[] = "0000000000000000";
unsigned short  i ;
unsigned int ADD; // Start EEPROM Location
char temp;
void Delay2s(){
 Delay_ms(2000);
}

void Debounce(){
 Delay_ms(100);
}

void main() {
 PORTB = 0;
 PORTA = 0;
 TRISB = 0b00001111;
 TRISA = 0b00100000;
 CMCON=0x07;
 Lcd_Init();                        // Initialize LCD
 Lcd_Cmd(_LCD_CLEAR);               // Clear LCD
 Lcd_Cmd(_LCD_CURSOR_OFF);          // Turn cursor off
 Lcd_Out(1, 1, "Lab 13: Testing");
 Lcd_Out(2, 1, "internal EEPROM");
 Delay2s();
//=========================================
 start:
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Out(1,1, "1.READ");             // Write message1 in 1st row
 Lcd_Out(1,8, "2.WRITE");
 Lcd_Out(2,1, "3.Delete");
 do{

  // Read Operation
  if (!SW1) {
      Debounce();
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Out(1,1, "Read Data");
      ADD = 0;
      for (i=0; i<16; i++) {
       temp = EEPROM_Read(ADD+i);
       Edata[i] = temp;
      }
      Lcd_Out(2,1,Edata);
      Delay2s();
      goto start;
   }
  // Write Operation
  if (!SW2) {
      Debounce();
      ADD = 0;
      for (i=0; i<16; i++) {
      temp = message7[i];
      EEPROM_Write(ADD+i,temp);
      }
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Out(1,1, WRITE COMPLETED");
      Delay2s();
      goto start;
   }

  // Delete Operation
  if (!SW3) {
      Debounce();
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Out(1,1, "Data Deleted");
      for (i=0; i<16; i++) {
      temp = '0';
      EEPROM_Write(ADD+i, temp);
      }
      Delay2s() ;
      goto start;
   }
 
 
 } while(1);
 
}

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 02-07-2017, 12:48 PM المشاركة 4   
افتراضي


مشروع قفل باب رقمى باستخدام الميكروكونترولر PIC16F877A :

الغرض :
تطبيق على استخدام شاشة LCD و لوحة المفاتيح Keypad وذاكرة EEPROM الداخلية .

الدائرة الكهربية :



الوصف :
• لايوجد كلمة سر Password افتراضية ، ويوجد داخل البرنامج كلمة سر رئيسية master password وهى فى هذه الحالة (23456) ، على سبيل المثال ويمكن تغيرها وتغيير عدد الحروف من داخل البرنامج .
• فى بداية التشغيل يطلب منك الضغط على الزر * ، بعد الضغط على هذا الزر سوف يطلب منك إدخال كلمة السر ، عندئذ ينبغى عليك أن تقوم بإدخال كلمة السر الرئيسية متبوعة بالضغط على الزر # ، الذى يقوم مقام زر الإدخال Enter ، سوف تظهر لك رسالة تفيد إدخال رقم سرى جديد ، عندئذ يمكنك كتابة الرقم السرى الذى ترغب فيه ، بكتابة أربع أرقام و / أو حروف المتوفرة فى لوحة المفاتيح ثم الضغط على الزر # .
• إذا حدث خطأ فى كتابة رقم يمكنك إعادة الكتابة من جديد بالضغط على الزر * ليبدأ من جديد .
• بعد تحديد كلمة السر الجديدة يمكنك فتح وغلق الباب بإدخال الأربع أرقام ثم الضغط على الز # .
• يمكنك تغيير كلمة السر فى أى وقت بإدخال كلمة السر الرئيسية .
• كلمة السر سوف تظل محفوظة داخل ذاكرة EEPROM حتى بعد غياب القدرة .
• عند إدخال كلمة سر غير صالحة ، تظهر لك رسالة عدم السماح ACCESS DENIED .
• إذا تكرر إدخال كلمة سر غير صالحة لثلاثة محاولات ، عندئذ يعمل الإنذار وتظهر رسالة تحذير . بعد ذلك تنطلق إشارة التحذير عند كل محاولة غير صحيحة .



كود:
 // Keypad module connections
char keypadPort at PORTD;
// End Keypad module connections
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection
//================================
unsigned short kp,i=0,cnt,j=0;
char input_PW[10] ,user_PW[4];
//================================
char msg1[] = ".. PROTECTED ..",msg2[] = "ENTER PASSWORD";
char msg3[] = "ACCESS GRANETED",msg4[] = "ACCESS DENIED";
char msg5[] = "Enter New Code",msg6[] = "**Done**" ;
char msg7[] = " **WELCOME** " , msg8[] = " * WARNING * ";
//======================================================
 void Move_Delay() {                  // Function used for text moving
  Delay_ms(500);                     // change text moving speed here
}
//===============
void code_enter()
{
kp = 0; // Reset key code variable
        // Wait for key to be pressed and released
do
   kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);
        // Prepare value for output, transform key to it's ASCII value
switch (kp)
  {
    case 1: kp = 49; break; // 1
    case 2: kp = 50; break; // 2
    case 3: kp = 51; break; // 3
    case 5: kp = 52; break; // 4
    case 6: kp = 53; break; // 5
    case 7: kp = 54; break; // 6
    case 9: kp = 55; break; // 7
    case 10: kp = 56; break; // 8
    case 11: kp = 57; break; // 9
    case  4: kp = 65; break; // A
    case  8: kp = 66; break; // B
    case 12: kp = 67; break; // C
    case 16: kp = 68; break; // D
    case 13: kp = 42; break; // *
    case 14: kp = 48; break; // 0
    case 15: kp = 35; break; // #
  }
input_PW[i] = kp;
Lcd_Chr(2, i+6, input_PW[i]);  // Print key ASCII value on Lcd
i++;
}
//======================================
void delay_20ms()
{
Delay_ms(20);
}
//=========================================
void code_read()    //Read data from EEPROM
{
  user_PW[0] = EEPROM_Read(0x00);// Read data from address 0
  delay_20ms();
  user_PW[1] = EEPROM_Read(0x01);// Read data from address 1
  delay_20ms();
  user_PW[2] = EEPROM_Read(0x02);// Read data from address 2
  delay_20ms();
  user_PW[3] = EEPROM_Read(0x03);// Read data from address 3
  delay_20ms();
}
//===============================================
void code_write()    //Write data from EEPROM
{
  EEPROM_Write(0x00,input_PW[0]);// Write some data to address 0
  delay_20ms();
  EEPROM_Write(0x01,input_PW[1]);// Write some data to address 1
  delay_20ms();
  EEPROM_Write(0x02,input_PW[2]);// Write some data to address 2
  delay_20ms();
  EEPROM_Write(0x03,input_PW[3]);// Write some data to address 3
  delay_20ms();
}
//================================================
void change_code()
{ loop:
	Lcd_Cmd(_LCD_CLEAR);
	Lcd_Out(1,2, "NEW PASSWORD");
	Delay_ms(500);
	i=0;
	code_enter();//get input_PW[0]
	if(input_PW[0] == 42)//test input_PW[0] if * return to loop .
	{goto loop ;}
	code_enter();//get input_PW[1]
	if(input_PW[1] == 42)//test input_PW[1] if * return to loop .
	{goto loop ;}
	code_enter();
	if(input_PW[2] == 42)//test input_PW[2] if * return to loop .
	{goto loop ;}
	code_enter();
	if(input_PW[3] == 42)//test input_PW[3] if * return to loop .
	{goto loop ;}
	code_enter();
	if(input_PW[4] == 42)//test input_PW[4] if * return to loop .
	{goto loop ;}

	if(input_PW[4] == 35){ //if # then
		code_write();//write input_PW[] to EEPROM from address 0 to 3
		code_read();// read EEPROM from address 0 to 3 , save at user_PW[0] t0 user_PW[3]
		Delay_ms(500);
		Lcd_Out(2,5,msg6);//"**Done**"
		Delay_ms(2000);
		}
	else {
	Lcd_Cmd(_LCD_CLEAR);
	Lcd_Out(1,7, "ERROR");
	Delay_ms(1000); }
}
//======================================

void main()
{
  ADCON1 = 0x07;   // Configure AN pins as digital
  TRISA = 0x00;     // set direction to be output
  Keypad_Init();    // Initialize Keypad
  Lcd_Init();       // Initialize Lcd
  //=========================================================
  code_read();//Read EEPROM to user_PW[0] to user_PW[3]
  //===========
  //Initially all EEPROM locatins has 0xFF value
  if(user_PW[0] == 0xFF && user_PW[1] == 0xFF && user_PW[2] == 0xFF && user_PW[3] == 0xFF )
  {
  EEPROM_Write(0x00,'1');// Write some data at address 00
  delay_20ms();
  EEPROM_Write(0x01,'2');// Write some data at address 01
  delay_20ms();
  EEPROM_Write(0x02,'3');// Write some data at address 02
  delay_20ms();
  EEPROM_Write(0x03,'4');// Write some data at address 03
 }
 //=========================================================
 code_read();
 //===========
 Lcd_Cmd(_LCD_CLEAR);      // Clear display
 Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
 Delay_ms(500);
 Lcd_Out(1, 2,msg1 );//".. PROTECTED .."
 Delay_ms(2000);
 Lcd_Cmd(_LCD_CLEAR);      // Clear display
 //======================================
 cnt=0; // numbers of attempts
 //=====
 do
 { begin:
	PORTA.B0=1;//indication led on
	PORTA.B1=0; // lock off
	PORTA.B2=0; // alarm off
	Lcd_Cmd(_LCD_CLEAR);
	Lcd_Out(2, 4, " PRESS '*'");
	//========================
	i = 0;//before start of code enter
   code_enter();//press * to get input_PW[0]=42

   if(input_PW[0] == 42)// *
	{   start:
		Lcd_Cmd(_LCD_CLEAR);  // Clear display
		Lcd_Out(1, 2, msg2);//"ENTER PASSWORD"

     	i = 0;//before start of code enter
		code_enter();//get input_PW[0] ,  if you press * you will begin from start
		if(input_PW[0] == 42)//*
			{goto start ;}

		code_enter();//get input_PW[1]
		if(input_PW[1] == 42)
			{goto start ;}

		code_enter();//get input_PW[2]
		if(input_PW[2] == 42)
			{goto start ;}

		code_enter();//get input_PW[3]
		if(input_PW[3] == 42)
			{goto start ;}

		code_enter();//get input_PW[4]
		if(input_PW[4] == 42)
			{goto start ;}
	//=====================================
     // If you want to change Master Key, add your numbers to '2' '3' '4' '5' '6'
		if(input_PW[0] == '2' && input_PW[1] == '3' && input_PW[2] == '4' && input_PW[3] == '5' && input_PW[4] == '6')          //check master code
		{
			code_enter();//get input_PW[5]
			if(input_PW[5] == 35)//#
			{
				change_code();
				goto begin ;
			}
		}
		//=======================================
		if(cnt<3 && input_PW[0] == user_PW[0] && input_PW[1] == user_PW[1] && input_PW[2] == user_PW
		[2] && input_PW[3] == user_PW[3] && input_PW[4] == 35) //compare code with store one
		{
			Lcd_Cmd(_LCD_CLEAR);   // Clear display
			Lcd_Out(1, 2, msg3);//"ACCESS GRANETED"
			Lcd_Out(2, 2, msg7);//" **WELCOME** "
			cnt=0;
			PORTA.B0=0;//indication led off
			PORTA.B1=1; //  open
			Delay_ms(3000);
			Lcd_Cmd(_LCD_CLEAR);
			Lcd_Out(2, 2, msg7);//" **WELCOME** "
                                          //Moving text
			for(i=0; i<4; i++) {               // Move text to the right 4 times
				Lcd_Cmd(_LCD_SHIFT_RIGHT);
				Move_Delay();}
			Delay_ms(500);
			for(i=0; i<8; i++) {               // Move text to the right 8 times
				Lcd_Cmd(_LCD_SHIFT_LEFT);
				Move_Delay();}
				Delay_ms(500);
			for(i=0; i<4; i++) {               // Move text to the right 4 times
				Lcd_Cmd(_LCD_SHIFT_RIGHT);
				Move_Delay();}
			Delay_ms(5000);    // Lock reactivate Time
			PORTA.B1=0;//close
			Lcd_Cmd(_LCD_CLEAR);
			Delay_ms(500);
			Lcd_Out(1,2,msg1);//".. PROTECTED .."
			Delay_ms(3000);
			Lcd_Cmd(_LCD_CLEAR);
		}

		else
		{
			cnt++;
			Lcd_Cmd(_LCD_CLEAR);
			Lcd_Out(1, 3,msg4 );//"ACCESS DENIED"
			Delay_ms(2000);
		}

		if(cnt>=3)
		{
			do
			{
				PORTA.B0=0;// led off
				PORTA.B2=1;//alarm on

				while(j<3) {		//repeat blink  3 times
					Lcd_Cmd(_LCD_CLEAR);
					Delay_ms(500);
					Lcd_Out(1, 3, msg8 );//" * WARNING * "
					Delay_ms(1000);
					Lcd_Cmd(_LCD_CLEAR);
					Delay_ms(500);
					Lcd_Out(1, 3, msg8 );//" * WARNING * "
					Delay_ms(1000);
					j++;
				}

				cnt=2;// one attempt only
				j=0;
				goto begin ;
			}
			while(1);
		}
	}
}
while(1);
}


احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 03-07-2017, 12:56 AM المشاركة 5   
افتراضي اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا وزدنا علما


السلام عليكم ورحمه الله ..

شكرا جزيلا مهندسنا الفاضل .. " F.Abdelaziz " جزاك الله خيرااا علي طرح العلم والمعرفه .. للعامه ..

فعلا استاذي كلامك سليم 100 % بالنسبه لوضع زمن تأخير بعد كل عمليه كتابه / قرأة من ذاكره الإبروم ..
وكان هناك نقاش وجدال كبير بيني وبين أحد اصدقائي هنا في القريه عن ضرورة وضع زمن تأخير بين كل عمليه كتابه /قرأة من ذاكرة الإبروم .. وكان مصرااا علي أن الداتا شيت لا تتكلم عن هذا الزمن وهو غير مهم ... وصنعة برامج ولاحظت الفرق عند عدم وضع زمن تأخير بعد كل عمليه قرأ / كتابه .. من ذاكرة الإبروم تحدث المشاكل والنتيجه غير متوقعه خاصه في عمليه القرأة ..

التجربه علي أرض الواقع خير دليل ...

كنت أعلم هذه المعلومه من زمن ليث بالقليل .. وهي بالفعمل معلومه مهمه جداااا في التعامل مع ذواكر الإبروم سواء داخلية أم خارجيه ..


أشكرك استاذي علي حرصك لتقديم المعلومه كامله .. والأمانة العلميه ..
بارك الله فيك وأمدك بالصحه وراحه البال وطول العمر في طاعه الرحمن ..


احصائية الشكر والاعجاب - 2 شكراً, 0 عدم اعجاب, 2 اعجاب
شكراً F.Abdelaziz, assed ( شكر العضو على هذه المشاركة )
اعجاب F.Abdelaziz, assed ( أعجبته المشاركة )

الصورة الرمزية younescdse
younescdse
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2009
المشاركات: 90
نشاط [ younescdse ]
قوة السمعة:0
قديم 05-07-2017, 08:00 AM المشاركة 6   
افتراضي


بارك الله فيك

هلا جمعت لنا كل دروسك في كتاب واحد

على الاقل موضوع تجمع فيه روابط دروسك

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً F.Abdelaziz ( شكر العضو على هذه المشاركة )

الصورة الرمزية assed
assed
:: عضو فضي ::
تاريخ التسجيل: Jul 2014
الدولة: العراق - بغداد
المشاركات: 1,036
نشاط [ assed ]
قوة السمعة:97
قديم 06-07-2017, 09:18 PM المشاركة 7   
افتراضي


التعامل مع ذاكرة EEPROM الداخلية :
• يجب ضمان تأخير لا يقل عن 20ms بين الاستخدام المتعاقب لدالة الكتابة ودالة القراءة . فعلى الرغم من أن الميكروكونترولر سوف يكتب القيمة الصحيحة من خلال دالة الكتابة ، إلا أن دالة القراءة قد تعود بنتائج غير محددة .
السلام عليكم
الاستاذ الفاضل فتح الله عبد العزيز
هذه الفقرة أو الملاحظة لماذا لايوجد لها مثيل في صفحات الداتا شيت للمتحكمات أم انها تنطبق فقط على الذواكر الخارجية . الامثلة الموجودة من ضمن الداتا شيت خالية من DElay !!!... أرجو التوضيح ؟؟


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 06-07-2017, 10:58 PM المشاركة 8   
افتراضي


السلام عليكم
الاستاذ الفاضل فتح الله عبد العزيز
هذه الفقرة أو الملاحظة لماذا لايوجد لها مثيل في صفحات الداتا شيت للمتحكمات أم انها تنطبق فقط على الذواكر الخارجية . الامثلة الموجودة من ضمن الداتا شيت خالية من DElay !!!... أرجو التوضيح ؟؟
هذه الملاحظة منصوص عليها فى مكتبة دوال EEPROM بالمترجم ميكروسى برو والتدريب التمهيدى رقم 1 هو مثال الميكروسى برو

النص :

Ensure minimum 20ms delay between successive use of routines EEPROM_Write and EEPROM_Read. Although PIC will write the correct value, EEPROM_Read might return an undefined result.

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً assed ( شكر العضو على هذه المشاركة )
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 01:48 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025