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

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

  #41  
قديم 07-12-2018, 09:01 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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
افتراضي الغسالة باستخدام c51 و لغة c

الغسالة باستخدام C51 و لغة C:
للأسف لا يوجد مصدر آخر سهل سوى ميكروإلكترونيكا لذا لا مقارنة سوى بين اللغتين و أتميل لها أتميل استوديو لكنه كبير جدا و ثقيل على الحاسب و سنبدأ بالبيزك و نحوله إلى C
سنبدأ بالتعريفات وكانت
كود:
' DEFINITIONS
Leds Alias P0 : Relays Alias P1 : Switches Alias P2 : Controls Alias P3
Fullled Alias Leds.0 : Halfled Alias Leds.1 : Smallled Alias Leds.2
Hotled Alias Leds.3 : Mildled Alias Leds.4 : Coldled Alias Leds.5
Wateron Alias Relays.0 : Drainon Alias Relays.1 : Heateron Alias Relays.2
Motoron Alias Relays.3 : Run_nspin Alias Relays.4 : Waterfull Alias Relays.5
Waterempty Alias Relays.6 : Dooropen Alias Relays.7 : Midtemp Alias Switches.0
Hitemp Alias Switches.1 : Cold Alias Switches.2 : Mild Alias Switches.3
Hot Alias Switches.4 : Small Alias Switches.5 : Half Alias Switches.6
Full Alias Switches.7 : Run Alias Controls.1

' VARIABLES
Dim Runtime As Word
Jobpending Alias Psw.5
Dim Rinse As Byte , Cntr As Byte
Emergency:
      Goto Begin
Counttime:
     Decr Runtime
     If Runtime = 0 Then
        Reset Jobpending
         Stop Timer0
     End If
     Return
قد تظن أنك تستطيع أن تعرف المنافذ أولا ثم تستخدمها فى تعريف الأطراف بعد ذلك كما فعلنا فى البيزك لكن لا ليس هنا، ستحصل على رسالة غريبة جدا أن المتوقع هو متغير عام Global Variable و لكنه وجد "مثلا" Leds ولا تسألنى لماذا لا يعتبر التعريف السابق للمنفذ Leds من النوع Global بينما هو يستخدمه استخدام عام و شامل فى كل البرنامج أى Global ولذا سنستخدم دوما اسم المنفذ و أصبحت بعد تعريف كل منها كمتغير
كود:
// DEFINITIONS
char Leds at P0 ;
char Relays at P1 ;
char Switches at P2 ;
char Controls at P3 ;
sbit Fullled at P0_0_bit ;
sbit Halfled at P0_1_bit ;
sbit Smallled at P0_2_bit ;
sbit Hotled at P0_3_bit ;
sbit Mildled at P0_4_bit ;
sbit Coldled at P0_5_bit ;
sbit Wateron at P1_0_bit ;
sbit Drainon at P1_1_bit ;
sbit Heateron at P1_2_bit ;
sbit Motoron at P1_3_bit ;
sbit Run_nspin at P1_4_bit ;
sbit Waterfull at P1_5_bit ;
sbit Waterempty at P1_6_bit ;
sbit Dooropen at P1_7_bit ;

sbit Midtemp at P2_0_bit ;
sbit Hitemp at P2_1_bit ;
sbit Cold at P2_2_bit ;
sbit Mild at P2_3_bit ;
sbit Hot at P2_4_bit ;
sbit Small at P2_5_bit ;
sbit Half at P2_6_bit ;
sbit Full at P2_7_bit ;
sbit Run at P3_1_bit ;

sbit Jobpending at F0_bit ;
unsigned short Rinse ;
unsigned short Cntr ;
unsigned Runtime ;

void External_Interrupt() org IVT_ADDR_EX0 {
   asm ajmp 0 ;
}

void Timer0_Interrupt() org IVT_ADDR_ET0 {
   if ( --Runtime = 0 ){		//  End of time
      Jobpending = 0 ;		// Clear Flag
      TR0_bit = 0 ; 		 // stop timer 0
      } }

