Hallo Freunde des BASCOM'S

ich hab folgendes Problem, wie Elkokiller beschrieben hat bin ich dran einen Hausbus über RS485 zu realisieren. Hab mich durch etliche Seiten und Doku's gewälzt und festgestellt dass das schon oft beschrieben SNAP-Protokoll das Beste ist, und vor allem leicht zu verstehen. Ich hab 3 mega8 und 3 2313 am Bus laufen und es geht prima. Es sind mit dem 2313 eine Tastenmudul, ein Relaismodul und ein Rollomodul was sich vom Relaismodul nur in der Soft unterscheidet. Elektronisch verriegelung der Relais. Also über den Bus mit dem Tastmodul kann ich die Relais prima schalten, nur möchte ich an den Modulen auch Taster betreiben die mir die gleich Funktion bringen wie das Tastenmodul, aber ich bekmm's einfach nicht hin. Ich poste mal das Versuchsprogramm mit 2 Relais.

Code:
'RS-485 4fach Relais für Hutschiene
'mit 4 Tasten und RS485

$regfile = "2313def.dat"
$crystal = 4000000
$baud = 4800

Ddrb = &B00001111

Config Portd.2 = Output

Config Portd.3 = Input : Portd.3 = 1
Config Portd.4 = Input : Portd.4 = 1
Config Portd.5 = Input : Portd.5 = 1
Config Portd.6 = Input : Portd.6 = 1

'Dim S As String * 10
Dim B(10) As Byte                                 'At S Overlay
Dim N As Byte

Const Preamble_ = &H55                            'H55
Const Sync_ = &H54                                'H54
Const Hdb2_ = &H51                                'H51
Const Hdb1_ = &H42                                'H42
'Const Myadress = &H 04

Dim Myadress As Byte : Myadress = 6
Dim Preamble As Byte
Dim Sync As Byte
Dim Hdb2 As Byte
Dim Hdb1 As Byte
'Dim Dab2 As Byte
Dim Dab1 As Byte
'Dim Sab2 as byte
Dim Sab1 As Byte
Dim Db1 As Byte
Dim Db2 As Byte
Dim Crc2 As Byte
Dim Crc1 As Byte

Dim X1 As Bit , X2 As Bit , X3 As Bit , X4 As Bit , X5 As Bit
X1 = 0 : X2 = 0 : X3 = 0 : X4 = 0 : X5 = 0

'----- Programm
On Urxc Onrxd
Enable Urxc
Enable Interrupts
 Portd.2 = 0

 Main:
  If N = 10 Then
    Preamble = B(1)
    Sync = B(2) : Hdb2 = B(3) : Hdb1 = B(4)
    Dab1 = B(5):                                  'Dab2=B(x)
    Sab1 = B(6) :                                 'Sab2=B(x)
    Db2 = B(7) : Db1 = B(8)
    Crc2 = B(9) : Crc1 = B(10)
    N = 0
    End If

 Gosub Ausgang

  If Sync <> Sync_ Then : Goto Main
    Elseif Hdb2 <> Hdb2_ Then : Goto Main
    Elseif Hdb1 <> Hdb1_ Then : Goto Main
    Elseif Dab1 <> Myadress Then : Goto Main
    End If
 '------------------------------------------------
 Ausgang:

         If Pind.3 = 0 Or Db2 = &H01 And X1 = 0 And X2 = 0 Then : X1 = 1 : Portb.0 = X1 : Waitms 500
 Elseif Pind.3 = 0 Or Pind.4 = 0 Or Db2 = &H01 Or Db2 = &H02 And X1 = 1 Then : X1 = 0 : Portb.0 = X1 : Waitms 500

Elseif Pind.4 = 0 Or Db2 = &H02 And X2 = 0 And X1 = 0 Then : X2 = 1 : Portb.1 = X2 : Waitms 500
Elseif Pind.4 = 0 Or Pind.3 = 0 Or Db2 = &H02 Or Db2 = &H01 And X2 = 1 Then : X2 = 0 : Portb.1 = X2 : Waitms 500

    End If

    'Goto Main
    Return
Onrxd:
 Incr N
 B(n) = Udr

Return

End
Wenn ich die Tasten benutze schalten die Relais je nach Taste, aber beim Tastenmodul wird zwar eeingschaltet, aber gleich darauf wieder aus.

Hier mal das Programm vom Tastenmodul

Code:
$regfile = "2313def.dat"
$crystal = 4000000
$baud = 4800

Ddrb = &B00000000
Portb = &B00011111

'Config Portd.3 = Input : Portd.3 = 1
'Config Portd.4 = Input : Portd.4 = 1
'Config Portd.5 = Input : Portd.5 = 1
Config Portd.6 = Input : Portd.6 = 1

Const Preamble_ = &B01010101                      'H55
Const Sync_ = &H54                                'H54
Const Crcpoly = &H1021
Const Hdb2_ = &H51
Const Hdb1_ = &H42
Const Myadress = &H03

