اطلاعیه

Collapse
No announcement yet.

i2c نرم افزاری و ds1307

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

    i2c نرم افزاری و ds1307

    با سلام خدمت دوستان.
    من با i2c نرم افزاری c18 خواستم یک فرکانس 1 هرتز رو رو پایه ی out ای سی ds1307 ایجاد کنم.کد من هم بصورت زیر هست.سوالی که دارم اینه که :
    من اول جای SWRestartI2C(); از SWStartI2C(); استفاده کردم.ولی کار نمیکرد.چرا؟ایا کلا باید تو راه اندازی i2c نرم افزاری یا i2c ابتدا یک بار ری استارت کنیم ؟یا این مورد تنها مربوط میشه به ds1307 ؟در ضمن تو ی مثال sw_i2c از MPLAB_C18_Libraries.pdf ری استارت نکرده؟! oo:
    کد:
    #include <P18f4550.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <delays.h>
    #include "sw_i2c.h"
    
    //*****************************************
    
    #pragma config WDT=OFF
    #pragma config FOSC=HS// our crystal is 4 MHZ
    #pragma config CPUDIV=OSC1_PLL2
    #pragma config LVP=OFF
    //*****************************************
    unsigned char var=0;
    //***************************************
    void main(void)
    {
     ADCON1=0X0F; //All analog port are digitaled
    // check out the memory model & linker & header & lkr
    
     SWRestartI2C();
     //SWStartI2C();
     var=SWPutcI2C(0xD0);// control byte
     SWAckI2C();
     var=SWPutcI2C(0x07); // word address
     SWAckI2C();
     var=SWPutcI2C(0x10); // data
     SWAckI2C();
     SWStopI2C();
    
    }
    ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ‌فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
    شهید دکتر مصطفی چمران

    #2
    پاسخ : i2c نرم افزاری و ds1307

    سلام دوست من
    ببینید پروتکل i2c کلا برای نوشتن در قطعه باید مراحل زیر اجرا بشه
    1-استارت
    2-ادرس قطعه برای نوشتن
    3-ادرس حافظه قطعه برای نوشتن
    4-دیتای مورد نظر
    5-استاپ
    حالا این برای تمام قطعه های i2c ثابته
    و چه سخت افزاری چه نرم افزاری باید این مراحل انجام بشه
    فقط در نرم افزاری باید حواستون به اکنالیج ها باشه گه در سخت افزاری خودش اینکارو میکنه.
    امیدوارم سوالتونو درست متوجه شده باشم :redface:
    راجبه ریستارت هم بیشتر در خواندن استفاده میشه
    مراحل خوندن هم به شکل زیره
    1-استارت
    2-ادرس قطعه برای نوشتن
    3-ادرس حافظه قطعه برای خواندن
    4-ریستارت
    5-ادرس قطعه جهت خواندن
    6-خواندن دیتای مورد نظر
    7-استاپ
    جواب بعضي حرفا فقط يه نفس عميقه ، بذار تو دلت بمونه...

    دیدگاه


      #3
      پاسخ : i2c نرم افزاری و ds1307

      به به سلام دوست گلم ...علی جون خوبی ؟خَشِت میگذره؟
      حقیقتش این موضوع به طور غیر منطقی به نتیجه رسید.یعنی حقیقتش من دلیل منطقی براش پیدا نکردم.اینو حتی از بربچ واقعا اینکاره باز (کسایی که چندین سال فقط پیک کارکردنو غولن برا خودشون)پرسیدم .متاسفانه همشون در کمال ناباوری به بنده پیشهاد دادن که هیچ وقت از کتابخونه های میکروچیپ استفاده نکن.این درحالی بود که من همیشه میگفتم بالاخره این کتابخونه توسط کسایی نوشته شده که خودشون کارمنده سازنده ی میکرو هستن.به یکیشونم که اینو گفتم یارو به طعنه گفت این کتابخونه ها رو بنظر میاد یه چند تا بچه نوشتن :eek: oo:
      خلاصه امر اینکه سیدم اینو نوشته بود یه چک با برنامه اون که کردم به این نتیجه رسیدیم در ابتدا اگر بجای استارت از ریستارت استفاده بشه کار میکنه .من حتی سورس کتابخونه رو هم بررسی کردم ولی باز نفهمیدم چرا چرا با استارت کار نمیکنه!!
      اون سایتی هم گفتم اینه :
      http://picforum.ric323.com/viewtopic.php?f=45&t=79
      خوندن نظرات اونا خالی از لطف نیست.بعضا نکات جالبی گفتا :wow: :read:
      ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ‌فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
      شهید دکتر مصطفی چمران

      دیدگاه


        #4
        پاسخ : i2c نرم افزاری و ds1307

        سلام و تشکر
        این حرفتون رو قبول ندارم
        درسته کتابخونه هاشو زیادی پیچونده ولی اگه دقیق واسه کارت درستش کنی کار میکنه
        البته i2c نرم افزاریش من یه ایراد ازش گرفتم و اونم در موقع خوندن دیتا اکنالیج یا نات اکنالیجو نمیشه فرستاد که خب در بعضی مواقع باعث افزاریش کدت میشه
        این حرفو خیلی از دوستای دیگه هم بهم زدن که کتابخونه هاش درست کار نمیکنه ولی من تا الان فقط همین ایرادو تونستم ازش بگیرم
        فقط یه نکته تو هدر sw_i2c باید ورژن 2 رو پین هاشو تعریف کنی
        البته اگه اشتباه نکنم خیلی وقت پیش تست کردم ولی دقیقا طبق همون مراحلی که گفتم نوشتم و کار کرد بدون مشکل
        متاسفانه در یه اشتباه تمام سورس کدهام به هوار رفت :cry:
        ایشاا.. دو مرتبه که نوشتم اینو حتما تست میکنم و همین جا میذارم پروژه اش رو.
        یا علی.
        جواب بعضي حرفا فقط يه نفس عميقه ، بذار تو دلت بمونه...

        دیدگاه


          #5
          پاسخ : i2c نرم افزاری و ds1307

          لطفاً این دوتا رو امتحان کن. شاید ایراد معلوم شه.
          ویرایش: فکر کنم ایراد اینه که شما قبل از فراخوانی توابع i2c، پین ها رو بصورت صریح بعنوان خروجی تعریف و 1 منطقی نمیکنید.
          تو همون انجمن picforum هم بهتون همینو گفتند ولی ظاهراً شما توجه نکردید.
          کد:
          SWStartI2C();
          SCLK_LAT = 0;
          CLOCK_LOW;
          Delay10TCY();
          var=SWPutcI2C(0xD0);// control byte
          کد:
          SCLK_LAT = 0;
          DATA_LAT = 0;
          DATA_HI;
          CLOCK_HI;
          Delay10TCY();
          SWStartI2C();
          var=SWPutcI2C(0xD0);// control byte

          دیدگاه


            #6
            پاسخ : پاسخ : i2c نرم افزاری و ds1307

            نوشته اصلی توسط freedom_truth
            لطفاً این دوتا رو امتحان کن. شاید ایراد معلوم شه.
            ویرایش: فکر کنم ایراد اینه که شما قبل از فراخوانی توابع i2c، پین ها رو بصورت صریح بعنوان خروجی تعریف و 1 منطقی نمیکنید.
            سلام دوست عزیز .این اتفاقات که خروجی باشه یا ورودی و صفر و یک کردنشون که تو توابع کتابخونه صورت میگیره و ثابت نیست.شما یه وقت میخوای اکنالج بگیری یا بفرستی و یه وقت میخوای دیتا بفرستی .به علاوه من گفتم که با ریستارت کار میکرد یعنی همه چیز اوکیه فقط با استارت کار نمیکنه .یعنی انگار یه بار باید خاموش روشن کنی تا بتونی باهاش کار کنی مثه پسر گلی نمیشه همون بار اول روشنش کردو کار کنه بهر حال ممنون از وقتی که گذاشتید :nerd: :wow:
            ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ‌فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
            شهید دکتر مصطفی چمران

            دیدگاه


              #7
              پاسخ : پاسخ : i2c نرم افزاری و ds1307

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

              دیدگاه


                #8
                پاسخ : پاسخ : i2c نرم افزاری و ds1307

                نوشته اصلی توسط freedom_truth
                تا اونجایی که من بررسی کردم اینطور نیست. شما یک لطف شخصی به من بکنید و قطعه کد دوم رو تست بفرمایید و نتیجه رو بگید.
                کامپایلر شما چیه؟(من از c18 استفاده میکنم)
                ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ‌فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                شهید دکتر مصطفی چمران

                دیدگاه


                  #9
                  پاسخ : پاسخ : i2c نرم افزاری و ds1307

                  نوشته اصلی توسط phoenix2000
                  کامپایلر شما چیه؟(من از c18 استفاده میکنم)
                  من کامپایل نکردم کد رو. تحلیل کردم. (من معمولاً از CCS استفاده میکنم.)
                  شما لطفاً قطعه کد دوم رو تست بفرمایید و نتیجه رو اعلام کنید.

                  دیدگاه


                    #10
                    پاسخ : i2c نرم افزاری و ds1307

                    oopss
                    ببخشید من اول فکر کردم شما این کدایی رو که گذاشتید مربوط به کامپایلر دیگه ای هستش :cry:اخه من اصولا این دستورات رو حفظ نمیکنم و متاسفانه دقت هم نکردم .بازم عذر می خوام .بعد از اون هم متشکرم از اینکه کمک میکنید :bye
                    مساله ی سومی هم وجود داره و اونم اینه که الان امکانات سخت افزاریش موجود نیست و همونطور که مشخصه این پست مربوط به چند وقت پیشه که امکاناتش بود :read:
                    اما ...
                    اما پس از بررسی بنده ، بصورت تئوری و با استفاده از تجربیات قبلی باید بگم بله کد شما یجورایی کار میکنه البته با تغییراتی .یعنی ماهیت کلی و کاری که شما می خواستید انجام بدید درسته و منجر به برقراری ارتباط میشه ،هر چند که کد بصورت دستوری باید تغییراتی بکنه.و این کار شما دقیقا همون کاری است که تو تابع ریستارت صورت میگیره اونجا هم اول خط دیتا رو خروجی و صفر میکنه و بعد ورودی میشن که منجر به یک شدن خط میشه چراکه پول پن.و سپس خط دیتا رو صفر میکنه . در واقع همون کارهای شما داخل تابع ریستارت صورت میگیره .در زیر هم تابع ریستارت و استارت اورده شده ان. اما سوالی که باقی میمونه اینه که با این حساب میکروچیپ چرا همجین تابعی رو اصلا گذاشته .منظورم استارته .اخه این کجا بدرد میخوره وقتی باهاش همون اول کار هم نمیشه کار کرد؟در ضمن این رو هم بگم اگه دیتا شیت رو نگاه کنید متوجه میشید بعد از ریست و بالا امدن میکرو همه ی پایه ها ورودی اند و این یعنی خط کلاک و دیتا یک می باشند.پس یه جورایی باید استارت کار کنه ولی انگار اینکه اول خط دیتا یک بشه در حالی که کلاک صفره و بعد خط کلاک یک بشه اهمیت بالایی داره که بدون رعایتش ارتباط صورت نمیگیره.
                    کد:
                    void SWRestartI2C( void )
                    {
                     SCLK_LAT = 0;          // set clock pin latch to 0
                     CLOCK_LOW;           // set clock pin to output to drive low
                     DATA_HI;            // release data pin to float high
                     Delay10TCY();          // user may need to modify based on Fosc
                     CLOCK_HI;            // release clock pin to float high
                     Delay10TCY();          // user may need to modify based on Fosc
                     DATA_LAT = 0;          // set data pin latch to 0
                     DATA_LOW;            // set data pin output to drive low
                     Delay10TCY();          // user may need to modify based on Fosc
                    }
                    void SWStartI2C( void )
                    {
                     DATA_LAT = 0;          // set data pin latch to 0
                     DATA_LOW;            // set pin to output to drive low
                     Delay10TCY();          // user may need to modify based on Fosc
                    }
                    ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ‌فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                    شهید دکتر مصطفی چمران

                    دیدگاه


                      #11
                      پاسخ : i2c نرم افزاری و ds1307

                      نوشته اصلی توسط phoenix2000
                      اما پس از بررسی بنده ، بصورت تئوری و با استفاده از تجربیات قبلی باید بگم بله کد شما یجورایی کار میکنه البته با تغییراتی .یعنی ماهیت کلی و کاری که شما می خواستید انجام بدید درسته و منجر به برقراری ارتباط میشه ،هر چند که کد بصورت دستوری باید تغییراتی بکنه.و این کار شما دقیقا همون کاری است که تو تابع ریستارت صورت میگیره اونجا هم اول خط دیتا رو خروجی و صفر میکنه و بعد ورودی میشن که منجر به یک شدن خط میشه چراکه پول پن.و سپس خط دیتا رو صفر میکنه . در واقع همون کارهای شما داخل تابع ریستارت صورت میگیره .در زیر هم تابع ریستارت و استارت اورده شده ان. اما سوالی که باقی میمونه اینه که با این حساب میکروچیپ چرا همجین تابعی رو اصلا گذاشته .منظورم استارته .اخه این کجا بدرد میخوره وقتی باهاش همون اول کار هم نمیشه کار کرد؟در ضمن این رو هم بگم اگه دیتا شیت رو نگاه کنید متوجه میشید بعد از ریست و بالا امدن میکرو همه ی پایه ها ورودی اند و این یعنی خط کلاک و دیتا یک می باشند.پس یه جورایی باید استارت کار کنه ولی انگار اینکه اول خط دیتا یک بشه در حالی که کلاک صفره و بعد خط کلاک یک بشه اهمیت بالایی داره که بدون رعایتش ارتباط صورت نمیگیره.
                      ایراد اینه که شما قبل از فراخوانی توابع i2c، پین ها رو بصورت صریح بعنوان خروجی تعریف و 1 منطقی نمیکنید.
                      کلمه کلیدی اینجا "بعنوان خروجی" هست.
                      مشکل اینه که بعد از SWStartI2C، تابع SWPutcI2C فراخوانی میشه که توی اون خط clock ، بدون تعیین وضعیت ورودی/خروجی، صفر منطقی میشه در حالی که هنوز ورودی هست و خب طبعاً کار نمی کنه.

                      کلاً خوتونو عادت بدید همه چی رو صریح به کامپایلر اعلام کنید.

                      دیدگاه

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