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??????
oder ist 16 mhz nicht so gut für serial communication, sollte doch 14,*** sein, nich war?[/code]Code:$regfile = "M32def.dat"
$crystal = 16000000