اطلاعیه

Collapse
No announcement yet.

[آموزش] آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

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

    #16
    پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

    نوشته اصلی توسط ramezani.t
    سلام
    کدهای شما مشکلی نداره و من هنوز فکر میکنم مشکل از سیستم کلاک شماست ( pic18f4550 )
    دقت کنید هر پروگرامری کد های زیر رو تشخیص نمیدن
    #pragma config WDT=OFF, LVP=OFF, DEBUG=ON, MCLRE = ON
    و باید اونارو از نرم افزار پروگرامر مقدار دهی کنید
    سعی کنید مانند TRISD رجیسترهای سیستم کلاک رو بعد از main مقدار دهی کنید
    برای مثال به OSCCON دقت کنید
    اگر pic رو تازه شروع کردین حتما با pic18f452 ادامه بدین
    من در حال حاضر حضور ذهن روی pic18f4550 ندارم اما در آینده مثال هایی برای این تراشه مینویسم
    ار خود mplab x برای پروگرم کردن استفاده می کنم .
    اینم شانسه منه بیچارست که کار نمیکنه - sample و هرچی دیگه هم بگید رفتم پیش ولی نشد که نشد
    این میکروها همشون ، اولاش ما رو اذیت کردن
    حالا اگه شد و وقت داشتید یه کمکی به ما بکنید(عملا هیچی تو PIC سرم نمیشه)-ممنون

    دیدگاه


      #17
      پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

      سلام
      با تلاش و پشتکار هر چیزی ممکنه
      فقط نباید عجله کنید
      pic18f4550 برای شما زوده
      این کتاب ها به شما کمک میکنه:

      پروژه های پیشرفته میکرو کنترلر pic به زبان c
      مهندس هوار بطحایی
      انتشارات پندار پارس

      میکرو کنترلر pic
      مهندس حسین چهرقانی

      راهنمای جامع برنامه نویسی c
      کانون نشر علوم

      و اگر با میکروکنترلر ها آشنایی ندارید
      کتاب : اصول و راهنمای کار با میکرو کنترلر PIC
      منهای سه فصل اولش


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

      دیدگاه


        #18
        پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

        هیچ چیز برای کسی زود نیست .
        یعنی شما که اینجا آموزش گذاشتید نمیتونید مشکل من رو حل کنید ؟
        حالا شما نه اشخاص دیگه PIC باد نیستن ؟

        دیدگاه


          #19
          پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

          سلام :smile:
          منظور من از زود بودن این بود که شما بهتر اول با pic18f452 شروع کنید
          من از نوشته های خودتون متوجه شدم که کار با pic رو تازه شروع کردین
          ببینید من در این آموزش ها اهداف خاصی رو دنبال میکنم و در آموزش بعد متوجه میشین که چرا از pic18f4550 فعلا استفاده نمیکنم

          در هر صورت اگر میکرو شما این چند خط کد رو اجرا نمیکنه , اگر تغذیه میکرو مشکلی نداشته باشه بدونید که میکروتون کلاک نداره

          این مشکل معمولا به پیکر بندی سیستم کلاک مربوط میشه برای مثال hs یا xt

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

          دیدگاه


            #20
            آموزش کامپایلر MPLAB C18 ( آموزش شماره 3 )

            سلام

            آموزش شماره 3


            راه اندازی سخت افزار Usart به وسیله کامپایلر mplab c18


            همان طور که در آموزش قبل متوجه شدید mplab c18 یک کامپایلر open cuorce هست به این معنی که شما می توانید محتویات تمامی توابع را ببینید ودر صورت لزوم تغییر دهید , به طور مثال وقتی به بدنه تابع putsXLCD دقت میکنید نکات برنامه نویسی ساده و مفیدی میبینید

            کد PHP:
            void putsXLCD(char *buffer)
            {
                while(*
            buffer)         // Write data to LCD up to null
                
            {
                    while(
            BusyXLCD());   // Wait while LCD is busy
                    
            WriteDataXLCD(*buffer); // Write character to LCD
                    
            buffer++;        // Increment buffer
                
            }
                return;

            به بدنه تابع BusyXLCD دقت کنید , شما با الگو گرفتن از این توابع میتوانید برای سخت افزار های دیگر کتاب خانه بنویسید ویا برای مثال میتوانید این تابع رو ( BusyXLCD ) دست کاری کنید , یک تایمر به اون اضافه کنید تا وقتی LCD آسیب دید این تابع عدد خطا رو برگردونه , همان طور که میدونید وقتی LCD آسیب میبینه گاهی اوقات چیپ HD44780 در حالت Busy میماند و اگر از این تابع به صورت
            کد PHP:
             while(BusyXLCD()) 
            استفاده کرده باشین برنامه شما همینجا متوقف میشود .
            خوب تو بعضی از پروژه های صنعتی این خیلی بده که وقتی LCD آسیب میبینه یک سیستم کنترلی مهم از کار بیوفته .
            این فقط برای مثال بود , وقتی از این کامپایلر استفاده میکنید متوجه میشوید که open cource بودن این کامپایلر چه مزیت بزرگیه , من کمتر کامپایلری دیدم که این مزیت رو داشته باشه


            در این آموزش شما یاد میگیرید که چگونه از سخت افزار USART استفاده کنید و همچنین چند خطی به تحلیل کدها و چگونگی ساخت یک تابع در mplab c18 میپردازم

            در این پروژه ما اطلاعاتی که در خطوط LCD در آموزش شماره 2 نشان میدادیم را از طریق سخت افزار USART به میکروکنترلر دیگر انتقال داده و بر روی LCD نشان میدهیم



            در این آموزش ها سعی کنید از قطعات پیشنهادی استفاده کنید زیرا برای مثال PIC18F4550 به جای سخت افزار USART از EUSART استفاده میکند که پیشرفته تر از USART هست و رجیستر های بیشتری دارد

            چگونه از سخت افزار USART در MPLAB C18 استفاده کنیم

            به روش آموزش شماره 2 , دو پروژه ایجاد کنید, یکی میکروکنترلر فرستنده سریال و دیگری گیرنده سریال , من اسم پروژه فرستنده سریال USARTtestTX و اسم پروژه گیرنده سریال USARTtestRX انلخاب میکنم

            همان طور که میدونید قبل از استفاده از هر تابعی باید اون رو به پروژتون اضافه کنید
            به دایرکتوری زیر رفته وتوابع USART و LCD رو از اونجا به پروژتون اضافه کنید
            در رایانه من این مسیر به شکل زیر است :

            C:\Program Files\Microchip\mplabc18\v3.40\src\pmc_common

            دقت کنید من اگر جای شما باشم این فایل ها رو در محل پروژم کپی میکنم تا اگه یه وقت تغییرشون دادم به دردسر نخورم :smile:

            برای اضافه کردن این کتاب خانه ها بهتر است به شکل زیر عمل کنید :

            در پنجره پروژه بر روی source File راست کلیک کنید, New Logical Folder را انتخاب کنید
            سپس بر روی فلدر ساخته شده راست کلیک کنید و Rename را انتخاب کنید, هالا اسم فایل را به USART تغییر دهید
            به همین روش یک فایل به اسم LCD ایجاد کنید
            خوب حالا باید فایل های کتاب خانه USART و XLCD را به این فلدر ها اضافه کنیم, بر روی فلدر USART که ایجاد کردید راست کلیک کرده و Add Existing Item را انتخاب کنید, سپس فایل های کتاب خانه USART را به پروژه اضافه کنید دقت کنید در این پروژه ما فقط به فایل های زیر احتیاج داریم

            ubusy.c
            uclose.c
            udefs.c
            udrdy.c
            ugets.c
            uopen.c
            uputs.c
            uread.c
            uwrite.c

            فایا های کتاب خانه ای استاندارد معمولا دارای دستورات پیش فرض هستن ( برای مثال #if defined ) این دستورات باعث میشوند که اگر شما کتاب خانه های نامربوط به میکروکنترلر پروژتون رو به پروژه اضافه کنید کامپایلر از کامپایل کردن محتویات این کتاب خانه خودداری میکند برای مثال فایل ubaud.c را به پروژه اضافه کنید, به دلیل اینکه PIC18F452 رجیستر BAUDCON را ندارد این دستورات غیر بعال هستن, اما اگر تراشه ما PIC18F4550 بود باید از این فایل استفاده میکردیم.
            دقت کنید فایل uputrs.c را هم به پروژه اضافه نکنید این فایل نکته خاصی دارد که در صورت لزوم توضیح میدهم

            ( تمامی این مسیر را برای هر دو پروژه تی کنید )

            خوب حالا میتوانید فایل های کتاب خانه XLCD را به هر دو پروژه اضافه کنید.
            دقت کنید میکروچیپ فایل خاصی را برای توابع DelayXLCD و DelayFor18TCY و DelayPORXLCD ارائه نکرده, در آموزش شماره 2 شما این فایل را دانلود کردید , در ادامه توزیحات لازم را میدهم

            یک سوال : از کجا متوجه شویم که هر کدام از فایل ها و توابع C18 چه کاری انجام میدهند ؟
            برای این کار باید به پی دی اف MPLAB_C18_Libraries_51297f مراجعه کنید , این pdf در محل نصب کامپایلر وجود دارد اما در ورژن های جدید با فرمت دیگری ارائه شده است, من با شکل PDF آن راحت تر هستم, در هر صورت اگر کسی این فایل را نداشت میتواند از لینک زیر آن را دانلود کند

            http://fadak-srt.persiangig.com/other/mplab-d/MPLAB_C18_Libraries_51297f.pdf

            خب حالا به صفحه 81 پی دی اف بالا ( سند 51297f ) دقت کنید همان طور که میبینید باید سه تابع برای تأخیر های زمانی ایجاد کنید

            خب کار سادست چون در صفحه 85 یک مثال کامل وجود داره :agree:
            حالا در داخل فلدر LCD که در پنجره پروژه ایجاد کردین یک فایل C ایجاد کرده و سه تابع فوق را در اون ایجاد کنید , برای این کار به دو نکته دقت کنید [list type=decimal]
            [li]
            هدر های لازم را به این فایل اضافه کنید
            [/li]
            [li]
            تأخیر های زمانی را باتوجه به فرکانس کلاک میکرو مقدار دهی کنید
            [/li][/list]

            این فایل باید در هر دو پروژه فرستنده و گیرنده وجود داشته باشد.

            خب حالا یک فایل C به نام main در پروژه فرستنده ایجاد کنید و کد های زیر را در آن قرار دهید


            کد:
            /*************************************************************
            *           be name KHODA             *
            *                              *
            * 1390.12.2                         *
            * s.ramezani.t@gmail.com                   *
            *                              *
            * OSC = 20MHz                        *
            *                              *
            **************************************************************/
            
            #include <p18f452.h>
            #include <delays.h>
            #include <stdio.h>
            #include "xlcd.h"
            #include <usart.h>
            
            
            #pragma config OSC   = HS
            //#pragma config OSCS  =
            #pragma config PWRT  = ON
            #pragma config BOR   = OFF
            //#pragma config BORV  =
            #pragma config WDT   = OFF
            //#pragma config VDTPS  =
            //#pragma config CCP2MUX =
            //#pragma config STVR  =
            #pragma config LVP   = OFF
            //#pragma config DEBUG  =
            
            #define LED PORTDbits.RD3
            
            
            
            ////////////////////////////////////////////////////////////////////////////////
            
            
            void main( void )
            {
              
             unsigned int cont = 0 ;
             char buf[20];
              
            
             TRISA = 0b00000000 ;
             TRISB = 0b00000000 ;
             TRISC = 0b00000000 ;
             TRISD = 0b00000000 ;
             TRISE = 0b00000000 ;
            
             ADCON0bits.ADON = 0 ;
             ADCON1 = 0b00000110 ;
            
             Delay10KTCYx(250) ;
            
             OpenUSART( USART_TX_INT_OFF &
                   USART_RX_INT_OFF &
                   USART_ASYNCH_MODE &
                   USART_EIGHT_BIT &
                   USART_CONT_RX &
                   USART_BRGH_LOW,31 );
            
            
             OpenXLCD( FOUR_BIT & LINES_5X7 );
            
             while( BusyXLCD() );
             WriteCmdXLCD(DON & BLINK_OFF & CURSOR_OFF);
            
             while( BusyXLCD() );
             WriteCmdXLCD(0b00000001);//clear display
            
            //////////////////////////////////////////////////
            
             while( BusyXLCD() );
             SetDDRamAddr( 2 );
            
             while( BusyXLCD() );
             putrsXLCD( "be name KHODA" );
            
             while( BusyXLCD() );
             Delay10KTCYx(250) ;
            
             
             cont = 0 ;
             LED = 0 ;
            
            
            
             while(1)
             {
               
            
              if (LED == 0)
                 LED = 1 ;
               else
                 LED = 0 ;
            
              cont = cont + 1 ;
              sprintf(buf,"a+b = %4d srt", cont);
            
              putsUSART((char *)buf);
            
            
              while( BusyXLCD() );
              SetDDRamAddr( 40 );
              while( BusyXLCD() );
              putsXLCD( buf );
              
              Delay10KTCYx(250) ;
            
             }
            }

            دو نکته بسیار مهم از سخت افزار و نرم افزار در ارتباطات سریال :[list type=decimal]
            [li]
            فرض کنید در یک پروژه یک سیستم طراحی کردید که یک میکرو مقدار چند سنسور را خوانده و اطلاعات را به صورت سریال در خروجی سیستم قرار میدهد , مثلا عدد سنسور دمای اول 20 و سنسور دوم 30 و سوم 50 میباشد و میکرو شما این سه عدد را به صورت سه عدد باینری ارسال میکند , پس شما سه بایت به صورت سریال ارسال میکنید
            نکته اصلی اینجاست , در اینجا یک خطا رخ میدهد
            خطا اینجا رخ میدهد که اگر شما بخاهید این سه بایت را به وسیله یک سیستم میکرو کنترلری دیگر دریافت کنید , امکان دارد به دلیل هم زمان نبودن این دو سیستم با هم عدد سنسور دوم به جای اول قلمداد شود و کلا اطلاعات جابه جا شوند

            اینجاست که شما به این نتیجه میرسید که باید از پروتکل برای ارتباط استفاده کنید ,با یک مثال توضیح میدهم
            برخی از ماژول ها مانند مانند ماژول های GPS اطلاعات زیادی را تجزیه و تحلیل کرده و به صورت سریال در اختیار ما قرار میدهند این ماژول ها از پروتکل خاصی به نام NMEA برای ارتباط سریال استفاده میکنند , این پروتکل به این صورت است که اولا تمامی اطلاعات به صورت کد اسکی رد و بدل میشود ثانیا اطلاعات به صورت جمله بندی شده و در ابتدای هر جمله کد اسکی ' $ ' ارسال میشود و وقتی ماژول کد اسکی ' * ' را ارسال میکند یعنب اینکه جمله به پایان رسیده , پس کار خیلی راحته شما فقط باید برنامه ای بنویسید که یک به یک بایت های سریال را دریافت کرده و فقط وقتی به دریافت و ذخیره اطلاعات بپردازد که کد اسکی $ را دریافت کرد , و تا دریافت کد * به دریافت اطلاعات ادامه دهد , به این شکل دیگر خطر این موضوع وجود ندارد که اطلاعات از وسط جمله دریافت شده و همه چیز باهم جابه جا بشه

            حال بر مگردیم به پروژه خودمون , در پروژه قبل ما یک شمارنده داشتیم که اعدادی را مابین چند کاراکتر نشان میداد

            "a+b = 452 srt"

            خوب دقت کنید , این جمله ماست , همه چیز بین کاراکتر های ' a ' و ' t ' قرار داره :smile:

            [/li]
            [li]
            و اما نکته سخت افزاری , خوب به تصویر پروژه دقت کنید , میکرو فرستنده با یک سیم اطلاعات را برای گیرنده ارسال میکند , فاصله حدود پانزده سانتی متر است , اگر من از یک سیم معمولی برای این کار استفاده میکردم حتما اطلاعات مخدوش شده و نویز اجازه ارتباط را نمیداد , سیم داخل تصویر یک سیم شیلد است که شیلد را به زمین متصل کرده ام.
            [/li][/list]



            تحلیل کد های فرستنده :
            در خطوط 8 تا 12 هدر های مورد نیاز به پروژه اضافه میشوند
            به این موضوع دقت کنید که من برای فراخانی هدر xlcd.h از " " به جای < > استفاده کرده ام این کار باعث میشود کامپایلر برای پیدا کردن هدر مربوطه ابتدا محل پروژه را جستوجو کند
            من هدر xlcd.h را از دایرکتوری زیر در محل پروژم کپی کرده ام تا در صورت ادیت کردن این هدر , اصل فایل تقییر نکند
            عموما شما وقتی از سخت افزار های خارجی مثل LCD استفاده میکنید مستلزم آن هستید که defineهای زیادی را تغییر دهید , برای مثال ممکن است بخاهید پورت های دیگری را برای کار با LCD انتخاب کنید

            در خطوط 18 تا 25 فیوز بیت های میکرو مقدار دهی شده اند

            در خط 27 پین RD3 را برای LED انتخاب کرده ایم

            در خط 34 مین اصلی ما قرار دارد
            از این خط به بعد فقط به تحلیل کد های USART میپردازم , برای این کار از پی دی اف MPLAB_C18_Libraries استفاده میکنم , در صفحه های 70 تا 78 توضیحات کاملی در این رابطه وجود داره

            حال کلید Ctrl را نگه داشته و بر روی دستور OpenUSART کلیک کنید تا فایل uopen.c باز شود
            به محتویات این فایل دقت کنید
            در اصل فقط دو آرگومان به این تابع ارسال میکنید

            void OpenUSART( unsigned char config, unsigned int spbrg)

            کلماتی مثل USART_TX_INT_OFF و USART_EIGHT_BIT همگی با هم AND شده و یک عدد را درون متغیر config تشکیل میدهند
            حالا به بدنه تابع OpenUSART دقت کنید , من در آموزش ها نمیتوانم زبان C را آموزش دهم اما اگر دوستان با این زبان آشنا باشن همین فایل یک هلپ کامل است
            بیت های متغیر config یک به یک درون بدنه تابع OpenUSART چک شده و طبق درخاست شما رجیستر های USART مقدار دهی میشوند
            با فراگرفتن این شکل یرنامه نویسی میتوانید کتاب خانه نویس خوبی شوید

            آرگومان دوم spbrg است که از نوع unsigned int انتخاب شده است , این متغیر نرخ تبادل اطلاعات ( baudrate ) تعیین میکند
            هنگامی که میکرو شما دارای سخت افزار USART هست تنها هشت بست کم ارزش spbrg مورد استفاده قرار میگیرد زیرا این میکرو ها تنها یک بایت را برای تعیین baudrate اختصاص داده اند , اما اگر میکرو شما دارای سخت افزار EUSART است هر دو بایت متغیر spbrg مورد استفاده قرار میگیرد زیرا این میکرو ها برای بالا بردن دقت baudrate از دو بایت برای این کار استفاده میکنند

            و اما توصیف این دستور :

            همیشه از این دستور برای پیکر بندی سخت افزار USART یا EUSART در ابتدای برنامه استفاده کنید
            به صفحه 73 پی دی اف MPLAB_C18_Libraries دقت کنید
            من قصد دارم سخت افزار USART رو به وسیله دستور OpenUSART برای یک ارتباط غیر هم زمان ( Asynchronous ) با نرخ تبادل اطلاعات 9600 پیکر بندی کنم , با توجه به اینکه فرکانس اسیلاتور ما 20 مگاهرتز است
            خوب دقت کنید هر کدام از اعداد زیر یک عدد توافقی در این کتاب خانه هستند , که با AND شدن با یکدیگر یک عدد هشت بیتی را جهت پیکر بندی USART تشکیل میدهند , برای دیدن اعداد کلید Ctrl را ( در نرم افزار MPLAB X ) نگه داشته و موس را بر روی عبارت USART_TX_INT_OFF انتقال دهید , پنجره کوچکی بر روی آن باز میشود که define مربوطه رو به طور کامل نشان میدهد




            Interrupt on Transmission:
            USART_TX_INT_ON Transmit interrupt ON
            USART_TX_INT_OFF Transmit interrupt OFF

            Interrupt on Receipt:
            USART_RX_INT_ON Receive interrupt ON
            USART_RX_INT_OFF Receive interrupt OFF

            USART Mode:
            USART_ASYNCH_MODE Asynchronous Mode
            USART_SYNCH_MODE Synchronous Mode

            Transmission Width:
            USART_EIGHT_BIT 8-bit transmit/receive
            USART_NINE_BIT 9-bit transmit/receive

            Slave/Master Select*:
            USART_SYNC_SLAVE Synchronous Slave mode
            USART_SYNC_MASTER Synchronous Master mode

            Reception mode:
            USART_SINGLE_RX Single reception
            USART_CONT_RX Continuous reception

            Baud rate:
            USART_BRGH_HIGH High baud rate
            USART_BRGH_LOW Low baud rate
            * Applies to Synchronous mode only



            خب هالا چون از اینتراپت استفاده نمیکنیم USART_TX_INT_OFF و USART_RX_INT_OFF را باهم AND میکنیم ( $ )
            چون از مد غیر هم زمان استفاده میکنبم USART_ASYNCH_MODE را با دوتای قبلی AND میکنیم
            چون از هشت بیت برای انتقال استفاده میکنبم و کد پریتی نداریم از USART_EIGHT_BIT استفاده میکنیم
            چون از مد Asynchronous استفاده میکنیم بی خیال بخش Slave/Master Select میشیم
            چون قصد داریم یک رشته را ارسال کنیم و بایت ها تکی نیستند USART_CONT_RX را با بقیه AND میکنیم
            و چون در نرخ 9600 میخاهیم کار کنیم باید USART_BRGH_LOW را انتخاب کنیم که بیشتر توضیح میدهم

            خب , دوستان عزیز آش ما آماده شده حالا باید به میزان لازم baudrate به اون اضافه کنیم

            برای به دست آوردن میزان لازم baudrate باید به بیت BRGH دقت کنید شما با انتخاب USART_BRGH_LOW در دستور OpenUSART در اصل بیت BRGH را 0 میکنید و با انتخاب USART_BRGH_HIGH بیت BRGH را یک میکنید , محاسبه میزان baudrate در این دو حالت با هم تفاوت دارد

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

            SPBRG = ( (FOSC / Desired Baud Rate) / 64 ) - 1


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

            SPBRG = ( (FOSC / Desired Baud Rate) / 16 ) - 1


            خب همان طور که میبینید ما از USART_BRGH_LOW برای به دست آوردن نرخ 9600 استفاده کرده ایم , بنابراین محاسبات به شکل زیر است
            ( فرکانس اسیلاتور بیست مگاهرتز است )



            SPBRG = ( (FOSC / Desired Baud Rate) / 64 ) - 1
            SPBRG = ( (20000000 / 9600) / 64 ) - 1
            SPBRG = 31


            پس دستور OpenUSART به شکل زیر است


            کد:
             OpenUSART( USART_TX_INT_OFF &
                   USART_RX_INT_OFF &
                   USART_ASYNCH_MODE &
                   USART_EIGHT_BIT &
                   USART_CONT_RX &
                   USART_BRGH_LOW,31 );

            [hr]

            همان طور که متوجه شدید ما قصد داریم تمام کاراکترهایی که در خط دوم در آموزش شماره 2 ایجاد کرده بودیم را به وسیله سریال به میکرو دیگری انتقال داده و بر روی LCD نمایش دهیم , جمله ما میتواند به شکل زیر باشد :

            "a+b = 453 srt"

            عددی که مابین این جمله قرار دارد یک متغییر از نوع unsigned int هست که من نام cont را برای آن انتخاب کرده ام , عدد ذخیره شده در این متغییر به وسیله دستور sprintf به یک رشته کاراکتری تبدیل شده و در نتیجه جمله کامل در یک متغیر به نام buf شکل میگیرد دقت کنید این متغیر یک رشته کاراکتری به طول 20 بایت است , یک نکته بسیار مهم وجود دارد , شما هنگام ذخیره یک همچین جملاتی همیشه باید حداقل یک بایت اضافه تر در نظر بگیرید , این به این دلیل است که دستوراتی همچون sprintf بعد از ساخت جمله مورد نظر شما همیشه یک کاراکتر تهی ( عدد صفر دسیمال ) به انتهای جمله میچسباند , این امر حیاتیست , زیرا طول کاراکتر هایی که در جمله ما وجود دارد همیشه متغییر است چون عددی که در متغییر cont وجود دارد ممکن است 1 یا 5 رقم باشد , پس توابعی که وضیفه ارسال این جملات را دارند ( "a+b = 453 srt" ) باید از به پایان رسیدن ارسال به وسیله یک کاراکتر تهی , اطمینان حاصل کنند

            خب سادست این امر به وسیله یک while ساده انجام میشود , به بدنه تابع putsUSART دقت کنید


            کد PHP:
            void putsUSARTchar *data)
            {
             do
             { 
            // Transmit a byte
              
            while(BusyUSART());
              
            putcUSART(*data);
             } while( *
            data++ );


            حلقه while تا زمانی که data صفر نشود ادامه پیدا میکند و بایت ها یک به یک توسط دستور putcUSART به USART ارسال میشود , همیشه به ساز و کار کتاب خانه هایی که دردست دارید و استفاده میکنید دقت کنید , همان طور که میبینید این تابع قبل از ارسال هر بایت از دستور while(BusyUSART()); استفاده میکند تا از به پایان رسیدن ارسال اطمینان حاصل کند

            حال بیایید یک نگاه کامل به دستوراتی که کتاب خانه C18 در اختیار ما قرار داده بیندازیم
            [list type=decimal]
            [li]
            BusyUSART
            آیا USART در حال ارسال اطلاعات است ؟

            [/li]
            [li]
            CloseUSART
            غیر فعال کردن USART

            [/li]
            [li]
            DataRdyUSART
            آیا درون بافر USART اطلاعات دریافت شده ؟

            [/li]
            [li]
            getcUSART
            خواندن یک بایت از USART

            [/li]
            [li]
            getsUSART
            خواندن یک رشته از USART

            [/li]
            [li]
            OpenUSART
            پیکر بندی USART

            [/li]
            [li]
            putcUSART
            نوشتن یک بایت در USART

            [/li]
            [li]
            putsUSART
            نوشتن یک رشته از حافظه RAM در USART

            [/li]
            [li]
            putrsUSART
            نوشتن یک رشته از حافظه ROM در USART

            [/li]
            [li]
            ReadUSART
            خاندن یک بایت از USART

            [/li]
            [li]
            WriteUSART
            نوشتن یک بایت درون USART

            [/li]
            [li]
            baudUSART
            پیکر بندی رجیستر های baud rate برای میکروهایی که دارای سخت افزار EUSART هستن مانند PIC18f4550
            [/li][/list]

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




            ادامه این آموزش در صفحه بعد قرار داره :arrow:

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

            دیدگاه


              #21
              پاسخ : آموزش کامپایلر MPLAB C18 ( آموزش شماره 3 - بخش دوم )


              ( آموزش شماره 3 - بخش دوم )



              حال باید پروژه گیرنده یا USARTtestRX را تکمیل کنیم


              یک فایل C در پروژه گیرنده ایجاد کنید و نام main را برای آن انتخاب کنید
              دقت کنید که برای نظم بیشتر فلدر پروژه بهتر است همیشه نام فایلی که main اصلی ما در آن قرار دارد را main انتخاب کنیم

              حال کد های زیر را در این فابل قرار دهید


              کد:
              /*************************************************************
              *           be name KHODA             *
              *                              *
              * 1390.12.2                         *
              * s.ramezani.t@gmail.com                   *
              *                              *
              * OSC = 20MHz                        *
              *                              *
              **************************************************************/
              
              #include <p18f452.h>
              #include <delays.h>
              #include <stdio.h>
              #include "xlcd.h"
              #include <usart.h>
              
              
              #pragma config OSC   = HS
              //#pragma config OSCS  =
              #pragma config PWRT  = ON
              #pragma config BOR   = OFF
              //#pragma config BORV  =
              #pragma config WDT   = OFF
              //#pragma config VDTPS  =
              //#pragma config CCP2MUX =
              //#pragma config STVR  =
              #pragma config LVP   = OFF
              //#pragma config DEBUG  =
              
              #define LED PORTDbits.RD2
              
              
              void serch_rx(char *buf_as);
              
              
              ////////////////////////////////////////////////////////////////////////////////
              
              
              void main( void )
              {
                
               unsigned int cont = 0 ;
               char buf[20];
                
               LED = 0 ;
               TRISA = 0b00000000 ;
               TRISB = 0b00000000 ;
               TRISC = 0b10000000 ;
               TRISD = 0b00000000 ;
               TRISE = 0b00000000 ;
              
               ADCON0bits.ADON = 0 ;
               ADCON1 = 0b00000110 ;
              
               Delay10KTCYx(100) ;
              
               OpenUSART( USART_TX_INT_OFF &
                     USART_RX_INT_OFF &
                     USART_ASYNCH_MODE &
                     USART_EIGHT_BIT &
                     USART_CONT_RX &
                     USART_BRGH_LOW,31 );
              
              
               OpenXLCD( FOUR_BIT & LINES_5X7 );
              
               while( BusyXLCD() );
               WriteCmdXLCD(DON & BLINK_OFF & CURSOR_OFF);
              
               while( BusyXLCD() );
               WriteCmdXLCD(0b00000001);//clear display
              
              //////////////////////////////////////////////////
              
               while( BusyXLCD() );
               SetDDRamAddr( 2 );
              
               while( BusyXLCD() );
               putrsXLCD( "be name KHODA" );
              
               while( BusyXLCD() );
               Delay10KTCYx(100) ;
              
               cont = 0 ;
               LED = 0 ;
               WriteCmdXLCD(0x01);//clear display
              
               while(1)
               {
              
                 if (LED == 0)
                   LED = 1 ;
                 else
                   LED = 0 ;
              
              
              
                if ( RCSTAbits.OERR == 1 )
                {
                  RCSTAbits.CREN = 0;
                  Delay10TCYx(1) ;
                  RCSTAbits.CREN = 1;
                }
              
                serch_rx((char *)buf); // serch for char 'a'
              
                
                while( BusyXLCD() );
                SetDDRamAddr( 0x00 );
              
                while( BusyXLCD() );
                putsXLCD( buf );
              
                
                while( BusyXLCD() );
                SetDDRamAddr( 40 );
                sprintf(buf,"conter = %6d ", cont);
              
                while( BusyXLCD() );
                putsXLCD( buf );
              
              
               }
              }












              این آموزش در حال کامل شدن هست :redface:

              با عرض پوزش از همگی دوستان , پروژه مهمی در دست دارم که بعد از انجام اون این آموزش رو کامل میکنم :redface:
              نا امیدی یه دروغ بزرگه که آدما به خودشون میگن
              تلاش یه حقیقت بزرگه که با صبر به ثمر میرسه

              دیدگاه


                #22
                پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

                سلام جنا ب رمضانی
                این کد ال سی دی که گذاشتی کار نمیکنه اصلا پورت های السی دی هیچ فرقی نمیکنه یعنی تو اون کتابخونه میذارم مثلا دیتا پورت رو PORT C و پین های RS , WR , E رو
                رو هر پینی میذارم هیچ فرقی نمیکنه در صورتی که پین LED رو تغییر میدم تغییر میکنه ولی اصلا LCD کار نمیکنه
                امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                دیدگاه


                  #23
                  پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

                  دیتا پوزت LCD رو هر پورتی تنظیم میکنم یعنی چه رو A وچرو C یا D و اون 3 تا پین RS , WR , E رو هم رو هر پین دیگه میذارم هیچ تغییری نمیکنه ونمیدونم چرا پورت B رو هر کاری میکنم اصلا تغییر نمیکنه همیشه از پین B.1 تا B.3 غیر فعالند چه بخروجی میکنم چه ورودیشون میکنم انگار تغییرات اعمال نمیشه ولی تو همون تابع MAIN شما اومدید پین D.3 رو LED در نظر گرفتید ومنم پین D.5 هم LED1 در نظر گرفتم و خاموش و روشن کردم خیلی خوب کار کرد ومعلومه که کامپایلر تغییرات رو اعمال میکنه ولی تو قسمت LCD و پورت B هیچ تغییری اعمال نمیشه چرا؟
                  امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                  دیدگاه


                    #24
                    پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

                    سلام

                    نوشته اصلی توسط mahdi8866
                    سلام جنا ب رمضانی
                    این کد ال سی دی که گذاشتی کار نمیکنه اصلا پورت های السی دی هیچ فرقی نمیکنه یعنی تو اون کتابخونه میذارم مثلا دیتا پورت رو PORT C و پین های RS , WR , E رو
                    رو هر پینی میذارم هیچ فرقی نمیکنه در صورتی که پین LED رو تغییر میدم تغییر میکنه ولی اصلا LCD کار نمیکنه
                    فکر میکنم منظورتون از کد ها مطالب مربوط به تغییر پورت های LCD هست.
                    بله من قصد داشتم این موضوع رو در آموزش شماره 3 توضیح بدم که هنوز فرصت نکردم تایپش کنم , اما توضبحاتی در این رابطه میدهم

                    برای حل این مشکل شما باید با فایل های هدر و فراخوانی آنها بیشتر آشنا بشین
                    فایل های هدر همیشه در ابتدای برنامه قرار میگیرن و کامپایلر قبل از انجام هر کاری ابتدا محتویات این فایل ها رو بررسی میکنه , فایل های هدر دارای محتویات خاصی هستن که تو فایل های مختلف مورد استفاده قرار میگیرن , برای مثال آرایش پین ها و یا تعریف ساختارها , فراخانی فایل های هدر بعد از #define به دو شکل انجام میشود <> یا "" این دو تا با هم یه فرق موچک اما مهم دارن , وقتی شما از <> استفاده میکنید کامپایلر برای پیدا کردن فایل هدر به دایرکتوری پیش فرض خودش میره تا این فایل پیدا کنه , در رایانه من این فایل در آدرس زیر قرار داره :

                    C:\Program Files\Microchip\mplabc18\v3.40\h


                    اما اگر از "" برای فراخانی هدر استفاده کنید کامپایلر برای پیدا کردن فایل دایرکتوری جاری را جستو جو میکند , یعنی همان فایلی کا پروژتون در اونجا ذخیره شده

                    خوب حالا به یک نکته باید توجه کنید : فایل هدر XLCD.h در تمامی فایل های C که شما به پروژتون اضافه کردین وجود داره , فایل های C را باز کنید و دقت کنید که فایل ها از کجا فراخوانی میشوند ( از <> استفاده شده یا "" )

                    همچنین به فایل اصل دقت کنید منظورم فایلی هست که در اون دستور main قرار داره.
                    همهء فایل ها رو ادیت کنید و از "" برای فراخوانی هدر استفاده کنید

                    وقتی اطمینان پیدا کردید که همه فایل ها از یک هدر استفاده میکنن اونوقت با تغییر پورت ها دیگر مشکلی ندارید

                    یک راه برای دیدن فایل هدر جاری در برنامه :


                    در فایل C مورد نظر بعد از #define بر روی نام فایل هدر مورد نظر کلیک راست کنید , در پنجره باز شده Navigate را انتخاب کرده وسپس Go to Declaration را انتخاب کنید , هدر مورد نظر باز میشود. :smile:
                    نا امیدی یه دروغ بزرگه که آدما به خودشون میگن
                    تلاش یه حقیقت بزرگه که با صبر به ثمر میرسه

                    دیدگاه


                      #25
                      پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

                      سلام
                      بله این موضوع رو میدونستم که با این <> علامت در خود پوشه کامپایلر هست و"" در پوشه پروژه اما این رو حواسم نبود که در فایل های دیگه که با پسوند C تو پروژه هست با علامت <> هست الان تغییرش دادم حالا تغییرات اعمال میشه اما تو پروتئوس با کدوم ال سی دی باید تست کرد چون با اون ال سی دی 2X16 که اسمش
                      LM016L هست که معمولا همه از این ال سی دی استفاده میکنن تستش کردم رو صفحه چیزی نشون نمیده ایا مشکلی هست؟
                      امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                      دیدگاه


                        #26
                        پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

                        سلام

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

                        دیدگاه


                          #27
                          پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

                          سلام
                          آقا من اومدم mplab x رو دانلود کردم دیدم 241 مگابایت هست هنگ کردم :eek:

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

                          دیدگاه


                            #28
                            پاسخ : MPLAB X IDE

                            سلام

                            دانلودش کنید :biggrin: ارزشش رو داره :agree:

                            به لینک زیر دقت کنید , تعدادی از امکانات اون رو میبینید


                            http://www.microchip.com/pagehandler/en-us/family/mplabx/

                            شاید وقتی میخواستین با MPLAB IDE کار کنید بار اول یک سری تنظیمات خاص دردسر ساز بود , MPLAB X IDE احتیاجی به این تنظیمات نداره و خیلی امکانات دیگه که تو لینک بالا تعدادی از اونارو میبینید


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

                            دیدگاه


                              #29
                              پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs


                              آموزش شماره 4


                              تایمر , وقفه و A/D در کامپایلر C18


                              در این آموزش ما قصد داریم به وسیله کتاب خانه C18 تایمر 0 میکرو کنترلر 18F452 را راه اندازی کرده و هر 100ms ولتاژ پین AN0 رو به وسیله A/D بخوانیم و بر روی LCD نمایش دهیم :smile:

                              این آموزش برای شما مفید تر خواهد بود , اگر فصل های 9 و 11 کتاب " میکرو کنترلر های PIC برنامه نویسی اسمبلی و C " انتشارات نص , نوشته دکتر مزیدی رو مطالعه کنید







                              کد:
                              /*************************************************************
                              *           be name KHODA             *
                              *                              *
                              * 1391.6.25                         *
                              * s.ramezani.t@gmail.com                   *
                              *                              *
                              *                              *
                              * OSC = 20Mhz                        *
                              *                              *
                              **************************************************************/
                              
                              #include <p18f452.h>
                              #include <delays.h>
                              #include <stdio.h>
                              #include "XLCD/xlcd.h"
                              #include <adc.h>
                              #include <timers.h>
                              
                              
                              #pragma config OSC   = HS
                              #pragma config OSCS  = OFF
                              #pragma config PWRT  = ON
                              #pragma config BOR   = OFF
                              //#pragma config BORV  =
                              #pragma config WDT   = OFF
                              //#pragma config VDTPS  =
                              //#pragma config CCP2MUX =
                              //#pragma config STVR  =
                              #pragma config LVP   = OFF
                              #pragma config DEBUG  = OFF
                              
                              
                              #define LED     PORTEbits.RE0
                              #define LED_tris  TRISEbits.TRISE0
                              
                              #define clear_DIS 0x01
                              
                              #define LINE_1   0x80
                              #define LINE_2   0xC0
                              #define LINE_3   0x94
                              #define LINE_4   0xD4
                              
                              void high_isr (void) ;
                              
                              
                              unsigned int ADC_RD = 0 ;
                              char buf[20];
                              
                              /*============================*/
                              
                              #pragma code high_vector = 0x08
                              void interrupt_at_high_vector(void)
                              {
                              _asm GOTO high_isr _endasm
                              }
                              #pragma code /* return to the default code section */
                              
                              
                              
                              //#pragma code low_vector=0x18
                              //void interrupt_at_low_vector(void)
                              //{
                              //_asm GOTO low_isr _endasm
                              //}
                              //#pragma code /* return to the default code section */
                              
                              
                              /*============================*/
                              
                              
                              #pragma interrupt high_isr
                              void high_isr (void)
                              {
                                //if(INTCONbits.TMR0IF == 1){
                                  LED =~ LED ;
                                  T0CONbits.TMR0ON = 0;  // STOP TMR0  <<<<<<
                                  ConvertADC();    // Start conversion
                                  while( BusyADC() ); // Wait for completion
                                  ADC_RD = ReadADC(); // Read result
                                  WriteTimer0( 3036 ); // FOR 100ms -> 62500 CLK
                                  T0CONbits.TMR0ON = 1;  // START TMR0  <<<<<<
                                  INTCONbits.TMR0IF = 0 ; // interrupt EN
                                //}
                              }
                              
                              //#pragma interruptlow low_isr
                              //void low_isr (void)
                              //{
                              ///* ... */
                              //}
                              
                              
                              /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
                              
                              
                              
                              void main( void )
                              {
                              
                               TRISA = 0b00000001 ;
                               //TRISB = 0b00000000 ;
                               //TRISC = 0b00000000 ;
                               //TRISD = 0b00000000 ;
                               //TRISE = 0b00000000 ;
                               LED_tris = 0 ;
                              
                               Delay10KTCYx(250) ;
                              
                               /*-------------------*/
                              
                               OpenXLCD( FOUR_BIT & LINES_5X7 );
                              
                               OpenADC( ADC_FOSC_2 &
                                    ADC_RIGHT_JUST &
                                    ADC_1ANA_0REF,
                                    ADC_CH0 &
                                    ADC_INT_OFF );
                               
                               OpenTimer0( TIMER_INT_ON &
                                     T0_16BIT &
                                     T0_SOURCE_INT &
                                     T0_PS_1_8 );
                              
                               T0CONbits.TMR0ON = 0;
                              
                              
                              
                               while( BusyXLCD() );
                               WriteCmdXLCD( DON & BLINK_OFF & CURSOR_OFF);
                               while( BusyXLCD() );
                               WriteCmdXLCD( clear_DIS ); //clear display
                              
                               Delay10KTCYx(250) ;
                              
                               while( BusyXLCD() );
                               WriteCmdXLCD( LINE_1 + 2 );
                               putrsXLCD( "be name KHODA" );
                              
                              
                               /*-------------------*/
                              
                               INTCONbits.GIE = 1 ;
                              
                               WriteTimer0( 3036 ); // FOR 100ms -> 62500 CLK
                               T0CONbits.TMR0ON = 1;
                              
                              
                               while(1)
                               {
                              
                                sprintf(buf,"ADC = %4d V", ADC_RD);
                              
                                while( BusyXLCD() );
                                WriteCmdXLCD( LINE_2 );
                                putsXLCD( buf );
                              
                               }
                              
                              }
























                              با عرض پوزش از همگی دوستان , پروژه مهمی در دست دارم که بعد از انجام اون این آموزش رو کامل میکنم
                              :arrow:
                              نا امیدی یه دروغ بزرگه که آدما به خودشون میگن
                              تلاش یه حقیقت بزرگه که با صبر به ثمر میرسه

                              دیدگاه


                                #30
                                پاسخ : آشنایی با کامپایلر MPLAB C Compiler for PIC18 MCUs

                                سلام

                                ممنونم از لطف شما , خوشحالم از اینکه این اموزش ها تا به اینجا مفید بودن , اما آخه من کلا چیزی از مستر کنفرانس نمیدونم و کلا بعد از پیام شما با این موضوع آشنا شدم :redface:

                                یکم سرچ کردم لینک زیر رو به دست آوردم , یه تعدادی فیلم آموزشی داخلش است که کیفیت پایینی دارن , نمیدونم آیا منظور شما همینا بودن ؟ :question:
                                البته اگر VPN شما فعال نباشه لینک دانلود رو نمیبینید :arrow:

                                http://www.microchip.com/Microchip.webcontent.provider/Video.aspx?id=JQyEkQzOrNY
                                نا امیدی یه دروغ بزرگه که آدما به خودشون میگن
                                تلاش یه حقیقت بزرگه که با صبر به ثمر میرسه

                                دیدگاه

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