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

   

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



استاذي العزيز من فضلك في هذا المقطع البرمجي

كود:
I2C1_Init(100000);  		//DS1307 I2C is running at 100KHz
///////////////////////////
I2C1_Start();       		// begin I2C communications
I2C1_Wr(0xD0);      		// addresses the chip
I2C1_Wr( 0x01 );    		// access register address for minutes check table 2 above.
I2C1_Wr(0b00010011 );   	// write value into minutes register
I2C1_Stop();
///////////////////
و تحديدا الجملتين قبل الاخيره كيف يميز المعالج ان الجملة الاولى هي لتحديد العنوان و الجملة الثانية لادخال قيمة الدقائق ؟
وهل نحتاج الى استدعاء العنوان كلما اردنا ان ندخل بيانات اليه ؟
أخى الكريم شكرا جزيلا لك

هكذا هو بروتوكول الاتصال من خلال الناقل I2C .
1- من المفترض أن هناك العديد من الأجهزة المختلفة ، والتى تدعم الناقل I2C ، كلهل على متن نفس الناقل ومن ضمنها DS1307 وحتى وأن كانت لوحدها على الناقل.
2- يبدأ بروتوكول الاتصال المتفق عليه والمصمم عليه جميع الأجهزة بأن يقوم الماستر بإصدار أمر START ليوقظ (نداء انتباه) جميع الأجهزة اللتابعة الموجودة على متن الناقل وكلها فى انتظار سماع أى جهاز منهم هو الذى سوف سوف يتم النداء عليه وتحديده هو فقط للاتصال مع الماستر I2C1_Start().
3- يقوم الماستر بتخصيص الاتصال بجهاز معين عن طريق إرسال عنوان هوية هذا الجهاز والمحدد معرفة الصناع والموجود بداخلةI2C1_Wr(0xD0) . هذا العنوان مكون من 7 بتات لكن الماستر يرسل بايت بالكامل ولذلك يكون مصاحب للنداء تحديد نوع العملية التالية وفى البداية بالطبع سوف تكون عملية كتابة (السبب أنه يجب بعد ذلك تحديد عنوان الموقع الذى سوف يتم التعامل معه) وللأشارة إلى أن العملية هى عملية كتابة يكون البت BIT0 فى بايت عنوان الهوية هو الصفر .
4- الآن يقوم الماستر بتحديد (إرسال - كتابة) موقع عنوان سجل داخل الجهاز التابع ليكتب عليه أو يقرأ منه فيما بعدI2C1_Wr( 0x01 ) .
5- بعد أن تم تحديد الموقع :
أ- إذا كانت العملية كتابة فليس هناك مشكلة لأن أخر أمر (كتابة / قراءة) كانت كتابة لذلك نستمر وسف يفهم التابع ذلك لأنه هكذا هو البروتوكول المتفق علية ، وهنا عملية كتابة وبالطبع يكون مفهوم أنها على الموقع المحدد سلفا فى الخطوة السابقة .
ب- أما إذا كانت العملية التالية هى عملية قراءة من الموقع المحدد فى الخطوة السابقة فينبغى علينا البدء من جديد بأمر إعادة البدء ، ثم من جديد نرسل عنوان هوية الجهاز التابع المطلوب ولكن !!!!! فى هذه المرة يكون متبوعا ببت إشارة للقراءة أى تكون البت BIT0 بواحد . بعد ذلك يمكن القراءة من الموقع المحدد فى الخطوة 3 كما يمكن مباشرة القراءة من المواقع المتتابعة والتى تلى هذا الموقع .

أرجو أن تكون الفكرة قد وصلت

مع تمنياتى بدوام التوفيق

اعلانات

الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 9,848
نشاط [ حيدر علاج حسن ]
قوة السمعة:
قديم 17-04-2016, 11:51 PM المشاركة 18   
افتراضي


ما ذكرته فيه معلومات قيمه و بالاخص معلومة البدء من جديد و التي كنت اجهلها .
لكن لا اخفيك فانني لم اجد الاجابه على سؤالي في ردك ...
واسف على ازعاجك

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-04-2016, 12:18 AM المشاركة 19   
افتراضي


