الجمعة، 30 نوفمبر 2012

Microcontroller (4)


Microcontroller (4)
Write your first program using Pic16f84A


سوف نتعلم اليوم كيفية بناء مشروع باستخدام الـمايكروكنترولر ..
كما تعلمنا من قبل إن المايكروكنترولر Pic 16f84A له 13 pin يمكن استخدامهم كـ input or output، فمن المؤكد أن هناك طريقة للتعامل مع تلك الـ Pin لتحديد إذا ما كانت input أو output. و هنا نتطرق بالحديث إلى أول register نتعامل معه و هو الـ Tris Register، و ظيفة هذا الـ Register هو تحديد اتجاه الـ Pin ؟ هل سوف استخدامها كـ input to the microcontroller أو كـ output from microcontroller.
* input to microcontroller: اشارة تدخل للمايكروكنترولر، زي مثلاً لما أضغط على switch متوصل بالمايكروكنترولر، فده هيبقى أكيد input للمايكروكنترولر.
* output from microcontroller: اشارة تخرج من المايكروكنترولر لأي شىئ متصل بالمايكروكنترولر، على الـ pin المستخدمة كـ output مثل الـ leds.
أولاً TRIS Register:
الـ TRIS هو register مسئول عن تظبيط الـ pins directions، بمعنى إنه المسؤل عن تحديد أي الـ pins سوف استخدمها كـ input و أيهم سوف يتم استخدامه output، و بالتالي فأنا استطيع بالبرمجة أن أجعل كل الـ Pins كـ inputs أو كلهم كـ output.
مثال: عندي led (مصدر ضوئي) سوف يتم توصيله بالمايكرو<< في هذه الحالة فإن الـ pin التي استخدمها في توصيل الـ led بالمايكرو سوف تكون كـ output، و بالتالي فإن الجملة المسئولة عن تظبيط تلك المسألة هيه
;<register_name><port_name>.<pin_number>=<1 or 0
TRISB.b0=0 >> هنا نجد أن اسم الـ register << TRIS، و اسم الـ port الذي تم توصيل الـ led به هوه port B، لذا كتبنا TRISB، أيضاً نجد إننا قد وصلنا الـ led بالـ pin رقم 0 في الـ port B ، و بناء عليه فإني قد عرفت المايكرو إني سوف استخدم الـ Pin رقم 0 في الـ port اللي اسمه B كـ output.
مثال آخر، لدي مفتاح كهربي متصل على الـ pin رقم 0 في الـ port A << بالطبع المفتوح سوف يُستخدم كـ input للمايكروكنترولر،، و بالتالي سوف تكون جملة الـ direction هي TRISA.b0=1;
أن اسم الـ register << TRIS، و اسم الـ port الذي تم توصيل الـ switch به هوه port A، لذا كتبنا TRISA، أيضاً نجد إننا قد وصلنا الـ switch بالـ pin رقم 0 في الـ port A ، و بناء عليه فإني قد عرفت المايكرو إني سوف استخدم الـ Pin رقم 0 في الـ port اللي اسمه A كـ input.
إذاً في حالة تظبيط الـ pin directions فإن 0 << تعني output، 1 << تعني input.

ثانياً PORT Register:
و هو الـ register المنوط بإخراج الـ volt على الـ pins بتاعت المايكروكنترولر.
مثال: لما نقول porta=1 >>  فده معناه إن المايكروكنترولر هيخرج اشارة 5 فولت على كل الـ pins  اللى موجودة في port  A.
للتحكم في كل Pin على حدة في الـ port  A: نقول
PORTA.b0=1 >>  و هذا يعنى إنه سوف يخرج اشارة 5 volt على الـ Pin رقم صفر في الـ port  A.

لذلك عندما نريد أن نضيئ led  متوصلة على الـ pin رقم 2 في port B،،
نكتب >> PortB.b2 = 1 ، و هذا يعنى إن المايكروكنترولر سوف يخرج على الـ Pin رقم 2 اشارة كهربية مقدارها 5 فولت.

الآن سوف تكتب أول مشروع لك، المشروع هوه أن يكون لديك button و led عند الضغط على الـ button،  سوف تضئ الـ led، و عند عدم الضغط على الـ button سوف تطفئ الـ led.


في البداية سوف نقوم برسم الدائرة باستخدام برنامج الـ proteus كما تعلمنا في المرة السابقة
** إذا كنت لا تعرف كيفية بناء الدائرة السابقة باستخدام الـ proteus يمكننك مراجعة الدرس السابق من هنا >> Learn how to use Proteus

