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

   

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




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


اعلانات

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



معالجة 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


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

الصورة الرمزية fathi-mohmed
fathi-mohmed
:: مهندس متميز ::
تاريخ التسجيل: Aug 2010
الدولة: القاهرة
المشاركات: 513
نشاط [ fathi-mohmed ]
قوة السمعة:
قديم 18-07-2018, 12:15 AM المشاركة 75   
افتراضي


شكرا لك اخى العزيز


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


أسعدنى مروركم الكريم


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



الغسالة باستخدام 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 أو تحكم تايمر صفر
PIC18 T0CON Reg.png
بت 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



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



الغسالة باستخدام 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 أو تحكم تايمر صفر
PIC18 T0CON Reg.png
بت 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



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



الغسالة باستخدام 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 لتغطية باقى الأربع أنواع المرة القادمة إن شاء الله




الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 20-07-2018, 06:15 AM المشاركة 80   
افتراضي السلام عليكم ورحمه الله


مجهود اكثر من رائع .. تشكر عليه .. جعله الله في ميزان حسناتك ..



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