ما ذكرته فيه معلومات قيمه و بالاخص معلومة البدء من جديد و التي كنت اجهلها .
لكن لا اخفيك فانني لم اجد الاجابه على سؤالي في ردك ...
واسف على ازعاجك
و تحديدا الجملتين قبل الاخيره كيف يميز المعالج ان الجملة الاولى هي لتحديد العنوان و الجملة الثانية لادخال قيمة الدقائق ؟
وهل نحتاج الى استدعاء العنوان كلما اردنا ان ندخل بيانات اليه ؟
الشرح المستفيض ربما يستفيد من من لديه نفس التساؤل
ومع ذلك
باختصار :
لقد كانت الإجابة إنه البروتوكول الذى ينص على ذلك

لكن : الإجابة

1- أى معالج تقصد ؟
2- الاحتياج تبعا للبروتوكول والمشروح تفصيلا وبالأشكال فى مقدمة الموضوع



التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 18-04-2016 الساعة 12:29 AM

الصورة الرمزية lovevb6
lovevb6
:: عضو فضي ::
تاريخ التسجيل: May 2010
الدولة: LIBYA-BENGHAZY
المشاركات: 1,473
نشاط [ lovevb6 ]
قوة السمعة:
قديم 18-04-2016, 02:26 AM المشاركة 20   
افتراضي


استاذي العزيز من فضلك في هذا المقطع البرمجي

كود:
I2C1_Init(100000);          //DS1307 I2C is running at 100KHz
///////////////////////////
I2C1_Start();               // begin I2C communications
I2C1_Wr(0xD0);              // addresses the chip
I2C1_Wr( 0x01 );            // access register address for minutes check table 2 above.
I2C1_Wr(0b00010011 );       // write value into minutes register
I2C1_Stop();
///////////////////
و تحديدا الجملتين قبل الاخيره كيف يميز المعالج ان الجملة الاولى هي لتحديد العنوان و الجملة الثانية لادخال قيمة الدقائق ؟
وهل نحتاج الى استدعاء العنوان كلما اردنا ان ندخل بيانات اليه ؟
السلام عليكم
من بعد اذن استاذي القدير


كيف يميز الميكروكونترولار ان هذا الامر هو لتحديد العنوان او للكتابة ؟ فببساطه فهو لا يعرف شي
كل ما يقوم به البك هو ارسال سلسله من البايتات بترتيب ثابت يفهمه ال 1307 وهذا اساس الاتصال i2c وهو ثابت ولا يمكنك تبديل امر مكان الاخر
فاذا كان التسلسل صحيح كما في الرسم


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

Acknowledge bit وهذا بمثل ( علم سيدي) اي التاكيد على استلام البيانات
انت طبعاا لن تتعامل مع عملية الرد بشكل مباشر مع هذه البيانات لاننا نستعمل في مكتبه جاهزة للتخاطب مع ال 1307
على العموم حتى لا نتوة فان الاجابه باختصار و عن طريق تسلسل البيانات المرسله
البايت الاول هو لتحديد هوية الاي سي ونحن هنا نتعامل مع اي سي واحد 1307 وعنوانه معروف وثابت وهو

0xD0 (الصفر هو للكتابه)
البايت الثاني هو للدخول الى المسجل المطلوب وفي مثالك هذا الى مسجل الدقائق
البايت الثالث هو للكتابة فانناارسلنا 8 بتات واخر بت هو 0
0 يعني كتابة ...1 يعني قرائه
في مثالك هذا

00010011
فان اول 7 بتات هي الداتا المراد كتابتها
اما الصفر في البت الثامن فهو امر الكتابة
يعني لو كتبناه بهذه الطريقه فلن ينجح معك الامر

10010011
لان اخر بت هو برقم 1 ...وهذا الرقم هو امر قرائه لل1307
البت الاخير هو بت النهايه
هكذا ينفذ المتحكم اوامره بطريقه متسلسله
هذا يااخي حيدر باختصار شديد جداا
واذا كنت تريد الفهم اكثر اطلع على الداتا شيت فهو يشرح هذه الطريقه بشكل واضح
###########################
الشق الثاني من السؤال هو نعم ستحتاج الى استدعاء العنوان في كل عمليه قرئه او كتابة ....والا كيف سيعرف البك ما الذي تريد كتابته او قرائته
كل هذه المعلومات ليست عن تجربه وانما عن قرائه للداتا شيت فقط ولا املك اي نوع من الخبره بالتعامل مع هذا البروتوكول ....واي خطاء في كلامي فهو امر محتمل ...






بالرغم من ان استاذي القدرير فتح الله شرح بتفصيل اكثر مني بكثير ..الا اني احببت ان اشارك ولو بالقليل
تحياتي للقرية الرائعه ومشرفيها المخضرمين
انا من المتابعين لهذا الموضوع مع صديقي العزيز حيدر
وماتوفيقي الا من الله سبحانه وتعالى






