منتديات الالكترونيات العصرية  
yoursite.com page title .

استرجاع كلمة المرور طلب كود تفعيل العضوية تفعيل العضوية
العودة   منتديات الالكترونيات العصرية > منتدى الحاكمات الدقيقة Microcontroller > منتدى المتحكمات ميكرو بلغة الاسمبلي

  #61  
قديم 08-02-2018, 07:12 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

رغم أنه من الممكن إعلان الوظائف و كتابتها لاحقا كأن نقول
كود:
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 فهو أمر وإلا فهو عدد

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

التعديل الأخير تم بواسطة ماجد عباس محمد ; 08-02-2018 الساعة 08:15 AM
رد مع اقتباس
  #62  
قديم 08-03-2018, 08:01 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

كود البرنامج
كالمعتاد نبدأ بالعنوان ثم تعريف المنافذ كمداخل أو مخارج و تصفير الوقت ثم عرضه. يلى ذلك إلغاء مقاومات الجذب العلوى ثم تحديد أنواع المقاطعة و استجابتها حافة الخ. و تهيئة باقى أعلام المقاطعة.
بعد ذلك نقرأ مع الفحص فى دورة حتى يأتى الرقم ثم نكرر ما سبق تماما ، نضيفه كثوانى ثم نكرر فإن كان أمر ننتقل للفحص أو نضرب ما سبق فى 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; } } }
هكذا نكون قد شرحنا الميكرو ويف بالميكرو من الأنواع الثلاثة و باللغات الثلاثة. المرة القادمة إن شاء الله نبدأ برنامجنا الأخير وهو التحكم فى سرعة موتور تيار مستمر ما لم يجد جديد
رد مع اقتباس
  #63  
قديم 08-04-2018, 08:14 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي التحكم فى سرعة موتور تيار مستمر

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

لماذا التحكم فى موتور تيار مستمر؟ ببساطة للحاجة لقياس فولت أو تيار أو كلاهما و من ثم نستخدم 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 أمبير مثلا.

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

مما سبق لو الحمل ثابت لا يتغير و مصدر التغذية ثابت لا يتغير لمدى أقصى تيار للموتور فيمكن بتغيير عرض النبضة التحكم فى سرعة الدوران لكن لو الحمل متغير و المصدر لا يثبت جهد الخرج على المدى كاملا فهذا غير مجدى ولابد من تثبيت السرعة بالتغذية العكسية أو تثبيت الفولت على طرفى الموتور بوسائل أكثر دقة من عرض النبضة.
هكذا فهمنا أول عنصر فى المنظومة و لنستوعب بعد ذلك تعديل عرض النبضة .
الصور المرفقة
نوع الملف: png DC_motor00.png‏ (25.2 كيلوبايت, المشاهدات 27)
رد مع اقتباس
  #64  
قديم 08-05-2018, 08:12 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

تعديل عرض النبضة 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 وهذا يمد الحمل بالتيار و عند حد معين نجعل الطرف = صفر وهذا يوقف التيار.
حسنا ماذا يحدث لو لم يستجيب المتحكم و كلنا نعلم انه قد يغيب فى دورة لا نهائية و لا أدعى خطأ منك فى البرمجة ولكن قد تدخل نبضة ما من مصدر ما فتربك تنفيذ ألتعليمه الحالية، هنا قد يتوقف فجأة وهذا قد يكون خطرا، و الأسوأ أن تفتح الطاقة ولا تقفل فلا يتحكم فيها فلا ننسى أن الأوساط الصناعية معروفة بأنها عالية الضوضاء – لا أقصد الصوت فقط ولكن ضوضاء النبضات و التداخلات الكهرومغناطيسية عامة ، وهنا دور كلب الحراسة أو مؤقت الحراسة وهو موضوعنا القادم إن شاء الله
الصور المرفقة
نوع الملف: png PWM-555.png‏ (2.3 كيلوبايت, المشاهدات 29)
نوع الملف: jpg PWM-555-opamp.jpg‏ (15.6 كيلوبايت, المشاهدات 28)
نوع الملف: jpg PWM-Opamp.jpg‏ (11.3 كيلوبايت, المشاهدات 26)
رد مع اقتباس
  #65  
قديم 08-06-2018, 08:00 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي مؤقت الحراسة 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 ميجا. ومن ضمن الإضافات التى أتاحها هذا المتحكم أن العداد يمكنه عمل ريسيت داخلى فقط أو يمكنه أن يظهر على طرف الريسيت الخارجى ليؤدى الوظيفة على كافة البوردة الخارجية.

