Hallo,
ich habe jetzt versucht, die Interrupts zu enablen.
Leider nicht mit dem gewünschten Erfolg.
Jetzt habe ich meinen gesamten Code angehängt, da sich zwischenzeitlich einige bei mir gemeldet haben, die gerne etwas mehr über die RS485 Steuerung erfahren möchten.
Da das Programm weitestgehend ohne Probleme läuft, kann sich hier jeder etwas abkugen.
Verbesserungsvorschläge nehme ich gerne entgegen!
Vielleicht findet ja auch jemand den oben beschriebenen Fehler im Programm?!
Tobias
Code:
'***** RS-485 *************************
' RS485 Ansteuerung von 5 Relais mit Zeitschaltfunktion und manueller vor Ort Bedienung mit Tastern
' Erstellt von Tobias Riesbeck, Dezember 2006
'**************************************
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 4800
'------------------------------------
Config Pind.4 = Input '1 Dil Schalter für Adresse
Config Pind.3 = Input '2 Dieser muss beim programmieren
Config Pinb.4 = Input '3 auf allen Positionen auf 0 stehen
Config Pinb.3 = Input '4
Config Pinc.0 = Input ' Schaltport
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinc.5 = Input ' N.N.
Config Portb.0 = Output ' Schaltport's
Config Portb.1 = Output
Config Portb.2 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portb.5 = Output ' Kontrollport
Dim T1 As Long
Dim T2 As Long
Dim T3 As Long
Dim T4 As Long
Dim T5 As Long
Dim Zeit1 As Long
Dim Zeit2 As Long
Dim Zeit3 As Long
Dim Zeit4 As Long
Dim Zeit5 As Long
Dim Sz As Long 'Sendezeit
Zeit1 = 20000000 'Flur EG
Zeit2 = 20000000 'Schlafzimmer
Zeit3 = 20000000 'Keller
Zeit4 = 10000000 'Gang
Zeit5 = 20000000 'Flur OG
Dim Myadress As Byte 'Variable Myadress wird für Adresse über Dip Schalter festgelegt
'"Hex(myadress)" gibt die Adresse in Hex-Format aus
Myadress.0 = Pind.4
Myadress.1 = Pind.3
Myadress.2 = Pinb.4
Myadress.3 = Pinb.3
Dim Db1_ As Byte ' db1 zur Aufnahme des Modulzustandes in Hex
T1 = 0
T2 = 0
T3 = 0
T4 = 0
T5 = 0
Sz = 0
Config Portd.2 = Output ' RS485
Config Debounce = 50
Dim I As Byte
Dim Key As Byte
Dim S As String * 10
Dim B(10) As Byte 'At S Overlay
Dim N As Byte
' Adresse festlegen -------------------------------------------------
Dim Preamble_ As Byte 'Preamble-Byte
Dim Sync_ As Byte 'Syncronisation-Byte
Dim Hdb2_ As Byte 'Kopf-Byte 1
Dim Hdb1_ As Byte 'Kopf-Byte 2
Dim Dab1_ As Byte
Dim Crc2_ As Byte 'CRC2
Preamble_ = &H55 'H55
Sync_ = &H54 'H54
Hdb2_ = &H51 'H51
Hdb1_ = &H42 'H42
Dab1_ = &H00
' Protokoll ---------------------------------------------------------
Dim Preamble As Byte 'Preamble-Byte
Dim Sync As Byte 'Syncronisation-Byte
Dim Hdb2 As Byte 'Kopf-Byte 1
Dim Hdb1 As Byte 'Kopf-Byte 2
Dim Dab1 As Byte 'Empfänger-Byte 1
Dim Sab1 As Byte 'Sender-Byte 1 Adresse
Dim Db1 As Byte 'Daten-Byte 1 (in diesem Modul als Hex)
Dim Db2 As Byte 'Date-Byte 2 fals erforderlich
Dim Crc2 As Byte 'CRC2
Dim Crc1 As Byte 'CRC1
Dim Aktion As Byte 'CRC1 als Sender
Const Keys = 5
On Urxc Onrxd
Enable Urxc
Enable Interrupts
Portd.2 = 0 ' R/W für RS485
'---------- Programm ----------
Gosub Zustand
Prog_start:
N = 0
Do
If Sz > 0 Then Sz = Sz + 1
If Sz > 10000 Then Gosub Zustand
'Zeitschalter (Zähler)
If T1 > 0 Then T1 = T1 + 1
If T1 > Zeit1 Then
Portd.6 = 0
T1 = 0
Aktion = &H00
Sz = 1
Else
End If
If T2 > 0 Then T2 = T2 + 1
If T2 > Zeit2 Then
Portb.0 = 0
T2 = 0
Aktion = &H00
Sz = 1
Else
End If
If T3 > 0 Then T3 = T3 + 1
If T3 > Zeit3 Then
Portb.2 = 0
T3 = 0
Aktion = &H00
Sz = 1
Else
End If
If T4 > 0 Then T4 = T4 + 1
If T4 > Zeit4 Then
Portd.7 = 0
T4 = 0
Aktion = &H00
Sz = 1
Else
End If
If T5 > 0 Then T5 = T5 + 1
If T5 > Zeit5 Then
Portb.1 = 0
T5 = 0
Aktion = &H00
Sz = 1
Else
End If
For I = 1 To Keys
Key = I
Select Case Key
Case 1 : Debounce Pinc.0 , 0 , Key_o1 , Sub 'Port 1.
Case 2 : Debounce Pinc.1 , 0 , Key_o2 , Sub 'Port 2
Case 3 : Debounce Pinc.2 , 0 , Key_o3 , Sub 'Port 3
Case 4 : Debounce Pinc.3 , 0 , Key_o4 , Sub 'Port 4
Case 5 : Debounce Pinc.4 , 0 , Key_o5 , Sub 'Port 5
End Select
Next
Loop
End
Key_o1:
Toggle Portb.0 'Buchse 1
Aktion = &HFF
Sz = 1
If T2 = 0 Then
T2 = 1
Else
T2 = 0
End If
Return
Key_o3:
Toggle Portb.2 'Buchse 3
Aktion = &HFF
Sz = 1
If T3 = 0 Then
T3 = 1
Else
T3 = 0
End If
Return
Key_o5:
Toggle Portd.6 'Buchse 4
Aktion = &HFF
Sz = 1
If T1 = 0 Then
T1 = 1
Else
T1 = 0
End If
Return
Key_o4:
Toggle Portd.7 'Buchse 5
Aktion = &HFF
Sz = 1
If T4 = 0 Then
T4 = 1
Else
T4 = 0
End If
Return
Key_o2:
Toggle Portb.1 'Buchse 2
Aktion = &HFF
Sz = 1
If T5 = 0 Then
T5 = 1
Else
T5 = 0
End If
Return
'---------- Einlesen ----------
Onrxd:
Disable Interrupts
Incr N
B(n) = Udr
If N > 9 Then
Preamble = B(1) : Sync = B(2) : Hdb2 = B(3)
Hdb1 = B(4) : Dab1 = B(5)
Sab1 = B(6)
Db1 = B(7)
Db2 = B(8)
Crc2 = B(9)
Crc1 = B(10)
N = 0
Enable Urxc
Enable Interrupts
Gosub Pruefung
Else
End If
Return
'---------- Prüfung ----------
Pruefung: 'SNAP Prüfung der eingehenden Byte
If Sync <> Sync_ Then : Goto Prog_start
Elseif Hdb2 <> Hdb2_ Then : Goto Prog_start
Elseif Hdb1 <> Hdb1_ Then : Goto Prog_start
Elseif Dab1 <> Myadress Then : Goto Prog_start
End If
Gosub Steuerung
Return
'---------- Fernsteuerung Steuerung ----------
Steuerung:
Sz = 1
If Db1 = &H01 Then : Gosub Key_o1 : End If
If Db1 = &H02 Then : Gosub Key_o2 : End If
If Db1 = &H03 Then : Gosub Key_o3 : End If
If Db1 = &H04 Then : Gosub Key_o4 : End If
If Db1 = &H05 Then : Gosub Key_o5 : End If
If Db1 = &H06 Then : Sz = 1 : End If
Db1 = 0
Return
'---------- Übertragung des Zustandes --------
Zustand:
Db1_.0 = Portb.0 'Auswertung der Portzustände
Db1_.1 = Portb.1
Db1_.2 = Portb.2
Db1_.3 = Portd.7
Db1_.4 = Portd.6
Portb.5 = 1 ' Übertragungs LED an
Disable Urxc
Disable Interrupts
Portd.2 = 1 : Waitms 20 'RS485 PIN auf Senden
Print Chr(preamble_) ; Chr(sync_) ;
Print Chr(hdb2_) ; Chr(hdb1_) ;
Print Chr(dab1_) ; Chr(myadress);
Print Chr(db1_) ; Chr(db2);
Print Chr(crc2) ; Chr(aktion) ;
Waitms 100
Do
Loop Until Ucsra.txc = 1
Reset Ucsra.txc
Waitms 10 : Portd.2 = 0 'RS485 PIN auf Enpfang
Enable Urxc
Enable Interrupts
Aktion = ""
Sz = 0
Portb.5 = 0 ' Übertragungs LED aus
N = 0
Return
End
Lesezeichen