التعديل الأخير تم بواسطة : lovevb6 بتاريخ 18-04-2016 الساعة 03:06 AM

الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 9,848
نشاط [ حيدر علاج حسن ]
قوة السمعة:
قديم 18-04-2016, 04:31 PM المشاركة 21   
افتراضي


ما احتاجه هو ادخال القيم الابتدائية للدقائق و الساعات (بنظام 12 ساعة ) و اليوم و التاريخ و الشهر و السنة ...
حيث انني عملت كود يقوم باختيار كل قيمة اعلاه و عند الضغط على مفتاح يعمل زياده بمقدار 1 لكل ضغطة و هكذا يزداد الرقم وصولا الى القيمة المطلوبة من اجل عملية الضبط ..
فكيف اكتب القيم الابتدائية لتلك البيانات .
كود:
int set_minute=........ ;
int set_hour=...........;
int se_day=...........;
int set_date=..........;
int set_month=.........;
int set_year=.............;


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-04-2016, 05:04 PM المشاركة 22   
افتراضي


مشروع ساعة رقمية قابلة لضبط التوقيت والتاريخ باستخدام DS1307 والميكروكونترولر PIC16F877A والمترجم ميكروسى برو :

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



البرنامج :

كود:
// 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 connections
unsigned short read_ds1307(unsigned short address)
{
  unsigned short r_data;
  I2C1_Start();
  I2C1_Wr(0xD0); //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
  I2C1_Wr(address);
  I2C1_Repeated_Start();
  I2C1_Wr(0xD1); //0x68 followed by 1 --> 0xD1
  r_data=I2C1_Rd(0);
  I2C1_Stop();
  return(r_data);
}
//////////////////////////////////////////
void write_ds1307(unsigned short address,unsigned short w_data)
{
  I2C1_Start(); // issue I2C start signal
  //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
  I2C1_Wr(0xD0); // send byte via I2C (device address + W)
  I2C1_Wr(address); // send byte (address of DS1307 location)
  I2C1_Wr(w_data); // send data (data to be written)
  I2C1_Stop(); // issue I2C stop signal
}
/////////////////////////////////////////////////
unsigned char BCD2UpperCh(unsigned char bcd)
{
  return ((bcd >> 4) + '0');
}

unsigned char BCD2LowerCh(unsigned char bcd)
{
  return ((bcd & 0x0F) + '0');
}

//////global variables//////////////////
unsigned short  second;
unsigned short  minute;
unsigned short  hour;
unsigned short  hr;
unsigned short  day;
unsigned short  dday;
unsigned short  month;
unsigned short  year;
unsigned short  ap;

unsigned short set_count = 0;
short set;

