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]