كما نرى لقد قمت بتوصيل الدوائر الرئيسية بالمايكروكنترولر، و هي دوائر الـ oscillating و الـ reset.
و قمت بتوصيل الـ led بالـ pin رقم 1 في الـ port B، و كذلك قمت بتوصيل الـ button بالـ pin رقم 0 بالـ port B.

* الـ led سوف تكون output، و بالتالي سوف نكتب أثناء ضبط pin directions الـ   TrisB.b1=0
* بينما الـ button سوف يكون Input،و بالتالي سوف نكتب في الـ Pin direction >>
TrisB.b0=1

سوف نقوم الآن بفتح برنامج الـ Mikro C لكتابة البرنامج للتحكم بهذا الـ led .
** للتعرف على كيفية استخدام برنامج الـ Mikro C يمكننك مراجعة الدرس السابق من هنا أولاً >> learn how to use Mikro C

سيكون الكود بهذا الشكل الموضح أعلاه.

لتجريب البرنامج الذي قمنا بكتابته على برنامج الـ proteus  نقم بالضغط double click على المايكروكنترولر، كما هو موضح بالشكل
نقوم بالضغط على علامة الـ browsing في المربع اللى على اليمين (Program file)، ثم نقوم بالذهاب للمكان الذي قمنا بحفظ الكود فيه، و نختار الملف الذي يكون امتداده .hex
بعد اختيار الملف، نقوم بتعديل قيمة الـ Processor Clock Ferquency  إلى 4 MHz، ثم نضغط على OK


نقوم بالضغط على Play mode أسفل الشاشة، و نقوم باختبار البرنامج بالضغط على الـ button سنجد أن الـ led ستضىئ

و برفع الضغط من على الـ button نجد أن الـ led قد انطفئت !


في المرة القادمة سوف ننفذ بعض المشاريع البسيطة باستخدام المايكروكنترولر خطوة بخطوة.
اسأل الله أن ينفعني و إياكم بهذا العلم .. دمتم بود

الخميس، 22 نوفمبر 2012

Introduction To Microcontroller (3)



  1. Introduction To Microcontroller (3)




    اليوم سوف نتعرف على كيفية استخدام برنامج يمكننا من عمل الدوائر الالكترونية و تشغيلها على الكمبيوتر عن طريق أشهر برامج simulation ألا و هو برنامج الـ Proteus.

    أولاً قم بتحميل برنامج الـ Proteus من هنا.  ((اضغط هنا))
    ثانياً: بعد تسطيب البرنامج على جهازك، قم بالخطوات الآتية لضمان تشغيل البرنامج بشكل صحيح :



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

    1- قم بفتح البرنامج، لنتعرف عليه عن كثب.
    Start Menu >> All Programs >> Proteus 7 Professional >> ISIS 7 Professional.





    الآن سوف نصمم دائرة بسيطة جداً تحتوي على Led, Button, Battery, Voltmeter, Resistor, Ammeter
    الخطوات:













    و بهذا نكون قد انتهينا من أول دائرة نصممها بإستخدام برنامج الـ proteus.

الخميس، 8 نوفمبر 2012

Introduction To Microcontroller (2)

Introduction To Microcontroller (2)



سوف نتناول اليوم كيفية التعامل مع برنامج MikroC V4.15 و كيفية كتابة كود بلغة الـ C.

أولاً برنامج Mikro C:
يُمكنك تحميل البرنامج من هنا (( اضغط هنا ))
مرحلة ما بعد تسطيب البرنامج على جهازك، قم بفتح البرنامج ثم اتبع الخطوات الآتية:

شكل (1)


شكل (2)


شكل (3)


شكل (4)


شكل (5)


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





و الآن سوف نتعلم كيفية كتابة الكود بلغة الـ C.


ترتيب الكود في أي برنامج يتم كتابته




1- Preprocessor data:
و هي عبارة عن text replacement لبعض الكلمات بالقيم المرتبطة بها، و هيه تتم قبل عمل compilation للبرنامج، مثال
#define on 1
#define off  0
#define led trisb.b0

هنا يقوم الـ compiler باستبدال كل كلمة "on" بـ قيمة "1" ، و هذا يجعل الكود أكثر قراءة و يجعلني أكثر قدرة على قراءة و تعديل الكود ex: Led = on بدلاً من أن أقول Led = 1 فالأولى تجعل الكود أكثر قراءة و أسرع في التعديل.

