Ist der Code von [glow=red:58b4a2ae18]python_rocks[/glow:58b4a2ae18] so richtig???
Code:
'========================================================================
' Relais mit dem ATmega8 schalten. Die Steuerung läuft mit Kommandos
' über eine RS232-Verbindung.
'
' Es sind mehrere Arten von Kommandos möglich:
'
' - "011" = Kommando um einen einzelnen Kanal zu stellen
' - Die ersten zwei Zeichen kennzeichnen den Kanal
' - Das dritte Zeichen (0 oder 1) steht für den einzustellenden Zustand
' - Ein ZEILENUMBRUCH (``chr(10)``) wird herausgefiltert und hat keine Auswirkungen
' - Der Befehl wird mit RETURN (``chr(13)``) abgeschlossen
'
' - "ALL00000000000000000000" = Kommando um alle Kanäle auf einmal zu stellen
' - ALL kennzeichnet den Befehl
' - Die restlichen 20 Zeichen (0 oder 1) stehen für den Zustand jedes
' einzelnen Kanals.
' - Ein ZEILENUMBRUCH (``chr(10)``) wird herausgefiltert und hat keine Auswirkungen
' - Der Befehl wird mit RETURN (``chr(13)``) abgeschlossen
'
' - "STATUS" = Kommando um den aktuellen Zustand der Kanäle abzufragen
' - Ein ZEILENUMBRUCH (``chr(10)``) wird herausgefiltert und hat keine Auswirkungen
' - Der Befehl wird mit RETURN (``chr(13)``) abgeschlossen
' - Rückgabe: "STATUS:<je ein 0 oder 1 für jeden Kanal>" (links beginnend)
'
' - "RESET_COMMAND" = Setzt den Kommandostring auf "" zurück
' - Ein ZEILENUMBRUCH (``chr(10)``) wird herausgefiltert und hat keine Auswirkungen
' - Der Befehl wird mit RETURN (``chr(13)``) abgeschlossen
'========================================================================
$regfile = "M8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 9600
'Anschlüsse nach Pin-Reihenfolge (1-28)
Channel_01 Alias Portd.2
Channel_02 Alias Portd.3
Channel_03 Alias Portd.4
Channel_04 Alias Portb.6
Channel_05 Alias Portb.7
Channel_06 Alias Portd.5
Channel_07 Alias Portd.6
Channel_08 Alias Portd.7
Channel_09 Alias Portb.0
Channel_10 Alias Portb.1
Channel_11 Alias Portb.2
Channel_12 Alias Portb.3 'SPI
Channel_13 Alias Portb.4 'SPI
Channel_14 Alias Portb.5 'SPI
Channel_15 Alias Portc.0
Channel_16 Alias Portc.1
Channel_17 Alias Portc.2
Channel_18 Alias Portc.3
Channel_19 Alias Portc.4
Channel_20 Alias Portc.5
Config Channel_01 = Output
Config Channel_02 = Output
Config Channel_03 = Output
Config Channel_04 = Output
Config Channel_05 = Output
Config Channel_06 = Output
Config Channel_07 = Output
Config Channel_08 = Output
Config Channel_09 = Output
Config Channel_10 = Output
Config Channel_11 = Output
Config Channel_12 = Output
Config Channel_13 = Output
Config Channel_14 = Output
Config Channel_15 = Output
Config Channel_16 = Output
Config Channel_17 = Output
Config Channel_18 = Output
Config Channel_19 = Output
Config Channel_20 = Output
'die maximale Kommandolänge muss exakt ANZAHL_KANÄLE + 3 sein
Const Max_command_lenght = 23
Dim Command As String * Max_command_lenght
Dim Command_byte(max_command_lenght) As Byte At Command Overlay
Dim Do_command As Bit
Dim Channel_string As String * 2
Dim Channel As Byte
Dim Value_string As String * 1
Dim Value_bit As Bit
Dim Bt As Byte
Dim Cnt As Byte
Dim Key As Byte
Dim Error As Bit
'Vor dem Aufruf der Prozedur *Set_channel_value* muss Channel und Value_string gesetzt werden
Declare Sub Set_channel_value()
Declare Sub Reset_command()
Declare Sub Print_status()
Config Serialin = Buffered , Size = 20
Enable Interrupts
Print "STATUS: START"
'Main-Loop
Do
'Kommando empfangen und vorbereiten
If Ischarwaiting() = 1 Then
Key = Waitkey()
'Zeilenumbruch herausfiltern
If Key <> Chr(10) Then
'Ein RETURN schließt das Kommando ab
If Key = Chr(13) Then
'Das Kommando ist fertiggestellt
Do_command = 1
Print "COMMAND: " ; Command
Else
'Kommando ergänzen
Incr Cnt
If Cnt > Max_command_lenght Then
Call Reset_command()
Print "ERROR: COMMAND TO LONG"
Else
Command_byte(cnt) = Key
End If
End If
End If
End If
'Kommando umsetzen
If Do_command = 1 Then
If Left(command , 6) = "STATUS" Then
'pass
Elseif Left(command , 13) = "RESET_COMMAND" Then
'pass
Elseif Left(command , 3) = "ALL" Then
If Len(command) = Max_command_lenght Then
For Bt = 4 To Max_command_lenght
Channel = Bt - 3
Value_string = Mid(command , Bt , 1)
Call Set_channel_value()
If Error = 1 Then
Print "ERROR: COMMAND INTERRUPTED"
Exit For
End If
Next Bt
Else
Print "ERROR: " ; Max_command_lenght ; " CHARACTERS EXPECTED"
End If
Elseif Len(command) = 3 Then
Channel_string = Mid(command , 1 , 2)
Channel = Val(channel_string)
Value_string = Mid(command , 3 , 1)
Call Set_channel_value()
Else
Print "ERROR: UNKNOWN COMMAND"
End If
'Kommando zurück setzen
Call Reset_command()
'Status zurück geben
Call Print_status()
End If
Loop
End
Sub Set_channel_value()
If Value_string = "1" Then
Value_bit = 1
Else
Value_bit = 0
End If
Select Case Channel
Case 1
Channel_01 = Value_bit
Case 2
Channel_02 = Value_bit
Case 3
Channel_03 = Value_bit
Case 4
Channel_04 = Value_bit
Case 5
Channel_05 = Value_bit
Case 6
Channel_06 = Value_bit
Case 7
Channel_07 = Value_bit
Case 8
Channel_08 = Value_bit
Case 9
Channel_09 = Value_bit
Case 10
Channel_10 = Value_bit
Case 11
Channel_11 = Value_bit
Case 12
Channel_12 = Value_bit
Case 13
Channel_13 = Value_bit
Case 14
Channel_14 = Value_bit
Case 15
Channel_15 = Value_bit
Case 16
Channel_16 = Value_bit
Case 17
Channel_17 = Value_bit
Case 18
Channel_18 = Value_bit
Case 19
Channel_19 = Value_bit
Case 20
Channel_20 = Value_bit
Case Else
Print "ERROR: UNSUPPORTED CHANNEL"
Error = 1
End Select
End Sub
Sub Reset_command()
Command = String(max_command_lenght , 0)
Cnt = 0
Error = 0
Do_command = 0
End Sub
Sub Print_status()
Print "STATUS: " ; _
Channel_01 ; _
Channel_02 ; _
Channel_03 ; _
Channel_04 ; _
Channel_05 ; _
Channel_06 ; _
Channel_07 ; _
Channel_08 ; _
Channel_09 ; _
Channel_10 ; _
Channel_11 ; _
Channel_12 ; _
Channel_13 ; _
Channel_14 ; _
Channel_15 ; _
Channel_16 ; _
Channel_17 ; _
Channel_18 ; _
Channel_19 ; _
Channel_20
End Sub
Wenn ich diesen code atmega 32 oder 16 compatible machen will, muss ich doch nur oben den code in diesen ändern, oder??????
Code:
$regfile = "M32def.dat"
$crystal = 16000000
oder ist 16 mhz nicht so gut für serial communication, sollte doch 14,*** sein, nich war?[/code]
Lesezeichen