اطلاعیه

Collapse
No announcement yet.

مشکل با rs485

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

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

    کد قسمت master
    کد:
    [
    $regfile = "m16def.dat"
    $crystal = 11059200
    $hwstack = 50
    $swstack = 50
    $framesize = 50
    $baud = 9600
    '-------------------------------------------------------
    
    Config Portc = Output
    Config Portd.2 = Output
    Portd.2 = 1
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Portd.5 = Output
    Config Portd.6 = Output
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    Config Pina.4 = Input
    Config Pina.5 = Input
    Config Pina.6 = Input
    Config Pina.7 = Input
    
    Const Field_start = 253
    Const Field_end = 254
    Const Slave_address = 1
    '--------------------------------------------------------
    Dim Serial_idx As Byte , Data0 As Byte , Data1 As Byte , Data2 As Byte
    Dim Data_req(3) As Byte
    Dim A As Byte , K As Byte
    Dim Aaa As Byte , Ii As Byte , Jj As Byte , Highi As Byte , Highj As Byte
    Dim Bbb As Byte , I As Byte , J As Byte , Lowi As Byte , Lowj As Byte
    Dim Ax As Word
    Dim B As Byte , Sta As Byte
    Dim D As Byte
    Dim Bx As Word
    Dim W As Byte , G As Bit
    Dim S As Byte , F As Byte
    Dim X As Word
    Dim Sa As Word
    Dim Ma As Eram Word
    Dim Mi As Eram Word
    Dim Maa As Eram Word
    Dim Mii As Eram Word
    Dim Bb As Word , Hight As Word
    Dim Cc As Word , Lowt As Word
    
    Dim B_high As Word , Hight_high As Word
    Dim B_low As Word , Hight_low As Word
    Dim C_high As Word , Lowt_high As Word
    Dim C_low As Word , Lowt_low As Word
    
    Dim T As Byte , Tw As Byte , Ttw As Byte
    Dim Ww As Bit , Www As Bit , Aw As Bit , Bw As Bit , Cw As Bit , Dw As Bit
    Bb = Ma
    Cc = Mi
    Hight = Maa
    Lowt = Mii
    
    '---------------------------------------------
    Set_key Alias Pina.6
    Up Alias Pina.4
    Down Alias Pina.7
    Esc Alias Pina.5
    Relayh Alias Portb.2
    Relayl Alias Portb.3
    Le1 Alias Portd.3
    Le2 Alias Portd.5
    Le3 Alias Portd.4
    Le4 Alias Portd.6
    T = 1
    K = 0
    W = 11
    
    
    
    '--------------------------------------------
    
    On Urxc Rec0_isr
    Enable Urxc
    Enable Interrupts
    '--------------------------------------------
    Getdata:
    Do
     Portd.2 = 1
     'to slave 1
     Data_req(1) = Field_start
     Data_req(2) = Slave_address                'slave address<===
     Data_req(3) = Field_end
    
     For I = 1 To 3
     Printbin Data_req(i)
     Waitms 10
     Next I
     'wait for response
     Serial_idx = 0
     Portd.2 = 0
     Waitms 500
     'check response
     If Serial_idx = 3 Then
     Serial_idx = 0
     If Data1 = Data2 Then
     S = Data1
     Else
     'error
     End If
    
      If S = 5 Then Relayh = 1
      If S = 15 Then
      Relayh = 0
      Relayl = 1
      End If
      If S = 30 Then
      Relayh = 1
      Relayl = 0
      End If
      If S = 45 Then
      Relayh = 0
      Relayl = 1
      End If
      If S = 60 Then
      Relayh = 1
      Relayl = 0
      End If
      If S = 85 Then
      Relayh = 0
      Relayl = 1
      End If
      If S = 95 Then
      Relayh = 1
      Relayl = 0
      End If
    
      Portc = Lookup(10 , Digit)
      Le1 = 1
    
      Le1 = 0
    
      Portc = Lookup(1 , Digit)
      Le2 = 1
    
      Le2 = 0
      If S < 10 Then
      Portc = Lookup(0 , Digit)
      Le3 = 1
    
      Le3 = 0
    
      Portc = Lookup(s , Digit)
      Le4 = 1
    
      Le4 = 0
      End If
      If S >= 10 Then
      Aaa = S / 10
      Portc = Lookup(aaa , Digit)
      Le3 = 1
    
      Le3 = 0
    
      '---------------------------------------
      Bbb = S Mod 10
      Portc = Lookup(bbb , Digit)
      Le4 = 1
    
      Le4 = 0
      Waitms 100
      End If
     End If
    Loop
    
    '---------------------------------------
    Rec0_isr:
     Inputbin Data0
     Select Case Serial_idx
     Case 0:
     If Data0 = Field_start Then Incr Serial_idx
     Case 1:
     If Data0 = Slave_address Then
      Incr Serial_idx
     Else
      Serial_idx = 0
     End If
     Case 2:
     If Data0 < 100 Then
      Incr Serial_idx
      Data1 = Data0
     Else
      Serial_idx = 0
     End If
     Case 3:
     If Data0 < 100 Then
      Incr Serial_idx
      Data2 = Data0
     Else
      Serial_idx = 0
     End If
     Case 4:
     If Data0 = Field_end Then
      Incr Serial_idx
     Else
      Serial_idx = 0
     End If
     End Select
    Return
    '---------------------------------------
    
    Digit1:
    Data &B01110111                       '0
    Data &B00100100                       '1
    Data &B01011110                       '2
    Data &B01101110                       '3
    Data &B00101101                       '4
    Data &B01101011                       '5
    Data &B01111011                       '6
    Data &B00100110                       '7
    Data &B01111111                       '8
    Data &B01101111                       '9
    Data &B00111111                       'A
    Data &B00001000                       '-
    Data &B01010001                       'L
    Data &B00111101                       'H
    
    '---------------------------------------
    Digit:
    Data &B00111111                       '0
    Data &B00000110
    Data &B01011011
    Data &B01001111
    Data &B01100110
    Data &B01101101
    Data &B01111100
    Data &B00000111
    Data &B01111111
    Data &B01100111                       '9
    Data &B01110111
    Data &B01000000
    Data &B00111000
    Data &B01110110
    ]

    دیدگاه


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

      فعلا به نرم افزارهام دسترسی ندارم. این کد رو میزارم اگه مشکل داشت، ان شاا... شنبه در خدمت شما هستم.
      در ضمن من متوجه منظورتون از rx frame size error نشدم
      برنامه master
      کد:
      [
      $regfile = "m16def.dat"
      $crystal = 11059200
      $hwstack = 100
      $swstack = 100
      $framesize = 100
      $baud = 9600
      '-------------------------------------------------------
      
      Config Portc = Output
      Config Portd.2 = Output
      Portd.2 = 1
      Config Portd.3 = Output
      Config Portd.4 = Output
      Config Portd.5 = Output
      Config Portd.6 = Output
      Config Portb.0 = Output
      Config Portb.1 = Output
      Config Portb.2 = Output
      Config Portb.3 = Output
      Config Pina.4 = Input
      Config Pina.5 = Input
      Config Pina.6 = Input
      Config Pina.7 = Input
      
      Const Field_start = 253
      Const Field_end = 254
      Const function_code = 250
      '--------------------------------------------------------
      Dim Serial_idx As Byte , Data0 As Byte , Data1 As Byte , Data2 As Byte, address as byte
      Dim Data_req(4) As Byte
      Dim Data_res(6) As Byte
      Dim A As Byte , K As Byte
      Dim Aaa As Byte , Ii As Byte , Jj As Byte , Highi As Byte , Highj As Byte
      Dim Bbb As Byte , I As Byte , J As Byte , Lowi As Byte , Lowj As Byte
      Dim Ax As Word
      Dim B As Byte , Sta As Byte
      Dim D As Byte
      Dim Bx As Word
      Dim W As Byte , G As Bit
      Dim S As Byte , F As Byte
      Dim X As Word
      Dim Sa As Word
      Dim Ma As Eram Word
      Dim Mi As Eram Word
      Dim Maa As Eram Word
      Dim Mii As Eram Word
      Dim Bb As Word , Hight As Word
      Dim Cc As Word , Lowt As Word
      
      Dim B_high As Word , Hight_high As Word
      Dim B_low As Word , Hight_low As Word
      Dim C_high As Word , Lowt_high As Word
      Dim C_low As Word , Lowt_low As Word
      
      Dim T As Byte , Tw As Byte , Ttw As Byte
      Dim Ww As Bit , Www As Bit , Aw As Bit , Bw As Bit , Cw As Bit , Dw As Bit
      Bb = Ma
      Cc = Mi
      Hight = Maa
      Lowt = Mii
      
      '---------------------------------------------
      Set_key Alias Pina.6
      Up Alias Pina.4
      Down Alias Pina.7
      Esc Alias Pina.5
      Relayh Alias Portb.2
      Relayl Alias Portb.3
      Le1 Alias Portd.3
      Le2 Alias Portd.5
      Le3 Alias Portd.4
      Le4 Alias Portd.6
      T = 1
      K = 0
      W = 11
      
      
      
      '--------------------------------------------
      
      On Urxc Rec0_isr
      Enable Urxc
      Enable Interrupts
      '--------------------------------------------
      Getdata:
      Do
       Portd.2 = 1
       'to slave 1
       Data_req(1) = Field_start
       Data_req(2) = Slave_address                'slave address<===
       Data_req(3) = function_code
       Data_req(4) = Field_end
      
       For I = 1 To 4
       Printbin Data_req(i)
       Waitms 10
       Next I
       'wait for response
       Serial_idx = 0
       Portd.2 = 0
       Waitms 500
       'check response
       If Serial_idx = 6 Then
       Serial_idx = 0
       If Data1 = Data2 Then
       S = Data1
       Else
       'error
       End If
      
        If S = 5 Then Relayh = 1
        If S = 15 Then
        Relayh = 0
        Relayl = 1
        End If
        If S = 30 Then
        Relayh = 1
        Relayl = 0
        End If
        If S = 45 Then
        Relayh = 0
        Relayl = 1
        End If
        If S = 60 Then
        Relayh = 1
        Relayl = 0
        End If
        If S = 85 Then
        Relayh = 0
        Relayl = 1
        End If
        If S = 95 Then
        Relayh = 1
        Relayl = 0
        End If
      
        Portc = Lookup(10 , Digit)
        Le1 = 1
      
        Le1 = 0
      
        Portc = Lookup(1 , Digit)
        Le2 = 1
      
        Le2 = 0
        If S < 10 Then
        Portc = Lookup(0 , Digit)
        Le3 = 1
      
        Le3 = 0
      
        Portc = Lookup(s , Digit)
        Le4 = 1
      
        Le4 = 0
        End If
        If S >= 10 Then
        Aaa = S / 10
        Portc = Lookup(aaa , Digit)
        Le3 = 1
      
        Le3 = 0
      
        '---------------------------------------
        Bbb = S Mod 10
        Portc = Lookup(bbb , Digit)
        Le4 = 1
      
        Le4 = 0
        Waitms 100
        End If
       End If
      Loop
      
      '---------------------------------------
      Rec0_isr:
       Inputbin Data0
       Select Case Serial_idx
       Case 0:
       If Data0 = Field_start Then Incr Serial_idx
       Case 1:
       If Data0 = Slave_address Then
        address = Data0
        Incr Serial_idx
       Else
        Serial_idx = 0
       End If
       Case 2:
       If Data0 = function_code Then
        Incr Serial_idx
       Else
        Serial_idx = 0
       End If
       Case 3:
       If Data0 < 100 Then
        Incr Serial_idx
        Data1 = Data0
       Else
        Serial_idx = 0
       End If
       Case 4:
       If Data0 < 100 Then
        Incr Serial_idx
        Data2 = Data0
       Else
        Serial_idx = 0
       End If
       Case 5:
       If Data0 = Field_end Then
        Incr Serial_idx
       Else
        Serial_idx = 0
       End If
       End Select
      Return
      '---------------------------------------
      
      Digit1:
      Data &B01110111                       '0
      Data &B00100100                       '1
      Data &B01011110                       '2
      Data &B01101110                       '3
      Data &B00101101                       '4
      Data &B01101011                       '5
      Data &B01111011                       '6
      Data &B00100110                       '7
      Data &B01111111                       '8
      Data &B01101111                       '9
      Data &B00111111                       'A
      Data &B00001000                       '-
      Data &B01010001                       'L
      Data &B00111101                       'H
      
      '---------------------------------------
      Digit:
      Data &B00111111                       '0
      Data &B00000110
      Data &B01011011
      Data &B01001111
      Data &B01100110
      Data &B01101101
      Data &B01111100
      Data &B00000111
      Data &B01111111
      Data &B01100111                       '9
      Data &B01110111
      Data &B01000000
      Data &B00111000
      Data &B01110110
      برنامه slave 1
      کد:
      [$regfile = "m8def.dat"
      $crystal = 11059200
      $hwstack = 50
      $swstack = 50
      $framesize = 50
      $baud = 9600
      
      Config Adc = Single , Prescaler = Auto
      Start Adc
      
      Config Portd.2 = Output
      
      Const Field_start = 253
      Const Field_end = 254
      Const Slave_address = 1
      Const function_code = 250
      '--------------------------------------------------------
      Dim A As Long
      Dim B As Long
      Dim C As Byte , I As Byte
      Dim T(10) As String * 10
      Dim T1 As Word
      Dim T2 As String * 10
      Dim W As Byte
      Dim Adc1 As Word
      Dim Adc0 As Word
      Dim Adc2 As Word
      Dim Adc3 As Word
      
      Dim Singlee0 As Word
      Dim Singlee1 As Word
      
      Dim Temp As Byte , Sta As Byte , Fin As Byte
      Dim Temp2 As Byte
      Dim Temp3 As Word
      Dim Temp4 As Byte
      
      Dim Stringg As String * 1
      Dim Stringg2 As String * 8
      Dim Data0 As Byte , Data1 As Byte , Data2 As Byte
      Dim Data_arr(6) As Byte
      'Dim Data_res(6) As Byte
      Dim Serial_idx As Byte
      '------------------------------------------
      Temp = 0
      On Urxc Rec0_isr
      Enable Urxc
      Enable Interrupts
      '------------------------------------------
      Do
      
      Portd.2 = 0
       Temp = Temp + 1
       Waitms 400
       If Temp > 99 Then Temp = 0
       If Serial_idx = 3 Then                   'data is ready now
        waitms 100	
        Serial_idx = 0
        Portd.2 = 1                       'data is true
        'create response
        Portd.2 = 1
        Data_arr(1) = Field_start
        Data_arr(2) = Slave_address
        Data_arr(3) = function_code
        Data_arr(4) = Temp
        Data_arr(5) = Temp
        Data_arr(6) = Field_end
      
        'send response
        For I = 1 To 6
        Printbin Data_arr(i)
        Next I
      
      End If
      Loop
      
      End
      '------------------------------------------
      Rec0_isr:
       Inputbin Data0
       Select Case Serial_idx
       Case 0:
       If Data0 = Field_start Then Incr Serial_idx
       Case 1:
       If Data0 = slave_address Then
        Incr Serial_idx
       Else
        Serial_idx = 0
       End If
       Case 2:
       If Data0 = function_code Then
        Incr Serial_idx
       Else
        Serial_idx = 0
       End If
       Case 3:
       If Data0 = Field_end Then
        Incr Serial_idx
       Else
        Serial_idx = 0
       End If
       End Select
      Return
      
      
      '----

      دیدگاه


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

        سلام دوست عزیز با تشکر از وقتی که برای من میذارید
        فکر میکنم کد نوشته شده از لحاظ زمان بندی ایراد داره فایل شبیه ساز پروتیوس و میذارم با برنامه هماهنگ کنید متوجه میشوید
        sari62.persiangig.com/Circuit.rar

        دیدگاه


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

          نوشته اصلی توسط saeid bahari
          سلام دوست عزیز با تشکر از وقتی که برای من میذارید
          فکر میکنم کد نوشته شده از لحاظ زمان بندی ایراد داره فایل شبیه ساز پروتیوس و میذارم با برنامه هماهنگ کنید متوجه میشوید
          sari62.persiangig.com/Circuit.rar
          سلام علیکم. همان طور که گفتید مشکل در زمان بندی است. من برنامه را کمی تغییر داده و حدود چند دقیقه آزمایش کردم و بدون مشکل کار کرد. برای آزمایش پورت A0 را در master خروجی تعریف کردم و به ازای هر ارسال و دریافت صحیح قاب داده، یک بار چشمک می زند. برنامه را در فایل پروتئوس خودتان آزمایش کردم و البته بخش های مربوط به خروجی ها را rem کردم. در هنگام ویرایش برنامه، باید تاخیرها را در master و هم در slave مدنظر قرار دهید تا یک زمان بندی صحیح داشته باشید. برنامه master پس از ارسال درخواست، 500 میلی ثانیه منتظر می ماند و برنامه slave باید در کمتر از این مدت پاسخ را ارسال کند که فعلا حدود 50 میلی ثانیه است.
          master
          کد:
          $regfile = "m16def.dat"
          $crystal = 11059200
          $hwstack = 100
          $swstack = 100
          $framesize = 100
          $baud = 9600
          '-------------------------------------------------------
          
          Config Portc = Output
          Config Portd.2 = Output
          Portd.2 = 1
          Config Portd.3 = Output
          Config Portd.4 = Output
          Config Portd.5 = Output
          Config Portd.6 = Output
          Config Portb.0 = Output
          Config Portb.1 = Output
          Config Portb.2 = Output
          Config Portb.3 = Output
          Config Pina.4 = Input
          Config Pina.5 = Input
          Config Pina.6 = Input
          Config Pina.7 = Input
          
          Const Field_start = 253
          Const Field_end = 254
          Const Function_code = 250
          '--------------------------------------------------------
          Dim Serial_idx As Byte , Data0 As Byte , Data1 As Byte , Data2 As Byte, address as byte
          Dim Data_req(4) As Byte
          Dim Data_res(6) As Byte , Slave_address As Byte
          Dim A As Byte , K As Byte
          Dim Aaa As Byte , Ii As Byte , Jj As Byte , Highi As Byte , Highj As Byte
          Dim Bbb As Byte , I As Byte , J As Byte , Lowi As Byte , Lowj As Byte
          Dim Ax As Word
          Dim B As Byte , Sta As Byte
          Dim D As Byte
          Dim Bx As Word
          Dim W As Byte , G As Bit
          Dim S As Byte , F As Byte
          Dim X As Word
          Dim Sa As Word
          Dim Ma As Eram Word
          Dim Mi As Eram Word
          Dim Maa As Eram Word
          Dim Mii As Eram Word
          Dim Bb As Word , Hight As Word
          Dim Cc As Word , Lowt As Word
          
          Dim B_high As Word , Hight_high As Word
          Dim B_low As Word , Hight_low As Word
          Dim C_high As Word , Lowt_high As Word
          Dim C_low As Word , Lowt_low As Word
          
          Dim T As Byte , Tw As Byte , Ttw As Byte
          Dim Ww As Bit , Www As Bit , Aw As Bit , Bw As Bit , Cw As Bit , Dw As Bit
          Bb = Ma
          Cc = Mi
          Hight = Maa
          Lowt = Mii
          
          '---------------------------------------------
          Set_key Alias Pina.6
          Up Alias Pina.4
          Down Alias Pina.7
          Esc Alias Pina.5
          Relayh Alias Portb.2
          Relayl Alias Portb.3
          Le1 Alias Portd.3
          Le2 Alias Portd.5
          Le3 Alias Portd.4
          Le4 Alias Portd.6
          T = 1
          K = 0
          W = 11
          
          Led Alias Porta.0
          Config Led = Output
          
          '--------------------------------------------
          
          On Urxc Rec0_isr
          Enable Urxc
          Enable Interrupts
          '--------------------------------------------
          Getdata:
          Portd.2 = 1
          Do
           'to slave 1
           Slave_address = 1
           Data_req(1) = Field_start
           Data_req(2) = Slave_address                'slave address<===
           Data_req(3) = function_code
           Data_req(4) = Field_end
          
           Portd.2 = 1
           For I = 1 To 4
           Printbin Data_req(i)
           Waitms 10
           Next I
           'wait for response
           Serial_idx = 0
           Portd.2 = 0
           Waitms 500
           'check response
           If Serial_idx = 6 Then
           Serial_idx = 0
           If Data1 = Data2 Then
            Set Led
            Waitms 300
            Reset Led
            S = Data1
           Else
           'error
           End If
          
          '  If S = 5 Then Relayh = 1
          '  If S = 15 Then
          '  Relayh = 0
          '  Relayl = 1
          '  End If
          '  If S = 30 Then
          '  Relayh = 1
          '  Relayl = 0
          '  End If
          '  If S = 45 Then
          '  Relayh = 0
          '  Relayl = 1
          '  End If
          '  If S = 60 Then
          '  Relayh = 1
          '  Relayl = 0
          '  End If
          '  If S = 85 Then
          '  Relayh = 0
          '  Relayl = 1
          '  End If
          '  If S = 95 Then
          '  Relayh = 1
          '  Relayl = 0
          '  End If
          
          '  Portc = Lookup(10 , Digit)
          '  Le1 = 1
          
          '  Le1 = 0
          
          '  Portc = Lookup(1 , Digit)
          '  Le2 = 1
          
          '  Le2 = 0
          '  If S < 10 Then
          '  Portc = Lookup(0 , Digit)
          '  Le3 = 1
          
          '  Le3 = 0
          
          '  Portc = Lookup(s , Digit)
          '  Le4 = 1
          
          '  Le4 = 0
          '  End If
          '  If S >= 10 Then
          '  Aaa = S / 10
          '  Portc = Lookup(aaa , Digit)
          '  Le3 = 1
          
          '  Le3 = 0
          
          '  '---------------------------------------
          '  Bbb = S Mod 10
          '  Portc = Lookup(bbb , Digit)
          '  Le4 = 1
          
          '  Le4 = 0
          '  Waitms 100
          '  End If
           End If
          Loop
          
          '---------------------------------------
          Rec0_isr:
           Inputbin Data0
           Select Case Serial_idx
           Case 0:
           If Data0 = Field_start Then Incr Serial_idx
           Case 1:
           If Data0 = Slave_address Then
            address = Data0
            Incr Serial_idx
           Else
            Serial_idx = 0
           End If
           Case 2:
           If Data0 = function_code Then
            Incr Serial_idx
           Else
            Serial_idx = 0
           End If
           Case 3:
           If Data0 < 100 Then
            Incr Serial_idx
            Data1 = Data0
           Else
            Serial_idx = 0
           End If
           Case 4:
           If Data0 < 100 Then
            Incr Serial_idx
            Data2 = Data0
           Else
            Serial_idx = 0
           End If
           Case 5:
           If Data0 = Field_end Then
            Incr Serial_idx
           Else
            Serial_idx = 0
           End If
           End Select
          Return
          '---------------------------------------
          
          Digit1:
          Data &B01110111                       '0
          Data &B00100100                       '1
          Data &B01011110                       '2
          Data &B01101110                       '3
          Data &B00101101                       '4
          Data &B01101011                       '5
          Data &B01111011                       '6
          Data &B00100110                       '7
          Data &B01111111                       '8
          Data &B01101111                       '9
          Data &B00111111                       'A
          Data &B00001000                       '-
          Data &B01010001                       'L
          Data &B00111101                       'H
          
          '---------------------------------------
          Digit:
          Data &B00111111                       '0
          Data &B00000110
          Data &B01011011
          Data &B01001111
          Data &B01100110
          Data &B01101101
          Data &B01111100
          Data &B00000111
          Data &B01111111
          Data &B01100111                       '9
          Data &B01110111
          Data &B01000000
          Data &B00111000
          Data &B01110110
          slave
          کد:
          $regfile = "m8def.dat"
          $crystal = 11059200
          $hwstack = 50
          $swstack = 50
          $framesize = 50
          $baud = 9600
          
          Config Adc = Single , Prescaler = Auto
          Start Adc
          
          Config Portd.2 = Output
          
          Const Field_start = 253
          Const Field_end = 254
          Const Slave_address = 1
          Const function_code = 250
          '--------------------------------------------------------
          Dim A As Long
          Dim B As Long
          Dim C As Byte , I As Byte
          Dim T(10) As String * 10
          Dim T1 As Word
          Dim T2 As String * 10
          Dim W As Byte
          Dim Adc1 As Word
          Dim Adc0 As Word
          Dim Adc2 As Word
          Dim Adc3 As Word
          
          Dim Singlee0 As Word
          Dim Singlee1 As Word
          
          Dim Temp As Byte , Sta As Byte , Fin As Byte
          Dim Temp2 As Byte
          Dim Temp3 As Word
          Dim Temp4 As Byte
          
          Dim Stringg As String * 1
          Dim Stringg2 As String * 8
          Dim Data0 As Byte , Data1 As Byte , Data2 As Byte
          Dim Data_arr(6) As Byte
          'Dim Data_res(6) As Byte
          Dim Serial_idx As Byte
          '------------------------------------------
          Temp = 0
          On Urxc Rec0_isr
          Enable Urxc
          Enable Interrupts
          '------------------------------------------
          Portd.2 = 0
          Do
           Temp = Temp + 1
           If Temp > 99 Then Temp = 0
           If Serial_idx = 4 Then                   'data is ready now
            Portd.2 = 1
            Waitms 50
            Serial_idx = 0
          
            'create response
            Data_arr(1) = Field_start
            Data_arr(2) = Slave_address
            Data_arr(3) = function_code
            Data_arr(4) = Temp
            Data_arr(5) = Temp
            Data_arr(6) = Field_end
          
            'send response
            For I = 1 To 6
            Printbin Data_arr(i)
            Next I
            Portd.2 = 0
           End If
          Loop
          
          End
          '------------------------------------------
          Rec0_isr:
           Inputbin Data0
           Select Case Serial_idx
           Case 0:
           If Data0 = Field_start Then Incr Serial_idx
           Case 1:
           If Data0 = slave_address Then
            Incr Serial_idx
           Else
            Serial_idx = 0
           End If
           Case 2:
           If Data0 = function_code Then
            Incr Serial_idx
           Else
            Serial_idx = 0
           End If
           Case 3:
           If Data0 = Field_end Then
            Incr Serial_idx
           Else
            Serial_idx = 0
           End If
           End Select
          Return
          
          
          '----

          دیدگاه


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

            آقا دستت درد نکنه امیدوارم که بتونم لطف شما رو جبران کنم

            دیدگاه


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

              با سلام مجدد خدمت دوست عزیز دوباره همون خطای rx frame error میده لطفا چک بفرمایید

              دیدگاه


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

                نوشته اصلی توسط soh3il
                با سلام مجدد خدمت دوست عزیز دوباره همون خطای rx frame error میده لطفا چک بفرمایید
                من کد بالا رو با فایل شبیه سازی خودتون اجرا کردم. rx frame size رو در کدوم قسمت نشون می ده؟ لطفا کد بالا رو با بسکام کامپایل کنید و با فایل شبیه سازی که کذاشتید (sari62.persiangig.com/Circuit.rar)، اجرا و نتیجه را اعلام کنید.

                دیدگاه


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

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

                  دیدگاه


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

                    دوست عزیز من به صورت عملی با max485کار کردم و تونستم 12 تا کنترلر رو با هم شبکه کنم
                    بعضی وقت ها به خاطر عدم تطبیق امپدانس این مشکل پیش میاد که مقاومت میزارن اگه مدارت بالای 5 متر جواب نداده بین پایه های a,bباید در ابتدا و انتهای سیم مقاومت بزاری که مقدار مقاومت حدودا48 اهم است البته برای مسیر های خیلی طولانی
                    اینجا ممکنه جنس سیم ارتباطی شما مقاومت زیادی داشته باشه

                    من نه آنم که زبونی کشم از چرخ فلک
                    چرخ بر هم زنم ار غیر مرادم باشد

                    دیدگاه


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

                      نوشته اصلی توسط soh3il
                      توی قسمت شبیه ساز کنار علامت stop یک قسمتی هست که کدهای خطا رو نشون میده من با بسکام کامپایل کردم و با همون شبیه ساز آزمایش کردم پیغام خطا میده د بعد از یکی دو دقیقه به خاطر تعداد زیاد خطا شبیه ساز از کار باز می ایسته
                      با تشکر از لطف جناب عالی
                      با وجود اعلام خطا، مدار به درستی کار می کند و یک و صفر شدن پورت A.1 را می توانید مشاهده کنید. چون از یک پروتکل و نه فقط یک بایت داده، برای ارتباط استفاده شده، خطا در برنامه تشخیص داده می شود. من فکر می کنم مدار در عمل بدون خطا کار کند و دلیل اعلام خطا، عدم واقعی بودن زمانبندی در شبیه سازی، توسط پروتئوس است. در ضمن به دلیل تعداد زیاد خطا، شبیه ساز از کار نمی ایستد و به کار خود ادامه می دهد. در کد زیر مقدار شمارش ارسالی توسط slave، در master بر روی پورت B نمایش داده می شود و می توانید مقدار پورت B را در پروتئوس مشاهده کنید که پس از هر بار ارتباط، یک واحد افزایش می یابد.
                      master
                      کد:
                      $regfile = "m16def.dat"
                      $crystal = 11059200
                      $hwstack = 100
                      $swstack = 100
                      $framesize = 100
                      $baud = 9600
                      '-------------------------------------------------------
                      
                      Config Portc = Output
                      Config Portd.2 = Output
                      Portd.2 = 1
                      Config Portd.3 = Output
                      Config Portd.4 = Output
                      Config Portd.5 = Output
                      Config Portd.6 = Output
                      'Config Portb.0 = Output
                      Config Portb = Output
                      Config Portb.1 = Output
                      Config Portb.2 = Output
                      Config Portb.3 = Output
                      Config Pina.4 = Input
                      Config Pina.5 = Input
                      Config Pina.6 = Input
                      Config Pina.7 = Input
                      
                      Const Field_start = 253
                      Const Field_end = 254
                      Const Function_code = 250
                      '--------------------------------------------------------
                      Dim Serial_idx As Byte , Data0 As Byte , Data1 As Byte , Data2 As Byte , Address As Byte
                      Dim Data_req(4) As Byte
                      Dim Data_res(6) As Byte , Slave_address As Byte
                      Dim A As Byte , K As Byte
                      Dim Aaa As Byte , Ii As Byte , Jj As Byte , Highi As Byte , Highj As Byte
                      Dim Bbb As Byte , I As Byte , J As Byte , Lowi As Byte , Lowj As Byte
                      Dim Ax As Word
                      Dim B As Byte , Sta As Byte
                      Dim D As Byte
                      Dim Bx As Word
                      Dim W As Byte , G As Bit
                      Dim S As Byte , F As Byte
                      Dim X As Word
                      Dim Sa As Word
                      Dim Ma As Eram Word
                      Dim Mi As Eram Word
                      Dim Maa As Eram Word
                      Dim Mii As Eram Word
                      Dim Bb As Word , Hight As Word
                      Dim Cc As Word , Lowt As Word
                      
                      Dim B_high As Word , Hight_high As Word
                      Dim B_low As Word , Hight_low As Word
                      Dim C_high As Word , Lowt_high As Word
                      Dim C_low As Word , Lowt_low As Word
                      
                      Dim T As Byte , Tw As Byte , Ttw As Byte
                      Dim Ww As Bit , Www As Bit , Aw As Bit , Bw As Bit , Cw As Bit , Dw As Bit
                      Bb = Ma
                      Cc = Mi
                      Hight = Maa
                      Lowt = Mii
                      
                      '---------------------------------------------
                      Set_key Alias Pina.6
                      Up Alias Pina.4
                      Down Alias Pina.7
                      Esc Alias Pina.5
                      Relayh Alias Portb.2
                      Relayl Alias Portb.3
                      Le1 Alias Portd.3
                      Le2 Alias Portd.5
                      Le3 Alias Portd.4
                      Le4 Alias Portd.6
                      T = 1
                      K = 0
                      W = 11
                      
                      Led Alias Porta.0
                      Config Led = Output
                      
                      '--------------------------------------------
                      
                      On Urxc Rec0_isr
                      Enable Urxc
                      Enable Interrupts
                      '--------------------------------------------
                      Getdata:
                      Portd.2 = 1
                      Do
                       'to slave 1
                       Slave_address = 1
                       Data_req(1) = Field_start
                       Data_req(2) = Slave_address                'slave address<===
                       Data_req(3) = Function_code
                       Data_req(4) = Field_end
                      
                       Portd.2 = 1
                       For I = 1 To 4
                       Printbin Data_req(i)
                       Waitms 10
                       Next I
                       'wait for response
                       Serial_idx = 0
                       Portd.2 = 0
                       Waitms 500
                       'check response
                       If Serial_idx = 6 Then
                       Serial_idx = 0
                       If Data1 = Data2 Then
                        Set Led
                        Waitms 300
                        Reset Led
                        S = Data1
                        Portb = S
                       Else
                       'error
                       End If
                      
                      '  If S = 5 Then Relayh = 1
                      '  If S = 15 Then
                      '  Relayh = 0
                      '  Relayl = 1
                      '  End If
                      '  If S = 30 Then
                      '  Relayh = 1
                      '  Relayl = 0
                      '  End If
                      '  If S = 45 Then
                      '  Relayh = 0
                      '  Relayl = 1
                      '  End If
                      '  If S = 60 Then
                      '  Relayh = 1
                      '  Relayl = 0
                      '  End If
                      '  If S = 85 Then
                      '  Relayh = 0
                      '  Relayl = 1
                      '  End If
                      '  If S = 95 Then
                      '  Relayh = 1
                      '  Relayl = 0
                      '  End If
                      
                      '  Portc = Lookup(10 , Digit)
                      '  Le1 = 1
                      
                      '  Le1 = 0
                      
                      '  Portc = Lookup(1 , Digit)
                      '  Le2 = 1
                      
                      '  Le2 = 0
                      '  If S < 10 Then
                      '  Portc = Lookup(0 , Digit)
                      '  Le3 = 1
                      
                      '  Le3 = 0
                      
                      '  Portc = Lookup(s , Digit)
                      '  Le4 = 1
                      
                      '  Le4 = 0
                      '  End If
                      '  If S >= 10 Then
                      '  Aaa = S / 10
                      '  Portc = Lookup(aaa , Digit)
                      '  Le3 = 1
                      
                      '  Le3 = 0
                      
                      '  '---------------------------------------
                      '  Bbb = S Mod 10
                      '  Portc = Lookup(bbb , Digit)
                      '  Le4 = 1
                      
                      '  Le4 = 0
                      '  Waitms 100
                      '  End If
                       End If
                      Loop
                      
                      '---------------------------------------
                      Rec0_isr:
                       Inputbin Data0
                       Select Case Serial_idx
                       Case 0:
                       If Data0 = Field_start Then Incr Serial_idx
                       Case 1:
                       If Data0 = Slave_address Then
                        Address = Data0
                        Incr Serial_idx
                       Else
                        Serial_idx = 0
                       End If
                       Case 2:
                       If Data0 = Function_code Then
                        Incr Serial_idx
                       Else
                        Serial_idx = 0
                       End If
                       Case 3:
                       If Data0 < 100 Then
                        Incr Serial_idx
                        Data1 = Data0
                       Else
                        Serial_idx = 0
                       End If
                       Case 4:
                       If Data0 < 100 Then
                        Incr Serial_idx
                        Data2 = Data0
                       Else
                        Serial_idx = 0
                       End If
                       Case 5:
                       If Data0 = Field_end Then
                        Incr Serial_idx
                       Else
                        Serial_idx = 0
                       End If
                       End Select
                      Return
                      '---------------------------------------
                      
                      Digit1:
                      Data &B01110111                       '0
                      Data &B00100100                       '1
                      Data &B01011110                       '2
                      Data &B01101110                       '3
                      Data &B00101101                       '4
                      Data &B01101011                       '5
                      Data &B01111011                       '6
                      Data &B00100110                       '7
                      Data &B01111111                       '8
                      Data &B01101111                       '9
                      Data &B00111111                       'A
                      Data &B00001000                       '-
                      Data &B01010001                       'L
                      Data &B00111101                       'H
                      
                      '---------------------------------------
                      Digit:
                      Data &B00111111                       '0
                      Data &B00000110
                      Data &B01011011
                      Data &B01001111
                      Data &B01100110
                      Data &B01101101
                      Data &B01111100
                      Data &B00000111
                      Data &B01111111
                      Data &B01100111                       '9
                      Data &B01110111
                      Data &B01000000
                      Data &B00111000
                      Data &B01110110
                      slave
                      کد:
                      $regfile = "m8def.dat"
                      $crystal = 11059200
                      $hwstack = 50
                      $swstack = 50
                      $framesize = 50
                      $baud = 9600
                      
                      Config Adc = Single , Prescaler = Auto
                      Start Adc
                      
                      Config Portd.2 = Output
                      
                      Const Field_start = 253
                      Const Field_end = 254
                      Const Slave_address = 1
                      Const Function_code = 250
                      '--------------------------------------------------------
                      Dim A As Long
                      Dim B As Long
                      Dim C As Byte , I As Byte
                      Dim T(10) As String * 10
                      Dim T1 As Word
                      Dim T2 As String * 10
                      Dim W As Byte
                      Dim Adc1 As Word
                      Dim Adc0 As Word
                      Dim Adc2 As Word
                      Dim Adc3 As Word
                      
                      Dim Singlee0 As Word
                      Dim Singlee1 As Word
                      
                      Dim Temp As Byte , Sta As Byte , Fin As Byte
                      Dim Temp2 As Byte
                      Dim Temp3 As Word
                      Dim Temp4 As Byte
                      
                      Dim Stringg As String * 1
                      Dim Stringg2 As String * 8
                      Dim Data0 As Byte , Data1 As Byte , Data2 As Byte
                      Dim Data_arr(6) As Byte
                      'Dim Data_res(6) As Byte
                      Dim Serial_idx As Byte
                      '------------------------------------------
                      Temp = 0
                      On Urxc Rec0_isr
                      Enable Urxc
                      Enable Interrupts
                      '------------------------------------------
                      Portd.2 = 0
                      Do
                      
                       If Serial_idx = 4 Then                   'data is ready now
                        Temp = Temp + 1
                        If Temp > 99 Then Temp = 0
                      
                        Portd.2 = 1
                        Waitms 50
                        Serial_idx = 0
                      
                        'create response
                        Data_arr(1) = Field_start
                        Data_arr(2) = Slave_address
                        Data_arr(3) = Function_code
                        Data_arr(4) = Temp
                        Data_arr(5) = Temp
                        Data_arr(6) = Field_end
                      
                        'send response
                        For I = 1 To 6
                        Printbin Data_arr(i)
                        Next I
                        Portd.2 = 0
                       End If
                      Loop
                      
                      End
                      '------------------------------------------
                      Rec0_isr:
                       Inputbin Data0
                       Select Case Serial_idx
                       Case 0:
                       If Data0 = Field_start Then Incr Serial_idx
                       Case 1:
                       If Data0 = Slave_address Then
                        Incr Serial_idx
                       Else
                        Serial_idx = 0
                       End If
                       Case 2:
                       If Data0 = Function_code Then
                        Incr Serial_idx
                       Else
                        Serial_idx = 0
                       End If
                       Case 3:
                       If Data0 = Field_end Then
                        Incr Serial_idx
                       Else
                        Serial_idx = 0
                       End If
                       End Select
                      Return
                      
                      
                      '----

                      دیدگاه


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

                        سلام کد رو یک مقدار تغییر دادم دو تا شمارنده هست تو شبیه ساز داره درست کار میکنه ولی توی عمل هر چند وقت یک بار توی مستر یک عدد رو از دست میدم لطفا یک نگاه بکنید و اشکالات و بگید با تشکر
                        کد اسلیو:
                        [$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



                        'Config Print = Portd.2 , Mode = Set
                        Config Portd.2 = Output
                        Portd.2 = 0

                        Dim Rec_arr As String * 20
                        Dim Send_arr As String * 20
                        Dim Bb As Word
                        Dim Udr_0 As Byte
                        Bb = 1

                        Rec_arr = ""

                        Do
                        Locate 1 , 1
                        Lcd Rec_arr ; " "
                        Locate 2 , 1
                        Lcd Send_arr ; " "
                        Loop
                        End





                        '---------------------------------------

                        Ser_int:


                        Rec_arr = Inkey()
                        If Rec_arr = "A" Then
                        Bb = Bb + 1
                        If Bb > 99 Then Bb = 1
                        Send_arr = Str(bb)
                        Portd.2 = 1

                        Print "A" ; Send_arr

                        Waitms 10
                        Portd.2 = 0
                        End If

                        Rec_arr = ""
                        Return][/ftp]

                        کد مستر:
                        [$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

                        'Config Print = Portd.2 , Mode = Set
                        Config Portd.2 = Output
                        Portd.2 = 1

                        Dim Send_arr As String * 2
                        Dim Send_arr2 As String * 2
                        Dim Rs_485_text As String * 20
                        Dim Rs_485_text2 As String * 20
                        Dim Rec_arr As String * 20
                        Dim C As Byte
                        Dim S0 As String * 30
                        Dim Udr_0 As Byte
                        Dim Saeid As String * 2
                        Dim Soheil As String * 1

                        C = 0
                        '-------------------------------------
                        Do

                        Portd.2 = 1
                        Send_arr = "A"
                        Print Send_arr
                        Toggle Portb.0
                        Portd.2 = 0
                        Waitms 500




                        Locate 1 , 1
                        'Lcd Rec_arr ; " "


                        Lcd " " ; Rs_485_text ; " "
                        Locate 2 , 4
                        Lcd Saeid

                        S0 = " "

                        '-------------------------------------------
                        Portd.2 = 1
                        Send_arr2 = "B"
                        Print Send_arr2
                        Toggle Portb.0
                        Portd.2 = 0
                        Waitms 500




                        Locate 1 , 10

                        Lcd " " ; Rs_485_text2 ; " "
                        Locate 2 , 4
                        Lcd Saeid

                        S0 = " "


                        Loop
                        End

                        '-------------------------------------------------

                        Ser_int:

                        Udr_0 = Udr


                        S0 = S0 + Chr(udr_0)
                        Saeid = Mid(s0 , 2 , 1)
                        If Saeid = "A" Then
                        Rs_485_text = Mid(s0 , 3 , 2)
                        End If
                        '========================================= =
                        If Saeid = "B" Then
                        Rs_485_text2 = Mid(s0 , 3 , 2)
                        End If

                        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



                        'Config Print = Portd.2 , Mode = Set
                        Config Portd.2 = Output
                        Portd.2 = 0

                        Dim Rec_arr As String * 20
                        Dim Send_arr As String * 20
                        Dim Bb As Word
                        Dim Udr_0 As Byte
                        Bb = 1

                        Rec_arr = ""

                        Do
                        Locate 1 , 1
                        Lcd Rec_arr ; " "
                        Locate 2 , 1
                        Lcd Send_arr ; " "
                        Loop
                        End





                        '---------------------------------------

                        Ser_int:


                        Rec_arr = Inkey()
                        If Rec_arr = "B" Then
                        Bb = Bb + 1
                        If Bb > 99 Then Bb = 1
                        Send_arr = Str(bb)
                        Portd.2 = 1

                        Print "B" ; Send_arr

                        Waitms 10
                        Portd.2 = 0
                        End If

                        Rec_arr = ""
                        Return]

                        این هم فایل شبیه ساز:
                        http://wdl.persiangig.com/pages/download/?dl=http://sari62.persiangig.com/RS485.rar

                        دیدگاه


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

                          سلام اگر امکان دارد کد را در بخش مربوط به کد قرار دهید حتما نگاه می کنم.

                          دیدگاه


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

                            آقا هر کاری کردم نمیشه به صورت کد وارد کنم باسه همین کل فایل و زیپ میکنم و اون و ارسال :
                            http://wdl.persiangig.com/pages/download/?dl=http://sari62.persiangig.com/RS485-TEST.rar

                            دیدگاه


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

                              نوشته اصلی توسط saeid bahari
                              آقا هر کاری کردم نمیشه به صورت کد وارد کنم باسه همین کل فایل و زیپ میکنم و اون و ارسال :
                              سلام. برای قرار دادن کد می تونید از آیکون # در قسمت پاسخ استفاده کنید.
                              کد شما رو نگاه کردم. پیشنهاد می کنم برای ارسال اطلاعات از مستر، رشته ارسال نکنید، چون در انتهای رشته، کاراکترهای CR و LF هم ارسال می شود. بهتر از با استفاده از دستور Printbin یک آرایه از بایت ارسال کنید. در نتیجه در اسلیو هم کافی است بایت مورد نظر را با رعایت ترتیب از UDR برداشت کنید. در ضمن بهتر است در برنامه اسلیو، در روتین وقفه دریافت سریال، اقدام به ارسال داده نکنید و این کار را در حلقه برنامه انجام دهید. در برنامه مستر یک متغیر رشته با نام S0 تعریف شده که به طور متناوب، داده های دریافتی با آن جمع و در آن ریخته می شود که فکر می کنم برنامه را دچار مشکل کند. در هر صورت شما سعی کنید این مشکلات را برطرف کنید و من نیز تا چند ساعت دیگر کد شما را اصلاح می کنم و قرار می دهم.

                              دیدگاه


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

                                آقا ممنونم خیلی لطف میکنید این شبکه کردن میکرو ها خیلی وقتم و گرفته

                                دیدگاه

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