2- Variable declaration:
ملحوظة:
سوف أقوم بكتابة بعض التعليقات بجوار الـ كود و ذلك لجعل الكود أكثر وضوحاً، و سوف يسبق التعليق // .
و هنا نقوم بتعريف المتغيرات التي سوف أقوم باستخدامها في البرنامج :

ex: int x = 5 ;       // declare a variable ((x)) As Integer  and assign 5 to its value.

ex: float z = 2.35;    // declare a variable ((z)) As float and assign 2.35 to its value.

ex: char y = ‘A’    // declare a variable ((y)) As Character and assign A to its value.

ex: char name [ ] = “SC.CSED”    // declare a Array ((name)) As Array of characters (like string) and assign SC.CSED to its value.

note :
a-  every line in the C code must be closed by “ ;
b- in the C language there is no type to store string directly >> so we use array of character to store strings.

3- User defined functions :
الـ function هيه عبارة عن برنامج فرعي يتم كتابته ليقوم بأداء وظيفة معينة، لانشاء function نقوم بثلاث مراحل :
أولا: مرحلة الـ prototype :
و تتم هذه المرحلة قبل كتابة الـ main.
<return_type> <function_name> <(variables that the function receive)> ;

ex :
int Add ( int x, int y ) ;
ثانياً مرحلة الـ implementation:
و هنا يتم كتابة الكود الذي تقوم به هذه الـ function.
<return_type> <function_name> <(variables that the function receive)>
ex:

int Add (int x, int y)
{
int z ;
z = x + y ;
return (z) ;
}

ملحوظة:
الفرق بين الـ prototype و الـ implementation في أول سطر هوه الـ ;

ثالثاً مرحلة الـ calling :
و هي مرحلة استدعاء الـ function لتقوم بالوظيفة المحددة.
<Variable_name> = <function_name><( the variable that i want to send to the implementation)>
ex:

int Add (int x, int y) ; // prototype, function_name is “Add”, receive two variable, and return integer variable.

void main ()
{
int num1, num2, result ;
num1 = 5 ;
num2 = 3 ;
result = Add (num1, num2) ; // calling the function, and send the two variables that i want to add.
}

int Add ( int x, int y)  // implementation of the function
{
int z ;  // define a variable z As integer.
z = x + y ;  
return (z) ;  // return the value of z and put it in result variable.
}

4- Void main :
و هنا يتم كتابة الـ كود الرئيسي في البرنامج، و استدعاء كافة الـ functions ، التي تم كتابتها ، و يتم استخدام الـ preprocessor data، و يتم كتابة الـ configuration  اللازمة لظبط الهاردوير و السوفت وير ليعملا سوياً.
و الآن سوف نستعرض سوياً:
a- Conditional statement :

if ( condition 1 )
{
   // write the code that you desire to execute if the condition 1 is true.
}
else if ( condition 2 )
{
   // write the code that you desire to execute if the condition 2 is true.
}
else
{
  // write the code that you desire to execute if the condition is false.
}

// to And between the condition 1 and 2,, write:

if ( condition 1 && condition 2 )
{
   // write the code that you desire to execute if the condition 1 and condition 2 is true.
}
if ( condition 1 | | condition 2 )
{
   // write the code that you desire to execute if the condition 1 or condition 2 is true.
}


b- loops:
I need to loop when i want to repeat some of code for n times.

1- For Loop:

For ( initial value ; condition ; step )
{
// write the code that you want to repeat.
}

ex: to print numbers form 0 to 50

void main ()
int i ;  // define variable i As integer.

For ( i = 0 ; i <= 50 ; i ++ )  // loop from i = 0 to i less than 50 ; every time increment the value of i.
{
// print the value of i >> it will be 1 2 3 4  . … … 48 49 50
}




c- Switch case :
switch ( variable )
{

case 1 :
// write that code you want to execute if the variable matching with the first case
break ;

case 2 :
// write that code you want to execute if the variable matching with the first case
break ;


default  :
// write that code you want to execute if the variable doesn’t  match with any of the cases.
break ;

}

الأربعاء، 31 أكتوبر 2012

Introduction To Microcontroller

                                             
Introduction To Microcontroller (1)

