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

   

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 02-08-2018, 08:14 AM المشاركة 97   
افتراضي





رغم أنه من الممكن إعلان الوظائف و كتابتها لاحقا كأن نقول
كود:
char Readkpd();
لاحظ أنها تنتهى بالمقدسة ثم لاحقا فى أى مكان نعيد التعريف مع الكود كاملا كالتالى ولاحظ أنها بدون المقدسة إلا أننا سنكتفى بواحدة فقط و سنجعل قراءة الأزرار دالة تعيد قيمة الزرار المضغوط وهذا من قبيل التنوع حيث من الممكن تنفيذها فى البيزك أيضا بنفس الخطوات. هيكل الدالة هو نفس الخطوات
كود:
char Readkpd() { for (Cntr = 1 ;Cntr = 5 ; ++Cntr) // Read 5 times { Keypad = 254 ; // 1111 1110 COL4 Tmp = Keyvalue & 0B11110000 ; switch (Tmp) { case 0B01110000 : return 10; // F1 or A pressed ret 0xA = 10 case 0B10110000 : return 11; // F2 or B pressed ret 0xB = 11 case 0B11010000 : return 12; // F3 or C case 0B11100000 : return 13 ; // Enter Pressed ret 0xD = 13 } Keypad = 0B11111101 ; // Col 3 Tmp = Keyvalue & 0xF0 ; switch (Tmp) { case 0B01110000 : return 3; // F1 or A pressed ret 0xA = 10 case 0B10110000 : return 6; // F2 or B pressed ret 0xB = 11 case 0B11010000 : return 9; // F3 or C case 0B11100000 : return 14 ; // Cancel Btn } Keypad = 0B11111011 ; // Col 2 Tmp = Keyvalue & 0xF0 ; switch (Tmp) { case 0B01110000 : return 2; case 0B10110000 : return 5; case 0B11010000 : return 8; case 0B11100000 : return 0 ; } Keypad = 0B11110111 ; // Col 1 Tmp = Keyvalue & 0xF0 ; switch (Tmp) { case 0B01110000 : return 1; case 0B10110000 : return 4; case 0B11010000 : return 7; case 0B11100000 : return 15 ; // Mode } } return 255 ; // No key code } char Readandchk() { do { Keyvalue = Readkpd(); } while (Keyvalue != 255) ; // Wait key released do { Keyvalue = Readkpd(); } while (Keyvalue = 255) ; // Wait key Pressed if (Keyvalue > 9) Cmd_ndgt = 1; else Cmd_ndgt = 0 ; }
ننشئ دورة من 5 مرات و إن شئت أكثر فلا بأس ثم تضع على المنفذ صفرا على أحد الأطراف و الباقى أحاد و تقرأ المنفذ ثم تحذف المصف المقنن كخروج و تبقى الدخول فقط و بالتعليمه switch تستطيع أن تعيد الرقم المناسب لكل ضغطة زر.
باقى دالة القراءة و الفحص حيث نقرأ الأزرار و فى دورة do نتأكد من أنه لا زرار مضغوط ثم ندخل دورة مشابهة لننتظر ضغطة زرار فإن كان أكبر من 9 فهو أمر وإلا فهو عدد

المرة القادمة إن شاء الله نكمل البرنامج


اعلانات

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 03-08-2018, 08:14 AM المشاركة 98   
افتراضي




كود البرنامج
كالمعتاد نبدأ بالعنوان ثم تعريف المنافذ كمداخل أو مخارج و تصفير الوقت ثم عرضه. يلى ذلك إلغاء مقاومات الجذب العلوى ثم تحديد أنواع المقاطعة و استجابتها حافة الخ. و تهيئة باقى أعلام المقاطعة.
بعد ذلك نقرأ مع الفحص فى دورة حتى يأتى الرقم ثم نكرر ما سبق تماما ، نضيفه كثوانى ثم نكرر فإن كان أمر ننتقل للفحص أو نضرب ما سبق فى 10 ثم نضيف الجديد و هكذا حتى تكتمل أربعة أرقام فننتظر أمر.
كود:
void main() { Startit: TRISC = 0 ; TRISD = 0X0F ; TRISB = 1 ; TRISA = 255; Minleft = 0 ; Secleft = 0 ; Showtime ; OPTION_REG = 0b00111111 ; // setting RB Pull up clearing bit RBPU (OPTION_REG<7>). // INTEDG = falling ,TOCS counter not timer, Count Falling Edge Prescale to WDT , ratio INTCON = 0B10100000 ; // Interrupt Control GIE All,Peie edge falling, T01E Enable // INTE External disable , T01 Ov flag,intf ext flag , RBIF port change flag TRISB = 255 ; Controls = 0 ; INTCON.TMR0IF =0 ; // Interrupt Timer0 Flag INTCON.TMR0IE =0 ; // Stop Interrupt Timer0 while (1) { do Readandchk; while (Cmd_ndgt = 1); // wait a digit Secleft = Keyvalue ; Showtime ; Readandchk ; // seconds if (Cmd_ndgt ) goto Chkcmnd ; Secleft = (Secleft * 10) + Keyvalue ; // make ten seconds Showtime ; Readandchk ; if (Cmd_ndgt ) goto Chkcmnd ; Minleft = Secleft / 10 ; // a digit, make minutes Secleft = (Secleft % 10)+ Keyvalue ; Showtime ; Readandchk ; if (Cmd_ndgt ) goto Chkcmnd ; Tmp = Secleft / 10; Minleft = (10 * Minleft) + Tmp; // adigit make ten minutes Readandchk ; if (Cmd_ndgt ) goto Chkcmnd ; Tmp = Secleft / 10; Minleft = (Minleft * 10)+Tmp; // a last digit, make 10 min Tmp = Secleft % 10 ; Secleft = Tmp + Keyvalue; do Readandchk; while ( Cmd_ndgt = 0); // wait a command
تم تحديد الزمن و الآن جاء أمرو مطلوب تحليله، أسهل طريقة أن نستخدم switch و من ثم لو 10 نسأل لو الماجنيترون يعمل؟ إذن نزيد الزمن 10 ثوانى و إلا نكرر ما سبق فى تمهيد الشاشة لقراءة النسبة المطلوبة لتخفيض الطاقة ثم ننتظر رقم و نعرضه و ننتظر أمر للتنفيذ أو عدد نعدل الرقم السابق.
كود:
Chkcmnd: switch (Keyvalue) { case 10 : // either ADD 10 seconds or set Low Power { if (Jobpending = 1) // running , add ten { Secleft = Secleft + 10; if (Secleft > 59) ; Secleft = Secleft - 60 ; } else { Displays = 255 ; Minlatch=0 ; Delay_us(1); Minlatch =1 ; Delay_us(1); Displays = 0; Seclatch=0 ; // Display Blank MinLeft Delay_us(1); Seclatch = 1; Readandchk; // Show -- 00 if (Cmd_ndgt = 1) ; goto Chkcmnd; // if a 2nd Command, cancel Low Power Setlow: Powersel = Keyvalue ; Lowheat=1; // Setlow Displays = Dec2bcd(Keyvalue * 10); Seclatch = 0 ; Delay_us(1) ; Seclatch= 1 ; // Show -- x0 Currpwr = 0 ; Readandchk ; if (Cmd_ndgt = 0) goto Setlow; else goto Chkcmnd ; // a digit, replace the old one } } case 11 : // 11 = Add MinLeft { if (Jobpending = 1) // if not running do nothing {Tmp = Minleft / 10 ; ++Minleft ; Cntr = Minleft / 10; if (Cntr > Tmp) Minleft = Minleft - 10; } } case 12 : ; // 12 = Add 10 MinLeft { if (Jobpending = 1) // if not running do nothing Minleft = Minleft + 10; if (Minleft > 100) Minleft = Minleft - 100; } case 13 : ; // 13 = Enter or Run { if (Jobpending = 1) // if not running do nothing { Jobpending = 1 ; Off_non = 1; Hiv_on = 1 ; // power On TMR0 = 205 ; // Load Tomer0 INTCON.TMR0IE = 1 ; // enable Timer0 INTCON.TMR0IF = 1 ; // Interrupt Timer0 Flag while (jobPending = 1) ; // Bitwait Jobpending , Reset // Wait to Finish Hiv_on = 0; // Power Off } } case 14 : ; { while (Dooropen =1){}; if (Jobpending = 1) // if not running do nothing { INTCON.TMR0IE = !INTCON.TMR0IE = 1 ; Off_non = !Off_non ; } } case 15 : goto Startit; } } }
هكذا نكون قد شرحنا الميكرو ويف بالميكرو من الأنواع الثلاثة و باللغات الثلاثة. المرة القادمة إن شاء الله نبدأ برنامجنا الأخير وهو التحكم فى سرعة موتور تيار مستمر ما لم يجد جديد


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

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 04-08-2018, 08:51 AM المشاركة 99   
افتراضي التحكم فى سرعة موتور تيار مستمر



التحكم فى سرعة موتور تيار مستمر

لماذا التحكم فى موتور تيار مستمر؟ ببساطة للحاجة لقياس فولت أو تيار أو كلاهما و من ثم نستخدم ADC و أيضا نتحكم فى عرض النبضة وهو يتعرض لموضوع PWM و القلق من عدم إيقاف الموتور فى الوقت المناسب و من ثم وحدة مؤقت "كلب الحراسة" و اختصارا نكتفى بمؤقت الحماية و أيضا قد نحتاج لتثبيت السرعة و من ثم نتعرض للكتابة فى الذاكرة الغير متطايرة EEPROM . طبعا سنعرض هنا باستخدام عارض LCD و بهذا نكون قد غطينا معظم خواص الميكروكونترولر .
ما هو موتور التيار المستمر؟

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

لكى نوضح الخلاف فلدينا ملف من السلك و سنمرر به تيار من مصدر مستمر وهو بالمناسبة يسمى "بوبينه" من الكلمة bobbin أى ملف على بكرة أو مكوك و ليست بحرف الميم كما هو منتشر فكلمة mob تعنى غوغاء .. من الطبيعى أننا لن نستخدم دوما أرفع سلك مطلوب من الحسابات فقد يكون السلك الأرفع أغلى ثمنا أو أصعب فى الاستخدام أو ببساطة غير متوافر فلو تحتاج 0.2 أمبير مثلا سيكون السلك رفيع جدا و ما هو أقل من 1 دوزيم أى اقل من 0.1 مللي متر يكون عادة مكلفا جدا و صعب توافره الخ.
إذن لو وصلنا الموتور بالمصدر و أوقفنا العضو الدوار فلم يتلف الموتور فهو من النوع الصغير الآمن و ذلك يرجع لكونه من سلك يتحمل فضلا عن أن مصادر التغذية الصغيرة أصلا لا تستطيع أن تمد بتيار كافى لإتلاف الحمل وهذا ما سنسميه موتور صغير لكون لو استخدمت بطارية سيارة و إن كانت 6 فولت ولكنها قادرة على حرق و إتلاف الموتور فهذا ذو نظام كبير أى تياره كبير أعلى من تحمل الأحمال و من ثم تحتاج الدوائر لمزيد من الحماية و التأمين
التركيب الداخلى كما بالصورة من مغناطيس و ملف ولكن هناك طرفى توصيل عبر ما يسمى الموزع ألذى يتولى تغذية الملف المناسب فى الوقت المناسب وهو من الكربون المضغوط و لذا عند قياس طرفى التوصيل ستجد بينهما نصف أوم فى القدرات الكبيرة أو أقل مثلا 0.01 أوم أو أقل بالكاد قيمة هذه القطع الكربونية و قد تكون صفر فى الموتورات الأصغر حيث تستخدم وصلات من سبيكة النحاس المقسى المرن. الآن لو وصلنا 12 فولت سيكون التيار فى 0.01 أوم هو 1200 أمبير و بطارية سيارة كبيرة تستطيع توفير هذا القدر إذن هذا خطر.
ثانيا كيف يكون أثناء التشغيل التيار لا يزيد عن 1 أمبير فقط. و الأغرب كيف لو أضفنا له حمل يشعر بذلك و يزداد التيار؟
الفكرة ببساطة فى الاسم أنه آله وليس موتور فهو عندما يوصل بالفولت سيدور و تقطع اللفات المجال المغناطيسى مولدة جهد عكسى يكاد يساوى الجهد المطبق أى فى مثالنا السابق يكون 11.99 فولت و الفرق 0.01 فولت مقسوما على 0.01 أوم = 1 أمبير.
الآن الموتور لا يشعر و لكن عند إضافة الحمل ستقل سرعة دورانه و من ثم يقل الجهد المتولد من 11.99 إلى 11.9 فولت أى 0.1 فولت ÷ 0.01 أوم = 10 أمبير و هكذا حتى تصل إلى 100 أمبير الخ.

إذن مع الحمل لابد من أن تنخفض السرعة و أركز على هذه النقطة لأصحاب فكر 555 مناسبة أو PWM كافى لتغيير سرعة الموتور فى المطلق.
ما سبق يسمي موتور المغناطيس الثابت ولكننا يمكن أن نستخدم ملف نمرر به تيار لتوليد مجال مغناطيسى قوى جدا وهذا يسمى أله المغناطيس الكهربى و هنا أصبح من الممكن تغيير السرعة بتغيير المجال و هذا يوفر ميزة أن تيار المجال عادة لا يقارن بتيار العضو الدوار Armature فقد يصل إلى من 4 إلى 10 أمبير فقط بينما تيار العضو الدوار Armature فقد يصل مئات من الأمبير و التحكم هنا سيكون أقل كلفة بكثير لو تتحكم فى 10 أمبير من أن تتحكم فى 200 أمبير مثلا.

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

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


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 05-08-2018, 08:39 AM المشاركة 100   
افتراضي



تعديل عرض النبضة Pulse Width Modulation أو PWM
ما هو معدل عرض النبضة؟ و فيم يستخدم؟
ببساطة هو تكرار دورة معينة بحيث نوصل القدرة جزء من هذه الدورة و نقطع القدرة باقى الدورة. و نسبة التوصيل للقطع يسمى الدوام Duty Ratio و التكرار هو التردد و عادة فى الموتورات تكون من 10 إلى 500 ذ/ث و ذلك لأن تقليل التردد قد يسبب رجة أو اهتزاز فى سرعة الموتور و زيادة التردد يتداخل مع حث الملفات و لكن يمكن زيادة التردد مع موتورات التوالى الخاصة بالمركبات لكون لفاتها قليلة .
أبسط وسيلة لتغيير عرض النبضة باستخدام 555 الشهيرة حيث نستخدم واحدة لتوليد نبضات حادة تحدد التردد ثم تغذى أخرى لتوليد نبضة نتحكم فى عرضها من خلال طرف التحكم رقم 5

فقط نلاحظ أن م1 تكون أكبر بكثير من م2 ليكون الخرج نبضة قصيرة لقدح التالية أو تستخدم الطريقة التقليدية بالربط بمكثف مع مقاومة على طرف 2 للثانية.
حل ثانى ابتكرته أن آخذ الخرج من على المكثف مباشرة فيكون موجة مثلثة و يمكن استخدام مقارن لتوليد موجة ذات عرض متغير و من المعروف أن على مكثف 555 تتكون موجة مثلثة بقيمة ثلث التغذية لذا لو 12 فولت ستحصل على 4 فولت فقط وهو لا بأس به لكن يمكنك إضافة مكبر بنسبة 1.5 أو 2 لرفع الموجة إلى 8 فولت ثم نغذى المقارن. لاحظ أن تكون م4 أكبر بكثير من م2.
إن فضلت تكبير أكبر من أو يساوى 2 فيمكنك جعل المكبر غير عاكس .


و أخيرا دائرتين باستخدام مكبر عمليات العليا تعطى موجة مربعة تحولها الثانية لمثلثة ثم نأخذ الموجة المثلثة لمقارن كما سبق و السفلى دائرة توليد موجة مربعة و يأخذ الخرج من خرج مكبر العمليات موجة مربعة و تعديل العرض من خلال جهد تحكم على الطرف Vin أعلى يسار الرسم.

قبل أن نترك هذا المجال يجب ألا ننسى المتكاملات الرائعة المستخدمة كمثبت جهد مثل 3525 و 3846 و494 وغيرهم و كلهم يولدوا موجات مربعة يمكن استخدامها لكن ليس الهدف أن ندرس تفاصيل الدوائر فهى فى سلسلة تصميم الدوائر و سلسلة دوائر التغذية لكن ما أريد توضيحه هنا حقيقة بسيطة وهى أن الدخول لكل هذه الدوائر و ألذى يتحكم فى عرض النبضة هو من مكبر عمليات. و التأخير هنا هو مدى استجابة مكبر العمليات ولو أردت استجابة أسرع استخدم مكبر أسرع و من ثم لو زاد التيار المار فى الحمل سيكون رد فعل المكبرات فى بضع ميكرو ثانية و نتيجة هذه الاستجابة مباشرة فى خلال بضع ميكرو ثانية ، أى ببساطة لو زاد التيار لن أكمل هذه النبضة و سأقتطع ما بقى منها.
أما استخدام متحكم بسرعة 20 ميجا سيقرأ التيار أولا ثم يحسب كم من الخرج يجب تعديله ثم يضع هذا التعديل فى العداد الخاص بتعديل عرض النبضة و ينتظر تأثيره على النبضة التالية. البعض يرى هذا ليس بالأمر الجلل و البعض يرى أنه لو لم تحتاج لحسابات متطورة مثل تعديل القدرة مع تغيير التردد المستخدمة فى انفيرتر التيار المتردد فربما يكون التحكم الخطى أكثر أمنا و أقل تعقيدا و ايسر فى الصيانة.
فى المتحكم نختار عداد مناسب و نختار له مصدر النبضات ألذى يوفر لنا التردد المطلوب ثم نجعله يعد و نجعل طرف ما =1 وهذا يمد الحمل بالتيار و عند حد معين نجعل الطرف = صفر وهذا يوقف التيار.
حسنا ماذا يحدث لو لم يستجيب المتحكم و كلنا نعلم انه قد يغيب فى دورة لا نهائية و لا أدعى خطأ منك فى البرمجة ولكن قد تدخل نبضة ما من مصدر ما فتربك تنفيذ ألتعليمه الحالية، هنا قد يتوقف فجأة وهذا قد يكون خطرا، و الأسوأ أن تفتح الطاقة ولا تقفل فلا يتحكم فيها فلا ننسى أن الأوساط الصناعية معروفة بأنها عالية الضوضاء – لا أقصد الصوت فقط ولكن ضوضاء النبضات و التداخلات الكهرومغناطيسية عامة ، وهنا دور كلب الحراسة أو مؤقت الحراسة وهو موضوعنا القادم إن شاء الله



ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 06-08-2018, 09:02 AM المشاركة 101   
افتراضي مؤقت الحراسة Watchdog Timer أو WDT



مؤقت الحراسة Watchdog Timer أو WDT
لمعالجة الحالة السابقة يمكن وضع عداد يعد أى نبضات لفترة ما تختارها طبقا لبرنامجك من حيث عدد الدورات و زمن استجابة الموتور أى كم ثانية يحتاجها لتصبح سرعته غير مقبولة أو متى يرتفع التيار لحد يسبب خطر على الدوائر. لا تستهين بمسألة التيار هذه فبالنسبة لموتورات أغلب تطبيقاتنا تكون 1 إلى 5 أمبير أو حتى 10 أمبير لكن هناك ماكينات تسحب 25 أو 100 أو حتى أعلى. هذه الماكينات عادة تكون موتوراتها ذات حث أقل من الصغيرة و من ثم معدل ارتفاع التيار لا تتجاوب معه الفيوزات العادية و من ثم تتلف المكونات سواء ثايرستور أو تراياك أو موسفيت أولا ثم يحترق الفيوز لاحقا ولذا تستخدم نوعية خاصة من الفيوزات تسمى سريعة القطع و للأسف ثمنها مع هذه التيارات العالية يدعو للتفكير مرتين.
لذا نشأت الحاجة لهذا العداد و ألذي لو اكمل العد يعنى الفترة الزمنية انقضت و من ثم يسبب إعادة تشغيل كاملة للجهاز.
طبعا يجب أن تأخذ فى الاعتبار أن زمن إعادة بدء تشغيل المتحكم هو من صلب الزمن ألذى تحاول أن تتفادى مروره. و الآن نحتاج لوسيلة لتصفير هذا العداد كل فترة قصيرة أقل من ذلك الزمن الحرج.
أبسط طريقة لو لم يكن المتحكم مجهز بهذا العداد أن نضيفه خارجيا باستخدام 4060 هكذا

ببساطة 4060 هو عداد من 14 مرحلة أى يعد 16384 و به 2 عاكس يمكن استخدامهما كمولد ذبذبات يعتمد تردده على قيمة م1 و س1 أى R1C1 أما R2 فيفضل أن تكون 10 أمثال R1 و تردده = 1/(2.2*R1*C1)
و زمن النبضة 2.2 * R1*C1
إذن بالقيم فى الدائرة زمن النبضة = 2.2 * 10000*0.1 ميكرو أى 0.0022 ثانية و بهذا يبقى الخرج رقم 14 = صفر 18 ثانية ثم يبقى 1 لمدة 18 ثانية و يمكنك أخذ النصف أو الربع أو الثمن أو تعدل التردد كما تشاء لتحدد الزمن. و تختار أى طرف من أى منفذ يتولى تصفير العداد.

وضعت الشركات المنتجة للمتحكمات عداد مخصص لهذه الوظيفة داخل المتحكمات مثل AT89S8252 من عائلة C51 و غيره و كامل عائلة AVR و أغلب منتجات ميكروتشيب ، عندما يصل للحد الأقصى يسبب إعادة بدء ريسيت Reset للمتحكم وهذا يتطلب إتاحة لو تنوى استخدامه فهو عادة غير متاح و تهيئة تحدد بها زمن انتظاره و لا تنسى أن تستخدم أمر التصفير حتى لا يسبب إعادة التشغيل.

كمثال فى متحكم AT89S8252 نجد له مسجل مستقل للتحكم فيه كما بالصورة حيث يعمل على مهتز خاص به لضمان استقراره و يحدد مدته ثلاث بيت على اليسار باللون الأصفر PS2,PS1,PS0 و يتراوح ما بين 16 مللى ثانية لأكثر قليلا من ثانيتين. الإثنين بت اقصى اليمين رقمى صفر وواحد فالأولى إتاحة و الثانية للتصفير

البت 3،4 لإتاحة الذاكرة EEPROM و إتاحة الكتابة و البت باللون الأخضر لتحديد أى من المسجلين نستخدم حيث كل متحكم به مسجل مؤشر البيانات وهو عادة 16 بت لتعيين أى مكان فى البرنامج أو التعامل مع ذاكرة خارجية وهذا يسهل التعامل مع الجداول و سبق الإشارة إليه و هذا المتحكم به زوج ليسهل التعامل مع شيئين معا.

المنحكم AT89S8253 أضاف ميزات لهذا العداد و لكنه استخدم الكريستال الخارجية و أصبح كعداد للتعليمات وهو يمكنه العمل على X2 و من ثم يكون الجدول السابق سارى مع كريستال 12 ميجا. ومن ضمن الإضافات التى أتاحها هذا المتحكم أن العداد يمكنه عمل ريسيت داخلى فقط أو يمكنه أن يظهر على طرف الريسيت الخارجى ليؤدى الوظيفة على كافة البوردة الخارجية.

المرة القادمة إن شاء الله نكمل النوعين الآخرين


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 07-08-2018, 08:35 AM المشاركة 102   
افتراضي



مؤقت الحراسة فى متحكمات AVR
هنا يجب أن نذكر نقطة هامة وهى أن هذا المؤقت له حالتين تتحكم فيهما فيوزات أثناء البرمجة، الحالة الافتراضية أنه يتحكم فيه من البرنامج فلو تطلب الأمر إيقافه فيمكن ببضع خطوات كود أن يتوقف ثم يعاد تشغيله عند الحاجة ، أما الحالة الثانية ببرمجة الفيوز يصبح دوما فاعلا ولا يمكن إيقافه، لذا تأكد من وضع الفيوزات قبل البرمجة.
المؤقت يعمل على مولد نبضات داخلى مستقل يعمل على تردد 1 ميجا و من ثم لا يعتمد على تردد الكريستال و له مسجل خاص يحدد عمله وهذا هو محتواه و الحالة الافتراضية له.

الثلاثة بت الأول هما كما فى السابق يحددوا نسبة التقسيم للنبضات و نفس الجدول السابق بالأوقات المسجلة به سارية هنا أيضا بالقيم المناظرة من صفر إلى 111 و يلى ذلك البت 3 باسم WDE وهى إتاحة المؤقت أو إيقافه و نظرا لأن هذا الأمر يؤثر جدا على أداء البرنامج، فقد جعل متاحا فقط لمدة 4 دورات و خصص له بت إضافية هى رقم 4 باسم WDTCE وهى عندما =1 بواسطة البرنامج يمكنك أن تعدل قيمة البت 3 WDE لتتيحه أو توقفه لفترة 4 دورات فقط و بعدها يعيد النظام البت رقم 4 WDTCE للصفر و يصبح غير متاح تغييره مرة أخرى ، أى انك لتغير من متاح لغير متاح أو العكس يجب أن تكتب 1 فى البت 4 و فى خلال 4 دورات أى 4 تعليمات تغير البت رقم 3 و إن شئت تغيير آخر لابد من الخطوتين متتاليتين مرة أخرى.
اللغات العالية تتولى عنك هذا لكنها لا تستطيع أن تتنبأ بحال الفيوز و ببساطة لو جعلته دوما متاح فلا كود يصلح ولا تحذير ينبهك.

مؤقت الحراسة فى متحكمات ميكروتشيب
فى عائلة PIC16 تعمل من مولد منفصل و لها فترة 18 ms و يمكن زيادتها كما سبق باستخدام المقسم السابق pre scalar وهو كما سبق يمكن تخصيصه للتايمر أو WDT و ليس للإثنين معا. أما فى عائلة 18 فتأخذ من المولد العام و يمكن برمجته لفترات طويلة و اللغات العالية يجب أن تقوم بهذا الدور عنا

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

الفتحات كما بالصورة 64 فتحة و عادة ما تكون ثنائية العد أى 64 أو 128 أو 256 و ذلك لتسهيل التعامل الرقمى معها.
الآن إضافة هذا التاكو يحتاج لدوائر تعريف ما إن كان يدور مع أم عكس عقارب الساعة و أيضا لحساب عدد الدورات الفعلية لنصحح القيم . لذا سيكون هذا أكثر تعقيدا و بالتالى سنستخدم الطريقة الثانية أى مقاومة متغيرة تحدد السرعة المطلوبة.
أعلم أن البعض معترض على الاسم و الآخر يصحح "إنكودر" ، حسنا نترجم الاسم لنفهم الأمور. تاكو هو تاكو ميتر أى عداد نبضات وهذا الجهاز به فتحات تحدد فقط عدد نبضاتها فى الثانية و إن كانت مع أو عكس عقارب الساعة لكن لو توقف فلا تعلم عنه شيئا سوى أنه متوقف. الإنكودر على النقيض يعنى مشفر أى يعطى شفرة عن معلومات معينه لذا فبه قرص مشفر بشفرة Gray Code أى شفرة العالم جراى و عدد ليدات مساوى لعدد النبضات فلو بدقة 10 بت مثلا يكون به 10 ليد قراءة و يرسل العشر بت معا على التسلسل ولو توقف يظل يرسل معلومات الزاوية المتوقف عندها، لذا يحتاج لنبضة أخرى تسمى نبضة الشمال North Pulse وهى تمثل نقطة الأصل التى يبدأ عندها العد و ترتيب الكود أو نبضة أخرى لتحديد اتجاه الدوران و لذا فهو مكلف و يستخدم فى هوائيات الرادار و كثير من الأجهزة الدقيقة المكلفة. لذا نستخدم هنا مقياس سرعة و ليس إنكودر.

و لكى نقيس الخرج لنعرف المطلوب و ما يحدث علينا بالمحول ألتماثلى الرقمى وهو موضوعنا القادم إن شاء الله



ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 08-08-2018, 08:44 AM المشاركة 103   
افتراضي



المحول التماثلى الرقمى
هناك أنواع مشروحة فى سلسلة الدوائر الرقمية ولكن هنا نهتم بما هو موظف فى وحدات الميكرو و المسمى SAR اختصار Successive Approximation Register وهى ببساطة لو أننا نريد 10 بت مثلا سنستخدم محول بالعكس من رقمى لتماثلى سنقارن قيمة 9 بت آحاد بالدخل فإن كان الدخل أعلى تكون البت 10 = 1 و إلا = صفر ثم نقارن الفرق بنصف القيمة أى 8 بت و هكذا

أى أننا نحول من تماثلى لرقمى باستخدام العكس أى وحدة تحويل من رقمى لتماثلى و هنا يجب أن نفهم ثلاثة أشياء هامة جدا قبل أن نبحث الدقة وهذه هى
1- ما معنى Vref و أثره على النتيجة
2- ما هو Vin و ما هى حدوده
3- ما دور Clock هنا

وهنا يجب أن ننوه على أن الرسم المرفق تقريبى و الدقيق يتباين من وحدة لأخرى لكنه دقيق بالقدر الكافى لتوضيح الأمور. نعلم أن المحول من رقمى لتماثلى وهو المربع الأوسط باللون الأصفر عبارة عن مجموعة سويتشات توصل و تفصل حسب البت المناظرة = 1 أم صفر و من ثم تحتاج لجهد يحدد لها كل نقله = كم فولت لذا وجب أن يكون لديها ما يسمى Vref أو الجهد المرجعى ألذى يحدد القيمة التى يكون عليها الخرج عندما تكون كل المداخل =1 أى كل البتات = 1 و من هنا نجد أن أعلى قيمة للخرج الرقمى لا توازى فولت معين و لكنها تساوى Vref أى لو غيرت Vref ستغير قيمة كل بت و من ثم العد الثنائى الناتج. ببساطة لو الدخل مثلا 1 فولت و غيرت Vref ليساوى 2.048 فولت فكل بت = 2 مللى فولت ولو غيرته إلى 4.069 ستصبح البت = 4 مللى فولت ولو 1.024 ستصبح = 1 مللى فولت ولا نحتاج لحسابات وهذه نقطه يغفلها كثير إن لم يكن كل من رأيتهم يتعاملوا مع ADC و يربكون أنفسهم فى حسابات معقدة ولو عدلوا قليلا فى قيمة Vref لأصبحت الأمور أسهل و ما أسهل من أن كل 1 يساوى 1 أو 2 أو 3 أو 4 أو 5 بدلا من 1.024 و اقسم و اضرب و اطرح بعد ذلك.
هل نعقد الأمور فى مكان لنسهل الأمور فى مكان آخر؟؟
أظن البعض نسى وجود مقاومة متغيرة كهذه.

ألأن نعود لما تفعله الدائرة هو تضع 9 آحاد أى نصف القيمة كدخل للمحول فيعطى نصف Vref و بمقارنته بالدخل سيكون لو الدخل أعلى إذن هو فى النصف الأعلى و لتسهيل الفهم نفترض أرقام بسيطة و سهلة ولو غير واقعية لكن الرياضيات لا تعتمد على الأرقام بل المعادلات. فلو Vref = عشرة فولتات للسهولة فإن ما سبق سيحدد ما إن كانت قيمة الدخول 4.999999 فولت أو اقل و تكون البت رقم 10 = صفرا أم 5.000001 فولت أو أعلى مثلا فتكون البت رقم 10 = واحد.
مهلا لم لا تقول 5 فولت؟ معذرة وهل فى الدائرة طرف “=” أو هل للمقارن خرج اسمه يساوى؟؟ هذا ما يسمى بالخطأ الكامن لأنه كامن فى نظام العمل. ليس هذا الخطأ مرتبطا بالفولت ولكنه أى قيمة للدخل لا تستطيع عدد البتات أن تعبر عنه بدقة. لكن يمكن تقريب الخطأ بفحص البت التالية ، نعم بمكن ذلك
الآن حددنا ما إن كانت بت 10 = 1 أم صفر فنثبتها و نكمل بصفر و 8 آحاد أى 1011111111 أو 0011111111 حسب النتيجة السابقة ونقارن خرج المحول بالدخول لنحدد البت التاسعة و هكذا.
لتثبيت البت يجب و ضعها فى ماسك Latch و تحتاج نبضة لحفظها و تعديل الدخل لذا نحتاج نبضة أو نبضتين من Clock لكل بت و من ثم لعشرة بت سنحتاج على الأقل لعشرة نبضات غير نبضات أخرى للتمهيد و إخطار النظام أن القيمة جاهزة للقراءة. أما التهيئة فالدخل لن يثبت طوال زمن النبضات لذا وجب استخدام دائرة احتفاظ بعينة Sample And Hold وهى موسفيت يخزن الدخل فى مكثف صغير تقرأ منه الدائرة وهى المسماة S/H .
الآن أصبح لدينا عدة عوامل نحتاط لها و أولها هى أن لدينا 10 بت إذن ستقرب القراءة حتى تصبح البت رقم صفر غير دقيقة. ثم نزيد عدد البتات من 10 إلى 12 ستتكرر مع البت صفر أيضا وهكذا دوما ولذا تجد كل الأجهزة الرقمية تضع الدقة مثلا 1 % +/- 1 عد أى أن العد الأدنى غير معتمد. المشكلة أن لو أضفنا عدم خطية الدوائر و غيره من مسببات الخطأ سيكون لدينا بت أو 2 تنحصر فيهم كمية أخطاء النظام.
ثانى هذه العوامل أن دائرة الاحتفاظ بالعينة تستخدم مكثف مصنوع من السيليكون و أكسيده كعازل.حقا لن تجد أفضل من هذا لكنك لن تجد مساحة كافية لمكثف كبير لذا يكون بضع بيكوفاراد فقط لذا يجب أن تكون معدل النبضات Clock سريعة بالقدر الكافى للتحليل قبل أن تتغير القيمة على هذا المكثف نتيجة للتسريب فى المكثف أو دوائر التحويل المتصلة به.
ثالث هذه العوامل هى المصدر ألذى ينقل الجهد المقاس لدائرة الدخول إذ يجب أن تكون مقاومته الداخلية صغيرة جدا حتى لا تسبب فى خطأ نتيجة زمن الشحن كما أن مقاومته فى الاتجاهين تكون متساوية حتى لا يختلف زمن الشحن عن التفريغ و يسبب ذلك خطأ فى القياس.
رابع هذه العوامل هو ثبات كافة الفولتات سواء فولت التغذية أو فولت Vref وهنا لا تقول أنه ثابت... فأنت تتكلم عن 10 بت أى 1024 عد أى 1:1000 من الفولتات المذكورة وهى 5 مللى فولت فى التغذية قيمة تعرجات من أى تداخل ، و قيمة Vref / 1000 و هذا ببساطة بدلا من القسمة على 1024 فالفرق 2% فقط.
أيضا هل الضوضاء الناجمة عن الميكرو ذاته تؤثر على عمل وحدة المحول؟؟
من هنا أقول اقرأ الداتاشيت جيدا و اعرف حدود ما لديك ولا تطلب أكثر منها. إن شئت دقة أعلى فليكن باستخدام وحدة مستقلة فمثلا وحدات AVR تنص صراحة على أنها 10 بت و نسبة خطأ +/- 2LSD أى أن أقل 2 بت بهما خطأ ، حسنا لا نستطيع الاعتماد إذن على ما هو أكثر من 8 بت و ميكرو تشيب لا توضع صراحة نسبة الخطأ و لكنها تحسب لك كثير من الأنواع و تترك لك مهمة الحساب. شخصيا لو أريد أكثر من 8 بت الجأ لوحدة خارجية.
قبل أن نترك هذا الموضوع فلدينا 5 فولت على 1024 خطوة أى كل عد = 4.8828125 مللى فولت. السؤال هل ستضع المتحكم على قاعدة لتتمكن من رفعه و برمجته حتى تضبط البرنامج أو تغير المتحكم عند الضرورة؟؟؟ أكيد نعم إذن هل سمعت عن ظاهرة الإلكتروليسيس وهى ظهور فرق جهد عند تماس معدنين مختلفين فى وجود أى سائل بينهما و هى ظاهرة البطارية (لا تتعجب فالرطوبة فى الجو سائل موجود الآن وبعد ساعة قد يختفى) و الثانى ظاهرة الثيرمو كابل حيث عند تماس معدنين مختلفين يكون بين الطرفين المتلامسين فرق جهد يعتمد على الحرارة؟ فلو لم يكن المتحكم ملحوما على البوردة فهذه الظواهر تسبب فرق جهد و مهما كان قليلا فهو ليس ثابتا و سيؤثر على ثبات القراءة و ليس فقط دقتها و لذا يلجأ الكثير للقراءة عدة مرات ثم أخذ المتوسط.
هنا أيضا نقطة هامة وهى أنه ينص فى أى وحدة على أن الدقة 1% +/- 1 بت. لنكن صرحاء هنا 1% من أقصى قيمة و ليس من قيمة القياس فلو 8 بت ستكون 2.5 لأن 8 بت تعطى 255 و 1% = 2.55 وهذا أكثر من +/- 1 بت لذا فالأكثر دقة تعطى نتائج أفضل و كلما زاد عدد البت ستحتاج لدقة أعلى ففى هذا المثال لو نطبقه على 10 بت أى 1024 سيكون الخطأ 10.24 وهذا 4 بت.
المرة القادمة إن شاء الله نتحدث عن الحفظ فى EEPROM


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 09-08-2018, 08:09 AM المشاركة 104   
افتراضي



الذاكرة الغير متطايرة EEPROM
سبق شرح تركيبه و باقى الأنواع فى سلسلة الدوائر المنطقية و هنا نكتفى بخواصها التى تتمثل فى احتفاظها بالبيانات ربما لعشرة أعوام فى غياب التيار و يمكن الكتابة فيها و التعديل أيضا عليها عشوائيا و تم التعديل عليها بحيث لا تحتاج لمحو كلى قبل إعادة الكتابة لذا تحتاج لمحو الخانة ثم إعادة الكتابة مما يجعلها بطيئه نوعا ما. و لست فى حاجة لعمل هذه الخطوات فالمتحكم يتولاها لكنك تضطر لانتظار تمام هذه العملية قبل التعامل معها مرة أخرى سواء بالقراءة أو الكتابة.
حسنا ماذا نكتب فيها؟ وهل هذا سؤال؟ طبعا أى معلومة أود الحفاظ عليها... حسنا مهلا لنعود للداتاشيت حيث نجد للمتحكم ثلاث أنواع من الذاكرة.
ذاكرة فلاش للبرنامج و معدل الكتابة فيها 1000 مرة إلى 100000 مرة فى أتميل بينما لم تذكر ميكروتشيب عدد المرات فى 16 و ذكرت 100000 أيضا فى 18
ذاكرة EEPROM و معدل الكتابة 100000مرة فى أتميل و 1000000 فى ميكروتشيب
ذاكرة رام و لم تذكر أى شركة أى شيئ عن عدد المرات وهذا منطقى. ففى فترة تشغيل لمدة ساعة قد تكتب و تقرأ اكثر من بضع الملايين من المرات فى الذاكرة العشوائية رام لكنك لن تبرمج المتحكم ربما أكثر من مئة مرة لذا اعتماد من ألف لعشرة الآف مرة للبرمجة هو أمر رائع لكن الذاكرة المحفوظة EEPROM من مئة ألف فى أتميل لمليون فى ميكروتشيب لابد أن يقرع لنا جرسا تنبيهيا هنا. المقصود أن تحتفظ بالبيانات الموضعية التى لا تتغير كثيرا.. أى ما تحتاج فى هذا المكان أن تضبط عليه أو هذا المستخدم يحتاجه لذا استخدامنا هذه الذاكرة لحفظ قيمة التشغيل هو من هذا القبيل.
أحد المصممين قام بتصميم جهاز لف محولات و استخدم متحكم للتشغيل و حفظ فى الذاكرة قيم اللفات وهذا أمر جيد جدا حيث يمكنك أن تحدد 10 أنماط من المحولات تستدعى أيها للتنفيذ . و أضاف ميزة أخرى لو انقطع التيار سيحتفظ بقيمة العد الحالى لاستكماله حال عودة التيار وهى فكرة أخرى رائعة و لكنه ليفعل ذلك حفظ فى EEPROM كل عد يقوم به العداد و بحسبة بسيطة نعلم أن محول 1 أمبير عادى يحتاج 3500 لفه إذن بقسمة مليون على 3500 = 285 محول ثم قد يتعرض المتحكم لعدم الاستجابة و ربما التعطل. لذا حتى استخدام ذاكرة خارجية كان بالتأكيد سيكون أفضل من حيث أن تغيير الذاكرة أهون من تغيير المتحكم لكنه ما كان ليحل هذه المشكلة كليا فهذه الكمية من المحولات قد تتم فى يومين أو ثلاثة فمن يقوم بلف السلك فى الإنتاج الكمى ليس هو ذاته من يلحم السلك و كلاهما لا يضع الحديد فى القلب. و الحل كان باستخدام مقارن مثل 311 أو 393 و عندما ينخفض الفولت عن 4.5 فولت يحفظ العد و ينتظر.

فى عائلة 51 لدينا المتحكم AT89S8253 و به 2 ك ذاكرة EEPROM و متوافر و يمكن أيضا استخدام 24c00 ذاكرة خارجية 16 بايت أو 24c01 أو 24c02 أو 24c04 أو 24c08 أو 24c16 بسعة 1ك و2ك و4ك و8ك و16ك بت (وليست بايت) وهى من 8 طرف متفقة فى كافة الأطراف حيث بها 3 طرف عنوان لتتمكن من توصيل 8 ذواكر معا و لكل منها عنوان من صفر لثمانية. لو تريد التعامل مع الأولى ترسل عنوان صفر ثم تكتب و تقرأ ما شئت ثم ترسل عنوان 5 مثلا للتعامل مع الذاكرة رقم 5 وهكذا و بوصل 8 من 24c16 تحصل على 16*8=92 ك بت أى 16 ك بايت

أيضا طرف SCL وطرف SDA للتعامل بطريقة I2C وهى جيدة لتطبيقات مثل محطات الأطباق حيث توجه الطبق لقمر ما فتحفظ رقم القمر و العد المناظر له. و طرف WP اختصار Write Protect حماية ضد الكتابة الخطأ خاصة عند بدء التشغيل أو قطع التيار. عندما يكون WP= 1 فيمكن القراءة ولكن لا يمكن الكتابة.
نشرح ببساطة طريقة I2C لكى تفعل ما تشاء وقت الحاجة وهى تعتمد على 9 بت و وضع بدء وآخر انتهاء.

نعلم كلنا أن أجهزة I2C لها عنوان تعريفى لذا يكون أسلوب التفاهم "البروتوكول" أن ترسل أولا من المتحكم أمر به العنوان و ما إن كنت تنوى القراءة أو الكتابة ولو تكتب فنوع الكتابة أمر أم بيانات.
طرف SCL يحدد متى تبدأ إذ يجب أن يكون =1 حتى تتلقى أمرا من SDA و عندما يكون =1 فإن انتفال SDA من 1 إلى صفر يعنى ذلك بداية التراسل و إن كان من صفر إلى 1 تعنى نهاية التراسل حتى لو كانت التغيرات متتالية لهذا لا نقل بيانات طالما SCL =1
الآن وضعنا 1 على SCL ثم غيرنا SDA من 1 لصفر هذا يعنى لنبدأ الحوار. ولنكمل الحوار يجب وضع SCL = صفر . الآن أى تغيير على خط SDA لا يعتد به. ضع عليه ما تشاء صفر أم واحد و الآن ضع نبضة موجبة على SCL مع إبقاء الآخر بلا تغيير . هذا ينقل ما وضعت سواء صفر أم واحد لداخل القطعة . سنقول قطعة لكونها ذاكرة أو أى حساس آخر يعمل بذات النسق. الآن نضع البيان الجديد أو لو شئت إبقاء القديم للتشابه ثم نبضة SCL و هكذا 8 بت و الآن تقلب وضع SDA من خروج لدخول و تضع نبضة على SCL يجب أن تتلقى أثنائها صفر على خط SDA وهذا يخبرك أن القطعة تلقت بايت كاملة لذا تسمى Acknowledge أى "علم" أو "عرف" هنا يجب أن نذكر أنه لكى يمكن للقطعة أن ترد بصفر و باعتبار وجود أكثر من واحدة على ذات المسار فيجب أن يكون هذا الطرف من نوع Open Drain أى مصب مفصول و بذلك يجب أن توصله أنت خارجيا بمقاومة واحدة فقط للمجموعة كلها قدرها 5 ك أوم للمصدر +5 فولت.
الآن ماذا نرسل فى هذه البايت؟ كما بالصورة

فورا يلى البدء Start العنوان وهو من 7 بت. أول أربعة هى 1010 أى هيكسا A و الثلاثة التالية هى وضع الثلاث أطراف بذات اللون و المسماة A0,A1,A2 على متكاملة الذاكرة و هكذا تختار واحدة من ثمانية يمكن وضعها على الخط. أما لو قطعة من نوع آخر مثل ساعة أو غيرة سيكون لها عنوان مختلف من 7 بت أيضا. و البت الثامنة لو 1 تعنى قراءة للمتحكم ولو صفر تعنى كتابة فى القطعة. و هنا أذكر بالمبدأ المتكرر لو تلف ماذا يحدث، على هذا الطرف مقاومة 5 كيلو للموجب أى ستفرض 1 أو قراءة حتى لا تكتب بالخطأ و تفسد ما عليها. البت التاسعة ACK و بعد ذلك تتوالى البيانات ببساطة حتى نبضه توقف Stop كما يلى.

عندما تريد الكتابة سترسل بايت التحكم بعد نبضة البدء و فيها البت 8 = صفر أى تريد الكتابة و هنا تستجيب الوحدة بنبضة ACK ثم ترسل بايت بها العنوان حيث تريد الكتابة فترد القطعة ثم ترسل بايت لتكتبها أو أكثر من بايت متتالية بحد أقصى صفحة واحدة وهذا الصفحة تختلف يحسب رقم الذاكرة من2 إلى 8 بايت (ارجع للداتاشيت ) ثم ترسل Stop فتتولى القطعة الكتابة و ترسل ACK عند انتهائها من الكتابة.
لو تريد كتابة بايت واحدة فقط ارسل بعدها Stop و رغم أن الكتابة التالية ستكون فى العنوان التالى إلا أن نسق الوحدة هو أن ترسل بعد كل أمر كتابة عنوان ثم البيانات. لذا قد يكون من الأفضل أحيانا أن تجمع بيانات صفحة كاملة قبل البدء فى الكتابة.

لو تريد القراءة سترسل Start ثم بايت تحكم فيها بت 8 = 1 قراءة فتستمر فى القراءة حيثما كنت. هذا بالطبع ليس دوما مرغوبا لذا يمكنك أن تبدأ بايت تحكم مع كتابة ثم تكتب عنوان حيث تريد بدء القراءة ثم Start مرة أخرى دون الحاجة لإرسال Stop مع بايت أمر قراءة فتقرأ حيث حددت المكان. و هكذا تقرأ بلا حدود فإن شئت تغيير العنوان لتقرأ من مكان آخر ضع Start أخرى مع كتابة عنوان جديد أو تضع Stop لإنهاء العملية.

المرة القادمة إن شاء الله سنضع كود اسيمبلى لعائلة C51 تستخدمه حيث تريد



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