المرة القادمة إن شاء الله نكمل النوعين الآخرين
الصور المرفقة
نوع الملف: jpg WDT-4060.jpg‏ (28.4 كيلوبايت, المشاهدات 26)
نوع الملف: png WDT-reg-C51-5952.png‏ (2.0 كيلوبايت, المشاهدات 27)
نوع الملف: png WDT-reg-C51-time.png‏ (2.0 كيلوبايت, المشاهدات 26)
رد مع اقتباس
  #66  
قديم 08-07-2018, 08:07 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

مؤقت الحراسة فى متحكمات 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 وهى تمثل نقطة الأصل التى يبدأ عندها العد و ترتيب الكود أو نبضة أخرى لتحديد اتجاه الدوران و لذا فهو مكلف و يستخدم فى هوائيات الرادار و كثير من الأجهزة الدقيقة المكلفة. لذا نستخدم هنا مقياس سرعة و ليس إنكودر.

و لكى نقيس الخرج لنعرف المطلوب و ما يحدث علينا بالمحول ألتماثلى الرقمى وهو موضوعنا القادم إن شاء الله
الصور المرفقة
نوع الملف: png WDT-reg-AVR.png‏ (2.2 كيلوبايت, المشاهدات 24)
نوع الملف: jpg TachoDigital.jpg‏ (43.2 كيلوبايت, المشاهدات 24)
رد مع اقتباس
  #67  
قديم 08-08-2018, 08:29 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

المحول التماثلى الرقمى
هناك أنواع مشروحة فى سلسلة الدوائر الرقمية ولكن هنا نهتم بما هو موظف فى وحدات الميكرو و المسمى 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
الصور المرفقة
نوع الملف: png SA_ADC_block_diagram.png‏ (1.8 كيلوبايت, المشاهدات 24)
نوع الملف: png POT 10T.png‏ (1.6 كيلوبايت, المشاهدات 24)
رد مع اقتباس
  #68  
قديم 08-09-2018, 07:39 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

الذاكرة الغير متطايرة 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 تستخدمه حيث تريد
الصور المرفقة
نوع الملف: png EEPROM01.png‏ (723 بايت, المشاهدات 24)
نوع الملف: png I2Cstart-stop.png‏ (3.8 كيلوبايت, المشاهدات 25)
نوع الملف: png I2Cslave-adress-allocation.png‏ (1.6 كيلوبايت, المشاهدات 25)
نوع الملف: jpg I2CWrite.jpg‏ (25.6 كيلوبايت, المشاهدات 24)
نوع الملف: jpg I2CRead.jpg‏ (22.5 كيلوبايت, المشاهدات 27)
رد مع اقتباس
  #69  
قديم 08-10-2018, 08:38 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

كود اسيمبلى لقراءة وحدة I2C :
الوحدة تحتاج ثلاثة برامج فرعية Sub واحد لقراءة بايت و تستخدمه لأى عدد وهو يتطلب تحديد عنوان البدء لذا نضع رابع لتحديد البدء.
إذن هنا نبدأ بالتعريفات و يجب ملاحظة أنها قد تتشارك مع كثير من التعريفات المطلوبة لباقى الكود وليست بالضرورة تتخصص لقراءة وحدات I2C .أول تعريف قد يكون مفيدا لكثير من المبرمجين و يوفر كثير من الوقت و الكود. تعريف HW_Err حيث يخصص خانة من الذاكرة باسم أعطال المكونات وهى تستطيع أن تحوى بيانات 8 أجهزة و بتعليمه وضع صفر يكون الكل بخير و يلى ذلك تعريف كل بت منهم باسم أخر كقولنا مثلا
MemErr = HW_ERR.0
ADCErr=HW_ERR.1
الخ ثم SETB تعرف أن هذه القطعة لا تعمل و من ثم لاحقا لديك الأمر JB لتضع رسالة خطأ مناسبة للمستخدم. لو تركت هذا للمترجم سيخصص بايت كاملة لكل بت منهم أى 8 بايت.

كود:
; Definitions

;HW_Err		EQU	20h
Dev_Add		EQU	21h
ByteCount	EQU	22h
BitCount	EQU	23h
PgAddress	EQU	24H		
AckDel		EQU	25h
DelTime1	EQU	26h
DelTime2	EQU	27h

