سیستم تشخیص گفتار







فصل اول

Review










مرور بر کارهای انجام شده ((Review :

طی این سالهاتلاش زیادی روی تشخیص گفتارصورت گرفت اما باتوجه به عوامل زیادی که درالگوریتم موثر هستند همواره عملیات تشخیص باخطا روبرو بوده است. تارهای صوتی انسان خصوصیات  غیر خطی دارندوازطرف دیگر عملیات آنها کاملا"در اختیارنیست بلکه عوامل مختلفی ازجنسیت تاحالت عاطفی فرد درآن تاثیر گذاراست در نتیجه تلفظ صوتی می تواند به طرز تلفظ. طرز گفتار و میزان شمرده بودن آن .درشتی صدا .زیروبم صدا. درجه صدا(بلندی) وسرعت ادای کلمه و....بستگی داشته باشد علاوه براینها از آنجاکه معمولا"افراد درمحیطی صحبت میکنند که صداهای محیطی نیز وجود دارد این مسئله پیچیده تر می شود به شکلی که تشخییص گفتار حتی از تولید گفتار سخت تر و پیچیده تر میشود.

دقت یک سیستم تشخیص گفتار بستگی به شرایط تست دارد. در شرایطمحیطی و گفتاری خاص یک سیستم بسیار خوب عمل می کند اما در شرایط عمومی این دقت کاهش می یابد.

این شرایط ابعاد گوناگونی دارند که می توان به اختصار به بعضی از انها اشاره کرد:

حجم فرهنگ لغت:

 به عنوان یک قانون عمومی تشخیص یک کلمه از میان یک مجموعه کوچک بسیار ساده استاما وقتی حجم فرهنگ لغت بالا می رود میزان خطا افزایش می یابد . مثلا اگر شما تنها کلمات صفر تا 9 را ادا کنید و بخواهید یکی از همین 10 کلمه را تشخیص دهید این کار با دقت خوبی انجام می پذیرد اما اگر تعداد کلمات به 200.5000یا 100هزار برسد میزان خطا افزایش بسیار زیادی خواهد داشت.

مستقل یا وابسته به گوینده:

یک سیستم وابسته به گوینده تنها برای یک فرد خاص طراحی شده است اما در یک سیستم مستقل هر فردی می تواند گویندگی را به عهده بگیرد و سیستم باید بتواند تشخیص دهد.

مشخص است که یک سیستم مستقل از گوینده بسیار مشکل تر است و طبعا میزان خطای آن نیز بیشتر است و بین 3 تا 5 برابر میزان خطای سیستم وابسته به گوینده است .

گفتار مجزا . مقطع یا یوسته : 

منظور از گفتار مجزا بیان تک کلمه است . گفتار مقطع گفتاری است که جملات کامل اما با سکوت های مصنوعی در میان ادای هر دو کلمه بیان می شوند .

 گفتارپوسته همان شیوه معمولی بیان کلمات است .

 تشخیص گفتار مجزا و مقطع بسیار ساده تر میسر می شود چون کلمات بهتر و راحتر تشخیص داده می شوند  اما در گفتار پیوسته بعضی اصوات حذف می شوند یا تغییر پیدا می کنند بنابراین تخیص این نوع بسیار مشکل تر است  گفتار اماده یا اتفاقی : در صورتی که فرد جملات خود را مطابق متنی از پیش اماده شده بخواند عملیات تشخص گفتار بسیار ساده تر از زمانی است که فرد جملات را فی البداهه ادا می کند چون در حالت دوم فرد ممکن است مکث کند . بعضی اصوات نامفهوم را ادا کند و یا حتی بخندد یا سرفه کند . متوجه شده اید که عوامل بسیار متفاوتی در کار تاثیرگذار هستند و لذا الگوریتم های تشخیص گفتار .الگوریتم های متفاوتی هستند. 

این الگوریتم ها را میتوان به گروهای زیر دسته بندی می کنند :

1.مبتنی بر الگو :در این گروه از الگوریتم ها گفتار ورودی با الگوهای از پیش ضبط شده مقایسه می شوند تا بهترین تطبیق یافت شود . دقت این گروه در ارتباط با الگوهای موجود خوب است اما به هرحال تعداد الگوها ثابت است واگر بخواهیم باتوجه به شرایط گفته شده برای هرکلمه الگوهای متفاوتی راقراردهیم بطور عملی غیر ممکن است.

 2.متنی بر دانش وآگاهی :دراین الگوریتم ها سعی میشود مهارت انسان در تشخیص گفتار شبیه سازی شود و سیستم تعبیه شوداین سیستم اگر چه به نظر بسیار خوب میرسد اما بدست آوردن این مهارت ها واستفاده از آنها درسیستم تشخیص گفتار به راحتی میسرنیست ودرواقع این روش غیرعملیاتی به حساب میآید

3.مبتنی برآمار:دراین روش ها تغیرات درگفتار بصورت آماری مدل مشوند واین تغیرات آماری کمک می کند تاسیستم تشخیص گفتار امکان یادگیری تدریجی داشته باشد . اما درسیستم ها ی  جدید تشخیص گفتار بااستفاده از شبکه های گسترده عصبی و روشهای مبتنی بر آمار نتایج بسیار دقیق تر و بهتری گفته اند درحال حاضربسیاری از شرکت های مهم مانند IBM       و    MICROSOFT 

این سیستم ها سرمایه گذاری کرده اند وبه نتایج  بسیار خوبی هم رسیده اند. یکی از سرویس دهندگان تلفن همراه در کشور فرانسه یک پورتال صوتی راه اندازی کرده است و اخبار و نتایج مسابقات ورزشی را از این طریق در اختیار مشترکان خود قرار می دهد .

شرکت ماشین سازی هوندا نیز یک سیستم راهنوردی با کمک صوت راه اندازی کرده است.  رانندگان بهتر بتوانند خودرو را هدایت کنند با این پیشرفت ها به نظر می رسد که در اینده ای نه چندان دور فناوری تشخیص گفتار بخشی از زندگی و کار هر روز ما خواهد شد .



مدار مونتاژ شده باز شناسی گفتار   


شکل (1-1)

 

قلب مدار، يك آي سي بازشناسي گفتار HM2007 مي‌باشد ( به شكل 2-1 نگاه كنيد). اين قطعه امكان تشخيص 40 كلمه ( هر كدام به طول 96/0 ثانيه) و يا 20 كلمه ( هر كدام با طول 92/1 ثانيه) را فراهم مي‌ كند. اين مدار بازشناسي گفتار داراي يك اتصال دهنده مي‌باشد ( اتصال ساز WD در مدار اصلي)كه به كاربر امكان مي‌دهد تا كلمات با طول 96/0 ثانيه ( ليست لغات 40 كلمه‌اي) و يا كلمات با طول 92/1 ثانيه ( ليست لغات 20 كلمه‌اي ) را انتخاب نمايد. 

  


                                                                                  شکل(2-1)

مدار از يك RAM ايستا با حجم 8* K8 به عنوان حافظه استفاده مي‌كند. يك باتري پشتيبان براي SRAM در برد اصلي قرار دارد. هنگامي كه تغذيه اصلي قطع مي گردد، اين باتري كلمات ذخيره شده در حافظه را نگهداري مي‌نمايد. باتري دكمه‌اي حدوداً 2 سال عمر مي‌كند. بدون باتري پشتيبان شما مجبور خواهيد بود كه پس از هر بار قطع تغذيه، مدار را دوباره آموزش دهيد. 

                                                   

اين تراشه 2 حالت كاري دارد: حال دستي (manual) و حالت پردازنده (CPU) . حالت CPU براي مواقعي قرار داده شده كه لازم است تراشه به عنوان يك كمك پردازنده تحت نظارت يك كامپيوتر ميزبان به فعاليت بپردازد. اين روش، شيوه‌اي جالب براي بازشناسي گفتار در كامپيوترها مي‌باشد چون در اينصورت وظيفه شنيدن اصوات و بازشناسي كلمات موقت پردازنده كامپيوتر اصلي را نخواهد گرفت. در يك شيوه خاص برنامه ريزي، هنگامي كه تراشه HM2007 يك فرمان را تشخيص می‌دهد، وقفه‌اي به پردازنده ميزبان ارسال مي‌كند و سپس فرمان تشخيص داده شده را اطلاع مي‌دهد. 

مدار SR-06 كه خواهيم ساخت در ساخت دستي (manual) عمل مي‌ كند . اين مدار احتياجي به كامپيوتر ميزبان ندارد و مي‌ تواند براي افزودن قابليت كنترل گفتاري، خود در دستگاههاي ديگر قرار گيرد. 

كاربردهاي كنترل گفتاري وسايل و تجهيزات شامل موارد زير مي‌باشد: 

1.سيستم‌هاي امداد تلفني 

2.ورود ( ثبت اطلاعات) 

3.اسباب بازيهاي كنترل شونده با گفتار 

4.سيستم‌هاي امنيتي و تشخيص صدا 

5.روباتيك 

6.روش نرم افزاري 

اكثر سيستم‌هاي بازشناسي گفتار كه امروزه در دسترس هستند، در واقع برنامه‌هاي نرم افزاري مي‌باشند كه روي كامپيوتر شخصي اجرا مي‌شوند. استفاده از چنين نرم افزاري مستلزم آن است كه يك كارت صوتي سازگار با آن بر روي كامپيوتر نصب شده باشد. هنگامي كه برنامه‌ فعال شود. در حيطه سيستم عامل ( ويندوز ، os/2 و غيره) و بر نامه‌هاي كاربردي ديگر به طور مداوم به فعاليت مي‌پردازد. 

با اينكه عملكرد چنين نرم افزارهايي موثر است اما از لحاظ اقتصادي براي توليد كنندگان به صرفه نيست كه براي كنترل ماشين لباسشويي و يا ويد ئو ، يك كامپيوار شخصي در آن قرار دهند. نرم افزار بازشناسي گفتار، ميزان زيادي از توانايي محاسباتي سيستم عامل را به خود اختصاص مي‌دهد ، كاهش سرعت قابل توجهي در فعاليت و عملكرد كامپيوتر ايجاد مي‌شود. 

آموزش گوش كردن: 

ما توانايي شنيدن خود را امري بديهي و ذاتي مي‌دانيم. به عنوان مثال، ما قادريم در يك ميهماني از ميان سخنان اشخاص مختلف به صحبتهاي يك فرد خاص گوش كنيم. ما به صورت نيمه هوشيارانه سخنان و صداهاي نامربوط را حذف ( فيلتر) مي‌كنيم . اين استعداد حذف كردن ( فيلترينگ)، فراتر از توانايي سيستم‌هاي بازشناسي گفتار امروزي مي‌باشد. 

بازشناسي گفتار ، درك گفتار نيست. درك معناي كلمات، فرآيند ذهني بالاتري مي‌باشد . اين حقيقت كه كامپيوتر مي‌تواند به دستورات آوايي پاسخ دهد بدين معنا نيست كه فرمان تلفظ شده را درك مي‌كند. سيستم‌هاي تشخيص صدا روزي خواهند توانست اختلافات جزئي زباني و معناي كلمات را تشخيص دهند، اين بدين معني است كه:« انجام بده آنچه را كه مقصودم است نه آنچه دقيقاً ادا مي‌كنم!».

بازشناسي گفتار ـ وابسته به گوينده و مستقل از گوينده   

بازشناسي گفتار به دو دسته طبقه بندي مي‌شود، وابسته به گوينده و مستقل از گوينده. 

سيستم‌هاي وابسته به گوينده توسط شخصي كه مي‌خواهد آن را به كار ببرد، آموزش مي‌يابند. اين سيستم‌هاي مي‌توانند تعداد فرامين زيادي را انجام دهند و در بيش از 95 درصد موارد كلمات  را درست تشخيص مي‌دهند. نتيجه استفاده از اين شيوه‌ آن خواهد بود كه سيستم بازشناسي تنها به شخصي كه سيستم را آموزش داده است به درستي پاسخ مي‌دهد. اين روش متداولترين شيوه‌اي است كه به صورت نرم افزار در كامپيوترهاي شخصي به كار گرفته مي‌شود. 

سيستم‌هاي مستقل از گوينده ياد مي‌گيرند كه به كلمات ، بدون توجه به آنكه چه شخصي آن را تلفظ مي‌كند پاسخ دهند. بنابراين ، سيستم بايد به انواع زيادي از الگوهاي صحبتي  ، لحن‌ها، و تلفظهاي گوناگون كلمه مورد نظر پاسخ دهد. دراين سيستم، تعداد فرمانها معمولاً  كمتر از سيستم وابسته به گوينده مي‌باشند. با اين حال هنوز مي‌توان از طريق اعمال محدوديت‌هاي پردازشي به صحت و درستي بالايي دست يافت. مقتضيات صنعتي اغلب محتاج سيستم‌ هاي مستقل از گوينده مي‌باشد. مانند سيستم AT&T كه در سيستم‌هاي تلفني مورد استفاده قرار مي گيرد. 

سبك بازشناسي 

سيستم‌هاي بازشناسي مشكل ديگري نيز دارند كه به شيوه صحبتي قابل درك  آنها مربوط مي‌شود. سه سبك صحبتي وجوددارد: منقطع، متصل و پيوسته . 

سيستم‌هاي بازشناسي گفتار  منقطع تنها مي‌توانند كلماتي را تشخيص دهند كه به صورت جدا جدا تلفظ مي‌شوند. اين متداولترين سيستمي است كه امروزه يافت مي‌شود. كاربر بايد ميان كلمات و يا فرامين مكث كند. مدار ما به گونه‌اي ساخته شده است كه كلمات منقطع با طول 96/0 ثانيه را تشخيص مي دهد. 

سيستم بازشناسي گفتار متصل ، سيستمي بينابين سيستم منفصل ‌( منقطع) و پيوسته مي‌باشد. اين سيستم به كاربر امكان مي‌دهد كه از  كلمات مركب استفاده كند. تراشه HM2007 مي‌تواند به گونه‌اي پيكر بندي شود كه كلمات و عبارات با طول 92/1 ثانيه را تشخيص دهد. اين پيكر بندي تعداد كلمات قابل شناسايي را به 20 عدد كاهش مي‌دهد. 

گفتار پيوسته همان سخنان محاوره‌اي طبيعي است كه در زندگي روزانه به كار مي‌گيريم. براي يك سيستم بازشناسنده واقعاً مشكل است كه از ميان متني كه كلمات آن تمايل تركيب شدن با هم دارند  كلمات را جدا كند.  به عنوان مثال ، عبارت  “ Hi, how are you doing” در محاوره به صورت “ Hi, howyadoin” تلفظ مي‌شود، سيستم ‌هاي بازشناسي گفتار پيوسته در بازار موجود  بوده و روند روبه توسعه دارند. 

مدار بازشناسي گفتار 

مدار بازشناسي گفتار را مي‌توانيد به صورت كيت از شركت Images SI Inc تهيه كنيد. همچنين در صورت تمايل مي‌توانيد اجزاي اصلي يعني تراشه HM2007، حافظه  SRAM ، و بر مدار چاپي جداگانه بهره مي گيرد. آن سه برد مدار چاپي،  مدار بازشناسي گفتار، مدار نمايشگر ديجيتال، و مدار صفحه كليد مي‌باشند  كه بر روي هم مدار اصلي  را تشكيل مي‌دهند. ( به شكل 3-1 و 4-1 نگاه كنيد) . صفحه كليد و نمايشگر ديجيتال قابل جداسازي هستند. پس از برنامه‌ريزي مدار، نمايشگر ديجيتال و صفحه كليد مي‌‌توانند جدا شوند؛ و مدار اصلي 

مي‌تواند براي افزودن قابليت كنترل صوتي، خود درون مدار ديگري قرار گيرد.


                 

                                                                          شکل 3-1

 

 

                                                                         شکل4-1

ساخت مدار 

نقشه شماتيك مدار در شكل 5-1 نشان داده شده است. مي‌توانيد اين مدار را بر روي يك تخته آزمايش ( بردبرد) پياده كنيد. من توصيه مي‌كنم سه برد مدار چاپي اين پروژه را به صورت  آماده خريداري نماييد، به فهرست قطعات نگاه كنيد. هنگامي كه از برد مدار چاپي ( PCB) استفاده مي‌ نماييد، قطعات الكترونيكي را در قسمت بالاي فيبر نصب كنيد. ساخت مدار را با لحيم كردن سوكت‌ها ي  IC به برد آغاز  نماييد. سپس مقاومتها را نصب كنيد. اكنون كريستال 57/3 مگاهرتزي و LED قرمز رنگ را نصب نموده و لحيم كنيد.  پايه بلند LED خط مثبت مي‌باشد. بعد از آن، خازنها و تراشه تثبيت كننده ولتاژ 7805 را لحيم كنيد. سوكت  مخابراتي ( پايه هدر) هفت پايه موجود بر صفحه كليد را به مدار اصلي لحيم كنيد. پس از آن، سوكت مخابراتي 10 پايه موجود بر برد نمايشگر و مدار اصلي را به هم متصل نماييد. 

 

شکل 5-1

  

صفحه كليد (شکل 6-1)

اين صفحه كليد از 12 عدد كليد فشاري تشكيل  شده است كه در حالت عادي باز هستند .

                                                               

                                                                       شکل 6-1


برنامه‌ريزي مدار 

براي برنامه ريزي مدار ابتدا صفحه كليد و نمايشگر ديجيتال را به برد اصلي متصل كنيد.  بعد از آن طول كلمه   ر ا انتخاب نماييد. براي انتخاب حالت 20  كلمه‌اي ( هر كدام 2 ثانيه) بايد اتصال ساز  را به روي هدر 2 پايه WD كه روي برد اصلي ، قرار دارد . نصب كنيد. اگر اتصال ساز را وصل نكنيد، فهرست لغات 40 كلمه‌اي ( هر كدام 1 ثانيه) انتخاب مي گردد. ميكروفن را به مدار وصل كنيد. با اعمال تغذيه ، تراشه  HM2007، حافظه RAM ايستا را مورد بررسي قرار مي‌دهد و سه عدد 00  را روي نمايشگر ديجيتالي نشان مي‌دهد و همچنين LED قرمز رنگ ( آماده به كار) را روشن مي‌كند. اكنون مدار در حالت آماده به كار قرار دارد. در اين حالت، مدار يا منتظر شنيدن يك دستور است و يا آماده براي يادگيري. 

براي آموزش دادن به مدار، شماره كلمه‌اي را كه مي‌ خواهيد به آن بياموزيد، از طريق صفحه كليد وارد كنيد. در اين آزمايش من فرض مي‌كنم كه شما حالت 20 كلمه‌اي  را انتخاب نموده‌ايد. در اين حالت مدار مي‌تواند تا حداكثر 20 كلمه  را ياد بگيرد. مي‌توانيد هر عدد از 1 تا 20 را انتخاب كنيد. به عنوان مثال، عدد 1 براي آموزش دادن كلمه شماره 1 فشار دهيد. هنگامي كه اعداد ر ا وارد مي‌ كنيد، LED قرمز رنگ  خاموش خواهد شد. 

عددي كه از طريق صفحه كليد وارد مي كنيد، بر روي نمايشگر ديجيتال به نمايش درخواهد آمد. سپس كليد # را  براي يادگيري فشار دهيد. هنگامي كه كليد # را فشار مي‌دهيد. اين كليد به تراشه پيغام مي‌دهد كه آماده شنيدن باشد. و همچنين LED قرمز رنگ  دوباره روشن مي‌شود. حال كلمه‌اي كه مي‌خواهيد مدار تشخيص دهد را در ميكروفن به طور آشكارا تلفظ كنيد. LED بايد براي يك لحظه كوتاه خا موش  شود . اين مساله نشان دهنده آن است كه كلمه پذيرفته شده است. 

كلمات ديگر را نيز بر اساس دستورالعمل بالا به مدار آموزش دهيد. براي آموزش دومين كلمه،  كليد 2 و سپس كليد # را فشار دهيد و به همين ترتيب الي آخر. مدارمي‌تواند بسته به طول كلمات،  حداكثر 20 و يا 40 كلمه را بياموزد. لازم نيست براي استفاده از مدار حتماً 20 كلمه به آن بياموزيد. در صورت تمايل مي‌توانيد هر چند كلمه ( كمتر از 20 عدد) را كه مي خواهيد به مدار آموزش دهيد. 

پروسه  آموزش  40 كلمه  نيز به همين صورت است، با اين تفاوت كه مي‌توانيد هر تعداد كلمه را از 1 تا 40 عدد، به مدار بياموزيد. 

آموزش بازشناسي 

مدار به طور پيوسته  به اصوات   گوش مي‌‌دهد. يك كلمه  آموزش داده شده  را در ميكروفن  تلفظ كنيد. شماره آ ن  كلمه بايد  روي نمايشگر نشان  داده شود.  به  عنوان مثال،   اگر  كلمه دايركتوري به عنوان  كلمه شماره 5 آموزش  داده شده باشد، تلفظ اين كلمه موجب  مي گردد  كه عدد 5  نمايش داده شود.  

كدهاي  خطا  

تراشه HM2007 كدهاي خطاي زير را  ايجاد مي‌كند.  

55= كلمه بيش از  حد طولاني است. 

66=  كلمه بيش از حد  كوتاه است. 

77=  كلمه گفته شده در  ليست  موجود  نيست ( با هيچ يك  از  كلمات ليست  همخواني  ندارد).

پاك كردن حافظه 

براي پاك كردن  تمامي  كلمات درون  حافظه SRAM، عدد  99   را وارد كرده  و سپس كليد  * را فشار دهيد. نمايشگر   اعداد 1 تا  20  ( و يا   1 تا 40) را به سرعت  نمايش مي‌دهد و همزمان    با آن اطلاعات حافظه پاك مي‌شود. براي پاك كردن  يك كلمه خاص،  شماره آن كلمه  را وارده كرده  و سپس كليد * را فشار دهيد. 

سيستم  بازشناسي مستقل  از   گوينده  

علاوه  بر دستورات  گفتاري،  اين مدار  به شما امكان  مي‌دهد كه ابعاد ديگر  تكنولوژي  بازشناسي را نيز بيازماييد. به عنوان مثال،  مي‌توانيد سيستم‌هاي  مستقل  از  كوينده  را  تجربه  كنيد.  

اين سيستم   ذاتاً وابسته به  گوينده است.  بدين معنا  كه شخصي كه مدار  را آموزش مي‌دهد، خود او مي‌تواند  از مدار استفاده كند. براي آزمودن سيستم مستقل  از  گوينده (  چند گوينده‌اي)  تكنيك‌هاي  زير را بيازماييد. اتصال سازي  WD  را روي  حالت 40  كلمه‌اي   (طول  هر  كلمه 96/0 ثانيه) قرار دهيد.  اكنون براي  هر كلمه  از  چهار  فضاي حافظه  استفاده  مي‌كنيم.  كلمات   را به گونه‌اي   در حافظه قرار   مي‌دهيم  كه دستورات، فقط با رمزگشايي رقم آخر  نمايش داده  شده بر روي نمايشگر  شناسايي شوند.  

اين مساله با اختصاص  دادن  فضاهاي  01 و 11  و 21 و 31 به اولين كلمه،  عملي مي‌گردد. هنگامي كه  سيستم  در  حالت بازشناسي كلمات قرار  دارد، ما  فقط كم ارزش‌ترين  رقم را رمز گشايي مي‌نماييم،  در اين مورد X1 به معناي  كلمه  شماره يك است (  X هر عددي ميان  و 0 و 3 است). 

اين عمل  را براي  اين بقيه  فضاهاي حافظه  نيز انجام  مي‌دهيم.  به عنوان مثال،  دومين كلمه  ، از  فضاهاي حافظه 02 و 12 و 22 و 32  استفاده خواهد  كرد. اين روش را تا برنامه  ريزي شدن   همه كلمات ادامه مي‌دهيم. 

در صورت امكان   از اشخاص مختلف براي  تلفظ كلمه استفاده  كنيد.  اين عمل موجب مي گردد  كه سيستم  بتواند صداها و تلفظهاي  مختلف كلمه مورد نظر را  تشخيص دهد.  هر چه منابع  سيستم بيشتري به باز شناسي مستقل   از  گوينده   تخصص داده شوند  ، مدار قوي‌تري خواهد بود.  

 موارد بسيار  مهمي هستي  كه بايد از آنها  مطلع باشيد . اول اينكه   شما براي  سيستم  مستقل  از  گوينده  تعداد  كلمات قابل  يادگيري  راكاهش مي‌دهيد.  تعداد  لغات از 40 عدد به 10 عدد كاهش  مي‌يابد.  

سيستم امنيتي صوتي  

تراشه HM2007  براي استفاده در  سيستم امنيتي صوتي طراحي  نشده است.  اما اين مساله شما  را از آزمودن چنين  سيستمي باز نمي‌دارد. شايد بخواهيد  براي  فعال  شدن  مدار باز كننده  قفل ،  3 يا 4  كلمه كه به طور متوالي تلفظ  مي كنيد،  تشخيص  داده شوند. 















فصل 2

آشنایی با 

میکروکنترولر PIC






در این بخش ضرورت دانستم که نکاتی چند در مورد عملکرد و قابلیت های میکروکنترولر PIC 16F84Aکه موجب انتخاب آن شده است را بیان نمایم.

ميكرو كنترلر PIC16F84 

از آنجا كه ميكروكنترلر PIC16F84A نماينده  ميكرو كنترلرهاي خانواده  PIC قابل استفاده است، به بررسي ميكروكنترلر PIC16F84A مي‌پردازيم. 

شكل (1-2)  ، ميكرو كنترلر PIC16F84A   را نشان مي دهد. 

لازم به ذكر است  كه مطالب  ارائه شده  بطور  مختصر و مفيد خواهد بود.  به گونه‌اي كه با مطالعه  آنها بتوان  براحتي  به كمك  كامپايلر قدرتمند  PIC BASIC PRO  به برنامه نويسي ميكروكنترلر هاي خانواده  PIC پرداخت.  

مشخصاتميكروكنترلر:PIC16F84A     

 

شکل 1-2

1ـ حداكثر ورودي كلاك 20 مگاهرتز 

2ـ يك كيلو كلمه  حافظه برنامه  

3ـ  قابليت 1000 بار  نوشتن  و پاك كردن  

4ـ 13 پايه  ورودي  ـ خروجي كه هر  پايه  را مي‌توان  بطور مجزا  ورودي  ويا خروجي تعريف  كرد. 

5ـ جريان بالاي   SINK/SOURCE براي راه اندازي مستقيم  LED . 

6ـ  يك تايمر (شمارنده  ) 8 بيتي.  

(تايمر  مذكور مي‌تواند بعنوان WATCH  DOG TIME WET) ‌) و تايمر آزاد استفاده  شود.)  