ما هو الـ Microcontroller ؟
هو ببساطة جهاز كمبيوتر ذو حجم صغير، يقوم بمعظم وظائف الكمبيوتر تقريباً، تختلف طبيعة المهام التي يقوم بهما تبعاً لإختلاف البرنامج الذي يتم برمجته به، و تبعاً للدائرة الالكترونية التي يتم توصيله بها.
يتم برمجة المايكروكنترولر بإحدى لغات البرمجة C or Assembly or Basic ، و يتم تنزيل البرنامج الذي تقوم بكتابته على المايكروكنترولر عن طريق جهاز يسمى Programmerيتم توصيله بالكمبيوتر و المايكروكنترولر.
يوجد العديد من الشركات المصنعة للمايكروكنترولر، و يختلف كل مايكروكنترولر عن الآخر في سرعة الـ processor و التكلفة و … إلخ.
و سوف نتعامل في هذا اليوم مع مايكروكنترولر من شركة Microchip، تنقسم منتجات شركة Microchip إلى العديد من العائلات منها PIC12F و منها PIC16F و منها PIC18F و ..... إلخ، و سوف ندرس اليوم كيفية التعامل مع الـ PIC16F84A.


مما يتكون الـ Microcontroller ؟
يتكون المايكروكنترولر من:
1- Microprocessor
2- Oscillator
3- RAM
4- ROM
5- Counters
6- Timers
7- ADC

أولاً الـ Microprocessor:
و هو المسئول عن تنفيذ العمليات المنطقية و الحسابية
في المايكروكنترولر.

ثانياً الـ Oscillator:
عبارة عن مصدر لتوليد الـ pulses و التي تُمكن
الـ microprocessor من القيام بالمهام المطلوبة.

ثالثاً الـ RAM:
- متطايرة، لا تحتفظ بالـ data في حالة انقطاع التيار الكهربي.
- يتم تخزين فيها الـ Variables المُستخدمة في البرنامج.

رابعاً الـ ROM:
- ليست متطايرة، أي أن الـ data التي بها لا تضيع في حالة انقطاع التيار الكهربي.
- يتم تخزين البرنامج الذي فيه المهام التي سينفذها المايكروكنترولر بها.

خامساً ADC:
و هي وحدة مسئولة عن تحويل الاشارات الـ Analog إلى اشارات Digital يُمكن التعامل معها من قِبل المايكروكنترولر.

و الآن سوف نتعرف على الـ PIC16f84A:


شكل (1) يوضح صورة المايكروكنترولر PIC16f84a و الذي يتكون من 18 رجل -18 pins- كل رجل لها وظيفة محددة، يتم تحدديدها عن طريقة البرمجة، و هذه الوظائف تُكتب في الـ Datasheet.
في حالتنا هذه نجد أن الرجل رقم 1 << مكتوب بجوارها RA2
و الرجل رقم 18<< مكتوب بجوارها RA1
في الـ PIC16f84a يوجد 18 pin، منها 5 pins تُستخدم لتوصيل المايكروكنترولر بالـ volt المطلوب و بعض الدوائر الخاصة اللازمة لبدء تشغيله ، و 13 Pins تُستخدم كـ دخل و خرج للمايكروكنترولر، وبالتالي فهو له مجموعة من الـ inputs التي يتم معالجتها بواسطة الـ processor و يتم اخراج ناتج هذه المعالجة على الـ pins المختصة بالخرج.
و من الناحية التنظيمية فلقد تم تقسيم الـ 13 pins المختصة بالـ input & output إلى مجموعتين المجموعة الأولى يُطلق عليها PORT A و المجموعة الثانية يطلق عليها PORT B،، ويتكون الـ PORT A إلى 5 pins و هم RA0,RA1,RA2,RA3,RA4، بينما يتكون الـ PORT B من 8 pins و هم RB0, RB1, RB2, RB3, RB4, RB5, RB6, RB6, RB7
و فيما يلي سوف نتعرف عليهم بشىء من التفصيل.

الدوائر اللازمة لتشغيل المايكروكنترولر:
أولاً: دائرة الباور<< يعمل المايكروكنترولر على بمصدر جهد مقداره 5 فولت و 25 ميلي أمبير، لذلك فهناك العديد من الطريق لتوفير هذا المصدر بتلك الموصفات نذكر منها :

1- مصدر جهد(بطارية) 12 فولت + IC 7805 << سيكون خرج هذه الدائرة 5 فولت، يتم توصيل الطرف الموجب على الـ pin المكتوب بجوارها VDD في المايكروكنترولر (pin no. 14).



2- step down transformer + four diodes to rectifier +7805 .


ثانياً دائرة الـ Reset:
يتميز المايكروكنترولر بأن له pin تُسمى MCLR رقم 4، بأنها إذا تم توصيلها بالأرضي فإنه يقوم بعمل restart للمايكروكنترولر
و يبدأ في تنفيذ الكود مرة آخرى.
كيفية التوصيل: يتم توصيل push-button أحد أطرفه بالأرضي و الآخر بالـ MCLR.


ثالثاً دائرة الـ Oscillator :
المايكروكنترولر كغيره من الأجهزة التي تحتوي على processor تحتاج إلى مولد نبضات أو ما يُعرف بـ Oscillator.
يتم توصيل crystal 4MH على الطرفين OSC1, OSC2 أي على الـ pin no. 16, 15.


ملحوظة:
أرجل الـمايكروكنترولر مُصنعّة بتقنية TTL أي Transistor Transistor Logic و هذا يعني أن الـ pin التي تُستخدم في المايكروكنترولر لابُد و أن يتصل بها إما مصدر جهد أو أرضي، و ذلك لأن عدم توصيل تلك الأرجل على أي منهما سوف تتعرض لـ Noise، و من ثم نجد أنه يظهر لنا مصطلح جديد pull up resistor, pull down resistor.
ما هو الـ Pull resistor: هي مقاومة تُقدر بحوالي من 4 إلى 10 كيلو أوم، يتم وضعها بين الـ pin و الأرضي أو مصدر الجهد على حسب pull up/down resistor.
مثال: دائرة الـ MCLR و المسؤلة عن عمل Reset للمايكروكنترولر، يتم توصيل الـ push button بالأرضي و الطرف الآخر بالـ Pin، فإذا تم الضغط عليه فإنه يتم توصيل الـ pin بالأرضي مباشرة، و بالتالي يتم حدوث reset للمايكروكنترولر، و هنا يظهر السؤال ماذا لو لم يتم الضغط عليه؟ ما القيمة الموجودة على الـ pin الآن في حالة عدم الضغط عليه؟، ستجد إن الاجابة إن تلك الـ pin متروكة في الهواء، قليل من الـ noise كافلة بأن تضع عليها واحد أو صفر، لذا فإنه يجب أن يكون التعديل في الـدائرة على النحو الآتي:
   
لكي تستخدم المايكروكنترولر في دائرة تحكم، فلابد من تظبيط الهاردوير اللازم لتشغيل المايكرو، وكذلك يلزم تظبيط السوفت وير << و من هنا يظهر لنا مصطلح registers، الـ register هو المسؤل عن عمل الـ configuration اللازمة للهاردوير حتى يُمكن استخدامه و أداء الوظائف المطلوبة من الهاردوير، عندنا العديد من الـ register التي سوف نتعامل معاها و هم Tris, Port, ADCON0, INTCON,….etc.

أولاً TRIS:
الـ TRIS هو register مسئول عن تظبيط الـ pins directions، بمعنى إنه المسؤل عن تحديد أي الـ pins سوف استخدمها كـ input و أيهم سوف يتم استخدامه output، و بالتالي فأنا استطيع بالبرمجة أن أجعل كل الـ Pins كـ inputs أو كلهم كـ output.
مثال: عندي led (مصدر ضوئي) سوف يتم توصيله بالمايكرو<< في هذه الحالة فإن الـ pin التي استخدمها في توصيل الـ led بالمايكرو سوف تكون كـ output، و بالتالي فإن الجملة المسئولة عن تظبيط تلك المسألة هيه
;<register_name><port_name>.<pin_number>=<1 or 0
TRISB.b0=0 >> هنا نجد أن اسم الـ register << TRIS، و اسم الـ port الذي تم توصيل الـ led به هوه port B، لذا كتبنا TRISB، أيضاً نجد إننا قد وصلنا الـ led بالـ pin رقم 0 في الـ port B ، و بناء عليه فإني قد عرفت المايكرو إني سوف استخدم الـ Pin رقم 0 في الـ port اللي اسمه B كـ output.
مثال آخر، لدي مفتاح كهربي متصل على الـ pin رقم 0 في الـ port A << بالطبع المفتوح سوف يُستخدم كـ input للمايكروكنترولر،، و بالتالي سوف تكون جملة الـ direction هي TRISA.b0=1;
أن اسم الـ register << TRIS، و اسم الـ port الذي تم توصيل الـ switch به هوه port A، لذا كتبنا TRISA، أيضاً نجد إننا قد وصلنا الـ switch بالـ pin رقم 0 في الـ port A ، و بناء عليه فإني قد عرفت المايكرو إني سوف استخدم الـ Pin رقم 0 في الـ port اللي اسمه A كـ input.
إذاً في حالة تظبيط الـ pin directions فإن 0 << تعني output، 1 << تعني input.


المطلوب منا الآن كي نبدأ في برمجة المايكروكنترولر، هو تعلم بعض الأوامر في لغة الـ C، و تعلم استخدام برنامج Proteus و برنامج Mikro C.