اطلاعیه

Collapse
No announcement yet.

ارتباط دو طرفه spi در بیسکام

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

    ارتباط دو طرفه spi در بیسکام

    با سلام خدمت همه دوستان

    من برای انتقال دیتا بین دو میکرو از spi استفاده کردم تو ارتباط یک طرفه مشکلی ندارم یعنی یه میکرو اسلیو باشه و میکرو دیگه مستر
    ولی تو ارتباط دو طرفه با مشکل برخورد کردم یعنی نمیدونم چطوری یه میکرو رو تو حین کار از حالت اسلیو به مستر ببرم یا بالعکس
    کاری که میخوام انجام بدم دقیقا اینه : یکی از میکروها با user در ارتباط و میکرو دوم (main ) فقط از طریق ارتباط spi با میکرو user در ارتباط خواهد بود حالا تو این ارتباط دو وضعیت داریم تو وضعیت اول میکرو user مستر و میکرو main اسلیو هست و تو وضعیت دوم میکرو user اسلیو و میکرو main مستر هست و این دو وضعیت با صفحه کلیدی که به میکرو user وصل هست توسط کاربر تعیین میشه
    و مشکل من دقیقا اینه که تو حین کار نمیتونم نقش یه میکرو رو از حالت مستر به اسلیو یا بالعکس تبدیل کنم
    چه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله

    #2
    پاسخ : ارتباط دو طرفه spi در بیسکام

    از عزیزان کسی تا الان ارتباط دو طرفه spi کار نکرده ؟؟؟؟؟؟؟؟؟؟/
    چه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله

    دیدگاه


      #3
      پاسخ : ارتباط دو طرفه spi در بیسکام

      سلام

      همین پروژه عینا تو کتاب کاهه هست.
      زندگی یه فرصته

      دیدگاه


        #4
        پاسخ : ارتباط دو طرفه spi در بیسکام

        سلام دوست عزیز
        هنگاهی که می خوای از master به Slave اطلاعات بفرستی که مشکلی ندارد اما وقتی شما می خواهی از Slave به Master باید از پایه SS یا همون Slave select کمک بگیری به طوری که هر وقت پایه SS هر دو میکرو باید به هم وصل باشه و Flag مربوط به پایه SS توی میکروی Master باید انتخاب بشه
        اون وقت هر وقت میکروی Slave بخواد اطلاعات رو برای Master بفرسته، پایه SS رو Low میکنه و همزمان میکروی Master با Low شدن پایه SS تبدیل به Slave میشه و شما می تونی با استفاده از وقفه (یا هر طور دیگه که دوست داری :smile اطلاعات رو بخونی

        دیدگاه


          #5
          پاسخ : ارتباط دو طرفه spi در بیسکام

          من با استفاده از توابع تعریف شده تو بیسکام موفق نشدم نتیجه بگیرم به هر دری هم که زدم بی نتیجه بود( اگه behi88 ، عزیز تونستین با این توابع جواب بگیرین ممنون میشم برنامه رو بزارین تا منم گیر کار رو متوجه بشم ) بنابراین رفتم سراغ رجیسترها و خوشبختانه جواب داد برنامه کامل رو میزارم شاید به درد کسی بخوره:
          _برای میکرو main از مگا 88 استفاده کردم و برای میکرو user از مگا8
          _ از portd.2 میکرو user برای سوییچ شدن بین دو حالت کاری استفاده کردم که در صورت یک بودن این پایه main: master خواهد بود و user:slave و در صورت صفر بودن پایه portd.2 در میکرو user میکرو main:slave و میکرو user:master
          _پایه portd.1 میکرو user به portd.2 میکرو main وصل شده
          _از طریق portd.1 در user میکرو user وضعیت فعلی را به میکرو main اعلام میکند تا براساس ان تغییر وضعیت بدهد

          main:

          $regfile = "m88def.dat"
          $crystal = 8000000


          Config Lcd = 16 * 2
          Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
          Cls
          Config Portd.2 = Input
          Dim Get_data As Byte , Send_data As Byte , Q As Byte , Chek_spi As Byte , X As Word , Send_word_l As Byte , Send_word_h As Byte
          Dim Chek_byte_or_word As Byte , Get_word_l As Byte , Get_word_h As Byte , Get_word As Word
          Dim Mid_var As Word
          Do
          If Pind.2 = 1 Then

          For X = 240 To 265
          If Pind.2 = 0 Then Exit For
          Ddrb = &B00101100
          Portb = &B00101000
          Spcr = &H3F
          Spcr = &H7F
          Q = Spsr
          Q = Spdr

          If X < 256 And Pind.2 = 1 Then

          Chek_byte_or_word = 1
          Spdr = Chek_byte_or_word
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Waitms 10


          Send_data = X
          Spdr = Send_data
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Home
          Lcd Send_data
          Waitms 250



          Elseif X > 255 And Pind.2 = 1 Then
          Chek_byte_or_word = 2
          Spdr = Chek_byte_or_word
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Waitms 5

          '&&&
          Send_word_l = X And &HFF

          Mid_var = X And &HFF00
          Rotate Mid_var , Left , 8
          Send_word_h = Mid_var

          Spdr = Send_word_l
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend

          Spdr = Send_word_h
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          End If
          Home
          Lcd X
          Waitms 250
          Next
          '************************************
          Elseif Pind.2 = 0 Then
          Ddrb = &B00010000
          Portb = &B00010000
          Spcr = &H2F
          Spcr = &H6F

          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Get_data = Spdr


          '***********************
          If Get_data = 1 Then
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Get_data = Spdr
          Home
          Lcd Get_data
          Goto End_rutine

          '************************
          Elseif Get_data = 2 Then

          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Get_word_l = Spdr

          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Get_word_h = Spdr
          Mid_var = Get_word_h
          Shift Mid_var , Left , 8
          Get_word = Get_word_l + Mid_var
          Home
          Lcd Get_word
          Goto End_rutine
          End If

          End_rutine:
          End If
          Loop
          End


          user
          :
          $regfile = "m8def.dat"
          $crystal = 8000000


          Config Lcd = 16 * 2
          Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
          Cls
          Config Portd.2 = Input
          Config Portd.1 = Output
          Dim Get_data As Byte , Send_data As Byte , Q As Byte , Chek_spi As Byte , X As Word , Send_word_l As Byte , Send_word_h As Byte
          Dim Chek_byte_or_word As Byte , Get_word_l As Byte , Get_word_h As Byte , Get_word As Word
          Dim Mid_var As Word
          Do
          If Pind.2 = 1 Then
          Portd.1 = 1
          Waitus 100
          Ddrb = &B00010000
          Portb = &B00010000
          Spcr = &H2F
          Spcr = &H6F

          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Get_data = Spdr

          '***********************
          If Get_data = 1 Then
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Get_data = Spdr
          Home
          Lcd Get_data
          Goto End_rutine
          '************************
          Elseif Get_data = 2 Then

          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Get_word_l = Spdr

          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Get_word_h = Spdr
          Mid_var = Get_word_h
          Shift Mid_var , Left , 8
          Get_word = Get_word_l + Mid_var
          Home
          Lcd Get_word
          Goto End_rutine
          End If

          End_rutine:

          '*******
          Elseif Pind.2 = 0 Then
          Portd.1 = 0
          Waitms 10
          For X = 100 To 120
          If Pind.2 = 1 Then

          Exit For
          End If

          Ddrb = &B00101100
          Portb = &B00101000
          Spcr = &H3F
          Spcr = &H7F
          Q = Spsr
          Q = Spdr

          If X < 256 And Pind.2 = 0 Then
          Chek_byte_or_word = 1
          Spdr = Chek_byte_or_word
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Waitms 5


          Send_data = X
          Spdr = Send_data
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Home
          Lcd Send_data
          Waitms 250

          Elseif X > 255 And Pind.2 = 0 Then
          Chek_byte_or_word = 2
          Spdr = Chek_byte_or_word
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          Waitms 5

          Send_word_l = X And &HFF

          Mid_var = X And &HFF00
          Rotate Mid_var , Left , 8
          Send_word_h = Mid_var

          Spdr = Send_word_l
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend

          Spdr = Send_word_h
          Chek_spi = Spsr And &H80
          While Chek_spi = 0
          Chek_spi = Spsr And &H80
          Wend
          End If
          Home
          Lcd X
          Waitms 250

          Next
          End If
          Loop
          End
          چه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله

          دیدگاه


            #6
            پاسخ : ارتباط دو طرفه spi در بیسکام

            سلام دوست عزیز
            ببخشید یه چند روزی نبودم
            برنامه رو خوندم خیلی جالب و ابتکاری بود :applause:
            ولی فکر کنم راه ساده تری هم باشه
            من متاسفانه برد آماده ندارم تا این روشی رو که میگم امتحان کنم
            اگر نتیجه گرفتی به ما هم خبر بده
            اما فکر نکنم مشکلی نداشته باشده :smile:
            این مثال رو توی Bascom AVR اجرا میشه
            اول از همه توی میکروی Slave خط زیر رو اول برنامه بنویس :

            Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = No, Polarity = Low , Phase = 0 , Clockrate = 128 , NOSS=1
            SPIINIT
            بعد بقیه برنامه رو مینویسی
            توی میکروی Master هم این خط رو مینویسی :

            Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , NOSS=1
            SPIINIT
            اینجوری اول ارتباط SPI رو تنظیم و بعد فعال میکنیم

            حال در میکروی Master باید پایه SS رو ورودی تعریف کنی و توی میکروی Slave پایه SS خروجی ودارای منطق High باشد
            مثلا برای میکروی ATMEGA8 دستور زیر به برنامه Master اضافه می شود :

            Config pinb.2 = input

            و دستورات زیر به میکروی Slave اضافه میشود :

            Config portb.2 = output
            portb.2 = 1

            حتما این دستورات تنظیم پایه SS رو بعد از دستور دستور ISPINIT بنویس :smile:
            فقط توی سخت افزار حتما دقت کن که پایه های SS هر دو میکرو به هم متصل باشند

            بعد توی برنامه هر وقت خواستی برای میکروی Master اطلاعات بفرستی اول پایه SS رو LOW کن بعد اطلاعات رو بفرست و بعد از ارسال اطلاعات دوباره پایه رو High کن :smile:

            فقط اگر از Interrupt استفاده میکی بدون که با Low شدن پایه SS میکروی Master وارد مد Slave در حالت Recieve میشه

            موفق باشی

            دیدگاه


              #7
              پاسخ : ارتباط دو طرفه spi در بیسکام

              من روشی که شما گفتین رو تست کردم ولی جواب نداد
              در مورد عبارت noss=0/1 وقتی از اون استفاده میکنم spi اصلا کار نمیکنه و در مورد اینکه گفتین تو میکرو slave پایه ss خروجی تعریف بشه قاعدتا نبایدجواب بده چون تو حالت slave این پایه باید ورودی باشه و در حالتی که خروجی تعریف بشه spi به حالت بیکاری میره
              البته من امتحان کردم ولی همونطور که گفتم جواب نداد
              وقتی هم که ss رو در slave ورودی تعریف میکنم و یه پایه از میکرو مستر مثل portd.2 رو خروجی تعریف میکنم و اون رو low میکنم و به ss میکرو اسلیو وصل میکنم بازم جواب نمیده خلاصه اینکه هر راه ساده ای که به ذهنم رسید رو امتحان کردم ولی جواب نداد
              چه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله

              دیدگاه


                #8
                پاسخ : ارتباط دو طرفه spi در بیسکام

                نوشته اصلی توسط mikla
                من روشی که شما گفتین رو تست کردم ولی جواب نداد
                در مورد عبارت noss=0/1 وقتی از اون استفاده میکنم spi اصلا کار نمیکنه و در مورد اینکه گفتین تو میکرو slave پایه ss خروجی تعریف بشه قاعدتا نبایدجواب بده چون تو حالت slave این پایه باید ورودی باشه و در حالتی که خروجی تعریف بشه spi به حالت بیکاری میره
                البته من امتحان کردم ولی همونطور که گفتم جواب نداد
                وقتی هم که ss رو در slave ورودی تعریف میکنم و یه پایه از میکرو مستر مثل portd.2 رو خروجی تعریف میکنم و اون رو low میکنم و به ss میکرو اسلیو وصل میکنم بازم جواب نمیده خلاصه اینکه هر راه ساده ای که به ذهنم رسید رو امتحان کردم ولی جواب نداد
                سلام دوست عزیز
                کاملا درست میگی من امروز فهمیدم
                نباید کاری به پایه SS در میکروی Slave داشت :redface:
                یک بار دیگر اینطور برنامه رو اصلاح کن:
                همه عملیات را برای تعریف میکروی مستر انجام بده بعد پایه SS میکروی مستر رو ورودی تعریف کن
                برای میکروی Slave یک پایه دیگه رو خروجی تعریف کن و منطق اون رو High بگذاز و هر وقت خواستی برای میکروی Master اطلاعات بفرستی این پایه رو Low کن

                حتما جواب میگیری

                موفق باشی

                دیدگاه


                  #9
                  پاسخ : ارتباط دو طرفه spi در بیسکام

                  سلام دوست من
                  این دفعه از مستر به اسلیو دیتا منتقل شد ولی از اسلیو به مستر نیومد
                  مرسی از راهنماییهاتون :redface:
                  چه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله

                  دیدگاه

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