پايه‌هاي  ميكرو كنترلر :PIC16F84A      

پايه يك RA2  : بيت دوم از پورت A  مي‌باشد. 

پايه دوم RA3:  بيت سوم از پورت  A  مي‌باشد.  

پايه سوم  RA4/TOCKI  : هم بيت چهارم از پورت A  است و هم  پايه  مربوط به  كلاك خارجي تايمر ميكرو  كنترلر. 

پايه  چهارم (MCLR) :  پايه RESET  ميكروكنترلر  . اين پايه بايد  به توسط  يك مقاومت  10 كيلو  ا هم  به ولتاژ  5 ولت  متصل گردد. اين پايه  در هنگام برنامه ريزي ميكروكنترلر نيز كاربرد دارد. 

پايه پنجم  (VSS): اين پايه، اتصال  زمين از تغذيه ميكروكنترلر است. 

پايه  شش (RBO/INT) : هم بعنوان   بيت صفرم  از  پورت B و هم پايه  مربوط به  ورودي وقفه  (INTERRPUT)   خارجي. 

پايه هفتم (RB1):  بيت يكم  از پورت   B مي‌باشد.     

پايه  هشتم (RB2): بيت دوم از پورت   B مي‌باشد.                

پايه  نهم (RB3): بيت سوم از پورت   B مي‌باشد.

پايه دهم (RB4):  بيت چهارم از پورت   B مي‌باشد.

پايه  يازدهم (RB5):  بيت پنجم از پورت   B مي‌باشد.