Dim Preamble As Byte
Dim Sync As Byte
Dim Crc As Word
Dim Hdb1 As Byte
Dim Hdb2 As Byte
Dim Dab1 As Byte
Dim Dab2 As Byte
Dim Db1 As Byte
Dim Db2 As Byte
Dim Sab1 As Byte
Dim Crc2 As Byte
Dim Crc1 As Byte
Dim Temp1 As Byte
Dim Temp2 As Byte
Dim Tmpw1 As Byte
Dim Tmpw2 As Byte

'Preamble = Preamble_
'Sync = Sync_

'Db1 = &H3
Db2 = &H0

Dab1 = &H06                                       ' Adresse des Empfänger
Sab1 = Myadress                                   'Adresse des Senders
Crc2 = &H01
Crc1 = &H01
Portd.2 = 0

'------------------------------------------------
'hier Programmcode für Tastenabfage und Wertzuweisung
'unterbringen
'z.B.:
' If Pind.0 = 0 Then Db1=&h01
'  goto Send
'  End IF
'
'oder eine Select Case-Anweisung
'
'------------------------------------------------

Tasten:
Db1 = &H0
           If Pinb.4 = 0 Then : Db1 = &H01 : Goto _start
    Elseif Pinb.3 = 0 Then : Db1 = &H02 : Goto _start
    Elseif Pinb.2 = 0 Then : Db1 = &H04 : Goto _start
    Elseif Pinb.1 = 0 Then : Db1 = &H08 : Goto _start
    Elseif Pinb.0 = 0 Then : Db1 = &H0 : Goto _start
    Elseif Pind.6 = 0 Then : Db1 = &HF : Goto _start
    End If

Goto Tasten


_start:

     Portd.2 = 1 : Waitms 20                      'RS485 PIN auf Senden
     Print Chr(preamble_) ; Chr(sync_) ;
     Print Chr(hdb2_) ; Chr(hdb1_) ;
     Print Chr(dab1) ; Chr(sab1);
     Print Chr(db1) ; Chr(db2);
     Print Chr(crc2) ; Chr(crc1);

     Waitms 10 : Portd.2 = 0 : Wait 1             'RS485 PIN auf Enpfang

     'Goto _start
     Goto Tasten
wen's Interessiert noch ein Programm für den Bus zu belauschen

Code:
'Einfacher String-Empfang
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 4800

Dim S As String * 10
Dim B(10) As Byte                                           'At S Overlay
Dim N As Byte

Const Preamble_ = &H55                                      'H55
Const Sync_ = &H54                                          'H54
Const Hdb2_ = &H51                                          'H51
Const Hdb1_ = &H42                                          'H42
'Const Myadress = &H 04

Dim Myadress As Byte : Myadress = 4
Dim Preamble As Byte
Dim Sync As Byte
Dim Hdb2 As Byte
Dim Hdb1 As Byte
'Dim Dab2 As Byte
Dim Dab1 As Byte
'Dim Sab2 as byte
Dim Sab1 As Byte
Dim Db1 As Byte
Dim Db2 As Byte
Dim Crc2 As Byte
Dim Crc1 As Byte

Ddrd = &B00110100
Portd = &B11000000

Ddrc = &B00110110
Portc = &B00100100

Spkr Alias Portd.7

Config Lcd = 20 * 4
Cls
Cursor Off Noblink

On Urxc Onrxd
Enable Urxc
Enable Interrupts
 Portd.2 = 0

 '------------------------------------------------
 Main:
    If N > 9 Then
    Preamble = B(1)
    Sync = B(2) : Hdb2 = B(3) : Hdb1 = B(4)
    Dab1 = B(5) : Sab1 = B(6) : Db2 = B(7)
    Db1 = B(8) : Crc2 = B(9) : Crc1 = B(10)
    N = 0
    End If

   Gosub Anzeige

    If Sync <> Sync_ Then : Goto Main
    Elseif Hdb2 <> Hdb2_ Then : Goto Main
    Elseif Hdb1 <> Hdb1_ Then : Goto Main
    'Elseif Dab1 <> Myadress Then : Goto Main
    End If

    Goto Main

    Anzeige:
    Locate 1 , 1 : Lcd Hex(preamble) ; "-" ; Hex(sync) ; "-" ; Hex(hdb2) ; "-" ; Hex(hdb1)
    Locate 2 , 1 : Lcd "Empf:" ; Hex(dab1)
    Locate 2 , 10 : Lcd "Send:" ; Hex(sab1)
    Locate 3 , 1 : Lcd Bin(db1) ; "-" ; Bin(db2)
    Locate 4 , 1 : Lcd Hex(crc2) ; "-" ; Hex(crc1)
    Locate 4 , 10 : Lcd "Mya:" ; Hex(myadress) ; "-" ; Hex(dab1)
    Return


Onrxd:
 Incr N
 B(n) = Udr
 
Return
das ist mit einem mega8 und LCD

Hoffendlich kann mir jemand helfen ??