elkokiller
25.10.2006, 09:30
Hallo,
ich habe den angehängten Code zur Fernsteuerung von 5 Relais geschrieben.
Es funktioniert auch soweit bis auf die Fernsteuerung.
Bei Eingabe von t1-1 zieht verändert das erste Relai seinen Schaltzustand bei t1-2 das zweite u.s.w.
Ein Problem bekomme ich nur, wenn ich den Text nicht in dieser Form eingebe oder mich vertippe.
Dann hängt sich die Interruptsteuerung auf.
Was muss ich tun, um den Zustand nach kurzer Zeit, z.b. 1s oder nach Feststellung des Textendes aufzulösen?
'************************************************* ********
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 4800
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input .
Config Pinc.5 = Input
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portb.5 = Output
Config Portd.2 = Output
Dim I As Byte
Dim Key As Byte
Dim S As String * 7
Dim A As String * 4
Dim X1 As Boolean
Dim X2 As Boolean
Dim X3 As Boolean
Dim X4 As Boolean
Dim Z As String * 1
Dim W As String * 1
' **** Timer *********************************************
Dim T1 As Long
Dim T2 As Long
Dim T3 As Long
Dim T4 As Long
Dim T5 As Long
Dim R1 As Bit
Dim R2 As Bit
Dim R3 As Bit
Dim R4 As Bit
Dim R5 As Bit
Const Keys = 5
' **** Programmstart **************************************
Do
R1 = Portb.0
R2 = Portb.1
R3 = Portb.2
R4 = Portd.6
R5 = Portd.7
' **** RS485 Aktivieren und Bus prüfen
On Urxc Onrxd
Enable Urxc
Enable Interrupts
If Len(s) > 3 Then
A = S
S = ""
Goto Pruefung 'Text ist größer als 3 Stellen
Else
'Disable Interrupts
'Disable Urxc
End If
'************************************************* ***
Portb.5 = 1
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
Key_o1:
Toggle Portb.0 'Buchse 1
Return
Key_o2:
Toggle Portb.1 'Buchse 2
Return
Key_o3:
Toggle Portb.2 'Buchse 3
Return
Key_o5:
Toggle Portd.6 'Buchse 4
Return
Key_o4:
Toggle Portd.7 'Buchse 5
Return
'************************************************* ***
Onrxd:
S = S + Chr(udr)
Return
'************************************************* ***
Pruefung: 'Prüfung ob t1 in den ersten beiden Stellen enthalten ist
Z = Mid(a , 1 , 2 )
If Z = "t1" Then
Goto Fern
A = Mid(s , 1 , 6)
Else
S = ""
Disable Interrupts
Disable Urxc
End If
Return
'************************************************* ***
Fern:
Disable Interrupts
W = Mid(a , 4 , 1 )
If W = "1" Then Gosub Key_o1
If W = "2" Then Gosub Key_o2
If W = "3" Then Gosub Key_o3
If W = "4" Then Gosub Key_o4
If W = "5" Then Gosub Key_o5
Disable Urxc
Waitms 100
Portd.2 = 1
Waitms 10
Print
Print "$t1-" ; R3 ; R2 ; R1 ; R5 ; R4
Waitms 100
Portd.2 = 0
Return
End
ich habe den angehängten Code zur Fernsteuerung von 5 Relais geschrieben.
Es funktioniert auch soweit bis auf die Fernsteuerung.
Bei Eingabe von t1-1 zieht verändert das erste Relai seinen Schaltzustand bei t1-2 das zweite u.s.w.
Ein Problem bekomme ich nur, wenn ich den Text nicht in dieser Form eingebe oder mich vertippe.
Dann hängt sich die Interruptsteuerung auf.
Was muss ich tun, um den Zustand nach kurzer Zeit, z.b. 1s oder nach Feststellung des Textendes aufzulösen?
'************************************************* ********
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 4800
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input .
Config Pinc.5 = Input
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portb.5 = Output
Config Portd.2 = Output
Dim I As Byte
Dim Key As Byte
Dim S As String * 7
Dim A As String * 4
Dim X1 As Boolean
Dim X2 As Boolean
Dim X3 As Boolean
Dim X4 As Boolean
Dim Z As String * 1
Dim W As String * 1
' **** Timer *********************************************
Dim T1 As Long
Dim T2 As Long
Dim T3 As Long
Dim T4 As Long
Dim T5 As Long
Dim R1 As Bit
Dim R2 As Bit
Dim R3 As Bit
Dim R4 As Bit
Dim R5 As Bit
Const Keys = 5
' **** Programmstart **************************************
Do
R1 = Portb.0
R2 = Portb.1
R3 = Portb.2
R4 = Portd.6
R5 = Portd.7
' **** RS485 Aktivieren und Bus prüfen
On Urxc Onrxd
Enable Urxc
Enable Interrupts
If Len(s) > 3 Then
A = S
S = ""
Goto Pruefung 'Text ist größer als 3 Stellen
Else
'Disable Interrupts
'Disable Urxc
End If
'************************************************* ***
Portb.5 = 1
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
Key_o1:
Toggle Portb.0 'Buchse 1
Return
Key_o2:
Toggle Portb.1 'Buchse 2
Return
Key_o3:
Toggle Portb.2 'Buchse 3
Return
Key_o5:
Toggle Portd.6 'Buchse 4
Return
Key_o4:
Toggle Portd.7 'Buchse 5
Return
'************************************************* ***
Onrxd:
S = S + Chr(udr)
Return
'************************************************* ***
Pruefung: 'Prüfung ob t1 in den ersten beiden Stellen enthalten ist
Z = Mid(a , 1 , 2 )
If Z = "t1" Then
Goto Fern
A = Mid(s , 1 , 6)
Else
S = ""
Disable Interrupts
Disable Urxc
End If
Return
'************************************************* ***
Fern:
Disable Interrupts
W = Mid(a , 4 , 1 )
If W = "1" Then Gosub Key_o1
If W = "2" Then Gosub Key_o2
If W = "3" Then Gosub Key_o3
If W = "4" Then Gosub Key_o4
If W = "5" Then Gosub Key_o5
Disable Urxc
Waitms 100
Portd.2 = 1
Waitms 10
Print "$t1-" ; R3 ; R2 ; R1 ; R5 ; R4
Waitms 100
Portd.2 = 0
Return
End