پايه  دوازدهم (RB6): بيت ششم از پورت   B مي‌باشد..  اين پايه  در هنگام  برنامه ريزي ميكروكنترلر،  بعنوان  CLOCK  مي‌باشد.  

پايه سيزدهم  (RB7) :  بيت هفتم از پورت مي‌باشد.اين پايه  در هنگام برنامه ريزي ميكروكنترلر بعنوان  پايه  DATA مي‌باشد.  

پايه چهاردهم (Vdd) : اين پايه، قطب مثبت از تغذيه ميكروكنترلر است. معمولاً  اين پايه به ولتاژ  5 ولت متصل مي گردد.  

پايه  پانزدهم (OSC2) :  اين پايه  جهت اتصال  به يك نوسان  ساز  مي‌باشد. 

پايه شانزدهم (OSC1) :  اين پايه  جهت اتصال به  يك نوسان  سازمي‌باشد. 

پايه  هفدهم ‌(RA0) : بيت صفرم از پورت ‌A مي باشد. 

پايه  هجدهم  (RA1) : بيت يكم  از  پورت  A  مي‌باشد.  

شكل  (2-1)، مشخصات   پايه‌هاي  ميكروكنترلر  PIC16F84A  را نشان  مي‌دهد.  

 

شکل 2-2

RESET  

عمل ري ست در ميكروكنترلر PIC16F84A  ، 5 نوع  مختلف  مي باشد.  كه عبارتند از : 

1ـ ري ست در هنگام وصل منبع  تغذيه  به ميكروكنترلر 

2ـ ري ست در هنگام  اتصال  صفر  منطقي  به  پايه  MCLR 

3ـ ري ست در هنگام  سر ريزتايمر WDT 

4ـ ري ست  طي زمان  SLEEP  

5ـ ري ست طي سرريز  تايمر WDT در طول زمان  SLEEP 

مهمترين  انواع ري ست، سه نوع اول  مي‌باشند.  

ري ست  نوع دوم  براي ري ست  كردن  ميكروكنترلر بطور دستي بكار مي‌رود.  همانگونه  كه گفته شد، هرگاه  پايه  MCLR  برابر صفر  منطقي (  صفر ولت)  شود،  ميكروكنترلر ري ست خواهد  شد.  (خط بالاي  MCLR    نشان  دهنده‌ آنست  كه ري ست  بوسيله  صفر منطقي فعال مي‌شود)  . براي  ري ست كردن دستي  ميكروكنترلر  مي‌توان از  مدار  نشان داده شد ه در شكل (3-2) استفاده  نمود. 

 

شکل 3-2

رجيستر OPTION CONTROL 

PS0    PS1    PS2    PSA    T0SE    T0CS    INTE DG    RBPU

بيت صفر                                                                                                                       بیت هفتم 

   PRESCALER 

سه بيت P0 و P1  و P2 بيتهاي  انتخاب  PRESCALER مي‌باشند. بيتهاي   PRESCALER  جهت تعيين كلاك تايمر مي‌باشند.  بدين معني  كه معين مي‌كنند  كه كلاك  تايمر چه نسبتي از  كلاك داخلي  ميكروكنترلر باشد.  جدول (1-1)، تاثير  اين بيتها را بر  كلاك تايمر نشان  مي‌دهد. 

 

INTEDG (INERRUPT EDGE SELECT BIT) : 

اگر  وقفه  خارجي براي ميكرو كنترلر تعريف  شده باشند،  اين بيت  مشخص كننده آنست كه در كدام  لبه       ( بالا  رونده  يا پايين  روند)  از پايه RB0/INT  وقفه خارجي  رخ دهد. 

اگر TINEDG=0 باشد، آنگاه  با لبه پايين رونده  پايه  RBO/INT وقفه رخ مي دهد. 

اگر INTEDG=1  باشد، آنگاه  با لبه  بالا رونده پايه  RBO/INT وقفه رخ مي‌دهد.  

در ادامه  ،  توضيح كاملي در مورد وقفه  خواهيم داد. ولي در مورد  كلاك خارجي بگوئيم  كه استفاده  از اين روش  براي ارتباط  ميان  ميكروكنترلرها  و سنسورها  بسيار متداول  است. در اين حالت تغييرات سطح ولتاژ سنسورها  كه به پايه RBO/INT   از ميكروكنترلر متصل مي‌شوند، توسط ميكروكنترلر حس مي‌شود.  

وقفه (INTERRUPT):  

وقفه، مكانيزمي از ميكروكنترلر است كه ميكرو كنترلر را براي  پاسخگوي ي به برخي از  وقايع لحظه‌ اي فعال مي كند.  وقفه يك قسمت مهم  از ميكروكنترلرها مي‌باشد.  چرا كه آنها ارتباط بين يك ميكروكنترلر و  محيط را آماده  مي‌ كنند.  وقوع هر وقفه جريان   اجراي برنامه را به گونه‌اي تغيير مي‌دهد  كه با توقف اجراي برنامه اصلي، يك زير برنامه  وقفه  شروع به اجرا   شده و پس از پايان زير برنامه  مذكور، ميكروكنترلر را در هنگام  وقوع وقفه  نشان  مي‌دهد.  

انواع وقفه در ميكروكنترلر  PIC16F84A عبارتند از:  

1ـ وقفه خارجي مربوط به  پايه RBO/INT  

2ـ وقفه مربوط به  سر ريز  تايمر 

3ـ وقفه مربوط  به تغيير وضعيت  بيتهاي  4و5و6و7 از پورت  B   

4ـ وقفه مربوط به پايان  نوشتن اطلاعات بر روي  EEPROM 

 وقفه خارجي: 

اين نوع وقفه،  جز مهم‌ترين  نوع وقفه  ميكروكنترلر مي‌باشد. 

وقفه خارجي  بوسيله  يك سيگنال بالا رونده ( اگر INTEDG در رجيستر OPTION  CONTROL برابر  يك باشد)  و يا يك سيگنال  پايين  رونده (اگر  INTEDG در رجيستر OPTION CONTROL برابر صفر  باشد) در پايه  RBO/INT تريگر مي‌شود . در صورتيكه  اجازه وقوع وقفه خارجي به توسط رجيستر  INTCON  داده شده باشد، با هر  تريگر وقفه خارجي، ميكروكنترلر به سراغ زير برنامه  وقفه  مي‌رود (   وقوع وقفه).  در ادامه  در مورد رجيستر  INTCON   به تفصيل  صحبت  خواهيم كرد. 


وقفه سر ريز تايمر: 

تايمر ميكروكنترلر  در موقع سر  ريز  خود،  مي‌تواند  باعث بروز  وقفه  گردد.  اين نوع  وقفه نيز يكي از مهمترين  وقفه‌هاي  ميكروكنترلر مي‌باشد.  اين نوع  وقفه زماني بكار  گرفته  مي‌شود كه  نياز  باشد  ميكروكنترلر  پس از مدت زمان خاصي زير برنامه  وقفه  را اجرا  نمايد. بعنوان مثال  مي‌تواند  در هنگام نمايش  بر روي  سون  سگمنت ‌ها بكار گرفته شود.  

وقفه مربوط به بيتها ي 4 تا 7 از پورت  B: 

نوع ديگر  وقفه مربوط به بيتهاي  4و5و 6و7   از  پورت  B  مي باشد.  بدين صورت  كه تغيير وضعيت  حداقل يكي  از اين چهار بيت از سطح پايين  به سطح  بالا ( لبه  بالا رونده)  و يا از سطح  بالا به  سطح  پايين  ( لبه  پايين رونده)  ، مي‌تواند  باعث و قوع  وقفه  گردد.  البته بايد  به اين نكته  توجه داشت كه در صورتي  مي‌تواند  تغيير وضعيت اين چهار  بيت توسط  ميكرو  كنترلر حس شود  كه بيتهاي مذكور بعنوان ورودي  تعريف  شده باشند.  يكي از كاربردهاي  اين نوع  وقفه، در ارتباط دهي  صفحه كليد (  كيبرد) با ميكروكنترلر مي‌باشد. 

وقفه مربوط به  EEPROM 

به دليل اينكه سرعت  EEPROM  نسبت به  حافظه  RAM  يا FLASH  كمتر  مي‌باشد و زمان لازم  براي  نوشتن  در اين حافظه  حدود 10 ميلي‌ ثانيه  مي‌باشد، براي اينكه  وقت CPU   صرف اين  نوشتن نشود، وقفه‌اي  براي آن در نظر  گرفته شده است  كه بعد از  اتمام نوشتن  در EEPROM  مي‌باشد.  

رجيستر INTCON: 

رجيستر مذكور يك رجيستر  8 بيتي بصورت زير مي‌باشد. 

 RBIF    INTF    T0TF    RBIE    INTE    T0IE    EEIE    GIE

بيت صفر 

  (RB PORT CHANGE INTERRUPT FLAG BIT)RBIF 

اين بيت  وقوع  تغيير وضعيت حداقل  يكي از بيتهاي  4و5و6و7 پورت B را خبر مي‌دهد.  بدين  گونه كه در صورت  وقوع  تغيير وضعيت  فوق،  مقدار اين بيت برابر يك منطقي مي‌شود. 

اگر RBIF=0 باشد، آنگاه  هيچ تغيير وضعيتي بر روي  حداقل  يكي از  بيتهاي  فوق مشاهده نشده  است. 

اگر RBIF=1  باشد، آنگاه حداقل  يكي  از بيتهاي  فوق تغيير وضعيت  داده است. 

(INT EXTERNAL INTERRUPT FLAG BIT)  INTF:   

اين بيت وقوع  لبه بالا رونده (INTEDG=1) و يا لبه پايين رونده (اگر I NTEDG=0) سيگنال  را در پايه RB0/INT خبر مي‌دهد  و مي‌تواند  موجب  بروز وقفه خارجي گردد. 

اگر INTF=0 باشد، آنگاه  لبه مورد نظر سيگنال در پايه RBO/IN T توسط ميكروكنترلر حس نشده است. 

اگر INTF=1 باشد، آنگاه  لبه مورد  نظر سيگنال  در  پايه RBO/IN T توسط ميكروكنترلر حس شده است. 

بايد توجه داشت كه در صورت وقوع  وقفه خارجي اين بيت  مي‌بايست در زير  برنامه  وقفه  صفر شود تا  ميكروكنترلر بتواند وقفه خارجي بعدي  را حس كند.  اين عمل مي‌تواند بوسيله خط  زير انجام  شود. 

INTCON .1=0 


(TMRO OVER FLOW INTERRUPT FALG BIT) TOIF: 

اين بيت وقوع  سر ريز تايمر را خبر مي‌دهد. بدين معني  كه با شمارش تايمر و با اولين گذشتن از  عدد 255 به صفر است، اين بيت  يك مي‌شود .  يك شدن اين بيت  مي‌تواند باعث وقوع  وقفه  گردد ( وقوع  يا عدم وقوع وقفه  در اين حالت  بستگي به مقدار  بيت GIE , TOIE دارد كه  در ادامه  توضيح خواهيم داد).  

اگر T0IF=0 باشد، آنگاه  سر ريز  تايمر نيفتاده  است. 

اگر T0IF=1  باشد، آنگاه سر ريز تايمر اتفاق افتاده  است. 

بايد توجه داشت كه در صورت بروز وقفه  مي‌بايست در زير برنامه وقفه اين بيت صفر   شود تا ميكرو كنترلر وقوع  وقفه  بعدي  را حس كند.  

RBIE (RB PORT CHANGE INTERRUPUT ENABLE BIT): 

اين بيت اجازه وقوع   وقفه  مربوط به  بيتهاي  4و5و6و7 از  پورت  B  را صادر مي‌كند.

اگر RBIE=0 باشد، آنگاه وقوع  وقفه  مربوط به بيتهاي  4 تا 7 پورت  B  غير فعال خواهد بود. 

اگر RBIE=1  باشد، آنگاه  اجازه  وقوع  وقفه مربوط به بيتهاي  4 تا 7 پورت  B صادر شده است. 

توجه داشته باشيد كه در صورتي اين وقفه مي‌تواند اتفاق  بيافتد  كه بيتهاي  RBIE,RBIF توأماً يك باشند.  

(INT EXTERNAL INTERRUPT ENABLE BIT) INTE: 

اين بيت  اجازه وقوع وقفه  خارجي را صادر  مي‌كند.  

اگر INTE=0 باشد، آنگاه وقوع   وقفه خارجي  غير فعال خواهد بود. 

اگر INTE=1  باشد، آنگاه  اجازه  وقوع  وقفه خارجي صادر شده است. 

توجه داشته  باشيد كه اگر بيتهاي  INTE , INTF  توأماً  يك باشند  ، وقفه خارجي مي‌تواند  اتفاق بيافتد.  

 TOIE  (TMRO OVER FLOW INTERRUPT ENABLE BIT) : 

اين بيت اجازه  وقوع وقفه  سر ريز تايمر را صادر مي كند.  

اگر T0IE=0  باشد، آنگاه  وقوع وقفه سر ريز غير فعال  خواهد بود. 

اگر TOIE=1  باشد،  آنگاه اجازه وقوع وقفه  سر ريز تايمر را  صادر مي‌كند.  

توجه داشته باشيد كه اگر  بيتهاي   T0IF و T0IE توأماً  يك باشند، وقفه خارجي  مي‌تواند  اتفاق بيافتد. 

(EEPROM WRITE COMPLETE INTERRUPT ENABLE BIT)  EEIE: 

اين بيت  اجازه  وقوع  وقفه  مربوط به EEPROM را صادر  مي‌كند.  

اگر EEIE=0  باشد، آنگاه وقوع  وقفه  مربوط به  EEPROM  غير فعال  خواهد بود. 

اگر EEIE=1  باشد، آنگاه اجازه   وقوع وقفه  مربوط به  EEPROM  صادر شده است.  

توجه داشته  باشيد كه ا گر بيتهاي  EEIE , EEIF  توأماً يك باشند،  وقفه مربوط به  EEPROM  مي‌تواند  اتفاق  بيافتد. 

EEIF   يكي از  بيتهاي  رجيستر EECON1 مي‌باشد. 

GIE   (GLOBAL INTERRUPT ENABLE BIT)

این بیت کلیه وقفه ها را فعال و یا غیر فعال می کند.