SDA		EQU	P0.2		; Mem
SCL		EQU	P0.3
يلى ذلك تعريف Dev_Add أى عنوان القطعة و يمكنك تخصيص مكان فى الذاكرة كما هو مكتوب أو تكتفى بأن تضعه فى المراكم A و تنفذ ما شئت فقط لا تنسى أن تغير التعريف أو التعريف و الكود حسب المترجم لديك.
تعريف ByteCount فقط ليذكرك كم بايت كتبت من الصفحة Page لو ستكتب صفحة كل مرة. تعريف BitCount يمكنك حقيقة استبداله بأى متغير متاح لديك فالفكرة أن البايت بها 8 بت و انت تحتاج لعدهم وهنا للتوضيح فقط خصص لها مكان فى الذاكرة لكن يمكنك استخدام مسجل من 0 إلى 7 أو أى خانة تسميها Count تعد بها كل الدورات الموجودة فى البرنامج.
PgAddress أيضا مجرد خانة لتحفظ فيها أين تريد بدء الكتابة داخل الوحدة.
AckDel لو تستخدم قطع كثيرة متنوعة على ذات الخط قد يختلف زمن انتظار الرد ACKNOWLEDGE من طراز لآخر وقد تحتاج أن تجعل الزمن متباين و إلا يمكنك استخدام رقم ثابت و نستغنى عنه.
DelTime1,2 خانتان لعد زمن تأخير سواء قليل حتى اكثر من 256 أو اكثر حتى اكثر من 65536 بهما معا و يمكنك دمجهما مع أى خانات مخصصة لما يسمى Scratch Pad أو كشكول المسودة حيث تحسب أشياء وقتية.
SDA,SCL مطلوبان للنظام.
كود:
Mem_Init:				;  RESET ATMEL memory, a dummy write
;	MOV	HW_ERR,#0		; Clear all errors
	ACALL	MemStart		; the 24C01 reply erroneously IF uP is reset, and needs write cycle
	MOV	A,Dev_Add		; Device address 1010,page 000 and write bit
	ACALL	WriteMemByte
	ACALL	SendPgAdd
	ACALL	MemStop
	ACALL	Wait_10ms
	RET
	
CalcMemAdd:			; Calculates Page Address by PageNu in A * 8
	MOV	B,#8
	MUL	AB
	MOV	PgAddress,A
	RET
الكود التالى خاص بالذاكرة 24C01 من إنتاج أتميل فقط حيث بعد ريسيت قد لا تستجيب كما يجب لذا يجب تهيئتها باستخدام دورة كتابة كاذبة بطلب كود البدء MemStart ثم نضع العنوان 1010000 و بت كتابة ثم نرسل الأمر و نختار صفحة مثلا صفر و نرسله و نرسل نبضة إيقاف MemStop و ننتظر 10 مللى ثانية.
الكود التالى يمكنك الاستغناء عنه فقط احسب العنوان كما تشاء و حسب ما لديك من عتاد.
كود:
MemStart:			; Send start code, ret w/ SCL,SDA low
	SETB	SDA
	NOP
	SETB	SCL
	ACALL	Wait_9
	CLR	SDA		; Start 
	ACALL	Wait_9
	CLR	SCL		; ready for clock
	ACALL	Wait_9
	RET
يلى ذلك كود إرسال نبضة البدء حيث يجب أن يكون SDA,SCA=1 ثم بعد ذلك ينتقل SDA للصفر. النبضة Clock يجب أن تكون صاعدة لذا و حال SDA=صفر ننقل SCL = صفر فى انتظار النبضة. السبب فى هذا أنك لو أردت قراءة 100 بايت مثلا لن تحتاج Start أخرى مادام العنوان متتالى و تحتاجه فقط عند تغيير العنوان.
يلى ذلك إرسال نبضة MemClk و إرسال توقف MemStop
كود:
MemClk:
	ACALL	Wait_9
	SETB	SCL
	ACALL	Wait_9
	CLR	SCL
	ACALL	Wait_9
	RET
	
MemStop:
	CLR	SCL		; just in case , prepare for stop
	NOP
	CLR	SDA		; Ready for stop
	NOP
	SETB	SCL	; Command mode
	ACALL	Wait_9
	SETB	SDA	    ; Stop
	ACALL	Wait_9
	CLR	SCL		; End of Command mode
	RET
إرسال نبضة MemClk يبدأ بوضع SCL=1 ثم إعطاء الوقت الكافى ثم إعادته للصفر و أيضا إعطاء الوقت الكافى و إرسال توقف MemStop رغم أننا مفترض أن نأتى و SCL=صفر ولكن احتياطيا نجعله بصفر ثم وقت ثم SDA=صفر و انتظار وهنا نجعل SCL=1 ليترجم الطرف الآخر كأمر و ننتظر ثم نضع SDA=1 كأمر بالتوقف ثم ننتظر و أخيرا نضغ SCL = صفر حتى لا يترجم مزيد من الأوامر.
أول ما نحتاجه هو كتابة بايت لتحديد البداية وهذا موضوعنا القادم إن شاء الله
رد مع اقتباس
  #70  
