اطلاعیه

Collapse
No announcement yet.

مشکل با rs485

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

    #46
    پاسخ : مشکل با rs485

    سلام کد شما را کمی تغییر دادم. در برنامه مستر به جای ارسال رشته A و B، یک بایت با مقدار 250 برای اسلیو 1 و مقدار 251 برای اسلیو 2 ارسال می شود. در اسلیوها پس از دریافت بایت مربوط به هرکدام، عدد متغیر بایت _data که مقدار آن در اسلیو 1 برابر با 20 و در اسلیو 2 برابر با 40 است، برای مستر ارسال می شود. وقت نشد برنامه را آزمایش کنم. لطفا نتیجه را اعلام فرمایید
    برنامه مستر
    کد:
    $regfile = "m8def.dat"
    $crystal = 11059200
    $baud = 9600
     $framesize = 40
    '------------------------------------
    Config Lcdpin = Pin , Db4 = Pinb.2 , Db5 = Pinb.3 , _
     Db6 = Pinb.4 , Db7 = Pinb.5 , Rs = Pinb.0 , E = Pinb.1
    Config Lcd = 20 * 4
    
    Cursor Off
    Cls
    '-----------------------------------
    Enable Interrupts
    Enable Urxc
    On Urxc Ser_int
    '------------------------------------
    
    Config Portb.0 = Output
    Config Portb.1 = Output
    
    Const Slave_1_add = 250
    Const Slave_2_add = 251
    
    'Config Print = Portd.2 , Mode = Set
    Config Portd.2 = Output
    Portd.2 = 1
    
    Dim S As String * 3
    Dim Flag As Bit
    Dim Rec_byte As Byte , Rec_byte_1 As Byte , Rec_byte_2 As Byte , Slave_select As Byte,
    
    '-------------------------------------
    Do
    
      Slave_select = Slave_1_add
      Portd.2 = 1
      Waitms 1
      Printbin Slave_select
      Toggle Portb.0
      Portd.2 = 0
      Waitms 500
    
      Locate 1 , 1
      Lcd "Received 1: "
      If Flag = 1 Then
       Reset Flag
       S = Str(rec_byte_1)
       S = Format(s , "000")
       Lcd S
      Else
       Lcd "ERR"
      End If
    
    '-------------------------------------------
      Slave_select = Slave_2_add
      Portd.2 = 1
      Waitms 1
      Printbin Slave_select
      Toggle Portb.0
      Portd.2 = 0
      Waitms 500
    
      Locate 2 , 1
      Lcd "Received 2: "
      If Flag = 1 Then
       Reset Flag
       S = Str(rec_byte_2)
       S = Format(s , "000")
       Lcd S
      Else
       Lcd "ERR"
      End If
    
    
    Loop
    End
    
    '-------------------------------------------------
    
    Ser_int:
    
    Rec_byte = Udr
    Select Case Slave_select
    Case Slave_1_add :
      Rec_byte_1 = Rec_byte
      Set Flag
    Case Slave_2_add :
      Rec_byte_2 = Rec_byte
      Set Flag
    End Select
    
    Return
    برنامه اسلیو 1
    کد:
    $regfile = "m8def.dat"
    $crystal = 11059200
    $baud = 9600
    '------------------------------------
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , _
     Db6 = Pinc.4 , Db7 = Pinc.5 , Rs = Pinc.0 , E = Pinc.1
    Config Lcd = 16 * 2
    
    Cursor Off
    Cls
    '------------------------------------
    Enable Interrupts
    Enable Urxc
    On Urxc Ser_int
    
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Single = Scientific , Digits = 1
    
    Const Slave_add = 250
    
    'Config Print = Portd.2 , Mode = Set
    Config Portd.2 = Output
    Portd.2 = 0
    
    Dim Flag As Bit
    Dim Rec_byte As Byte , _data As Byte
    
    _data = 20
    Do
      Locate 1 , 1
      Lcd Rec_byte ; " "
      Locate 2 , 1
      Lcd _data ; " "
    
      If Flag = 1 Then
    
       Reset Flag
       Waitms 100
       Portd.2 = 1
       Waitms 1
       Printbin _data
       Portd.2 = 0
      End If
    
    Loop
    End
    
    
    
    
    
    '---------------------------------------
    
    Ser_int:
    
    Rec_byte = Udr
    If Rec_byte = Slave_add Then Set Flag
    
    Return
    برنامه اسلیو 2
    کد:
    $regfile = "m8def.dat"
    $crystal = 11059200
    $baud = 9600
    '------------------------------------
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , _
     Db6 = Pinc.4 , Db7 = Pinc.5 , Rs = Pinc.0 , E = Pinc.1
    Config Lcd = 16 * 2
    
    Cursor Off
    Cls
    '------------------------------------
    Enable Interrupts
    Enable Urxc
    On Urxc Ser_int
    
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Single = Scientific , Digits = 1
    
    Const Slave_add = 251
    
    'Config Print = Portd.2 , Mode = Set
    Config Portd.2 = Output
    Portd.2 = 0
    
    Dim Flag As Bit
    Dim Rec_byte As Byte , _data As Byte
    
    _data = 40
    Do
      Locate 1 , 1
      Lcd Rec_byte ; " "
      Locate 2 , 1
      Lcd _data ; " "
    
      If Flag = 1 Then
    
       Reset Flag
       Waitms 100
       Portd.2 = 1
       Waitms 1
       Printbin _data
       Portd.2 = 0
      End If
    
    Loop
    End
    
    
    
    
    
    '---------------------------------------
    
    Ser_int:
    
    Rec_byte = Udr
    If Rec_byte = Slave_add Then Set Flag
    
    Return
    برای تغییر آدرس اسلیوها، مقدار ثابت Slave_add را در برنامه اسلیوها و مقدارهای Slave_1_add و رSlave_2_add را در برنامه مستر تغییر دهید. آدرس اسلیوها باید طوری باشد که با مقدار _data ارسالی برابر نشود.

    دیدگاه


      #47
      پاسخ : مشکل با rs485

      اقا سلام کد ها رو تست کردم آدرس ها رو هم قرار دادم هم تو پروتیوس هم رو مدار واقعی فقط err میده لطفا یه نگاه بنداز ببین ایراد از کجاست

      دیدگاه


        #48
        پاسخ : مشکل با rs485

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

        دیدگاه


          #49
          پاسخ : مشکل با rs485

          http://sari62.persiangig.com/RS485-TEST%20-%20bin.rar/download
          خیلی لطف میکنید آدرس ها رئ هم ست کردم

          دیدگاه


            #50
            پاسخ : مشکل با rs485

            با سلام لینک مشکل داره یا من نمی تونم دانلود کنم
            داناترین مردم کسی است که دانش مردم را با دانش خود جمع کند
            پیامبر اکرم (ص)
            علی ابن ابیطالب : همانا پاداش دانشمند از شخص روزه دار و شب زنده دارکه در راه خدا جهاد می کند بیشتر است
            اگر میخواهید دشمنان خود را تنبیه کنید به دوستان خود محبت کنید.(کورش کبیر)

            دیدگاه


              #51
              پاسخ : مشکل با rs485

              مشکل از من بود درست شد دانلود کردم
              داناترین مردم کسی است که دانش مردم را با دانش خود جمع کند
              پیامبر اکرم (ص)
              علی ابن ابیطالب : همانا پاداش دانشمند از شخص روزه دار و شب زنده دارکه در راه خدا جهاد می کند بیشتر است
              اگر میخواهید دشمنان خود را تنبیه کنید به دوستان خود محبت کنید.(کورش کبیر)

              دیدگاه


                #52
                پاسخ : مشکل با rs485

                دوباره سلام
                من با زبون c کار میکنم بسکام خیلی کم برنامه مینویسم اما من چیزی که تو شبیه سازی فهمیدم زمان ارسال پایه های فعال ساز 485(پایه 2 و 3 rs485) صفر هستند (pd.2) در صورتی که برای ارسال باید یک باشند و جهت دریافت باید صفر شوند .
                داناترین مردم کسی است که دانش مردم را با دانش خود جمع کند
                پیامبر اکرم (ص)
                علی ابن ابیطالب : همانا پاداش دانشمند از شخص روزه دار و شب زنده دارکه در راه خدا جهاد می کند بیشتر است
                اگر میخواهید دشمنان خود را تنبیه کنید به دوستان خود محبت کنید.(کورش کبیر)

                دیدگاه


                  #53
                  پاسخ : مشکل با rs485

                  یک میشه ولی خیلی کوتاه این اتفاق میافته من فکر میکنم تو قسمت دریافت مشکل هست فرستادن مشکلی نداره آقای aed جواب ندادی داداش منتظریم
                  oo:

                  دیدگاه


                    #54
                    پاسخ : مشکل با rs485

                    سلام خدمت دوستان به خصوص مهندس بهاری عزیز،من تو این متن سعی میکنم راحت ترین روش و در عین حال روش تست شده رو توضیح بدم تا عزیزانی که مثل من در حقشون کم لطفی شده و برنامه نویسیو با بسکام شروع کردن کمکی کرده باشم؛

                    با دقت در تصویر فوق متوجه میشیم که پایه های RE و DE باید بهم وصل بشن و پس از اتصال بهم به یکی از پایه های میکرو متصل میکنیم،با مطالعه دیتاشیت MAX485 یا ADM485 متوجه میشیم که برای ارسال دیتا پایه DE باید HIGH بشه و برای دریافت دیتا پایه RE باید LOW بشه،و از اونجاییکه ما در یک لحظه یا دریافت دیتا داریم یا ارسال بنابراین پایه های RE و DE رو باهم به یکی ار پایه های میکرو وصل میکنیم تا میکرو تعیین کنه که آی سی در مود ارسال باشه یا دریافت،در مرحله بعد باید پایه RO از آی سی MAX485 رو به پایه RXD از میکرو و پایه DI رو به پایه TXD از میکرو متصل کنیم تا دیتای مورد نظر به میکرو وارد یا ازون خارج بشه،تا اینجا تکلیف 4 تا از پایه های MAX485 مشخص شد،پایه های تغذیه هم که معلومن،میمونه پایه های A و B ،در کل مسیر به هر تعداد که آی سی MAX485 داشته باشیم باید پایه های A و B از هز آیسی بصورت متناظر بهم وصل بشن،3 تا نکته میمونه،یکی اینکه اگه مسیر طولانی هست حتما از کابل مرغوب و زره دار شیلد و ترجیحا بهم تابیده استفاده کنید و نکته دیگه اینکه طبق توصیه دیتاشیت ابتدا و انتهای مسیر به دو نقطه A و B مقاومت 120 اهمی وصل کنید تا امپدانس خط تامین بشه ودر آخر زره کابل رو به GND مدارتون وصل کنید و GND همه اسلیو ها رو با GND مستر یکی کنید که برای این کار میتونید از زره کابل در طول مسیر استفاده کنید،تا اینجا توضیحات سخت افزارو خوندید و در ادامه در مورد نرم افزار توضیح میدم

                    کد:
                    $regfile = "m16def.dat"
                    $crystal = 11059200
                    $baud = 19200
                    $hwstack = 128
                    $swstack = 128
                    $framesize = 128
                    
                    Declare Sub Data_SEND    
                    
                    
                    Config Portd.6 = Output : 485_en Alias Portd.6 : 485_en = 1    'MAX485  ENABLE PIN        
                    Dim Ip_add As Byte
                    Dim Uart As Byte
                    Dim Flag As Bit
                    Dim Serial_data(2) As Byte
                    Dim Udr_count As Byte
                    Dim Ip_add As Byte
                    
                    
                     
                    Const Udr_start = 170
                    
                    
                     
                    
                    
                    
                    Enable Interrupts
                    
                    Enable Urxc
                    
                    On Urxc Serial_receive
                    
                    
                    DO
                    
                    YOUR PROGRAM HERE*****
                    
                    
                    
                    CALL Sub Data_SEND  ' SEND DATA TO SLAVE DEVICES
                    
                    LOOP
                    
                    END
                    
                    
                    
                    
                    Sub Data_SEND    
                    
                     '******************* SEND  DATA REQUEST
                    
                          485_en = 1
                    
                          Waitms 25
                    
                          Printbin Udr_start ; Ip_add ; Switch_sts
                    
                          Waitms 25
                    
                          485_en = 0
                     
                    END Sub Data_SEND
                    
                     
                     
                    '*******************************************************************************
                    '******************************* serial_receive ********************************
                    '*******************************************************************************
                    
                    
                    Serial_receive:
                    
                    
                    
                    
                    Uart = Udr                         'reading uart data register (udr)
                    
                    If Flag = 0 Then
                    
                      If Uart = Udr_start Then                'finding the first byte of frame
                    
                       Flag = 1
                    
                       Count = 1
                    
                      End If
                    
                    Else
                    
                      Serial_data(count) = Uart
                    
                      If Count = 2 Then                    'counting 3 byte after detecting first byte
                    
                       Device_ip = Serial_data(1)
                    
                       Device_key = Serial_data(2)
                    
                       Flag = 0
                    
                       Count = 0
                    
                       '*************************************************************************
                    
                    
                    
                    
                    YOUR PROGRAM HERE *****
                     
                           End If
                    
                    
                      End If
                    
                    Incr Count
                    
                    End If
                    
                    Return
                    برای ارسال دیتا به دستگاه اسلیو ابتدا به Ip_add مقدار دلخواه میدیم،دقت کنید که این مقدار دلخواه باید در اسلیو هدف هم مقدار دهی شده باشه تا با ارسال این مقدار توسط مستر ،اسلیو بتونه پاسخ بده سپس به Switch_sts یا هر متغیر دلخواهی مقدار میدیم تا به اسلیوی که هدف هست فرستاده بشه و روی اون مقدار توسط اسلیو پردازش بشه,با دقت در برنامه متوجه میشیم که برای ارسال همواره پایه 485_en باید یک بشه و پس از ازسال باید 485_en صفر بشه تا میکرو آماده دریافت دیتا در حالت وقفه سریال باشه،اسلیو هم با دریافت کد ها مقدار مورد نظرو ارسال میکنه که مستر هم که با صفر کردن 485_en در حالت ذریافت بوده در مود وقفه دریافت سریال اطلاعات ارسالی توسط اسلیو رو دریافت میکنه،از قسمتهای قرار داده شده هم برای اسلیو ها و هم برای مستر میشه استفاده کرد مجدد توجه شما رو به چند نکته جلب میکنم،برای دریافت صحیح اطلاعات از کریستال خارجی با فرکانس 11.0598 استفاده کنید و پایه 485_en که به RE و DE از MAX485 وصل شده رو با یه مقاومت 10کیلو PULL-UP کنید نکته آخرم اینکه Udr_start مقدار ثابتیه و میتونید عوضش کنید،اگه سوالی بود در خدمتم



                    دیدگاه


                      #55
                      پاسخ : مشکل با rs485

                      آقا دستت درد نکنه رو سخت افزار تست میکنم جواب و اعلام میکنم

                      در ضمن به خاطر مشکلاتی که با بسکام مواجه شدم دارم برنامه نویسی c و میخونم باسه شروع هم دارم با کدویژن کار میکنم

                      دیدگاه


                        #56
                        پاسخ : مشکل با rs485

                        Majid-BN ما منتظر ادامه اموزش شما هستیم ممنونم

                        دیدگاه


                          #57
                          پاسخ : مشکل با rs485

                          دوستان من مثال فایل اسلیو و مستر در پروتئوس 7.4 با برنامه بسکام میخوام کسی داره؟؟؟؟

                          دیدگاه


                            #58
                            پاسخ : مشکل با rs485

                            با سلام هیچکی نیست جواب ما بده ؟؟؟؟؟؟ :angry:

                            دیدگاه


                              #59
                              پاسخ : مشکل با rs485

                              سلام ورژن فایل پروتیوس 7 هست و تو همین تاپیک تو قسمت های مختلفش شبیه ساز هست

                              دیدگاه


                                #60
                                پاسخ : مشکل با rs485

                                سپس به Switch_sts یا هر متغیر دلخواهی مقدار میدیم تا به اسلیوی که هدف هست فرستاده بشه و روی اون مقدار توسط اسلیو پردازش بشه, نکته آخرم اینکه Udr_start مقدار ثابتیه و میتونید عوضش کنید،
                                اگه سوالی بود در خدمتم
                                سلام .
                                Switch_sts کارش چیه ؟؟عبارتی که توضیح دادید متوجه نشدم .

                                Udr_start این کارش چیه ؟
                                یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                                دیدگاه

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