اگر GIE= 0  باشد  آنگاه کلیه وقفه ها غیر فعال خواهند بود.

اگر GIE=1  باشد آنگاه کلیه وقفه ها اجازه وقوع خواهند داشت.






فصل 3

برنامه نویسی و برنامه ریزی PIC


برنامه ريزي   PIC XXXXXX

كامپايلر    PIC BASIC PRO  يكي  از ساده‌ترين  و قدرتمندترين  كامپايلر جهت برنامه نويسي ميكرو  كنترلرهاي خانواده PIC  مي‌باشد. 

 برنامه  در نرم افزار    MICRO CODE STUDIO PLUS و يا به اختصار     mcsp(به زبان BASIC) نوشته  مي‌شود  و  كامپايلر    pic basic pro  ، برنامه  نوشته شده  را كامپايل  كرده  و  به  پسوند  HEX , ASM تبديل مي‌نمايد  كه فايل  با پسوند HEX، جهت برنامه ريزي بر روي ميكرو كنترلر به توسط نرم‌افزارهاي  برنامه ريزي EPIC ،  ICPROG و غيره بكار مي‌رود.  

در روش معمولي و بدون استفاده از  كامپايلر   مي‌بايست  برنامه  به زبان  اسمبلي  با پسوند  ASM نوشته  شود و  سپس  تبديل  به  فايل  HEX  گردد.  

مسلماً  برنامه‌هاي نوشته شده به زبان  PIC BASIC PRO  و يا به اختصار PBP بسيار كوتاهتر  و  قابل  فهم‌تر  هستند و از اين جهت  فراگيري آنها  بسيار  آسانتر  است. 

جهت برنامه‌ر يزي PIC  ابتدا بايد در برنامه  كامپايلر  و همچنين  پروگرام بايد نوع PIC ابتدا بايد در  برنامه كامپايلر و همچنين  پروگرام بايد نوع PIC  و همچنين مدل اسيلاتور  را مشخص كرد.  

فرمان‌ها  در زبان  PIC BASIC PRO

در اين بخش  ، به دستورات  اوليه براي  برنامه نويسي به زبان  PBP  اشاره مي‌كنيم  . اين دستورات  ، علاوه  بر سادگي، مهمترين دستورات  در  برنامه‌نويسي  هستند و اغلب   در برنامه‌ نويسي‌هاي  خود از آنها استفاده  مي‌نمائيم  . برخي از اين دستورات  نيز جهت سهولت  در  برنامه نويسي بكار مي‌ آيند. 

به اين نكته  توجه داشته باشيد كه در هنگام  وارد كردن  دستورات در نرم افزار MCSP، هرگاه نام دستور  و  فاصله ميان دستور و بقيه  برنامه  را رعايت   كنيد ،  دستور  مذكور  پر رنگ  خواهد بود. 



 

عمليات رياضي  

در زبان برنامه نويسي PBP، كليه محاسبات رياضي به سادگي مي توانند در برنامه وارد شوند . به كار گيري اغلب اين دستورات آنقدر ساده است كه نيازي به توضيح ندارند.

مهم ترين اعمال رياضي در جدول (1-3) آمده اند

(D-E) A=(B+C) 

در عبارت فوق، همانگونه كه نوشته شده است ،مقدار A برابر خواهد بود به حاصلضرب دو مقدار (D-E)و(B+C) در عبارت فوق،مقدارW1برابر خواهد بود با 16 بيت بالا از حاصلضرب 32 بيتيW0و1000.

عملكرد    عمليات رياضي

جمع    +

تفريق    -

ضرب    ‌*

16 بيت  بالا  از عمل ضرب    **

 6 بيت  وسط از  عمل ضرب    *                                                                                           

تقسيم     /

باقيمانده     //

شيفت به چپ    <<

شيفت  به راست     >>

ماكزيمم    MAX

مينيمم    MIN

رقم     DIG

مفاهيم اوليه

        متغيرها(VARIABLES) 

                     متغيرها براي مقادير مختلف رياضي و منطقي به كار مي روند. به عنوان مثال اگر بخواهيم برنامه شمارنده اي بنويسيم كه از صفر الي 9 شروع به شمارش نمايد،مي بايست عدد صفر را در يك متغير ذخيره كرده و هر بار يك واحد عدد قبلي را افزايش دهيم. بدين ترتيب به متغير مذكور، اعداد مختلفي را مقداردهي مي كنيم . دستورVAR براي تعريف كردن يك متغير به كار مي رود .

در برنامه نويسي به زبان PBP ،سه نوع متغير مختلف به صورت ذيل مي توان تعريف نمود:

1_بيت(bit)

2_بايت(byte)

3_كلمه(word)

بيت ، متغيري يك بيتي است كه فقط اعداد صفر و 1 را شامل مي شود .

بايت، متغير 8 بيتي است كه اعداد بين صفر تا 255 را شامل مي شود .

كلمه ، متغيري 16 بيتي است كه اعداد بين صفر تا 65535 را شامل مي شود .

در برنامه نويسي بسته به نياز خود مي توانيم هر يك از سه متغير فوق را به كار بريم. به عنوان مقال متغير مورد نياز براي يك شمارنده صفر تا 9 ،از نوع بايت است. البته مي توان متغير كلمه را نيز تعريف نمود، ولي نيازي به اين كار نيست.

فرض كنيد مي خواهيمb5 را به عنوان متغير از نوع بايت تعريف كنيم. براي اين كار چنين مي نويسيم:

B5  var  bit 

تعريف متغيرهاي ديگر نيز به همين طريق است.

B6  var  byte

B7   var  word


مقادير ثابت(CONSTANTS)

مقادير ثابت را در سه مبنا مي توان براي نرم افزار تعريف كرد.

1_دسيمال

2_باينري

3_هگزادسيمال

به روشي مبناهاي مذكور بايد از يكديگر متمايز شوند . چرا كه به عنوان مثال عدد (10) در مبناهاي دسيمال، باينري و هگزا دسيمال مقادير مختلفي را بيان مي دارند. عدد مذكور در مبناي دسيمال به معني عدد 10، در مبناي باينري به معني عدد 2و در مبناي هگزا دسيمال به معني عدد 16 مي باشد. بنابراين براي متمايز كردن آنها ازيكديگر به ترتيب  زير عمل مي كنيم:

اعداد در مبناي دسيمال را مستقيما" مي نويسيم.

B0=10

اعداد در مبناي باينري را باعلامت % كه در ابتداي آنها قرار مي دهيم ،مشخص مي كنيم.

B0=%10


اعداد در مبناي هگزا دسيمال را با علامت $ كه در ابتداي آنها قرار مي دهيم ، مشخص مي كنيم.

B0=$10


دستور con جهت مقدار دهي به كار مي رود . به عنوان مثال اگر بخواهيم به minut عدد 60 را مقدار دهي كينم ،بدين صورت عمل مي نمائيم.

Minute   con   60

توجه داشته باشيد كه موقعي مي توانيم از رابطه (minute=60) استفاده نمائيم، كه minut را به عنوان يك متغير تعريف كرده باشيم.

Minute   var  byte

Minute=60


نكته: عموما دستور  conقبل از برچسب برنامه  اصلي به كار مي رود .

TRIS

دستورtris جهت مشخص كردن ورودي و خروجي بودن هر پايه از ميكروكنترلر مي باشد. اين دستور براي پورتهاي مختلف بايد جداگانه به كار گرفته شود. در دستور فوق به هر بيت از پورتهاي ميكروكنترلر يك مقدار صفر و يا يك اختصاص مي دهيم . اگر به بيتي مقدار صفر را اختصاص دهيم  به معني آنست كه بيت مذكور را به عنوان خروجي تعريف كرده ايم و در نظر داريم بيت مذكور اطلاعاتي را از ميكروكنترلر  به مدارات خارجي انتقال دهد و اگر به آن مقدار يك اختصاص دهيم به معني آنست كه بيت مذكر را به عنوان ورودي تعريف كرده ايم و در نظر داريم بيت مذكور اطلاعاتي را از مدارات خارجي به ميكروكنترلر انقال دهد. 

فرض كنيد مي خواهيم پورتBرا جهت فرستادن اطلاعات لازم براي نمايش بر روي سون سگمنت استفاده نمائيم در اين صورت بايد كليه بيتهاي پورت B را به عنوان خروجي تعريف كينم . اين امر توسط دستور ذيل صورت مي گيرد.                  Trisb=0

ويا

Trisb=%00000000

ويا

Trisb=$00 

حال فرض كنيد مي خواهيم پورت AميكروكنترلرPIC16F84Aرا كه شامل 5 بيت مي باشد به گونه اي تعريف كنيم كه بيتهاي 0و2و3 از پورت(RA3,RA2.RA0)Aرا به عنوان ورودي و بيتهاي 1و4 از پورت (RA4,RA1)Aرا به عنوان خروجي تعريف نمائيم. بنابراين از دستورtrisبه صورت ذيل استفاده مي نمائيم.

Trisa=%01101

ويا

Trisa=13

اگر بخواهيم يك بيت را به تنهايي به عنوان ورودي و يا خروجي تعريف نمائيم،مي توانيم بدين صورت عمل نمائيم.

Trisea.0=0

اين دستور بيت صفر از پورت Aرا به عنوان خروجي تعريف مي كند . 

نكته: عموما دستورtris قبل از برچسب برنامه اصلي به كار مي رود .

برچسب(LABEL)

برچسب نام يك زير برنامه است بطوريكه اين نام متعلق به كليه دستوراتي كه در پايين آن و قبل از برچسب بعدي است خواهد بود. براي برچسب زدن به يك سري از دستورات ، مي بايست بعد از نام برچسب يك علامت (:) قرار دارد تا كامپايلر به برچسب مذكور از خط بعد از آن آغاز شوند تا برنامه نوشته شده قابل فهم تر باشد. يك برنامه مي تواند شامل چندين برچسب باشد. برنامه نوشته شده در زير شامل دو برچسب mainوledمي باشد.

B0  var  byte

Main:

B0=0

Button portb.0,0,255,0,b0,1,led

Goto  main

Led:

Toggle   portb.0

Goto  main

end

نكته: معمولا" برچسب اصلي برنامه ،با نام mainانتخاب مي شود .

SYMBOL

اين دستور براي تعريف يك نام جديد به كار مي رود .

فرض كنيد براي اشاره كردن به بيت يكم از پورت (PORTB.1)Bبخواهيم از كلمه LEDاستفاده نمائيم. براي اين كار مي توانيم از دستورSYMBOL بدين صورت استفاده نمائيم:

Symbol   led=portb.1

پس از اجراي دستور فوق توسط ميكروكنترلر ،هرگاه بخواهيم به بيت يكم از پورتBاشاره كنيم مي توانيم به كلمه LEDاشاره كنيم. به عبارت ديگر دو دستور ذيل يكسان مي باشند.

Portb.1=1

Led=1

اين دستور جهت سهولت در برنامه نويسي به كار مي رود .

نكته: دستورsymbolعموما قبل از برچسب برنامه اصلي به كار مي رود .

DEFINE

بعضي از تنظيمات از قبيل فركانس اسيلاتور يا تنظيمات مربوط به DEBUG و پين هاي آن يا نحوة اتصال پين هاي LCD به طور پيش فرض در PBP تعريف شده اند . اگر در ابتداي برنامه آنها را تعريف نكنيم ، بايد به صورت پيش فرض استفاده شوند ،اما استفاده از DEFINE اين امكان را مي دهد كه مقادير پيش فرض را به طور دلخواه تغيير دهيم . بطور مثال پيش فرض در PBP استفاده از اسيلاتور 4MEG مي باشد و لازم نيست در ابتداي برنامه DEFINE  OSC 20  را اضافه كنيم .اين دستورات حتما" بايد با حروف  بزرگ نوشته شود .DEFINE  LCD _DREG  DEFINE  Lcd_dreg 

در ادامه پس از بيان هر دستور بيسيك،DEFINEهاي مربوط به آن بررسي خواهدشد اما در زير به طور كامل جمع آوري شده است:                                             







جدول(2-3)

‘button debounc Delay in ms    DEFINE  BUTTON _ PASUE 10

‘serout character Pacing in us    DEFINE   CHAR_PACING    1000

‘Debug  pin port    DEFINE   DEBUG_REG  PORTB

‘Debug  pin bit    DEFINE   DEBUG_BIT0

‘Debug  baud rate    DEFINE   DEBUG_BAUD 2400

‘Debug  mode:0= True,1=inverted    DEFINE   DEBUG_MODE  1

‘Debug character Pacing in us    DEFINE   DEBUG_PACING 1000

‘Debuging pin port    DEFINE   DEBUGIN-REG  PORT

‘Debuging pin bit    DEFINE   DEBUGIN_BIT0

‘Debug  mode:0= True,1=inverted    DEFINE   DEBUGIN_MODE  1

‘hser baud rate    DEFINE   HSER_BAUD 2400

‘hser spbrg init    DEFINE   HSER_SPBRG  25

‘hser receive      Status init    DEFINE   HSER_RCSTA  90h

‘herstransmit   Statuse init    DEFINE   HSER_TXSTA 20h

‘Use only if even Parity desired    EVEN1         DEFINE   HSER_

‘Use only if odd Parity desired    DEFINE   HSER_ODD1

‘pause 12c  Transmission while Clock held low    DEFINE12C_HOLD1

‘Use for internal EEPROM on 16CEXXX   And 12CEXXX    DEFINE12C_INTERNAL 1

‘Set serial clock To bipolar instead Of open-collecto    DEFINE12C_SCLOUT 1

‘Use for>8 MHz OSC With standard Speed  devices    DEFINE12C_SLOW 1

‘LCD data port    DEFINE LCD_DREGPORTA

‘LCD data starting    Bit 0 or 4    DEFINE LCD_DBIT 0

‘LCD register Select port    DEFINE LCD_RSBIT 4

‘LCD register     Select bit    DEFINE LCD_EREG PORTB

‘LCD enable bit    DEFINE LCD_EBIT 3

‘LCD read/write  bit    DEFINE LCD_RWBIT 2

‘LCD bus size 4 or 8    DEFINE LCD_BITS 4

‘Number lines on LCD    DEFINE LCD_LINES 2

‘Command delay time in us    DEFINE LCD_COMMANDUS 2000

‘Data delay time in us    DEFINE LCD_ DATAUS 50

‘Oscillator speed In MHz:3(3.58)4 8 10 12 16 20 25   32 33 40    DEFINE  OSC 4

‘Set OSCCAL for PIC12C671/CE673    DEFINE  OSCCAL_1K1

‘Set OSCCAL for  PIC12C672/CE674    DEFINE  OSCCAL_2K1

‘Set number of Data bits for Serin2 and serout2    DEFINE SER2_BITS 8

‘Slow down the Shiftin and Shiftout clock    DEFINE  SHIFT_PAUSEUS 50

‘Use 18 Cxxx LFSR instruction    DEFINE USE_LFSR 1



OUTPUTوINPUT

اين دستورات جهت تعريف كردن يك پايه از ميكروكنترلربه عنوان ورودي يا خروجي مي باشد. به عنوان مثال عبارت ذيل بيت صفرم از پورتAرا به عنوان ورودي تعريف مي نمايد.

Input porta.0

به طور مشابه عبارت ذيل مي تواند بيت يكم از پورت B را به عنوان خروجي تعريف نمايد.

Output  portb.1


LOWوHIGH

دستوراتHIGHوLOW به ترتيب براي مقدار دهي يك منطقي و صفر منطقي به يك پايه خروجي بكار مي رود. به عنوان مثال براي اينكه بيت دوم از پورتA را به سطح منطقي يك ببريم،مي توانيم از دستور زير استفاده كنيم.

High porta.2

دستور ذيل مي تواند همين عمل را انجام دهد .

Porta.2=1

البته توجه داشته باشيد كه در اين روش ، بيت مذكور بايد از قبل به عنوان خروجي تعريف شده باشد. ولي با استفاده از دستورات HIGH وLOW ، اين كار به صورت اتوماتيك انجام خواهد  شد.

دستورات کلیدی

SOUND

Sound   pin,[note,duration,{,note,duration…}]

دستورsound،جهت توليد نت و يا نويز به كار مي رود . در اين دستور پايه اشاره شده به طور اتوماتيك به عنوان خروجي تعريف مي شود . عبارت note مقداري بين 1 تا 255 مي تواند داشته باشد كه مقادير 1 تا 127 مربوط به توليد نت و مقادير 128 تا 255 مربوط به توليد نويز سفيد مي باشند . نت شماره يك(note=1) فركانسي در حدود 78/74 هرتز و نت شماره 127 فركانسي حدود 10 كيلو هرتز خواهد داشت .

عبارت duration يك متغير عددي از صفر تا 255 مي باشد كه مشخص كننده آنست كه نت مربوط چه مدت زماني اجرا شود. هر يك واحد افزايش متغير duration تقريبا" معادل 12 ميلي ثانيه مي باشد. عبارت داخل{} در دستور sound نشان دهنده آنست كه چند نت پياپي مي تواند توليد شود.

پيشنهاد مي شود كه دستور sound را در بيتهاي پورتB بكار بريد. 

Sound portb.7,[100,10,50,10]

عبارت فوق موجب توليد دو نت متوالي بر روي بيت هفتم از پورت B مي شود. سيگنال خروجي ،يك موج مربعي با سطح ولتاژTTL مي باشد.

يك بلندگوي كوچك به همراه يك خازن مي تواند توسط پايه مولد سيگنال راه اندازي شود ولي بلندگوهاي كريستالي (پيزو) مي تواند به طور مستقيم را ه اندازي گردند.

FREQOUT

Freqout  pin,onms,frequency1{,frequency2}                                               

اين دستور بر روي پايه pin،يك يا دو فركانس با اندازه onms ميلي  ثانيه توليد مي نمايد .پايه اشاره شده در دستور به طور اتوماتيك به عنوان خروجي تعريف مي شود . محدوده فركانس هاي توليد شده مي تواند از صفر تا 32767 هرتز باشد.

دستورfreqout با نوسانسازهاي 20 مگاهرتز و 40 مگاهرتز بهتر كار مي كند ولي در عين حال در نوسانسازهاي 10 مگاهرتز و حتي 4 مگاهرتز نيز مي تواند كار كند.

Freqout  portb .1,2000,1000

عبارت فوق يك نواي (tone)يك كيلو هرتزي به مدت 2 ثانيه برروي بيت يكم از پورت B توليد مي نمايد.

Reqout  portb .1,2000,350,440

عبارت فوق دو نواي 350 هرتز و 440 هرتز را به مدت 2 ثانيه بر روي بيت يكم از پورتB توليد مي نمايد.


DTMFOUT

Dtmfout  pin,{onms,offms,}[tone{,tone…}]                                               

دستورdtmfout يك سري از نواها(tone) را بر روي پايه خاصي از ميكرو كنترلر توليد مي كند. پايه اشاره شده در اين دستور به  طور  اتوماتيك به عنوان خروجي تعريف مي شود . دو قسمت onmsوoffmsبه ترتيب مدت نواخت نواي مربوطه و توقف ميان هر نوا بر حسب ميلي ثانيه مي باشند. استفاده از اين دو قسمت اختياري است و در صورت عدم استفاده از آنها ،مقادير پيش فرض آنها در نظر گرفته مي شوند كه مقدار پيش فرض براي onmsبرابر 200 ميلي ثانيه و براي offms برابر 50 ميلي ثانيه مي باشد.

عبارت tone مي تواند مقاديري از صفر تا 15  داشته باشد .اعداد 0 تا 9 همان كليدهاي 0 تا 9 بر روي صفحه كليد تلفن مي باشند و مي توانند همانند آنها عمل كنند.

