- 12V Akku mit 280 Ah bauen         
Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 55

Thema: RS 485 Master - Slave in Bascom???

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    19.01.2005
    Beiträge
    17
    Anzeige

    E-Bike
    Hallo darwin.nuernberg,

    die Leute im 2. Link meinen was anderes.
    Hier mal ein kleines Beispiel, habe ich mal im Web gefunden:

    Code:
    '
    ' -----[ Title ]------------------------------------------------------
    '
    ' File......: SNAP-IO.BAS
    ' Purpose...: Turns LEDs on and off
    ' Author....: Christer Johansson
    ' Version...: 1.01
    ' Started...: 980503
    ' Updated...: 980918
    ' Modified..: 991229 by Claus Kuehnel
    ' -----[ Program Description ]----------------------------------------
    '
    ' This program shows how to implement the S.N.A.P protocol in
    ' BASCOM-AVR and is an simple example to turn LEDs ON or OFF.
    ' This example uses 16-bit CRC-CCITT as error detection method which
    ' gives secure data transfer.
    '
    ' The packet structure is defined in the received packets first two
    ' bytes (HDB2 and HDB1). The following packet structure is used.
    '
    ' DD=01     - 1 Byte destination address
    ' SS=01     - 1 Byte source address
    ' PP=00     - No protocol specific flags
    ' AA=01     - Acknowledge is required
    ' D=0       - No Command Mode
    ' EEE=100   - 16-bit CRC-CCITT
    ' NNNN=0010 - 2 Byte data
    '
    ' Overview of header definition bytes (HDB2 and HDB1)
    '
    '         HDB2             HDB1
    ' +-----------------+-----------------+
    ' | D D S S P P A A | D E E E N N N N |
    ' +-----------------+-----------------+
    '
    '
    $regfile = "m128def.dat"
    $crystal = 16000000
    $baud = 19200
    $hwstack = 128
    $swstack = 128
    $framesize = 128
    
    ' -----[ Constants ]--------------------------------------------------
    '
    Const Preamble_x = &B01010101                     ' Preamble byte
    Const Sbyte_x = &B01010100                        ' Synchronisation byte
    Const Crcpoly = &H1021                            ' CRC-CCITT
    Const Hdb2_x = &H52
    Const Hdb1_x = &H48
    Const Myaddress = 123                             ' Node - Adresse
    
    ' -----[ Variables ]--------------------------------------------------
    '
    Dim Preamble As Byte                              ' Preamble byte
    Dim Sbyte As Byte                                 ' Sync byte
    Dim Crc As Word                                   ' CRC Word
    Dim Hdb1 As Byte                                  ' Header Definition Byte 1
    Dim Hdb2 As Byte                                  ' Header Definition Byte 2
    Dim Dab1 As Byte                                  ' Für welche Node-ID ist das Paket
    Dim Sab1 As Byte                                  ' Wer sendet das Paket
    Dim Db1 As Byte                                   ' Paket Data Byte 1
    Dim Db2 As Byte                                   ' Paket Data Byte 2
    Dim Db3 As Byte                                   ' Paket Data Byte 3
    Dim Db4 As Byte                                   ' Paket Data Byte 4
    Dim Db5 As Byte                                   ' Paket Data Byte 5
    Dim Db6 As Byte                                   ' Paket Data Byte 6
    Dim Db7 As Byte                                   ' Paket Data Byte 7
    Dim Db8 As Byte                                   ' Paket Data Byte 8
    Dim Crc2 As Byte                                  ' Paket CRC Hi_Byte
    Dim Crc1 As Byte                                  ' Paket CRC Lo_Byte
    Dim Temp1 As Byte                                 ' Temporäre Variable
    Dim Temp2 As Byte                                 ' Temporäre Variable
    Dim Tmpw1 As Word
    Dim Tmpw2 As Word
    Dim I As Integer
    Dim Ausgabe As String * 8
    Dim Dummy As String * 1
    
    
    ' -----[ Initialization ]---------------------------------------------
    '
    Config Portg = Output                             ' Portb ist output
    'Portb = &HFF
    
    Preamble = Preamble_x
    
    
    Sbyte = Sbyte_x
    
    Ausgabe = "   123.5"
    '------[ Program ]----------------------------------------------------
    '
    Sound Portg.0 , 15000 , 15
    
    
    _start:
        'Temp1 = Waitkey()                             ' Warten auf Daten
        Temp1 = Inkey()
        ' Ist das empf. Zeichen das  SYNC byte dann die nächsten 8 Byte
        ' vom Master lesen, sonst zurück zum Start
        If Temp1 <> Sbyte Then
            'Portg.1 = 1                               ' Irgendwas empfangen
            'Printbin Temp1
            Goto _start
        Else
            ' Get packet in binary mode
            Inputbin Hdb2 , Hdb1 , Dab1 , Sab1 , Db8 , Db7 , Db6 , Db5 , Db4 , Db3 , Db2 , Db1 , Crc2 , Crc1
            Portg.2 = 1                               ' Packet empfangen
            ' Packet header check routine
            '
            ' Check HDB2 to see if MCU are capable to use the packet
            ' structure, if not goto Start
    
            If Hdb2 <> Hdb2_x Then Goto _start
            ' Check HDB1 to see if MCu are capable to use the packet
            ' structure, if not goto Start
    
            If Hdb1 <> Hdb1_x Then Goto _start
    
            ' Address check routine
            '
            ' Check if this is the node addressed, if not goto Start
            If Dab1 <> Myaddress Then Goto _start
    
            ' Check CRC for all the received bytes
            Gosub Check_crc
    
            ' Check if there was any CRC errors, if so send NAK
            If Crc <> 0 Then Goto Nak
    
            ' No CRC errors in packet so check what to do.
    '
    ' Associated Function (place it between +++ lines)
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '        Portb = Db1
            Sound Portg.0 , 10000 , 10                'BEEP
            If Db1 = 255 Then
              Portg.1 = 1
            Else
              Portg.1 = 0
            End If
            Dummy = Mid(ausgabe , 1 , 1)
            Db1 = Asc(dummy)
            Dummy = Mid(ausgabe , 2 , 1)
            Db2 = Asc(dummy)
            Dummy = Mid(ausgabe , 3 , 1)
            Db3 = Asc(dummy)
            Dummy = Mid(ausgabe , 4 , 1)
            Db4 = Asc(dummy)
            Dummy = Mid(ausgabe , 5 , 1)
            Db5 = Asc(dummy)
            Dummy = Mid(ausgabe , 6 , 1)
            Db6 = Asc(dummy)
            Dummy = Mid(ausgabe , 7 , 1)
            Db7 = Asc(dummy)
            Dummy = Mid(ausgabe , 8 , 1)
            Db8 = Asc(dummy)
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '
    Ack_:
            ' Send ACK (i.e tell master that packet was OK)
            ' Set ACKs bit in HDB2 (xxxxxx10)
            Hdb2 = Hdb2 Or &B00000010
            Hdb2 = Hdb2 And &B11111110
            Goto Send
    
    Nak:
            ' Send NAK (i.e tell master that packet was bad)
            ' Set ACK bits in HDB2 (xxxxxx11)
            Hdb2 = Hdb2 Or &B00000011
            Goto Send
    
    Send:
            ' Swap SAB1 <-> DAB1 address bytes
            Temp2 = Sab1
            Sab1 = Dab1
            Dab1 = Temp2
    
            ' Clear CRC variable
            Crc = 0
    
            ' Put HDB2 in variable Tmp_Byte1
            Temp1 = Hdb2
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put HDB1 in variable Tmp_Byte1
            Temp1 = Hdb1
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put DAB1 in variable Tmp_Byte1
            Temp1 = Dab1
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put SAB1 in variable Tmp_Byte1
            Temp1 = Sab1
            ' Calculate CRC
            Gosub Calc_crc
    
    
            ' Put Data in variable Tmp_Byte 8
            Temp1 = Db8
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put Data in variable Tmp_Byte 7
            Temp1 = Db7
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put Data in variable Tmp_Byte 6
            Temp1 = Db6
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put Data in variable Tmp_Byte 5
            Temp1 = Db5
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put Data in variable Tmp_Byte 4
            Temp1 = Db4
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put Data in variable Tmp_Byte 3
            Temp1 = Db3
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put Data in variable Tmp_Byte 2
            Temp1 = Db2
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Put Data in variable Tmp_Byte 1
            Temp1 = Db1
            ' Calculate CRC
            Gosub Calc_crc
    
            ' Move calculated Hi_CRC value to outgoing packet
            Crc2 = High(crc)
            ' Move calculated Lo_CRC value to outgoing packet
            Crc1 = Low(crc)
    
            ' Send packet to master, including the preamble and SYNC byte
            ' Print "Antwort"
            Printbin Preamble ; Sbyte_x ; Hdb2 ; Hdb1 ; Dab1 ; Sab1
            Printbin Db8 ; Db7 ; Db6 ; Db5 ; Db4 ; Db3 ; Db2 ; Db1
            Printbin Crc2 ; Crc1
            ' Print "Ende"
            ' Give AVR time to shift out all bits before setting to Rx
            Waitms 50
    
            ' Done, go back to Start and wait for a new packet
            Goto _start
          End If
    
    ' -----[ Subroutines ]------------------------------------------------
    '
    'Soubroutine for checking all received bytes in packet
    Check_crc:
            Crc = 0
            Temp1 = Hdb2
            Gosub Calc_crc
            Temp1 = Hdb1
            Gosub Calc_crc
            Temp1 = Dab1
            Gosub Calc_crc
            Temp1 = Sab1
            Gosub Calc_crc
            Temp1 = Db8
            Gosub Calc_crc
            Temp1 = Db7
            Gosub Calc_crc
            Temp1 = Db6
            Gosub Calc_crc
            Temp1 = Db5
            Gosub Calc_crc
            Temp1 = Db4
            Gosub Calc_crc
            Temp1 = Db3
            Gosub Calc_crc
            Temp1 = Db2
            Gosub Calc_crc
            Temp1 = Db1
            Gosub Calc_crc
            Temp1 = Crc2
            Gosub Calc_crc
            Temp1 = Crc1
            Gosub Calc_crc
            Return
    
    ' Subroutine for calculating CRC value in variable Tmp_Byte1
    Calc_crc:
            Tmpw1 = Temp1 * 256
            Crc = Tmpw1 Xor Crc
            For Temp2 = 0 To 7
                If Crc.15 = 0 Then Goto Shift_only
                Tmpw2 = Crc * 2
                Crc = Tmpw2 Xor Crcpoly
                Goto Nxt
    Shift_only:
                Crc = Crc * 2
    Nxt:
            Next
            Return
    Ich hoffe, Du kannst es gebrauchen.

    mfg

    AVRWalli

  2. #12
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    60
    Beiträge
    1.305
    Blog-Einträge
    1
    Das dürfte das geringste Problem sein.
    Im Bus würde es einen "Master" geben,
    der pollt alle Geräte an und fragt diese dabei ab.

    Natürlich benötigt dann der "Master" die Kenntnis der Anzahl der Geräte im Bus und deren Adressen.

    Außerdem muss der Master auch entsprechend handeln, falls ein "Slave"
    mal ausfällt oder während eines TimeOut's nicht antwortet
    Um das Poling zu diesem Gerät seltener bis gering auszuführen (m den speed im Bus nicht zu stark durch unnätiges warten auf Antwort auf ein minimum zu reduzieren. Und falls der Slave dann doch wieder aktiv wäre(evtl. war ja nur ein Stomausfall oder ähnliches der Fall), dann muss der Slave ja wieder mit eingebunden werden, also deher das Pollinng nicht gänzlich einstellen.

    Das ganze könnte man dann noch ausbauen und einen Reserve Master zu etablieren, falls der primäre Master mal ausfällt.

    So würde ich das dann machen.
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    @ Warum Start und Endphrase:
    Es gibt Protokolle fester Länge und variabler Länge.
    Beispiel:
    gegeben: Du verwendest Deinen Slave als einfachen AD-Wandler um einen
    Messwert einzulesen. Der ADC des µC hat 10Bit Breite.
    ist der Der Messwert kleiner als 255 würde es reichen ein Byte zu übertragen.
    Bei einem größeren Messwert bräuchtest Du dann (von 255 bis 1024) zwei
    Byte um das Messergebnis zu übertragen.
    Eine Variante ist Du hängst an den Anfang des Übertragungsblocks eine
    Mitteilung ob nur ein Byte oder zwei kommen,
    oder du überträgst prinzipiell 2 Byte,
    oder du schcikst ein Stopkondition, damit der Master weiß hier ist
    die Nachricht zuende.

    Beim Profibus sind so ziemlich alle Varianten auf einmal verwendet
    je nach gewähltem Telegrammtyp.

    http://www.profibus.com/imperia/md/c...002-German.pdf

    Im Anhang schick ich mal die Profibus Dekodierungstabelle um zu zeigen
    wie komplex eine Kommunikation so sein kann.
    Angehängte Dateien Angehängte Dateien
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.04.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    336
    Aber wenn ich dies nun ohne Interruptleitung mache, dann muss der Master ständig den Bus abfragen. Und wenn dann zwei Slaves gleichzeitig senden, dann kommt am Master garnichts mehr an.

  5. #15
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    60
    Beiträge
    1.305
    Blog-Einträge
    1
    Zitat Zitat von Zeroeightfifteen
    Aber wenn ich dies nun ohne Interruptleitung mache, dann muss der Master ständig den Bus abfragen. Und wenn dann zwei Slaves gleichzeitig senden, dann kommt am Master garnichts mehr an.
    Na dann dürfen die Slaves eben erst "reden",
    wenn sie gefragt werden.

    Also eine Anfrage des Masters an einen bestimmten Slave,
    welcher dann antwortet.

    Sonst sollte "Stille" auf'm Bus sein.
    Natürlich muss der Master dann ständig einen nach dem anderern abfragen und die Slaves müssen solange warten können bis diese an der Reihe sind (je nach anzahl der Slaves ein paar ms).
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von darwin.nuernberg
    Na dann dürfen die Slaves eben erst "reden",
    wenn sie gefragt werden.
    Hmm ... irgendwie ist sowas unpraktisch ... zumal der Master ja dann ständig pollen muss ....

  7. #17
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    60
    Beiträge
    1.305
    Blog-Einträge
    1
    Naja wie man es nimmt,
    Klar ist der Master ständig beschäftigt,
    ist ja auch eine von vielen anderen möglichkeiten.

    Codetechnisch bestimmt ein geringerer Aufwand als andere Lösungen,
    dafür muss der arme Kerl halt ein bisschen was tun .

    Und ist auch eine Insellösung.
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.04.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    336
    Zitat Zitat von darwin.nuernberg

    Na dann dürfen die Slaves eben erst "reden",
    wenn sie gefragt werden.

    Also eine Anfrage des Masters an einen bestimmten Slave,
    welcher dann antwortet.
    ja aber wann weis ein Slave wann er gefragt wird. Dann muss ich im Slave ständig nachfragen ob er gefragt ist.

  9. #19
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    60
    Beiträge
    1.305
    Blog-Einträge
    1
    Jeder Slave bekommt eine eigene ID (per DIP-Schalter)
    oder einmalig mittes Cable-Select beim einrichten des Busses,
    oder fest im Programm implementiert.

    Netzwerkkarten haben ja auch ihre MAC Identifikation
    (MediaAccessControl, hat also nix mit Äpfeln zu tun)




    So könnte das Kommunizieren aussehen:

    Prozessorgeflüster:

    • Master "Hallo Du, Slave1?"
      Slave1 "Ja, was ist denn?"
      Master "Slave1, schalt doch mal Dein Licht ein."
      Slave1 "OK, das licht ist an."

      Master "Hallo Du, Slave2?"
      Slave2 "Ja, was ist denn?"
      Master "Slave2: willst Du mir was sagen?"
      Slave2 "Nö, habe nix zu sagen"

      Master "Hallo Du, Slave3?"
      Slave3 "Ja, was ist denn?"
      Master "Slave3: willst Du mir was sagen?"
      Slave3 "Ja"
      Master "Slave3: Was willst Du mir sagen?"
      Slave3 "Bei Slave1 brennt das Licht."

      Master "Hallo Du, Slave4?"
      -keine Antwort-
      Master "Hallo Du, Slave4?"
      -keine Antwort-

      Master "Hallo Du, Slave1?"
      Slave1 "Ja, was ist denn?"
      Master "Slave1, schalt doch mal Dein Licht aus."
      Slave1 "OK, das licht ist aus. {wenn der mal wüsste was er will}"


    ...und eben solange bis der Stom ausfällt


    Wenn da keine Freude bei diesem smalltalk aufkommt




    ...und es Sprach eine Stimme aus dem Chaos zu mir:
    "Lächle und sei froh, denn es könnte schlimmer kommen."

    ...und ich lächelte,
    ...und ich war froh,
    ...
    ...
    ...und es kam schlimmer.
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  10. #20
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.04.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    336
    ja schon aber wann wann sagt denn der Slave "Ja was ist denn?" Der muss ja ständig den Bus abfragen damit er dies dann sagen kann oder nicht?

Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress