بخشی از مقاله
CPU تراشه enCorRe دستور پشتيباني ميكند. همه برنامهها بايد از اين 37 دستور استفاده كنند. سيپرس يك مترجم مجاني ارائه ميدهد كه كدهاي اسمبلي را كه شما مينويسيد به فايلهاي موضوع، كه به منظور برنامهريزي در EPROM تراشه تهيه ميشوند، تبديل ميكند. اگر ترجيح دهيد كه در C برنامهنويسي كنيد، سيپريس يك مفسر C نيز پيشنهاد ميكند.
اگر با برنامهنويسي اسمبلي ميكروكنترلر آشنايي داشته باشيد، برنامهنويسي براي enCoRo نيز مشابه همان است. اما اگر با برنامهنويسي در بيسيك و C آشنا هستيد، بايد بدانيد كه در برنامهنويسي كدهاي اسمبلي بسياري از عملگرهاي زبانهاي سطح بالا موجود نيست در اينجا ديگر حلقههاي While يا for يا انواع مختلف متغيرها وجود ندارد. اما براي تراشهاي مانند enCoRo كه به منظور كارهاي نمايشي و كنترلي غير پيچيده طراحي شده است، استفاده از كدهاي اسمبلي عملي است. براي برنامههاي كوتاه، كه به سرعت اجرا ميشوند احتياجي به خريد مفسر نيست.
اصول برنامهنويسي اسمبلي
برنامهنويسي اسمبلي شامل يك مجموعه از دستورات است كه هر كدام مربوط به كدهاي ماشيني هستند كه تراشه از آنها پشتيباني ميكند. مثلاً دستور iord، كه محل io را ميخواند به كد h29 مربوط است. به جاي به خاطر آوردن h 29، شما ميتوانيد iord را بنويسيد، و مترجم معادل سازي را براي شما انجام خواهد داد. دستور iord همچنين احتياج به يك عملوند دارد كه محل خواندن را مشخص كند. به عنوان مثال 01h iord پورتي با آدرس h 10 را ميخواند.
زبان برنامهنويسي اسمبلي همچنين ميتواند شامل دايركتيو و توضيحات باشد. دايركتيوها دستوراتي هستند كه به جاي اينكه مربوط به CPU باشند، مربوط به مترجم ميباشند. دايركتيوها شما را قادر ميسازند كه محلي از حافظه را مشخص كنيد، متغيرهايي تعريف نماييد. در كل، نقشي كه مترجم در كنار اجراي دستورات مشخص شده بايد ايفا كند را نشان ميدهند. يك نقطه ويرگول ( : )يا مميز دوبل ( // ) يك عبارت توصيفي را مشخص ميكنند كه مترجم از آنها چشمپوشي ميكند.
مترجمي كه توسط سيپرس ارائه ميشود، cyasm.exe قابل اجرا در پنجره داس ميباشد. سيپرس مرجعها و راهنماي استفاده براي كاربراني را تهيه كرده است كه چگونگي استفاده از مترجم را شرح ميدهد.
مترجم از دو مجموعه دستور مشابه براي CPUهاي سري A و سريB پشتيباني ميكند. تراشههاي enCoRo از سري B هستند. تراشههاي قديميتر سيپرس، مانند 63001، از سري A بودند و از همة دستورات بجز بعضي از آنها پشتيباني ميكنند.
كدهاي مترجم
راهنماي كاربران داراي توضيحات كاملي در مورد كد اسمبلي و دايركتيوهاست و در اينجا برخي از جزئيات آن تكرار ميشود. جدول 1-8 خلاصهاي از كدها ميباشد و جدول 2-8 خلاصهاي از دايركتيوها را نشان ميدهد. كدهاي ماشين تراشه به 37 دستور ترجمه شده است.
جدول 1-8: متجرم Cyasm از 37 دستور اسمبلي براي enCoRo پشتيباني ميكند
نوع دستور دستور توضيح
تابعهاي منطقي و رياضي ADD اضافه كردن بدون نقلي
ADC اضافه كردن همراه با نقلي
AND AND كردن بيتي
ASL انتقال به چپ منطقي
ASR انتقال به راست منطقي
CMP مقايسه
CPL متمم كردن آكومولاتور
DEC كاهش
INC افزايش
OR OR كردن بيتي
RLC چرخش به چپ همراه با نقلي
RRC چرخش به راست همراه با نقلي
SUB تفريق بدون نقلي
SBB تفريق همراه با نقلي
XOR OXR بيتي
پرشهاي برنامه و كنترلي GALL فراخواني تابع
HALT اجراي ايست
RETI بازگشت از وقفه
JACC پرش آكومولاتور
JC پرش در صورتي كه نقلي يك باشد
JMP پرش
JNC پرش در صورتي كه نقلي صفر باشد
JNZ پرش اگر صفر نباشد
JZ پرش اگر صفر باشد
RET بازگشت
XPAGE صفحه حافظه
ادامه جدول 1-8: مترجم Cyasm از 37 دستور اسمبلي براي enCoRo پشتيباني ميكند
نوع دستور دستور توضيح
انتقال داده
INDEX خواندن جدول
IORD خواندن از I/O
IOWR نوشتن بر I/O
IOWX مشخص كردن نوشتن I/O
MOV انتقال
POP انتقال داده از پشته به آكومولاتور
PUSH انتقال داده از آكومولاتور به پشته
SWAP SWAP
بقيه DI غير فعال كردن وقفهها
EI فعال كردن وقفهها
NOP بدون عمل
اين دستورات، تابعهاي اصلي رياضي و منطقي، پرسشهاي برنامه و كپي دادهها از رجيسترها، پورتها و RAM را انجام ميدهند، دو بيت پرچ نقلي و صفر اطلاعات بيشتري را ارائه ميدهند. مانند اينكه نتيجه دستور add داراي سرريز بوده است يا خير يا اينكه نتيجه صفر شده است يا نه.
تراشه از سه حالت آدرس دهي پشتيباني ميكند كه چگونگي استفاده از عملوند را براي دستور مشخص ميكند. همه دستورات از هر سه حالت آدرس دهي پشتيباني نميكنند.
در آدرس دهي سريع، دستورات از مقدار عملوند مستقيماً استفاده ميكنند. اين دستور از آدرس دهي سريع براي جمع كردن h 60 با مقدار آكومولاتور استفاده ميكند.
Add A/ 60h
در آدرس دهي مستقيم، دستور با عملوند شبيه به آدرس رفتار ميكند و از مقداري كه در آن آدرس ذخيره شده استفاده مينمايد. اين دستور از آدرس دهي مستقيم براي جمع كردن مقداري كه در آدرس h60 از RAM نوشته شده با محتويات آكومولاتور استفاده ميكند.
Add A/ [60h]
در آدرس دهي شاخصي، دستور از دادهاي استفاده ميكند كه در آدرس حاصل از افزودنه يك مقدار به رجيسترX قرار گرفته است. آدرس دهي شاخصي براي كپي كردن يك بلاك از داده مفيد ميباشد. رجيستر X آدرس آغاز بلاك را در خود ذخيره مينمايد. كد مقداري را به محتواي رجيستر X اضافه ميكند تا آدرس بايتي كه ميخواهد كپي شود را به دست آورد. با افزايش اين مقدار در هركپي، كد ميتواند يك بلاك داده را كپي كند.
استفاده از مترجم
مترجم يك برنامه تحت داس ميباشد. اين دستور:
cyasm test.asm
فايل test.asm را اسمبل ميكند.
مترجم سه فايل ايجاد ميكند:
test.asm كه كدهاي اسمبل شدهاي براي استفاده در كيت ارتقا هستند، شما ميتوانيد از اين فايل براي بارگذاري كدها از كامپيوتر بهRAM برد ارتقا استفاده كنيد.
در اينجا بخشي از فايل rom، هنگامي كه در وايرشگر متني باز ميشود نشان داده شده است:
24 81 15 80 10 80 99 80
10 80 85 80 99 80 8C 80
21 2A 2D 20 1E 20 1A 2D
37 27 20 A0 00 16 37 1A
جدول 2-8: مترجم cyasm از 13 دايركتيو پشتيباني ميكند
دايركتيو توضيح
CPU مرجع خصوصيات محصول
DB تعريف بايت
DS تعريف يك رشته اسكي
DSU تعريف يك رشته، unicode
DW تعريف يك كلمه (2بايت)
DWL تعريف يك كلمه با بعضي خصوصيات
EQU برابري نشانهاي با يك مقدار متغير
FILLROM تعريف مقدار براي حافظه برنامة بياستفاده
INCLUDE اضافه كردن يك فايل
MACRO تعريف ماكرو
ORG مبدأ برنامه
XPAGEON فعال كردن XPAGE
XPAGEOFF غير فعال كردن XPAGE
اين فايل حاوي خطوطي است كه از هشت بايت هگزاسكي با استفاده از فاصلهاي بين هر كدام تشكيل شده است.
در قالببندي هگزاسكي، هر بايت با دو كد اسكي نمايش داده ميشود كه هر كد يك كاراكتر هگزادسيمال را نشان ميدهد. مثلاً، بايت h 80 با كدهاي اسكي h 38 براي 8 و h30 براي صفر نمايش داده ميشود. استفاده از قالببندي هگزاسكي شما را قادر ميسازد كه به راحتي در ويرايشگر متني مقادير بايت را ببينيد (مثلاً 80). وقتي كه كد در RAM برد ارتقا ذخيره شود. RAM شامل بايتهاي باينري ميشود كه توسط بايتهاي هگزاسكي نشان داده شده است. مثلاً، h 80 به 10000000 در باينري ترجمه ميگردد.
test.hex كدهاي اسمبلي در قالببندي هگزاينتل ميباشد. بسياري از برنامهريزان EPROMها از جمله Hi-Lo شركت سيپرس، از اين قالببندي پشتيباني ميكنند. كيت ارتقاء ميتواند به جاي قالببندي rom. از اين قالببندي استفاده كند. قالببندي هگزاينتل از كاراكترهاي هگزاسكي و اطلاعات آدرس دهي استفاده ميكند كه در اينجا دادههايي كه در يك خط فايل hex.* موجود است را ميبينيد.
200000008099801080158124808C8099808580102D1A201E202D2A211A371600A0202737A1
test.hex يك فايل ليستي است كه توسط مترجم ايجاد ميگردد. اين فايل هر خط كد اسمبلي و توضيحات را نشان ميدهد. در ادامة آنها، كدهاي برنامه معادل و آدرسي كه بايد در آنجا ذخيره شوند نمايش داده ميشود. وقتي كه از برنامههاي نمايشي استفاده ميكنيم. اين فايل ليستي، مفيد است. مثلاً اگر ميخواهيد كه در يك نقطه اجراي برنامه را ثابت كنيد، ميتوانيد از اين فايل ليستي براي پيدا كردن آدرس وابسته به آن خط استفاده كنيد.
ستون سمت چپ، آدرس در حافظه برنامه را مشخص ميكند. اين آدرس وقتي كه خط، فقط شامل توضيح يا برچسب است تغيير نميكند. دو ستون بعدي بايتهاي ذخيره شده در هر آدرس ميباشد. مثلاً، در محل CD03، مقدار Ah 2 كدي براي iowr و h 14 نشان دهندة رجيستري است كه ميخواهيم روي آن نوشته شود. ستون بعدي تعداد سيكل كلاك است كه دستور استفاده ميكند (5). ستونهاي سمت راست نيز شامل كدهاي اسمبلي و توضيحات ميباشند.
برنامهنويسي در C
روش ديگر براي نوشتن كد براي اين تراشههاي سيپرس استفاده از مفسر C و محيط ارتقاء آن است.
مزيتهاي C
در مقايسه با برنامهنويسي با زبان اسمبلي، استفاده از C چندين مزيت دارد.
استاندارد بودن ـ اگر تجربهاي در برنامهنويسي C داشته باشيد، با عبارتهاي آن آشناييد و ميتوانيد با سرعت بيشتري آغاز كنيد. همچنين ممكن است بتوانيد از كدهاي C كه براي تراشههاي ديگر نوشته شدهاند با تغييرات جزئي استفاده كنيد.
دستورات بيشترـ به جاي استفاده از پرشهاي ساده، كدهاي شما ميتوانند از دستوراتي همچون if…else و case يا for و while … do استفاده كنند.
اپراتورهاي بيشترـ اين مفسر از اپراتورهاي رياضي بيشتري پشتيباني ميكند و شما ميتوانيد از جمع، تفريق، ضرب، تقسيم و مقايسههاي گوناگون استفاده كنيد.
كتابخانهها و مثالها ـ كتابخانه ها ميتوانند با استفاده از توابع معمولي مقدار زيادي در زمان، صرفهجويي كنند. كتابخانههايي براي برنامة تراشه مدارهاي واسط، ميكروواير، و UART، زمانهاي تأخير، واسط صفحه كليد و LCD و توابع رياضي وجود دارد. اين مثالها شامل كدهاي كامل براي صفحه كليد و ماوس ميباشند.
بهينهسازي ـ مفسر بهينهسازياي به منظور كدها براي فشردگي و سرعت داراست.
اما مشكل آنجاست كه بايد اين مفسر را خريداري نماييد، در حالي كه مترجم مجاني ميباشد.
معماري تراشه
اين تراشه ارزان قيمت با طراحي آسان است و به منظور استفاده در ابزارهايي كه قصد انتقال بلاكهاي كوچك داده با سرعت متوسط، ساخته شده است و كاربردهاي آن در وسايل جانبي استاندارد از قبيل ماوس يا دستگاههاي نقطهيابي ديگر و واحدهاي
data-acquisition ميباشد.
به عنوان مثال، واحدهاي data-acquisition ممكن است نتايج خوانده شده از يك حسگر را به صورت متناوب به كامپيوتر بفرستد. پايههاي I/O تراشه كنترلي ميتواند به يك تبديل كننده آنالوگ به ديجيتال كه مقادير خوانده شده از حسگر را به اعداد ديجيتالي تبديل ميكند و صل گردد. كامپيوتر ميزبان نيز ميتواند از اتصال USB براي درخواست آخرين دادههاي خوانده شده استفاده كند يا ممكن است كامپيوتر سيگنالهايي را به رلهها، موتورها يا دستگاههاي ديگري كه پايههاي كنترلي I/O تراشه به آن متصل هستند ارسال كند.
به جاي تكرار مسائل موجود در كاتالوگ، به مطالب مهمي كه قبل از كار با تراشه بايد مورد نظر قرار گيرد توجه كنيم. نكات مشكل و گيج كننده كاتالوگ نيز مورد بحث قرار ميگيرد.
خصوصيات و محدوديتها
يكي از دلايل انتخاب تراشه 63743، ارزان قيمت بودن آن است. قيمت اين تراشه حدود چند دلار در سفارشهاي محدود ميباشد.
تراشه داراي 8 كيلوبايت حافظه برنامه است. با يك بهينهسازي، كدهايي كه براي پشتباني از ارتباطات USB لازم است، ميتوانند در يك كيلوبايت جاي گيرند و به اين ترتيب 7 كيلوبايت باقيمانده ميتوانند براي كاربردهاي ديگر استفاده شوند.
يك ابزار ضروري براي ارتقاي اين تراشه كيت ارتقا ميباشد كه شامل بر ارتقا، مترجم و برنامههاي اشكال زدايي است. همچنين ممكن است احتياج به برنامهريز Lo PROM –Hi CY3649 نيز داشته باشيد كه همه اين ابزارها توسط سيپرس در دسترس قرار گرفته است.
63743 براي همه پروژهها مناسب نيست. اين تراشه داراي سرعت پايين است كه به معناي آن است كه شما نميتوانيد به منظور انتقالهاي همزمان و تودهاي از آن استفاده كنيد. و سريعترين زمان تأخير ممكن داراي انتقال وقفهاي، 8 بايت در هر 10 ميليثانيه ميباشد. برخلاف بعضي از كنترلرهاي اوليه، 63743 از انتقال وقفهاي خروجي پشتيباني ميكند.
درون تراشه
CPU اين تراشه يك RISC هشت بيتي است كه ميتواند به حافظه برنامه، RAM، پورتهاي I/O همه كاره و البته پورت USB دسترسي داشته باشد. پورت USB در حقيقت يك پورت سوئيچ خودكار است كه هر دو واسط USB و PS/2 را براي ماوس و ديگر دستگاه هاي نقطهيابي ممكن ميسازد. اين ويژگي به منظور طراحي دستگاههايي كه قابل تطبيق با هر دو باس باشند قرار گرفته است. وقفهها و ريستهاي مختلفي ميتوانند به CPU وقفه بدهند.
حافظه
حافظه داخلي تراشه 63743، شامل هشت كيلوبايت ( از h 0000 تا FFFh 1) از نوع OTP PROM براي ذخيره برنامه و 256 بايت RAM ( از h00 تا FFh) براي ذخيره دادههاي موقتي ميباشد. 34 بايت رجيستر I/O، هر كدام با وظيفهاي تعريف شده، نيز در اين تراشه وجود دارد.
سازماندهي حافظه برنامه تراشه، شبيه به ميكروكنترلرهاي ديگر است. اجراي برنامه از آدرسh 00 آغاز ميشود. آدرسهاي h00 و h 01 حاوي آدرسي هستند كه كد اصلي برنامه از آنجا شروع ميگردد.
آدرسهاي h02 تا h17 حاوي اشارهگرهاي وقفهاي هستند كه وقتي يك از يازده وقفه تراشه اتفاق ميافتد، آدرسي را كه ميكروكنترلر بايد به آنجا پرش كند مشخص مينمايند. در اينجا مثالي از جدول اشارهگرهاي برنامة تراشه آمده است.
ORG 00h
jmp reset ;device reset
jmp bus-reset ; USB reset interrupt
jmp error ; 128- microsecond interrupt
jmp lms-timer ; 1.028- millisecond interrupt
jmp endpoint0 ; Endpoint 0 interrupt
jmp endpoint1 ; Endpoint 1 interruopt
jmp endpoint2 ; Endpoint 2 interruopt
jmp spi ; SPI interrupt
jmp capture-a ; capture timer A interrupt
jmp capture-b ; capture timer B interrupt
jmp gpio ; GPIO interrupt
jmp wakeup ; Wake-up interrupt
هر اشارهگر وقفه، به آدرسي كه عملوند آن مشخص ميكند پرش مينمايد. وقفههايي كه استفاده نميشوند، نبايد اتفاق بيفتد اما برنامة تراشه بايد شامل پرشهايي براي اين وقفهها باشد. زير برنامه سرويس وقفه (ISR) براي اين وقفههاي بدون استفاده، بدون تغيير دادن رجيسترها فقط بايد اجراي برنامه را به محل فراخواني، بازگرداند.
وقفهها بر اساس اولويت از آدرس h 0002 با بيشترين اولويت نوشته ميشوند. حافظه برنامه از h0018 تا 1FDFh براي ذخيره بقيه كدها در دسترس ميباشند.
256 بايت RAM بايد دو پشته داده و 8 بايت بافر براي اندپوينت، و دادههاي موقتي ديگري را نگهداري كنند (شكل 4-8). بافرهاي اندپوينت از آدرسهاي E8h تا FFh استفاده مينمايد.
پشتهها داراي ساختار LIFO (آخرين ورودي – اولين خروجي) هستند. RAM داراي دو اشارهگر براي دسترسي به دو پشته ميباشد. اشارهگر پشته برنامه (PSP ) از آدرس h 00 در هنگام ريست شروع ميشود و مقدارش زياد ميگردد. در حالي كه اشارهگر پشته داده (DSP) ممكن است توسط سختافزار به E8h يا كمتر تنظيم گردد و مقدارش كم ميشود. برنامة تراشه نياز دارد كه اطمينان حاصل كند كه پشتهها آن قدر بزرگ نميشوند كه وارد محدودة ديگري گردند.
اشارهگر پشته برنامه
اشارهگر پشته برنامه (PSP) آدرسهايي را كد پس از بازگشت از يك زير برنامه فراخواني شده يا سرويس وقفه بايد به آنها بازگردد را نگهداري ميكند. در وقفهها، PSP همچنين حالت پرچمهاي صفر و نقلي را ذخيره ميكند. برنامة تراشه مجبور نيست براي رهبري PSP همة كارها را خود انجام دهد. همة اين كارها به صورت خودكار توسط سخت افزار و دستورات CALL و RET و RETI انجام ميشود.
اندپوينت صفر
اندپوينت يك
اندپوينت دو
متغيرهاي كاربر
استك داده كاهش مييابد
استك برنامه افزايش مييابد
شكل 4-8: RAM تراشه enCoRo حاوي بافرهاي اندپوينتها، پشتههاي داده و برنامه و متغيرهايي ميباشد كه برنامة تراشه نياز دارد.
در هنگام ريست، PSP به آدرس h 00 اشاره خواهد كرد. SPS قادر به سرويس دهي به چندين وقفه و يا زيربرنامه است. پس از اجراي زيربرنامهها به دستوري كه بعد از دستور فراخواني است، باز خواهيم گشت. مثلاً اگر PSP قبل از فراخواني يك زيربرنامه به آدرس h00 در حافظه برنامه اشاره كند، دستور CALL همچنين PSP را دو واحد افزايش ميدهد (به خانه h02 اشاره خواهد كرد) بنابراين آماده است كه در صورت لزوم آدرس ديگري را بگيرد. دستور RET كه باعث بازگشت از زير برنامه ميشود، مقداري را كه توسط PSP نشان داده ميشود به درون شمارنده برنامه بارگذاري كرده و PSP را دو واحد كم مينماي. سپس اجراي برنامه از محلي كه فراخواني از آنجا انجام شده لود ادامه مييابد.
نظير همين مراحل در زير برنامه سرويس وقفه اتفاق ميافتد، فقط با اين تفاوت كه مقادير پرچمهاي صفر و نقلي نيز ذخيره ميشوند.
اشارهگر پشته داده
اشارهگر پشته داده (DSP) دادههايي را كه توسط دستور PUSH ذخيره ميشوند، نگهداري ميكند. مثلاً PUSH A محتويات آكومولاتور را در پشته داده ذخيره ميكند. DSP پس از ذخيره يك بايت، يك واحد كاهش مييابد. دستور POP بايتهايي را كه قبلاً ذخيره شده است را بازيابي ميكند و DSP را يك واحد افزايش ميدهد.
مقدار پيش فرض DSP در هنگام ريست جايي كه بايد باقي بماند نيست. غير از تراشههايي كه اصلاً از USB استفاده نميكنند، برنامة تراشه بايد قبل از استفاده از هر دستور PUSH ابتدا DSP را به مقدار جديد تنظيم كند. در هنگام ريست DSP مقدار h00 را دارد. از اينجا، هر دستور PUSH باعث ميشود كه DSP كاهش يافته و به بالاي RAM (FFh) برود كه بايت 7 بافر اندپوينت صفر است.