kalletronic
24.11.2007, 17:16
Hi, ich wollte mal mein neues Projekt reinstellen und fragen was ihr davon haltet und was ich noch verbessern könnte.
Das ganze soll mal ein Rolloaktor für nen Hausbus werden.
Das Teil wird uber die RS232 oder 485 über einen Befehl zB ro0101 (Rollo 01 auf) von einem anderen Busteilnehmer angesprochen und dann dieentsprechende Aktion ausführen. Da ich im freien Erklären nich besonders gut bin fragt einfach nach
'Rolloaktor V1.0
'Max 8 Rollos
'Befehle über RS232 / RS485
'Erstellt 23.11.2007 By Kalle
$regfile = "m32def.dat"
$crystal = 4000000
Declare Sub Steuern(subrollonummer As Byte , Subaktionnummer As Byte)
'*** Konfig ***
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.5 = Input
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Pind.2 Alias Adr1
Pind.3 Alias Adr2
Pind.4 Alias Adr3
Pind.5 Alias Adr4
'*** Variablendeklaration ***
Dim Befehl As String * 6
Dim Befehllaenge As Byte
Dim Typ As String * 2
Dim Nummer As String * 2
Dim Aktion As String * 2
Dim Fehler As String * 10
Dim Myadress As String * 8
Dim Adress As String * 8
Dim Umrechnung As Byte
Dim Umrechnung2 As Byte
Dim Nummerbyte As Byte
Dim Rollo(8) As Byte
Dim Aktionbyte As Byte
Dim Portabyte As Byte
Dim Portcbyte As Byte
Dim I As Byte
Dim Fehlerlaenge As Byte
Dim Adrbyte As Byte
'Umrechnung2 = "0000000000000000"
'*** Hauptprogramm ***
Do
Gosub Adresserkennung
Input Befehl
Befehllaenge = Len(befehl)
If Befehllaenge > 0 Then
Gosub Befehlserkennung
End If
Fehlerlaenge = Len(fehler)
If Fehlerlaenge > 0 Then
Print Fehler
End If
Loop
'*** Unterprogramme ***
'*** Befehlserkennung ***
Befehlserkennung:
Cls
Locate 1 , 1
Lcd Befehl
Typ = Left(befehl , 2)
Nummer = Mid(befehl , 3 , 2)
Aktion = Right(befehl , 2)
If Typ = "ro" Then
Gosub Ausfuehrung
Else
Fehler = "ERRTYP0001" 'Fehler Falschr Typ
Return
End If
Return
'*** Aktion Ausführen ***
Ausfuehrung:
Nummerbyte = Val(nummer)
Aktionbyte = Val(aktion)
Rollo(nummerbyte) = Aktionbyte
If Nummerbyte < 9 Then
If Aktionbyte < 3 Then
Goto Weiter
Else
Fehler = "ERRAKT0001" 'Fehler Falsche Aktion
Return 'Hier fehlertelegramm senden
End If
Else
Fehler = "ERRADR0001" 'Fehler Falsche Adresse
Return
End If
Weiter:
Locate 2 , 1
Lcd "Rollo"
Locate 2 , 7
Lcd Nummerbyte
Locate 2 , 9
Lcd Aktionbyte
Call Steuern(nummerbyte , Aktionbyte)
Return
'*** Adresserkennung ***
Adresserkennung:
Adrbyte = Portd
Rotate Adrbyte , Left , 2
Rotate Adrbyte , Right , 4
Adress = Str(adrbyte)
Myadress = "ROLL" + Adress
Print Myadress
Return
'*** Steuern subroutine *** noch fertigzustellen
'hier liegt auch das Problem von meinem letzten Beitrag
Sub Steuern(subrollonummer As Byte , Subaktionnummer As Byte)
Dim Merker As Byte
Select Case Subaktionnummer
Case 0 : Umrechnung = &B00 'Rollo stop
Case 1 : Umrechnung = &B01 'Rollo auf
Case 2 : Umrechnung = &B10 'Rollo zu
Case Else : Fehler = "ERRAKT0001" 'Fehler Falsche Aktion
End Select
Merker = Subrollonummer - 1 'Damit Bitfolge beim Bit0 beginnt
Merker = Merker * 2 'Bitfolge in jedes 2. Bit schreiben
Shift Umrechnung , Left , Merker
Portabyte = Portabyte Or Umrechnung
Porta = Portabyte
End Sub
p.s. Kritik erwünscht
mfg Kalle
Das ganze soll mal ein Rolloaktor für nen Hausbus werden.
Das Teil wird uber die RS232 oder 485 über einen Befehl zB ro0101 (Rollo 01 auf) von einem anderen Busteilnehmer angesprochen und dann dieentsprechende Aktion ausführen. Da ich im freien Erklären nich besonders gut bin fragt einfach nach
'Rolloaktor V1.0
'Max 8 Rollos
'Befehle über RS232 / RS485
'Erstellt 23.11.2007 By Kalle
$regfile = "m32def.dat"
$crystal = 4000000
Declare Sub Steuern(subrollonummer As Byte , Subaktionnummer As Byte)
'*** Konfig ***
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.5 = Input
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Pind.2 Alias Adr1
Pind.3 Alias Adr2
Pind.4 Alias Adr3
Pind.5 Alias Adr4
'*** Variablendeklaration ***
Dim Befehl As String * 6
Dim Befehllaenge As Byte
Dim Typ As String * 2
Dim Nummer As String * 2
Dim Aktion As String * 2
Dim Fehler As String * 10
Dim Myadress As String * 8
Dim Adress As String * 8
Dim Umrechnung As Byte
Dim Umrechnung2 As Byte
Dim Nummerbyte As Byte
Dim Rollo(8) As Byte
Dim Aktionbyte As Byte
Dim Portabyte As Byte
Dim Portcbyte As Byte
Dim I As Byte
Dim Fehlerlaenge As Byte
Dim Adrbyte As Byte
'Umrechnung2 = "0000000000000000"
'*** Hauptprogramm ***
Do
Gosub Adresserkennung
Input Befehl
Befehllaenge = Len(befehl)
If Befehllaenge > 0 Then
Gosub Befehlserkennung
End If
Fehlerlaenge = Len(fehler)
If Fehlerlaenge > 0 Then
Print Fehler
End If
Loop
'*** Unterprogramme ***
'*** Befehlserkennung ***
Befehlserkennung:
Cls
Locate 1 , 1
Lcd Befehl
Typ = Left(befehl , 2)
Nummer = Mid(befehl , 3 , 2)
Aktion = Right(befehl , 2)
If Typ = "ro" Then
Gosub Ausfuehrung
Else
Fehler = "ERRTYP0001" 'Fehler Falschr Typ
Return
End If
Return
'*** Aktion Ausführen ***
Ausfuehrung:
Nummerbyte = Val(nummer)
Aktionbyte = Val(aktion)
Rollo(nummerbyte) = Aktionbyte
If Nummerbyte < 9 Then
If Aktionbyte < 3 Then
Goto Weiter
Else
Fehler = "ERRAKT0001" 'Fehler Falsche Aktion
Return 'Hier fehlertelegramm senden
End If
Else
Fehler = "ERRADR0001" 'Fehler Falsche Adresse
Return
End If
Weiter:
Locate 2 , 1
Lcd "Rollo"
Locate 2 , 7
Lcd Nummerbyte
Locate 2 , 9
Lcd Aktionbyte
Call Steuern(nummerbyte , Aktionbyte)
Return
'*** Adresserkennung ***
Adresserkennung:
Adrbyte = Portd
Rotate Adrbyte , Left , 2
Rotate Adrbyte , Right , 4
Adress = Str(adrbyte)
Myadress = "ROLL" + Adress
Print Myadress
Return
'*** Steuern subroutine *** noch fertigzustellen
'hier liegt auch das Problem von meinem letzten Beitrag
Sub Steuern(subrollonummer As Byte , Subaktionnummer As Byte)
Dim Merker As Byte
Select Case Subaktionnummer
Case 0 : Umrechnung = &B00 'Rollo stop
Case 1 : Umrechnung = &B01 'Rollo auf
Case 2 : Umrechnung = &B10 'Rollo zu
Case Else : Fehler = "ERRAKT0001" 'Fehler Falsche Aktion
End Select
Merker = Subrollonummer - 1 'Damit Bitfolge beim Bit0 beginnt
Merker = Merker * 2 'Bitfolge in jedes 2. Bit schreiben
Shift Umrechnung , Left , Merker
Portabyte = Portabyte Or Umrechnung
Porta = Portabyte
End Sub
p.s. Kritik erwünscht
mfg Kalle