اطلاعیه

Collapse
No announcement yet.

spi در بسکام

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

    #16
    پاسخ : spi در بسکام

    فقط یه مشکل که با این رجستر ها چی کار کنم مثلا فرض بفرمائید می خوام مقدار P رو از این رجیستر ها بخونم راستی چرا نوشته که این رجیستر ها هم قابل خوندنه و هم نوشتن ؟و چرا طول این ها رو 24 بیت و من برای خوندن این رجیستر ها مثلا مقدار P با آدرس 00110 رو چه طور بخونم ؟؟؟؟
    معجزه پس از معجزه می آید و شگفتی ها از تجلی باز نمی مانند.

    دیدگاه


      #17
      پاسخ : spi در بسکام


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

      مرسی از بحث خوبتون



      sbit CS5460ADin = P1^5; // CS4560A serial data in
      sbit CS5460ADout = P1^6; // CS4560A serial data out
      sbit CS5460AClk = P1^7; // CS4560A serial clock


      //CS5460A register addresses
      #define CS5460A_REG_CONFIG 0x00
      #define CS5460A_REG_AIN1_OFFSET 0x02
      #define CS5460A_REG_AIN1_GAIN 0x04
      #define CS5460A_REG_AIN2_OFFSET 0x06
      #define CS5460A_REG_AIN2_GAIN 0x08
      #define CS5460A_REG_CYCLE 0x0A
      #define CS5460A_REG_PULSE 0x0C
      #define CS5460A_REG_CURRENT 0x0E
      #define CS5460A_REG_VOLT 0x12
      #define CS5460A_REG_POWER 0x14
      #define CS5460A_REG_ENERGY 0x16
      #define CS5460A_REG_IRMS 0x18
      #define CS5460A_REG_VRMS 0x1A
      #define CS5460A_REG_TBC 0x1C
      #define CS5460A_REG_PWR_OFFSET 0x1E
      #define CS5460A_REG_STATUS 0x20
      #define CS5460A_REG_IACOFFSET 0x22
      #define CS5460A_REG_VACOFFSET 0x24
      #define CS5460A_REG_MASK 0x34
      #define CS5460A_REG_CONTROL 0x38

      //CS5460A commands
      #define CONVERT_CONTINOUS 0xE8
      #define CONVERT_ONCE 0xE0
      #define CS5460A_SYNC0 0xFE
      #define CS5460A_SYNC1 0xFF
      #define POWER_UP_HALT 0xA0
      #define CAL_AIN1_DC_GAIN 0xCA
      #define CAL_AIN1_DC_OFFSET 0xC9
      #define CAL_AIN2_DC_GAIN 0xD2
      #define CAL_AIN2_DC_OFFSET 0xD1
      #define CS5460A_WRITE 0x40
      #define CS5460A_READ 0x3E

      //config data
      #define CLOCK_DIVIDER 0x00000004
      #define AIN1_GAIN_10 0x00000000
      #define AIN1_GAIN_50 0x00010000
      #define SOFT_RESET 0x00000080
      #define MASK_NO_INTERRUPTS 0x00000000
      #define STATUS_CLR_CRDY 0x00100000
      #define STATUS_CLR_DRDY 0x00800000
      #define STATUS_CLR_ALL 0x00FFFFFF
      #define CONTROL_DEFAULT 0x00000000
      #define CURRENT_GAIN_DEFAULT 0x00100000
      #define VOLT_GAIN_DEFAULT 0x00100000
      #define COMPUTATION_CYCLE 0x00000FA0
      #define TIME_BASE 0x00800000


      //================================================== =========================
      bit CS5460AReadDRDYBit(void)
      {
      bit ReadyBit;
      Byte4 xdata StatusRegister;
      StatusRegister=CS5460ARead24Bits(CS5460A_REG_STATU S);
      if(StatusRegister & 0x00800000){ReadyBit=1;}else{ReadyBit=0;}//get DRDY bit
      return(ReadyBit);
      }
      //================================================== =========================
      bit CS5460AReadCRDYBit(void)
      {
      bit ReadyBit;
      Byte4 xdata StatusRegister;
      StatusRegister=CS5460ARead24Bits(CS5460A_REG_STATU S);
      if(StatusRegister & 0x00100000){ReadyBit=1;}else{ReadyBit=0;}//get CRDY bit
      return(ReadyBit);
      }
      //================================================== =========================
      void CS5460AResetConfigure(void)
      {
      CS5460AReset();
      CS5460AWrite24Bits((CLOCK_DIVIDER |AIN1_GAIN_10),CS5460A_REG_CONFIG);//Ain1
      CS5460AWrite24Bits(CONTROL_DEFAULT,CS5460A_REG_CON TROL);//write default
      CS5460AWrite24Bits(STATUS_CLR_ALL,CS5460A_REG_STAT US);//clear all status
      CS5460AWrite24Bits(MASK_NO_INTERRUPTS,CS5460A_REG_ MASK);//no interrupts
      //gain is 10, clock divider is 4
      CS5460AWrite24Bits(CURRENT_GAIN_DEFAULT,CS5460A_RE G_AIN1_GAIN);//Ain1 gain
      CS5460AWrite24Bits(VOLT_GAIN_DEFAULT,CS5460A_REG_A IN2_GAIN);//Ain2 gain
      CS5460AWrite24Bits(COMPUTATION_CYCLE,CS5460A_REG_C YCLE);//rms cycle
      CS5460AWrite24Bits(TIME_BASE,CS5460A_REG_TBC);//default time base
      CS5460AWriteCommand(CONVERT_CONTINOUS);//start conversions
      return;
      }
      //================================================== =========================
      void CS5460AReset(void)
      {
      Byte xdata BitCounter;
      //Cirrus Logic data sheet page 43
      for(BitCounter=0;BitCounter<3;BitCounter++)//send 3 SYNC1 bytes
      {
      CS5460AWriteCommand(CS5460A_SYNC1);
      }
      CS5460AWriteCommand(CS5460A_SYNC0);//send 1 SYNC0 byte
      CS5460AWrite24Bits(SOFT_RESET,CS5460A_REG_CONFIG);//issue soft reset
      return;
      }
      //================================================== =========================
      void CS5460AWriteCommand(Byte Command)
      {
      Byte xdata WriteByte;
      Byte xdata BitCounter;
      WriteByte=Command;
      for(BitCounter=0;BitCounter<8;BitCounter++)
      {
      if(WriteByte & 0x80){CS5460ADin=1;}else{CS5460ADin=0;}
      CS5460APulseClock();WriteByte=WriteByte<<1;
      }
      return;
      }
      //================================================== =========================
      void CS5460AWrite24Bits(Byte4 RegisterData, Byte AdcRegisterAddress)
      {
      Byte xdata BitCounter;
      Byte xdata WriteByte;
      Byte4 xdata WriteLong;
      WriteLong=RegisterData;
      WriteByte=(CS5460A_WRITE | AdcRegisterAddress);//write command with reg address
      for(BitCounter=0;BitCounter<8;BitCounter++)//send command
      {
      if(WriteByte & 0x80){CS5460ADin=1;}else{CS5460ADin=0;}
      CS5460APulseClock();
      WriteByte=WriteByte<<1;
      }
      for(BitCounter=0;BitCounter<24;BitCounter++)//write 24 bits
      {
      if(WriteLong & 0x00800000){CS5460ADin=1;}else{CS5460ADin=0;}
      CS5460APulseClock();
      WriteLong=WriteLong<<1;
      }
      return;
      }
      //================================================== =========================
      Byte4 CS5460ARead24Bits(Byte AdcRegisterAddress)
      {
      Byte xdata BitCounter=0;
      //send read command with register address
      Byte xdata WriteByte=CS5460A_READ & AdcRegisterAddress;
      Byte4 xdata Data24Bits=0;
      Byte4 xdata ThreeSync0=0x00FEFEFE;
      CS5460ADout=1;//pull up port pin for a read
      for(BitCounter=0;BitCounter<8;BitCounter++)
      {
      if(WriteByte & 0x80){CS5460ADin=1;}else{CS5460ADin=0;}
      CS5460APulseClock();
      WriteByte=WriteByte<<1;
      }
      for(BitCounter=0;BitCounter<24;BitCounter++)//read 24 bits
      {
      if(ThreeSync0 & 0x00800000){CS5460ADin=1;}else{CS5460ADin=0;}//SYNC0 command on SDI
      CS5460APulseClock();
      ThreeSync0=ThreeSync0<<1;
      if(CS5460ADout){Data24Bits=((Data24Bits<<1)| 0x1);}//get msb and other bits
      else{Data24Bits=Data24Bits<<1;}
      }
      return(Data24Bits>>1 & 0x00FFFFFF);
      }
      //================================================== =========================
      void CS5460APulseClock(void){CS5460AClk=1;CS5460AClk=0; return;}
      //================================================== =========================
      // MAIN Routine
      //================================================== =========================
      void main (void)
      {
      CS5460AClk=0;
      CS5460AResetConfigure();
      Delay10MilliSec(100);
      if(CS5460AReadCRDYBit()){Va=1;}
      Gain=CS5460ARead24Bits(CS5460A_REG_VOLT);//dummy read
      //================================================== =========================
      while(1)
      {
      if(CS5460AReadCRDYBit())
      {
      //CS5460AWrite24Bits(STATUS_CLR_DRDY,CS5460A_REG_STA TUS);//clear DRDY
      //Test=CS5460ARead24Bits(CS5460A_REG_IRMS);
      Test=CS5460ARead24Bits(CS5460A_REG_CURRENT);
      Volt=CS5460ARead24Bits(CS5460A_REG_VOLT);
      CS5460AWrite24Bits(STATUS_CLR_CRDY,CS5460A_REG_STA TUS);//clear CRDY
      }
      }//end of while
      }//end of main
      //================================================== =========================
      //end of main
      //================================================== =========================


      http://services.nexodyne.com/email/i...3D/0/image.png

      دیدگاه


        #18
        پاسخ : spi در بسکام

        فکر می کنم در این مواقع بسکام جوابگو نیست باید بری سراغ زبان اسمبلی

        دیدگاه


          #19
          پاسخ : spi در بسکام

          همچنان منتظر راهنمائی شما هستم استاد behi
          معجزه پس از معجزه می آید و شگفتی ها از تجلی باز نمی مانند.

          دیدگاه


            #20
            پاسخ : spi در بسکام

            خواهش میکنم
            متاسفانه من به زبان C خیلی تسلط ندارم برای همین تبدیلش یه کم وقت میبره
            فکر نکنم راه اندزیش خیلی مشکل باشه
            خوشحال میشم تا گرفتن جواب کمکتون کنم
            مطمعن باشید با BASCOM هم میشه راهش انداخت
            در مورد 24 بیتی بون اطلاعات برای خواندن و نوشتن هم باید بگم 24 بیت همون 3 بایت هست
            چون در ارتباط SPI اطلاعات به صورت سنکرون مبادله میشه نیازی نیست تا اطلاعات رو بدون وقفه (مثل حالت آسنکرون) برای آی سی بفرستیم
            رجیستر ها هر کدام شامل یک سری اطلاعات آی سی هستند
            مثلا برای نوشتن ضریب توان (مثلا) باید دستورش رو در 1 بایت (شامل آدرس رجیستر) به همراه سه بایت (24 بیت) اطلاعات ضریب توان رو برای آی سی بفرستید
            و مثلا برای خواندن توان خروجی باید دستورش رو در 1 بایت برای آی سی بفرستید بعد از اون میتونید اطلاعات رجیستر های داخلی شامل اطلاعات توان خروجی رو بخونید.


            موفق باشی

            دیدگاه


              #21
              پاسخ : spi در بسکام

              استاد از این که به ما دل گرمی میدید ممنونم می شم و حضور شما باور کنید خیلی خیلی باعث دل گرمی هست
              3 تا مطلب رئ می خوام با شما در میان بگذارم
              اولین اینکه مت برد برای این آی سی ساختم چون اس ام دی بود رفتم یه هیتر هم خریدم با یه ATMEGA 32 و ال سی دی کاراکتری
              دومین مطلب - اینکه چرا رجیستر های این آهی سی رو هم قابل خوندن نوشته و هم قابل نوشتن مثلا مقدار P رو مگه ما میتونیم توی آی سی بنویسیم
              سومین مطلب - ممکنه سوال های زیادی پیش بیاد من و همه طرفداران این تاپیک از شما خواهشم میکنیم که یه این کته توجه کنید که ما دیگه با Spi مشکل ندارم و به لطف شما مشکل ما حل شد حالا دیگه میدونیم که چه طوری بخونیم و ارسال کنیم یعنی این جوری بگم مطلب رو فهمیدیم اما مشکل اساسی اینه که نمی دونیم باید مثلا برای خوندم این مقدار فرض بفرمائید p یا v چه دستوراتی رو به این ای سی ارسال کنیم و منتظز چه اطلاعاتی باشیم ممنون میشم اگه راهنمائی کنید در حد یک سمپل که بتونیم این مشکل رو حل کنیم
              معجزه پس از معجزه می آید و شگفتی ها از تجلی باز نمی مانند.

              دیدگاه


                #22
                پاسخ : spi در بسکام

                ممنون از لطفتون
                کار بسیار درستی کردی که شروع به ساخت کردی
                با ساختن خیل بهتر میشه یاد گرفت
                برای لحیم کردن قطعات SMD شما نیازی به هیتر ندارید(البته اگر هنوز مونتاژ نکردید) فقط با یه نوک هومیه 40W مخصوص SMD و یه کم حوصله و دقت میتونی اون رو لحیم کنی . و اگر هم هنوز نقشه رو پیاده نکردی بهتره 2 الی 3 تا کلید هم به مدارت اضافه کنی در عمل خیلی بدرد میخوره ( LCD برای خروجی M32 برای برنامه ریزی و کلید برای ورودی)
                متاسفانه من دیتاشیت رو کامل نخوندم ولی تا شما برد رو مناژ میکنید یه مطالعه میکنم اونوقت بیشتر راجع به دستورات بحث میکنیم


                دیدگاه


                  #23
                  پاسخ : spi در بسکام

                  از لطفی که شما به ما دارید واقعا ممنونم ما یه قانون بین خودمون گذاشتیم البته به پیشنهاد آقای John lock که بحث رو فقط ایشان با شما به جلو ببرند و اگر ما سوالی داشتیم از طریق ایشون ادامه میدیم این مساله فقط برای اینکه بحث از مصیر اصلی خارج نشه از اینکه شما به ما کمک میکنید بسیار ممنونم آقای جان لاک قراره طرح مدارشون رو برای همه ما بفرسته پس مطمئن باشید سوال های تکراری در این تاپیک مطرح نخواهد شد واقا از شما استاد Behi ممنونم
                  http://services.nexodyne.com/email/i...3D/0/image.png

                  دیدگاه


                    #24
                    پاسخ : spi در بسکام

                    من هم با شما موافقم و تاپیک رو پی گیری میکنم و به قوانین انجمن و این تاپیک احترام میزارم دقیقا من هم دنبال این موضوع می گشتم از همه ممنونم ولی اینون بهتون بگم من کلا از این آی سی دلسرد شده بودم و تا این تاپیک رو دیدم باور کنید استرس گرفتم دوباره :cry2: ولی هر کمکی از دست من بر بیاد ( که مطمئن هستم هی کاری نمی تونم بکنم ) براتون انجام می دم و خیلی دوست دارم به نتیجه برسیم و این آی سی مسخره رو درایو کنیم توی بس کام

                    دیدگاه


                      #25
                      پاسخ : spi در بسکام

                      دوستان همه به من لطف دارن
                      امیدوارم بتونم کمک کنم
                      البته اگر دوستان همکاری بکنن و برد مدار چاپی که آماده شد همدیگه رو در جریان پیشرفت کار بزارن حتما همگی سریعتر به نتیجه میرسید.
                      اول در مورد دستور SYNC0 و SYNC1 که سوال شد توضیح میدم
                      این دستورها هیچ کاری برای آی سی انجام نمیده
                      و نوشتن هر یک به تنهایی هیچ عملی رو برای آی سی انجام نمیده
                      فقط دستور SYNC0 که بعد از تکرار 3 بار یا بیشتر دستور SYNC1 بیاد به معنای پایان ارتباط با آی سی است
                      مثلا شما در حال فرستان یک دستور 4 بایتی هستید و به دلایلی ار تباط قطع میشه (مانند ریست شدن میکرو) و شما میخواهید دستور رو از اول بنویسید
                      و آی سی دستور قبل رو در نظر نگیره ، کافیه که سه تا دستور SYNC1 به همراه یک دستور SYNC0 برای آی سی بفرستید
                      با فرستاده شدن این دستور ها آی سی دستورات ناقص قبلی رو در نظر نگرفته و برای گرفتن دستور جدید آماده میشه

                      موفق باشید

                      دیدگاه


                        #26
                        پاسخ : spi در بسکام

                        استاد behi از لطف شما و مابقی واقعا ممنونم فکر کنم با توجه به تغییراتی که شما دستور دادید امشب حاظر بشه ممنون شما هستم
                        معجزه پس از معجزه می آید و شگفتی ها از تجلی باز نمی مانند.

                        دیدگاه


                          #27
                          پاسخ : spi در بسکام

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

                          پایه SDI رو به MOSI
                          پایه SDO رو به MISO
                          پایه SCLK رو به SCK

                          ولی توی دیتا شیت صفحه 37 این رو نوشته که باید 6 تا از پایه ها به میکرو وصل شه ممنون میشم بازم همه رو شرمنده کنید
                          معجزه پس از معجزه می آید و شگفتی ها از تجلی باز نمی مانند.

                          دیدگاه


                            #28
                            پاسخ : spi در بسکام

                            درسته پایه int برای این استفاده میشه که بخواهیم در صورت بروز یک Event یا رویداد در رجیستر دارخلی آی سی ، میکرو را از وقوع این رویداد به صورت اینتراپت به میکرو خبر بدیم .این پایه برای برد آموزشی اختیاری هست ولی برای برد نهایی باید حتما باید استفاده بشه پیشنهاد میکنم اگر هنوز پایه دارید این رو وصل کنید.
                            پایه CS آی میتونه مستقیم به زمین وصل بشه یا به پایه SS میکرو ویا هر پایه خروجی دیگه. این پایه Chip Select یا انتخاب آی سی هست و برای فعالیت باس SPI باید همیشه صفر باشه این پایه برای وقتی استفاده میشه که بخواهیم دستگاهای مختلفی را همزمان به باس SPI وصل کنیم.
                            پایه RESET هم که معلومه برای ریست کردن آی سی هست میتونید این پایه رو هم به یک خروجی میکرو وصل کنید و از طریق میکرو آی سی رو RESET کنید یا به یک کلید فشاریاین کارو انجام بدید

                            موفق باشید

                            دیدگاه


                              #29
                              پاسخ : spi در بسکام

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

                              دیدگاه


                                #30
                                پاسخ : spi در بسکام

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

                                دیدگاه

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