قديم 08-11-2018, 08:20 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,435
معدل تقييم المستوى: 27
ماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant futureماجد عباس محمد has a brilliant future
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

أول ما نحتاجه هو كتابة بايت لتحديد البداية و كما ذكرنا فنعد 8 بت فى خانة أو مسجل أو ما تريد تسميته BitCount ولو لديك متغير باسم Cntr مثلا تعد به كل ما تحتاجه فلا بأس ثم تستخدم الأمر RLC A وهو Rotate Left through Carry وهو ببساطة يزيح كل البتات فى المراكم A يسارا خطوة واحدة و البت 7 تذهب إلى C و ما كان فى C يذهب إلى بت صفر فى A و السبب أننا لا نستطيع نقل بت من المنافذ أو الذاكرة إلا لخانة C و منها فقط. لذا طبيعى أن تكون الخطوة التالية هى MOV SDA,C حيث تنقل البت إلى طرف SDA . نستخدم Left لكى ننقل البت العليا أولا كشروط نظام I2C و مقابلها RRC وهى لليمين. بعد ذلك نطلب الأمر MemClk لإعطاء نبضة ثم ننقص عدد البت واحد و نقفز لنكرر باقى 8 بت وهنا لا نعطى بدء Start ولا توقف Stop فقد نحتاج إرسال بايت جديدة.
الآن لدينا بت قادمة من القطعة تقول ACK و قد اعتمدت حقيقة طريقتين مختلفتين فيما نفذت من برامج:
الأولى أن افحصها مرة واحدة فى البدء أثناء التهيئة فإن لم تأتى أعطى رسالة خطأ و أتوقف و إن كانت موجودة فهى بخير و أفترض سلامتها طوال وقت التشغيل مكتفيا بإعطاء نبضة لترد بنبضة ACK ولا أقرأها ولا أفحصها و هذا أوفر قليلا فى الكود و السرعة و يناسب الأجهزة التى تغلق و يعاد تشغيلها كثيرا لكنه لا يناسب الخدمة الشاقة حيث تعمل 24 ساعة وبدون رقابة فقد تعطل و يظل الجهاز يعمل على خطأ بلا توقف و ليست ذاكرة فقط ولكنها قد تكون ساعة وقت حقيقى أو مقياس حرارة أو غيره وهنا وجب أن التزم بالكتاب كما يقولون و أختبرها آخر كل بايت لأتأكد من وجودها بخير.

كود:
WriteMemByte:			; Writes 8 bit in A to mem and reads ack then back, no Stop
	MOV	BitCount,#8
	WMB00:
	RLC	A			; MSD first
	MOV	SDA,C		; put data, setup delay in MemClk
	ACALL	MemClk		; clock it 3 wait loops in clk
	DJNZ	BitCount,WMB00
	ACALL	ReadEEAck
	RET


ReadEEAck:
	ACALL	Wait_9
	SETB	SDA		; make it input
	ACALL	Wait_9	
	SETB	SCL		; Start Clk
	MOV	AckDel,#0
	RAloop:
	JNB		SDA,EndAck
	ACALL	Wait_9
	DJNZ	AckDel,RAloop
;	CLR	ERRLED
	EndAck:
	CLR	SCL			; end clk
	NOP
	SETB	SDA		; Make it input again
	ACALL	Wait_9
	RET
هذا كود قراءة نبضة "اعلم" وهى أن تقول القطعة "تمام أو علم و جارى التنفيذ" و هذه إحدى الطرق و لو لديك مؤقت خالى يمكنك استخدامه فى انتظارها و الفكرة ننتظر قليلا لاستيعاب ما سبق ثم SDA=1 و تنتظر الاستيعاب و SCL=1 ثم تنشئ دورة من 256 لفه و تفحص لو SDA = صفر إذن وصلت المعلومة فنقفز خارج الدورة و إلا نكرر فإن نفذ العد يمكنك أن ترفع علما بحدوث خطأ أو عطل و تسجله فى بايت الأخطاء و تنير ليد أيضا أو تكتب رسالة الخ.
لو خرجت من الدورة مبكرا يعنى أنها سليمة و يمكنك استئناف العمل.
الآن لنكتب فى القطعة نحتاج أن نرسل لها أمر كتابه يشمل عنوان تعريف القطعة (أى واحدة هى المعنية بهذا التخاطب) ثم عنوان الكتابة الفعلى داخلها ثم ترسل بعدها ما نريد كتابته من بيانات . هذا الكود يمكنك أن تستخدمه منفصلا أو غالبا من خلال الكتابة المتعددة.

