اطلاعیه

Collapse
No announcement yet.

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

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

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

    راستش من سعی کردم دو تا atmega16 رو از طریق ارتباط spi به هم وصل کنم .لب کلام اینکه از میکرو masterخواستم یه آرایه ی ده تای رو پر کنه و spioutکنهرئ میکرو دوم ولی بعد که این رشته رو از دومی spiinکردم و رو مزی نشون دادم عوض صفر 130 رو نشون میده!!!!!یعنی رشته ی 012345678910 زو به صورت 13012345678910 نشوم میده.این 130 چیه؟ دگه اینکه همین جواب هم ئر صورتی میده که من آحر برنامه ی masterدستور end رو وارد نکنم!1 اگه endبذارم دیگه اینو نشون میده 130000000000!!!! یه سوال دیگه هم داشتم میخواستم بدونم اگه فقط من یه بار spioutکنم این داده همینجوری تو باسspi میمونه تا من هر زمان که نیاز داشتم spiinکنم؟ یا نه محدودیت داره ؟و آخرین سوال هم اینکه وقفه ی spiرو باید واسه ی masterفعال کرد یا slave در حالت ارتباط half douplexمنظورمه.که فقط slave دریافت کننده باشه....متشکرم
    عکی برنامه ها و حروجی هر بار lcd رو میذارم واسه فهم بهتر منظورم ...بازم مرسی

    برنامه مستر
    ..http://upload.iranblog.com/7/1270991675.jpg
    برنامه اسلاو
    http://upload.iranblog.com/7/1270945375.jpg[img]http://[/img.]

    خروجی اگه end بذارم
    http://upload.iranblog.com/7/1270984097.jpg[img][/img]

    حروجی اگه end نباشه
    http://upload.iranblog.com/7/1270938469.jpg[img][/img]

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

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

    دیدگاه


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

      دوست عزیز
      توی برنامه Slave و Master مقدار I رو به اینطوری تعریف کن درست میشه:
      For I = 1 to 10

      موفق باشی

      دیدگاه


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

        نوشته اصلی توسط eca.user
        spi ارسال سریال دیتا هست چطور کل دیتا روی باس باقی بمونه ؟؟یعنی به اندازه ی بیتهای دیتا خط ارسال ندارید میکرو با دستور spiout ارسال دیتا رو مدیریت میکنه و دیتا رو سریال ارسال میکنه

        متوجه منظورتون نشدم میشه خواهش کنم یه خورده بیشتر توضیح بدین؟؟

        دیدگاه


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

          نوشته اصلی توسط behi88
          دوست عزیز
          توی برنامه Slave و Master مقدار I رو به اینطوری تعریف کن درست میشه:
          For I = 1 to 10

          موفق باشی
          مرسی از راهنماییتون... اینو خودم انجام دادم. ولی من بیشتر دنبال اینم که منظور مثال helpبسکام رو بفهمم اونجا هم یه آرایه ی 4 تایی رو بدون استفاده از حلقه فرستاده.
          من چرا نمیتونم؟؟؟

          دیدگاه


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

            توی Bascom اگر بخواهی یه آرایه رو به صورت کامل ارسال کنی کافیه که فقط عدد اول آرایه رو ارسال کنی
            ولی اگر بخواهی فقط اولین عدد آرایه رو ارسال کنی باید عدد اول رو توی یه متغییر واسط بریزی

            اگر واضح نگفتم بگو تا بیشتر توضیح بدم

            موفق باشی

            دیدگاه


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

              [quote author=behi88 link=topic=38075.msg186778#msg186778 date=1271140683]
              توی Bascom اگر بخواهی یه آرایه رو به صورت کامل ارسال کنی کافیه که فقط عدد اول آرایه رو ارسال کنی
              ولی اگر بخواهی فقط اولین عدد آرایه رو ارسال کنی باید عدد اول رو توی یه متغییر واسط بریزی

              اگر واضح نگفتم بگو تا بیشتر توضیح بدم

              موفق باشی
              [ote]مرسی از راهنماییتون....مختصر و مفید .واسه گرفتنش چی ،من باز با همین دستور تو اسلیو سعی کردم آرایه ی ارسالی 0تا10 رو رو ال سی دی نشون بدم ولی عوض صفر 130 نشون میده..اون بالا هم عکس گذاشتم که نمیدونم چه جوری بذارم تو سایت :redface: یعنی من با این دستورا تو مستر کار کردم.
              [left]for i= 0 to90
              a(i)=i
              next
              spi out a(1),10
              اونوقت تو اسلیو
              spiin a(1),10
              for i=0 to 9
              lcd a(i)
              next
              ولی بعد رشته ای که السی دی نشون میده اینه:
              130123456789


              دیدگاه


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

                ببین دوست عزیز قبلا هم گفتم اگر توی Bascom یه آرایه 10 تایی تعریف کنی مانند دستور زیر
                Dim a(10) as byte
                اونوقت 10 تا متغیر به نامهای A(1) , A(2) , ...A(10) خواهی داشت
                پس اگر از یه متغیر یازدهم oo: مانند A(0) استفاده کنی Bascom یه مقدار غیر انتظار رو بر میگردونه
                پس توی برنامه ای که گذاشتی دستور رو اینطوری تغییر بده:

                for i= 1 to90
                a(i)=i
                next
                spi out a(1),10
                اونوقت تو اسلیو
                spiin a(1),10
                for i=1 to 10
                lcd a(i)
                next

                اگر دوست داری بهتر ارتباط SPI رو درک کنی یه سری به تاپیک زیر بزن
                http://www.eca.ir/forum2/index.php?topic=37349.0

                موفق باشی

                دیدگاه


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

                  مرسی از راهنمایی های همه.
                  یه مشکل تازه برخوردم ..اونم تو ارتباط یه مستر با چند اسلیوه...من اومدم مستر روsoftکانفیگ کردم.تو انتخاب اسلیو ها مشکلی ندارم سوالی که برام پیش اومده اینه که برا تنطیم کلاک و بقیه ی تطیمات مستر spdr =&b01111111قرار دادم.ولی هیچ تاثیری تو برنامه نداره و چه این دستور رو بنویم چه ننویسم، اطلاهات دریافتی از اسلیوها اونی نیست که فرستادم.چی کار باید بکنم.؟ممنونم.

                  $regfile = "m16def.dat"
                  $crystal = 12000000
                  Config Spi = Soft , Din = Portc.4 , Dout = Portc.3 , Ss = None , Clock = Portc.5
                  Spiinit
                  Dim A(10) As Byte , K As Byte , I As Byte , B As Byte
                  Config Kbd = Porta , Debounce = 20 , Delay = 10
                  Spcr = &B11011111
                  Config Portc.0 = Output
                  Config Portc.1 = Output
                  Config Portc.2 = Output
                  Set Portc.0
                  Set Portc.1
                  Set Portc.2
                  Enable Spi
                  Do
                  L1:
                  I = Getkbd()
                  If I > 15 Then
                  jmp l1
                  Else
                  L2:
                  B = Getkbd()
                  If B = I Then
                  jmp l2
                  Else
                  B = Lookup(i , Kelid)
                  End If
                  If B > 11 Then Jmp L7
                  jmp l3
                  End If
                  Delay
                  L3:
                  Reset Portc.0
                  Set Portc.1
                  Spiout B , 1
                  Loop
                  Do
                  L5:
                  I = Getkbd()
                  If I > 15 Then
                  jmp l5
                  Else
                  L6:
                  B = Getkbd()
                  If B = I Then
                  jmp l6
                  Else
                  B = Lookup(i , Kelid)
                  End If
                  If B < 11 Then Jmp L7
                  jmp l3
                  End If
                  L7:
                  Reset Portc.1
                  Set Portc.0
                  Spiout B , 1
                  Loop


                  Kelid:
                  Data 15 , 14 , 0 , 13 , 12 , 3 , 2 , 1 , 11 , 6 , 5 , 4 , 10 , 9 , 8 , 7 'end program
                  ##################################################
                  اسلیووووووووو
                  $regfile = "m16def.dat"
                  $crystal = 12000000
                  Config Lcd = 16 * 2
                  Config Lcdpin = Pin , Db4 = Pinc.4 , Db5 = Pinc.5 , Db6 = Pinc.6 , Db7 = Pinc.7 , E = Pinc.3 , Rs = Pinc.2
                  Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = High , Phase = 1 , Clockrate = 128
                  Declare Sub Namayesh(byval A As Byte)
                  Enable Interrupts
                  Spiinit
                  Dim A As Byte , K As Byte , I As Byte , B As Byte
                  Enable Spi
                  On Spi Test
                  Do

                  Loop


                  Test:
                  Disable Interrupts
                  K = Spdr
                  Call Namayesh(k)
                  Enable Interrupts
                  Return


                  Sub Namayesh(byval A As Byte)

                  Select Case A

                  Case 10 : Lcd "/"
                  Case 11 : Lcd "*"
                  Case 12 : Lcd "-"
                  Case 13 : Cls
                  Case 14 : Lcd "="
                  Case 15 : Lcd "+"
                  Case 16 : Delay
                  Case Else : Lcd A
                  End Select
                  End Sub

                  دیدگاه


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

                    از دوستان کسی کمک راه گشایی بلد نیست .
                    pleaseeeeeeeeeeeeeeeeeeeeee
                    :cry: :cry: :cry: :cry: :cry: :cry:

                    دیدگاه


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

                      سلام
                      بالاخره خودم راهشو پیدا کردم.فک کنم ارتباط دو طرفه هم دقیقا همین جوریه .اصل برنامه رو میذارم امیدوارم به درد یه مبتدی مث خودم بخوره. :redface:

                      spi With several slave
                      MASTER
                      ################################################## ################
                      $regfile = "m16def.dat"
                      $crystal = 12000000
                      Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 128 , Noss = 1
                      Dim A As Byte , K As Byte , I As Byte , B As Byte
                      Config Kbd = Portd , Debounce = 20 , Delay = 10
                      Enable Spi
                      Spiinit
                      Ddrc = &B00000111
                      Set Portc.0
                      Set Portc.1
                      Set Portc.2
                      'Ddra = 0
                      'Ss1 Alias Porta.0
                      'Ss2 Alias Porta.1
                      Enable Spi
                      Do
                      L1:
                      B = Getkbd()
                      If B > 15 Then
                      Jmp L1
                      Else
                      L2:
                      I = Getkbd()
                      If B = I Then Jmp L2
                      B = Lookup(b , Kelid)
                      End If
                      jmp m1
                      Loop
                      M1:
                      If B > 9 Then

                      'Bitwait Ss1 , Reset
                      Reset Portc.0
                      Set Portc.1
                      Spiinit
                      Spiout B , 1

                      Else
                      L7:
                      'Bitwait Ss2 , Reset

                      Reset Portc.1
                      Set Portc.0
                      Spiinit
                      Spiout B , 1
                      End If
                      jmp l1


                      Kelid:
                      Data 15 , 14 , 0 , 13 , 12 , 3 , 2 , 1 , 11 , 6 , 5 , 4 , 10 , 9 , 8 , 7 'end program
                      ################################################## ###############
                      SLAVE1
                      $regfile = "m16def.dat"
                      $crystal = 12000000
                      Config Lcd = 16 * 2
                      Config Lcdpin = Pin , Db4 = Pinc.4 , Db5 = Pinc.5 , Db6 = Pinc.6 , Db7 = Pinc.7 , E = Pinc.3 , Rs = Pinc.2
                      Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = High , Phase = 1 , Clockrate = 128
                      Declare Sub Namayesh(byval A As Byte)
                      'Ddra.0 = 1
                      Enable Interrupts
                      Spiinit
                      Dim A As Byte , K As Byte , I As Byte , B As Byte
                      Enable Spi
                      On Spi Test
                      'Porta.0 = 1
                      Do

                      Loop


                      Test:
                      Disable Interrupts
                      K = Spdr
                      Call Namayesh(k)
                      Enable Interrupts
                      Return


                      Sub Namayesh(byval A As Byte)

                      Select Case A

                      Case 10 : Lcd "/"
                      Case 11 : Lcd "*"
                      Case 12 : Lcd "-"
                      Case 13 : Cls
                      Case 14 : Lcd "="
                      Case 15 : Lcd "+"
                      Case 16 : Delay
                      Case Else : Lcd A
                      End Select
                      End Sub
                      ################################################## #########

                      Slave 2
                      $regfile = "m16def.dat"
                      $crystal = 12000000
                      Config Lcd = 16 * 2
                      Config Lcdpin = Pin , Db4 = Pinc.4 , Db5 = Pinc.5 , Db6 = Pinc.6 , Db7 = Pinc.7 , E = Pinc.3 , Rs = Pinc.2
                      Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = High , Phase = 1 , Clockrate = 128
                      Declare Sub Namayesh(byval A As Byte)
                      'Ddra.0 = 1
                      Enable Interrupts
                      Spiinit
                      Dim A As Byte , K As Byte , I As Byte , B As Byte
                      Enable Spi
                      On Spi Test
                      'Porta.0 = 1
                      Do
                      Loop


                      Test:
                      Disable Interrupts
                      K = Spdr
                      Call Namayesh(k)
                      Enable Interrupts
                      Return


                      Sub Namayesh(byval A As Byte)

                      Select Case A

                      Case 10 : Lcd "/"
                      Case 11 : Lcd "*"
                      Case 12 : Lcd "-"
                      Case 13 : Cls
                      Case 14 : Lcd "="
                      Case 15 : Lcd "+"
                      Case 16 : Delay
                      Case Else : Lcd A
                      End Select
                      End Sub
                      :wow:

                      دیدگاه

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