التدريب رقم 2 : خطوة إلى الامام : الأضواء المتحركة البسيطة :

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

التدريب رقم 2 : خطوة إلى الامام : الأضواء المتحركة البسيطة :

مُساهمة من طرف Admin في السبت مارس 05, 2016 12:37 pm

بعد أن تناولنا البيانات وأنواعها والمتغيرات وكذلك الحلقات يمكننا متابعة التدريبات .

التدريب رقم 2 : خطوة إلى الامام : الأضواء المتحركة البسيطة :


الدائرة الكهربية :



الغرض :
استخدام جميع أطراف الخرج للميكروكونترولر PIC12F675 .
سوف يتم استخدام المذبذب الداخلى ووقف تمكين MCLR .
ملحوظة :
الطرف "4" عند عدم تمكين MCLR يمكن استخدامه كمدخل فقط ولا يمكن استخدامه كمخرج .
تتبع الخطوات التالية :
1- نبدأ بتعريف المنفذ GPIO بالأسم السهل المستعار OUTPUT . وإعلان متغير عمومى "i" يستخدم كعداد لحلقات for .


الكود:


#define  OUTPUT GPIO
char i;


2- تحديد إعدادات سجلات ومنافذ الميكروكونترولر . يفضل إنشاء دالة تضم هذه الإعدادات بحيث يسهل تعديلها عند الرغبة , علاوة على تنظيم البرنامج بما يسهل تتبعه .


الكود:



void init_port(void)
{
ANSEL = 0x00;   //set port as digital I/O , not analog input
CMCON = 0x07;   //shut off the comparator
TRISIO = 0x00;   //all output
GPIO = 0x00;   //make all pins low "0"
}


3- الأضاء المتحركة يمكن أن تاخذ نماذج متعددة مثل:
أ‌- الحركة جهة اليسار ، أى إضاءة الليد بأقصى اليمين ثم الذى يليه جهة اليسار وهكذا . بالطبع يفضل وضع النموذج بدالة مستقلة كما يلى :


الكود:


void move_left(void)
{
      OUTPUT=1;      delay_ms(250);           //GP0 ON
      OUTPUT=(1<<1); delay_ms(250);      // GP1 ON
      OUTPUT=(1<<2); delay_ms(250);      // GP2 ON
      //Note : GP3 : Input only
      OUTPUT=(1<<4); delay_ms(250);      // GP4 ON
      OUTPUT=(1<<5); delay_ms(250);      // GP5 ON
      OUTPUT=0;      delay_ms(250);      // All OFF
}


العبارات الرئيسية المستخدمة مثل ((1<<4 ، هذه العبارة هى مجرد أخد قيمة الواحد "1" إزاحة البتات جهة اليسار أربع مرات بحيث يكون الرقم "4" هو نفسه موقع البت الرابعة . يتم ترقيم البتات فى البايت من "7" إلى "0" من جهة اليسار إلى جهة اليمين وحيث أن (1<<0)=1, (1<<1)=2, (1<<2)=4, (1<<3)=8 وهكذا ، لذلك فإن ذلك يعطى طريقة سهلة لتحديد البت بشكل "منفرد" فى البايت كما أن ذلك سهل القراءة أيضا . إذا أردت تحديد البت الخامسة "5" يمكنك كتابة GPIO = 32; ( أو 0x20 بالسداسى عشر) ، ولكن GPIO = (1<<5) أسهل بكثير فى القراءة .
4- نكرر الخطوة السابقة لنموذج آخر , وليكن الحركة جهة اليمين كما يلى :


الكود:


void move_right(void)
{
      OUTPUT=(1<<5); delay_ms(250);      // GP5 ON
      OUTPUT=(1<<4); delay_ms(250);      // GP4 ON
      //Note : GP3 : Input only
      OUTPUT=(1<<2); delay_ms(250);      // GP2 ON
      OUTPUT=(1<<1); delay_ms(250);      // GP1 ON
      OUTPUT=1;      delay_ms(250);      //GP0 ON
      OUTPUT=0;      delay_ms(250);      // All OFF
}
وكذلك لنموذج وميض جميع الليدات :

void blink_all()
{
      OUTPUT=0x37;   delay_ms(250);   //ALL ON
      OUTPUT=0x00;   delay_ms(250);   //ALL OFF
}

5- الآن انتهت جميع المكونات الرئيسية للبرنامج وجاء وقت الدخول إلى الدالة الرئيسية وتحديد الشكل المطلوب وعدد مرات تكرارة عن طريق اختيار الدوال المناسبة ، وهنا مثال لذلك ولكن يمكنك إجراء التعديلات المناسبة :


الكود:


void main()
{
init_port();

   while(1)
   {
   for(i=0;i<5;i++)
   {
      
   move_left();
   move_right();
   }
   for(i=0;i<5;i++)
   {
   blink_all();
   }
      
   }
}


البرنامج :


الكود:


//EX2:Moving light using PIC12F675
//4MHz internal clock
//Master Clear  : Disable
//Eng:F.Abdelaziz
//Date :05-03-2016*/

//define Output port
#define  OUTPUT GPIO
char i;

void init_port(void)
{
ANSEL = 0x00;   //set port as digital I/O , not analog input
CMCON = 0x07;   //shut off the comparator
TRISIO = 0x00;   //all output
GPIO = 0x00;   //make all pins low "0"
}

void move_left(void)
{
      OUTPUT=1;      delay_ms(250);      //GP0 ON
      OUTPUT=(1<<1); delay_ms(250);      // GP1 ON
      OUTPUT=(1<<2); delay_ms(250);      // GP2 ON
      //Note : GP3 : Input only
      OUTPUT=(1<<4); delay_ms(250);      // GP4 ON
      OUTPUT=(1<<5); delay_ms(250);      // GP5 ON
      OUTPUT=0;      delay_ms(250);      // All OFF
}

void move_right(void)
{
      OUTPUT=(1<<5); delay_ms(250);      // GP5 ON
      OUTPUT=(1<<4); delay_ms(250);      // GP4 ON
      //Note : GP3 : Input only
      OUTPUT=(1<<2); delay_ms(250);      // GP2 ON
      OUTPUT=(1<<1); delay_ms(250);      // GP1 ON
      OUTPUT=1;      delay_ms(250);      //GP0 ON
      OUTPUT=0;      delay_ms(250);      // All OFF
}

void blink_all()
{
      OUTPUT=0x37;   delay_ms(250);      //ALL ON
      OUTPUT=0x00;   delay_ms(250);      //ALL OFF
}
 
//main function
void main()
{
init_port();

   while(1)
   {
   for(i=0;i<5;i++)
   {
      move_left();
      move_right();
   }

   for(i=0;i<5;i++)
   {
      blink_all();
   }
      
   }
}

Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى