اطلاعیه

Collapse
No announcement yet.

آموزش میکروکنترولر PIC با MPLAB C

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    آموزش میکروکنترولر PIC با MPLAB C

    جلسه اول:آشنایی با کامپایلر و ایجاد پروژه
    سلام
    ان شالله از امروز به بعد می خوایم با هم میکرو PIC رو توسط کامپایلر MPLAB و زبان برنامه نویسی C شروع کنیم. این شرکت (میکروچیپ) در کمتر از چندین سال از تمامی رقیب ها پیشی گرفت و الان اولین و بهترین میکروکنترولر دنیا محسوب می شه (در میکروکنترولر های 8 بیتی و 16 بیتی).من هم چون قدرت خانواده 18f رو نسبت به بقیه مناسب دیدم و رفرنسهای مناسبی هم پیدا کردم فوکس خودم رو روی این نسل بیشتر می کنم و امیدوارم بتونیم بیشتر از دانش هم استفاده کنیم.
    مراحل کار:
    1-خرید یک میکروکنترولر نسل 18f ، مثلا من با 18f452 کار می کنم
    2-دانلود ادیتور MPLABX ، لطفا خساست برای حجم تقریبی 350 مگابایتش نکنین :eek:و بخواین از زیر دانلود کردنش شونه خالی کنین این ادیتور نسبت به قبلی ها کلی پیشرفت و امکانات داره و تا دانلودش نکنین متوجه مزایاش نمی شن
    از این آدرس می تونین دانلود کنین
    http://ww1.microchip.com/downloads/m...-installer.exe

    حالا نوبت کامپایلر داده هاتون می رسه ، چون از نسل 18f استفاده می کنین باید mplabc18 رو دانلود کنین که لینک دانلود در زیر قرار گرفته هست
    http://www.microchip.com/stellent/id...cName=en010014

    MPLAB® C Compiler for PIC18 MCUs (C18)

    MPLAB® X Integrated Development Environment (IDE)



    با اجازه استادbaby_1، دارم ویرایش میکنم.(شاهرخ مستقیمی)
    لینک دانلود MPLABX IDE 2.05 در هفت بخش 49مگابایتی و یک قسمت 18مگابایت:

    Part1
    Part2
    Part3
    Part4
    Part5
    Part6
    Part7
    Part8



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

    اجرا شدن کلی برنامه

    برای ایجاد یک پروژه جدید اقدام می کنیم
    مسیر زیر رو دنبال کنین
    File->New Project

    در صفحه باز شده مشخصات رو به همین نحو نگه می داریم و بر روی دکمه Next کلیک می کنیم

    در این قسمت هم در بخش Family گزینه Advanced 8-bit MCUs (PIC18) رو انتخاب می کنیم و از قسمت Device اسم تراشمون رو انتخاب می کنیم که من PIC18f452 رو انتخاب کردم بازم دکمه Next

    در این قسمت هم می تونین پروگرمر و شبیه سازتون رو مشخص کنین که چون پروگرمر من PICkit هست اون رو انتخاب کردم البته این قسمت هم اگر پروگرمری یا شبیه سازی ندارین مهم نیست شما هم همون PICkit یا ICD3 رو انتخاب کنین و NEXT

    در این قسمت هم باید نوع کامپایلرتون رو مشخص کنین که چون با C18 کار می کنیم پس همین رو انتخاب کرده و سپس NEXT

    در پنجره آخری هم باید اسم پروژه و مکان ذخیره سازی فایلتون رو مشخص کنین و تیک گزینه Set as main project هم فعال کنین تا اگر چندین پروژه داشته باشین این پروژه رو براتون کامپایلر کامپایل کنه.
    پروژه خودتون رو در قسمت سمت چپ ادیتور MPLAB انتخاب و بر روی گزینه Source Files کلیک کرده و سپس مانند عکس گزینه C Source file رو انتخاب کنین.

    در پنجره باز شده اسمی دلخواه برای فایلتون تایپ کرده و سپس دکمه Finish رو کلیک کنین تا یک محیط به اسم انتخابی برای تایپ کردن کدهاتون پدید بیاد.
    هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

    #2
    پاسخ : آموزش میکروکنترولر PIC با MPLAB C

    جلسه دوم:نوشتن فرم کلی برنامه
    سلام
    تا اینجا نحوه ایجاد پروژه رو یاد گرفتیم حالا نوبت نوشتن یه برنامه ساده و همچنین آشنایی با برخی از قسمت های کامپایلر هست.
    در ابتدای کار باید مشخص کنیم که میکرومون چی هست و تمایل داریم از کدام کتابخانه ها و توابعشون استفاده کنیم.در روال کاریمون هست که یه چشمک زن رو در ابتدا طراحی کنیم.پس شروع می کنیم به کار
    ابتدا نوع تراشه رو مشخص می کنیم
    #include <p18f452.h>
    اگر فایل p18f452.h رو در پروژه ضمیمه کرده باشین می نویسیم
    #include “p18f452.h”
    اما چون روش کار دومی رو نگفتم پس از همون تعریف ابتدایی استفاده می کنیم.البته در نظر هم داشته باشین بدون اضافه کردن این خط کامپایلر خطایی به ما نمی ده چون در ابتدا در ساخت پروژه تراشه رو تعیین کردیم و کامپایلر الان گاه هست که از چه میکرویی می خواین استفاده کنین .پس دلیل ما از اضافه کردن این خط چی هست؟
    اگر برنامتون رو بخواین خطا یابی کنین ، به شخصی بدین یا در اینترنت گسترشش بدین بدون اینکه نوع تراشه و مشخصات رو بیان کنین شخص برنامه نویس با دیدن این خط می تونه به راحتی تشخیص موارد مذکور رو بده و همچنین اگر با ورژنهای پایین تر از MPLAB کار می کنین و کامپایلر C18 رو نصب کردین باعث می شه با نسخه پایین هم برنامتون بدون مشکلی با اضافه کردن این سورس فایل کار کنه
    برای تاخیر در چشمک زدن ما باید یه تاخیر در برناممون اضافه کنیم که بهترین کار استفاده از کتابخانه آماده delays.h هست پس اون هم اضافه می کنیم(استفاده از توابع این کتابخانه در جلسات آینده بررسی می شه)
    پس تا اینجا داریم

    #include <p18f452.h>
    #include <delays.h>
    حالا باید مشخص کنیم که فرکانس تراشه در چه حدی هست ؟ در اینجا چون این تراشه نوسان ساز داخلی نداره ما از یه کرستال خارجی که متصل به پایه 13 و 14 یا OSC1 و OSC2 هست استفاده می کنیم و مقدارش رو 4 مگاهرتز انتخاب می کنیم.
    روش کار به این صورت هست
    اگر فرکانس کاری بین 32 کیلو هرتز تا 200 کیلو هرتز هست مد LP
    اگر فرکانس کاری 200 کیلو هرتز هست مد LP یا XT
    اگر فرکانس کاری بین 200 کیلو هرتز تا 4مگاهرتز هست مد XT
    اگر فرکانس کاری 4 مگاهرتز هست مد XT یا HS
    و اگر فرکانس بیشتر از 4 مگاهرتز باشه باید دیگه مد HS رو انتخاب کنین.
    پس در این حالت ما می تونیم یا XT یا HS رو انتخاب کنیم که من HS رو انتخاب می کنم که اگر بعدا فرکانس رو بیشتر کردم نیاز نباشه مجددا این قسمت روتنظیم کنم.
    پس معلوم شد در کدوم مد نوسان ساز هستیم پس می نویسیم

    #include <p18f452.h>
    #include <delays.h>
    #pragma config OSC=HS
    این سه خط هم اضافه کنین
    #pragma config PWRT=ON
    این دستور باعث فعال سازی تایمر power-up می شه که یه تاخیر در ابتدای اعمال منبع تغذیه ایجاد می کنه تا CPU قبل از تثبت ولتاژ در حالت ریست باقی بمونه
    #pragma config BOR=OFF
    میکروها با توجه به اینکه برای اطمینان از عملکرد باید در سطح خاصی از ولتاژ قرار بگیرن این روشن و فعال کردن این بیت می تونین سطح ولتاژ رو تغییر بدین مثلا در این حالت که این بیت خاموش هست میکرو در صورتی که ولتاژش کمتر از 4.5 نیموده باشه کار می کنه و در صورت پایین امدن ریست می مونه تا ولتاژ از این مقدار بیشتر بشه(با روشن و تنظیم این بیت می شه سطح ولتاژ رو تا 1.8 ولت مقدار دهی کرد)
    #pragma config WDT=OFF
    میکرو هم مثل بقیه تراشه های برنامه پذیر در صورتی که در یک حلقه گیر کنه یا به علت نوسانات ولتاژی فرکانسی و .... هنگ کنه می تونه در مواقعی خطر آفرین باشه و دقت دستگاه و عملکردش رو زیر سوال ببره.برای این منظور در داخل تراشه یک تایمر به نام "سگ نگهبان" در نظر گرفتن که باید بعد از گذشت زمانی هر بار مقدار این تایمر رو صفر یا با اصطلاح ریست کنین و در صورت عدم چنین کاری میکرو در نظر می گیره که تراشه هنگ کرده و باعث می شه میکرو رو ریست کنه.این رو حالا فعلا خاموش می کنیم تا دردسر صفر کردن و تایمر رو در مراحل ابتدایی برنامه نویسی نداشته باشیم
    همونطوری هم که می دونیم در زبان برنامه نویسی C مهمترین تابع main هست که کامپایلر همیشه میکرو رو به این تابع برای اجرا فرامین اصلی هدایت می کنه پس تابع هم می نویسیم

    #include <p18f452.h>
    #include <delays.h>
    #pragma config OSC=HS
    #pragma config PWRT=ON
    #pragma config BOR=OFF
    #pragma config WDT=OFF

    Void main(void)
    {
    //Code
    }
    پس شکل کلی برنامه تا اینجا به این صورت شده است که باید در قسمت //code کدهای برناممون رو جایگزین کنیم



    هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

    دیدگاه


      #3
      پاسخ : آموزش میکروکنترولر PIC با MPLAB C

      جلسه سوم:پیکربندی سخت افزار و روش پروگرم کردن تراشه
      وضعیت پایه های PIC18f452 به صورت زیر است

      برای راه اندازی اولیه تراشه باید چند تا نیاز تراشه رو برآورده کنین
      1-ولتاژ تغذیه آی سی
      2-نوسان ساز
      3-قرار دادن پایه MCLR در وضعیت منطقی مناسب
      برای شروع پس ابتدا پایه های 11 و 32 رو به مثبت منبع تغذیه مدار وصل می کنیم(5 ولت dc)
      پایه های 12 و 31 رو به GND مدار متصل می کنیم که اختلاف پتانسیل بین پایه های 11و12 و همچنین 32 و31 برابر 5 ولت بشه
      بر خلاف بعضی از تراشه های میکروکنترولر که با آزاد گذاشتن پایه Reset و با توجه به ساختار داخلی تراشه می تونه روشن بشه و فعالیت خودش رو آغار کنه(نمونه بارز AVR) حتما باید در میکروهای شرکت میکروچیپ پایه 1 میکرو یا همون MCLR رو توسط یه مقاومت به سطح 5 ولت PULLUP کنین و برای ریست کردن تراشه می بایست این پایه رو به زمین مدار متصل کرد.
      برای نوسان ساز هم از کریستال استفاده می کنیم که برای پایداری بیشتر نوسان از دو خازن که برای Bypass کردن استفاده می شه به دو پایه کریستال متصل می کنیم.این خازن ها هر چی بیشتر باشن پایداری کریستالتون بیشتر می شه اما به چه قیمت ؟ افزایش زمان بالا آمدن میکرو. به شخصه چک کردم با افزایش مقدار خازن تا حد نانو فاراد یا میکروفاراد تراشه یه جور اینقدر زمانش طولانی می شه که اصلا دیگه بالا نمی یاد.خازن ها مقدارشون برای بهترین وضعیت باید در بازه 15 تا 33 پیکوفاراد قرار داشته باشه.
      پس تا اینجا پیکربندی مدار به صورت زیر در می یاد

      یادتون باشه با برنامه proteus نمی تونم پایه های تغذیه مدار رو نشون بدم که به خوبی خودتون ببخشید

      حالا نوبت پروگرم کردن تراشه هست
      تراشه رو می شه به چندین روش پروگرم کردن
      1-از طریق پروتکل JTAG
      2-از طریق پروتکل خود میکروچیپ به صورت سریال
      3-از طریق بوت لودر که بعضی از تراشه های دارای USB , Ethernet , … می تونن برنامه ریزی بشن
      ما در اینجا چون وضعیت مالی دانشجویی کاربران رو نگاه می کنیم گزینه دوم مقرون به صرفه تر هست.پس تا اینجا همه کارهای که میکروچیپی بوده بیان از پروگرمر پیشنهادی خود میکروچیپ هم استفاده کنین یعنی PICKIT که یه نمونه در سایت توسط مدیر انجمن Sa3ID قرار داده شده
      http://www.eca.ir/forum2/index.php?topic=38944.0
      یا اینکه بیام برای سایت تبلیغ جمع کنم و بگم پروگرمر خود سایت ECA رو که آماده هست رو تهیه کنین(لینک این تبلیغ رو فعلا قرار نمی دم تا آقای بلورچیان بیان بگن هر چی از این تبلیغ من به فروش می رسه نصف نصف :rolleyes: )
      نمای برنامه پروگرمر به این صورت هست

      اگر تراشه روی پروگرمر وجود داشته باشه با اجرا کردن برنامه خودکار تراشه تشخیص داده می شه و جزئیات براتون نمایش داده می شه


      روش کار:
      برای پاک کردن محتویات تراشه بعد از شناسایی توسط برنامه می تونین دکمه Erase رو کلیک کنین
      برای پروگرم کردن تراشه بعد از شناسایی توسط برنامه و انتخاب فایل HEX توسط منوی
      File->import
      می تونین دکمه write رو کلیک کنین
      برای تشخیص اینکه برنامه تراشه دقیقا چیزی هست که روی کامپیوتر قرار داشته(همون فایل HEX) دکمه Verify رو کلیک کنین
      برای پروگرم کردن تراشه به صورت ICSP باید پایه PGD و PGC و MCLR و زمین مدار و میکرو رو به پایانه های پروگرمر به این نام متصل کنین و با اعمال ولتاژ راه اندازی میکرو نسبت به پروگرم کردن تراشه اقدام کنین.
      Baby.X\dist\default\production

      هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

      دیدگاه


        #4
        پاسخ : آموزش میکروکنترولر PIC با MPLAB C

        جلسه چهارم:اولین پروژه ساخت چشمک زن و آشنایی با کتابخانه Delays
        در این جلسه قصد داریم آموزش ساخت یک چشمک زن رو توسط میکرو دنبال کنیم.همانطوری که می دونیم تراشه سرعتی بیش از 1 مگاهرتز داره(فرکانس ورودی تقسیم بر 4 فرکانس تراشه رو مشخص می کنه) یعنی می تونین یه LED متصل به میکرو رو با فرکانس 500 کیلوهرتز در سطح صفر و یک قرار بدین(در عمل با اسکوپ که چک کردم با توجه به سربار فایل هگز خروجی و تاخیر حلقه ها نهایت چشمک زدن به 250 کیلوهرتز می رسه) اما چون این فرکانس برای چشم ما قابل رویت نیست باید به نحوی یه تاخیر در برنامه ایجاد کنیم که دقیقا کاری هست که دستورات کتابخانه delays.h انجام می دن
        توابع این کتابخانه:
        Delay1TCY
        Delay10TCYx
        Delay100TCYx
        Delay1KTCYx
        Delay10KTCYx
        آرگومان ورودی این توابع به جز Delay1TCY از نوع unsigned char unit هست(تابع مذکور اصلا ارگومان ورودی نداره) یعنی نهایت عددی که می تونین بفرستین به این تابع 255 هست خوب بیان یکم محاسبه کنیم
        فرکانس ورودی میکرو 4 مگاهرتز هست و از مد HS استفاده کردیم بنابراین میکرو فرکانس ورودی رو تقسیم بر 4 می کنه و فرکانس قسمت های مختلف رو ضریبی از این فرکانس یا همین مقدار قرار می ده یعنی 1 مگاهرتز . و از جهتی که هر دستور با در نظر گرفتن مسیر داده ای بین CPU و ROM که 16 بیتی هست هر دستور در یک سیکل ماشین انجام می شه یعنی 1 تقسیم بر 1 مگاهرتز به عبارت دیگه 1 میکرو ثانیه.
        تابع Delay1TCY یه تاخیر یک سیکل ماشینی به وجود می یاره یعنی 1 میکرو ثانیه
        تابع Delay10TCY یه تاخیر ده سیکل ماشینی به وجود می یاره یعنی 10 میکرو ثانیه و با مقدار دهی آرگومان تابع می تونه آرگومان * 10 میکرو ثانیه تاخیر ایجاد کنه
        تابع Delay100TCY یه تاخیر صد سیکل ماشینی به وجود می یاره یعنی 100 میکرو ثانیه و با مقدار دهی آرگومان تابع می تونه آرگومان * 100 میکرو ثانیه تاخیر ایجاد کنه
        تابع Delay1KTCYx یه تاخیر هزار سیکل ماشینی به وجود می یاره یعنی 1000 میکرو ثانیه و با مقدار دهی آرگومان تابع می تونه آرگومان * 1000 میکرو ثانیه تاخیر ایجاد کنه
        تابع Delay10KTCYx یه تاخیر ده هزار سیکل ماشینی به وجود می یاره یعنی 10000 میکرو ثانیه و با مقدار دهی آرگومان تابع می تونه آرگومان * 10000 میکرو ثانیه تاخیر ایجاد کنه
        تابع آخر می تونه به ازای هر عدد تابع 10 میلی ثانیه تاخیر ایجاد کنه و با مقدار دهی آرگومان تابع با مقدار 10 این تاخیر رو می تونیم به 100 میلی ثانیه برسونیم
        Delay10KTCYx(10);
        تا اینجا با تاخیرها و نحوه استفادشون رو یاد گرفتیم حالا می مونه تعریف ورودی و خروجی پورتها
        در جلسه قبل نما و اسم هر پایه رو توسط دیتاشیت فهمیدیم حالا برای اینکه به صورت ورودی و خروجی تعریفشون کنیم باید چی کار کنیم.
        هر پورت سه ریجستر داره(البته پورت ها می تونن با توجه به قابلیت هاشون ریجستر های بیشتری داشته باشن اما این سه رجیستر عمومیت داره)
        1-PORTx
        2-LATx
        3-TRISx
        که به جای X می تونین اسم پورت رو قرار بدین مثلا با توجه به اینکه پین شماره 21 مربوط به پورت D هست بنویسیم
        PORTD
        LATD
        TRISD
        در این جلسه ما با دو تا از این رجیسترها کار می کنیم و سومی رو در جلسات بعد مورد بررسی قرار می دیم
        با صفر کردن هر یک از بیت های رجیستر TRIS می تونیم اون پین رو به صورت خروجی تعریف کنیم و با یک کردن اون بیت اون پین رو به صورت ورودی معرفی کنیم
        برای انتقال داده از میکرو به بیرون و از بیرون به داخل میکرو از رجیستر PORT استفاده می کنیم.
        در زبان برنامه نویسی C میکروچیپ برای دسترسی به یک پین باید به صورت زیر عمل کنیم
        PORTXbits.bitnames
        که به عنوان مثال برای دسترسی به بین RD2 از ریجستر PORTD می نویسیم
        PORTDbits.RD2
        شکل کلی برنامه رو باز فراخوانی می کنیم و تغییرات لازم رو اعمال می کنیم

        کد:
        #include <p18f452.h>
        #include <delays.h>
        #pragma config OSC=HS
        #pragma config PWRT=ON
        #pragma config BOR=OFF
        #pragma config WDT=OFF
        Void main(void)
        {
        TRISDbits.RD2=0;
        While(1){
        PORTDbits.RD2=0;
        Delay10KTCYx(10);
        PORTDbits.RD2=1;
        Delay10KTCYx(10);
        
        }
        }
        تحلیل برنامه:
        قسمت های اولیه یا بدنه برنامه در جلسات قبلی توضیح داده شده حالا بخش های جدید
        TRISDbits.RD2=0;
        از پورت D رجیستر پین RD2 رو به صورت خروجی تعریف کردیم
        While(1){
        یک حلقه با شرط 1 ایجاد کردیم که از اول تا ابد مقدار داخل while همیشه با توجه به شرط یک بودن اجرا بشه
        PORTDbits.RD2=0;
        مقدار پین RD2 از پورت D رو صفر می کنیم یعنی خروجی میکرو از RD2 صفر می شه
        Delay10KTCYx(10);
        100 میلی ثانیه تاخیر ایجاد می کنیم
        PORTDbits.RD2=1;
        مقدار پین RD2 از پورت D رو یک می کنیم یعنی خروجی میکرو از RD2 یک می شه
        Delay10KTCYx(10);
        100 میلی ثانیه تاخیر ایجاد می کنیم

        }
        شماتیک برنامه هم به این صورت هست

        lکامپایل کردن برنامه:
        مطابق شکل زیر از گزینه
        Run->Build Main Project

        رو اجرا می کنیم و در صورت عدم هیچ گونه خطایی پیغام زیر رو در پایین پنجره کد نویسی مشاهده می کنیم

        فایل هگز رو روی تراشه بریزین و تست کنین ، اولین برنامه با موفقیت ساخته شد تبریک

        مشق شب:
        برنامه ای مطابق برنامه این جلسه بنویسین اما حالا پورت RB5 رو چشمک زن کنین(نکته داره حتما انجام بدین)

        هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

        دیدگاه


          #5
          پاسخ : آموزش میکروکنترولر PIC با MPLAB C

          سلام
          امیدوارم که استفاده کنین
          مشق شب رو روی تمامی پین ها انجام بدین و نتایج رو همین جا قرار بدین تا به کمک هم مشکلات رو بررسی و حلشون کنیم و همچنین ادامه بحث رو دنبال کنیم.لطفا همه پین ها رو چک کنین و برنامه هاتون هم قرار بدین.چون اینجوری گفتن بدون در نظر نگرفتن نکات ریز باعث دل زدگی از برنامه نویسی میکرو و این تراشه های قدرتمند PIC در حین کار می شه پس حتما با انجام این تمرین ها هم خودتون رو تست کنین هم نکات جدید تر رو یاد بگرین و ان شالله تا آخر ماه رمضان بهترین و کاملترین آموزش PIC و میکروکنترولر رو در سایت شاهد باشیم
          هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

          دیدگاه


            #6
            پاسخ : آموزش میکروکنترولر PIC با MPLAB C

            سلام
            خواهش می کنم
            حتما چنین کاری رو انجام می دم ، از بابت عکس ها نگرانی نداشته باشین روی قوی ترین سرور و همچنین بدون تاریخ انقضا ریخته شده ان.
            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

            دیدگاه


              #7
              پاسخ : آموزش میکروکنترولر PIC با MPLAB C

              جلسه پنجم:آموزش مختصر زبان C

              از جهتی که برنامه نویسی تراشه با دید بهترین نسبت به خود زبان برنامه نویسی بسیاری از حجم پروژه رو در بر می گیره در این جلسه مرور کلی بر زبان C و نحوه برنامه نویسیش خواهیم داشت

              بعضی از پرکاربرد ترین متغییرهای که در زبان C میکرو چیپ می تونید تعریف کنین در جدول بالا آورده شدن همونطوری که می دونین با توجه به میکرو کنترولر 8 بیتی بهتر هست تا حد امکان از تعریف متغییر های با تعداد بیش از 8 بیت تا حد امکان پرهیز کنین و در صورتی که واقعا نیاز دارین از آنها استفاده کنین .نحوه تعریف یک متغییر هم به صورت زیر هست
              Datatype Variablename;
              مثال
              Int baby;
              Baby=0;
              در تعریف بالا متغییر baby از نوع int تعریف شده است و نهایتا می تونه اعداد در بازه -32768 تا 32767 رو در خود جا بده که در خط بعدی همون جوری که می بینین مقدار اولیه 0 به اون تخصیص داده شده است
              نکته:حتما سعی کنید بعد از تعریف هر متغییر در اولین فرصت متغییر رو با مقدار اولیه پر کنین چون در غیر اینصورت خود کامپایلر MPLAB اعدادی رو بهش اختصاص می ده که مشکلاتی رو می تونه پدید بیاره(به شخصه اذیت شدم شما خودتون رو اذیت نکنین)
              عملگرهای بیتی:
              در درس مدارهای منطقی با عملگرهای منطقی آشنا شدیم حالا سعی می کنیم از اینها در زبان برنامه نویسی C بهره بجوییم
              عملگر نماد در زبان C

              مثال:
              کد:
              Int z;
              Z=8 & 1;
              در دستور بالا دو عدد 8 و 1 با هم and بیتی می شن و مقدار نهایی Z برابر با 0

              کد:
              Int z;
              Z=8 | 1;
              در دستور بالا دو عدد 8 و 1 با هم or بیتی می شن و مقدار نهایی Z برابر با 9


              کد:
              Unsigned char z;
              Z=254;
              Z=~z;
              در دستور بالا ابتدا مقدار Z با 254 مقدار دهی می شه و نهایتا با معکوس کردن صفرها به یک و یکها به صفر مقدار نهاییت Z برابر با 1 خواهد بود

              عملگرهای شرطی:
              == مساوی بودن
              =< بزرگتر مساوی بودن
              => کوچکتری مساوی بودن
              > بزرگتر بودن
              > کوچکتر بودن
              != نامساوی

              از این عملگرها در دستورات if ، حلقه های تکرار و شرطهای برقراری یک تابع مورد استفاده قرار می گیرن که در ادامه با معرفی هر بخش نحوه استفاده از آنها هم یاد خواهیم گرفت

              دستور if:
              با این دستور می توان اگرهایی رو در برنامه ایجاد کرد که با برقرار بودن شرط کدها در محدوده بلاک ها(بین }{ رو بلاک می گویند) رو به اجرا در آورد.
              Void main(void){
              TRISB=0xff;
              در این دستور PORTB به عنوان ورودی تعیین شده است
              While(1){
              If(PORTB==100){
              در صورتی که مقدار PORTB برابر با 100 باشه
              PORTC=0x0;
              مقدار PORTC برابر با 0 بشه
              }
              Else
              در غیر اینصورت
              {
              PORTC=0xff;
              پورت PORTC=0xff بشه
              }
              }
              }
              حالا اگر بخواین بگین شرط رو به عبارت "اگر PORTB بزرگتر از 150 شد " تغییر بدیم باید چی کار کنیم؟
              بله باید
              If(PORTB==100){
              به
              If(PORTB>100){
              تغییر پیدا کنه

              یادتون هم باشه هر دستور if حتما نباید else داشته باشه یعنی می تونین قسمت
              else
              {
              //code
              }

              اگر احتیاج ندارین رو ننویسین و تنها با همون بلاک اول کار خودتون رو انجام بدین
              دستور for:
              فکر کنین بخواین اعداد یک تا صد رو روی ال سی دی پروژه اتون بشمارین و نشون بدین یه روش اینه که خودتون بنویسین
              کد:
              Writelcd(“1”);
              Delay1KTCYx(100);
              Writelcd(“2”);
              Delay1KTCYx(100);
              
              Writelcd(“3”);
              Delay1KTCYx(100);
              ..
              …
              …
              Writelcd(“100”);
              Delay1KTCYx(100);

              حالا اگر خواستین فقط اعداد زوج رو نشون بدین اونم در بازه 0 تا 1000 دیگه چی کار می کنین؟
              اینجوری که مشاهده می کنین به مراتب برنامه نویسی سخت تر و فهم و خطایابیش مشکل می شه و حتی پیدا کردن کوچکترین خطایی می تونه به ساعتها بیانجامد.برای این منظور ما از حلقه ها استفاده می کنیم که یکی از آنها for هست.عبارت کلی for به صورت زیر هست
              کد:
              For(variable=first value;condition;command)
              {
              //code
              }
              در قسمت variable=first value یک متغییر رو با مقدار اولیه پر می کنین و در قسمت condition شرطی رو می نویسن تا برقرا بودن آن شرط اجرا بشه و در قسمت Command یک دستور دلخواه که اکثرا افزایش و کاهش مقدار متغییر اولیه هست رو قرار می دن .در دستور for ابتدا متغییری با مقداری پر می شه و سپس در صورت برقرار بودن شرط یکبار بلاک اجرا می شود و سپس متغییر یا کاهش یا افزایش پیدا می کنه و سپس با برقرار بودن شرط بلاک اجرا می شه تا نهایت شرط مقتضی بشه و از این دستور و به طور کل بلاک خارج بشیم.برنامه قبلی رو به این صورت می توان بازنویسی کرد
              کد:
              Int x;
              For(x=1;x<=100;x++){
              Writelcd(“100”);
              Delay1KTCYx(100);
              }
              دستورات و قوانین زیاد دیگه ای در زبان برنامه نویسی C هست که پیشنهاد می کنم به تهیه کتاب مناسبی در زمینه C قدرت خودتون رو افزایش و دید بهتری نسبت به برنامه ریزی میکرو و دیگر مقدمات اولیه میکرو داشته باشین
              بازم شرمنده که این بحث رو نمی تونم بیشتر از این تشریح کنم چون خودش می تونه یه کلاس جدید باشه برای آموزش.

              سوالی بود در خدمتم
              هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

              دیدگاه


                #8
                پاسخ : آموزش میکروکنترولر PIC با MPLAB C

                جلسه ششم:ارتباط سریال RS232
                در این جلسه نحوه برقراری میکرو با دیگر ادوات به صورت سریال RS232 رو از پیش چشم می گذرانیم
                در خانوده 18f ریجیستری تحت عنوان TXSTA داریم که در هنگام ارسال وظیفه تعیین و پیکربندی مقادیر اولیه ارتباط سریال رو بر عهده دارد
                مطابق دیتاشیت هر یک از بیت ها وظیفه خاصی رو دارن که در جدول زیر درج شدن

                ارتباط ما سه سیمه(زمین ، سیم ارسال ، سیم دریافت) GND و TXو RX و به صورت آسنکرون (ناهماهنگ خواهد بود)، 8 بیتی بدون بیت پریتی ، ، یک بیت پایان و بادریت 4800 خواهد بود که در این جلسه هم پیکربندی پر سرعت و کم سرعت این پورت رو مرور می کنیم.بنابراین با توجه به توضیحات پایین عکس ریجیستر رو در مد کم سرعت به صورت زیر مقدار دهی می کنیم


                بنابراین به مقدار هگز خواهیم داشت 20 ، پس همین حالا رجیستر TXSTA رو با مقدار 20 هگزادسیمال پر می کنیم یعنی
                TXSTA=0x20;
                مرحله بعدی تعیین بادریت ارسال و دریافت ارتباط هست.برای این منظور ریجستری که باید مقدار دهی شود ریجستر SPBRG هست.نحوه عدد گذاری این متغییر هم با فرمول زیر قابل محاسبه هست.

                که FOSC برابر فرکانس ورودی میکرو (که در اینجا 4 مگاهرتز هست)
                Desired Baud Rate بادریت دلخواه
                به عنوان مثال
                برای بادریت 4800 خواهیم داشت x=12
                برای بادریت 2400 خواهیم داشت x=25
                بنابراین x مقدار ریجستر SPBRG خواهد بود
                تا اینجا همه کارهای لازم برای تبادل صحیح داده ها رو انجام دادیم و تنها کاری که برای فعال سازی ارسال و دریافت باید انجام بدهیم یک کردن بیت SPEN در ریجیستر RCSTA هست. که با دستور زیر آن هم انجام می دهیم
                RCSTAbits.SPEN=1;
                تا ایجا پس تمامی تنظیمات و کارهای ابتدایی رو انجام دادیم و تنها مونده ارسال داده به سمت خارج، برای این منظور ریجستر دیگری به نام TXREG که با بایت مورد نظر پر می شود و بعد از آن ارسال می گردد که برای اطمینان از خروج کامل بایت می توان بیت TXIF از ریجیستر PIR1 چک کنیم تا در صورت خروج کامل داده (بایت)، این بیت یک می شود(البته در بیشتر موارد به جای چک کردن این بیت تاخیری به اندازه 16 برابر اندازه ارسال یک بیت در باد ریت ایجاد می کنیم که مطمئن باشیم بایت ارسال شده است(حالا چرا 16 تا ؟ 8 تا بیت ارسالی ، 2 بیت شروع و پایان ، 1 بیت پریتی ، و 2-3 تا بیت احتیاط زمانی)
                پس برنامه تا اینجا به صورت زیر در می آید
                کد:
                #include<p18f452.h>
                #include<delays.h>
                
                #pragma config OSC=HS
                #pragma config DEBUG=OFF
                #pragma config WDT=OFF
                #pragma config BOR=OFF
                #pragma config LVP=OFF
                #pragma config PWRT=ON
                
                 void main(){
                 TXSTA=0x20;
                 SPBRG=12;
                 RCSTAbits.SPEN=1;
                
                 while(1){
                      
                 }
                 }
                حالا برای ارسال کارکتر A خواهیم داشت
                کد:
                #include<p18f452.h>
                #include<delays.h>
                
                #pragma config OSC=HS
                #pragma config DEBUG=OFF
                #pragma config WDT=OFF
                #pragma config BOR=OFF
                #pragma config LVP=OFF
                #pragma config PWRT=ON
                
                 void main(){
                 TXSTA=0x20;
                 SPBRG=12;
                 RCSTAbits.SPEN=1;
                
                 while(1){
                   TXREG='A';
                   Delay10KTCYx(100);
                    
                 }
                 }
                برای ارسال یک رشته هم می تونین به روشهای مختلفی عمل کنیم که نمونه رو در زیر می بینین
                کد:
                #include<p18f452.h>
                #include<delays.h>
                
                #pragma config OSC=HS
                #pragma config DEBUG=OFF
                #pragma config WDT=OFF
                #pragma config BOR=OFF
                #pragma config LVP=OFF
                #pragma config PWRT=ON
                
                 void main(){
                   unsigned char msg[]="Hello World";
                   unsigned char i;
                 TXSTA=0x20;
                 SPBRG=12;
                 RCSTAbits.SPEN=1;
                
                 while(1){
                   for(i=0;i<11;i++){
                   TXREG=msg[i];
                   Delay1KTCYx(10);
                   }
                   TXREG=10;
                  Delay1KTCYx(1);
                   TXREG=13;
                   Delay10KTCYx(100);
                    
                 }
                 }
                حالا طبق تجربه ای تلخ که داشتم نتونستم بادریت 9600 رو تحت فرکانس 4 مگاهرتز تهیه کنم جالبیش به این هست که در دیتاشیت نوشته می شه و از چند متخصص خارجی هم پرسیدم انکار نکردم که نمی شه اما ما هر کاری کردیم که نشد تنها راه برای راه اندازی بادریت 9600 با فرکانس 4 مگاهرتز استفاده از مد سرعتی سریال هست(اگر شما تونستین و فهمیدن مشکل از کجاست اینجا بگین تا هم من و بقیه دوستان استفاده کنیم) که برای این منظور باید بیت BRGH رو در ریجستر TXSTA برابر یک کنیم که در این حالت به جای عدد 64 در فرمول محاسبه SPBRG ، باید فرکانس ورودی رو بر 16 تقسیم کنیم که یعنی سرعتی 4 برابر قبل.در حالت BRGH=1 مقدار SPBRG برای بادریت های مختلف به صورت مثال به شرح زیر هست
                برای 4800 خواهیم داشت 51
                برای 9600 خواهیم داشت 25
                بنابراین می تونیم برنامه بالا رو برای 9600 به صورت زیر تصحیح کنیم
                کد:
                #include<p18f452.h>
                #include<delays.h>
                
                #pragma config OSC=HS
                #pragma config DEBUG=OFF
                #pragma config WDT=OFF
                #pragma config BOR=OFF
                #pragma config LVP=OFF
                #pragma config PWRT=ON
                
                 void main(){
                   unsigned char msg[]="Hello World";
                   unsigned char i;
                 TXSTA=0x20;
                 SPBRG=25;
                TXSTAbits.BRGH=1;
                 RCSTAbits.SPEN=1;
                
                 while(1){
                   for(i=0;i<11;i++){
                   TXREG=msg[i];
                   Delay1KTCYx(10);
                   }
                   TXREG=10;
                  Delay1KTCYx(1);
                   TXREG=13;
                   Delay10KTCYx(100);
                    
                 }
                 }
                حالت دریافت:

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

                برای تعریف مد ، 9600 بادریت ، داده 8 بیتی ، یک بیت پایان ، مد آسنکرون مقدار ریجستر RCSTA رو به صورت زیر انتخاب می کنیم


                بنابراین مقدار هگزادسیمال این ریجستر خواهد بود 90
                حالا تعیین مقدار بادریت مدار که همانند توضیحات بالا برابر خواهد بود با 25 (در مد پرسرعت)
                برای دریافت بایت های رسیده باید ابتدا مقدار بیت RCIF در ریجستر PIR1 رو چک کنیم که در صورت یک بودن یک بایت در متغییر RCREG قرار گرفته هست و باید به صورت آن رو بخونیم تا داده از دست نرود پس نمای کلی برنامه برابر خواهد بود با
                کد:
                #include<p18f452.h>
                #include<delays.h>
                
                #pragma config OSC=HS
                #pragma config DEBUG=OFF
                #pragma config WDT=OFF
                #pragma config BOR=OFF
                #pragma config LVP=OFF
                #pragma config PWRT=ON
                
                 void main(){
                   unsigned char msg[]="Hello World";
                   unsigned char i;
                   unsigned char x;
                   RCSTA=0x90;
                 TXSTA=0x20;
                 TXSTAbits.BRGH=1;
                 SPBRG=25;
                 RCSTAbits.SPEN=1;
                
                 while(1){
                   while(PIR1bits.RCIF==0);
                   x=RCREG;
                   for(i=0;i<11;i++){
                   TXREG=msg[i];
                   Delay1KTCYx(10);
                   }
                     TXREG=x;
                   Delay1KTCYx(10);
                   TXREG=10;
                  Delay1KTCYx(1);
                   TXREG=13;
                   Delay10KTCYx(100);
                    
                 }
                 }

                در برنامه بالا ، میکرو منتظر می ماند تا کاربر یک کارکتر رو تایپ کند و سپس عبارت Hello world رو نمایش می دهد و سپس بعد از آن کارکتر تایپی کاربر رو نیز چاپ می کند و باز منتظر دریافت کارکتر دیگر می ماند.
                برای ارتباط دو میکرو به هم به وسلیه RS232 شما می تونید پایه TX میکرو اول رو به RX میکرو دوم و RX میکرو اول رو به TX میکرو دوم وصل کنین.
                برای ارتباط میکرو با کامپیوتر از طریق پورت RS232 با توجه به عدم یکسان بودن سطح منطقی بیت های ارسالی و دریافتی باید از تراشه max232 بهره بگیرید که شمای اتصال به کامپیوتر و میکرو به صورت زیر است

                هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                دیدگاه


                  #9
                  پاسخ : آموزش میکروکنترولر PIC با MPLAB C

                  جلسه هفتم:راه اندازی LCD کارکتری
                  از جهتی که در اکثر پروژه ها گویا lcd همه گیر شده است و بیشترین مصرف رو بعد از میکرو کنترولر مبتی بر بردهای embedded system بر روی برد داره این جلسه رو به راه اندازی این قطعه اختصاص می دهیم.
                  خود میکروچیپ و افراد بسیاری کتابخانه های متفاوتی برای راه اندازی lcd کارکتری نوشته اند که در این میان توابع میکروچیپ از تنوع و قدرت بیشتری برخوردار است اما این کتابخانه حجیم به دلیل گستردگی فایل ها و طولانی بودن سورس کد کوچکترین تغییری در کتابخانه می تونه به ساعتها وقت بیانجامد.برای راحتی شما کتابخانه رو نوشتم که در کمتر از 5 دقیقه می تونین به پروژه اتون اضافه کنین و به راحتی از توابع اون استفاده کنین.این کتابخانه بر روی فرکانس کاری بین 4 مگاهرتز الی 16 مگاهرتز که اکثر میکروها رو دوستان در این بازه راه اندازی می کنن شامل می شود و در صورتی که در فرکانس های بالاتر دستورات با مشکل در اجرا برخورد کردن می تواند با مراجعه به کتابخانه و پیدا کردن تابع و افزایش زمان Delay تابع رو تصحیح و مجددا آن را به کار بگیرید.
                  توابع کتابخانه:
                  Lcdinit: برای راه اندازی و آماده سازی lcd باید در ابتدای برنامه به کار گرفته شود
                  Cls:پاک کردن صفحه نمایش
                  Cursoron:روشن کردن کرسر ال سی دی
                  Cursoroff:خاموش کردن کرسر ال سی دی
                  Displayon:روشن کردن صفحه نمایش
                  Displayoff:خاموش کردن صفحه نمایش
                  Shiftleft:شیفت دادن کل صفحه نمایش به سمت چپ
                  Shiftright:شیفت دادن کل صفحه نمایش به سمت راست
                  Locate: با دریافت عدد سطر و ستون در مکان مورد نظر مکان نما رو برای چاپ کارکتر قرار می دهد
                  Lcdprint:چاپ کردن آرایه ای به حجم ماکزیمم 16 کارکتر در هر سطر
                  Writedata:نوشتن یک کارکتر به وسیله مقدار اسکی کارکتر
                  Writecommand:نوشتن دستورات مربوط به ال سی دی
                  همانطور که می بینین این کتابخانه ها با توجه به داشتن lcd 16*2 نوشتم که بر روی ال سی دیهای 16*1 , 16*2 به خوبی کار می کنه و برای ال سی دیهای دیگر تنها فقط باید چند تا از مقادیر عوض بشن.
                  حالا شروع می کنیم برای کار با این کتابخونه
                  ابتدا مداری مثل زیر ببندین

                  یادتون باشه که پین d0 تا d7 رو دقیقا به پین های 0 تا 7 پورت میکرو مورد نظر خودتون وصل کنین
                  و دو پین دیگه از lcd یعنی RS , E رو به هر پین دلخواه دیگری وصل کنین
                  کتابخانه ضممیه شده رو دانلود کنین و سپس با راست کلیک کردن بر روی فولدر Header Files و انتخاب گزینه Add existing item
                  فایل های lcd.h و delay.h رو به پروژه اضافه کنین.


                  کتابخانه ها:
                  http://vip.eca.ir/sharing/uploads/13435870181.rar

                  حالا در فایل سورس اصلی (جایی که خودتون برنامتون رو می نویسین) این سه عبارت رو اضافه کنین

                  #include <stdio.h>
                  #include "delays.h"
                  #include "LCD.h"

                  حالا برای تغییر مشخصات فایل کتابخانه مطابق با پیکربندی پورت ها بر روی فولدر Header Files کلیک کرده و سپس فایل lcd.h رو انتخاب کنین تا پنجره ادیتور باز بشه

                  #define rs PORTDbits.RD0
                  #define en PORTDbits.RD1
                  #define rsts TRISDbits.RD0
                  #define ents TRISDbits.RD1
                  #define datas LATB
                  #define datab TRISB
                  در خط اول باید بگین که پایه rs ال سی دی به چه پینی متصل هست
                  در خط دو برای En ال سی دی
                  در خط سوم و چهارم باز باید ریجستر TRIS رو برای همون دو پورت تعریف کنین یعنی مقادیر پورت و پین یکی هستن تنها در ریجستر PORT و TRIS متفاوت هستن
                  در خط پنجم باید بگین که پورت دیتا که وصل به پایه d0 تا d7 هست کدوم پین هست
                  در خط ششم هم بگین باز کدوم TRIS مربوط به پورت مورد نظرتون هست که باز می شه همون نام پورت خط پنجم
                  حالا چندین خط پایین تر بیان تا به عبارت زیر برسین
                  تبریک ، پیکربندی هم تموم شد
                  حالا برای برنامه نویسی
                  ابتدا ی برنامه اصلی عبارت زیر رو بنویسین

                  lcdinit();

                  به همین راحتی هم ال سی دی آماده سازی شد
                  حالا برای پاک کردن صفحه نمایش می نویسیم

                  cls();

                  برای چاپ یک کارکتر می نویسیم(مثلا کارکتر A)

                  writedata('A'

                  برای نوشتن یک عبارت روی ال سی دی ، یک آرایه 16 تایی از نوع unsigned char تعریف کنین و توسط دستور sprint عبارت خودتون رو بهش بدین به صورت زیر

                  sprintf(msg,"Hello"
                  lcdprint(msg);

                  اگر بخواین مقدار عددی یه متغییر هم چاپ کنین می تونین بنویسین

                  sprintf(msg,"Hello %d",i);
                  lcdprint(msg);

                  برای چاپ کردن کارکتر در مکان خاصی توسط دستور locate می تونین مکان قرار گرفتن کارکتر رو تعیین کنین مثلا برای رفتن به سطر دوم و مکان 5 ام می نویسیم

                  locate(2,5);

                  نمونه برنامه زیر رو ببینین که در خط اول چاپ می کنه Hello world و در خط بعدی یک متغییر رو هر یک ثانیه یکبار یکی افزایش می ده و در وسط خط دوم نمایش می ده

                  #include<p18f452.h>
                  #include <stdio.h>
                  #include "delays.h"
                  #include "LCD.h"

                  #pragma config OSC=HS
                  #pragma config DEBUG=OFF
                  #pragma config WDT=OFF
                  #pragma config BOR=OFF
                  #pragma config LVP=OFF
                  #pragma config PWRT=ON

                  void main(){
                  unsigned char msg[16];
                  unsigned char i;
                  lcdinit();
                  i=0;
                  while(1){
                  i=i+1;
                  cls();
                  locate(1,4);
                  sprintf(msg,"Hello world"
                  lcdprint(msg);
                  locate(2,8);
                  sprintf(msg,"%d",i);
                  lcdprint(msg);
                  Delay10KTCYx(100);

                  }
                  }
                  هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                  دیدگاه


                    #10
                    پاسخ : آموزش میکروکنترولر PIC با MPLAB C

                    بسیار جامع و کامل
                    واقعا ممنون از محبتت

                    دستوری داره که توی خروجی مثلا به مدت 500 ms یک پالس با فرکانس خاصی که بخواهیم بده ؟
                    همینطور دستوری هست که عرض پالس را اندازه بگیره یا فرکانس را ؟
                    همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
                    کانت

                    دیدگاه


                      #11
                      پاسخ : آموزش میکروکنترولر PIC با MPLAB C

                      نوشته اصلی توسط eshgh_namordeh
                      بسیار جامع و کامل
                      واقعا ممنون از محبتت

                      دستوری داره که توی خروجی مثلا به مدت 500 ms یک پالس با فرکانس خاصی که بخواهیم بده ؟
                      همینطور دستوری هست که عرض پالس را اندازه بگیره یا فرکانس را ؟
                      سلام
                      خواهش می کنم کاری نکردم وظیفه ام هست، من دستورات کتابخانه Mplab رو که حتی دوست عزیزمون آقای ramezani.t معرفی کردن رو چک کردم متاسفانه گویا دستورات آماده ای برای ای منظور وجود نداره و شما باید با تایمر ها برای تولید یک خروجی خاص و دقیق با زمان دهی خاص یا اندازه گیری عرض پالس استفاده کنین ، که ان شالله درس بحث بعدی تایمرها هست که اگر بشه نحوه ساخت فرکانس متر هم توضیح بده در غیر اینصورت به صورت پروژه های آماده MPLAB ان شالله در سایت قرار بدم
                      هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                      دیدگاه


                        #12
                        پاسخ : آموزش میکروکنترولر PIC با MPLAB C

                        ممنون استفاده میکنیم
                        دستورات کتابخانه Mplab یا کلا دستورات c30 یا c18 همه دستوراتش را از کجا باید تهیه کنیم ؟ فایلی هست که بتونیم همه دستورات را ببینیم توضیح داده باشه ؟
                        همه دوست دارند به بهشت بروند اما جالب اینجاست کسی دوست ندارد بمیرد
                        کانت

                        دیدگاه


                          #13
                          پاسخ : آموزش میکروکنترولر PIC با MPLAB C

                          سلام
                          دستورات کتابخانه C18 رو می تونین از آدرس زیر دانلود کنین

                          http://fadak-srt.persiangig.com/othe...ies_51297f.pdf
                          هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                          دیدگاه


                            #14
                            پاسخ : آموزش میکروکنترولر PIC با MPLAB C

                            جلسه هشتم:کار با تایمر
                            در اکثر مواقع احتیاج به ساخت زمان سنجی دقیق تر نسبت به دستورات Delay ، تولید رشته پالسی با فرکانس دقیق ، شمارنده پالس و .. احساس می شود.برای این منظور می توان از تایمر های میکرو استفاده کرد.در این جلسه نحوه راه اندازی تایمر صفر به صورت شمارنده و تایمر رو بررسی می کنیم و نهایتا با راه اندازی یکی از تایمرهای میکرو به راحتی می تونین با دیگر تایمر های تراشه دلخواهتون ارتباط برقرار کنین.
                            تایمر 0 در خانواده PIC18f 16 بیتی هست بدین منظور که از عدد 0 تا 65535 رو می تواند بشمارد البته بعضی از تایمرها از مد 8 بیتی و 16 بیتی پشتیبانی می کنن که به دلخواه می توان مد مورد نظر رو انتخاب کرد(و بعضی از تایمرها مثلا تایمر یک تنها از مد 16 بیتی پشتیبانی می کنن) .تایمر 0 دارای ریجستری به نام TxCON هست که به جای حرف X شماره تایمر قرار می گیرد یعنی T0CON ، این ریجستر وظیفه ست کردن پارامترهای تایمر رو دارن(منظور تنظیمات کنترلی تایمر هست) که در نمای زیر وظیفه هر یک از بیت ها رو می بینین.

                            همانطور که در عکس می بینین برای راه اندازی تایمر باید مقدار بیت هفتم برابر یک شود
                            با توجه به 16 بیتی بودن مدار تایمر دو ریجستر به نام TMR0H و TMR0L داریم که هر یک به ترتیب بایت با ارزش و کم ارزش رو در خود نگه می دارن .برای تبدیل این دو بایت به یک عدد صحیح باید ابتدا یک متغییر از نوع unsigned int تعریف کنیم و آن رو به صورت زیر پر کنیم

                            unsigned int i;
                            i=TMR0H;
                            i=i<<8;
                            i=i | TMR0L;

                            که در متغییر I عدد صحیح حاصل از تایمر 0 ریخته می شود.
                            برای راه اندازی تایمر در مد شمارنده پالس ورودی از پایه RA4/T0CKI متغییر کنترلی رو به صورت زیر پر می کنیم(برابر با مقدار A8 هگزا دسیمال)

                            حال اگر مقدار متغییر I بعد از مقدار دهی این ریجستر چک کنیم به ازای هر پالس دریافتی مقدارش یکی افزایش پیدا می کنه تا به مقدار ماکزیمم 65535 برسه و سپس مجددا صفر می شه و با صفر شدن بیت TMR0IF ریجستر INTCON رو یک می کنه.پس برنامه رو به این صورت می نویسیم تا مقدار تایمر بر روی LCD نمایش داده بشه


                            #include<p18f452.h>
                            #include <stdio.h>
                            #include "delays.h"
                            #include "LCD.h"

                            #pragma config OSC=HS
                            #pragma config DEBUG=OFF
                            #pragma config WDT=OFF
                            #pragma config BOR=OFF
                            #pragma config LVP=OFF
                            #pragma config PWRT=ON

                            void main(){
                            unsigned char msg[16];
                            unsigned int i;
                            lcdinit();
                            TMR0H=0;
                            TMR0L=0;
                            i=0;
                            T0CON=0xA8;
                            while(1){
                            i=TMR0H;
                            i=i<<8;
                            i=i | TMR0L;

                            cls();
                            locate(1,1);
                            sprintf(msg,"%d",i);
                            lcdprint(msg);
                            Delay10KTCYx(100);

                            }
                            }

                            برای تغییر افزایش شمارنده نسبت به لبه بالارونده یا پایین رونده می بایست بیت 4 از ریجستر T0CON رو به دلخواه تغییر داد.

                            حالا نوبت مد تایمری ، تایمر صفر شد.یعنی در این مد تایمر با ضریبی از فرکانس کریستال خارجی شروع به شمارش تا مقدار ماکزیمم می کنه و باید با مقدار دهی به ریجسترهای TMR0L و TMR0H بازه شمارش رو معین کنین یعنی اگر این دو ریجستر با مقدار 0 پر بشن تایمر از 0 می شماره تا مقدار ماکزیمم .
                            حالا برای فعالیت تایمر در مد تایمری ریجستر T0CON رو به صورت زیر تغییر می دیم

                            که برابر مقدار 88 هگزا دسیمال هست یعنی تایمر فرکانسش برابر با یک چهارم فرکانس کریستال مرجع هست یعنی اگر 4 مگاهرتز بدیم تایمر با 1 مگاهرتز شروع به کار می کنه البته با تغییر بیت 3 به مقدار 0 و مقدار دهی بیت صفر تا 2 به یکی از آرایش های طبق جدول بالا فرکانس رو علاوه بر اینکه بر 4 تقسیم می کند می تواند بعد از آن بر یکی از اعداد 2 ، 4 ، 8 ، 16 ، 32 و 64 ، 128 و 256 تقسیم کنه تا سرعت تایمر رو به مراتب از حالت بدون تقسیم گر کندتر کنه.تا اینجا تایمر رو راه اندازی کردیم و تایمر شروع به شمارش می کنه ، اما یه مسئله رو فراموش کردیم و اونم مقدار دهی اولیه تایمر هست که مشخص کنیم تایمر از چند بشماره تا مقدار ماکزیممش.من به دلخواه فرض می کنم عدد FF02 رو در متغییر های TMR0L و TMR0H قرار دادیم یعنی میکرو از عدد FF02 تا FFFF می شماره که بخوایم بدونیم چقدر زمان طی می شه که این بازه رو بشماره محاسبه زیر رو انجام می دیم

                            تایمر با فرکانس یک چهارم کریستال خارجی کار می کنه یعنی 1 مگاهرتز
                            1 مگاهرتز یعنی 1 میلیونیموم ثانیه ، پس هر عدد یک میلیونیوم ثانیه طول می کشه تا افزایش پیدا کنه حالا کسر FF02 از FFFF برابر خواهد بود با 253 دسیمال یعنی 253 میکرو ثانیه طول می کشه که از FF02 تا FFFF رو بشماره.در این جلسه اگر بخوایم فرکانس 40 کیلوهرتز رو تولید کنیم به وسلیه تایمر باید چی کار کنیم؟
                            محاسبات:
                            40 کیلو هرتز رو تقسیم بر دو می کنیم یعنی 20 کیلوهرتز ، تقسیم بر دو به این معناست که از 40 کیلوهرتز 20 کیلوهرتز خروجی صفر و 20 کیلوهرتز بعدی خروجی یک می شه
                            1 رو تقسیم بر 20 کیلوهرتز می کنیم که زمان رو بدست بیاریم که برابر خواهد بود با 50 میکرو ثانیه
                            هر شمارش در 1 میکرو ثانیه تایمر انجام می ده یعنی برای 50 میکرو ثانیه خواهیم داشت که میکرو از عدد FFCD تا عدد FFFF بشماره(اختلاف این دو تا عدد برابر 50 می شه) پس مقدار بالا رو در ریجستر TMR0L و TMR0H بارگذاری می کنیم و برنامه رو به صورت زیر می نویسیم


                            #include<p18f452.h>
                            #include <stdio.h>
                            #include "delays.h"
                            #include "LCD.h"

                            #pragma config OSC=HS
                            #pragma config DEBUG=OFF
                            #pragma config WDT=OFF
                            #pragma config BOR=OFF
                            #pragma config LVP=OFF
                            #pragma config PWRT=ON

                            void main(){
                            unsigned char msg[16];
                            unsigned int i;
                            TRISDbits.RD2=0;
                            PORTDbits.RD2=0;
                            lcdinit();
                            i=0;
                            TMR0H=0xFF;
                            TMR0L=0xCD;
                            T0CON=0x88;
                            while(1){
                            while(INTCONbits.TMR0IF==0);
                            PORTDbits.RD2=~PORTDbits.RD2;
                            TMR0H=0xFF;
                            TMR0L=0xCD;
                            }
                            }

                            با اسکوپ که خروجی(پین RD2 )رو چک کردم فرکانس خروجی برابر با 41.071 کیلوهرتز بود که تا حد بسیار قابل قبولی فرکانس مورد نظرمون رو تولید کردیم.
                            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                            دیدگاه


                              #15
                              پاسخ : آموزش میکروکنترولر PIC با MPLAB C

                              با سلام خدمت همه دوستان و عرض تشکر از جناب baby_1 بابت این آموزش های کامل , امید وارم با همکاری همه دوستان این حرکت علمی ادامه پیدا کنه تا افراد بیشتری با قابلیت های این میکرو کنترلر قدرتمند آشنا بشن , من فکر میکنم از PIC فقط در قالیب این کامپایلر میشه حداکثر استفاده رو برد

                              نوشته اصلی توسط eshgh_namordeh
                              دستوری داره که توی خروجی مثلا به مدت 500 ms یک پالس با فرکانس خاصی که بخواهیم بده ؟
                              همینطور دستوری هست که عرض پالس را اندازه بگیره یا فرکانس را ؟
                              من خاطرم هست که در کامپایلر های دیگر دستوراتی وجود داشت که این کار رو به صورت نرم افزاری انجام میداد , اما من فکر میکنم با وجود ماژول هایی مثل CCP و تایمر ها این موضوع منطقی نیست که این کار نرم افزاری انجام بشه و من هم دستور خاصی در c18 ندیدم , اما اگر به پی دی اف MPLAB C18 Libraries که جناب baby_1 لینک دانلودش رو قرار دادن دقت کنید توابع کاملی برای کار با ماژول های میکرو برای انجام این کار ها میبینید , البته در ورژن های جدید این فایل با فرمت دیگری در محل نصب کامپایلر وجود دارد.

                              باز هم از جناب baby_1 بابت آموزش ها متشکرم

                              موفق باشید
                              نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
                              تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

                              دیدگاه

                              لطفا صبر کنید...
                              X