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

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو :

اذهب الى الأسفل

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو  : Empty برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو :

مُساهمة من طرف Admin الجمعة مارس 04, 2016 7:19 pm

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو :
سوف نستخدم البرمجة بلغة السى مع المترجم ميكروسى برو والميكروكونترولر PIC12F675 .
فى البداية نقوم بإنشاء مشروع جديد ، وسوف يتم إعداد المشاريع المستخدمة هنا بالإعدادات التالية :
• استخدام المذبذب الداخلى ،
• واستخدام الأطراف GP4 , GP5 كأطراف دخل / خرج ،
• مع تعطيل مؤقت الحراسة والإعادة واستخدام الطرف GP3 كطرف دخل .
وذلك عن طريق نافذة تحرير المشروع Edit Project . فى جميع المشاريع سوف نستخدم المذبذب الداخلى بالقيمة 4 ميجاهرتز كما هو مبين بالشكل التالى .

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو  : 119

تمهيد :
علاوة على إعداد سجل منفذ الدخل/الخرج GPIO وسجل التحكم فى اتجاه منفذ الدخل/الخرج TRISIO ، ينبغى تهيئة (إعداد) السجل ANSEL (سجل اختيار وضع الدخل طرف الدخل التناظرى) والسجل CMCON (سجل التحكم فى المقارن التناظرى ) لاستخدام القنوات التناظرية كمداخل / مخارج رقمية كما يلى :


الكود:


CMCON = 7 ;   // Set GP<2:0> to  digital I/O
ANSEL=0;       // digital I/O  ANS<3:0>: Analog Select bits ,
//1 = Analog input , 0 = Digital I/O.
TRISIO = 0x08;   //Set GP3as input (rest) ,and SET GP<5:4,2:0> as outputs
GPIO = 0;       // Clear GPIO


Admin
Admin

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

https://fathallaabdelaziz.forumarabia.com

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

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو  : Empty رد: برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو :

مُساهمة من طرف Admin الجمعة مارس 04, 2016 7:27 pm

التدريب رقم 1 :
الميكروكونترولر PIC12F675و برنامج وميض ليد والمحاكاة ببرنامج بروتيس :
هذا البرنامج يعتبر أول خطوة لتعلم كيفية استخدام الميكروكونترولر PIC12F675 فى مشاريعك .
الدائرة الكهربية :

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو  : 219


أول شىء يجب ملاحظته عدم وجود مذبذب كريستال ، وذلك لاستخدام المذبذب الداخلى بتردد 4MHz كمصدر للساعة . وأيضا ، الطرف GP3 عادة يستخدم كطرف "إعادة" reset للميكروكونترولر PIC12F675 ، لكن لزيادة العدد الكلى للأطراف المتاحة للأغراض الأخرى لا يستخدم الطرف GP3 كطرف إعادة . لذلك ، لكى تجعل الميكروكونترولر PIC12F675 يعمل ، فقط تحتاج لتوفير القدرة بالطرف "1" (+5V) والطرف "8" (0V) لهذا الميكروكونترولر .
البرنامج :
قم بإنشاء مشروع جديد باستخدام معالج إنشاء مشروع جديد ، فى نهاية المطاف تظهر لك نافذة تحرير الكود وهى بمثابة منطعة العمل .
لعلك لاحظت أن النافذة تحتوى على السطور التالية :



الكود:


void main() {

}


هذه السطور قام بإنشائها المترجم نبابة عنك ولتذكيرك بأن أى برنامج بلغة السى يجب أن بحتوى على الأقل على هذه السطور والتى تعرف بما يسمى بالدالة الرئيسية main وأن برنامجك الرئيسى بجب أن يكتب بين قوس البداية والنهاية .
فى بداية البرنامج الرئيسى يجب كتابة إعدادات السجلات المختلفة حتى يتم إخبار (تهيئة) المترجم بذلك . فى هذا البرنامج سوف نقوم بجعل جميع الأطراف مداخل/مخارج رقمية فقط ، لذلك يجب التهيئة بالشكل المبين أدناه:


الكود:


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


الخطوة التالية هى كتابة البرنامج الذى تريد تنفيذه بناء على خطة التنفيذ . هنا نريد عمل وميض لليد متصل بالطرف (7) GP0 مع تكرار هذا الوميض بصفة مستمرة .
عملية التكرار بصفة مستمرة تستلزم إنشاء حلقة تكرار لانهائى وهو ما يتحقق باستخدام الصيغة :


الكود:


while(1)
   {
   …….   
   }


