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

}