char time[] = "00:00:00 PM";
char date[] = "00-00-00";
/////////////////////////
bit oldstate;                                    // Old state flag
////////////////////
void main()
{
   I2C1_Init(100000); //DS1307 I2C is running at 100KHz

   CMCON = 0x07;   // To turn off comparators
   ADCON1 = 0x06;  // To turn off analog to digital converters

   TRISA = 0x07;
   PORTA = 0x00;

   Lcd_Init();                        // Initialize LCD
   Lcd_Cmd(_LCD_CLEAR);               // Clear display
   Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
   Lcd_out(1,1,"Time:");
   Lcd_out(2,1,"Date:");

   while(1)
   {
                set = 0;
         /////////
                if (Button(&PORTA, 0, 10, 0)) {               // Detect logical one
                        oldstate = 1;                              // Update flag
                        }

                if (oldstate && Button(&PORTA, 0, 10, 1)) {   // Detect one-to-zero transition
                        oldstate = 0;                              // Update flag
                        set_count++;
                                if(set_count >= 7)
                                {
                set_count = 0;
                                }

                }

        /////////////////////
     if(set_count)
     {
        //////////////////////////
                if (Button(&PORTA, 1, 10, 0)) {               // Detect logical one
                        oldstate = 1;                              // Update flag
                        }
                        /////
                if (oldstate && Button(&PORTA, 0, 10, 1)) {   // Detect one-to-zero transition
                        oldstate = 0;                              // Update flag
                        set = 1;
                }
          /////////////////////
 
                if (Button(&PORTA, 2, 10, 0)) {               // Detect logical one
                        oldstate = 1;                              // Update flag
                        }
                if (oldstate && Button(&PORTA, 0, 10, 1)) {   // Detect one-to-zero transition
                        oldstate = 0;                              // Update flag
                        set = -1;
                        }
          /////////////////////////
        if(set_count && set)
        {
          switch(set_count)
          {
            case 1:
                    hour=Bcd2Dec(hour);
                                        hour = hour + set;
                    hour=Dec2Bcd(hour);
                                        if((hour & 0x1F) >= 0x13)
                    {
                      hour = hour & 0b11100001;
                      hour = hour ^ 0x20;
                    }
                    else if((hour & 0x1F) <= 0x00)
                    {
                      hour = hour | 0b00010010;
                      hour = hour ^ 0x20;
                    }
                    write_ds1307(2, hour); //write hour
                                                   
                    
                    break;
            case 2:
                     minute = Bcd2Dec(minute);
                                         minute = minute + set;
                     if(minute >= 60)
                        minute = 0;
                     if(minute < 0)
                        minute = 59;
                     minute = Dec2Bcd(minute);
                                         write_ds1307(1, minute); //write min
                     break;
            case 3:
                    if(abs(set))
                      write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
                    break;
            case 4:
                     day = Bcd2Dec(day);
                                         day = day + set;
                     day = Dec2Bcd(day);
                                         if(day >= 0x32)
                        day = 1;
                     if(day <= 0)
                        day = 0x31;
                     write_ds1307(4, day); // write date 17
                     break;
            case 5:
                    month = Bcd2Dec(month);
                                        month = month + set;
                    month = Dec2Bcd(month);
                                        if(month > 0x12)
                      month = 1;
                    if(month <= 0)
                      month = 0x12;
                    write_ds1307(5,month); // write month 6 June
                    break;
            case 6:
                    year = Bcd2Dec(year);
                                        year = year + set;
                    year = Dec2Bcd(year);
                                        if(year <= -1)
                       year = 0x99;
                    if(year >= 0x50)
                       year = 0;
                    write_ds1307(6, year); // write year
                    break;
          }
        }
     }

      second = read_ds1307(0);
      minute = read_ds1307(1);
      hour = read_ds1307(2);
       hr = hour & 0b00011111;
       ap = hour & 0b00100000;
      dday = read_ds1307(3);
      day = read_ds1307(4);
      month = read_ds1307(5);
      year = read_ds1307(6);

//////////////////////////
      time[0] = BCD2UpperCh(hr);
      time[1] = BCD2LowerCh(hr);
      time[3] = BCD2UpperCh(minute);
      time[4] = BCD2LowerCh(minute);
      time[6] = BCD2UpperCh(second);
      time[7] = BCD2LowerCh(second);

      date[0] = BCD2UpperCh(day);
      date[1] = BCD2LowerCh(day);
      date[3] = BCD2UpperCh(month);
      date[4] = BCD2LowerCh(month);
      date[6] = BCD2UpperCh(year);
      date[7] = BCD2LowerCh(year);
      ///////
      if(ap)
      {
         time[9] = 'P';
         time[10] = 'M';
      }
      else
      {
         time[9] = 'A';
         time[10] = 'M';
      }
////////////////////////////

      Lcd_out(1, 6, time);
      Lcd_out(2, 6, date);
      Delay_ms(100);


   }
}


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


ملفات المشروع والمحاكاة ببرنامج بروتيس على الرابط :

http://www.mediafire.com/download/gc...ital_Clock.zip



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 19-04-2016, 12:46 AM المشاركة 24   
افتراضي


ما احتاجه هو ادخال القيم الابتدائية للدقائق و الساعات (بنظام 12 ساعة ) و اليوم و التاريخ و الشهر و السنة ...
حيث انني عملت كود يقوم باختيار كل قيمة اعلاه و عند الضغط على مفتاح يعمل زياده بمقدار 1 لكل ضغطة و هكذا يزداد الرقم وصولا الى القيمة المطلوبة من اجل عملية الضبط ..
فكيف اكتب القيم الابتدائية لتلك البيانات .
كود:
int set_minute=........ ;
int set_hour=...........;
int se_day=...........;
int set_date=..........;
int set_month=.........;
int set_year=.............;
[أعتقد أن استخدام النوع int لا يناسب قيم المتغيرات فى حالتنا اعتقد أنه من المناسب استخدام النوع char أو النوع unsigned short ]


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 19-04-2016 الساعة 02:39 AM


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