|
:: عضو فضي ::
تاريخ التسجيل: May 2010
الدولة: LIBYA-BENGHAZY
المشاركات: 1,479
|
|
نشاط [ lovevb6 ]
قوة السمعة:123
|
|
27-05-2012, 07:22 PM
المشاركة 1
|
|
السلام عليكم ورحمة الله وبركاته
اولاا: يلزمنا ان نحضر كوب الشاي او القهوة ضروري جداا
ثانياا : يجب ان تكون الاعصاب هادئه وان لا يكون ورائك موعد يقطع حبل تركيزك وان ننقطع بشكل مؤقت عن العالم الخارجي وان ننسى الضروف قليلاا
ثالثا: نرش القليل من الماء ..ههههههههههههههه على قول استاذي ناصر
رابعاا : واخيراا يجب ان لا نقراء بسرعه.. نكرر قرائه السطر اكثر من مره ونتاني فى كل سطر لان الموضوع دسم
نبدء الان فى شرح الكود وهو كود صديقنا الاستاذ احمد الطباخ (ليون)
وللعلم هذا الشرح هو من صديقى احمد الطباخ (lion) وما انا الا لنقل الامانه فقط
هذا هو المشروع كاملاا والذي سوف نشرح جزء الكود فقط هنا( نفس الملف الاول ) ..اما جزء الهاردوير والانترفيس فهو موجود فى الجزء الاول
http://www.mediafire.com/?jfmgdd400quaidi
طبعاا قبل البدء فى شرح كود اخى احمد الطباخ اريد ان ادلو بمقدمه بسيطه عن الكود
انصح الجميع بضرورة قرائه المقدمه:
هناك من يجد صعوبه فى فهم البرنامج لكثرة ملفاته واكواده لدرجة تجعلنا ننفر من التعامل مع المكتبات والسبب الرئيسي هو المكتبات بصفه عامه ..واقول هنا ان هذه المكتبات لا شان لنا بها كل ما نريده هو كيف يمكننا ان نطور الكود ونغيره بما يتلائم مع مشروعنا او اي مشروع اخر للماتركس
ما هي هذه المكتبات ..هي مكتبات مثلها مثل المكتبات الجاهزه التي نجدها فى الميكرو سي مثلاا مكتبة (uart) فعند كتابتها فقد هيئنا البك للاتصال والارسال وذلك فى اقل من سطر ..ولكن فى الحقيقه ما يدورفي الخفاء هو مئات الاسطر من البرمجه ولكن لا نراها ويمكن ان تراها فى ملف الاسمبلي الذي يخرج بعد الكومبيلار
ونحن نعرف ان الميكروسي اصلاا هو عباره عن مكتبات جاهزه واختصارات جاهزه تبسط لنا التعامل مع البك ..ولكن فى الاصل التعامل يتم مع الاسمبلي بمئات الاسطر من البرمجه وربما الالاف من الاسطر
مثلاا فى الفجوال بيسك ببعض الاحيان نقوم بانشاء ملف DLL وهذا المف مثله مثل المكتبه يقوم بعمل معين عند استدعائه
والمكتبات فى هذا البرنامج ما هي الا موديولات لتسيير البرنامج وتنظيمه وكل ما يهمنا هو البرنامج الرئيسي فيها
هنا قام الاخ احمد الطباخ بانشاء مكتبات ومويديولات بلغى السي امبيدد ( انا لم اتعامل مع هذه اللغه مطلقاا) وهذه المكتبات ما هي الا لكي نتعامل مع الليد ماتركس من نوع (8*16 ) الى (8*64) بكل سهوله
انتهت المقدمه
شرح البرنامج
فى مشروعنا هذا الموضوع يدور حول 5 ملفات وكل ملف له امتدادين امتداد (C) والامتداد (h) ..وهذه الملفات نستخدمها لتهيئه اطراف ونوع البك وسنشرح بعظها لكيفية تحويرها
قبل تصنيف الملفات اريد ان انوه الى انه كل ملف يحوي ملف اخر والملف الاخر يحوي الملف الاخر برمجياا اي كل ملف يستدعي ملف اخرى
الملفات هي :
1- (allchars.c) وهذا الملف يحتوي على مصفوفه به جميع الحروف الانجليزيه والرموز والتى نستخدمها لاخراج الاحرف عن طريق معادله خاصه لاستخراج كل حرف ويتم ذلك عن طريق الاسكي كود لكل حرف
2- (c4017_matrix.c) (c4017_matrix.h)
هذان الملفان هما خاصان بالتعامل مع المتكامله CD4017 وتهيئة اطرافها
3- (dio.c ) (dio.h ) (dio_config.h) وهي DIGITAL INPUT OUTPUT
وهذه الملفات خاصه بالميكروكونترولار وتهيئة اطراف الاخراج والادخال للميكرو وتمكننا من اختيار نوع المتحكم اذا كان AVR او PIC وكذلك الكرستاله وسيتم شرح جزئيه مهمه منه
4- (usart.h) (usart_config.h) (usart.c) هذه الملفات تخص بتهيئه اطراف الارسال والاستقبال
5- (test.ppc)(usart.c) وهذان الملفان معروفان هما لتجميع الملفات الرئيسيه والاكواد للبرنامج ككل وسنشرحه محتواه بالتفصيل
كيفية ادراج المكتبات فى اي مشروع
1-افتح برنامج الميكروسي.
2- انشاء برنامج جديد.
3-يتم نسخ الملفات السابق ذكرها الي المسار اللذي يحتوي علي المشروع الجديد
4- في برنامج الميكرو سي من قائمه project يتم اختيار add to project.
5-يتم اختيار المسار اللذي يحتوي علي المشروع ومن ثم يتم اختيار الملفات اللتي تم نسخها من قبل .
6-يتم تغير امتداد الملف من .c
الي .h
حتي نستطيع اضافه الملفات المتبقيه.
8- في بدايه البرنامج يتم استدعاء المديول عن طريق كتابه
كود:
#include “dio.h”
#include “c4017_matrix.h”
يمكنك الان استخدام المكتبه
ومن يجد صعوبه فى كيفية ادراج المكتبات لاي مشروع فليسأل وسوف ازيد فى التفصيل
شرح الموديلا المهمه للتغير والتحوير
الان سنشرح الموديلات المهمه التي تجعلنا نتعامل مع نوع pic
من الملفات التي تهمنا للتحوير هي (dio_config.h) وهو نوع هيدر فايل (موديول) ويجعلنا هذا الموديول ان نتعامل مع البك او avr بنفس الاكواد والمكتبات ومن هنا نستطيع ان نختار هل سوف نستخدم pic او avr
سنجد انه مكتوب به التعريفات الاتيه
كود:
#ifndef __DIO_CONFIG_H
#define __DIO_CONFIG_H
#define AVR 1
#define PIC 2
#define TRUE 1
#define FALSE 0
#define TARGET PIC
#define PA FALSE
#define PB TRUE
#define PC TRUE
#define PD TRUE
#define PE FLASE
#define PG FALSE
#endif
فى السطر السابع اخترنا الهدف هو pic
اي اننا سنستعمل فى مشروعنا البك
طبعاا اذ اردنا avr نضع avrبدل pic
كود:
#define PA FALSE
#define PB TRUE
#define PC TRUE
#define PD TRUE
#define PE FLASE
#define PG FALSE
هنا يمكننا ان نختار البورتات(المنافذ) المسموح لنا استعمالها ..البورت الذي نحتاجه نكتب بجانبه TRUE ويجب ان تكون الكتابه بالكابتل وليس اسمول والذي لا نحتاجه نكتب بجانبه FLASE
الان ناتي الى الموديول الاخر (usart_config.h) الخاص بالسيريال
ونجد الكود الاتي
كود:
#ifndef __USART_CONFIG_H
#define __USART_CONFIG_H
#ifndef AVR
#define AVR 1
#define PIC 2
#endif
#define CLOCK 20000000
#define TARGET PIC
//DETAILS FOR PIC
#define S_PORT 'C'
#endif
هنا سوف نتاكد من ان الكلوك الخاص بالبرنامج كما فى مثالنا هذا هو 20000000(20 ميجا) الموجود فى السطر السابع وكذلك نوكد على ان النوع المستخدم هو البك كما فى السطر الثامن
التعليمه هنا قلنا ان المنفذ المستعمل للسيريال (الاستقبال والارسال ) انه موجود على البورت سي ..لان البك 877 منفذ الاتصال له هو البورت سي
هذا يعني انه لو استعملنا بك اخر مثلاا نوع 628 فان منفذ الاتصال الخاص به هو البورت بي فذلك يعني ان نضع البورت بي بدل البورت سي
بهذان الموديلان استطعنا ان نحدد نوع الميكرو المستعمل والمنافذ الخاصه به
اما باقي الموديلات والمكتبات سياتي شرح بعظها من خلال شرحنا للداله الرئيسيه
شرح الدالة الرئيسيه (الملف الرئيسي)
كود:
#include "c4017_matrix.h"
#include "usart.h"
#define MATRIX_SIZE 20
volatile unsigned char gen_counter=0;
volatile unsigned char buff_selector=1;
volatile char buffer[2][MATRIX_SIZE]="Enter your message";
void interrupt(void)
{
//dio_toggle_bit('c',3);
//serial interrupt
buffer[buff_selector][gen_counter]=_usart_read_interrupt();
//_usart_send(myname[gen_counter]);
gen_counter++;
gen_counter=gen_counter%(MATRIX_SIZE-1);
if(gen_counter==0){buff_selector++;
buff_selector=buff_selector%(2);
}
INTCON|=1<<GIE | 1<<PEIE;
PIR1&=~(1<<RCIF);
}
void main(void)
{
c4017_matrix_init('b','d',4,'d',7);
//dio_init_bit_output('c',3);
_usart_init(9600);
_usart_config_interrupts(RX_EN,TX_DIS);
INTCON|=1<<GIE | 1<<PEIE;
_usart_send_text("serial_init_done");
while(1)
{
c4017_matrix_print_text(buffer[(buff_selector+1)%2],10,80,10);
}
}
سناتي الى شرح كل جزء انشالله
كود:
#include "c4017_matrix.h"
#include "usart.h"
#define MATRIX_SIZE 20
volatile unsigned char gen_counter=0;
volatile unsigned char buff_selector=1;
volatile char buffer[2][MATRIX_SIZE]="Enter your message";
فى اول السطرين قمنا باحتواء الملفين (usart.h) (c4017_matrix.h) وهما يقومان باحتواء باقي الملفات ..اي كما قلنا ان كل ملف يستدعي ملف اخر وكل ملف يحتوي ملف اخر ..وبهذه التعليمه احتوينا الملفان اللذان سيقومان بدورهما باستدعاء او احتواء باقي الملفات الخاصه بتهيئة اطراف البك والمتكامله 4017
ولو فتحنا الملف (usart.h) سنجد انه يحتوي على دوال ..والان نستطيع استخدام هذه الدوال بكل حريه وسنشرح الدوال التي استخدمناها
السطر الثالث قمنا بتعريف حجم مصفوفه بعشرين حرف
السطر الرابع هو خاص لعد الحروف ( عدادا الحروف ) ويبدا العد من الصفر وسوف نشرح كيف نستخدمه
السطر الخامس هو خاص لاختيار المصفوفه وسوف ياتي دور شرحه ..وانا اسميه فى الشرح بالاخ سيليكتور
السطر السادس قمنا بتعريف عدد المصفوفات وهنا ثلاث مصفوفات واحد رقمها صفر وهي التي تعرض رساله مخزنه (ثابته) وهذه الرساله هي( Enter your message)
اما المصفوفتان الاخريتان وهي المصفوفه 1 والمصفوفه 2
وستكون هاتان المصفوفتان للعرض ..كيف؟؟؟
باختصار ستكون مصفوفه تعرض فى الجمله والاخرى تنتظر ان تمتلي واذا امتلئت المصفوفه الثانيه سيتم عرضها وانتظار امتلاء المصفوفه الاخر وهكذا
اي واحده تعرض والاخرى تنتظر الى ان تمتلى وبعد امتلائها ستعرض هي وتفرغ الاخرى وتنتظر هي الاخرى الى ان تمتلئ
وساشرح كيف يتم ذلك عن طريق الكود
كود:
void interrupt(void)
{
buffer[buff_selector][gen_counter]=_usart_read_interrupt();
gen_counter++;
gen_counter=gen_counter%(MATRIX_SIZE-1);
if(gen_counter==0){buff_selector++;
buff_selector=buff_selector%(2);
}
INTCON|=1<<GIE | 1<<PEIE;
PIR1&=~(1<<RCIF);
}
وهي داله المقاطعه
السطر الاول:
يقوم الاخ بفرسيليكتور [buff_selector]بتاشير على المصفوفه الجديده فى حالة امتلائت المصفوفه الاولى ويقوم باحظارها الى دالة الطباعه لطباعة المصفوفه الممتلئه
اي هو الذي يختار اي مصفوفه التي سنعمل عليها
[gen_counter] وهذا يعد احنا واقفين على اي حرف ..اي يخبرنا فى اي حرف
طبعاا الحروف بتتعد كالاتي الحرف الاول صفر والحرف الثاني 1 وهكذا
اذاا وظيفته هو العد وهنا وظيفته لكي يقول لنا فى اي رقم من الحروف الان
الحروف التي يستقبلها يقوم بوضعها كترتيب للحروف ..اي الحرف الاول الذي يستقبله يقوم بوضعه فى الخانه صفر والحرف الاخر يضعه فى الخانه 1 وهكذا الى ان تمتلئ المصفوفه
اي لو كان [gen_counter] بصفر فهذا يعني انه واقف على الحرف الاول واذا كان بواحد فهذا يعنى انه واقف على الحرف الثاني وهكذااا
_usart_read_interrupt() هي داله جاهزه تعرفيها موجود فى احدى الملفات ووضيفتها تستقبل الحرف من السيريال وتضعه فى البفر
السطر الثاني++gen_counter هنا اضفنا العداد بواحد
السطر الثالث والرابع والخامس
وهي معادله لظبط الماتركس كحجم لاننا لا نريده ان يتعدي حجم الرساله والتي حددناها ب20 لانه لو عد اكثر من 20 معناها انه سيخرج خارج الماتركس
تخليه لو خرج بره المصفوفه حتخليه يرجع من جديد
نحن نعرف ان اخر المصفوفه هي 20 يعني كعداد هو 19
واستعملنا خاصيه باقى القسمه لكي يحافظ على رقم 19 ولا يخرج خارج الماتركس
وهو الان يعمل فى دوره مستمره ويلف على المصفوفه ليملئها وفى حالة باقى القسمه سيرجعها الى صفر
if(gen_counter==0){buff_selector++;
واذا كانت بصفر سنجعله يختار مصفوفه لكي يملئها من جديد ..اي المصفوفه التي عليها الدور لكي تمتلئ
INTCON|=1<<GIE | 1<<PEIE;
PIR1&=~(1<<RCIF);
فى هاذين الخطوتين عملنا تنضيف او مسح (CLEAR) للسيريال وكذلك عملنا ENABLE للمقاطعه لاحتمال انه يعمل ريسيت اثناء(interrupt handling)
ان لم تفهم فلا تحزن فسوف تفهم فى الداله الرئيسيه
كود:
void main(void)
{
c4017_matrix_init('b','d',4,'d',7);
//dio_init_bit_output('c',3);
_usart_init(9600);
_usart_config_interrupts(RX_EN,TX_DIS);
INTCON|=1<<GIE | 1<<PEIE;
_usart_send_text("serial_init_done");
while(1)
{
c4017_matrix_print_text(buffer[(buff_selector+1)%2],10,80,10);
}
}
السطر الاول
عملنا تهيئه للموديول الخاص بالعداد 4017 وهو موجود فى الملف c4017_matrix.h وسنجده فى اول داله وهو كالاتي
كود:
c4017_matrix_init(unsigned char data_port,unsigned char scan_port,unsigned char number_of_blocks,unsigned char clock_port,unsigned char clock_bin);
كود:
c4017_matrix_init('b','d',3,'d',7);
اما وظيفة هذا السطر هو كالاتي
سنجد اول رمز (b) وهذا يعني ان الداتا سترسل من البورت دي للبك
سنجد اول رمز (d) وهذا يعني ان الاينيبل للبورت دي الخاص ب 4017 الذي سنوصل به العداد
ويلي ذلك رقم (3) وهو الذي نحدد به عدد البلوكات (عدد الماتركس) وكل بلوك (ماتركس) يحتوي على 8 بتات
اي يحدد لنا نوع الماتكرس اذا كانت ستكون من نوع 8*24 كمثالنا هذا او اذا اردنا ان نضيف ماتركس اخرى من نوع 8*32 سنجعل الرقم 4 بدل من 3 وهكذا الى 64
وبعد ذلك يلى الرمز (d) وهذا يعني اننا سنستعمل نفس البورت دي لاعطاء النبظات (الكلوك) وهو الكلوك الذي يحتوي على البت لكي نعمل كلوك لل 4017
واخيراا الرقم (7 ) وهو عباره عن رقم البت التي تعمل كلوك لل 4017 الذي استخدمناه فى مثالنا هو البورت (RD7)
ولكن كيف عرف الميكروسي هذا الترتيب ؟؟؟
عن طريق الداله الخاصه بذلك لاحظ الصوره وسوف تفهم عمل الدوال
السطر الثاني
السطر الثاني لن نحتاج اليه وكانت وظيفته هو جعل البور سى 3 كا output
السطر الثالث
جعلنا سرعة نقل البيانات تساوي 9600 وكذلك فى الانترفيس يجب ان تتوافق نفس السرعه
السطر الرابع
كود:
_usart_config_interrupts(RX_EN,TX_DIS);
RX ENEBLE=RX_EN
TX ENEBLE=RX_DIS
كان هذا توضيح لمعني (RX_EN,TX_DIS)
ووظيفه هذا السطر هو تفعيل المقاطعه على بن الاستقبال وحعل بن الارسال خامله الخاصه بالسريال
السطر الخامس
كود:
INTCON|=1<<GIE | 1<<PEIE;
هنا عملنا تفعيل لخاصيه المقاطعه جنيرال انتربت للارسال
السطر السادس
كود:
_usart_send_text("serial_init_done");
هذا السطر هو فقط لتاكد من سلامة الاتصال وهو لارسال جمله من البك الى الكومبيوتر
السطر الاخير
كود:
c4017_matrix_print_text(buffer[(buff_selector+1)%2],10,80,10);
وهو اهم سطر ووظيفته انه ياخذ البفر وقد عرفنا ان البفر هو عباره عن مصفوفه من 20 حرف وهذه المصفوفه تحتوي على الرساله المراد اضهارها على الماتركس
ومن خلال الداله الخاصه بها الموجوده فى الملف( c4017_matrix.h السطر الثالث) نجد ان الداله تاخذ الرساله ثم السرعه وهي عباره عن عدد تكرار الرساله نفسها قبل ما نعمل لها شفت ثم زمن التشغيل ثم زمن الاطفاء
وهو موضح بالصوره
تنبيه: الرقم الاخير الذي يمثل زمن الاطفاء ويجب تغييره الى ان نضبط الشكل المناسب وهنا تم وضع 10 لكي تظهر المحكاة بشكل افضل
اما فى الهاردوير سنضع ما بين الصفر الى 6 فهذا يعتمد على التجارب ...واعتقد ان رقم 5 هو المناسب ...وعلى نصيحه اخي احمد الطباخ فقط نصح فى هذا السطر بستعمال الارقام الاتيه ((((19,32,5))))) والتجارب هي التي تحكم
هذه الداله باختصار بتعرض الرساله التي امتلائت وذلك عن طريق buff_selector+1
وهو الذي بيعرض الرساله
اي بعرض المصفوفه التي لا يشير اليها البفر سيلكتور
شرح هذه السطر بطريقه اخرى
هنا تاخذ الرساله المراد طباعتها (buffer[(buff_selector+1)%2] وبعد ان يتاكد من حجم المصفوفه وهي 19 يعني الرساله تكون جاهزه للطباعه وينقصها التنسيق فى السرعه وزمن التشغيل والاطفاء
وبعد ذلك تاخذ باقى المعطيات (,10,80,10) والتي تم شرحها بالصوره
انتهى شرح الكود
الخلاصه :
نفهم ان وضيفة الكود هو قمنا بتعريف 3 مصفوفات
المصفوفه 0 ..المصفوفه 1 ...المصفوفه 2
المصفوفه صفر هي ثابته وتعرض فى رساله ثابته
المصفوفه واحد والمصفوفه 2 هما لتبادل العرض
وحتى لا يحدث خروج عن نطاق المصفوفه وضعنا معادله لتنظيم المصفوفه
الاخ( بفر سيلكتور) هو المسؤل عن اي من المصفوفتين( المصفوفه واحد والمصفوفه 2 ) التي امتلئت ويقوم باحضارها الى دالة الطباعه ويراقب المصفوفه التي لم تمتلئ او التى على وشك الامتلائ وبعد امتلائها يمسح المصفوفه التى كانت تعرض ويضع بدلها المصفوفه الجديده ويبدء فى مراقبه المصفوفه القديمه من جديد وهكذاا
الفائده :
يمكننا ان نغير حجم المصفوفه ولا يوقفنا الا حجم الذاكره
يمكننا ان نزيد عدد البلوكات الى 8 اي 64 عمود .. ومع القليل من التحوير يمكننا اكثر من ذلك
يمكن ان نعمل مصفوفات اكثر من 2 ونخزن بها الرسائل بدل من مسحها وعن طريق السويتش بوتون نعرض الرساله التى نريد
يمكننا ان نصع اي بك او اي ميكرو مثل AVR (لا يوجد عندي اي خبره فى هذا المتحكم)
وكذلك يمكننا ان نجعل الاخ بفر سيلكتور ان يطبع الحرف مباشره على الماتركس يعني بمجرد ما ان نضغط حرف سنجده مباشره على الماتركس ولا يعمل سريان للرساله الا بعد الظغط على انتر
يمكننا بكل بساطه ان نجعل المشروع يعمل لاسلكي مثل الانفرارد
وكذلك عن طريق الكيباد
التحكم فى الاطراف التي نريدها بكل سهوله وتغيير اي طرف نريد
هذا الشرح هو منقول من الاستاذ احمد الطباخ وهو حالياا مشغول بالامتحانات وانشالله سوف يدلو بدلوه فى الموضوع
اتمنى من الجميع طرح اسئلته فى هذا المشروع حتى تعم الفائده ولكن لا اعد احد بالاجابه الا اذا كنت على علم بها والا سوف الجاء بسؤال صديقى احمد الطباخ لو امكننى ذلك وذلك بعد التوفيق من الله عز وجل
طبعاا الدوال كثيره ولكن اغلبها كما تم شرحها فى هذا المثال
###############################################
الان لكي نعكس خرج البورت بي وذلك لكي نستطيع اضافه uln2803 مثلاا
وطبعاا مشكلة البروتس لا يستطيع التعامل مع هذه المتكامله
فلذلك سوف نضع بوابة not امام كل خرج من البورت بي لنتاكد من ان الخرج قد نجح عكسه
اولاا من ناحية الكود ::
نفتح الملف c4017_matrix.c ونغير كما فى الصور المرفقه
وننتبه لان ارقام تدرج الاكواد ان تكون مطابقه للكود الاصلي عشان تسلسل الارقام الخاصه بالميكرو سي ولكي تستطيع الذهاب الى سطر الكود مباشره
الان من ناحية بروتس للتاكد
نكتب not لاستخراج الاداه من بروتس ..كذلك الصور تشرح الطريقه
والان بكل بساطه نوصلها كما فى الصوره
والحمدالله الذي بفضله تتم الصالحات
اللهم صل وسلم على سيدنا محمد وعلى اله وصحبة اجمعين
التعديل الأخير تم بواسطة : lovevb6 بتاريخ 27-05-2012 الساعة 08:30 PM
|