توضیح نرم افزار
من در اینجا از توضیح در مورد خود برنامه خودداری میکنم زیرا برای توضیح آن شما باید اول به پروتکل USB آشنایی داشته باشید
و دوم اینکه ساختار داخلی میکروکنترلر PIC18F2455/4550 را هم در ارتباط با USB مطالعه کرده باشید در غیر اینصورت توضیح
کامل طرزکار آن زمان زیادی میبرد که از حوصله این نوشتار خارج است.
( شاید بعدها اینجا در مورد آن بنویسم )
در این قسمت شما فقط توضیحاتی را میخوانید که برای استفاده به آن احتیاج دارید.
اولین نکته ای که شما بدون توجه به اینکه آیا در برنامه خود از USB استفاده میکنید یا خیر اینست که:
- در حالت عادی نقطه آدرس صفر ( reset vektor ) برنامه شما از 0x0000 آغاز میشود و آدرس برای پرش به اینترراپت ها ( interrupt vektor ) در
آدرسهای 0x0008 و 0x0018 قرار دارند که در محدوده Boot Block هستند و این بلوک تا آدرس 0x07FF ادامه دارد بنابراین آدرس جدید نقطه صفر
به 0x0800 و آدرس اینترراپت شما به 0x0808 و 0x0818 انتقال یافته است.
این بلوک ( Boot Block )در حالت معمولی فیوز یا بیت محفوظ کننده آن روشن شده است و شما قادر نیستید حتی سهوا در این قسمت بنویسید.
اگر برنامه شما از USB استفاده نمیکند, تمامی امکانات کنترلر را در اختیار دارید, بغیر از 2 کیلو بایت اول حافظه فلاش که
حاوی کد Bootloader است.
اما اگر شما بخواهید در برنامه Firmware خود از پروتکل USB نیز استفاده کنید باید به این نکات توجه کنید:
- چون این برنامه ( Bootloader ) از خاصیت اینترراپت میکروکنترلر استفاده میکند باید در برنامه خود اینترراپت را آزاد کنید.
- 25 بایت اول حافظه RAM برای USB استفاده شده و نباید از این مکانها در برنامه خود استفاده کنید. یعنی اولین آدرس شما برای واریابلهای
مورد استفاده برنامه شما در حافظه RAM باید از 0x19 شروع شود.
من اسم بایت اول از این 25 بایت در حافظه RAM را Mode_State انتخاب کرده ام ولی شما میتوانید در برنامه خود از هر اسمی که مایل باشید استفاده کنید,
مهم اینست که باید در برنامه خود این بایت را تعریف کنید زیرا توسط بیت دوم این بایت ( Mode_State.1 = 1 ) برنامه شما متوجه خواهد شد که آیا از طریق USB
پاکت داده رسیده است یا خیر!
بعبارت دیگر در برنامه خود باید توسط چک کردن این بیت ( Mode_State.1 ) از ورود داده توسط Host اطلاع پیدا کنید.
برنامه شما توسط بیت سوم ( Mode_State.2 = 1 ) میتواند از تابع های ( funktion) Bootloader استفاده کند.
بیت اول ( Mode_State.0 ) در حالتی که Bootloader فعال است روشن میشود و در برنامه شما باید خاموش باشد.
- در برنامه خود باید آدرس 0x0004 را برای تنظیم ( USB_Init ) و
آدرس 0x0026 را برای تابع اینترراپت ( USB_IRQ ) تعریف کنید.
این تعریف با زبان آسمبلر میتواند بدینگونه باشد:
| 0x0004 |
EQU |
USB_Init |
| 0x0026 |
EQU |
USB_IRQ |
و با زبان C اینچنین :
|
| 0x0004 |
USB_Init |
define# |
| 0x0026 |
USB_IRQ |
define# |
هر دو این تابعها در Bootloader.hex به دستور " return " خاتمه مییابند و باید در زبان آسمبلر
از دستور " call " برای پرش به آنها استفاده شود.
- اگر احتیاج به تنضیمات خاصی برای میکروکنترلر داشته باشید و بخواهید بیت های configuration را خود تنظیم کنید,
نباید تنضیمات زیر را که مربوط به کارکرد USB است را تغییر دهید.
| CONFIG PLLDIV = 4 |
|
; Divide by 4 (16 MHz oscillator input) |
| CONFIG CPUDIV = OSC1_PLL2 |
|
; [Primary Oscillator Src: /1][96 MHz PLL Src: /2] |
| CONFIG USBDIV = 2 |
|
; USB clock source comes from the 96 MHz PLL divided by 2 |
| CONFIG FOSC = HS |
|
; HS oscillator, PLL enabled (HSPLL) |
| CONFIG VREGEN = ON |
|
; USB voltage regulator Enabled |
| CONFIG CPB = ON |
|
; Boot block (000000-0007FFh) is code-protected |
| CONFIG EBTRB = OFF |
|
; Boot block (000000-0007FFh) is not protected from table reads executed in other |
بدلیل اینکه در پروتکل fullspeed USB 2.2 به (Takt) فر کانس 48 MHz نیاز میباشد و این فرکانس از اوسیلاتور اصلی
میکروکنترلر انشعاب میشود و همچنین مقدار اوسیلاتور باید در موقع نوشتن برنامه مشخص و معلوم باشد تا در بخش تنضیمات ( Configuation ) ثبت شود
نمیتوان از اوسیلاتور دیگری برای این برنامه که برای اوسیلاتور 16 MHz نوشته شده استفاده کرد.
اگر عزیزان قادر به یافتن چنین اوسیلاتوری در ایران نباشند من چندین برنامه دیگر برای اوسیلاتورهایی که میشود استفاده کرد را نیز
تنظیم و کمپایلر کرده ام که در زیر پوشه [ Other OSC ] وجود دارند.
تفاوت این برنامه ها فقط در انتخاب اوسیلاتور است و مابقی برنامه مشابه است.
اگر مایل باشید که از تنضیمات دیگری برای اوسیلاتور استفاده کنید, (باید آن تغییرات را در قسمت Configuration انجام دهید) در اینصورت در
تنظیم این 3 پارامتر زیر دقت لازم را داشته باشید تا عملکرد برنامه دچار خطا نشود:
PLLDIV
CPUDIV
USBDIV
چون PLL مربوط به USB در PIC به یک فرکانس ورودی 4 MHZ نیاز دارد,
اوسیلاتور انتخابی شما باید بعد از تقسیم کننده برابر با 4 MHz باشد.
( به صفحه 24 Datasheet رجوع شود )
در برنامه بوت لادر, پروتکل Bulk برای USB انتخاب شده, بنابراین طول پاکت داده ها به 64 بایت محدود میباشد.
ترتیب یا فرم این پاکت دادهها بدین شکل میباشد.( از چپ به راست ).
| 〈< 59 Byte Daten > | < Adress Low > |
< Adress High > | < Adress Upper > |
< Anzahl data > | < CMD >〉 |
| 59 بایت داده | آدرس پایین |
آدرس بزرگ | آدرس بالا |
تعداد داده ها | دستور |
دستورات ( Command ) زیر در بوت لادر تعریف شدهاند.
| Format: [0x00]-[0x03]-[don't care...] |
0x00 |
Send Info String |
define# |
| Format: [0x01]-[don't care...] |
0x01 |
Flash Erase |
define# |
| Format: [0x02]-[data count]-[Adr Up]-[Adr Hi]-[Adr Lo]-[Data] |
0x02 |
Flash Write |
define# |
| Format: [0x03]-[data count]-[Adr Up]-[Adr Hi]-[Adr Lo]-[Data] |
0x03 |
Flash Read |
define# |
| Format: [0x04]-[data count]-[Adr Up]-[Adr Hi]-[Adr Lo]-[Data] |
0x04 |
Flash Modify |
define# |
| Format: [0x05]-[data count]-[Adr EE]-[don't care]-[don't care]-[ EE Data] |
0x05 |
EEPROM Write |
define# |
| Format: [0x06]-[data count]-[Adr EE]-[don't care]-[don't care]-[ EE Data] |
0x06 |
EEPROM Read |
define# |
| Format: [0x07]-[data count]-[Adr Hi]-[Adr Lo]-[don't care]-[RAM Data] |
0x07 |
RAM Write |
define# |
| Format: [0x08]-[data count]-[[Adr Hi]-[Adr Lo]-[don't care]-[RAM Data] |
0x08 |
RAM Read |
define# |
| Format: [0x09]-[don't care...] |
0x09 |
Version Read |
define# |
| Format: [0x0A]-[data count]-[0x30]-[0x00]-[config Adr]-[config Data]-[config Adr]-[config Data]-... |
0x0A |
Configuration Write |
define# |
| Format: [0x0B]-[don't care...] |
0x0B |
Rest PIC |
define# |
اگر مایل باشید که از این دستورات در برنامه خود نیز استفاده کنید باید بیت سوم واریابل Mode_State را روشن کنید ( Mode_State.2 = 1).
این ویژگی بسیار خوبی در این برنامه است, شما میتوانید بدون برنامه نوشتن, از امکانات داخلی PIC استفاده کنید. مثلا میتوانید با همین
بوت لادر توسط دستور RAM Write از PWM یا ADC و غیره استفاده کنید.
( فانتزی شما مرزی ندارد )
برای دانستن اینکه چگونه از اینترفیس USB در برنامه خود استفاده کنید به کد برنامه آزمایشی USBTest.c رجوع کنید.
این برنامه در پوشه USB Test قرار دارد.
در آنجا من از تلفیق دو زبان آسمبلر و C استفاده کردهام. قسمت اصلی ( main ) به زبان C است و قسمتی که به ارتباط USB مربوط است
به زبان آسمبلر.
( اگر با زیان C برنامه مینویسید در MPLAB میتوانید قسمتی از کد را نیز به آسمبلر بنویسید.)
این برنامه فقط برای این است که هم از عملکرد Bootloader اطمینان کنیم و هم کارکردن اینترفیس USB در برنامه خود را آزمایش کنیم.
در این برنامه آزمایشی میتوان سرعت چشمک زدن یک دیود نورانی را تغییر داد.
این دیود نورانی برای پایه RC1/T1OSI/CCP2/UOE در نرم افزار تعریف شده که توسط یک مقاومت با
مقداری بین 500 تا 1000 اهم به آن وصل میشود.
(این دیود نورانی همان است که برای Bootloader بصورت optional در نظر گرفته شده)
در فایل USBTest.asm فقط نقطه پرش یا آدرس این دو تابع برای ارتباط USB تعریف میشود.
در فایل USBTest.c از تایمر0 برای تعیین زمان چشمک زدن استفاده شده و برای تست
ارتباط USB, میتوان فرکانس چشمک زدن را تغییر داد.
برای آزمایش اینکه آیا ارتباط USB هم در برنامه ما درست عمل میکند یا خیر به یک برنامه ( API ) هم در کامپیوتر خود احتیاج داریم.
برای این منظور میتوانید از USBTestAPI.exe استفاده کنید.
بعد از اینکه فایل USBTest.hex را با موفقیت توسط UsbBootAPI.exe در فلاش بارگیری کردید
باید یک ریست انجام دهید و بعد از اینکه کامپیوتر شما
دستگاه را پیدا کرد ( اینبار از شما درایور نخواهد خواست چون مشخصات این USB مانند Bootloader است ) آنگاه باید برنامه
TestUSB.exe را اجرا کنید. اگر همه چیز درست باشد شما باید قادر باشید توسط این برنامه
از طریق USB فرکانس چشمک زدن دیود نورانی را تغییر دهید که نشاندهنده این است که ارتباط USB بین کامپبوتر و برنامه (Firmware) هم بر قرار است.
امیدوارم که این پروژه برای شما مفید باشد. اگر سوالی یا پیشنهادی دارید
از قسمت نظر شما استفاده کنید.
( از اینجا به بعد فقط فانتزی شماست که شما را محدود میکند)
صفحه قبلی
|