اطلاعیه

Collapse
No announcement yet.

چطور میتونم در ارتباط spi دو بایت رو همزمان بفرستم

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

    چطور میتونم در ارتباط spi دو بایت رو همزمان بفرستم

    سلام دوستان
    من یک مگا 8 دارم که دما و رطوبت رو با سنسور dht22 اندازه میگیره وبا ارتباط spi به مگا 32 می فرسته واونجا عملیات خاصی روش انجام میشه ...من میخوام دما ورطویت رو با هم بفرستم وتوی مگا 32 جداش کنم واستفاده ...اما گر شدنی نیست چطور میتونم جدا بفرستم که اطلاعاتم قاطی نشه؟؟؟

    اسلیو:
    کد:
    $regfile = "m8adef.dat"
    $crystal = 8000000
    $hwstack = 60
    $swstack = 40
    $framesize = 40
    
    
    '-------------------------------------------------------------------------------
     Config Spi = Hard , Interrupt = Off , Data Order = Lsb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4
     Enable Spi
    
    Spiinit
    Config Pinb.0 = Input
    Config Portc.0 = Output                   'DHT22 Data
    Config Timer0 = Timer , Prescale = 8
     Dim X As Bit
     X = 0
     Dim Main As Byte
    Main = 1
     Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
      Home
      Lcd "wait...."
      Wait 1
    Cls
    
    '.-------------------------------------------------------------------------------
    'Const Min_time = 95
    'Const Min_time = 48
    Const Min_time = 48
    '-------------------------------------------------------------------------------
    Dim B As Single
    Dim B1 As Byte
    Dim E As Single
    Dim E1 As Byte
    Dim Count As Byte
    Dim Signaltime(43) As Byte
    Dim Humidityw As Word
    Dim Temperaturew As Word
    Dim Humsens_chksum As Byte
    Dim Hum1 As String * 4
    Dim Temp1 As String * 4
    Dim Humiditys As String * 16
    Dim Temperatures As String * 16
     Dim Code As Byte
     Dim A As Byte
    Dim Strstring As String * 14
    Dim Ib As Byte
     Dim Te As Byte
     Dim Hu As Byte
    Dim I As Byte
    
    
    '-------------------------------------------------------------------------------
    Declare Sub Read_timings
    Declare Sub Humtemp_values
    
    Declare Function Compare_chksum(byval Hsens_humidity As Word , _
    Byval Hsens_temperature As Word , Byval Hsens_chksum As Byte) As Byte
     For I = 1 To 5
     Toggle Portc.0
     Waitms 150
     Next
     Portc.0 = 0
    Do
    
     Call Humtemp_values
    
      Humiditys = Str(humidityw)
      Temperatures = Str(temperaturew)
    Hum1 = Format(humiditys , "00.0")
    Temp1 = Format(temperatures , "00.0")
    
    
    B = Val(temp1)
    B1 = Int(b)
    E = Val(hum1)
    E1 = Int(e)
    Locate 1 , 1
    Lcd B1
    Locate 2 , 1
    Lcd E1
    
    Spiin B1 , 1
    Spiin E1 , 1
    
    Portc.0 = 1
     Waitms 50
     Portc.0 = 0
    
    
    
    
    
    
    
    
    Loop
    
    End
    '-------------------------------------------------------------------------------
    
    Sub Read_timings
    Wait 2
    
    
    
      Count = 1
    
      Config Pinb.0 = Output : Portb.0 = 0           ' request data
      Waitms 20                        ' wait 20 ms
      Config Pinb.0 = Input                  ' wait for data, receive data
    
      While Count < 43                     'collect 42 timings / signals
    
       Bitwait Pinb.0 , Set                 'signal goes high > start timer
       Start Timer0
       Bitwait Pinb.0 , Reset                'signal goes low > stop timer
       Stop Timer0
       Signaltime(count) = Tcnt0               'store number of ticks per signal in Signaltime byte
    
       Tcnt0 = 0
       Incr Count
    
     Wend
    
    
    End Sub
    
    '############################################## Humidity and temperature values
    
    Sub Humtemp_values
    
      Local X As Byte
    
      Humidityw = 0
      Temperaturew = 0
      Humsens_chksum = 0
    
      Call Read_timings
    
      For Count = 3 To 42                   ' skip first two
    
       Select Case Count
    
         Case 3 To 18
          X = 18 - Count
          If Signaltime(count) > Min_time Then Toggle Humidityw.x
    
         Case 19 To 34
          X = 34 - Count
          If Signaltime(count) > Min_time Then Toggle Temperaturew.x
    
         Case 34 To 42
          X = 42 - Count
          If Signaltime(count) > Min_time Then Toggle Humsens_chksum.x
    
       End Select
    
     Next
    
    End Sub
    
    '######################### Calculate Checksum and compare with trasnmitted value
    
    
    Function Compare_chksum(byval Hsens_humidity As Word , Byval Hsens_temperature As Word , Byval Hsens_chksum As Byte) As Byte
    
      Local Chksum As Byte
    
      Chksum = Low(hsens_humidity ) + High(hsens_humidity )
      Chksum = Chksum + Low(hsens_temperature)
      Chksum = Chksum + High(hsens_temperature)
    
      If Chksum = Hsens_chksum Then
       Compare_chksum = 1
      Else
       Compare_chksum = 0
      End If
    
    End Function
    مستر
    کد:
    $regfile = "m32def.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 16
    $framesize = 32
     Dim B As Byte
    Dim A As Byte
    Dim X As Bit
    X = 0
    Dim Main As Byte
    Main = 1
    Config Portb.0 = Output
     Dim Te As Byte
     Te = 113
     Dim Hu As Byte
     Dim S As Byte
    Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portc , Ce = 2 , Ce2 = 3 , Cd = 4 , Rd = 5 , Reset = 6 , Enable = 7
    Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = No , Polarity = High , Phase = 0 , Clockrate = 4
      Setfont Font8x8
      Enable Interrupts
      Enable Spi
      On Spi Reci
      Cls
     Lcdat 4 , 1 , "HELLO WORLD"
    
    Wait 1
     Spiinit
     Portb.0 = 1
     Waitms 1000
    
    Portb.0 = 0
     Cls
    
    Showpic 96 , 0 , Temp , 0
    Do
    
    
     Lcdat 2 , 80 , B
     Lcdat 2 , 1 , "humi:" ; A
     Lcdat 3 , 10 , S
    
     Spiout Te , 1
    
    Loop
    End
    
      $include "font8x8.font"
    $lib "glcdks108.lbx"
    Reci:
     Spiin B , 1
     Spiin A , 1
    Incr S
    Return
    Temp:
    $bgf "tempo.bgf"

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

    سلام
    اگه میخوای همزمان 2 بایت یا بیشتر بفرستی از متغیر ارایه ای استفاده کن و دستور spi رو که عدد اخرش برای تعداد بایت ارسالی و دریافتی هست تنظیم کن
    [code=vbnet]dim b(2) as byte
    b(1)=10
    b(2)= 17
    spiout b(1) , 2 "/////////// send 2 byte ////////////"
    [/code]
    امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

    دیدگاه


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

      نوشته اصلی توسط mahdi8866
      سلام
      اگه میخوای همزمان 2 بایت یا بیشتر بفرستی از متغیر ارایه ای استفاده کن و دستور spi رو که عدد اخرش برای تعداد بایت ارسالی و دریافتی هست تنظیم کن
      [code=vbnet]dim b(2) as byte
      b(1)=10
      b(2)= 17
      spiout b(1) , 2 "/////////// send 2 byte ////////////"
      [/code]
      تشکر
      اونجا که شما (b1) رو فرستادی ،(b2) چطورفرستاده میشه؟؟یعنی ارسال با b1 شروع میشه وکل آرایه که اینجا دو عضو داره فرستاده میشه؟؟؟ودر طرف مقابل هم همین عبارت رو با دستور دریافت باید نوشت؟؟

      دیدگاه


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

        نوشته اصلی توسط میثم قاسمی نیا
        تشکر
        اونجا که شما (b1) رو فرستادی ،(b2) چطورفرستاده میشه؟؟یعنی ارسال با b1 شروع میشه وکل آرایه که اینجا دو عضو داره فرستاده میشه؟؟؟ودر طرف مقابل هم همین عبارت رو با دستور دریافت باید نوشت؟؟
        سلام
        بله درسته موقعی که b(1) فرستاده میشه پشت سرش b(2) فرستاده میشه یعنی ارایه 1 رو بعد 2 رو بعد ارایه های بعدی رو میفرسته (در صورتی که از ارایه های بیشتر ی استفاده کرده باشی)
        برای دریافت هم از همین دستور در میکرو اسلو استفاده کن
        امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

        دیدگاه


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

          نوشته اصلی توسط mahdi8866
          سلام
          بله درسته موقعی که b(1) فرستاده میشه پشت سرش b(2) فرستاده میشه یعنی ارایه 1 رو بعد 2 رو بعد ارایه های بعدی رو میفرسته (در صورتی که از ارایه های بیشتر ی استفاده کرده باشی)
          برای دریافت هم از همین دستور در میکرو اسلو استفاده کن
          ممنون کار کرد
          ولی یک مشکل وجود داره واون سرعت دستوره SPIIN هستش وقتی اسلیو میره تو وقفه دریافت با تاخیر زیادی خارج میشه ومن اومدم با دستور B(1)=SPDR انجامش دادم وسرعت دریافت بسیار بالا رفت نمی دونم ایراده بسکامه یا نه در هر صورت من میتونم با همین دستور B(1)=SPDR بصورت آرایه دریافت داشته باشم ،من که زدم وجواب نداد ...

          دیدگاه


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

            نوشته اصلی توسط میثم قاسمی نیا
            ممنون کار کرد
            ولی یک مشکل وجود داره واون سرعت دستوره SPIIN هستش وقتی اسلیو میره تو وقفه دریافت با تاخیر زیادی خارج میشه ومن اومدم با دستور B(1)=SPDR انجامش دادم وسرعت دریافت بسیار بالا رفت نمی دونم ایراده بسکامه یا نه در هر صورت من میتونم با همین دستور B(1)=SPDR بصورت آرایه دریافت داشته باشم ،من که زدم وجواب نداد ...
            سلام
            به نظرم شما پایه ss که انتخاب کننده میکرو اسلو هست رو از حالت سخت افزاری غیر فعال کن و و دستی یه پین رو در میکرو مستر خروجی کن و در میکرو اسلو ورودی کن وهر موقع مثلا میکرو اسلو ورودیش 1 شد ارایه رو دریافت کنه تا زمان بندی هماهنگتر باشه پایه ss رو خودت با کد نویسی کنترل کن
            البته من کد برنامه نویسی شما رو با دقت نگاه نکردم ولی احساس کردم یکیش وقفه spi فعاله و یکیش نه باید یخورده کدهارو در هر 2 میکرو هماهنگتر بنویسی
            امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

            دیدگاه

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