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

   

الصورة الرمزية younescdse
younescdse
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2009
المشاركات: 88
نشاط [ younescdse ]
قوة السمعة:
قديم 26-06-2017, 04:29 PM المشاركة 105   
افتراضي



بارك الله فيك

فاتتني البداية سالحق بكم

اعلانات

محمد إلياس
:: مهندس جيد ::
تاريخ التسجيل: Jan 2017
المشاركات: 229
نشاط [ محمد إلياس ]
قوة السمعة:
قديم 30-06-2017, 10:23 PM المشاركة 106   
افتراضي


علم وتواضع ..
جازاك الله خير الجزاء أخي الكريم.

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

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


التعامل مع ذاكرة 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);


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


تدريب تمهيدى 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);
}


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


تدريب :
المرجع : 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);
 
}


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


مشروع قفل باب رقمى باستخدام الميكروكونترولر 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);
}



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


الاتصالات التسلسلية Serial Communications
مقدمة :
تطبيقات الميكروكونترولر قد تتطلب فى بعض الحالات تنفيذ إقامة اتصالات تسلسلية مع غيره من أجهزة نقل البيانات مثل الذاكرات memories وأجهزة الاستشعار sensors والكومبيوتر وحتى ميكروكونترولر آخر .
بغرض إجراء الاتصالات التسلسلية ، بعض الميكروكونترولر يكون بها وحدات (تسمى موديولات modules ) مثل :
I2C, SPI, USART, USB . كل من هذه الأشكال من الاتصالات يسمح بالاتصال بالوحدات الأخرى . الاتصال من خلال I2C يعتبر نموذجيا للاتصال بالذاكرات التسلسلية مثل : 24LC64, 24LC128, 24LC512 وغيرها . يستخدم البروتوكول SPI للاتصال مع أجهزة التخزين الكبيرة مثل الذاكرة SD . الوحدة USART هى أكثر الوحدات إستخداما ، هذه الوحدة تسمح بالاتصال بالأجهزة مثل أجهزة الاستشعار ووحدات الإرسال والاستقبال Xbee والكومبيوتر الشخصى ووحدات GPS والمتحكمات الآخرى . وأخيرا وحدة USB ، والموجودة ضمن بناء قليل من المتحكمات مثل 18F2550 و 18F4550 ، تسمح بالاتصال مع الكومبيوتر الشخصى من خلال منفذ USB وتعرف باسم HID " جهاز واجة الانسان" Human Interface Device .

الوحدة (الموديول) USART :
الموديول USART هو وحدة اتصال تسلسلى غير متزامن ، هذه الميزة تجعل الطلب علية كبير حيث لا يحتاج لإشارة الساعة . ميزة أخرى ، أنه ثنائى الاتجاه بمعنى أنه يمكنه إرسال واستقبال المعلومات فى وقت واحد. لهذا الغرض فهو يستخدم خطين لنقل المعلومات ، أحدهما للإرسال والآخر للاستقبال . خواص بروتوكول هذا الاتصال هى:
"نبضة بدء" start bit وهى دائما بالمنطق المنخفض logic 0 و 8 أو 9 بت من البيانات data و واحد 1 أو1.5 أو 2 بتات إنتهاء stop bits . وأخيرا يجب تحديد سرعة النقل بنفس القيمة فى كل من الجهازين المتصلين وهى فى الحالة الافتراضية 9600 bps (ليست قاعدة) .
المخطط التالى يبين سلوك نقل البيانات باستخدام هذا البروتوكول :



يستخدم هذا البروتوكول بالكومبيوتر الشخصى وبالأجهزة الأخرى وهو معروف بالبروتوكول RS232 ، ويستخدم مستويات جهد محددة والتى تختلف عن مستويات الجهد التى يستخدمها الميكروكونترولر . فى البروتوكول RS232 يكون المنطق صفر بقيمة الجهد +12 volts ويكون المنطق واحد بقيمة الجهد-12 volts . الكومبيوتر الشخصى والأجهزة الأخرى التى تتعامل مع المنفذ RS232 ، تستخدم وصلة DB9 وبها 9 طرف معرفة كما فى الشكل التالى :



للاتصال الغير متزامن يجب إعداد التوصيلات كما فى الشكل التالى :



لعمل إتصال وربط الميكروكونترولر PIC مع جهاز به RS232 ، يستخدم المحول المعروف MAX232 . يجب أن يتم تنفيذ ذلك كما فى الشكل التالى :





لاستخدام بروتوكول هذا الاتصال ، يتضمن مترجم الميكروسى المكتبة UART والتى تحتوى على الدوال الأتية :
الدالة :

كود:
UART1_Init (const unsigned long baud_rate);
تستخدم هذه الدالة لتهيئة (إعداد) الموديول USART وتحديد سرعة الاتصال عن طريق البارامتر baud_rate .
مثال :
كود:
// Initialize hardware UART1 and establish communication at 9600 bps
UART1_Init(9600);

الدالة :

كود:
char UART1_Data_Ready();
تستخدم هذه الدالة فى اختبار ما إذا كان هناك بيانات بحافز buffer الاستقبال جاهزة للقراءة فتعود بواحد (1) وإلا فإن لم توجد بيانات فى حافز الاستقبال عادت بالصفر (0) .
مثال :

كود:
// If data is ready, read it:
if (UART1_Data_Ready() == 1) { 
 receive = UART1_Read();
 }
الدالة :

كود:
 char UART1_Tx_Idle();