نواي شماره 10 مربوط به (*) و نواي شماره 11 مربوط به (#) و نواهاي 12 تا 15 مربوط به حروفA تا D هستند.

دستورdtmfout با كريستال 20 مگاهرتز و 40 مگاهرتز بهتر كار مي كند . البته با كريستال 10 مگاهرتز و حتي 4 مگاهرتز نيز كار مي كند.

Dtmfout portb.1,[2,1,2] 

عبارت فوق يك نوا ي dtmfبرابر 212 بر روي بيت يكم از پورتB توليد مي كند.

PWM

PWM pin,duty,cycle                                                                                    

قسمت pin،پايه اي است كه دنباله مدوله شده با عرض پالس(pwm)را توليد مي نمايد .هر دوره از pwm شامل 256 گام مي باشد.

نسبت highبه(duty cycle)low را مي توان توسط قسمت duty تعيين نمود.

Duty مي تواند مقداري مابين صفر(0%)تا(100%)داشته باشد.

قسمتcycle، تعداد دفعات توليد سيگنال را تعيين مي نمايد.

مدت زمان  يك سيكل كامل هر سيگنال به مقدار فركانس نوسان ساز بستگي دارد. براي نمونه اگر از كريستال 4 مگاهرتز استفاده شود، اين مدت حدود 5 ميلي ثانيه و اگر از كريستال 20 مگاهرتز استفاده شود، اين مدت حدود 1 ميلي ثانيه خواهد بود.

Pwm portb.7,127,100

عبارت فوق 100 سيكل كامل از سيگنال pwm با نسبتhighبهlowبرابر 50%را بر روي بيت هفتم از پورت B ايجاد مي نمايد.


COUNT

Count  pin,period,var

اين دستور ،تعداد پالسهاي ديده شده بر روي پايه pin را در مدت زمان period شمارش كرده و در متغير varمي نمايد. پايه اشاره شده در اين دستور به صورت اتوماتيك به عنوان ورودي تعريف مي شود. مقدار زماني period بر حسب ميلي ثانيه مي باشد.

با يك كريستال 4 مگاهرتز چك كردن وضعيت پايه pin در هر 20 ميكرو ثانيه صورت مي گيرد و با استفاده از يك 20 مگاهرتز اين مدت به 4 ميكرو ثانيه مي يابد.

به كمك دستورcount بسادگي مي توان فركانس يك سيگنال را اندازه گيري نمود. بدين صورت كه تعداد پالسها  را در مدت زمان يك ثانيه شمارش نمائيم. در اين روش حداكثر فركانس قابل اندازه گيري با يك نوسانساز 4 مگاهرتز برابر 25 كيلو هرتز و با يك نوسانساز 20 مگاهرتز برابر 125 كيلو هرتز مي باشد.

Count portb.1,100,w1

عبارت فوق تعداد پالسها را بر روي بيت يكم از پورت B در مدت زمان 100 ميلي ثانيه اندازه گيري نموده و نتيجه ا در متغير w1 ذخيره مي نمايد.

Count porta.2,1000,w1

عبارت فوق تعداد پالسها را بر  روي بيت دوم از پورت A در مدت زمان يك ثانيه اندازه گيري نموده و در متغير W1 ذخيره مي نمايد كه مقدار به دست آمده برابر فركانس سيگنال مي باشد.


PULSIN

Pulsing  pin,state,var

اين دستور عرض پالس را بر روي پايه اشاره شده pin اندازه گيري نموده و در متغير var ذخيره مي نمايد. اگر قسمتstateدر فرم كلي دستور، برابر صفر باشد دستور، عرض قسمت پايين (low) پالس را اندازه گيري خواهد كرد و اگر قسمت state برابر يك باشد، قسمت بالاي(high) پالس اندازه گيري خواهد شد.

متغيرvar بايد يك متغير 16 بيتي باشد و بنابراين مي تواند اعدادي بين صفر تا 65535 را در خود ذخيره كند. دقت اندازه گيري در اين دستور بستگي به فركانس نوسانساز دارد. بطوريكه اگر از يك نوسانساز 4 مگاهرتز استفاده نمائيم ،گامهاي اندازه گيري 10 ميكروثانيه مي باشد و اگر از يك نوسانساز 20 مگاهرتز استفاده نمائيم ،گامهاي اندازه گيري 2 ميكروثانيه مي باشد. 

با مشخص بودن گامهاي اندازه گيري مي توان عرض پالس را محاسبه نمود. فرض كنيد از يك نوسانساز 4 مگاهرتز استفاده نموده ايم. در اين حالت عرض پالس اندازه گيري شده برابر با حاصلضرب مقدار متغير var در 10 ميكرو ثانيه مي باشد.

               (10 ميكرو ثانيه )  =var عرض پالس اندازه گيري شده 

بنابراين دستورpulsin، توانايي اندازه گيري پالسهايي با عرض 10 تا 655350 ميكرو ثانيه را دارد . 

اگر از متغير8 بيتي به عنوان var استفاده نمائيد ، تنها بايت پايين از 16 بيت اندازه گيري شده توسط دستورpublish،در متغير var ذخيره خواهد شد .

Publish  portb .4,1,w1

عبارت فوق عرض سطح بالاي پالس را بر روي بيت چهارم از پورت B اندازه گيري نموده  و در متغير W1 ذخيره مي نمايد.

در دستورpublish اگر پهناي پالس بزرگتر از آن باشد كه ميكرو كنترلر قادر به اندازه گيري آن است، مقدار متغير var برابر صفر خواهد شد.

نكته ديگر اينكه دستور مذكور، پايه اشاره شده را به  طور اتوماتيك به عنوان ورودي تعريف مي نمايد.


PULSOUT

Pulsout pin,period

اين دستور ، پالس را در پايه اشاره شده pinتوليد مي نما يد. عرض پالس توسط متغير period كه يك متغير 16 بيتي است تعيين مي گردد.

متغير period مي تواند اعدادي بين صفر تا 65535 را در خود ذخيره كند. اگر از يك نوسانساز 4 مگاهرتز استفاده نمائيم ،گامهاي توليد پالس برابر 10 ميكرو ثانيه خواهد بود. به عبارت ديگر ،هر واحد افزايش متغير period معادل مقدار 10 ميكرو ثانيه توليد پالس خواهد بود . بنابراين مي توان عرض پالس توليد شده را  به توسط رابطه زير محاسبه نمود:

(10 ميكرو ثانيه )  period = عرض پالس توليد شده 

بنابراين مي توان پالسها ي با عرض 10 تا 655350 ميكرو ثانيه را توليد نمود.

در صورت استفاده از يك نوسانساز 20 مگاهرتز، گامهاي توليد پالس برابر 2 ميكرو ثانيه خواهد بود.

Pulsout   portb.1,100

عبارت فوق بر روي بيت يكم از پورت B،پالسي  با طول  يك ميلي ثانيه (در صورت استفاده از كريستال 4 مگاهرتزي )ايجاد مي نمايد.


POT

Pot  pin,scale,var

اين دستور مقدار يك مقاومت متغير يا برخي وسايل مقاومتي را كه به پايه اشاره شده pinمتصل شده است مي خواند . ميزان مقاومت براساس زمان تخليه خازن در مقاومت كه معمولا بين 5 كيلو اهم تا 50 كيلو اهم مي باشد اندازه گيري مي شود .(شکل 1-3)

Scale براي تنظيم تغييرات ضريب ثابت شبكه RC به كار مي رود . براي ضرايب ثابت بزرگRC،  مقدارscale را يك انتخاب كنيد و براي ضرايب ثابت كوچك RC، مقدار scale را روي حداكثر مقدار خود يعني 255 قرار دهيد.

اگر مقدار scale درست انتخاب شده باشد، مقدار متغير var در حالتي كه مقدار مقاومت حداقل است ، نزديك به صفر شده و در حداكثر مقاومت ،نزديك به 255 خواهد شد .

Scale را بايد به طور تجربي تعيين نمود. براي تنظيم scale ،ابتدا مقاومت متغير را بر روي ماكزيمم مقدار مقاومت قرار دهيد و scale را 127 انتخاب نمائيد. در بهترين حالت مقدار متغير var بايد برابر با 254 شود. اگر متغير var مقداري برابر و يا كمتر از 253 داشت، scale را كاهش دهيد و اگر متغير varمقداري برابر 255 داشت،scale را افزايش دهيد . اين عمل را آنقدر تكرار نمائيد تا  به بهترين مقدار براي scale برسيد.

تنظيم scale مي تواند توسط برنامه ذيل به صورت اتوماتيك انجام گردد. در انتها مقدار scale به صورت باينري بر روي پورت B قرار داده مي شود كه مي تواند توسط LED هايي كه بر روي پورتB قرار مي گيرند ،خوانده شود .

B0  var  byte

Scale  var byte

For scale=1 to 255

Pot  porta.0,scale,b0

If b0>253 then calibrated

Next   scale

Calibrated:

Portb=scale

Goto main

End

 

شکل 1-3

READ

Read  address,var

اين دستور جهت خواندن يك بايت از محتويات حافظه EEPROM داخلي ميكرو كنترلر كه آدرس آن در متغير address ذخيره شده است به كار مي رود . اطلاعات موجود در اين آدرس ، در متغيرvar ذخيره خواهد شد . دقت داشته باشيد كه دستور readبايد در مورد ميكرو كنترلرهايي به كار ورد كه داراي حافظه EEPROM داخلي باشند . مانند ميكروكنترلر هاي PIC16F84AوPIC16F87X 

B1  var  byte

Read  5,b1

عبارت فوق ، محتويات آدرس 5ازEEPROM داخلي ميكرو كنترلر را داخل متغير b1 ذخيره مي كند . براي خواندن يك كلمه ،مي بايست بايتهاي بالا و پايين آنرا به طور جداگانه از حافظه EEPROM داخلي خواند .

W var byte

Read 0,w.byte0

Read 1,w.byte1

عبارات درج شده ،محتويات آدرس صفر  از EEPROM داخلي را در بايت پايين و محتويات آدرس يك ازEEPROM داخلي را در بايت بالاي متغير 16 بيتي ذخيره مي نمايد .

WRITE

Write     address,value

اين دستور جهت نوشتن يك بايت در حافظه EEPROM داخلي ميكرو كنترلر به كار مي رود . بدين صورت كه مقدار value  را در حافظه  EEPROM  داخلي  ميكرو كنترلر  كه آدرس آن توسط متغير address مشخص شده است مي نويسد.

دقت داشته باشيد كه دستورwrite بايد در مورد ميكرو كنترلرهايي به كار رود كه داراي حافظه EEPROM داخلي باشند مانند ميكرو كنترلر هاي PIC16F84AوPIC16F87X 

B1  var byte

Write  5,b1

عبارت فوق مقدار متغير b1 را در آدرس 5 از EEPROM داخلي مي نويسد .

براي نوشتن يك كلمه در حافظه EEPROM داخلي ميكرو‌‌ كنترلر، مي‌بايست بايتهاي بالا و پايين آن كلمه به طور مجزا در حافظه EEPROM داخلي نوشته شوند .

W var word

Write 0,w.byte0

Write 1,w.byte 1

عبارات فوق ،بايت پايين از كلمه w  را در آدرس صفر و بايت بالا از كلمه wرا در آدرس يك ازEEPROM داخلي ميكرو كنترلر  مي نويسد.

BUTTON

Button pin,down.delay,rate,var,action,label

دستور button براي خواندن وضعيت الكتريكي يك كليد فشاري متصل شده به يك پايه ميكرو كنترلرPIC مي باشد.

Pin:مشخص كننده پايه متصل شده به دكمه فشاري است.

 Down: وضعيت پايه ، وقتي كه دكمه فشرده شده است.

اگر در حالت فشرده شدن دكمه، سطح ولتاژ پايه (pin) برابر يك شود، بايد down برابر يك قرار گيرد و اگر در حالت فشرده شدن دكمه، سطح ولتاژ پايه (pin) برابر صفر شود ،بايد down برابر صفر مقدار دهي شود . به شكل (4-3) توجه فرمائيد.

 

Delay: ميزان تاخير قبل از شروع تكرار خودكار مي باشد كه مقداري بين صفر تا 255 مي تواند داشته باشد.

اگر delay برابر صفر قرار داده شود ، نه debounceخواهيم داشت و نه تكرار خودكار.

اگر delay برابر 255 قرار داده شود ، debounce خواهيم داشت ولي تكرار خودكار انجام نخواهد شد. در ادامه مفهوم debounce را توضيح خواهيم داد.

Rate: نرخ تكرار خودكار مي باشد كه مقداري بين صفر تا 255 مي تواند داشته باشد.

 Var: متغيري از نوع بايت (8 بيتي) است كه براي تاخير يا شمارش معكوس به كار برده مي شود. قبل از استفاده از دستور button،مي بايست اين متغير با عدد صفر مقدار دهي اوليه گردد.

Action: وضعيت دكمه براي اجراي فرمان جهش به برچسب label را مشخص مي كند . اگر action برابر صفر قرار داده شود ، در صورتي كه دكمه فشرده نشده باشد، جهش به برچسب label صورت مي گيرد و اگر action برابر يك قرار گيرد ، در صورت فشردن   دكمه ، جهش به برچسب labelصورت خواهد گرفت.

Label: برچسبي است كه در صورت درست بودن action، عمليات بايد از آنجا اداه پيدا كند.

مفهوم debounce:

Debounce اصطلاحي است كه براي توصيف حذف نويز كليدهاي الكتريكي به كار مي رود .در عمل اتصال الكتريكي كليدها در زمان كوتاهي در حدود 5 تا 20 ميلي ثانيه پس از باز يا بسته شدن كليد، مرتبا" قطع و وصل مي شود . اين قطع و وصل اتصال الكتريكي به همين دليل bounce (جست و خيز) ناميده مي شود كه به سادگي مي توان تصور كرد كه كنتاكتهاي كليد جست و خيز مي كنند و به هم چسبيده و يا از هم دور مي شوند .

سرعت ميكرو كنترلرها به قدري زياد است كه اين قطع و وصل شدن ها را به عنوان چندين قطع يا وصل شدن كليد در نظر مي گيرند و به آن پاسخ مي دهند . براي از بين بردن اين خطاها، روشها و مدارات debounce ارائه شده اند . 

در دستور button نيز اين قابليت در نظر گرفته شده است.

Button portb.1,0,100,10,b0,1,1ab

در عبارت فوق ،اگر كليد فشرده شده باشد اجراي برنامه  به برچسب lab1 جهش مي نمايد .كليد استفاده شده در عبارت فوق به گونه اي است كه در صورت فشرده شدن كليد ،سطح ولتاژ بيت يكم از پورت B برابر يك منطقي خواهدشد.شكل(4-3)نشان دهنده دونحوه اتصال‌كليدهاي فشاري به يكي ازپايه‌هاي ميكرو كنترلر است.

ON INTERRUPT

On interrupt goto label

اين دستور براي ميكرو كنترلر مشخص مي كند كه در صورت بروز وقفه ،مي بايست به كدام برچسب جهش كند. به عبارت ديگر بر چسب مربوط به وقفه را معين مي نمايد. اين دستور مي بايست قبل از برنامه اصلي نوشته شود . بنابراين در هنگام اجراي برنامه هرگاه وقفه اتفاق بيافتد، اجراي برنامه به برچسب وقفه جهش كرده و پس از اجراي زير برنامه وقفه ، به برنامه اصلي برگشته و ادامه عبارات و فرمانها را از محلي كه وقفه در آن صورت گرفته بود پي مي گيرد. 

برنامه نويسي زير برنامه وقفه، تفاوتهايي با ساير زير برنامه ها دارد. يكي از اين تفاوتها استفاده از دو دستورdisableوenable در ابتدا و انتهاي زيربرنامه وقفه است.

دستورdisable قبل از شروع زير برنامه وقفه مي بايست قرار داده شود. چرا كه در طول مدت اجراي زير برنامه وقفه، وقوع وقفه هاي جديد در نظر گرفته نشود.(اين دستور بيتGIF از رجيسترINTCON را صفر مي نمايد).

دستورenable  پس از زير برنامه وقفه مي بايست قرار داده شود تا امكان وقوع وقفه هاي بعدي در نظر گرفته شود. (اين دستور بيتGIF از رجيستر INTCON را يك مي نمايد). در انتهاي زير برنامه وقفه(قبل از دستورenable) مي بايست از دستور resume استفاده نمود تا موجب شود پس از پايان زير برنامه وقفه ، اجراي برنامه ، به برنامه اصلي بازگشت نمايد. بنابراين روال كلي زير برنامه  وقفه به صورت زير مي باشد:

On interrupt  goto myinterrupt

..

.

Disable

Myinterrupt

Porta.2=1

Resume

Enable

در برنامه فوق، توسط دستور on interrupt مشخص شده است كه برچسب مربوط به زير برنامه وقفه با نام myinterrupt مي باشد. بنابراين در انتهاي برنامه بايد زير برنامه وقفه با برچسب myinterrupt نوشته شود.

در برنامه نمونه، در صورت بروز وقفه بيت دوم از پورت A برابر يك منطقي قرار مي گيرد.

LOOKUP

Lookup  index,[ constant1, constant2,…  ],var

دستورlookup براي خواندن مقادير موجود در يك جدول مقادير ثابت ها به كار مي رود . مقدار خوانده شده درون متغير var ذخيره مي شود .

عملكرد اين دستور به گونه اي است كه اگر مقدار index برابر صفر باشد ،متغير با مقدار1مقدار دهي مي شود

اگر مقدارindex برابر يك باشد، متغير با مقدار constant2 مقدار دهي مي شود و به همين ترتيب ادامه مي يابد.

اگر مقدارindex بزرگتر از تعداد مقادير ثابت موجود در جدول باشد، متغير var بدون تغيير باقي مي ماند.

Lookup b0,[$3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f],b1

در عبارت فوق، اگر مقدارb0 برابر صفر باشد، متغير b1 با مقدار 3f هگزادسيمال مقداردهي مي شود .

اگر مقدارb0 برابر با يك باشد، متغير b1 با مقدار06  هگزادسيمال مقدار دهي مي شود الي آخر.

دستورlookup (در عبارت ارائه  شده )مي تواند براي نمايش بر روي سون سگمنتها كارآيي داشته باشد . به طوريكه مقادير ثابت جدول شامل اطلاعات مورد نياز جهت نمايش اعداد 0و1و2 وغيره بر روي سون سگمنتها مي توانند باشند.

ADCIN

Adcin channel,var

اين دستور جهت گرفتن يك ورودي آنالوگ در يكي از بيتهاي پورت A و انجام عمليات مبدل آنالوگ به ديجيتال(A/D) مي باشد و نتيجه حاصل در متغير var  ذخيره مي گردد.

قبل از استفاده از اين دستور، مي بايست بيتهايي از پورت A كه مي خواهند به عنوان مبدل آنالوگ به ديجيتال عمل نمايند توسط دستور trisa به عنوان ورودي تعريف شوند.

مبدلهاي آنالوگ به ديجيتال مي توانند با دقتهاي مختلفي انجام پذيرند. در ميكرو كنترلر هاي PIC،اين مبدلها مي توانند به صورتهاي 8 بيتي،10 بيتي و 12 بيتي انجام پذيرند.

جهت انجام هر يك از اين حالتها، مي بايست به كمك دستورdefine،نوع آنرا مشخص نمود. به عنوان مثال اگر بخواهيم مبدل آنالوگ به ديجيتال به صورت 8 بيتي انجام شود ،بايد از دستور زير استفاده نمود.

Define adc_bits 8

زمان نمونه برداري بر حسب ميكرو ثانيه نيز مي تواند براي انجام اين مبدلها معين گردد.

Define adc_sampleus  50

كلاك مبدلهاي آنالوگ به ديجيتال نيز مي تواند توسط دستور define معين گردد.

Define adc_clock 3

توجه داشته باشيد در مبدلهاي آنالوگ به ديجيتال 8 بيتي، مي توان از متغير بايت و يا كلمه استفاده نمود ولي در مبدلهاي آنالوگ به ديجيتال 10 و 12 بيتي مي بايست از متغير كلمه استفاده نمود.

نكته ديگر آنكه جهت استفاده از دستور adcin بايد وروديchannel توسط رجيستر ADCON1،به عنوان يك مبدل آنالوگ به ديجيتال تعريف شده باشد.

توضيحات مربوط به اين رجيستر ،در بخش (مبدلهاي آنالوگ به ديجيتال داخلي)درج شده است.

برنامه ذيل يك كاربرد دستورadcin را نشان مي دهد.

Define adc_bits 8

Define adc_clock 3

Define adc_sampleus 50

B1 var byte

Trisa=%11111

Adcon1=0

Main:

Adcin 0,b1

Goto main

End

LCDOUT 

اين دستور براي LCD هاي معمولي كه داراي حافظه مي باشند و اغلب 14 يا 16 پين دارند استفاده مي شود . تعداد خط هاي LCD مهم نيست . مي تواند 1 خط يا دو خط يا سه خط يا چهار خط باشد.

اين دستور به دو صورت استفاده مي شود :

-command يا فرمان: كه توسط عبارت fe$ شناسانده مي شود . 

-DATAيا اطلاعات 

بعضي از LCDها از جمله LCDهاي 16*1 در هر سطر داراي حافظة پيوسته نمي باشند و بين 8 كاراكتر اول و دوم آن break وجود دارد. بنابراين پس از فرمان    1، fe$   Lcdout   مي توان در 8   كاراكتر اول نوشت و پس از فرمان     C0$، fe$   Lcdout     مي توان در  8  كاراكتر دوم نوشت . در اغلب    LCDهاي     16*2  پس از فرمان        1، fe$   Lcdout     مي توان در   16 كاراكتر خط اول نوشت و پس از فرمان   C0$، fe$   Lcdout        مي توان در   16 كاراكتر خط دوم نوشت .

در ساير موارد بايد به Data sheet  مربوط به  LCD  مراجعه نمود و موقعيت حافظة مربوط به هر كاراكتر يا هر سطر را بررسي نمود. 

شکل دستور   LCDOUT

Lcdout  item{,itm… }

اين دستورitem ها بر روي نمايشگرLCD نمايش مي دهد. هم چنين مي تواند جهت معين كردن وضعيت مكان نما و يا پاك كردن صفحه نمايشگرLCD به كار گرفته شود.

قبل از درج هريك از كاراكترهاي مورد نظر بر روي صفحه نمايشگر مي بايست ،صفحه نمايشگر براي درج آنها آماده گردد.  (COMMAND) براي اين كار از جدول(3-3)استفاده مي نمائيم. 




جدول( 3-3)

عملكرد    فرمان

پاك كردن صفحه نمايش    $FE,1

بازگشت به خانه    $FE,2

خاموش كردن مكان نما    $FE,$0C

روشن كردن مكان نماي خط زير    $FE,$0E

روشن كردن مكان نماي چشمك زن    $FE,$0F

حركت مكان نما يك خانه به سمت چپ    $FE,$10

حركت مكان نما يك خانه به سمت راست    $FE,$14

حركت مكان نما به ابتداي سطر اول    $FE,$80

حركت مكان نما به ابتداي سطر دوم    $FE,$C0

حركت مكان نما به ابتداي سطر سوم    $FE,$94

حركت مكان نما به ابتداي سطر چهارم    $FE,$D4

بنابراين اگر بخواهيم صفحه نمايشگرLCD را پاك نمائيم، مي توانيم از دستور lcdout به صورت زير استفاده كنيم.                Lcdout $fe,1

به همين ترتيب مي توان از كليه فرمانهاي درج شده در جدول مذكور ،جهت آماده كردن صفحه نمايشگر LCD استفاده نمود.

****براي اجراي فرمانها ابتدا fe$ و پس از آن فرمان مربوط فرستاده مي شود . 

اگر بخواهيم عبارت خاصي را بر روي صفحه نمايشگر LCD،عينا درج نمائيم ،عبارت بايد داخل علامت("  ") نوشته شود. به عنوان مثال ،دستور ذيل مي تواند براي درج كلمهpicmicro بر روي صفحه نمايشگرLCD به كار رود.                                                              Lcdout  “picmicro”

اگر در نظر داشته باشيم كه مقدار متغيري را عينا" در صفحه نمايش درج نمائيم ،مي بايست از علامت# قبل از متغير مورد نظر استفاده نمائيم. به عنوان مثال دستور ذيل جهت درج مقدار متغير b1 بر روي صفحه نمايشگرLCD استفاده مي شود.             Lcdout #b1

حال اگر بخواهيم مقادير باينري ، دسيمال و هگزادسيمال متغير b1 را بر روي صفحه نمايشگرLCD درج نمائيم، نيازي به محاسبات اضافه نيست. عبارات bin،decوhexمي توانند جهت نمايش معادلهاي باينري ، دسيمال و هگزادسيمال مقدار متغير b1 به كار گرفته شوند.

سه دستور زير به ترتيب جهت نمايش مقدار باينري ، دسيمال و هگزادسيمال متغيرb1 بر روي صفحه نمايشگرLCD به كار گرفته مي شوند.

Lcdout  bin b1

Lcdout  dec b1

Lcdout  hex b1
















جدول دستورات PIC و عملکرد آنها

براي وارد كردن يك خط برنامه به زبان اسمبلي    @

براي خواندن از آنالوگ به ديجيتال داخلي تراشه    ADCIN

براي وارد كردن چند خط برنامه اسمبلي درون برنامه بيسيك    ASM. . . ENDASM

مشابه دستور GOTO اما پيشرفته    BRANCH

مشابه دستورBRANCH اما با قابليت بالاتر    BRANCHL

اگر به يك پين كليد متصل باشد با اين دستور مي توان آن كليد را ديبانس گيري كرد    BUTTON

براي فراخواني زير برنامه اسمبلي    CALL

مقدار همه متغيرها را صفر مي كند    CLEAR

مقدارwatch dog timer را صفر مي كند    CLEAR WDT

تعداد پالسهايي كه به يك پين اعمال مي شود مي شمارد    COUNT

حافظه EEPROM داخلي را مقدار دهي مي كند    DATA

براي فرستادن سريال به صورت اسنكرون روي پين مشخص با نرخ مشخص    DEBUG

براي دريافت سريال به صورت اسنكرون روي پين مشخص با نرخ مشخص    BEBUGIN

براي از كار انداختن DEBUG و وقفه    DISABLE

براي از كار انداختن DEBUG    DISABLE DEBUG

براي از كار انداختن وقفه    DISABLE INTERRUPT

براي توليد سيگنال DTMF سازگار با خط تلفن    DTMFOUT

حافظه EEPROM داخلي را مقدار دهي مي كند    EEPROM

براي فعال كردن DEBUG و وقفه    ENABLE

براي فعال كردن DEBUG    ENABLE DEBUG

براي فعال كردن وقفه    ENABLE INTERRUPT

براي پايان دادن به برنامه و رفتن به حالت كم مصرف    END

براي تكرار دستورات    FOR…EXT

براي ايجاد يك سيگنال با دو فركانس مختلف همزمان روي يك پين    FRQOUT

براي صدا زدن زير برنامه بيسيك    GO SUB

براي پرش به بر چسب مشخص    GO TO

يك پين مشخص را يك مي كند    HIGH

براي دريافت اطلاعات سريال از قطعاتي كه داراي سخت افزار USART مي باشند .    HSERIW

براي فرستادن اطلاعات سريال به قطعاتي كه داراي سخت افزارUSART مي باشند .    HSEROUT

براي خواندن از قطعاتي كه داراي ربط 12C مي باشند    READ  C 2^I

براي نوشتن در قطعاتي كه داراي ربط 12C مي باشند.    WRITE  C 2^I

براي اجراي يك شرط    IF…THEN

يك پين را به عنوان ورودي تعريف مي كند    INPUT

براي خواندن حافظه RAM درون LCD    LCDIN

براي نشاندن اطلاعات بر رو ي LCD    LCD OUT

براي نسبت دادن يك عبارت به متغير    LET

براي جستجوي يك مقدار از درون يك جدول كه داراي مقادير ثابت مي باشد    LOOK DOWN

براي جستجوي يك مقدار از درون يك جدول كه داراي مقادير ثابت يا متغير مي باشد    LOOK DOWN2

براي جستجوي يك مقدار از درون يك جدول كه داراي مقادير ثابت مي باشد و استخراج آن مقدار براي جستجوي يك مقدار از درون يك جدول    LOOK UP

كه داراي مقادير ثابت يا متغير مي باشد و استخراج آن مقدار يك پين  مشخص را يك مي كند    LOOK UP2

یک پین مشخص را صفر می کند    LOW

براي يك مدت كوتاه ميكرو را به حالت  كم مصرف مي برد    NAP

براي نشان دادن عمليات DEBUGGING همزمان با كاركردن ميكرو    ON DEBUG

براي فعال كردن عمليات وقفه در بيسيك    ON INTERRUPT

يك پين را به عنوان خروجي تعريف مي كند    OUT PUT

براي ايجاد تاخير(از يك ميلي ثانيه تا يك دقيقه)    PAUSE

براي ايجاد تاخير(از 1 ميكرو ثانيه تا 65 ميلي ثانيه)    PAUSEUS

برايSCALE بندي كردن يك پتانسيومتر(مشابه‌آنالوگ به ديجيتال 8 بيتي)    POT

عرض پالسها را روي يك پين اندازه گيري مي كند    PULSIN

براي توليد پالس روي يك پين با تعيين فركانس پالس    PULSEOUT

براي ارسال  پالس PWM روي  يك پين با قابليت تنظيم (مشابه ديجيتال به آنالوگ 8 بيتي)    PWM

براي توليد يك عدد تصادفي    RANDOM

براي انداز ه گيري عرض پالس روي ين    RCTIME

براي خواندن حافظه EEPROM داخلي ميكرو    READ

براي خواندن از حافظه CODE داخلي    READCODE

براي پايان دادن به زير برنامه وقفي    RESUME

براي بازگشت از زير برنامه اي كه توسط GOSUB صدا زده شده است    RETURN

براي تغيير وضعيت پورت از خروجي به ورودي يا برعكس    REVERSE

براي دريافت ارسال سريال    SERIN

براي فرستادن اطلاعات سريال با قابليت تنظيم هاي پيشرفته    SERIN2

براي فرستادن اطلاعات سريال    SEROUT

براي فرستادن اطلاعات سريال با قابليت تنظيم هاي پيشرفته    SEROUT2

براي دريافت اطلاعات سريال به صورت سنكرون    SHIFT IN

براي فرستادن اطلاعات سريال به صورت سنكرون    SHIFT OUT

براي يك مدت مشخص ميكرو را به حالت كم مصرف مي برد    SLEEP

براي توليد تن صدا روي يك پين    SOUND

براي متوقف كردن اجراي برنامه    STOP

براي جابجا كردن محتواي دو متغير    SWAP

وضعيت يك پين خروجي را از صفر به يك  يا برعكس تغير مي دهد    TOGGLE

براي اجراي دستورات در صورت برقرار بودن شرط    WHILE…WEND

براي نوشتن در حافظه EEPROM داخلي    WRITE

براي نوشتن در حافظه CODE داخلي    WRITE CODE

براي دريافت اطلاعات از قطعاتX-10    XIN

براي ارسال اطلاعات كنترلي به ماژولهايX-10    XOUT






فصل 4

مدارات جانبی

(Interface Circuit)



اتصال سخت افزاري LCD به ميكرو:

 

شکل (1-4)

اگر از هيچگونه Define ابتداي برنامه استفاده نكنيم، بايد اتصال LCD به ميكرو مطابق با پيش فرض انجام شود كه به صورت شکل (2-4) است:

 

شکل(2-4)

پيش فرض شامل موارد زير است:

Bus چهار بيتي است . bus به چهار بيت كم ارزش پورت (RA3 تا RA0) A متصل شده است . پايهRS از LCD به RA4متصل شده است . پايه enable ازLCD به RB3متصل شده است.

براي اتصال LCD به ميكرو مي توان bus را به صورت 8 بيتي (8بيت براي ارسال )يا 4 بيتي(چهار بيت براي ارسال)متصل كرد اگر busبه صورت 8  بيتي استفاده كنيم همه8بيت بايد به يك پورت از ميكرو متصل شوند و اگر ازbus به صورت4  بيتي استفاده شود بايد به چهار بيت با ارزش از يك پورت يا چهار بيت كم ارزش از يك پورت PIC متصل شود .

توجه: اگر bus چهار بيتي استفاده شود همواره به DB4تاDB7 (پايه11تا14) از LCD متصل شود . 

پين هاي enableوregister select از LCD را مي توان به هر پين دلخواه از ميكرومتصل نمود و چون اغلب روي LCD عمل نوشتن انجام مي شود پس پايه R/W از LCD را به زمين متصل مي كنيم . 

توجه: دستورات با حروف بزرگ نوشته شود.


         8  يا DEFINE LCD-BITS     4

مشخص مي كند كه bus به كدام پورت از ميكرومتصل مي شود.

پورت DE FINE LCD-DREG     

Bus   به 4 بيت كم ارزشتر از پورت ميكرو متصل است 

              4يا0 DEFINE LCD-DBIT

    Bus به4 بيت با ارزشتر از پورت ميكرو متصل است

پورتRSREG  DEFINE LCD-

شماره پينDEFINE LCD-RSBIT

مشخص مي كند كه پين RS از LCD به كدام پين از كدام پورت ميكرو متصل است

پورت DEFINE LCD-EREG

شماره پين DEFINE LCD-EBIT    

مشخص مي كند پين ErableازLCD به كدام پين از كدام پورت ميكرومتصل است

تعداد سطرها DEFINE LCD-LINS

مشخص مي كند كه LCD چند خط است             

زمان  DEFINE LCD-COMMANDUS      

مدت زمان تاخير كه پس از اجراي هر فرمان لازم است    

زمان DEFINE LCD-DATA US                                       

مدت زمان تاخير كه پس از هر بار ارسال اطلاعات روي نمايشگر لازم است                            

مثال:

‘SET LCD Data port

DEFINE LCD_ DREG PORTB

‘set starting Data bit(0 or 4)

DEFINE LCD_DBIT4

‘Set LCD Register select port

DEFINE LCD_RSREG PORTB

‘Set LCD register select bit

DEFINE LCD_RSBIT 1

‘Set  LCD Enable _ port

DEFINE LCD_EREG PORTB

‘Set LCD Enable bit

DEFINE LCD_EBIT 0

Set LCD bus size (4 or 8 bits)

DEFINE LCD_BITS 4

‘Set number of lines on LCD

DEFINE LCD_LINES 2

‘Set command delay time in us

DEFINE LCD_COMMANDUS 2000

‘Set data delay time in us

DEFINE LCD_DATAUS 50

LCDسريال:

PIC قابليت ارتباط با گروه ديگري از LCDها موسوم به LCD سريال را دارد.

درLCD سريال فقط يك پين براي ارسال فرمان يا ديتا به صورت سريال به كار مي رود .

خود LCDاز طريق يك سوئيچ كه در پشت آن قرار دارد مي تواند تنظيم شود كه با Baudrate=2400ياBaudrate=9600 با ميكرو ارتباط  برقرار كند.

فرمت سريال كه قابل تشخيص توسط LCD باشد به صورت:

     

براي ارسال فرمانها يا اطلاعات از دستور سريال Serout استفاده مي شود.

مطابق روشي كه در LCD هاي عادي استفاده مي شود ،ابتدا بايد فرمان را به LCD بفرستيم و سپس اطلاعات .

LCD سريال داراي 13 فرمان مي باشد كه هر فرمان داراي كد مخصوصي مي باشد و به شرح زير مي باشد:

كد    توضيح

1    صفحه LCD را پاك مي كند 

2    مكان نما  به خط اول از ستون اول انتقال مي دهد 

8    يك خانه به  راست پرش مي كند بدون اينكه آن خانه را پاك كند 

12    مكان نما را غير فعال مي كند 

13    مكان نما چشمك مي زند 

14    زير خط مكان نما را روشن مي كند 

16    يك خانه به چپ

20    يك خانه به راست

24    (Scroll left)همه كاراكترهاي صفحه نمايش را يك خانه به چپ انتقال مي دهد 

28    (scroll right)همه كاراكترهاي صفحه نمايش  را يك خانه به راست انتقال مي دهد .

جدول(1-4)

ارسال يك خط فرمان به صورت زير مي باشد :

(كد فرمان و254)و Serout  pin ,N2400

Pin پايه دلخواه از ميكرو است كه به ورودي سريال ازLCD متصل مي شود .

Baod rate را مي توان N2400  يا N9600 قرار دارد .

استفاده از عدد دسيمال 254 به صورت پيش فرض اجباري است و جهت شناسايي كد فرمان مي باشد .

صفحه LCD را پاك مي كند.Serout portB.3,N2400,(254,1)                                

مكان نما را يك كاراكتر به راست مي برد . Serout portB.3,N2400,(254,20)                 

توجه: هر خانه از LCDداراي شماره خاصي مي باشد كه به صورت زير است:

 

شکل(3-4)

اگر يك فرمان به LCDصادر شود و به جاي كد فرمان، شماره خانه نوشته شود ،مكان نما به آن خانه پرش مي كند .

Serout portB.5,N2400,(254,192)                 


با اجراي فرمان مقابل مكان نما به ستون اول از سطر دوم  پرش مي كند .

توجه: پس از ارسال هر خط فرمان به LCD بايد حداقل 2ms تاخير ايجاد كنيم در غير اينصورت اطلاعات over writeمي شود.

توجه 2: هر خط از    LCDمي تواند 40 كاراكتر در خود ذخيره كند اما فقط 16 كاراكتر اول نمايش داده مي شود . با استفاده از فرمانهاي انتقال (24,28) مي توان كاراكترهايي را كه قابل ديدن نيست به صفحه نمايش انتقال داد.

 

شکل(4-4)-اتصال LCD سریال به PIC

مثال:

     Pause 1000

صفحه نمايش را پاك مي كند                                                         Serout portB.5,N2400,(254,1)      تاخير براي اجراي فرمان                                                                                                                 Pause 2 

      نمايش اطلاعات                                                Serout portB.5,N2400,(“hassan Moravej”)  

    انتقال مكان نما به خط دوم                                                        Serout portB.5,N2400,(254,192) 

    تاخير براي ايجاد فرمان                                                                                                                     Pause 2      

 نمايش اطلاعات                                             Serout portB.5,N2400,(“out of program”) 

نمونه ای از اتصال صفحه کیلید به PIC  با بکار گیری حداقل پورت به کمک دستور POT

بعضي از ميكرو كنترلرهاي كوچك 8 PIN حداكثر داراي 6 پين ورودي يا خروجي هستند . بنابراين تعداد پايه هاي كافي براي اتصال كي برد ندارند . با استفاده از دستور pot مي توان سخت افزار را طوري طراحي كرد كه كل صفحه كليد به  يك پايه از ميكرو متصل گردد.

 

شکل(5-4)- اتصال صفحه کلید به میکرو به کمک دستور POT 

دستور،POT portB.0,255,X باعث مي شود با فشردن هر كليد عدد دسيمال متناظر با مجموع مقاومتهايي كه در سطر و ستون مربوط به آن كليد وجود دارد ، در متغير قرار گيرد.

ابتدا با يد برنامه تست جهت به دست آوردن مقدار متناظر را با فشر دن هر كليد بنويسيم :

X     Var byte

Main:pot  portB.0,255,x

                 Lcdout $fe,1

                 Lcdout#x

Goto  main

براي جلوگيري از هرگونه ،نويز بازه اي از عدد به دست آمده را به عنوان كد آن كليد در نظر مي گيريم  فرض كنيم با فشردن دكمه 4 عدد 50 نمايش داده مي شود ،در برنامه اصلي اينطور مي نويسيم:

If   45<x<55 then

      Lclout $fe,1

      Lcdout”you press 4”

ENDIF

در اين مثال  چون حداكثر 16 كليد روي صفحه كليد وجود دارد ،بنابراين حداكثر 16 حالت وجود دارد . بنابراين مي توان scale=16 قرار دارد اما ممكن است مقادير اين مقاومتها  طوري انتخاب شده باشد كه دو كليد در يك قسمت از 16 قسمت ديگر قرار گيرد و همپوشاني شود . پس بهتر است هميشه از scale=15 استفاده كنيم كه هيچگونه همپوشاني رخ ندهد.


                


فصل 5

سخت افزار و

 نرم افزار پروژه

    


در اين فصل ابتدا الگوريتم كلي سخت افزار پروژه و سپس حالت هاي مختلف آن را مطرح و نقد و بررسي مي كنيم در انتها نيز الگوريتم نرم افزار پروژه را شرح مي دهم.

در يك نگاه كلي مدار پروژه از قسمت هاي زير تشكيل شده است:

 

شکل(1-5)-الگوریتم پروژه

1-گيرنده صوتی 

2-طبقه تقويت كننده

3-تریگر( تبديل موج سينوس به پالس ميكرو)

 4-پردازش و خروجی

   

                       شکل(2-5)                                                                                   شکل(3-5)

1-گيرنده صوتي مدار مي تواند يك بلندگو صفحه پلاستيكي (شكل2-5)و يا يك ميكروفن خازني(شكل3-5)و يا هر گونه گيرنده صوتي ديگر باشد.

ميكروفن خازني در بين اين گزينه ها به دليل داشتن خصوصيت نويز گيري و هم چنين قدرت گيرنده گي زياد مورد استفاده قرار گرفت.

صداي ورودي ما كه يك تن موسيقي است به ميكروفن داده شد و قدرت خروجي آن براي تعيين طبقه تقويت كننده سنجيده شد.

در اين سنجش مشخص شد كه شكل موج يك موج سينوس است و ولتاژ pic-pic آن در حدود 0.2 ميكرو ولت و كمتر است. و هم چنين فركانس بين 9kتا300 هرتز است. این سیگنال باید تا حدی تقویت شود که بتوان آنرا بوسیله میکرو یا گیت NOT  شناسایی کرد.

2- طبقه تقويت كننده

اين طبقه اگر چه در تئوري بسيار ساده و بديهي و بدور از اشكال به نظر مي رسد اما در عمل با مشكلات فراواني كه در روبروي بنده قرار داد مرا به ناچار به تغيير آن و در نهايت به تغيير نوع ورودي مجبور ساخت.

انواع مدل هاي تقويت كننده استفاده شده :

1-ترانس

2-ترانزيستور(شامل مدار ساده ترانزيستوري و مدارات آمپلي فاير)

3-OP-AMP


استفاده از ترانس :ترانس ها در دو نوع موجود مي باشند (كاهنده – افزاينده)

    شکل (4-5)     شکل(5-5)

موج ورودي را مي توان  به يك ترانس افزاينده (نمونه آزمايش شده   بود) داد و در نتيجه با يك موج4,5V در خروجي يك موج 220 و يا نزديك به آن نزديك به آن را داشت يا به طور دقيق تر تقويت در حدود 45برابر ورودي.     اما اين روش محدوديت هايي نيز در پی دارد:

1-    ترانس از 2 سيم پيچ تشكيل شده است . پس داراي مقاومت  بالايي است در نتيجه يك موج براي عبور از آن بايد جريان كافي را داشته باشد  كه موج در دست ما اين جريان را ندارد.

2-    ترانس بر طبق خاصيت سلفي عمل مي كند كه تاخير زماني زيادي دارد و سرعت مدار را  پايين مي آورد و در فركانس بالا نمي توان از آن استفاده كرد .

3-    استفاده از چند ترانس متوالي به دليل جدا بودن زمين ها باعث ايزولر شدن زمين ها مي شود .

مدارات ترانزيستور ساده(شکل6-5)  و يا مدارات آمپلي فاير و پري آمپلي فاير قدرت تقويت كنندگي ولتاژ و جريان (قدرت)بالايي دارند. اما دليل اتلاف انرژي زياد و همچنين جريان كششي بالايي كه دارند مناسب اين كار نيستند مدارات ترانزيستوري حدود 100  ميلي آمپر جريان مصرفي خيلي كمتر دارند. 

مشكل ديگري كه در استفاده از تزانزيستورها مطرح است انتخاب مقادير و همچنين براي 2 ترانزيستور كه از يك نوع ولي   متفاوت دارند. مختلف است، است.

 

شکل(6-5)



OP-AMP

ICهاي OP-AMPاز جمله741ياOP07 (شکل7-5) در تئوري قدرت تقويت كنندگي خوبي دارند و به سادگي مي توانند تا بهره چند مليون را نيز براي مصرف كننده فراهم كنند.

   شکل 7-5 -  OP-AMP LM741

در پروژه از مداري همانند مدار زير جهت تقويت كنندگي استفاده شد.

 

شکل (8-5)

سيگنال ورودي كه از ميكروفن خازني و يا بلندگو گرفته شده دامنه 0.2 ميكرو ولتي دارد. پس از عبور از طبقه اول تقويت كننده اين دامنه در حدود5 ميلي ولت مي رسد و فركانس نيز كاملا" صحيح انتقال داده شده است. اما پس از اتصال به طبقه بعدي قله موج سيگنال بريده مي شود. اين بريدگي نتيجه به اشباع رفتن تقويت كننده است كه مي تواند به دليل بهره بالا و يا عدم تطبيق مقاومت ها  باشد به خاطر تطبيق مقاومت ها بين هر دو طبقه متوالي يك طبقه بافر قرار گرفت (شکل9-5) تا علاوه بر اينكه جريان را تقويت و ثابت كند باعث شود  مقاومت خروجي طبقه قبلي با مقاومت ورودي طبقه بعدي برابر گردد. اين عمل را براي 4 طبقه متوالي تقويت كننده انجام شد و باز هم تقويت دلخواه صورت نپذيرفت و متوجه اين مطلب شدم كه بعد از طبقه اول، عمل تقويت عملا" انجام نمي شود.

 شکل (9-5)

در آزمايش تقويت كننده ها مقاومت هاي   و به موازات آن البته با نسبتي كمتر   با مقادير مختلف جايگزين شدند.

   

  

 

 

 

 

 

 


با تغيير مقاومت ها و در نتيجه بهره تقويت كننده مشاهده شد خروجي تقويت كننده با بهره هاي مختلف تغيير اندكي مي كند و گويي مقدار تقويت هيچگونه ارتباطي به بهره و ندارد. با ديدن اين عكس العمل ورودي مدار  را بدون مقاومت  به يك بافر دادم(شکل 10-5) و نتيجه حاصل همان تقويت كننده ها بود با توجه به تغير سيگنال خروجي با وجود تقويت كننده و يا بافر استفاده از تقويت كننده  OP-AMP (به  اشباع رفتن و پريدن قله) مي تواند از جريان كم سيگنال ورودي و يا فركانس آن باشد.

     شکل (10-5)


استفاده از گیت NOT

در حين آزمايش‌ها مختلفي كه در طور اين 6 ماه انجام دادم. به قابليت گیت NOT براي اينكه يك سيگنال در حد منطق(0-50) داشته باشيم با فركانس ورودي يك ولتاژ 5 و0  ولت را سوئيچ كنيم. 

كه بسته به فركانس كار و اندازه ولتاژ ورودي مي‌توان از رله و يا ترانزيستور (گيست not)  استفاده كرد(گيت not نبايد از IC گرفته شود بلكه بصورت مداري بسته شود) 

رله در فركانس بالا كاربرد زيادي ندارد زيرا باعث ايزوله شده و تأخير در مداري شود اما ترانزيستور تا فركانس‌هاي 20M  را نيز می تواند پوشش دهد وبرای فرکانس بالاتر باید از ترانزیستور های خاص  كه سرعت بالاتري دارند استفاده كرد. 

براي استفاده از ترانزيستور كافيست موج ورودي(ولتاژ BE) در حد كمي بيشتر از 06-0.7 ولت باشد تا ترانزيستور با ياس مستقيم و معكوس شود و عمل NOT انجام شود و با همان فركانس Vi ولتاژ  5 ولت سوئيچ شود.      شكل(11-5 ) مدار يك گيت not را شال مي‌دهد. 

 

شکل (11-5)

در پايان بررسي انواع مدل‌هاي تقويت كننده‌ها و اينكه درعمل بر خلاف تئوري هيچ يك از آنها نتوانست مورد استفاده قرار گيرد ورودي مدار را با تغيير دوام و بجاي استفاده از ورودي طبيعي بصورت مستقيم (سيمي) استفاده كردم. 

براي اين كار از مدار يك ارگ الكترونيكي استفاده مي‌كنيم كه قلب اصلي آن يك IC S55 است و با تغيير ورودي و گذر آن از مقاومت‌هاي مختلف، تن‌هاي مختلف را توليد مي‌كند، دامنه اين سيگنال خروجي با توجه به پايه‌هاي IC   ,  V-    ,V+ مي‌تواند تنظيم شود با اين كار شكل جريان، ولتاژ سيگنال مدار برطرف مي‌شود در ضمن شكل موج خروجي مربعي مي‌باشد و ديگر به schmit  trigger براي مربعي كردن آن نيازي نيست. 

حال با در دست داشتن يك مربع با ولتاژ منطقي مي‌‌توانيم پردازشش و مراحل مربوط به آن را انجام دهيم.

3-تریگر

این مرحله از مدار بموقع کار با سیگنال سینوسی کاربرد دارد تا موج سینوسی مارا به پالس مربعی تبدیل کند تا بتوان بعنوان ورودی به میکروکنترولر داده شود (بدین منظور IC   های متعددی در بازار موجود است)

با تغییر ورودی صوتی به سیگنال ارگ الکترونیکی که شکل موج مربعی دارد این مرحله از مدار نیز حذف می شود 

4-پردازش و خروجي

در قسمت پردازش و خروجي عملكرد نرم ‌افزاري مدار براي خواندن سيگنال ورودي و ذخيره و مقايسه آن شروع مي‌شود. 

در فصل 2 خوانديم كه  دستور وقوع وقفه مي‌توانند كمك زيادي به انجام يك برنامه كند.

 با دادن سيگنال صوتي به pin  RB0 كه بعنوان وقوع وقفه است. مي‌توانيم به صدا در آمدن يك صوت را بدين صورت به ميكرو معرفي كنيم. 

الگوريتم برنامه بصورت زير مي‌باشند: 

1ـ شروع 

2‌ـ بررسي بيت وقفه در صورت وقوع مرحله 3

3‌ـ شمارش تعداد پالس در مدت زمان  0.5 s 

4 ـ مقايسه با حافظه در صورت عدم وجود برد به مرحله 7 

5ـ نمايش شماره خانه حافظه كه تطبيق داده شده 

6‌ـ برو به مرحله 2

7‌ـ پذيرش يك عدد از ورودي صفحه كليد به عنوان شماره خانه حافظه 

8-ذخيره فركانس خوانده شده در آ‌ن خانه حافظه 

9‌ـ برو به  مرحله 2

10‌ـ پايان.







ضمیمه


I BUILT MY SITE FOR FREE USING