قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 22-08-2012, 09:35 PM المشاركة 9   
افتراضي



جزاك الله كل الخير استاذى العزيز كنت اعتقد ان كل المايكرو كنترولرات بتفع ولاكن حسب شرحك يجب ان يكون فى المايكرو موديول usb لكى يعمل

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-08-2012, 03:16 AM المشاركة 10   
افتراضي


جزاك الله كل الخير استاذى العزيز كنت اعتقد ان كل المايكرو كنترولرات بتفع ولاكن حسب شرحك يجب ان يكون فى المايكرو موديول usb لكى يعمل
أخى الكريم

شكرا جزيلا لك

بارك الله فيك

يوجد حلول برمجية معقدة للميكروكونترولر الخالى من موديول USB .

مع تمنياتى بدوام التوفيق

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-08-2012, 03:19 AM المشاركة 11   
افتراضي


البرمجة :
الآن حان وقت البرمجة .
الميكروسى يضم مكتبة للاتصال التسلسلى العام USB library . يمكنك أن تجدها فى "إدارة المكتبة" “Library Manager” .
للتفاصيل حول روتينات دوال المكتبة يمكنك تتبع :


Help→mikroC PRO for PIC Libraries→Hardware Libraries


فى نهاية القائمة سوف تجد “USB Library” .





مكتبة USB بالميكروسى :
يوفر الميكروسى نوعين من مكتبة USB . واحدة للاتصال العام للناقل USB والأخرى للاتصال للفئة
HID USB . سوف نناقش النوع الأخير .

دوال المكتبة :
1- الدالة HID Enable :
الصيغة :
void HID_Enable(char *readbuff, char *writebuff);




الغرض :
لتمكين الاتصال USB HID .
البارامترات :




بارامتران :
  • ReadBuffer: المتغير (بعبارة أدق المصفوفة) حيث تريد حفظ بيانات USB التى تأتى من الكومبيوتر .
  • WriteBuffer : حيث تريد أن تخزن البيانات التى سوف ترسلها إلى الكومبيوتر .
العائد :
لا يوجد .
المتطلبات :
لا يوجد .
يجب إستدعاء هذه الدالة قبل استخدام الدوال الأخرى من المكتبة USB HID .


مثال :
HID_Enable(&readbuff,&writebuff);




ملاحظة :
وفقا للداتا شيت هذه المتغيرات يجب أن تكون فى الذاكرة USB RAM . الميكروكونترولر به
1 Kbyte USB RAM , تبدأ من 400h إلى 7FF .






من العنوان 400h إلى العنوان 4FFh من أجل "الواصف" descriptor . لذلك لدينا فعليا من العنوان 500h إلى العنوان 7FFh بتخزين البيانات . لذلك سوف يتم إعلان المتغيران كما يلى :
unsigned char readbuff[64] absolute 0x500;
unsigned char writebuff[64] absolute 0x540;



تذكر :
التوجيه “absolute”Directive :

يحدد عنوان البداية فى ذاكرة RAM "للمتغير" أو عنوان البداية فى ذاكرة ROM "للثابت". إذا كان المتغير أو الثابت متعدد البايتات , فإن البايتات الأعلى سوف يتم تخزينها عند المواقع المتتابعة .




يتم إلحاق التوجيه absolute لإعلان المتغير أو الثابت كما يلى :
  • المتغير x سوف يحتل 1 بايت عند العنوان 0x2 :
// Variable x will occupy 1 byte at address 0x22 :short x absolute 0x22;

· المتغير y سوف يحتل 2 بايت عند العناوين 0x23 و

0x24 :// Variable y will occupy 2 bytes at addresses 0x23 and 0x24 :int y absolute 0x23;
· عناصر المصفوفة ConstantArray سوف توضع فى مواقع متعاقبة بداية من العنوان 0x1000 :

// Array elements will be placed on the consecutive locations starting from 0x1000 :const short ConstantArray[] = {1,2,3} absolute 0x1000;


ملحوظة :
إذا أردت وضع ثابت من النوع البسيط فى ذاكرة Flash memory فبدلا من الإعلان التالى :

const short SimpeConstant = 0xAA absolute 0x2000;

استخدم مصفوفة مكونة من عنصر مفرد كما يلى :const short

SimpleConstant[] = {0xAA} absolute 0x2000;

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

· المتغير i سوف يحتل 1 بايت عند العنوان0x33 :

// Variable i will occupy 1 byte at address 0x33char i absolute 0x33;

· المتغير سوف يحتل 4 بايت عند العناوين

0x30, 0x31, 0x32, 0x33// Variable will occupy 4 bytes at 0x30, 0x31, 0x32, 0x33; thus,long jjjj absolute 0x30;

تغيير i يتسبب فى تغيير إعلى بايت فى jjjj فى نفس الوقت والعكس بالعكس .



2- الدالة HID_Read :


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 23-08-2012 الساعة 03:35 AM

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-08-2012, 03:27 AM المشاركة 12   
افتراضي


2- الدالة HID_Read :الصيغة :char HID_Read(void);




الغرض :
استقبال الرسالة من المضيف host وتخزينها فى المخزن العازل المؤقت للقراءة Read Buffer .
البارامترات :
لا يوجد
العائد :
  • إذا فشلت قراءة البيانات ترجع الدالة بالصفر "0" .
  • وإن كان خلاف ذلك ترجع عدد الأحرف التى وردت من المضيف .