كود:
SendPgAdd:				; send start Mem page adress from location PgAddress, no stop 
	ACALL	MemStart		; send start command
	MOV	A,#10100000b		; Device address 1010,page 000 and write (0) bit 
	ACALL	WriteMemByte
	MOV	A,PgAddress		; Get EE address
	ACALL	WriteMemByte
	RET
هذا الكود لإرسال المطلوب فنبدأ بنبضة بدء Start ثم عنوان القطعة وهو هنا ثابت لكنك تستطيع تعرف خانة باسم Dev_Add تضع فيها عنوان أى قطعة تود محادثتها و تغير هذه الخطوة إلى MOV A,Dev_Add ثم تطلب كود WriteMemByte السابق شرحه لإرساله للقطعة ثم تضع فى A العنوان ألذى تود الكتابة عنده ثم تطلب الكود مرة أخرى لإرساله ثم نعود أيضا بدون Stop .
الآن هذا الكود يمكننا كتابة صفحة كاملة من 8 بايت بتحديد 8 بايت كما فى القراءة و لكن احذر يجب أن تكون فى عداد آخر لذا سميت الأول عداد البت و الثانى عداد البايت لأن كل بايت ستستخدم عداد البت ذاتيا لعد 8 بت.
الآن بعد تجهيز عداد 8 بت ترسل باستخدام الكود السابق عنوان القطعة ثم عنوان الكتابة و نعود هنا بدون Stop . و الآن ستكون قد جهزت الثمانية بايت فى مجموعة من 8 خانات متتالية فى أى مكان فى الذاكرة تختاره مثلا 41 أو ما شئت أفضل البدء برأس العد مثل 40 فيكون من 40 إلى 47 و هنا أضع 40 فى المسجل R0 و المسجلان R0,R1 بهما خاصية أنك تستطيع استخدام محتوى أي منهما كعنوان لذا نضع 40 وهى تشير لأول بايت و من ثم فالأمر MOV A,@R0 تجعله يأخذ خانة الذاكرة المشار إليها بالمسجل R0 فالعلامة @ هذه تعنى "غير مباشر" أى المحتوى عنوان البيان و ليس البيان ذاته. أخذنا أول بايت فى A ثم نطلب كود WriteMemByte السابق شرحه لإرساله للقطعة ثم نزود R0 بواحد فيحتوى 41 و يشير للبايت الثانية ثم ننقص العداد بواحد و نقفز لو لا يساوى صفر للتكرار.
أعلم أنك تقول أن هنا خطوات زائدة فبدلا من إنقاص عداد فضلا عن استخدامه أصلا كان من الممكن مقارنة R0 بنهاية العنوان 47 وهذا صحيح 100% عندما تتعامل مع قطعة واحدة لا تحتاج تجهيز أكثر من مصفوفة بيانات واحدة لكن لو لديك ذاكرتين لنوعين من البيانات أو حتى صفحتين مختلفتين أو ذاكرة مع ساعة أو وظيفة أخرى فستختلط الأمور.
بعد إكمال الصفحة نرسل Stop و نتوقف 10 مللى ثانية لضمان الكتابة و لو لديك شيء ما أفضل من دورة إضاعة الوقت كتحديث للشاشة أو قراءة ADC أو غيره فالأفضل قضاء الوقت فيما هو مفيد فلا يؤثر ذلك على القطعة طالما المتحكم بعيدا عن أوامر I2C.
كود:
     
Write2Mem:	; Writes 8 memory locations to EEprom add in PgAddress from RAM in R0
	MOV	ByteCount,#8		; loop counter, 8 bytes
	ACALL	SendPgAdd		; start adress and ack
	W2m:
	MOV	A,@R0			; get byte
	ACALL	WriteMemByte
	INC	R0			; Point 2 next
	ACALL	Wait_9	
	DJNZ	ByteCount,W2m
	ACALL	Wait_9
	ACALL	MemStop
	ACALL	Wait_10ms		; Write wait time
	RET
لا جدوى من الكتابة ما لم نستطيع القراءة وهو موضوعنا القادم إن شاء الله
رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)

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

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة



الساعة الآن 12:07 AM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
الحقوق محفوظة لمنتديات الاليكترونيات العصرية

Security team

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77