تستخدم هذه الدالة فى اختبار ما إذا كان مسجل الإزاحة للإرسال فارغ (أى تم إرسال البيانات) فتعود بواحد أما إذا كان هناك بيانات فى مسجل الإزاحة للإرسال والموديول جاهز لإرسال بيانات جديدة فتعود بالصفر .
مثال :

كود:
// If the previous data has been shifted out, send next data:
if (UART1_Tx_Idle() == 1) { 
  UART1_Write(_data);
 }
الدالة :

كود:
 char UART1_Read();
تستخدم هذه الدالة فى استقبال (قراءة) بايت من حافز الدخل وتعود بقيمته.

كود:
// If data is ready, read it:
if (UART1_Data_Ready() == 1) { 
 receive = UART1_Read();
 }

الدالة :

كود:
UART1_Read_Text (char * Output, char *Delimiter, char Attempts);
تستخدم هذه الدالة فى قراءة سلسلة (تتابع) الحروف المخزنة بالمتغير المشار إلية بالبارامتر Output حتى يتم كشف تسلسل بشكل محدد delimiter sequence مبين بالبارامتر Delimiter . البارامتر Attempts يحدد عدد الحروف المتوقعة (طول النص) بالتسلسل المحدد . هذه الدالة تستدعى كوحدة واحدة حيث يتم تنفيذها عند وجود تتابع سلسلة الحروف بالشكل المحدد فإذا لم يوجد التتابع بالشكل المحدد يتم الخروج من الإجراء الموجود به الدالة .
مثال :

كود:
UART1_Init(4800);                         // initialize UART1 module
Delay_ms(100);
while (1) {
  if (UART1_Data_Ready() == 1) {          // if data is received 
    UART1_Read_Text(output, "OK", 10);    // reads text until 'OK' is found
    UART1_Write_Text(output);             // sends back text 
 }
}
الدالة :

كود:
UART1_Write(char _data);
تستخدم هذه الدالة فى إرسال بايت البيانات الموجود بالمتغير _data من خلال موديول UART .
مثال :

كود:
unsigned char _data = 0x1E;
...
UART1_Write(_data);
الدالة :

كود:
UART1_Write_Text(char * UART_text);
تستخدم هذه الدالة فى إرسال نص خلال UART ويجب أن ينتهى النص بالصفر 0 . هذا النص معطى بالبارامتر UART_text .
مثال :

كود:
UART1_Init(4800);                         // initialize UART1 module
Delay_ms(100);
while (1) {
  if (UART1_Data_Ready() == 1) {          // if data is received 
    UART1_Read_Text(output, "OK", 10);    // reads text until 'OK' is found
    UART1_Write_Text(output);             // sends back text 
 }
}


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


تدريب تمهيدى 1 : تدريب مكتبة UART
هذا التدريب يستعرض تبادل بيانات بسيط من خلال وحدة UART . عندما يستقبل الميكروكونترولر بيانات ، يقوم على الفور بإرسالها عائدة .

كود:
char uart_rd;

void main() {
  UART1_Init(9600);               // Initialize UART module at 9600 bps
  Delay_ms(100);                  // Wait for UART module to stabilize
  
  UART1_Write_Text("Start");
  UART1_Write(10);
  UART1_Write(13);
  
  while (1) {                     // Endless loop
    if (UART1_Data_Ready()) {     // If data is received,
      uart_rd = UART1_Read();     // read the received data,
      UART1_Write(uart_rd);       // and send data via UART
    }
  }
}



تدريب تمهيدى 2 :
لتنفيذ هذا التدريب ببرنامج ISIS يتم جلب العناصر التالية PIC 16F877A و VIRTUAL TERMINAL وتكوين الدائرة كما فى الشكل التالى :




الوحدة الطرفية التخيلية VIRTUAL TERMINAL هى جهاز لمحاكاة الاتصال التسلسلى ولها نفس سلوك إداة النوافذ Windows HyperTerminal . هذا الجهاز يسمح بتحرير خواص الاتصالات مثل : عدد بتات البيانات ، وسرعة النقل ، وعدد بتات النهاية وغيرها . مع ذلك ، فإن الجهاز معد بسرعة إفتراضية 9600 bps وجاهز للاستخدام مع موديول UART .
للتحقق من عمل هذا الموديول يمكن ترجمة ومحاكاة البرنامج التالى :

كود:
 void main (void)
 {
 	// Declaration of variables.
 	char Data;
 	UART1_Init (9600); 	//  initialize UART1 module
	Delay_ms(100);
 	// Transmitting the text: Welcome.
 	UART1_Write_Text ("Welcome to the simulator:");
 	UART1_Write (13); 	// It transmits the ASCII  CR = Crriage return
 	UART1_Write (10); 	// It transmits the ASCII NL=New line
 	// Text is transmitted with key.
 	UART1_Write_Text ("Press a key! ...");
 	UART1_Write (13); 	// It transmits the ASCII  CR = Crriage return
 	UART1_Write (10); 	// It transmits the ASCII NL=New line
 	while (1) // infinite loop.
 	{
 		// The if statement tests whether a data is ready to read.
 		if (UART1_Data_Ready () == 1)
 		{
 		 // It reads the data from the buffer.
 		 Data = UART1_Read ();
 		 // Print text feedback.
 		 UART1_Write_Text ("you pressed the key:");
 		 UART1_Write (Data); 	// received data is transmitted.
 		 UART1_Write (13); 	// It transmits the ASCII  CR = Crriage return
 		 UART1_Write (10); 		// It transmits the ASCII NL=New line
 		}
 	}
 }
أثناء المحاكاة يمكن للمستخدم إرسال بيانات من خلال الوحدة الطرفية التخيلية ومشاهدة رد الفعل الميكروكونترولر PIC .







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