المتطلبات :
يجب إستدعاء دالة التمكين قبل استخدام هذه الدالة .

مثال : إعادة محاولة القراءة حتى النجاح
// retry until success
while(!HID_Read());





3- الدالة HID_Write :
الصيغة :
char HID_Write(char *writebuff, char len);


الغرض :
ترسل الدالة البيانات من المخزن العازل المؤقت للكتابة Write Buffer إلى المضيف .
البارامترات :
لهذه الدالة بارامتران هما :
  • اسم متغير مخزن الكتابة writebuff . وهو نفس البارامتر المستخدم فى دالة التمكين .
  • و طول البيانات المرسلة len.
العائد :
  • إذا فشل إرسال البيانات تعود الدالة بالصفر "0" .
  • خلاف ذلك تعود بعدد البايتات المرسلة.
المتطلبات :
يجب إستدعاء دالة التمكين قبل استخدام هذه الدالة .
ملاحظة :
إستدعاء الدالة يحتاج إلى التكرار طالما لم يتم إرسال البيانات بنجاح .
مثال : إعادة محاولة الكتابة حتى النجاح
// retry until success
while(!HID_Write(&writebuff,64)) ;





3- الدالة HID_Disable :
الصيغة :
void HID_Disable(void);







الغرض :
عدم تمكين الاتصال USB HID .
مثال :
HID_Disable();






4- الدالة USB_Interrupt_Proc :
الصيغة :
void USB_Interrupt_Proc(void);





الغرض :
هذه الدالة تستخدم لخدمة مختلف أحداث ناقل USB . يجب أن تستدعى داخل روتين مقاطعة USB .
مثال :

void interrupt()
{
USB_Interrupt_Proc();
}





البرنامج (الكود) :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-08-2012, 05:49 PM المشاركة 13   
افتراضي


البرنامج (الكود) :

كود:
 
unsigned char readbuff[64] absolute 0x500; // Buffers should be in USB RAM, unsigned char writebuff[64] absolute 0x540; char cnt;
void interrupt(){ USB_Interrupt_Proc(); // USB servicing is done inside the interrupt } void main(void){ ADCON1 |= 0x0F; // Configure all ports with analog function as digital CMCON |= 7; // Disable comparators HID_Enable(&readbuff,&writebuff); // Initialize HID communication and specify our read and write buffers while(1){ // Main program loop while(!HID_Read()); // Loop until there's data to read on HID
for(cnt=0;cnt<64;cnt++) // Loop through our 64 byte buffer. writebuff[cnt]=readbuff[cnt]; // Echo each byte from the read buffer to the write buffer
while(!HID_Write(&writebuff,64)); // Send the write buffer over USB } }



التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 23-08-2012 الساعة 05:52 PM

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-08-2012, 06:00 PM المشاركة 14   
افتراضي


نبدأ بتعريف متغيرات من النوع unsigned char والتى ستكون بمثابة مخازن مؤقتة buffersللقراءة والكتابة .هذه المتغيرات فريدة من نوعها فى أننا سوف نحدد أين يضعها المترجم فى ذاكرة RAM للميكروكونترولر من خلال تحديد عنوان البداية بالتوجيه absolute.

كود:
unsigned char readbuff[64] absolute 0x500; // Buffers should be in USB RAM, unsigned char writebuff[64] absolute 0x540; char cnt;

كما ترى لقد حددنا العنوان 0x500 لبداية المخزن المؤقت للقراءة read buffer والعنوان 0x540 لبداية المخزن المؤقت للكتابة write buffer . كما عرفنا أيضا متغير يسمى cnt نوع char لنستخدمه , فيما بعد , كعداد فى حلقة for .
سوف نستخدم عملية المقاطعة فى خدمة USB , لذلك نحتاج إلى تضمينها بالبرنامج كما يلى :
كود:
void interrupt(){
  USB_Interrupt_Proc();                   // USB servicing is done inside the interrupt
}



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



كود:
void main(void){ ADCON1 |= 0x0F; // Configure all ports with analog function as digital CMCON |= 7; // Disable comparators HID_Enable(&readbuff,&writebuff); // Initialize HID communication and specify our read and write buffers while(1){ // Main program loop while(!HID_Read()); // Loop until there's data to read on HID
for(cnt=0;cnt<64;cnt++) // Loop through our 64 byte buffer. writebuff[cnt]=readbuff[cnt]; // Echo each byte from the read buffer to the write buffer
while(!HID_Write(&writebuff,64)); // Send the write buffer over USB } }






أحد الأجزاء الهامة فى هذا البرنامج هى الطريقة التى يتم بها عمل حلقات خلال 64 بايت الموجودة بالمخزن المؤقت buffer , وعد ذلك عندما نكتب محتويات المخزن المؤقت إلى USB عن طريق HID_Write , علما بأنه يجب علينا إرسال 64 بالكامل , حتى لو لم نستخدم سوى جزء منها . هذا يعود إلى الواصف حيث تم تحديد طول التقرير “Report Length” , لذلك يجب أن تتطابق خزمتنا المرسلة مع هذا الطول .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 24-08-2012, 04:17 AM المشاركة 15   
افتراضي


المحاكاة من خلال برنامج بروتيس :


الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 24-08-2012, 03:12 PM المشاركة 16   
افتراضي


جزاك الله كل الخير استاذى العزيز ممكن ملف الشروحات لوسمحت حتى اطبعه على الورق



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 07:05 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)