اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام و تشکر برای آموزشهای بینظیرتون
    آیا این کامپایلر توابعی برای کار با MMC و Fat دارد؟
    اگر داشته باشه که خیلی عالی میشه
    اگر این قابلیت وجود دارد از شما خواهشمندم که به این موضوع مهم در آموزش بعدیتان بپردازید.
    سپاس...

    دیدگاه


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

      سلام

      نوشته اصلی توسط Mr.Yaghoubi
      آیا این کامپایلر توابعی برای کار با MMC و Fat دارد؟
      این کامپایلر در بین کامپایلر های PIC کاملترین کتاب خانه رو داره , شما برای کار کردن با انواع حافظه , توابع و کتاب خانه های آماده زیادی به همراه چندین فایل هلپ پیدا میکنید
      و نکته جالب اینجاست که همگی این کتاب خانه ها open source هستن

      نام این کتاب خانه جامع و ارزش مند Microchip Application Libraries هست

      این کتاب خانه را به همراه فایل هلپ Microchip Application Libraries Help Files میتوانید از لینک زیر دانلود کنید ( امکان دانلود فقط با vpn وجود داره )
      http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680& dDocName=en547784

      میکروچیپ هر وقت حوصلش سر میره این کتاب خانه رو پدیت میکنه :biggrin:

      من آخرین پدیتی رو که داشتم برای دوستان پلود کردم تا بدون vpn بتوانید آن را دانلود کنید


      کتاب خانه :
      http://fadak-srt.persiangig.com/document/lib/microchip-application-libraries-v2012-04-03-windows-installer.exe

      فایل هلپ :
      http://fadak-srt.persiangig.com/document/lib/Microchip_Application_Libraries_v2012-04-03_Help_Files.zip


      همچنین برای کار کردن با MMC/SD باید PDF زیر رو مطالعه کنید

      http://fadak-srt.persiangig.com/document/pdf/01045b.pdf

      کتاب Sd Card Projects Using the Pic Microcontroller نوشته Dogan Ibrahim آموزش کامل در این رابطه هست
      نا امیدی یه دروغ بزرگه که آدما به خودشون میگن
      تلاش یه حقیقت بزرگه که با صبر به ثمر میرسه

      دیدگاه


        #33
        پاسخ :پروژه های عملی با PIC در MPLAB

        پروژه اول:ساعت و نمایشگر در مد 4 بیت
        سلام
        بعد از گذشت چندین هفته از ماه رمضان ، امروز نحوه راه اندازی ds1307 توسط پروتکل I2c و همچنین راه اندازی lcd 16*2 در مد چهاربیت با بیتهای دلخواه از هر پورت رو با هم مرور کنیم.
        این قسمت رو با این بهونه شروع کردم که تجربیات عملی و کار با تراشه های متفاوت رو با همراهی هم شروع کنیم و نهایتا بیشتر یاد بگیریم و اگر دوستانی هم مشکلی با این تراشه ها و یا دیگر تراشه ها داشتن در اینجا مطرح کنن که تاپیک از نظر بار علمی هر روز پیشرفت بیشتری داشته باشه و علاوه بر آن بیشتر تجربیات و گاهی ها رو منتقل کرده باشیم البته در نظر داشته باشین چون بار علمی یا توضیحات هر پروژه برای گاهی ابتدایی می تونه زیاد باشه پیشنهاد می کنم درسها و آموزشهای این تاپیک رو کامل مرور کرده باشین و نهایتا اشکالات مرتبط با پروژه رو بپرسین تا حجم و زیادی مطلب باعث رنجش دیگران یا افت بار علمی و هدف اولیه نشود.

        همانطور که می دونین از ارتباطات I2C برای ارتباط بین تراشه ای در حد برد مدار چاپی و یا در مواقعی بسیار کم در فواصل دوربرد استفاده می شه و خوبی این پروتکل اتصالی ، اتصال تعداد زیادی تراشه با آدرسهای متفاوت به دو پین میکرو هست که علاوه بر کاهش پیچیدگی مدار ، ارتباط بین میکرو و دیگر دستگاهها را راحتتر میسر می سازد.در این پروتکل برای ایجاد یک ارتباط بین تراشه میکرو و تراشه مقصد ابتدا باید آدرس مقصد (آدرس نوشتن یا خواندن از مقصد)رو بر روی خط قرار داد و نهایتا ریجستر مقصد را خواند یا بر روی آن نوشت.در این پروژه ما از تراشه ds1307 برای ایجاد یک RTC استفاده کرده ایم.در زیر نمای شماتیک مدار رو می بینین.

        در عکس مشاهده می کنین که lcd توسط یک پورت و به راحتی در انتخاب پین برای هر یک از خطوط کنترلی rs , en یا داده ها d4-d7 به میکرو متصل شده است که کتابخانه آن در زیر قابل دریافت هست
        http://eca.ir/sharing/uploads/13451250401.rar
        برای پیکربندی lcd به این صورت ابتدا فایل دریافتی رو در پروژه import کنین (در جلسات قبل توضیح داده شده است نحوه import کردن) و سپس دستور زیر رو به فایل سورس خود اضافه کنین

        کد:
        #include "LCD1.h"


        حال به فایل lcd1.h مراجعه کنین

        کد:
        #define rs PORTBbits.RB4
        #define en PORTBbits.RB5
        #define rsts TRISBbits.RB4
        #define ents TRISBbits.RB5


        در این قسمت باید مشخص کنین که پایه های rs , en ال سی دی به کدام پین میکرو وصل هستن و TRSI آنها هم مطابق PORT انها باید یکی باشد

        کد:
        #define d4 PORTBbits.RB0
        #define d5 PORTBbits.RB1
        #define d6 PORTBbits.RB2
        #define d7 PORTBbits.RB3
        
        #define td4 TRISBbits.RB0
        #define td5 TRISBbits.RB1
        #define td6 TRISBbits.RB2
        #define td7 TRISBbits.RB3


        در این قسمت هم باید بگین که پایه های d4 تا d7 ال سی دی به کدام پایه میکرو متصل است که مطابق روشهای پیشین باید PORT و TRIS آنها یکی باشد

        تمام شد حالا دستورات جسله زیر رو می تونین به راحتی روی ال سی دی تون پیاده سازی کنین
        http://www.eca.ir/forum2/index.php?t...8595#msg378595
        خوبی این کتابخانه نوشته شده بر کتابخانه های دیگه

        4 بیتی بودن آن
        انتخاب دلخواه پینهای rs و en و d4-d7 از هر پورت و پین دلخواه که به صورت دیجیتال پیکربندی می شود هست

        حالا برای راه اندازی ds1307
        ابتدا مدار بالا رو می بندیم

        توابع زیر رو به برنامه اضافه می کنیم

        کد:
        void WriteDs(unsigned char dat)
        {
          signed char states,pert;
          states=WriteI2C(dat);
          while(states==-1)
          {
            pert=SSPBUF;
            SSPCON1bits.WCOL=0;
            states=WriteI2C(dat);
          }
          while(SSPCON2bits.ACKSTAT);
        }
        
        
        unsigned char ReadDs(){
          unsigned char datas;
          SSPCON2bits.RCEN=1;
          while(!SSPSTATbits.BF);
          datas=SSPBUF;
        return datas;
        }
        
        unsigned char dectobcd(unsigned char num)
        {
          unsigned char temp1;
          unsigned char temp2;
          temp1=(num/10)<<4;
          temp2=num%10;
          temp1=temp2 | temp1;
          return temp1;
        }
        void setpoint(unsigned char hour,unsigned char minute,unsigned char second,unsigned char year,unsigned char month,unsigned char date,unsigned char day){
        hour = dectobcd(hour);
        minute = dectobcd(minute);
        second = dectobcd(second);
        year = dectobcd(year);
        month = dectobcd(month);
        date = dectobcd(date);
        day=dectobcd(day);
        
        StartI2C();
        WriteDs(0xd0);
        WriteDs(0);
        WriteDs(second);
        WriteDs(minute);
        WriteDs(hour);
        WriteDs(day);
        WriteDs(date);
        WriteDs(month);
        WriteDs(year);
        WriteDs(0b10010000);
        StopI2C();
        }
        
        
        
        
        
        unsigned char second(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x00);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char minute(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x01);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char hour(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x02);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        
        unsigned char day(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x03);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char date(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x04);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char month(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x05);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char year(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x06);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char bcdtodec(unsigned char n)
        {
          unsigned char x1;
          unsigned char x2;
            x1=n & 0x0f;
            x2=(n>>4)*10;
            x1=x1+x2;
        return x1;
        }


        وظایف توابع :

        WriteDs:می تونین بیاتی رو بر روی ds1307 بنویسین
        ReadDs:بایتی رو از ds1307 می خوانین
        dectobcd:تبدیل اعداد دسیمال به باینری کد شده BCD
        bcdtodec:تبدیل bcd به اعداد دسیمال
        setpoint: تعیین ساعت ، دقیقه ، ثانیه ، سال ، ماه ، روز سال ، روز هفته و خروجی پالس ds1307
        توابع second تا year همانطور که از اسمشون پیدا هست مقدار ثانیه و ... تا سال رو براتون از ds1307 می خونه و به صورت bcd در اختیار شما قرار می ده که شما می توانین با استفاده از تابع bcdtodec اعداد به دست آمده رو به اعداد دسیمال تبدیل کنین.

        حالا برای شروع کار باید زمان و تاریخ رو تنظیم کنیم که همانطور که در زیر می بینین توسط تابع setpoint این کار صورت می گیرد


        کد:
          //void setpoint(hour,minute,second,year,month,date,day)
          setpoint(16,41,20,12,8,16,6);


        در دستور بالا زمان رو برابر 16:14:20 و تاریخ رو برابر 2012:8:16 تنظیم کرده ایم به یاد داشته باشین که برای تنظیم سال نیازی به وارد کردن 20 ندارین و تنها عدد 12 رو وارد می کنین و روز رو برابر 6 قرار دادین (که برای ما ایرانی ها یعنی پنجشنبه)

        در خط زیر زمان رو نمایش می دهیم

        کد:
          locate(1,1);
          sprintf(msg,"%d:%d:%d  ",bcdtodec(hour()),bcdtodec(minute()),bcdtodec(second()));
          lcdprint(msg);


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

        برای نمای تاریخ هم به این صورت عمل شده است


        کد:
          locate(2,1);
          sprintf(msg,"20%d:%d:%d Day:%d ",bcdtodec(year()),bcdtodec(month()),bcdtodec(date()),bcdtodec(day()));
          lcdprint(msg);


        تنها نکته باقی مانده تنظیم کلاک یا به قول دیتاشیت بادریت ارتباط I2C هست که برای چنین کاری باید از ریجستر SSPADD کمک بگریم چون مطابق دیتاشیت قطعه ds1307 فرکانس کاری باید 100 کیلوهرتز باشد توسط فرمول زیر مقدار ریجستر ذکر شده رو به دست می یاریم(این مقدار برابر 9 شده است)


        و برای پیکربندی کلی ارتباط I2C عبارت زیر رو می افزاییم


        کد:
        //Configure I2C in Master mode and 100Khz
        OpenI2C(MASTER, SLEW_OFF);
        SSPSTATbits.CKE=0;
        SSPADD = 0x09;
        TRISCbits.RC3=0;
        TRISCbits.RC4=0;
        ///


        همانطور که در بالا مشاهده می کنین از یکی از توابع آماده میکروچیپ استفاده شده است(OPENI2C) که بدین منظور باید کتابخانه i2c.h رو نیز include کرد پس برنامه کلی به صورت زیر خواهد بود


        کد:
        
        #include <p18f452.h>
        #include <delays.h>
        #include<stdio.h>
        #include <usart.h>
        #include<I2C.h>
        #include "LCD1.h"
        
        
        #pragma config OSC=HS
        #pragma config WDT=OFF
        #pragma config PWRT=ON
        #pragma config LVP=OFF
        
        unsigned char x;
        unsigned char x3;
        unsigned char x4;
        
        void WriteDs(unsigned char dat)
        {
          signed char states,pert;
          states=WriteI2C(dat);
          while(states==-1)
          {
            pert=SSPBUF;
            SSPCON1bits.WCOL=0;
            states=WriteI2C(dat);
          }
          while(SSPCON2bits.ACKSTAT);
        }
        
        
        unsigned char ReadDs(){
          unsigned char datas;
          SSPCON2bits.RCEN=1;
          while(!SSPSTATbits.BF);
          datas=SSPBUF;
        return datas;
        }
        
        unsigned char dectobcd(unsigned char num)
        {
          unsigned char temp1;
          unsigned char temp2;
          temp1=(num/10)<<4;
          temp2=num%10;
          temp1=temp2 | temp1;
          return temp1;
        }
        void setpoint(unsigned char hour,unsigned char minute,unsigned char second,unsigned char year,unsigned char month,unsigned char date,unsigned char day){
        hour = dectobcd(hour);
        minute = dectobcd(minute);
        second = dectobcd(second);
        year = dectobcd(year);
        month = dectobcd(month);
        date = dectobcd(date);
        day=dectobcd(day);
        
        StartI2C();
        WriteDs(0xd0);
        WriteDs(0);
        WriteDs(second);
        WriteDs(minute);
        WriteDs(hour);
        WriteDs(day);
        WriteDs(date);
        WriteDs(month);
        WriteDs(year);
        WriteDs(0b10010000);
        StopI2C();
        }
        
        
        
        
        
        unsigned char second(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x00);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char minute(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x01);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char hour(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x02);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        
        unsigned char day(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x03);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char date(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x04);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char month(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x05);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        unsigned char year(void){
        unsigned char pert;
        pert=0;
         StartI2C();
         WriteDs(0xd0);
         WriteDs(0x06);
         RestartI2C();
         WriteDs(0xd1);
         pert=ReadDs();
         StopI2C();
         return pert;
        }
        
        
        
        unsigned char bcdtodec(unsigned char n)
        {
          unsigned char x1;
          unsigned char x2;
            x1=n & 0x0f;
            x2=(n>>4)*10;
            x1=x1+x2;
        return x1;
        }
        
        void main(void){
        unsigned char msg[17];
        
        //Configure I2C in Master mode and 100Khz
        OpenI2C(MASTER, SLEW_OFF);
        SSPSTATbits.CKE=0;
        SSPADD = 0x09;
        TRISCbits.RC3=0;
        TRISCbits.RC4=0;
        ///
        
          lcdinit();
          cls();
          locate(1,1);
          sprintf(msg,"Setting Time");
          lcdprint(msg);
          Delay10KTCYx(50);
          //void setpoint(hour,minute,second,year,month,date,day)
          // setpoint(16,41,20,12,8,16,6);
          locate(1,1);
          cls();
          sprintf(msg,"Finished");
          lcdprint(msg);
          Delay10KTCYx(100);
        
          while(1)
          {
          locate(1,1);
          sprintf(msg,"%d:%d:%d  ",bcdtodec(hour()),bcdtodec(minute()),bcdtodec(second()));
          lcdprint(msg);
          locate(2,1);
          sprintf(msg,"20%d:%d:%d Day:%d ",bcdtodec(year()),bcdtodec(month()),bcdtodec(date()),bcdtodec(day()));
          lcdprint(msg);
          Delay10KTCYx(10);
          }
        }



        1-در صورت عدم کارکرد صحیح مدار ، خروجی پایه 7 تراشه ds1307 رو با یک LED یا اسکوپ مانیتور کنین که باید فرکانس 1 هرتز رو در خروجی این پایه مشاهده کنین در صورت عدم مشاهده نسبت به درست بودن اتصالات بین میکرو و ds1307 و همچنین اطمینان از وضعیت ds1307 ، وضعیت میکرو و بایاس های آنها اطمینان حاصل کنین

        2-در صوتی که بعد از قطع برق تراشه مقدار خود را نگه نداشته (البته با حذف دستور setpoint بعد از یکبار مقدار دهی تراشه) باید نسبت به درست بودن باتری و مقدار ولتاژ آن اطمینان حاصل کنین ( با باتری مادر برد این تراشه حدود 5 سال براتون مطابق توضیحات دیتاشیت ds1307 بدون کوچکترین نقصی شمارش می کنه که منم با تست کردن دو روزه ام به این نتیجه رسیدیم :biggrin: :mrgreen
        هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

        دیدگاه


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

          از راهنماییهای شما بسیار سپاسگذارم
          بخش PIC همین تاپیک رو کم داشت. الان برای AVR پی دی اف های خیلی خوبی جمع شده که اگر در اینجا سه چهارتا پروژه دیگه توسط شما اساتید قرار بگیره من فکر میکنم فرصت خوبی برای قرار دادن و تنظیم کردن این مطالب در قالب PDF باشه تا یادگیری فوق العاده راحت تر بشه و رغبت دوستان برای مهاجرت از AVR به PIC بیشتر بشه

          دیدگاه


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

            سلام جناب Mr.Yaghoubi ، خواهش می کنم
            هر یک از قسمت های سایت رو باید سپاسگذار شخصی بود که بهترین و بیشترین راهنمایی برای دوستان هست همانطوری هم که دیدین اولین شخصی که به سوالات شما پاسخ داد جناب ramezani.t هست که باید ادامه این آموزشها و پاسخ و پرسشها سپاسگذار ایشون باشیم ، منم به نوبه ی خودم سعی ام این هست که بتونم این تایپک رو جامع کنم و مثل خودم که از زبان بیسیک و AVR به سمت C و PIC اومدم بقیه دوستان هم با این آموزشها و پرسش و پاسخها راحتتر بتونین این میکرو و قدرتش رو به راحتی یاد بگیرن
            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

            دیدگاه


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

              با عرض سلام خدمت همه دوستان @};-

              ممنونم از لطف شما جناب baby_1

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

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

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

              در کل من معتقدم که جناب baby_1 در این رابطه وقت بیشتری قرار دادن
              و من هم از ایشان متشکرم

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

              انشاالله

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

              دیدگاه


                #37
                پاسخ :پروژه دوم:کار با پورت USB و نوشتن بر روی آن در MPLAB و C18

                پروژه دوم:کار با پورت USB و نوشتن بر روی آن
                در این جلسه قصد داریم پیکربندی و استفاده اولیه از این پورت رو یاد بگیریم.امروز صبح طرفای ساعت 11:30 با خودم قرار بستم که امروز پورت USB رو برای تراشه PIC18f4550 باید راه اندازی کنم سایت های زیادی رو دیدم و بیشتری منابع در رابطه با یادگیری این بخش رو مررور کردم اما متاسفانه همه منابع یا کم گفته بودن یا ناقصی خیلی زیادی داشتن .بابت همین هم سرخورده به سراغ خواندن داکیومنت ها و کتابخانه های میکروچیپ رفتم و نهایتا با 15 دقیقه کار با این کتابخانه ها به جواب رسیدم(واقعا افسوس که چند ساعت سرچ کردم و نهایتا با 15 دقیقه مطالعه رفرنسهای میکروچیپ به جواب رسیدم).حالا شروع می کنیم برای یادگیری

                برای این منظور باید از تراشه هایی از خانواده PIC استفاده کنیم که قابلیت پورت USB رو ذاتا دارن(اگر نداشته باشن این درس رو نمی تونین انجام بدین و نهایتا باید از تراشه ها یا ماژولهای مبدل استفاده کنین) به طبع من تراشه pic18f452 رو تغییر می دم و pic18f4550 که تقریبا شبیه تراشه قبلی هست رو بر می گزینم و انتخاب اصلیم برای کار با این تراشه منوط به داشتن قابلیت USB به صورتی ذاتی هست.مدار رو به صورت زیر پیکربندی می کنیم(همانطور که می بینین نیازی به منبع تغذیه نیست و ما کل برق برد رو از پورت USB دریافت می کنیم)

                ابتدا این فایل رو بر روی میکرو بریزین و میکرو رو ریست کنین و ببینین کامپیوتر تراشه تون رو به صورت USB HID می شناسه یا خیر که تا اینجا از عملکرد صحیح برد و اتصالات مطمئن بشین.
                http://eca.ir/sharing/uploads/13452213501.rar
                اگر از ویندوز سون استفاده می کنین به این قسمت مراجعه کنین
                Start->Devices and Printers
                حالا اگر در پایین پنجره عکس زیر رو دیدن پس تا اینجا همه چی درست هست

                حالا برای آخرین اطمینان برنامه زیر رو دانلود و اجرا کنین(برای اجرا شدن حتما باید .net فریم ورک روی کامپیوتر شما نصب شده باشد)در صورت برقراری کامل اتصالات پنجره زیر
                http://eca.ir/sharing/uploads/13452219541.rar


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

                شروع برنامه نویسی
                پروژه ای برای تراشه PIC18f4550 ایجاد کنین
                فایل زیر رو دانلود و در پوشه برنامه از حالت فشرده خارج کنین(بنابراین پوشه ای خواهین داشت به اسم usb که محتویات آن فایل های هدر و سورس هستن)
                http://eca.ir/sharing/uploads/13452214891.rar
                حالا تمامی فولدر رو به برنامه تون import کنین
                فایل زیر رو دانلود و آن را نیز import کنین
                http://eca.ir/sharing/uploads/13452215541.rar
                حالا در فایل سورس به نام main رفته و در قسمت تابع main می تونین دستورات خود رو مثل سابق بنویسین(اگر دقت کرده باشین توضیحات انگلیسی رو حذف نکردم تا دقیقا کار هر قسمت یا وظیفه اش رو بدونین اگر می بینین بدردتون نمی خوره یکجا توضیحات رو حذف کنین تا برنامه خیلی خلوت بشه)

                تابع InitializeSystem(); همانند توابع دیگه که همه جا خوندین برای آماده سازی میکرو هست پس بنابراین یکبار نیاز به صدا کردن این تابع نخواهین داشت
                تابع USBDeviceTasks() مداوم وضعیت ریجسترها و درخواستهای usb رو چک می کنه تا در صورت متصل شدن میکرو به کامپیوتر خود رو به کامپیوتر بشناسه
                تابع ProcessIO(); هم همینجوری میکروچیپ ایجاد کرده که شما دستوراتتون رو به جای اینکه در main بنویسین و با زیاد شدن حجم برنامه وحشت کنین در این قسمت کارهای مورد نیازتون رو می نویسین و انجام می دین البته هم من و هم میکروچیپ در این تابع مقدارهای دریافتی رو تجزیه و تحلیل می کنیم :mrgreen: یعنی اگر داده ای از راه برسد همیشه یک led با تغییر وضعیت بیانگر داده رسیده هست و اگر داده ای رسیده باشد این شرط برقرار شده

                کد:
                if(!HIDRxHandleBusy(USBOutHandle))

                و شما می تونین از داده های رسیده استفاده کنین
                داده های شما به ترتیب در آرایه ای 65 بایتی ریخته می شود که اولین عنصر آرایه اولین بایت رسیده تا تا آخر (بایت های خالی با عدد 255 پر می شون)(آرایه ReceivedDataBuffer)

                کد:
                  switch(ReceivedDataBuffer[0])

                در این قسمت بایت اول رو با شرطهای switch چک می کنیم و بر اساس آن یا led دیگر رو خاموش و یا روشن و یا داده های دریافتی روی lcd نمایش می دهیم
                کد 64 هگز بیانگر خاموش کردن led هست
                کد 65 هگر بیانگر روشن کردن led هست
                کد 63 هگز در ابتدای یک رشته بیانگر دریافت رشته و در مکان دوم آرایه 65 بایتی تعداد بایت های دریافتی هست(هر بایت بیانگر یک کارکتر هست)
                دستور

                کد:
                USBOutHandle = HIDRxPacket(HID_EP, (BYTE*)&ReceivedDataBuffer, 64);

                به کامپیوتر می فهماند که مجددا آماده دریافت داده هست
                در بایت دوم آرایه دریافتی یعنی ReceivedDataBuffer[1] تعداد کارکترهای دریافتی رو به دست می یاریم و با یک حلقه تمامی بایت ها رو دریافت و در متغییر msg جهت نمایش بر روی lcd می ریزیم
                فکر کنم دیگه مشکلی با usb نداشته باشین و به راحتی و به کمک usb hid بدون نصب هیچگونه درایوری میکرو رو متصل به کامپیوتر کردین

                برای شناسایی ترتیب پایه های usb می تونین به آدرس زیر مراجعه کنین

                http://en.wikipedia.org/wiki/Pinout#USB%20pinout

                توضیحات تکمیلی:
                کریستال مورد استفاده 20 مگاهرتز هست که البته می تونین با 4 مگاهرتز هم کار کنین ولی باید مطابق دیاگرام کلاک میکرو چنین بیتهای مورد نظر برای ساخت فرکانس 48 مگاهرتز PLL رو تنظیم کنین بیت های مورد نظر

                کد:
                    #pragma config PLLDIV  = 5     // (20 MHz crystal on PICDEM FS USB board)
                    #pragma config CPUDIV  = OSC1_PLL2  
                    #pragma config USBDIV  = 2     // Clock source from 96MHz PLL/2
                    #pragma config FOSC   = HSPLL_HS


                در ابتدای تابع main من خروجی بودن پایه های میکرو جهت اتصال دو led تعیین کردم

                کد:
                  TRISBbits.RB5=0;
                  PORTBbits.RB5=0;
                  TRISBbits.RB4=0;
                  PORTBbits.RB4=0;



                برای ارتباطات usb میکرو رو پیکربندی و lcd رو برای نمایش حالت ابتدایی پیکربندی کرده ام

                کد:
                  InitializeSystem();
                
                  lcdinit();
                  cls();
                  locate(1,1);
                  sprintf(msg,"Started");
                  lcdprint(msg);
                  Delay10KTCYx(200);


                تابع void ProcessIO(void) هم انتهای هر بار اجرای تابع main ریجسترهای usb رو چک می کنه و اطمینان از داده های رسیده رو حتمی می کنه بنابراین سعی کنین در اسرع وقت این تابع رو اجرا کنین تا کامپیوتر منتظر برای ارسال داده نماند و ارتباط سریعتر و بهتری داشته باشین
                هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                دیدگاه


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

                  جناب baby_1 توضیحات شما واقعا کامل و عالی بود. ممنون
                  وچندتا سوال:
                  اون برنامه .net رو با چه زبانی نوشته بودید؟ و اگر امکانش هست توضیح بدید که چطور تونستید در محیط برنامه نویسی با پورت USB ارتباط برقرار کنید؟
                  حالا که این پروژه USB رو قرار دادید اگه امکانش هست در مورد ارتباط با حافظه های MMC و نوشتن و خواندن اطلاعات از اونها هم پروژه ای قرار بدید چون این دوتا قابلیت USB و MMC در کنار هم خیلی خوب میشه.

                  دیدگاه


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

                    سلام
                    ان شالله که این آموزشها بتونه مفید و مورد استفاده واقع بشه
                    زبان برنامه نویسی VB تحت پلت فرم دات نت هست برای اتصال بین کامپیوتر و سخت افزار شما به یک VID/PID احتیاج دارین که باید هم در برنامه نویسی هم در تراشه یکی باشد تا بتونین یک کد شناسایی و رابط ایجاد کرده باشین این کد ها رو می تونین در سورس تراشه در فایل usb_descriptors تعریف و تغییر بدین(توضیحات انگلیسش هم جلوی خط مربوطه نوشته شده) و در هم برنامه ایجاد کنین.اکثر من دیدم که با #C برای این مظور کار می کنن که در کتابخانه های میکرو چپ در پوشه USB نمونه برنامهای تحت دات نت رو مطالعه کنین

                    من ان شالله اگر برسم ساخت کالر ای دی رو شروع می کنم و سپس MMC اما تنها مسئله ای که هست یه مدت نمی رسم و مجددا مثل تاخیر قبلی ، با تاخیر ادامه مبحث ها رو دنبال می کنیم.البته امیدوارم بقیه دوستان هم تجربیاتشون رو قرار بدن تا هم من و دیگر دوستان از تجربیات همدیگر بیشتر و مفید تر استفاده کنیم و مشکلاتی یا ابهاماتی که پیش می یاد رو با کمک هم حل کنیم

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

                    دیدگاه


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

                      با سلام خدمت شما این پروژه راه انداز ی rfm70 با pic18f4610 که با mplab8.10 انجام شده کسی میتونه اونو واسه 18f452 باز نویسی کنه ؟ممنون از لطفتون :wow:
                      http://www.crazyengineers.com/community/attachments/wireless-on-pic18f4610-slave-part-zip.1501/

                      اضافه شده در تاریخ :
                      مرسی بچه ها مشکل حل شد . سلام اقای baby-1 با تشکر از آموزشاتون من از پروگرمر pickit2 استفاده می کنم ولی mplab اون نمیشناسه باید چیکارکنم
                      دوستای دیگه کسی نظری نداره؟
                      started: Could not connect to tool hardware: PICkit2PlatformTool, com.microchip.mplab.mdbcore.pickit2.PICkit2DbgTool Manager

                      دیدگاه


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

                        سلام
                        بسیار خوشحالم که مشکلتون حل شد
                        شما با MPLAB IDE 8 کار می کنین؟پیشنهاد می کنم که MPLABx رو دانلود و با این نسخه جدید کار کنین
                        در نسخه شما ابتدا باید پروگرمر رو تعریف کنین

                        سپس تراشتون رو انتخاب کنین

                        و مطمئن باشین که برنامه PICkit 2 اجرا نیست و تراشه بر روی پروگرمر قرار دارد ، حالا تست کنین

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

                        دیدگاه


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

                          سلام اقا baby_1 ببخشید این دستورات میشه بگید معنیش چیه؟
                          کد:
                          __CONFIG(0x3fd4);  
                              OSCCON = 0X70;	// 8M crystal
                          	WDTCON = 0X00;
                          اگه بخوام کریستال 20 مگا استفاده کنم 0x70 رو باید به چند تغییر بدم
                          یه سوال دیگه میشه در مورد اینتراپت خارجی و تایمر2 یه مثال بزنید او ل برنامه pragma# واسه اینتراپتم لازمه ؟
                          مرسی

                          دیدگاه


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

                            سلام
                            دقیقا تراشتون رو معرفی می کنین؟
                            WDTCON این ریجستر باعث شروع یا عدم فعالیت تایمر نگهبان میکرو(جلوگیری از هنگ شدن دائم میکرو می شود) می شود که با مقدار دهی 0 به تمامی بیتهای آن این تایمر غیرفعال می شود
                            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                            دیدگاه


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

                              ممنون از پاسختون مهندس تراشه مورد استفاده pic18f452 است.(config(0xd34_ یعنی چی ؟

                              دیدگاه


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

                                سلام آقا سعید
                                این روش تنظیم متغییرها در MPLAB های پیشین رایج بوده و دیگه پشتیبانی نمی شه و از روش #pragma config باید ریجسترهای اولیه میکرو رو ست کنین ، به عنوان مثال ریجستر تنظیم فرکانس ورودی ، خاموش و روش کردن سگ نگهبان و ... که برای این منظور می تونین این پست رو برای نحوه استفاده مطالعه داشته باشین

                                http://www.eca.ir/forum2/index.php?topic=65092.msg375505#msg375505
                                هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                                دیدگاه

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