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







Zitieren

Lesezeichen