void main() {
Begin:
بعد التعريفات تأتى تسمية المقاطعة بطريقة ميكروإلكترونيكا و أضاف لها لغة السى عدم التعرف على العنوان Begin لكونه لاحقا لذا اضطررت لاستخدام الأسيمبلى.
فى كود المقاطعة الثانى الخاص بالطوارئ أى المقاطعة الخارجية نجد ألتعليمه
كود:
if ( --Runtime = 0 ){ 
وهى للمبتدئ تعنى ما يلى على خطوتين
Runtime = --Runtime 
if (Runtime = 0) {
و السطر الأول علامتى السالب يعنى انقص من المتغير التالى وهو هنا Runtime واحد أما لو كانا على يمين المتغير سيكون معناها انقص واحد لكن ليس الآن أى بمعنى لو كان بها 5 مثلا فكلمة IF سيكون على الخمسة و بعد القرار ستصبح 4 و الفرق لو بها 1 لو العلامات سابقة، سيصبح صفر ثم نسأل هل = صفر أم لا لكن لو على اليمين سنسأل أولا و الإجابة لا فننقص و ننفذ . لاحظ أيضا أن IF غير معروفة بينما if معروفة و كل الأوامر بالأحرف الصغيرة.
يلى ذلك جزء التعريفات و كما سبق مع ميكروإلكترونيكا سنحتاج تهيئة العدادات يدويا فالتعليمة Config غير مدعومة
أى أن هذا الكود التالى سيصبح كما سيلى بعد التعديل

كود:
Begin:
    Config Timer0 = Counter , Mode = 2 , Gate = Exteral
    Th0 = 205                                                 ' Auto reload
    Tl0 = 205
    Tcon = 1
    Enable Interrupts
    Enable Int0
    Leds = &B11011011                                         ' Reset All PORTS! select Small cold cycle
    Relays = 255
    Switches = 255
    Controls = 255
    On Int0 Emergency , Nosave
    On Timer0 Counttime
Loopagain:
   Do
   Bitwait Run , Set                                         ' Run button release
    If Full = 0 Then
       Leds = Leds Or &B00000111 : Reset Fullled
       Elseif Half = 0 Then
            Leds = Leds Or &B00000111 : Reset Halfled
       Elseif Small = 0 Then
            Leds = Leds Or &B00000111 : Reset Smallled
    End If

    If Hot = 0 Then
       Leds = Leds Or &B00111000 : Reset Hotled
       Elseif Mild = 0 Then
          Leds = Leds Or &B00111000 : Reset Mildled
       Elseif Cold = 0 Then
             Leds = Leds Or &B00111000 : Reset Coldled
    End If
    until Run = 0                                ' Wait Run Press
الكود السابق أصبح بعد تغيير Enable,Config,Bitwait , Elseif لاحظ أيضا أن كلمة OR و التى تعنى وظيفة "أو" المنطقية ستستبدل بالرمز "|” و الوظيفة "مع" AND تستبدل بالرمز & أما العكس NOT فأصبح " ~ “ أجل هذه العلامة التى نستخدمها لتعنى "تقريبا يساوى أو يساوى بالتقريب" و ما يزيد الأمور إرباكا أنها على مستوى البت فقط أما XOR فتصبح ^ و هنا أحذر من أن هذه العلامة تعنى فى كثير من الحالات رفع للأس حيث 10^2 = 100 و فى حساب Boolean تزاوج العلامات فمثلا AND boolean تصبح && و "أو" OR تصبح || و العكس NOT تصبح" !” علامة التعجب أما XOR فبحثت على النت ولم أجد لها جواب – أعانك الله على الحفظ
فى البيزك عموما هى غير مدعومة لكن فى المترجمات الخاصة الوحدات المتقدمة مثل AVR فالكل يقول مدعومة ولا يذكر كيف، و الأفضل عملها يدويا

كود:
void main() {
Begin:
     IE = 0B10000011 ;        //Enable T0 & INT0 external
     TH0 = 205 ;                   //Auto reload
     TL0 = 205 ;                    // Start Value
     TMOD = 0b00000110 ;
     TCON = 1 ;                    // Clear All interrupts, Set INT0 Edge trigger
     SP = 70  ;                        // Move stack away
     Leds = 0b11011011 ;     //Reset All PORTS! select Small cold cycle
     Relays = 255 ;
     Switches = 255 ;
     Controls = 255 ;
     EA_bit = 1 ;                 // Enable Interrupts
     do {
     } while (Run = 0) ;       //  Run button release
Loopagain:
  do {
    if (Full = 0) {
       Leds = Leds | 0B00000111 ;
       Fullled = 0 ;
        }
    else
       if (Half = 0) {
            Leds = Leds | 0B00000111 ;
            Halfled = 0 ; }
       else
          if (Small = 0) {
            Leds = Leds | 0B00000111 ;
            Smallled =0 ;         }

    if (Hot = 0) {
       Leds = Leds | 0B00111000 ;
       Hotled = 0 ;
       }
       else if (Mild = 0) {
          Leds = Leds | 0B00111000 ;
           Mildled = 0 ;
          }
       else if (Cold = 0 ) {
             Leds = Leds | 0B00111000 ;
               Coldled = 0 ;
             }
   } while ( Run = 1 ) ;             // Wait Run Press
أظن أن التحويل أصبح نمطيا و تكراريا و يمكن تكملة الباقى وهو
كود:
 Bitwait Dooropen , Reset                                     ' Wait Door to close
 Reset Wateron                                                ' Fill with water
 Bitwait Waterfull , Reset                                    ' Wait full Tank
 Set Wateron                                                  ' Close water Valve

 If Coldled = 1 Then                                          ' not Cold then
    Reset Heateron                                            ' Heater on
    If Mildled = 0 Then Bitwait Midtemp , Reset Else Bitwait Hitemp , Reset
    Set Heateron                                              ' Turn off heater
 End If                                                       ' Now Start Washing

 If Fullled = 0 Then
     Runtime = 20 * 60
   Elseif Halfled = 0 Then
     Runtime = 480
   Else
     Runtime = 300
 End If


Runmotor:
    Set Jobpending                                            ' Timing flag
    Reset Motoron                                             ' Start Motor
    Start Timer0                                              ' Start Timer/Counter
    Bitwait Jobpending , Reset                                ' Wait to Finish
    Set Motoron                                               ' stop motor
    For Cntr = 1 To Rinse
       Reset Drainon                                          ' Open Drain
       Bitwait Waterempty , Reset                             ' Wait Drain
       Set Drainon                                            ' Close Drain
       Reset Wateron                                          ' Fill again
       Bitwait Waterfull , Reset
       Set Wateron                                            ' Close Water
       Runtime = 300                                          ' 1St Rinse
       Set Jobpending
       Reset Motoron                                          ' Start Rinse
       Start Timer0                                           ' Start Timer
       Bitwait Jobpending , Reset                             ' Wait to Finish
       Set Motoron                                            ' Stop Rinse
    Next

 Reset Drainon                                                ' Open Drain
 Bitwait Waterempty , Reset                                   ' Wait Drain
 Runtime = 180                                                ' SPIN
 Set Jobpending
 Reset Motoron                                                ' Start Rinse
 Reset Run_nspin                                              ' SPIN
 Start Timer0                                                 ' Start Timer/Counter
   Bitwait Jobpending , Reset                                 ' Wait to Finish

  Relays = 255                                                ' ALL OFF, INITIAL State
  Controls = 255

 Goto Loopagain

      End
سيصبح هكذا ، نلاحظ هنا أن دورة do-while يمكن اختصارها لأمر while فقط كما سيلى بعد Runmotor

كود:
   do{
 	  } while (Dooropen = 1 ) ;       // Wait Door to close
 	  Wateron = 0 ;                         // Fill with water
   do{
 	  } while ( Waterfull = 1 );      // Wait full Tank
   Wateron = 1 ;                                    //  Close water Valve

   if (Coldled = 1) {                               // not Cold then
          Heateron = 0   ;  }                      // Heater on
          if (Mildled = 0) {
              do {
               } while ( Midtemp = 1 ) ; }
          else {
              do {
               } while ( Hitemp = 1 ) ;
                    }
        Heateron = 1 ;                                // Now Start Washing

     if ( Fullled = 0 ) {
         Runtime = 20 * 60  ; }
     else  {
            if ( Halfled = 0 ) {
               Runtime = 480   ; }
            else {
               Runtime = 300 ; }
            }
            
// Runmotor:
   Jobpending = 1 ;                		  // Timing flag
   Motoron  = 0 ;                    		  // Start Motor
   TR0_bit = 1 ;                   		  // start timer 0
    while ( Jobpending = 1 ) ;     	  // Wait to Finish
    Motoron  = 0 ;                   		  //  stop motor
    for ( Cntr = 0  ;  Cntr < Rinse  ; Cntr++ ) {
         Drainon =  0  ;           		  // Open Drain
         while ( Waterempty = 0 ) ;  	  // Wait Drain
         Drainon = 1  ;            		  // Close Drain
         Wateron = 0 ;            	             // Fill again
         while ( Waterfull = 0 ) ;  	             // Wait fill up
         Wateron = 1 ;             	             // close water valve
         Runtime = 300 ;           	             // Rinse time
         Jobpending = 1 ;          	             // timer flag
         Motoron = 0  ;            	              // Start Rinse
         TR0_bit = 1 ;              	              // start timer 0
         while ( Jobpending = 0 ) ;              // Wait to finish
         Motoron  = 1 ;              	              // Stop Rinse
    }
    Drainon = 0 ;                                        // Open Drain second cycle
    while ( Waterempty = 0 ) ;                  // Wait Drain
    Runtime = 180 ;                                   // SPIN time
    Jobpending = 1 ;                                  // timer flag
    Run_nspin  = 0  ;               		 // high speed
    Motoron = 0 ;                   		 // Start SPIN
    TR0_bit = 1 ;                    		 // start timer 0
    while ( Jobpending  = 1 ) ;     	 // wait end of time
    Relays = 255 ;                 		  // ALL OFF, INITIAL State
    Controls = 255  ;
     goto Loopagain ;

}
المرة القادمة إن شاء الله سنكررها باستخدام AVR و لغة البيزك
رد مع اقتباس
  #42  
قديم 07-13-2018, 09:08 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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 و لغة البيزك

الغسالة باستخدام AVR و لغة البيزك:
سنضع الدائرة لكى نرى ما إن كنا نحتاج أى من التعديلات وهذه هى

أولا سنحاول الحفاظ على الهيكل العام للدائرة و نستبدل المتحكم و أول ما نلاحظه أننا استخدمنا الترانزستورات NPN مع الريلايات 12 فولت لا لسبب سوى شيوع هذه الطريقة و خشيت أن أبقى على الطريقة القديمة مخافة الظن أن هذا ما يجب أن يكون بينما لك مطلق الحرية فى تبنى أى من الحلين ، و إثباتا لذلك سأبقيه مع الليدات.
لهذا فكل ما نحتاجه هو تعديل أوامر التحكم فى الريلايات من Set إلى RESET و العكس بالعكس. و ستجد ذلك فى الكود مشروحا للتذكرة .
ثانيا لم أوصل دائرة الريسيت و دائرة الكريستال لآن المتحكم يدعم الريسيت الداخلى و مذبذب م س داخلى و لك الحرية فى استخدامهما بدلا من المكونات الخارجية لتحقيق الوفر ، فقط من خيارات المبرمجة يجب أن تختار هذه الخيارات في مجموعة تسمى فيوزات من المبرمجة وليست فى البرنامج.
وجب هنا إيضاح نقطة أن هناك أشياء تبرمج بالكود و أشياء تبرمج أثناء عملية البرمجة و من خلال المبرمجة ذاتها و تسمى فيوزات لآنها تبرمج مع الكود لكن فى كثير من الأحوال ستحتاج لمبرمجة توازى لإلغاء وضع هذه الفيوزات و تغييرها أما المبرمجة التوالى و التى تناسب البرمجة فى البوردة فيمكنها عادة أن تفعل هذه الفيوزات لكنها أحيانا تكون غير قادرة على إعادته هذه الفيوزات لأصلها باعتبار أنها خيارات المصمم ولا يجوز تغييرها بواسطة المستخدم.
استخدام الفيوزات فى العائلتين لكن الفرق الوحيد أن وضع هذه الفيوزات فى ميكروتشيب تضبطه من المترجم وهو يتولى إنشاء ما يلزم لذلك أما فى أتميل فيجب اختيار الفيوزات من واجهة المبرمجة ذاتها و ليس من المترجم.
و أخيرا المقاطعات حيث يجب توصيل التايمر الخارجى للطرف المناسب وهو هنا المنفذ B الطرف صفر و كان عليه أحد الريلايات WaterOn أى فتح صمام المياه للملو و سنضطر لتوصيله لمكان آخر و نختار مثلا PORTA.6 (أو اختار ما يناسبك)
الآن سننقل كود بيزك باسكوم C51 إلى باسكوم AVR و نرى ما يحدث ، نفتح صفحة جديدة ثم من قائمة options نختار Compiler ثم Chip. يفتح لنا عدة خيارات تحدد منها نوع المتحكم و تردد الكريستال و بعض الأمور الأخرى مثل لو تستخدم شاشة LCD أو المنفذ التسلسلى الخ ثم اضغط على زر ADD TO CODE فسيضيف مجموعة التعليمات السابق الحديث عنها ثم ننسخ النص السابق.
أسماء المنافذ تغيرت من صفر -1-2 الخ إلى أحرف لذا سنغيرها إلى PORTA,PORTB الخ. أيضا كما شرحنا عن وجود PINA لقراءة الطرف و أخيرا DDRA لتحديد اتجاه المنفذ A و مثله لباقى المنافذ

مقاومة الانحياز لأعلى أو التعليق لأعلى PULLUP هنا عامة لكل طرف و ليست لمنفذ واحد كما فى ميكروتشيب و تصبح فاعلة بجعل الطرف (أو المنفذ) دخول ثم تكتب فيه 1 . لاحظ أنه كدخول تقرأ منه لا أن تكتب فيه لذا هذه الكتابة تذهب لمقاومة Pullup و متاحة لكل الأطراف فى كل المنافذ و كل طرف يتحكم فيه على حده بهذه الطريقة.
لكن ماذا لو تحسبا لظرف ما يجب ألا تتاح هذه المقاومات؟ هل سنعدل كافة المنافذ أم ماذا؟ كلا فهناك بت واحدة اسمها PUD اختصار Pull Up Disable فى مسجل اسمه SFIOR وهى غالبا معروفة دون الحاجة لاسم المسجل. وهذه البت عادة = صفر و عند تغييرها إلى 1 توقف عمل كافة المقاومات فى كل المنافذ.

عندما تضغط على زرار "صح" سيعترض على التعليمات الخاصة بالتايمر صفر فالقيم TH,TL,TCON لم تعد موجودة و تغيرت لتوسعة عمليات هذا المؤقت فقد شمل العد التصاعدى أو التنازلى و المقارنة بالصفر أو 255 أو قيمة أخرى فى مسجل آخر باسم OCR0 و هذه يمكن توجيهها لتوليد موجة بتعديل عرض PWM .
بيزك باسكوم لا يدعم خاصية PWM لتايمر صفر ذو 8 بت لكنه يدعمها لتايمر 1 ذو 16 بت بصورة أشمل، لذا لو شئت فيمكنك استخدام مجموعة أوامر لتهيئه تايمر صفر لهذا الغرض . عموما فى هذا التطبيق سنحتاج فقط عد النبضات لذا يكفينا التنسيق الذاتى المدعم من المترجم. قد تكون النسخة المسجلة عدلت هذه السمة ولكنى لم اشتريها بعد.
سنحذف الثلاث أسطر الخاصين بالتعليمات TH,TL,TCON و نستبدلها بالأمر TIMER0=205
وهكذا سيصبح البرنامج
كود:
$regfile = "m16adef.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32                                             ' DEFINITIONS

Leds Alias Porta : Relays Alias Portb : Switches Alias Portc : Controls Alias Portd
Fullled Alias Pina.0 : Halfled Alias Pina.1 : Smallled Alias Pina.2
Hotled Alias Pina.3 : Mildled Alias Pina.4 : Coldled Alias Pina.5
Wateron Alias Relays.0 : Drainon Alias Relays.1 : Heateron Alias Relays.2
Motoron Alias Relays.3 : Run_nspin Alias Relays.4 : Waterfull Alias Relays.5
Waterempty Alias Relays.6 : Dooropen Alias Relays.7 : Midtemp Alias Switches.0
Hitemp Alias Switches.1 : Cold Alias Switches.2 : Mild Alias Switches.3
Hot Alias Switches.4 : Small Alias Switches.5 : Half Alias Switches.6
Full Alias Switches.7 : Run Alias Controls.1

' VARIABLES
Dim Runtime As Word , Rinse As Byte , Cntr As Byte , Jobpending As Bit

Emergency:
      Goto Begin
Counttime:
     Decr Runtime
     Timer0 = 205
     If Runtime = 0 Then
        Reset Jobpending
         Stop Timer0
     End If
     Return

Begin:
    Config Leds = Input : Config Switches = Input : Config Controls = Input
    Ddrb = &B00011110
    Config Timer0 = Counter , Edge = Falling
    Timer0 = 205                                            ' Was Th0 = 205
'    Tl0 = 205
'    Tcon = 1
    Enable Interrupts
    Enable Int0
    Leds = &B11011000                                   ' Reset All PORTS! select Small cold cycle
    Relays = &B11100000                                 ' Set Pullups for pins5,6,7
    Switches = 255                                      ' Writing ones to input activates Pullup resistors
    Controls = 255 			' "  " "
    On Int0 Emergency , Nosave
    On Timer0 Counttime

    Bitwait Run , Set                                   ' Run button release
Loopagain:
 Do
  Do
    If Full = 0 Then
       Leds = Leds Or &B00000111 : Reset Fullled
       Elseif Half = 0 Then
            Leds = Leds Or &B00000111 : Reset Halfled
       Elseif Small = 0 Then
            Leds = Leds Or &B00000111 : Reset Smallled
    End If

    If Hot = 0 Then
       Leds = Leds Or &B00111000 : Reset Hotled
       Elseif Mild = 0 Then
          Leds = Leds Or &B00111000 : Reset Mildled
       Elseif Cold = 0 Then
             Leds = Leds Or &B00111000 : Reset Coldled
    End If
  Loop Until Run = 0                ' was If Run = 1 Then Goto Loopagain ' Wait Run Press

 Bitwait Dooropen , Reset                               ' Wait Door to close
 Reset Wateron                                          ' Fill with water
 Bitwait Waterfull , Reset                              ' Wait full Tank
 Set Wateron                                            ' Close water Valve

 If Coldled = 1 Then                                    ' not Cold then
    Set Heateron                                        ' was Reset Heateron 'Heater on
    If  Mildled = 0  Then  Bitwait Midtemp , Reset   Else   Bitwait Hitemp , Reset
    Reset Heateron                                      ' was Set Heateron ' Turn off heater
 End If                                                 ' Now Start Washing

 If Fullled = 0 Then
     Runtime = 20 * 60
   Elseif Halfled = 0 Then
     Runtime = 480
   Else
     Runtime = 300
 End If

' Runmotor:
    Set Jobpending                                      ' Timing flag
    Set Motoron                                         ' was Reset Motoron' Start Motor
    Start Timer0                                        ' Start Timer/Counter
    Bitwait Jobpending , Reset                          ' Wait to Finish
    Reset Motoron                            ' was Set Motoron ' stop motor
    For Cntr = 1 To Rinse
       Set Drainon                                 ' was Reset Drainon ' Open Drain
       Bitwait Waterempty , Reset                  ' Wait Drain
       Reset Drainon                               ' was Set Drainon ' Close Drain
       Set Wateron                              ' was Reset Wateron ' Fill again
       Bitwait Waterfull , Reset
       Reset Wateron                          ' was Set Wateron' Close Water
       Runtime = 300                            ' 1St Rinse
       Set Jobpending
       Set Motoron                           ' was Reset Motoron' Start Rinse
       Start Timer0                           ' Start Timer
       Bitwait Jobpending , Reset                  ' Wait to Finish
       Reset Motoron                     ' was Set Motoron ' Stop Rinse
    Next

   Set Drainon                                          ' was Reset Drainon  ' Open Drain second cycle
   Bitwait Waterempty , Reset                      ' Wait Drain
   Runtime = 180                                            ' SPIN
   Set Jobpending
   Set Motoron                                              'was Reset Motoron ' Start Rinse
   Set Run_nspin                                   ' was Reset Run_nspin  ' SPIN
   Start Timer0                                  ' Start Timer/Counter
   Bitwait Jobpending , Reset                               ' Wait to Finish

   Relays = &B11100000                                      ' ALL OFF, INITIAL State

 Loop                                                       ' was Goto Loopagain
      End
نلاحظ أيضا أننا استخدمنا Do – Loop و while-wend و لم يعد لدينا أوامر GOTO لكنها لن تختفى فهناك حالات مثل التى فى المقاطعة صريحة ولا يحل مكانها أى أمر آخر

المرة القادمة إن شاء الله سنشرح الدائرة بالميكرو C
الصور المرفقة
نوع الملف: jpg Wash-AVR.jpg‏ (23.1 كيلوبايت, المشاهدات 17)
رد مع اقتباس
  #43  
قديم 07-15-2018, 09:07 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

كود البرنامج
مما سبق سنستبدل تشغيل تايمر صفر بالكود TCCR0=6 أو 7 حسب الخافة هابطة أم صاعدة (هنا لا فرق) و إيقافه TCCR0=0
لإتاحة المقاطعة الخارجية GICR.6=1 أو INT0 = 1 وللأسف ميكروإلكترونيكا لا يقبل INT0 = 1 لذا سنستخدم GICR.6=1 و للتهيئه MCUCR=2 للحافة الهابطة و لإتاحة تايمر صفر نستخدم TOIE0 = 1 فى المسجل TIMSK و ميكروإلكترونيكا لا يقبل اسم البت ولذا نستخدم TIMSK=1 اسم المسجل و بالصدفة لا نحتاج لتفعيل أى بت أخرى فيه.
سيصبح الكود

كود:
// DEFINITIONS
char Leds at PortA ;
char Relays at PortB ;
char Switches at Portc ;
char Controls at Portd ;
sbit Fullled at PortA.b0 ;
sbit Halfled at PortA.b1 ;
sbit Smallled at PortA.B2 ;
sbit Hotled at PortA.b3 ;
sbit Mildled at PortA.b4 ;
sbit Coldled at PortA.b5 ;
sbit Wateron at PortA.b6 ;

sbit Drainon at Portb.b1 ;
sbit Heateron at Portb.b2 ;
sbit Motoron at Portb.b3 ;
sbit Run_nspin at Portb.b4 ;
sbit Waterfull at Portb.b5 ;
sbit Waterempty at Portb.b6 ;
sbit Dooropen at Portb.b7 ;

sbit Midtemp at PortC.b0 ;
sbit Hitemp at PortC.b1 ;
sbit Cold at PortC.b2 ;
sbit Mild at PortC.b3 ;
sbit Hot at PortC.b4 ;
sbit Small at PortC.b5 ;
sbit Half at PortC.b6 ;
sbit Full at PortC.b7 ;

sbit Run at PortD.b1 ;

bit Jobpending ;
unsigned short Rinse ;
unsigned short Cntr ;
unsigned Runtime ;

void External_Interrupt() org IVT_ADDR_INT0 {
    asm jmp 0 ;
}

void Timer0_Interrupt() org IVT_ADDR_TIMER0_OVF {
   TCNT0 = 205 ;
   if ( --Runtime = 0 ){         // end of time
      Jobpending = 0 ;           // set flag
      TCCR0 = 0 ;                 //  TR0_bit = 0 ;   // stop timer 0
          }
   }

void main() {
Begin:
     Sreg.b7 = 1  ;        // was  EA_bit = 1 ;  // Enable Interrupts
     gicr.b6 = 1 ;          // was IE = 0B10000011 ; //Enable T0 & INT0 external
     mcucr = 2 ;           // Falling Edge trigger
     TIMSK = 1 ;          // enable Timer0 over flow interrupt
     TCNT0 = 205;         // TH0 = 205 ; //Auto reload TL0 = 205 ; // Start Value
     // TMOD = 0b00000110 ;  TCON = 1 ; // Clr All interrupts, Set INT0 Edge trigger
 //    SP = 70  ;             //Move stack away
     ddra = 255 ;
     DDRB = 0b11111000 ;
     DDRC = 255 ;
     ddrd = 0b00000011 ;
     Leds = 0b11011000 ;     //Reset All PORTS! select Small cold cycle
     Relays = 0B11100000 ;
     Switches = 255 ;       // pullup enable
     Controls = 255 ;

     do {
     } while (Run = 0) ;     //  Run button release
Loopagain:
do {
  do {
    if (Full = 0) {
       Leds = Leds | 0B00000111 ;
       Fullled = 0 ;
        }
    else
       if (Half = 0) {
            Leds = Leds | 0B00000111 ;
            Halfled = 0 ; }
       else
          if (Small = 0) {
            Leds = Leds | 0B00000111 ;
            Smallled =0 ;         }

    if (Hot = 0) {
       Leds = Leds | 0B00111000 ;
       Hotled = 0 ;
       }
       else if (Mild = 0) {
          Leds = Leds | 0B00111000 ;
           Mildled = 0 ;
          }
       else if (Cold = 0 ) {
             Leds = Leds | 0B00111000 ;
               Coldled = 0 ;
             }
   } while ( Run = 1 ) ;             // Wait Run Press

   do{
   } while (Dooropen = 1 ) ;       // Wait Door to close
   Wateron = 0 ;                   // Fill with water
   do{
   } while ( Waterfull = 1 );      // Wait full Tank
   Wateron = 1 ;                   //  Close water Valve

   if (Coldled = 1) {              // not Cold then
      Heateron = 0   ;  }          // Heater on
      if (Mildled = 0) {
          do {
          } while ( Midtemp = 1 ) ; }
      else {
          do {
          } while ( Hitemp = 1 ) ;
          }
        Heateron = 1 ;             // Now Start Washing

     if ( Fullled = 0 ) {
         Runtime = 20 * 60  ; }
     else  {
            if ( Halfled = 0 ) {
               Runtime = 480   ; }
            else {
               Runtime = 300 ; }
            }

// Runmotor:
   Jobpending = 1 ;                  // Timing flag
   Motoron  = 0 ;                    // Start Motor
   TCCR0 = 6 ;                         // was TR0_bit = 1 ;  // start timer 0 falling edge
    while ( Jobpending = 1 ) ;       // Wait to Finish
    Motoron  = 0 ;                              //  stop motor
    for ( Cntr = 0  ;  Cntr < Rinse  ; Cntr++ ) {
         Drainon =  0  ;                         // Open Drain
         while ( Waterempty = 0 ) ;     // Wait Drain
         Drainon = 1  ;                         // Close Drain
         Wateron = 0 ;                         // Fill again
         while ( Waterfull = 0 ) ;        // Wait fill up
         Wateron = 1 ;                         // close water valve
         Runtime = 300 ;                      // Rinse time
         Jobpending = 1 ;                    // timer flag
         Motoron = 0  ;                         // Start Rinse
         TCCR0 = 6 ;                            // was TR0_bit = 1 ;  // start timer 0
         while ( Jobpending = 0 ) ;       // Wait to finish
         Motoron  = 1 ;                          // Stop Rinse
    }
    Drainon = 0 ;                                // Open Drain second cycle
    while ( Waterempty = 0 ) ;          // Wait Drain
    Runtime = 180 ;                            // SPIN time
    Jobpending = 1 ;                           // timer flag
    Run_nspin  = 0  ;                           // high speed
    Motoron = 0 ;                                 // Start SPIN
    TCCR0 = 6 ;                                   // was TR0_bit = 1 ;  // start timer 0
    while ( Jobpending  = 1 ) ;             // wait end of time
    Relays = 0B11100000 ;                   // ALL OFF, INITIAL State
    Controls = 255  ;
 } while (1) ;                      // was goto Loopagain ;

}
و أيضا استخدمنا DO لتحل محل goto و الكود أعتقد لا مشكلة فيه

المرة القادمة إن شاء الله سنكررها بالميكروتشيب PIC16C877A و اللغتان أيضا
رد مع اقتباس
  #44  
قديم 07-16-2018, 09:22 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

الغسالة باستخدام PIC16F877A و لغة البيزك:
للأسف فشركة باسكوم لا تدعم ميكروتشيب ولم أجد مترجم بالبيزك لميكروتشيب فلا مفر من ميكروإلكترونيكا .
نلاحظ تقاطع منفذىC,D لذا أمامنا طريقتين للتوصيل ، إما نوصل كل منفذ على مكوناته كما سبق و نتحمل التقاطع فى التوصيل هكذا

أو نوصل كل مجموعة مكونات للأطراف المجاورة و نتلافى التقاطعات فى البرنامج هكذا

غالبا لم يلحظ هذا الفرق كثير ممن صمموا دوائر لإعتمادهم على بروتس ألذى يضع كل منفذ منظم و مرتب ويوهم المستخدم أن الأمور منسقة و سهلة لكنى أفضل أن ارسم المكون مقارب للحقيقة تجنبا للمشاكل لاحقا. لتسهيل البرمجة سنختار الحل الأول.
كما سبق أن ناقشنا أننا سنتجنب منفذ A لكونه يحتاج تهيئة لكى يصبح رقمى بدلا من تماثلى و هذه التهيئة ليست صعبة وهى فى الداتاشيت لكن فى مجال المقارنة ستعطى ظن أن الأمور أكثر تعقيدا..
نلاحظ أيضا أن منفذ A ثمانى أطراف منها سبعة فقط متصلة بالتماثلى بينما الطرف الوحيد RA4 لا يتصل بها و بدلا من ذلك متصل بالعداد Timer0 و ألذى نستخدمه لحساب الوقت ، وهذا ما فعلناه
أيضا هناك نقطة يمكن ذكرها وهى ستخفض عدد الأطراف المطلوبة أن طرف Emergency حقيقة لا يحتاج أن يتصل بالمتحكم فلم يتعرض له البرنامج سابقا و لكن فقط استفدنا بالمقاومة الداخلية على الطرف، لا بأس هنا نضع المقاومة و نوفر الطرف و ليس هذا خيارا لكن المنفذ B وحده هو المزود بهذه المقاومات و قد استنفذ سبعة منه لسبعة أزرار و الثامن متصل بالمقاطعة الخارجية.
هنا يجب أن نجعل هذه المقاومات الداخلية "تعليق لأعلى " Pullup فاعلة بتصفير البت RBPU من (OPTION_REG.7). فهى تفصل مع إعادة التشغيل.
هنا أيضا نقطة نفضل مناقشتها وهى أن هذا المنفذ B له خاصية فريدة على الأطراف من 4 : 7 وهى interrupt on-change يمكن تفعيلها لكن أولا هم على ذات المنفذ فلا شيء سيضاف و الثانية أنها تسبب مقاطعة عند التغيير و ليس عند الانتقال من 1 إلى صفر أو العكس لذا يجب الحيطة حتى لا تسبب مقاطعة عند أول النبضة و آخر عند نهايتها فكلاهما تغيير.
الآن سنعيد التعريفات طبقا للدائرة المعدلة و نظرا لاستخدامنا الدائرة التقليدية للريلاى سنغير تفعيله من صفر إلى 1 و سنبقى الحساسات و الأزرار كما هى.
قبل أن نناقش البرنامج فهناك مترجم آخر جيد اسمه Great Cow Basic ويحتوى محرر بيزك قوى جدا و نسخة أخرى للمبتدئ رسومية أى تجد به المربعات و المثلثات و المعين و بها التعليمات IF و غيره يمكن وضعها و رسم البرنامج أشبه ما يكون بالسلمى لوحدات PLC وهو يترجم بعد ذلك و هو يصلح لبيك و أتميل AVR وهذا رابطه
http://www.greatcowbasic.com
http://www.greatcowbasic.com/gcb.html
ورابط الشرح و المساعدة
http://gcbasic.sourceforge.net/help/
ولكن للأسف فلم أجربه بعد
كما سبق الشرح مع C51 سنحتاج لتايمر صفر و تجهيز المقاطعة و للأسف ميكروإلكترونيكا لا تقدم أمر مختصر مثل باسكوم Config لذا نحتاج لدراسة كل جزئية منها لتهيئتها كما يجب و طبعا من الداتاشيت و لكنها ترشدنا لملف آخر أعم لكل عائلة PIC16 وبه تفاصيل أكثر وهو معروف باسم DS33023 وها هو رابطه
DS33023 Mid Range up counters.pdf
يعتمد التايمر صفر على مسجل اسمه Option_Reg وبه 8 بت وهى أيضا مكتوبة فى خانة و فوقها R/W لتحدد ما إن كانت كتابة أم قراءة أم كلاهما ثم -1 أى حالة البدء = 1 كالآتى

البت 7 المسؤولة عن مقاومات Pullup للمنفذ B و لا تسألنى ما علاقتها بالتايمر صفر فالإجابة الوحيدة لدى "أنهم جيران على ذات السيليكون"
البت 6 تحدد استجابة المقاطعة الخارجية للحافة الهابطة (صفر) أم الصاعدة (1) و هنا لا تفرق سوى أن لا يسبب كلاهما مقاطعة
البت 5 T0CS تحدد عمله لو = صفر يكون تايمر و يعد تعليماته الداخلية (ربع تردد الكريستال) أو =1 يعد خارجيا من الطرف RA4
البت 4 تحدد استجابة التايمر للحافة الهابطة (1) أم الصاعدة (صفر) و هنا لا تفرق سوى أن لا يسبب كلاهما عد
البت 3 تحدد القاسم السابق (العداد السابق ) Prescaler متصل بالعداد (صفر) أم بالحراسة WDT لو =1
نسبة التقسيم للعداد السابق تخص الثلاث بت الباقية
أما المقاطعة فهى تعتمد على المسجل INTCON وهذه مكوناته

البت 7 إتاحة الكل
البت 6 إتاحة المقاطعة من الدوائر المحيطة وهى الدوائر التى تؤدى وظائف إضافية مثل I2C, USB, التسلسلى الخ.
البت 5 تايمر T01E إتاحة التايمر صفر
البت 4 INTE إتاحة المقاطعة الخارجية
البت 3 إتاحة المقاطعة عند تغير بت من RB4:RB7
البت 2 هى علم حدوث مقاطعة من تايمر 1 أى T01F
البت 1 علم حدوث مقاطعة خارجية
البت صفر علم حدوث مقاطعة من تغير المنفذ RB4:RB7 و يجب البحث أيها

مع ملاحظة أن البت رقم 5 يتيح لك تشغيل و إيقاف المؤقت لذا سنستخدمها. الآن يمكننا أن نقول أن البرنامج يمكن كتابه الجزء التمهيدى هكذا

كود:
program WM16
' Declarations section 
dim Switches as byte at PORTB
dim Leds as byte at Portc
Dim Relays As byte at Portd 

dim  Fullled  as sbit at Portc.0
dim  Halfled  as sbit at Portc.1
dim  Smallled  as sbit at Portc.2
dim  Hotled  as sbit at Portc.3
dim  Mildled  as sbit at Portc.4
dim  Coldled  as sbit at Portc.5
dim  Wateron  as sbit at  Portc.6
dim  Drainon  as sbit at  Portc.7

dim  Hitemp  as sbit at Portd.0
dim  Midtemp  as sbit at Portd.1
dim  Waterfull as sbit at  Portd.2
dim  Waterempty  as sbit at  Portd.3
dim  as sbit at Portd.4
dim  Run_nspin as sbit at Portd.5
dim  Motoron as sbit at Portd.6
dim  Heateron as sbit at  Portd.7

dim Dooropen  as sbit at Portb.0
dim Run  as sbit at Portb.1
dim Cold as sbit at Portb.2
dim Mild as sbit at Portb.3
dim Hot as sbit at Portb.4
dim SmallLoad as sbit at Portb.5
dim Half as sbit at Portb.6
dim Full as sbit at Portb.7

dim Jobpending as bit
' VARIABLES
dim Runtime as word
Dim Rinse , Cntr As Byte

sub procedure interrupt
   if TestBit(INTCON, TMR0IF) = 1 then
    dec (Runtime)
         If Runtime = 0 Then
         Jobpending = 0
         ClearBit(INTCON, TMR0IF)        '  Interrupt Timer0 Flag
         ClearBit(INTCON, TMR0IE)        '  Stop Interrupt Timer0
     End If
 ' ClearBit is realised as an inline function, and may be called from within an interrupt
 ' else
'    if TestBit(INTCON, RBIF) = 1 then
 '     ClearBit(INTCON,RBIF)
 '     setbit (Config.bits , wdte)
  '    WDTE = 1 
  '  end if
  ' end if
end sub

main:                                            '   Main program

Begin:
سنلاحظ هنا أن تعريف sbit سيتطلب أن تحدد لها مكان بكلمة at لذا لن نستطيع استخدامها كمتغير مستقل فنضطر لاستخدام bit بدلا منها ، ثم يلى التعريفات مشكلة المقاطعة و لذا نكتب العنوان sub procedure interrupt و بداخله نفحص بالأمر TestBit و بين قوسين اسم المسجل ثم اسم البت أو رقمها ولا أدرى لماذا فلا يتكرر اسم بت مرتين إطلاقا فمثلا TMR0IF تعنى تايمر صفر Interrupt Flag أو علم المقاطعة فكيف يتكرر؟ على أى حال هذا هو ميكروإلكترونيكا فإن كانت = 1 ننفذ كود المقاطعة وهو كما سبق ننقص الزمن بواحد فإن بلغ الصفر نصفر علم الزمن ثم نعود و إلا لو كان مقاطعة خارجية سنضطر لعمل ريست ولا يوجد أمر لهذا، أيضا ميكروإلكترونيكا لا تقبل أمر Goto داخل المقاطعة لأن العنوان بعدها ولذا لا يمكن عمل ريست بهذا المترجم لذا نفكر فى عداد الحراسة WDT وهو للأسف يحتاج تهيئة فى البرمجة ولا يتاح و لا يوقف بحسب الحاجة و يجب شرحه مع باقى المتحكمات بلا حاجة حقيقة لاستخدامه لهذا لا يمكن تنفيذ الطوارئ بهذه الطريقة و سنلغيها و نستخدم ريست مباشر من طرف المتحكم وهذا موضوعنا القادم إن شاء الله
الصور المرفقة
نوع الملف: jpg WashPIC16.jpg‏ (33.8 كيلوبايت, المشاهدات 12)
نوع الملف: jpg WashPIC16a.jpg‏ (33.3 كيلوبايت, المشاهدات 13)
نوع الملف: png PIC16TMR0-Opt-Reg.png‏ (1.6 كيلوبايت, المشاهدات 13)
نوع الملف: png PIC16-INTCON-Reg.png‏ (1.7 كيلوبايت, المشاهدات 12)
رد مع اقتباس
  #45  
قديم 07-17-2018, 09:28 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

معالجة RESET فى البرنامج خارجيا
سنجرى تعديل طفيف فى الدائرة لتصبح

وهو أن نجعل خرج دائرة 4071 يدخل مباشرة على طرف Reset فى المتحكم ويمكن تطبيق هذه الفكرة على أى متحكم شرط أن نجعل طرف الريست فاعلا ففى بعض المتحكمات يمكن جعل الطرف ريست غير فاعل و يتحول لطرف دخول أو خروج
لاحظ أن وضع الخرج = 0 كان لتفعيل الريلاى و أصبح = 1 و العكس بالعكس
تركت الأمر السابق فى باسكوم كتعليق بجوار الأمر الجديد و المقابل له من ميكروإلكترونيكا و لهذا ستجد ما يبدو كخطأ أو تعارض مثل
MotorOn = 0 ' Set Motoron ' Stop Rinse
DrainOn = 1 ' Reset Drainon ' Open Drain second cycle
و لكنه صحيح فهو يعنى أن الأمر المستخدم مثلا MotorOn = 0 و كان فى البرنامج السابق C51 باسكوم بنص ' Set Motoron و الهدف منه إيقاف الشطف ' Stop Rinse و هذا لأننا بدلنا وضع الريلاى فأصبح 1 للتفعيل و صفر للقفل أو الفصل أو الإيقاف الخ فالأمر إذن أول تعليق هو ما كان فى البرنامج السابق و المطلوب تعديله
يبقى أن نكمل البرنامج كما سبق فيصبح
كود:
program WM16
' Declarations section 
dim Switches as byte at PORTB
dim Leds as byte at Portc
Dim Relays As byte at Portd 

dim  Fullled  as sbit at Portc.0
dim  Halfled  as sbit at Portc.1
dim  Smallled  as sbit at Portc.2
dim  Hotled  as sbit at Portc.3
dim  Mildled  as sbit at Portc.4
dim  Coldled  as sbit at Portc.5
dim  Wateron  as sbit at  Portc.6
dim  Drainon  as sbit at  Portc.7

dim  Hitemp  as sbit at Portd.0
dim  Midtemp  as sbit at Portd.1
dim  Waterfull as sbit at  Portd.2
dim  Waterempty  as sbit at  Portd.3
dim  Run_nspin as sbit at Portd.5
dim  Motoron as sbit at Portd.6
dim  Heateron as sbit at  Portd.7

dim Dooropen  as sbit at Portb.0
dim Run  as sbit at Portb.1
dim Cold as sbit at Portb.2
dim Mild as sbit at Portb.3
dim Hot as sbit at Portb.4
dim SmallLoad as sbit at Portb.5
dim Half as sbit at Portb.6
dim Full as sbit at Portb.7

dim Jobpending as bit
' VARIABLES
dim Runtime as word
Dim Rinse , Cntr As Byte

sub procedure interrupt
   if TestBit(INTCON, TMR0IF) = 1 then
    dec (Runtime)
         If Runtime = 0 Then
         Jobpending = 0
         ClearBit(INTCON, TMR0IF)      ' Clear flag
         ClearBit(INTCON, TMR0Ie)      ' Disable timer
'         clearbit(Pie1,TMR1iE)
     End If
     ClearBit(INTCON, TMR0IF)          '  clear Interrupt Timer0 to receive another
  ' ClearBit is realised as an inline function, and may be called from within an interrupt
  end if
end sub

main:                                            '   Main program
Begin:
    option_Reg = %00111111     ' setting RB Pull up clearing bit   RBPU  (OPTION_REG.7).
   ' INTEDG = falling ,TOCS counter not timer, Count Falling Edge Prescale to WDT , ratio
    intcon = %10100000  ' Interrupt Control GIE All,Peie edge falling, T01E Enable
      ' INTE External disable , T01 Ov flag,intf ext flag , RBIF port change flag
    TRISB = 255
    TRISC = 0                       '  out
    PORTC = %00100100               'small Cold
    TRISD = %00011111               ' some in and some out
    Heateron = 0
    Motoron = 0
    Run_nspin =  0
    ClearBit(INTCON, TMR0IF)        '  Interrupt Timer0 Flag
    ClearBit(INTCON, TMR0IE)        '  Stop Interrupt Timer0
  while true        '  Loopagain:

      while Run = 1     '   Bitwait Run , Set
      wend                                         ' Run button release
   do
      If Full = 0 Then
         Leds = Leds Or %00000111
         Fullled  = 0
      Else
          if Half = 0 Then
              Leds = Leds Or %00000111
              Halfled = 0
          Else
              if SmallLoad = 0 Then
                 Leds = Leds Or %00000111
                 Smallled = 0
              end if
          end if
      End If

      If Hot = 0 Then
         Leds = Leds Or %00111000
         Hotled = 0
      Else
         if Mild = 0 Then
             Leds = Leds Or %00111000
             Mildled = 0
                Else
                   if Cold = 0 Then
                   Leds = Leds Or %00111000
                   Coldled = 0
                end if
          end if
      End If

   loop until run = 0           ' Wait Run Press
    while DoorOpen = 1          ' Bitwait Dooropen , Reset ' Wait Door to close
    wend
    WaterOn = 1                 ' Set Wateron  Open Water Valve
    while Waterfull = 1         ' Bitwait Waterfull , Reset  ' Wait full Tank
    wend
    WaterOn = 0                 ' ReSet Wateron     ' Close water Valve

   If Coldled = 1 Then          ' not Cold then
      Heateron  = 1             ' Heater on
      If Mildled = 0 Then
         while  Midtemp = 1     ' Bitwait Midtemp , Reset
         wend
      Else
         while Hitemp = 1        '  Bitwait Hitemp , Reset
         wend
      end if
      HeaterOn =  0             ' Set Heateron     ' Turn off heater
   End If                       ' Now Start Washing

 If Fullled = 0 Then
     Runtime = 20 * 60
 else        ' Elseif Halfled = 0 Then
     if Halfled = 0 Then
         Runtime = 480
     Else
         Runtime = 300
     end if      ' because elseif in not supported in MikroElektronika producta
 End If

     ' Runmotor:
   Jobpending = 1    ' Set Jobpending   ' Timing flag
   Motoron   = 1     ' Motoron   = 0    ' Start Motor
   TMR0 = 205        ' Load Tomer0
   SetBit(INTCON, TMR0IE)        ' enable Timer0
   setBit(INTCON, TMR0IF)        ' Interrupt Timer0 Flag
   while jobPending = 1    ' Bitwait Jobpending , Reset    ' Wait to Finish
   wend
   motorOn = 0             ' Set Motoron  ' stop motor

    For Cntr = 1 To Rinse
        Drainon = 1              ' Reset Drainon ' Open Drain
        while Waterempty = 1     ' Bitwait Waterempty , Reset ' Wait Drain
        wend
        DrainOn =  0             ' Set Drainon ' Close Drain
        WaterOn = 1              ' Reset Wateron ' Fill again
        while WaterFull = 1      ' Bitwait Waterfull , Reset
        wend
        WaterOn = 0              ' Set Wateron    ' Close Water
        Runtime = 300                             ' Rinse Time
        TMR0 = 205
        Jobpending = 1           ' Set Jobpending
        Motoron =1               ' Reset Motoron  ' Start Rinse
        SetBit(INTCON, TMR0IE)   ' enable Timer0  ' Start Timer0 ' Start Timer
        setBit(INTCON, TMR0IF)   ' Interrupt Timer0 Flag
        while Jobpending = 1     ' Bitwait Jobpending , Reset ' Wait to Finish
        wend
        Motoron = 0              ' Set Motoron     ' Stop Rinse
    Next  cntr

    MotorOn = 0                  ' Set Motoron     ' Stop Rinse
    DrainOn = 1                  ' Reset Drainon   ' Open Drain second cycle
    while  Waterempty = 1        ' Bitwait Waterempty , Reset     ' Wait Drain
    wend
    Runtime = 180                                               ' SPIN
    JobPending = 1             ' Set Jobpending 
    motorOn = 1                ' Reset Motoron                  ' Start Spin
    Run_nSpin = 1               ' Reset Run_nspin                ' SPIN
    TMR0 = 205
    Jobpending = 1
    SetBit(INTCON, TMR0IE)     ' enable Timer0  ' Start Timer0
    setBit(INTCON, TMR0IF)     ' Interrupt Timer0 Flag ' Start Timer0                                                ' Start Timer/Counter
    while JobPending = 1       ' Bitwait Jobpending , Reset     ' Wait to Finish
    wend
   Relays = 255                                                ' ALL OFF, INITIAL State

 wend       '  Goto Loopagain
end.
المرة القادمة إن شاء الله نستخدم PIC18
الصور المرفقة
نوع الملف: jpg WashPIC16b.jpg‏ (33.6 كيلوبايت, المشاهدات 10)
رد مع اقتباس
  #46  
قديم 07-18-2018, 08:49 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

الغسالة باستخدام PIC18F و لغة البيزك
قد نفكر فى استخدام 4552 لكن استخدام وحدة usb سيضع تغذية usb على أحد الأطراف المستخدمة كما أننا لا نحتاج هذه الخاصية الآن ، لذا سنستخدم هنا ميكرو PIC18F452 لأن كل أطرافه مطابقة للسابق و لهذا سنجد أن ذات البرنامج فيما عدا بعض المسميات و المسجلات تحتاج تعديل

ما زالت مقاومات التعليق Pull Up فقط لمنفذ B و لتفعيلها نحتاج المسجل INTCON2 وهذا تكوينه

البت رقم 7 لإتاحة أو فصل مقاومات التعليق لأعلى للمنفذ B و فى البدء =1 أى غير متاحة و يجب تصفيرها فى دائرتنا
البت رقم 6 و 5 و 4 لحافة المقاطعات الخارجية صفر ،1، 2 و أى منهم =1 تعنى حافة صاعدة و صفر حافة هابطة.
البت رقم 2 باسم TMR0IP هى أولوية مقاطعة تايمر صفر لزيادة العد حيث 1 تعنى أولوية عالية و صفر أولوية منخفضة
البت رقم 0 أولوية مقاطعة تغيير حالة أطراف المنفذ B حيث 1 تعنى أولوية عالية
الآن نحتاج لتفعيل المقاطعة العامة و كذا المنفذ تايمر صفر و لم نعد نحتاج لمدخل INT0 .

البت 7 باسم GIE وهى المقاطعة العامة وهى عندما تكون = صفر توقف إتاحة المقاطعة أما لو =1 فبحسب البت RCON.7 فى المسجل RCON و المسماة IPEN لو = صفر تتيح كل المقاطعات المتاحة أما لو IPEN = 1 فستتاح كل المقاطعات ذات الأولوية العالية فقط.
البت رقم 6 باسم PEIE فعندما تكون = صفر تمنع إتاحة كافة مقاطعات الدوائر المحيطية (التسلسلى بأنواعه الخ) . أما لو =1 فبحسب البت RCON.7 و المسماة IPEN لو = 1 تتيح كل المقاطعات المحيطة ذات الأولوية المنخفضة أما لو IPEN = صفر فستتاح كل المقاطعات المسموح بها من الدوائر المحيطية .
البت رقم 5 باسم TMR0IE فهى لو =1 تتيح مقاطعة اكتمال العد للتايمر صفر Timer0 OV
البت رقم 4 باسم INT01E لو =1 تتيح المقاطعة الخارجية INT0
البت رقم 3 باسم RBIE هى PortB Interrupt Enable لإتاحة المقاطعة من تغير حالة أطراف منفذ B لو =1
البت رقم 2 باسم TMR0IF هى علامة Flag المقاطعة الفعلية لتايمر صفر
البت رقم 1 باسم INT0IF هى علامة Flag المقاطعة الخارجية الفعلية رقم صفر INT0
البت رقم صفر باسم RBIF هى علامة Flag المقاطعة الفعلية لتغير حالة طرف منفذ B
لاحظ المربع الأحمر بأعلى الصورة و التى تقول يجب على المبرمج التأكد من تصفير العلامات Flags قبل حدوث المقاطعة ليتمكن من استقبال التالية (وهذا عكس أتميل التى تتغير آليا بمجرد الاستجابة للمقاطعة بالكود و توقف باقى المقاطعات حتى نهاية الخدمة و العودة آليا أو أتاحها المبرمج بالكود)
و أخيرا تشغيل و إيقاف التايمر صفر من المسجل T0CON أو تحكم تايمر صفر

بت 7 باسم TMR0ON هى تشغيل = 1 و إيقاف التايمر = صفر
بت 6 باسم T08BIT اختيار 8 بت أم 16 و لو 1 يكون 8 بت
بت 5 باسم TOCS وهى اختيار مصدر العد ولو 1 يكون خارجيا
بت 4 باسم TOSE للحافة ولو 1 للحافة الهابطة
بت 3 باسم PSA لتحديد المقسم السابق Prescaler ولو 1 تعنى غير مستخدم
الباقيات لنسبة التقسيم من صفر تساوى 1:2 إلى 111 أى ثنائى سبعة لنسبة 1:256

و أخيرا القيمة التى تضاف للتايمر تحتاج تعديل فقد تغير اسمه من TMR0 إلى TMR0L
و اصبح الكود هكذا
كود:
program WM18
' Declarations section
dim Switches as byte at PORTB
dim Leds as byte at Portc
Dim Relays As byte at Portd

dim  Fullled  as sbit at Portc.0
dim  Halfled  as sbit at Portc.1
dim  Smallled  as sbit at Portc.2
dim  Hotled  as sbit at Portc.3
dim  Mildled  as sbit at Portc.4
dim  Coldled  as sbit at Portc.5
dim  Wateron  as sbit at  Portc.6
dim  Drainon  as sbit at  Portc.7

dim  Hitemp  as sbit at Portd.0
dim  Midtemp  as sbit at Portd.1
dim  Waterfull as sbit at  Portd.2
dim  Waterempty  as sbit at  Portd.3
dim  Run_nspin as sbit at Portd.5
dim  Motoron as sbit at Portd.6
dim  Heateron as sbit at  Portd.7

dim Dooropen  as sbit at Portb.0
dim Run  as sbit at Portb.1
dim Cold as sbit at Portb.2
dim Mild as sbit at Portb.3
dim Hot as sbit at Portb.4
dim SmallLoad as sbit at Portb.5
dim Half as sbit at Portb.6
dim Full as sbit at Portb.7
تشغيل و إيقاف التايمر
dim Jobpending as bit
' VARIABLES
dim Runtime as word
Dim Rinse , Cntr As Byte

sub procedure interrupt
   if TestBit(INTCON, TMR0IF) = 1 then
    dec (Runtime)
         If Runtime = 0 Then
               Jobpending = 0
               ClearBit(INTCON, TMR0IF)      ' Clear flag
               ClearBit(INTCON, TMR0Ie)       ' Disable timer
               Clearbit (T0Con, TMR0ON)        ' stop timer
     End If
     ClearBit(INTCON, TMR0IF)          '  clear Interrupt Timer0 to receive another
  ' ClearBit is realised as an inline function, and may be called from within an interrupt
  end if
end sub

main:                                            '  Main program
Begin:
    INTCON2 = 0                      ' setting RB Pull up clearing bit RBPU and all falling edge.
    intcon = %10100000            ' Interrupt Control GIE All,Peie edge falling, T01E Enable
      ' INTE External disable , T01 Ov flag,intf ext flag , RBIF port change flag
    TRISB = 255
    TRISC = 0                                   '  out
    PORTC = %00100100               'small Cold
    TRISD = %00011111                 ' some in and some out
    Heateron = 0
    Motoron = 0
    Run_nspin =  0
    ClearBit(INTCON, TMR0IF)        '  Interrupt Timer0 Flag
    ClearBit(INTCON, TMR0IE)        '  Stop Interrupt Timer0
    Cleartbit (T0Con, TMR0ON)        ' stop timer
  while true        '  Loopagain:
      while Run = 1                  '   Bitwait Run , Set
      wend                                 ' Run button release
   do
      If Full = 0 Then
         Leds = Leds Or %00000111
         Fullled  = 0
      Else
          if Half = 0 Then
              Leds = Leds Or %00000111
              Halfled = 0
          Else
              if SmallLoad = 0 Then
                 Leds = Leds Or %00000111
                 Smallled = 0
              end if
          end if
      End If

      If Hot = 0 Then
         Leds = Leds Or %00111000
         Hotled = 0
      Else
         if Mild = 0 Then
             Leds = Leds Or %00111000
             Mildled = 0
                Else
                   if Cold = 0 Then
                   Leds = Leds Or %00111000
                   Coldled = 0
                end if
          end if
      End If

   loop until run = 0                ' Wait Run Press
    while DoorOpen = 1          ' Bitwait Dooropen , Reset ' Wait Door to close
    wend
    WaterOn = 1                      ' Set Wateron  Open Water Valve
    while Waterfull = 1            ' Bitwait Waterfull , Reset  ' Wait full Tank
    wend
    WaterOn = 0                       ' ReSet Wateron     ' Close water Valve

   If Coldled = 1 Then             ' not Cold then
      Heateron  = 1                    ' Heater on
      If Mildled = 0 Then
         while  Midtemp = 1       ' Bitwait Midtemp , Reset
         wend
      Else
         while Hitemp = 1        '  Bitwait Hitemp , Reset
         wend
      end if
      HeaterOn =  0                ' Set Heateron     ' Turn off heater
   End If                                ' Now Start Washing

 If Fullled = 0 Then
     Runtime = 20 * 60
 else        ' Elseif Halfled = 0 Then
     if Halfled = 0 Then
         Runtime = 480
     Else
         Runtime = 300
     end if      ' because elseif in not supported in MikroElektronika producta
 End If

     ' Runmotor:
   Jobpending = 1                                   ' Set Jobpending    ' Timing flag
   Motoron   = 1                                      ' Motoron   = 0       ' Start Motor
   TMR0L = 205                                     ' Load Tomer0
   SetBit(INTCON, TMR0IE)               ' enable Timer0
   setBit(INTCON, TMR0IF)                ' Interrupt Timer0 Flag
   setbit (T0Con, TMR0ON)                 ' start timer 
  while jobPending = 1                          ' Bitwait Jobpending , Reset  ' Wait to Finish
   wend
   motorOn = 0                                         ' Set Motoron   ' stop motor

    For Cntr = 1 To Rinse
        Drainon = 1                                      ' Reset Drainon ' Open Drain
        while Waterempty = 1                     ' Bitwait Waterempty , Reset ' Wait Drain
        wend
        DrainOn =  0                                    ' Set Drainon ' Close Drain
        WaterOn = 1                                    ' Reset Wateron ' Fill again
        while WaterFull = 1                         ' Bitwait Waterfull , Reset
        wend
        WaterOn = 0                                     ' Set Wateron    ' Close Water
        Runtime = 300                                  ' Rinse Time
        TMR0L = 205
        Jobpending = 1                                 ' Set Jobpending
        Motoron =1                                       ' Reset Motoron  ' Start Rinse
        SetBit(INTCON, TMR0IE)             ' enable Timer0  ' Start Timer0 ' Start Timer
        setBit(INTCON, TMR0IF)              ' Interrupt Timer0 Flag
        setbit (T0Con, TMR0ON)                 ' start timer 
        while Jobpending = 1                        ' Bitwait Jobpending , Reset ' Wait to Finish
        wend
        Motoron = 0                                       ' Set Motoron     ' Stop Rinse
    Next  cntr

    MotorOn = 0                                          ' Set Motoron     ' Stop Rinse
    DrainOn = 1                                           ' Reset Drainon   ' Open Drain second cycle
    while  Waterempty = 1                          ' Bitwait Waterempty , Reset     ' Wait Drain
    wend
    Runtime = 180                                         ' SPIN
    JobPending = 1                                        ' Set Jobpending
    motorOn = 1                                            ' Reset Motoron    ' Start Spin
    Run_nSpin = 1                                         ' Reset Run_nspin     ' SPIN
    TMR0L = 205
    Jobpending = 1
    SetBit(INTCON, TMR0IE)                     ' enable Timer0  ' Start Timer0
    setBit(INTCON, TMR0IF)                      ' Interrupt Timer0 Flag ' Start Timer0                                                         
    setbit (T0Con, TMR0ON)                        ' start timer 
    while JobPending = 1                                ' Bitwait Jobpending , Reset     ' Wait to Finish
    wend
   Relays = 255                                                ' ALL OFF, INITIAL State

 wend       '  Goto Loopagain

end.
المرة القادمة إن شاء الله نعيدهم بلغة C
الصور المرفقة
نوع الملف: jpg WashPIC18.jpg‏ (33.4 كيلوبايت, المشاهدات 11)
نوع الملف: jpg PIC18-INTCON2-Reg.jpg‏ (11.5 كيلوبايت, المشاهدات 10)
نوع الملف: jpg PIC18 INTCON Reg.jpg‏ (34.3 كيلوبايت, المشاهدات 10)
نوع الملف: jpg PIC18 T0CON Reg.jpg‏ (13.8 كيلوبايت, المشاهدات 10)
رد مع اقتباس
  #47  
قديم 07-19-2018, 09:04 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

الغسالة باستخدام PIC16F877A و لغة C:
طبعا الدائرة لم تتغير و الكود لم يتغير أيضا و شركة المترجم هى ميكروإلكترونيكا، لذا سننسخ البرنامج من مترجم البيزك لمترجم اللغة C و من قائمة تحرير نستخدم "تغيير" Replace و نستبدل علامة التعليق فى البيزك " ' “ بعلامة السى و لا بأس أيضا من إضافة الخاتمة المقدسة " ; “ و إن كان هذا خطر فهناك حالات لا يجوز فيها ذلك لذا سنفضل إضافتها يدويا و نضيف الأقواس العادية و المعوجة فيصبح البرنامج هكذا
كود:
 
// program WM16 Declarations section char Switches at PORTB ; char Leds at Portc ; char Relays at Portd ; sbit Fullled at Rc0_bit ; sbit Halfled at rc1_bit ; sbit Smallled at rc2_bit ; sbit Hotled at rc3_bit ; sbit Mildled at rc4_bit ; sbit Coldled at rc5_bit ; sbit Wateron at rc6_bit ; sbit Drainon at rc7_bit ; sbit HitemP at rd0_bit ; sbit MidtemP at rd1_bit ; sbit Waterfull at rd2_bit ; sbit Waterempty at rd3_bit ; sbit Run_nspin at rd5_bit ; sbit Motoron at rd6_bit ; sbit Heateron at rd7_bit ; sbit Dooropen at rb0_bit ; sbit Run at rb1_bit ; sbit Cold at rb2_bit ; sbit Mild at rb3_bit ; sbit Hot at rb4_bit ; sbit SmallLoad at rb5_bit ; sbit Half at rb6_bit ; sbit Full at rb7_bit ; bit Jobpending ; // VARIABLES unsigned int Runtime ; char Rinse , Cntr ; void Timer0_int() iv 0x0004 ics ICS_AUTO { if (INTCON.TMR0IF =1 ) { // dec (Runtime) if (--Runtime = 0 ) { Jobpending = 0 ; INTCON.TMR0IF =0 ; // ClearBit(INTCON, TMR0IF) ; // Clear flag INTCON.TMR0Ie = 0 ; // ClearBit(INTCON, TMR0Ie) // Disable timer } // End If INTCON.TMR0IF =0 ; // ClearBit(INTCON, TMR0IF) // clear Interrupt Timer0 to receive another // ClearBit is realised as an inline function, and may be called from within an interrupt } } void main() { // Main program 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 ; TRISC = 0 ; // out Leds = 0b00100100 ; //small Cold TRISD = 0b00011111 ; // some in and some out Relays = 0b00001111 ; Heateron = 0 ; Motoron = 0 ; Run_nspin = 0 ; INTCON.TMR0IF =0 ; // ClearBit(INTCON, TMR0IF) // Interrupt Timer0 Flag INTCON.TMR0IE =0 ; // ClearBit(INTCON, TMR0IE) // Stop Interrupt Timer0 while (Run = 1 ) // Bitwait Run , Set {} // wend // Run button release while (1) { // Loopagain: do { if (Full = 0) { // Then Leds = Leds | 0B00000111 ; // Leds OR 00000111 Fullled = 0 ; } else if ( Half = 0) { // Then Leds = Leds | 0b00000111 ; // Leds = Leds Or %00000111 Halfled = 0 ; } else if ( SmallLoad = 0 ){ // Then Leds = Leds | 0b00000111 ; //Leds = Leds Or %00000111 Smallled = 0 ; } [COLOR="teal" // end if[/COLOR] if ( Hot = 0) { // Then Leds = Leds | 0B00111000 ; //Leds = Leds Or %00111000 Hotled = 0 ; } else if (Mild = 0) { // Then Leds = Leds | 0b00111000 ; //Leds = Leds Or 0b00111000 Mildled = 0 ; } else if (Cold = 0) // Then { Leds = Leds | 0b00111000 ; Coldled = 0 ; } // end if } while (Run = 1) ; // loop until run = 0 // Wait Run Press while ( DoorOpen = 1 ) ; // Bitwait Dooropen , Reset // Wait Door to close WaterOn = 1 ; // Set Wateron Open Water Valve while (Waterfull = 1 ) ; // Bitwait Waterfull , Reset // Wait full Tank WaterOn = 0 ; // ReSet Wateron // Close water Valve if (Coldled = 1) // Then // not Cold then { Heateron = 1 ; // Heater on if (Mildled = 0) // Then { while ( Midtemp = 1 ); // Bitwait Midtemp , Reset } // wend else { while (Hitemp = 1 ) ; // Bitwait Hitemp , Reset } // wend //end if HeaterOn = 0 ; // reSet Heateron // Turn off heater } // End if // Now Start Washing if (Fullled = 0) // Then Runtime = 20 * 60 ; else if (Halfled = 0) // Elseif Halfled = 0 Then { Runtime = 480 ; } else { Runtime = 300 ; } // end if // Runmotor: Jobpending = 1 ; // Set Jobpending // Timing flag Motoron = 1 ; // Motoron = 0 // Start Motor TMR0 = 205 ; // Load Tomer0 INTCON.TMR0IE = 1 ; // enable Timer0 INTCON.TMR0IF = 1 ; // Interrupt Timer0 Flag while (jobPending = 1) ; // Bitwait Jobpending , Reset // Wait to Finish motorOn = 0; // Set Motoron // stop motor for (Cntr =0; Cntr < Rinse; Cntr++) // for Cntr = 1 To Rinse { Drainon = 1 ; // Reset Drainon // Open Drain while (Waterempty = 1) ; // Bitwait Waterempty , Reset // Wait Drain // wend DrainOn = 0 ; // Set Drainon // Close Drain WaterOn = 1 ; // Reset Wateron // Fill again while (WaterFull = 1) ; // Bitwait Waterfull , Reset // wend WaterOn = 0 ; // Set Wateron // Close Water Runtime = 300 ; // Rinse Time TMR0 = 205 ; Jobpending = 1 ; // Set Jobpending Motoron =1 ; // Reset Motoron // Start Rinse INTCON.TMR0IE = 1 ; // SetBit(INTCON, TMR0IE)// enable Timer0 INTCON.TMR0IF = 1 ; // setBit(INTCON, TMR0IF) // Interrupt Timer0 Flag while (Jobpending = 1) ; // Bitwait Jobpending , Reset // Wait to Finish Motoron = 0 ; // Set Motoron // Stop Rinse } // Next cntr MotorOn = 0 ; // Set Motoron // Stop Rinse DrainOn = 1 ; // Reset Drainon // Open Drain second cycle while (Waterempty = 1 ); // Bitwait Waterempty , Reset // Wait Drain Runtime = 180 ; // SPIN JobPending = 1 ; // Set Jobpending motorOn = 1 ; // Reset Motoron // Start Spin Run_nSpin = 1 ; // Reset Run_nspin // SPIN TMR0 = 205 ; Jobpending = 1 ; INTCON.TMR0IE = 1 ; // SetBit(INTCON, TMR0IE)// enable Timer0 INTCON.TMR0IF = 1 ; // setBit(INTCON, TMR0IF) // Interrupt Timer0 Flag while (JobPending = 1) ; // Bitwait Jobpending , Reset // Wait to Finish Relays = 0b00001111 ; // ALL OFF, INITIAL State } // wend // Goto Loopagain }
بقى باستخدام PIC18 لتغطية باقى الأربع أنواع المرة القادمة إن شاء الله
رد مع اقتباس
  #48  
قديم 07-20-2018, 09:39 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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
افتراضي رد: الميكرو كونترولر انواعه و برمجته و استخداماته

الغسالة باستخدام PIC18F و لغة C:
يمكننا للسهولة نسخ البرنامج السابق فى مشروع جديد للمتحكم الجديد و ننسخه ، سنحتاج لتعديلات طفيفة مثل TMR0 سيضاف لها حرف L كبير أو صغير و Option_Reg سيتغير إلى INTCON2 و تعدل الأرقام كما فى المثال السابق فيصبح هكذا
كود:
   

 // program WM18       Declarations section

 char Switches  at PORTB ;
 char Leds at Portc ;
 char Relays  at Portd ;

  sbit Fullled at Rc0_bit ;
  sbit Halfled at rc1_bit ;
  sbit Smallled at rc2_bit ;
  sbit Hotled at rc3_bit ;
  sbit Mildled at rc4_bit ;
  sbit Coldled at rc5_bit ;
  sbit Wateron at rc6_bit ;
  sbit Drainon at rc7_bit ;

  sbit HitemP at rd0_bit ;
  sbit MidtemP at rd1_bit ;
  sbit Waterfull at rd2_bit ;
  sbit Waterempty at rd3_bit ;
  sbit Run_nspin at rd5_bit ;
  sbit Motoron at rd6_bit ;
  sbit Heateron at rd7_bit ;

 sbit Dooropen at rb0_bit ;
 sbit Run at rb1_bit ;
 sbit Cold at rb2_bit ;
 sbit Mild at rb3_bit ;
 sbit Hot at rb4_bit ;
 sbit SmallLoad at rb5_bit ;
 sbit Half at rb6_bit ;
 sbit Full at rb7_bit ;

 bit Jobpending ;

// VARIABLES
  unsigned int Runtime ;
  char Rinse , Cntr ;

void Timer0_int()  iv 0x0018 ics ICS_AUTO {
   if (INTCON.TMR0IF =1 ) {
       //  dec (Runtime) 
         if (--Runtime = 0 ) {
            Jobpending = 0   ;
            INTCON.TMR0IF =0  ;        // ClearBit(INTCON, TMR0IF) ;   // Clear flag
            INTCON.TMR0Ie = 0 ;       //  ClearBit(INTCON, TMR0Ie)      // Disable timer
            }                         // End If
     INTCON.TMR0IF =0  ;   
	// ClearBit(INTCON, TMR0IF)  //  clear Interrupt Timer0 to receive another  
  }
}

void main() {                                     //   Main program
    INTCON2 =  0 ;     // setting RB Pull up clearing bit RBPU all rising edge.
    INTCON = 0B10100000 ; 
		 // 7Interrupt Control GIE All,6Peie disabledg, 5Timer0 OV Enable
      // External disable , RBIF port changeenable, Timr0Flag,Exter Flag, PB change flag
    TRISB = 255 ;
    TRISC = 0   ;                  //  out
    Leds = 0b00100100  ;           //small Cold
    TRISD = 0b00011111  ;          // some in and some out
    Relays = 0b00001111 ;
    Heateron = 0  ;
    Motoron = 0  ;
    Run_nspin =  0 ;
    INTCON.TMR0IF =0  ;   // ClearBit(INTCON, TMR0IF) // Interrupt Timer0 Flag
    INTCON.TMR0IE =0  ;   // ClearBit(INTCON, TMR0IE) // Stop Interrupt Timer0

    while (Run = 1 )          //   Bitwait Run , Set
              {}          // wend          // Run button release
  while (1) {       //  Loopagain:
     do {
        if (Full = 0)      {                //  Then
           Leds = Leds | 0B00000111 ;       // Leds OR 00000111
           Fullled  = 0  ; }
        else if ( Half = 0) {                 // Then
           Leds = Leds | 0b00000111  ;   // Leds = Leds Or %00000111
           Halfled = 0 ;    }
        else  if ( SmallLoad = 0 ){      //  Then
           Leds = Leds | 0b00000111 ;    //Leds = Leds Or %00000111
           Smallled = 0  ;         }     // end if

        if ( Hot = 0)   {                // Then
           Leds = Leds | 0B00111000   ;  //Leds = Leds Or %00111000
           Hotled = 0 ;  }
        else if (Mild = 0)  {            //  Then
           Leds = Leds | 0b00111000 ;    //Leds = Leds Or 0b00111000
           Mildled = 0 ;     }
        else if (Cold = 0)               //  Then
              {  Leds = Leds | 0b00111000 ;
                 Coldled = 0 ;
               }                         // end if
      } while (Run = 1) ;                // loop until run = 0 // Wait Run Press

    while ( DoorOpen = 1 ) ;     // Bitwait Dooropen , Reset // Wait Door to close
    WaterOn = 1  ;                     // Set Wateron  Open Water Valve
    while (Waterfull = 1 ) ;      // Bitwait Waterfull , Reset  // Wait full Tank
    WaterOn = 0   ;                  // ReSet Wateron     // Close water Valve

   if (Coldled = 1)                   // Then  // not Cold then
     { Heateron  = 1 ;              // Heater on
         if (Mildled = 0)        
             {
             while ( Midtemp = 1 );             // Bitwait Midtemp , Reset
             }                      // wend
           else
             { while  (Hitemp = 1 ) ;         //  Bitwait Hitemp , Reset
             }                                               //end if
         HeaterOn =  0 ;             // reSet Heateron     // Turn off heater
      }                              // End if   // Now Start Washing

 if (Fullled = 0)                    // Then
     Runtime = 20 * 60 ;
 else if (Halfled = 0)          // Elseif Halfled = 0 Then
        { Runtime = 480  ; }
 else
        { Runtime = 300 ; }      // end if

     // Runmotor:
   Jobpending = 1  ;          // Set Jobpending   // Timing flag
   Motoron   = 1  ;                    // Motoron   = 0    // Start Motor
   TMR0l = 205     ;                  // Load Tomer0
   INTCON.TMR0IE = 1  ;           // enable Timer0
   INTCON.TMR0IF = 1  ;            // Interrupt Timer0 Flag
   while (jobPending = 1)  ;          // Bitwait Jobpending , Reset    // Wait to Finish
   motorOn = 0;               // Set Motoron                   // stop motor

   for (Cntr =0; Cntr < Rinse; Cntr++)      //    for Cntr = 1 To Rinse
    {   Drainon = 1  ;            // Reset Drainon // Open Drain
        while (Waterempty = 1) ;    // Bitwait Waterempty , Reset // Wait Drain
                               //  wend
        DrainOn =  0  ;                    // Set Drainon // Close Drain
        WaterOn = 1   ;          	 // Reset Wateron // Fill again
        while (WaterFull = 1) ;      // Bitwait Waterfull , Reset
                           //  wend
        WaterOn = 0   ;           // Set Wateron    // Close Water
        Runtime = 300  ;                           // Rinse Time
        TMR0l = 205  ;
        Jobpending = 1   ;                   // Set Jobpending
        Motoron =1 ;                            // Reset Motoron  // Start Rinse
        INTCON.TMR0IE = 1  ;            // SetBit(INTCON, TMR0IE)// enable Timer0
        INTCON.TMR0IF = 1 ;             // setBit(INTCON, TMR0IF)   // Interrupt Timer0 Flag
        while (Jobpending = 1) ;       // Bitwait Jobpending , Reset // Wait to Finish
        Motoron = 0    ;                        // Set Motoron     // Stop Rinse
     }            // Next  cntr

    MotorOn = 0  ;                           // Set Motoron     // Stop Rinse
    DrainOn = 1   ;                           // Reset Drainon   // Open Drain second cycle
    while  (Waterempty = 1 );        // Bitwait Waterempty , Reset     // Wait Drain
    Runtime = 180  ;                                       // SPIN
    JobPending = 1 ;                        // Set Jobpending
    motorOn = 1  ;                             // Reset Motoron       // Start Spin
    Run_nSpin = 1  ;                         // Reset Run_nspin    // SPIN
    TMR0L = 205    ;
    Jobpending = 1  ;
    INTCON.TMR0IE = 1  ;              // SetBit(INTCON, TMR0IE)// enable Timer0
    INTCON.TMR0IF = 1 ;              // setBit(INTCON, TMR0IF)   // Interrupt Timer0 Flag
    while (JobPending = 1) ;          // Bitwait Jobpending , Reset     // Wait to Finish
    Relays = 0b00001111 ;                                // ALL OFF, INITIAL State
 }              //  Goto Loopagain
}
فى الأمثلة السابقة فصلنا كثيرا لتوضيح الفروق بين اللفات و المترجمات لذا أرى أنه من الأفضل فيما يلى أن نعتمد الأسيمبلى لعائلة C51 و البيزك / باسكوم لعائلة AVR و لغة C من ميكروإلكترونيكا للبيك اختصارا للوقت و أصبح لدينا القدرة للترجمة حسبما تقود الحاجة.

المرة القادمة إن شاء الله سنتحدث عن برنامج ميكروويف منزلى ثم برنامج آخر لمعالجة ADC و ربما PWM
رد مع اقتباس
  #49  
قديم 07-21-2018, 01:22 PM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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
افتراضي برنامج ميكروويف

برنامج ميكروويف

التركيب الداخلى:
ألميكروويف يحتوى على ماجنيترون وهو صمام إلكترونى يحتوى فتيلة لتسخين المصعد "كاثود" فيشع إلكترونات يجذبها المصعد "أنود" بجهد عالى يبدأ حسب الطراز من 3000 فولت مستمر لتوليد موجات ذات تردد عالى جدا فى نطاق ألميكروويف و التى توجه للحيز داخله فيمتصها الجسم الموجود فيسخن. الفتيلة قد تحتاج لخمس ثوانى لتسخن ومن ثم التحكم به عن طريق قطع التغذية العالية . قطع و توصيل جهود عالية هكذا ليس ميسورا لذا تقطع تغذية دائرة توليد الجهد العالى ، كما أن الإشعاع ضار بالأشخاص لذا تتخذ احتياطات كافية لمنع تسربه نهائيا للخارج من خلال شبكة معدنية وراء زجاج الباب تتيح ألرؤية للداخل و تمنع الإشعاع من التسرب ، لذا يوجد مفتاح switch على الباب لو لم يغلق جيدا يمنع الجهاز من العمل.
معظم الأجهزة تعمل بأزرار كنموذج الغسالة و للتغيير فقط سنستخدم لوحة الأرقام :Key Pad مع 4 مبينات 7 شرائح 7 segment display و لدينا حساس الباب مفتوح و حساس للجهد ألعالى حيث لو انخفض عن حد معين سيتوقف الماجنيترون. ستقول يمكن وضع مثبت فولت لكن أى مثبت له مدى يؤدى وظيفته فيه ولو خرج عنه لا يستجيب.
سته مخارج الأول للفتيلة و الثانى للجهد ألعالى و الثالث لمروحة التبريد و الرابع للإضاءة و الخامس للزمور و السادس لموتور التقليب
منفذ كامل 8 طرف للوحة الأرقام Key Pad و المدخل الأول لحساس الباب و الثانى الجهد ألعالى
بقى كيف نتحكم فى مبينات الشرائح السبعة.
السبع شرائح و الحل – ليس ضائع:
ما هو مبين 7 شرائح؟
بدأ منذ عهد ألصمامات الإلكترونية للحاجة لبناء أجهزة قياس تردد أو قياسات أخرى و عرضها بصورة رقمية لكونها أكثر دقة و أسرع استيعابا من المؤشر ألتقليدى ، و ظهرت عدة صور منها و كانت صورة سبعة شرائح على أركان رقم 8 العربى هى التى لاقت نجاحا كبيرا كما فى الصورة التالية الجزء الأيسر ، و لاحقا ظهرت الحاجة لكتابة أحرف فأضيف لها عدة أقسام أخرى لتكمل كتابة الأحرف اللاتينية كما فى الجزء الأوسط من الصورة .

لاحقا استخدمت للشاشات الكبيرة شرائح معدنية ملونة لتكوين الشاشات الكبيرة كما فى المطارات و مواقف القطارات و السيارات الخ وكانت تحرك بملف مغناطيسى كما تحرك تلامسات الريلاى ثم صممت مصفوفة النقاط كما فى الشكل الأيمن لتتيح رسم الحروف كافة اللغات و بعض الرسوم البسيطة مثل الأسهم و الدوائر و المثلثات و غيرها.و توجد أيضا وحدات ليد كبيرة الحجم تعمل على فولت أعلى 12 فولت , اكثر كما توجد أيضا وحدات غازية تعمل بجهود أعلى و لونها برتقالى أنسب للاستخدام الخارجى كما فى محطات الوقود الخ.
فى مشروعنا هذا سنستخدم النوع التقليدى كما بالشكل الأيسر و باستخدام المتحكم فلدينا طريقان لا ثالث لهما، الأول استخدام محلل أكواد مثل 7447,7448,7449,CD4511 - أو أرقام مثل DM9368 DM9370 و المعروفة باسم Hex to 7Seg وهى تعطى الأرقام العربية العشرة و أيضا CA3161- التى تستطيع كتابة الأحرف HELP أو استخدام المتحكم كمحلل كود.
استخدام المتحكم توفر مال بعدم استخدام متكاملات إضافية على حساب عدد الأطراف المستخدمة حيث تضع 7 أطراف للشرائح و طرف لكل مبين وفى مثالنا هذا نحتاج 13 طرف و قد نحتاج آخر للعلامة العشرية و قد تثبت فلا تحتاج لطرف. هذا قرابة 2 منفذ وهذا كثير. لو لديك تطبيق يتطلب مبينات أكثر كميزان مثلا فلن تجد أطراف تكفى .
لذا نأخذ فكرة عن كل نوع مما سبق فإن تطلب الأمر ستكون لديك فكرة أن هذا متاح.
الأرقام 7447,7448,7449 هى الأكثر شيوعا و بعضها يناسب الشاشة ذات الكاثود المشترك (عمومى متصل بالأرض) Common Cathode CC و منها ذات الأنود المشترك (عمومى متصل بالموجب) Common Anode CA و فيما عدا ذلك فلا فرق. لإضاءة الأولى تحتاج جهد موجب يمرر تيار مناسب حوالى 5 إلى 10 مللى أمبير للطرف المعنى بينما الثانية تحتاج توصيل الطرف المعنى بالأرض (طبعا من خلال مقاومة) ليسحب هذه القيمة من التيار. أيضا هذه القيمة تخص الليدات العادية أما الوحدات الكبيرة و غيرها فيرجع للداتاشيت لمعرفة الفولت و التيار المناسبين.
طالما التيار يمر فالطرف مضاء لذا لتوصيل مجموعة معا ستحتاج لوضع ترانزستور سويتش أو مفتاح على الطرف العمومي لتفعيل هذا المبين دون سواه ثم توصيل أطراف الأحرف لكتابة ما تريد. لهذا نرى المشكلة وهى ضرورة تتابع العرض حتى لا يتوقف ظهور الأرقام و يبدو غير لائق. لحل هذه المشكلة حينما نحتاج قدرة المتحكم لمهام أهم من تحديث المبينات، يمكننا أولا أن نستخدم المقاطعة ولكن هذا يسبب لنا مشكلة الحاجة للمؤقت أن يعمل على زمن عرض الرقم و زمن التحديث بعد اكتمال المبينات كلها لذا و لتحرير المتحكم كليا، يمكن وضع مساكة Latch (كورس الدوائر المنطقية) حيث يحتفظ بالرقم المراد عرضه لحين الحاجة لتعديله .

كما بالرسم يمكن استخدام المساكة ذات 8 بت Latch رقم 74373 ذات القدح بالمستوى (=1) أو 74374 ذات القدح بالحافة الصاعدة بين خرج المتكاملة المحلل للشفرة و العارض ، ولكن هذا يحتاج أن تحفظ الأرقام كلها (هنا اربع أرقام) أى تحتاج لبايت لحفظهم أما لو أضفت محلل من 4 إلى 16 ستحفظ 16 رقم و تحتاج 5 متكاملات كما بالرسم الأيسر.
أو تضع المساكة بين الميكرو و محلل الأكواد وهنا تستطيع كتابة رقمين معا و لكن ستحتاج متكاملات أكثر.
يبدو أن الحل الأيسر أفضل لكن لو لا تحتاج لكتابة حروف مع الأرقام فلدينا حل أفضل باستخدام CD4511 فهى محلل كود و معه مساكة Latch ولا أدرى لماذا لا يستغلها أحد، وهكذا تكون الدائرة ، أربعة خطوط للرقم و خط لكل شاشة

لو احتاجنا لعدد كبير مثل الموازين مثلا فقد تحتاج محلل شفرة 4:16 لتتعامل مع 16 شاشة و البعض استخدم محلل 4 إلى 16 مثل 4514 أو 4017 4022 من 4 إلى 10 أو 74138 أو 74154 كلها تتحكم فى حتى 16 مبين من 4 أطراف فقط أى لم نضيف شيئ.
المشكلة هنا أنك تحتاج فى البرنامج أن تكرر إضاءة كل المبينات على الأقل 10 مرات كل ثانية و تبقى كل منها مضاء لفترة تكفى لتراه العين وهذا يشكل عبئ كبير على البرنامج

البعض استخدم التسلسلى الشهير 74595 و لكنك ستحتاج واحد لكل مبين أى 16 متكاملة و لكن شركة صينية قدمت حلا عبقريا بمتكاملة رقمها TM1640 تتحكم فى 16 مبين 16 display من خلال خطين تسلسليين فقط وهى فى أغلب الموازين لدى البقالة . حيث تجد شاشة أمامك للوزن و أخرى أمامه ليضع الأشياء على الميزان و ثالثة تعرض السعر أو أشياء أخرى بمجموع 16 مبين

شرح مفيد لكن كان به خطأ واحد ربما غير مقصود، تقول الأرقام العربية و لعلك تقصد الإنجليزية..
معذرة و ما هى الأرقام الإنجليزية؟ لا شيء بهذا الاسم هناك أرقام لاتينية مثلا I II III IV V VI VII IIX IX X وهى من 1 إلى عشرة و كانت لا تصلح للحساب ولا تعبر عن الصفر و الأرقام الهندية التى اعتادنا عليها جميعا بمسمى خاطئ "(عربية)” و لكن نذكر أنه عالم عربى من اخترع الصفر.
إذا ماذا فى الصفر ليخترع؟
الأرقام العربية كانت تعد الزوايا و طبقا لما فى الصورة

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

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

المرة القادمة إن شاء الله نضع رسم الجهاز
الصور المرفقة
نوع الملف: png 7seg 00.png‏ (6.3 كيلوبايت, المشاهدات 7)
نوع الملف: jpg 7seg 01.jpg‏ (33.7 كيلوبايت, المشاهدات 7)
نوع الملف: png 7seg 02.png‏ (1.1 كيلوبايت, المشاهدات 7)
نوع الملف: png Arabic Numbers.png‏ (1.7 كيلوبايت, المشاهدات 7)
نوع الملف: jpg 7seg 03.jpg‏ (25.6 كيلوبايت, المشاهدات 7)
رد مع اقتباس
  #50  
قديم 07-22-2018, 09:09 AM
ماجد عباس محمد ماجد عباس محمد غير متواجد حالياً
استاذ
ومشرف الكترونيات
 
تاريخ التسجيل: Jun 2011
الدولة: القاهرة - مصر
المشاركات: 1,394
معدل تقييم المستوى: 26
ماجد عباس محمد 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
افتراضي دائرة جهاز الميكرو ويف

دائرة جهاز الميكرو ويف
سنبدأ كما تعودنا بالمتحكم AT89x52 و لغة الآلة أو الأسيمبلى .
وضعنا مفتاح الباب على طرف INT0 و الأعلى أولوية و لأهمية إيقاف الماجنيترون سنرفع أولويته أيضا عن سواه حتى يستجاب له أثناء تنفيذ أى مقاطعة أخرى أو يمكنك ذلك بإتاحة المقاطعة فى كود باقى المقاطعات.
استخدمنا ذات الطريقة لحساب الزمن و بالتالى لدينا مقاطعة كل ثانية و ذات الطريقة مع الريلايات لتجنب لحظة التفعيل أثناء البدء.
بالنسبة للزمور فمنه نوعان أحدهما ميكانيكى فقط و يحتاج لدائرة مهتز لينتج صوت وآخر شامل دائرته وهو الأفضل وهو ما نستخدمه ، أما لو تنوى استخدام نغمات متعددة فيمكنك استخدام دائرة مكبر مثل LM386 و سماعة مناسبة.
بالنسبة للعارض ، فسنستخدم أربعة متكاملات CD4511 واحد لكل مبين . المتكاملة لها 4 طرف دخول للعدد من صفر إلى 9 و طرف دخول LT اختصارLamp Test وهى فى كل المحللات لاختبار المبين فتضاء كل أجزاءه، و طرف دخول باسم BI وهى اختصار Blanking Input وهى لإطغاء الشاشة وهذه تستخدم لتوفير طاقة البطارية عند عدم الحاجة أو تعديل شدة الإضاءة بتعديل عرض النبضة . و أخيرا LE اختصار Latch Enable وهى عندما = صفر يحلل الدخل و يظهر على المبين و عندما = 1 يحتفظ المبين بآخر قيمة عرضها و بهذا نضع الثوانى على الحافلة ثم نفعل طرف LE الثوانى بنبضة سالبة ثم نضع الدقائق و نفعل طرف LE الدقائق بنبضة أخرى.
بقى لوحة المفاتيح وهى بضع أزرار مرصوصة فى صفوف و أعمدة وفى الوحدة ذات 16 زرار تكون أربعة صفوف و أربعة أعمدة كما يلى

فى الصورة على اليسار تركيب الأزرار كما بالداخل حيث لدينا صف 1 أى R1 و صف 2 و صف 3 و صف 4 و أيضا عامود 1 أى Column 1 و اختصارا C1 و C2 و C3 و C4 . الطرف رقم 1 باللون القرمزى (الرسم الأيمن) متصل بالأحرف A,B,C,D و عندما تضع +5 فولت عليه لن يظهر فى أى مكان حتى تضغط على أحد الأزرار السابقة فإن كان A سيظهر على الخط الأحمر العلوى و الخارج من طرف 8 و إن كان B سيخرج من الأزرق رقم 7 و هكذا، الآن نبدل الفولت +5 من الطرف 1 إلى 2 ولا معنى إطلاقا لإبقاؤه على أكثر من عامود ، الآن سيستجيب للضغط على الأرقام 3،6،9،علامة الشباك # و هكذا
إذن علينا أن نضع جهد على طرف من الأعمدة ثم نفحص من أى صف خرج أو العكس نضعه على صف و نبحث من أى عامود قد خرج.

بقى أن نحدد هل الجهد ألعالى مسموح به أم انخفض عن المسموح ،أعلم أن الكثير قد أكمله بالمكبر LM741 و اختبره على محاكى ووصل لتمام الأمور، لكن للأسف واقعيا LM741 لا يعمل بتغذية أقل من 9 فولت كما أن خرجه يعلو عن جهد VEE بقيمة 2 فولت و يقل عن Vcc بقيمة 2 فولت أخرى أى لم يبقى – بفرض أنه سيعمل – سوى واحد فولت فقط وهذا لا يناسب دوائر المنطق عموما العاملة على 5 فولت . البعض ذهب خطوة أخرى أفضل باستخدام LM358 وهذا موفق من جهتين أنه يعمل من 3 فولت فصاعدا و يصل لجهد الأرضى أو على أقصى تقدير 0.2 فولت لكن مشكلة Vcc ما زالت قائمة و 3 فولت مع تباين درجات الحرارة الخ غير مأمونة النتائج لذا نستخدم مقارن LM393 و هو يعالج هذه الخاصية لآنه فى وضع خرج = 1 يكون مفتوح Open Collector و يترك للدائرة أن تحدد قيمها، و بوضع مقاومة جذب لأعلى يمكنك أن ترفع الخرج حتى 30 فولت لو شئت و ما زلت كما أنت تستخدم تغذية +5 فولت و تقارن جهود أقل من 5 فولت.

الجهد المقوم بفرض أنه من مصدر 9 فولت سيكون قرابة 13 فولت و نحتاج منه قيمة أقل من +5 فولت لذا سنأخذ ثلثها أو ربعها من خلال مقاومتى R3,R4 على الطرف الموجب الغير عاكس و على الطرف السالب بمجزئ جهد نضع جزء من 5 فولت. طالما 220 فولت بخير سيكون الطرف الغير عاكس أعلى من العاكس و الخرج = 1 بسبب المقاومة R7 و لو هبط الجهد 220 نستطيع أن نحدد أى قيمة نضبط عليها المقاومة المتغيرة POT فيهبط الخرج إلى صفر
المقاومةR5 لمنع الاهتزاز حول نقطة الانقلاب ، و ندخل هذا على المقاطعة INT1 لأهميتها أيضا فلو انخفض الجهد ألعالى لن تتولد موجات الميكرو ويف و من ثم تظل الطاقة تفقد داخله تيار × فولت دون سحب منها للخارج و من ثم ترتفع حرارته وقد يتلف. نظرا لأن المتكاملة بها 2 مقارن فيمكن توصيل الثانى كحساس للحرارة كما بالدائرة و نظرا لعدم توافر مدخل مقاطعة ثالث فيمكن جمعه مع حساس الفولت وهذه ميزة المقارن أنه لا يحتاج دايودات كمكبرات العمليات ، و يبقى هذا الأمر جدلا علميا فقط لأن واقعيا يوضع حساس كهروميكانيكى على الماجنيترون يقطع التيار عند ارتفاع الحرارة مثل ألذى فى مكوى الملابس و أجهزة مسخنات الهواء و تجفيف الشعر الخ كما أن الفولت يجب تثبيته بمثبت لو يتغير بمدى أوسع من المسموح له فتوقف العمل فى منتصف التسوية غالبا ما يفسد مذاق الطعام ، لذا لا جدوى منه عمليا.

الآن لدينا الدائرة هكذا و نبدأ التفكير فى هيكل البرنامج و حتى المرة القادمة إن شاء الله حيث نبدأ البرمجة.
الصور المرفقة
نوع الملف: jpg 4x4-matrix-keypad.jpg‏ (38.5 كيلوبايت, المشاهدات 6)
نوع الملف: jpg MicroWave-Comparator.jpg‏ (34.2 كيلوبايت, المشاهدات 5)
نوع الملف: jpg MicroWave-C51.jpg‏ (32.4 كيلوبايت, المشاهدات 6)
رد مع اقتباس
إضافة رد

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

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

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

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



الساعة الآن 08:45 AM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, 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