اطلاعیه

Collapse
No announcement yet.

خطا در انتقال دیتا با کمک spi

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

    خطا در انتقال دیتا با کمک spi

    سلام به همه دوستان خوبم.
    دو میکرو کنترلر avr را از طریق spi به همدیگر متصل کردم میکرو مستر دو عدد را به میکرو slave ارسال میکند و اسلیو آن را روی ال سی دی نشان می دهد و این حلقه تکرار می شود. در دریافت اول و دوم عدد اشتباه نشان می دهد و از سه به بعد درست نشان می دهد لطفا راهنماییم کنید :cry:

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

    لطفا موارد زیر را تا حذف خطای کلی دنبال نمایید
    1-سورس برنامه رو کاملا مرور کنید سعی کنید هنگام ارسال دیتا از مستر به اسلیو داده ها بر روی ال سی دی هم نمایش پیدا کننده که مطمئن شوید مسلما مشکل از ارتباط است نه از کار و برنامه میکرو
    2-طول ارتباط بیش از 10 سانت برای این پروتکل مجاز نمی باشد در صورت طولانی شدن باید وقفه های زمانی و درایور برای تقویت جریان استفاده کنید
    3-نویزهای احتمالی رو با فیلتر های مناسب رفع کنید
    4-مشکلی رو که من داشتم در زبان برنامه نویسی بس کام و پروتکل SPI این بود که مقدار Pahse رو در هنگام تعریف کردن ارتباط به عدد 1 (یا احتمالا 0) تنظیم کرده بودم که باید آن رو به 0(یا یک اما طوری که یادم هست حتما باید 0 می شد)تنظیم می کردم که خود بعد از چند ثانیه مشکل پدید می اورد
    هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

    دیدگاه


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

      سلام
      ممنون از راهنمایی شما چطور باید از وقفه زمانی استفاده کنم لطفا موضوع 2 را توضیح دهید من روی برد برد بستم در اولین دریافت 11253 و در دومین 3 در سومین 300 که عدد مناسب بود دریافت کردم آیا با حلقه می توان مشکل را حل کرد؟ مرسی

      دیدگاه


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

        سلام من از این برنامه استفاده کردن خروجی روی ال سی دی یکبار 111 و 222 و دفع دیگه برعکس 222و 111 رو در متغیر ها نشان می دهد. :eek:
        ################################################## ####master
        $regfile = "m32def.dat"
        $crystal = 8000000
        '-------------------------------------------------------------------------------config spi
        Config Spi = Hard , Interrupt = Off , Data Order = Lsb , Master = Yes , _
        Polarity = High , Phase = 0 , Clockrate = 128 , Noss = 0
        '-------------------------------------------------------------------------------
        Spiinit
        Config Pina.0 = Input
        Config Pind.7 = Output
        Declare Sub Send_spi
        Dim B(2) As Byte
        B(1) = 222
        B(2) = 111
        Do
        If Pina.0 = 1 Then
        Call Send_spi
        End If
        Loop
        End 'end program
        '-------------------------------------------------------------------------------
        Sub Send_spi:
        Spiinit
        Set Portd.7
        Spiout B(1) , 2
        Waitms 200
        Reset Portd.7
        End Sub Send_spi
        Return
        '-------------------------------------------------------------------------------
        ################################################## ###slave
        $regfile = "m32def.dat"
        $crystal = 8000000
        Cursor Off
        Config Lcd = 16 * 2
        '-------------------------------------------------------------------------------lcd
        Config Lcdpin = Pin , Rs = Pina.0 , E = Pina.1 , Db4 = Pina.2 , Db5 = Pina.3 , Db6 = Pina.4 , Db7 = Pina.5
        '-------------------------------------------------------------------------------config spi
        Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = No , _
        Polarity = High , Phase = 0 , Clockrate = 128
        '-------------------------------------------------------------------------------
        Enable Interrupts
        Enable Spi
        On Spi Masterselect
        '-------------------------------------------------------------------------------
        Config Pind.7 = Output
        Dim B(2) As Byte
        Spiinit
        Cls
        Lcd "on program"
        Waitms 300
        Do
        Loop
        End
        Masterselect:
        Disable Spi
        B(1) = 0
        B(2) = 0
        Spiin B(1) , 2
        Set Portd.7
        Cls
        Locate 1 , 1
        Lcd "B(1)=" ; B(1)
        Locate 2 , 1
        Lcd "B(2)=" ; B(2)
        Enable Spi
        Reset Portd.7
        Return
        '-------------------------------------------------------------------------------

        دیدگاه


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

          سلام من اینطوری تنظیمات اتمگا 8 رو انجام دادم جهت ارسال
          Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 16
          Enable Interrupts

          Spiinit
          و اینم تنظیمات اتمگا 16 جهت دریافت.
          Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = High , Phase = 0 , Clockrate = 16
          Enable Interrupts
          Enable Spi
          On Spi A
          Spiinit
          خیلی خوب هم جواب میده.
          وقتي همه نيروهاي جسمي و ذهني متمرکز شوند توانايي فرد براي حل مشکلات به طور حيرت انگيزي چند برابر مي شود .
          نرمن وينسنت پيل

          دیدگاه


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

            بگذارید سوالمو اینطور مطرح کنم می خواهم دو بایت رو با spi به میکرو دیگری با خطا صفر انتقال بدم سورس بدید دوستان

            دیدگاه


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

              میشه بفرمائید دقیقا از چه طریقی میخواین دیتا رو وارد کنید. مثلا میخواین با صفحه کلید این کارو بکنید یا طور دیگه. اگه با کیپد بگین تا یه تجربه رو براتون بگم :agree:
              وقتي همه نيروهاي جسمي و ذهني متمرکز شوند توانايي فرد براي حل مشکلات به طور حيرت انگيزي چند برابر مي شود .
              نرمن وينسنت پيل

              دیدگاه


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

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



                Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 16
                Enable Interrupts
                Spiinit

                Dim Wa As Byte , Wb As Byte , Wc As Byte , Wd As Byte
                Dim Aa As Integer , Df As Byte , Kbd_atmega16 As Word , N As Bit , Spk As Byte , L As Byte
                Dim A As String * 1 , B As String * 1 , Kbd As Byte , Pls As Byte , Kbd1 As Byte
                Dim Stri(16) As String * 1 , Result(16) As Byte , I As Byte , Ii As Byte
                Dim La As Byte

                '------------------------
                Main:
                '------------------------
                Gosub Keybord

                If Kbd > 15 Then Goto Main

                Kbd = Lookup(kbd , Data_for_keyboard)

                Kbd_atmega16 = Kbd
                Spiout Kbd_atmega16 , 1
                Waitms 500

                Goto Main



                '-------------------------
                Keybord:
                '-------------------------
                Wb = 0
                Wc = 255
                Kbd = 255
                For Wa = 4 To 7

                Set Portd.wa
                For Wd = 0 To 3
                If Pind.wd = 1 Then
                Set Portd.wd
                Wb = Portd
                Reset Portd.wd
                Wd = 3
                End If
                Next Wd
                Wc = Lookdown(wb , Data_1 , 16)
                Wc = Wc - 1
                Kbd = Wc

                Reset Portd.wa
                If Kbd < 254 Then Return
                Next Wa
                Return



                '----------------------- DATA LOOKUP-lookdown TABLE -------------------------------------
                Data_1:
                Data 17 , 18 , 20 , 24 , 33 , 34 , 36 , 40 , 65 , 66 , 68 , 72 , 129 , 130 , 132 , 136
                Data_for_keyboard:
                Data 1 , 2 , 3 , 10 , 4 , 5 , 6 , 11 , 7 , 8 , 9 , 12 , 13 , 0 , 14 , 15
                این برای ارسال اعداد از طریق صفحه کلید میباشد

                '-------------------------------------------------------------------------------
                $regfile = "m16def.dat"
                $crystal = 8000000
                $baud = 9600
                '$sim
                '-------------------------------------

                Config Lcdpin = Pin , Db4 = Pind.4 , Db5 = Pind.5 , Db6 = Pind.6 , Db7 = Pind.7 , _
                Rs = Pind.2 , E = Pind.3
                Config Lcd = 16 * 2
                '---------------------------------------
                Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = High , Phase = 0 , Clockrate = 16
                Enable Interrupts
                Enable Spi
                On Spi A
                Spiinit

                Dim Kbd_atmega16 As Word

                Cls

                Do

                Loop



                A:
                Disable Interrupts

                Kbd_atmega16 = Spdr
                Lcd Kbd_atmega16

                Enable Interrupts
                Return
                اینم اعدادی رو که فرستادیم روی ال سی دی نمایش میده
                وقتي همه نيروهاي جسمي و ذهني متمرکز شوند توانايي فرد براي حل مشکلات به طور حيرت انگيزي چند برابر مي شود .
                نرمن وينسنت پيل

                دیدگاه


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

                  از spiin و spiout باید استفاده کنم با spdr یک متغیر بایت می شه انتقال داد نه دو بایت پشت سر هم اگر این کار را بکنین ممکنه اطلاعات بایت اول و دوم عوض شه به برنامم نگاه کنین چرا این طور شد؟ :angry: :sad:

                  دیدگاه


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

                    کسی نظری نداره مسئله رو حل کنه؟

                    دیدگاه

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