على أن يتم كتابة ما نريد تكرارة (يعرف بجسم أو كتلة حلقة التكرار ) بين الأقواس المجعدة .
وميض الليد يعنى فصل الليد لفترة نصف ثانية ثم توصيلها لفترة نصف ثانية أخرى ثم التكرار .
عملية فصل الليد تتحقق بجعل الطرف المتصل بالليد عند الجهد 0V وهو ما نعبر عنه بالصيغة GPIO.B0=0; .
عملية الحفاظ على الليد فى حالة فصل لمدة نصف ثانية تتحقق باستخدام دالة التأخير بقيمة 500 ملى ثانية بالصيغة delay_ms(500); .
عملية توصيل الليد تتحقق بجعل الطرف المتصل بالليد عند الجهد +5V وهو ما نعبر عنه بالصيغة GPIO.B0=1; .
عملية الحفاظ على الليد فى حالة توصيل لمدة نصف ثانية تتحقق باستخدام دالة التأخير بقيمة 500 ملى ثانية بالصيغة delay_ms(500); .
وتتكرر الخطوات السابقة بصفة مستمرة .
ملحوظات :
1- لعلك لاحظت وجود الفاصلة المنقوطة فقط فى نهاية كل تعليمة أو أمر .
2- ولعلك لاحظت أيضا وجود الأحرف (//) وبعدها شرح للتعليمة ، هذه الأخرف تخبر المترجم بأن ما يأتى بعدها وحتى نهاية السطر هو تعليق ومن ثم يقوم بتجاهله ولا يتم ترجمته .
فى نهاية المطاف يكون البرنامج بالشكل التالى :



الكود:


void main()
{
ANSEL = 0x00;   //set port as digital I/O , not analog input
CMCON = 0x07;   //shut off the comparator
TRISIO = 0x08;   //GP3 input , rest all output
GPIO = 0x00;      //make all pins low "0"
   while(1)
   {
      GPIO.B0 = 0 ;       //LED off
      delay_ms(500);   // half sec delay
      GPIO.B0 = 1 ;       //LED on
      delay_ms(500);   // half sec delay
   }
}


الآن قم ببناء (ترجمة) البرنامج (لاتنسى تحرير أعدادات المشروع بالشكل المطلوب) وحمل الملف الناتج HEX على برنامج بروتيس وجرب وشاهد النتيجة .

Admin
Admin

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

https://fathallaabdelaziz.forumarabia.com

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

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو  : Empty رد: برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو :

مُساهمة من طرف Admin الجمعة مارس 04, 2016 7:33 pm

التعديل الأول :
جعل البرنامج أكثر سهولة للغهم والقراءة :
• بوضع جميع الإعدادات فى شكل برنامج فرعى (فى لغة السى يسمى دالة Function والتى سوف نتعرض لها لاحقا ) بالشكل التالى :


الكود:


void init(){
CMCON = 7 ;   // Set GP<2:0> to  digital I/O
ANSEL=0;       // digital I/O  ANS<3:0>: Analog Select bits ,
//1 = Analog input , 0 = Digital I/O.
TRISIO = 0x08;   //Set GP3as input (rest) ,and SET GP<5:4,2:0> as outputS
GPIO = 0;       // Init GPIO
}


ويتم استدعائها فى بداية دالة البرنامج الرئيسى فى سطر واحد فقط وبصيغة تعليمة بالشكل التالى :


الكود:

Init();

• مع استخدام توجيه التعريف #define : وهو ليس تعليمة (لذلك لا تستخدم فى نهايته الفاصلة المنقوطة) ولكنه مجرد توجيه لإخبار أن عليه استبدال تسمية ما ، وتكون ذات مغزى، بمعرف من ضمن معرفاته .
• واستخدام تعليق مكتوب على عدة أسطر يبدأ بالأحرف (/*) وينتهى بلأحرف (*/) .


الكود:


/*
EX1: LED blinking using PIC12F675
4MHz internal clock
Master Clear Enable : Disable
Eng:F.Abdelaziz
Date :04-03-2016/
*/
//define LED pin
#define  LED  GPIO.F0
#define  ON  1
#define  OFF  0
void Init(){
ANSEL = 0x00;   //set port as digital I/O , not analog input
CMCON = 0x07;   //shut off the comparator
TRISIO = 0x08;   //GP3 input , rest all output
GPIO = 0x00;      //make all pins low "0"
}
//main function
void main()
{
Init(); //Call init function
   while(1)
   {
      LED = OFF ;       //LED off
      delay_ms(500);   // half sec delay
      LED = ON ;       //LED on
      delay_ms(500);   // half sec delay
   }
}



• يتم تعريف طرف الليد LED على أنه GP0 ( يمكنك استخدام أى طرف تريده) عن طريق التوجيه #define .
مرة أخرى :
فى الدالة الرئيسية :
• فى البداية يتم تحديد الإعدادات : هنا يتم فصل عمل كل من المحول من تناظرى لرقمى ADC والمقارن لجعل الطرف GP0 وباقى الأطراف كأطراف دخل أو خرج رقمى (المحول ADC والمقارن فى الحالة الافتراضية يكونا فى حالة تشغيل . لذلك يجب علينا فصلهما لأستخدام جميع الاطراف كمداخل / مخارج رقمية ) .أيضا نستخدم السجل TRISIO لتحديد اتجاه أى طرف كمدخل أو كمخرج . وايضا استخدام السجل GPIO لجعل أى طرف فى الحالة المنطقية المرتفعة high أو فى الحالة المنطقية المنخفضة low .
• يتم تحويل حالة طرف الليد LED فى حلقة while بعد كل نصف ثانية . بهذه الطريقة يمكنك بسهولة جعل الليد يومض باستخدام الميكروكونترولر PIC12F675 .

Admin
Admin

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

https://fathallaabdelaziz.forumarabia.com

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

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو  : Empty رد: برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو :

مُساهمة من طرف Admin الجمعة مارس 04, 2016 7:34 pm

تمهيد للتعديل الثالث : بعض عوامل التعامل مع البت المفردة Bitwise operators :
• عامل "المكمل" أو معكوس البت (~) : هذا العامل يعمل على معامل واحد فقط يكتب على يمينه ~LED ، هذا العامل يقوم بعكس حالة البت أو كل بت للمعامل لموجود على يمينه .
• العامل المنطقى XOR (أو الحصرية) ورمزه (^) ، هذا العامل له معاملان على جانبيه ، حيث يقوم بإجراء العملية المنطقية XOR ، وفيها يتم مقارنة البتات المناظرة لكل من المعاملين فإذا كان فقط أحد البتين (حصرى) بواحد كانت النتيجة بواحد وخلاف ذلك ( البتان بواحد أو البتان بصفر) تكون النتيجة بصفر .

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو  : 318

علامة التساوى (=) فى لغة السى تستخدم كعامل تعيين أو تخصيص ولها معاملين ، حيث تقوم بنسخ المعامل الموجود على يمينها إلى المعامل الوجود على يسارها .

Admin
Admin

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

https://fathallaabdelaziz.forumarabia.com

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

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو  : Empty رد: برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو :

مُساهمة من طرف Admin الجمعة مارس 04, 2016 7:38 pm

التعديل الثانى :
استخدام معامل المكمل أو عكس البت (~) :



الكود:


/*
EX1: LED blinking using PIC12F675
4MHz internal clock
Master Clear Enable : Disable
Eng:F.Abdelaziz
Date :04-03-2016/
*/
//define LED pin
#define  LED  GPIO.F0
#define  ON  1
#define  OFF  0
void Init(){
ANSEL = 0x00;   //set port as digital I/O , not analog input
CMCON = 0x07;   //shut off the comparator
TRISIO = 0x08;   //GP3 input , rest all output
GPIO = 0x00;      //make all pins low "0"
}
//main function
void main()
{
Init(); //Call init function
   while(1)
   {
      LED = ~LED  ;       //Inverse the state of pin GP0
      delay_ms(500);   // half sec delay
      
   }
}


Admin
Admin

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

https://fathallaabdelaziz.forumarabia.com

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

برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو  : Empty رد: برمجة العائلة PIC12F6XX والمترجم ميكروسى يرو :

مُساهمة من طرف Admin الجمعة مارس 04, 2016 7:41 pm

التعديل الثالث : استخدام العامل XOR وهو (^) :



الكود:


/*
EX1: LED blinking using PIC12F675
4MHz internal clock
Master Clear Enable : Disable
Eng:F.Abdelaziz
Date :04-03-2016/
*/
//define LED pin
#define  LED  GPIO.F0
#define  ON  1
#define  OFF  0
void Init(){
ANSEL = 0x00;   //set port as digital I/O , not analog input
CMCON = 0x07;   //shut off the comparator
TRISIO = 0x08;   //GP3 input , rest all output
GPIO = 0x00;      //make all pins low "0"
}
//main function
void main()
{
Init(); //Call init function
   while(1)
   {
      LED = LED^1 ;       //Inverse the state of pin GP0
      delay_ms(500);   // half sec delay
      
   }
}


Admin
Admin

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

https://fathallaabdelaziz.forumarabia.com

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

الرجوع الى أعلى الصفحة

- مواضيع مماثلة

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