PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Enigma auf dem µC



Che Guevara
11.09.2011, 22:23
Hallo,

ich möchte eine Enigma, vorerst mit nur einer Walze, auf einem MEGA32 programmieren. Das ganze funktioniert auch schon, bis auf eine Kleinigkeit: Wenn ich ein "a" irgendwo in den zu verschlüsselnden Text schreibe, passiert irgendwo ein Fehler, d.h. der verschlüsselte und anschließend entschlüßelte Text stimmt an dieser Stelle nicht. Nach einiger Fehlersuche komme ich einfach nicht mehr weiter, wahrscheinlich ist es nur ein Leichtsinnsfehler, aber ich komme nicht drauf... Evtl. könnte jemand von euch ja mal drübersehen und mir helfen.
Hier der Code:


$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80



Declare Sub Init_system()
Declare Function Tastatur() As Byte
Declare Sub Walze_drehen()
Declare Function Codieren(byval Codieren_in As Byte) As Byte
Declare Function Reflektor(byval Reflektor_in As Byte) As Byte



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink
Deflcdchar 0 , 32 , 32 , 1 , 18 , 20 , 24 , 16 , 32



Dim Walze_1(26) As Byte
Dim Walze_1_inv(26) As Byte

Dim Pointer_1 As Byte

Dim Ar_out(4) As Byte
Dim Ar_out_old(4) As Byte

Dim Tmp As Byte
Dim I As Byte

Dim _out As Byte 'ascii-wert (skaliert auf 1-26)
Dim _in As Byte 'ascii-wert (skaliert auf 1-26)



Const _a = 1
Const _b = 2
Const _c = 3
Const _d = 4
Const _e = 5
Const _f = 6
Const _g = 7
Const _h = 8
Const _i = 9
Const _j = 10
Const _k = 11
Const _l = 12
Const _m = 13
Const _n = 14
Const _o = 15
Const _p = 16
Const _q = 17
Const _r = 18
Const _s = 19
Const _t = 20
Const _u = 21
Const _v = 22
Const _w = 23
Const _x = 24
Const _y = 25
Const _z = 26




Call Init_system()






Do



Ar_out(1) = Tastatur()
Ar_out(2) = Tastatur()
Ar_out(3) = Tastatur()
Ar_out(4) = Tastatur()

Locate 1 , 1
Lcd "AUSGANGSSTELLUNG"
Locate 2 , 1
Lcd Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "
Locate 2 , 16
Lcd " "

Waitms 500
Cls

Locate 1 , 1
Lcd "CHIFFRIERT:"
Locate 2 , 1
Lcd "DECHIFFRIERT:"

Waitms 500
Cls



Ar_out_old(1) = Ar_out(1)
Ar_out_old(2) = Ar_out(2)
Ar_out_old(3) = Ar_out(3)
Ar_out_old(4) = Ar_out(4)


Call Init_system()
Ar_out(1) = Codieren(ar_out(1))
Ar_out(2) = Codieren(ar_out(2))
Ar_out(3) = Codieren(ar_out(3))
Ar_out(4) = Codieren(ar_out(4))
Locate 1 , 1
Lcd Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "


Call Init_system()
Ar_out(1) = Codieren(ar_out(1))
Ar_out(2) = Codieren(ar_out(2))
Ar_out(3) = Codieren(ar_out(3))
Ar_out(4) = Codieren(ar_out(4))
Locate 2 , 1
Lcd Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "

If Ar_out_old(1) = Ar_out(1) And Ar_out_old(2) = Ar_out(2) And Ar_out_old(3) = Ar_out(3) And Ar_out_old(4) = Ar_out(4) Then
Locate 2 , 16
Lcd Chr(0)
Else
Locate 2 , 16
Lcd " "
End If


Waitms 500



Loop


Sub Walze_drehen()
For Pointer_1 = 1 To 26
Tmp = Pointer_1 + 1
If Tmp = 27 Then Tmp = 1
Walze_1(pointer_1) = Walze_1(tmp)
Walze_1_inv(walze_1(pointer_1)) = Pointer_1
Next Pointer_1
End Sub


Function Tastatur() As Byte
Tastatur = Rnd(25) + 1
End Function


Function Codieren(byval Codieren_in As Byte) As Byte
Tmp = Walze_1(codieren_in)
Tmp = Reflektor(tmp)
Codieren = Walze_1_inv(tmp)
Call Walze_drehen()
End Function


Function Reflektor(byval Reflektor_in As Byte) As Byte
If Reflektor_in.0 = 0 Then
Reflektor = Reflektor_in + 1
If Reflektor = 27 Then Reflektor = 0
Else
Reflektor = Reflektor_in - 1
If Reflektor = 0 Then Reflektor = 26
End If
End Function


Sub Init_system()
Walze_1(1) = 23
Walze_1(2) = 15
Walze_1(3) = 9
Walze_1(4) = 24
Walze_1(5) = 7
Walze_1(6) = 1
Walze_1(7) = 22
Walze_1(8) = 17
Walze_1(9) = 12
Walze_1(10) = 13
Walze_1(11) = 26
Walze_1(12) = 2
Walze_1(13) = 5
Walze_1(14) = 21
Walze_1(15) = 14
Walze_1(16) = 25
Walze_1(17) = 11
Walze_1(18) = 6
Walze_1(19) = 16
Walze_1(20) = 8
Walze_1(21) = 3
Walze_1(22) = 18
Walze_1(23) = 4
Walze_1(24) = 19
Walze_1(25) = 10
Walze_1(26) = 20

Walze_1_inv(23) = 1
Walze_1_inv(15) = 2
Walze_1_inv(9) = 3
Walze_1_inv(24) = 4
Walze_1_inv(7) = 5
Walze_1_inv(1) = 6
Walze_1_inv(22) = 7
Walze_1_inv(17) = 8
Walze_1_inv(12) = 9
Walze_1_inv(13) = 10
Walze_1_inv(26) = 11
Walze_1_inv(2) = 12
Walze_1_inv(5) = 13
Walze_1_inv(21) = 14
Walze_1_inv(14) = 15
Walze_1_inv(25) = 16
Walze_1_inv(11) = 17
Walze_1_inv(6) = 18
Walze_1_inv(16) = 19
Walze_1_inv(8) = 20
Walze_1_inv(3) = 21
Walze_1_inv(18) = 22
Walze_1_inv(4) = 23
Walze_1_inv(19) = 24
Walze_1_inv(10) = 25
Walze_1_inv(20) = 26
End Sub


End


Vielen Dank & Gruß
Chris

for_ro
11.09.2011, 23:13
Ohne das jetzt genauer durchblickt zu haben, würde ich sagen, dass hier
If Reflektor = 27 Then Reflektor = 0
eigentlich das
If Reflektor = 27 Then Reflektor = 1
stehen müsste.

Che Guevara
11.09.2011, 23:19
Danke, da ist schon der Fehler! Leider ist es aber ein anderer und somit mein Problem noch immer vorhanden... Wenn im Eingangsarray eine 1 steht, steht beim Ausgang eine 26..

Gruß
Chris

MagicWSmoke
12.09.2011, 08:59
Schau' doch mal beim Drehen der Walze nach ;) Du vernichtest da gezielt Zelle 1.
Wenn Du das in Ordnung bringst, dann tut's auch, wie es soll.

vohopri
12.09.2011, 09:47
Hallo,

nettes Projekt. Solche Technologievergleiche find ich interessant, wie hier elektromechanisch vs MC-digital.

Wie soll die Ein und Ausgabe dann im Endeffekt realisiert werden?

Che Guevara
12.09.2011, 10:03
@MagicWSmoke: Tut mir leid, ich habs mir jetzt seeehr lange angesehen, aber ich sehe den Fehler nicht... Könntest du mir erklären, wo ich was falsch gemacht habe? :)

@vohopori: Ich finde es auch interresant, etwas mechanisches elektronisch umzusetzen :D Ein- bzw. Ausgabe sind noch unklar, es wird aber auf jeden Fall mehrere Module geben, welche über I2C kommunizieren. Details folgen ;)

Gruß
Chris

MagicWSmoke
12.09.2011, 10:19
Tut mir leid, ich habs mir jetzt seeehr lange angesehen, aber ich sehe den Fehler nicht... Könntest du mir erklären, wo ich was falsch gemacht habe?

Wenn Pointer_1 = 1 ist, dann ist Tmp = 2. Damit wird die zweite Zelle auf die Erste geschrieben und der Inhalt der ersten Zelle zerstört, welche eigentlich in Zelle 26 kommen soll. So kommt aber nur ein falscher Inhalt dort an, d.h. der Inhalt der vormaligen Zelle 2.

Che Guevara
12.09.2011, 10:30
Oooh stimmt, danke :D
Habs jetzt so gemacht:


Sub Walze_drehen()
Tmp2 = Walze_1(1)
For Pointer_1 = 1 To 26
Tmp = Pointer_1 + 1
If Tmp = 27 Then Tmp = 1
Walze_1(pointer_1) = Walze_1(tmp)
If Pointer_1 = 26 Then
Walze_1(26) = Tmp2
End If
Walze_1_inv(walze_1(pointer_1)) = Pointer_1
Next Pointer_1
End Sub

Jedoch behebt das immer noch nicht mein Problem -.- Ich denke, mit Walze_1_inv stimmt was noch nicht, aber da muss ich mich erst wieder reindenken...

Gruß
Chris

MagicWSmoke
12.09.2011, 10:42
Jedoch behebt das immer noch nicht mein Problem -.- Ich denke, mit Walze_1_inv stimmt was noch nicht, aber da muss ich mich erst wieder reindenken...
Das hier hatte funktioniert:

Sub Walze_drehen()
Local Cell_1 As Byte
Cell_1 = Walze_1(1)
For Pointer_1 = 1 To 26
Tmp = Pointer_1 + 1
If Tmp = 27 Then
Walze_1(pointer_1) = Cell_1
Else
Walze_1(pointer_1) = Walze_1(tmp)
End If
Walze_1_inv(walze_1(pointer_1)) = Pointer_1
Next Pointer_1
End Sub
Fehler: If Reflektor = 27 Then Reflektor = 1 wurde ausgebessert ?

Che Guevara
12.09.2011, 10:48
Aber Walze_1(26) wird doch noch vor Walze_1_inv(Walze_1(pointer_1)) beschrieben... Ich glaube, ich verstehe nicht, was du meinst.. IMHO wird jetzt Walze_1 richtig beschrieben und somit sollte auch Walze_1_inv stimmen. Korigiert mich bitte, falls ich was falsches sage.

Gruß
Chris

MagicWSmoke
12.09.2011, 10:58
Aber Walze_1(26) wird doch noch vor Walze_1_inv(Walze_1(pointer_1)) beschrieben... Ich glaube, ich verstehe nicht, was du meinst..
Ich denke Du hattest während ich geantwortet hab' den Code geändert.
Der Code wie jetzt oben angezeigt funktioniert. Wo ist dann das Problem ?

Che Guevara
12.09.2011, 10:59
Oh, tut mir leid, ich hättes dazu schreiben sollen!
Also bei mir funktionierts leider nicht, ab und zu stimmt der Ein- und Ausgangstext nicht überein. Bist du dir sicher, dass es funktioniert?

Gruß
Chris

MagicWSmoke
12.09.2011, 11:10
Also bei mir funktionierts leider nicht, ab und zu stimmt der Ein- und Ausgangstext nicht überein.
So steht's bei mir im Terminal des Simulators:

Ausg: 4:20:8:8
Chiff: 16:11:7:3
Dechiff: 4:20:8:8

Ausg: 16:21:8:13
Chiff: 4:23:7:1
Dechiff: 16:21:8:13

Ausg: 22:4:23:12
Chiff: 24:17:15:25
Dechiff: 22:4:23:12

Ausg: 21:16:15:5
Chiff: 12:24:23:16
Dechiff: 21:16:15:5

Ausg: 2:24:5:15
Chiff: 15:16:25:2
Dechiff: 2:24:5:15

Ausg: 7:18:1:10
Chiff: 1:7:18:20
Dechiff: 7:18:1:10

Ausg: 18:22:3:6
Chiff: 5:12:16:7
Dechiff: 18:22:3:6

Ausg: 23:8:1:6
Chiff: 13:9:18:7
Dechiff: 23:8:1:6

Ausg: 8:4:16:19
Chiff: 19:17:3:21
Dechiff: 8:4:16:19

Ausg: 4:25:3:13
Chiff: 16:13:16:1
Dechiff: 4:25:3:13

Ausg: 18:9:15:18
Chiff: 5:8:23:9
Dechiff: 18:9:15:18

Che Guevara
12.09.2011, 11:24
Also ich teste gerade an der Hardware, und bei mir funktionierts nicht immer! Schon der zweite "zufällig" generierte Text "16:9:9:3" wird zu "16:9:15:18" ! Ich weiß aber nicht, worans liegt...

Gruß
Chris

MagicWSmoke
12.09.2011, 11:29
Hier mein Testcode:

$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80
$sim


Declare Sub Init_system()
Declare Function Tastatur() As Byte
Declare Sub Walze_drehen()
Declare Function Codieren(byval Codieren_in As Byte) As Byte
Declare Function Reflektor(byval Reflektor_in As Byte) As Byte



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink
Deflcdchar 0 , 32 , 32 , 1 , 18 , 20 , 24 , 16 , 32

Dim Walze_1(26) As Byte
Dim Walze_1_inv(26) As Byte

Dim Pointer_1 As Byte

Dim Ar_out(4) As Byte
Dim Ar_out_old(4) As Byte

Dim Tmp As Byte
Dim I As Byte

Dim _out As Byte 'ascii-wert (skaliert auf 1-26)
Dim _in As Byte 'ascii-wert (skaliert auf 1-26)

Const _a = 1
Const _b = 2
Const _c = 3
Const _d = 4
Const _e = 5
Const _f = 6
Const _g = 7
Const _h = 8
Const _i = 9
Const _j = 10
Const _k = 11
Const _l = 12
Const _m = 13
Const _n = 14
Const _o = 15
Const _p = 16
Const _q = 17
Const _r = 18
Const _s = 19
Const _t = 20
Const _u = 21
Const _v = 22
Const _w = 23
Const _x = 24
Const _y = 25
Const _z = 26

Call Init_system()

Do

Ar_out(1) = Tastatur()
Ar_out(2) = Tastatur()
Ar_out(3) = Tastatur()
Ar_out(4) = Tastatur()

Locate 1 , 1
Lcd "AUSGANGSSTELLUNG"
Locate 2 , 1
Lcd Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "
Print "Ausg: " ; Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "
Locate 2 , 16
Lcd " "

Waitms 500
Cls

Locate 1 , 1
Lcd "CHIFFRIERT:"
Locate 2 , 1
Lcd "DECHIFFRIERT:"

Waitms 500
Cls

Ar_out_old(1) = Ar_out(1)
Ar_out_old(2) = Ar_out(2)
Ar_out_old(3) = Ar_out(3)
Ar_out_old(4) = Ar_out(4)

Call Init_system()
Ar_out(1) = Codieren(ar_out(1))
Ar_out(2) = Codieren(ar_out(2))
Ar_out(3) = Codieren(ar_out(3))
Ar_out(4) = Codieren(ar_out(4))
Locate 1 , 1
Lcd Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "
Print "Chiff: " ; Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "

Call Init_system()
Ar_out(1) = Codieren(ar_out(1))
Ar_out(2) = Codieren(ar_out(2))
Ar_out(3) = Codieren(ar_out(3))
Ar_out(4) = Codieren(ar_out(4))
Locate 2 , 1
Lcd Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "
Print "Dechiff: " ; Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "
Print

If Ar_out_old(1) = Ar_out(1) And Ar_out_old(2) = Ar_out(2) And Ar_out_old(3) = Ar_out(3) And Ar_out_old(4) = Ar_out(4) Then
Locate 2 , 16
Lcd Chr(0)
Else
Locate 2 , 16
Lcd " "
End If

Waitms 500

Loop

'(
Sub Walze_drehen()
Local Cell_1 As Byte
Cell_1 = Walze_1(1)
For Pointer_1 = 1 To 26
Tmp = Pointer_1 + 1
If Tmp = 27 Then
Walze_1(pointer_1) = Cell_1
Else
Walze_1(pointer_1) = Walze_1(tmp)
End If
Walze_1_inv(walze_1(pointer_1)) = Pointer_1
Next Pointer_1
End Sub
')
Sub Walze_drehen()
Local Tmp2 As Byte
Tmp2 = Walze_1(1)
For Pointer_1 = 1 To 26
Tmp = Pointer_1 + 1
If Tmp = 27 Then Tmp = 1
Walze_1(pointer_1) = Walze_1(tmp)
If Pointer_1 = 26 Then
Walze_1(26) = Tmp2
End If
Walze_1_inv(walze_1(pointer_1)) = Pointer_1
Next Pointer_1
End Sub

Function Tastatur() As Byte
Tastatur = Rnd(25) + 1
End Function


Function Codieren(byval Codieren_in As Byte) As Byte
Tmp = Walze_1(codieren_in)
Tmp = Reflektor(tmp)
Codieren = Walze_1_inv(tmp)
Call Walze_drehen()
End Function


Function Reflektor(byval Reflektor_in As Byte) As Byte
If Reflektor_in.0 = 0 Then
Reflektor = Reflektor_in + 1
If Reflektor = 27 Then Reflektor = 1
Else
Reflektor = Reflektor_in - 1
If Reflektor = 0 Then Reflektor = 26
End If
End Function


Sub Init_system()
Walze_1(1) = 23
Walze_1(2) = 15
Walze_1(3) = 9
Walze_1(4) = 24
Walze_1(5) = 7
Walze_1(6) = 1
Walze_1(7) = 22
Walze_1(8) = 17
Walze_1(9) = 12
Walze_1(10) = 13
Walze_1(11) = 26
Walze_1(12) = 2
Walze_1(13) = 5
Walze_1(14) = 21
Walze_1(15) = 14
Walze_1(16) = 25
Walze_1(17) = 11
Walze_1(18) = 6
Walze_1(19) = 16
Walze_1(20) = 8
Walze_1(21) = 3
Walze_1(22) = 18
Walze_1(23) = 4
Walze_1(24) = 19
Walze_1(25) = 10
Walze_1(26) = 20

Walze_1_inv(23) = 1
Walze_1_inv(15) = 2
Walze_1_inv(9) = 3
Walze_1_inv(24) = 4
Walze_1_inv(7) = 5
Walze_1_inv(1) = 6
Walze_1_inv(22) = 7
Walze_1_inv(17) = 8
Walze_1_inv(12) = 9
Walze_1_inv(13) = 10
Walze_1_inv(26) = 11
Walze_1_inv(2) = 12
Walze_1_inv(5) = 13
Walze_1_inv(21) = 14
Walze_1_inv(14) = 15
Walze_1_inv(25) = 16
Walze_1_inv(11) = 17
Walze_1_inv(6) = 18
Walze_1_inv(16) = 19
Walze_1_inv(8) = 20
Walze_1_inv(3) = 21
Walze_1_inv(18) = 22
Walze_1_inv(4) = 23
Walze_1_inv(19) = 24
Walze_1_inv(10) = 25
Walze_1_inv(20) = 26
End Sub

End

Che Guevara
12.09.2011, 11:44
Hm, also dein Code funktioniert bei mir auch! Mittlerweile habe ich über 5000 Durchläufe ohne auch nur einen Fehler :) Vielen vielen Dank :D
ABER: Wo ist der Unterschied?
Hier ist mein momentaner Code (funktioniert nicht):


$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80



Declare Sub Init_system()
Declare Function Tastatur() As Byte
Declare Sub Walze_drehen()
Declare Function Codieren(byval Codieren_in As Byte) As Byte
Declare Function Reflektor(byval Reflektor_in As Byte) As Byte



Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink
Deflcdchar 0 , 32 , 32 , 1 , 18 , 20 , 24 , 16 , 32



Dim Walze_1(26) As Byte
Dim Walze_1_inv(26) As Byte

Dim Pointer_1 As Byte

Dim Ar_out(4) As Byte
Dim Ar_out_old(4) As Byte

Dim Tmp As Byte
Dim Tmp2 As Byte
Dim I As Byte

Dim _out As Byte 'ascii-wert (skaliert auf 1-26)
Dim _in As Byte 'ascii-wert (skaliert auf 1-26)



Const _a = 1
Const _b = 2
Const _c = 3
Const _d = 4
Const _e = 5
Const _f = 6
Const _g = 7
Const _h = 8
Const _i = 9
Const _j = 10
Const _k = 11
Const _l = 12
Const _m = 13
Const _n = 14
Const _o = 15
Const _p = 16
Const _q = 17
Const _r = 18
Const _s = 19
Const _t = 20
Const _u = 21
Const _v = 22
Const _w = 23
Const _x = 24
Const _y = 25
Const _z = 26




Call Init_system()






Do



Ar_out(1) = Tastatur()
Ar_out(2) = Tastatur()
Ar_out(3) = Tastatur()
Ar_out(4) = Tastatur()

Locate 1 , 1
Lcd "AUSGANGSSTELLUNG"
Locate 2 , 1
Lcd Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "
Locate 2 , 16
Lcd " "

Waitms 1000
Cls



Ar_out_old(1) = Ar_out(1)
Ar_out_old(2) = Ar_out(2)
Ar_out_old(3) = Ar_out(3)
Ar_out_old(4) = Ar_out(4)


Call Init_system()
Ar_out(1) = Codieren(ar_out(1))
Ar_out(2) = Codieren(ar_out(2))
Ar_out(3) = Codieren(ar_out(3))
Ar_out(4) = Codieren(ar_out(4))
Locate 1 , 1
Lcd Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "


Call Init_system()
Ar_out(1) = Codieren(ar_out(1))
Ar_out(2) = Codieren(ar_out(2))
Ar_out(3) = Codieren(ar_out(3))
Ar_out(4) = Codieren(ar_out(4))
Locate 2 , 1
Lcd Ar_out(1) ; ":" ; Ar_out(2) ; ":" ; Ar_out(3) ; ":" ; Ar_out(4) ; " "

If Ar_out_old(1) = Ar_out(1) And Ar_out_old(2) = Ar_out(2) And Ar_out_old(3) = Ar_out(3) And Ar_out_old(4) = Ar_out(4) Then
Locate 2 , 16
Lcd Chr(0)
Else
Locate 2 , 16
Lcd " "
End If


Waitms 1000



Loop



Sub Walze_drehen()
Tmp2 = Walze_1(1)
For Pointer_1 = 1 To 26
Tmp = Pointer_1 + 1
If Tmp = 27 Then Tmp = 1
Walze_1(pointer_1) = Walze_1(tmp)
If Pointer_1 = 26 Then
Walze_1(26) = Tmp2
End If
Walze_1_inv(walze_1(pointer_1)) = Pointer_1
Next Pointer_1
End Sub


Function Tastatur() As Byte
Tastatur = Rnd(25) + 1
End Function


Function Codieren(byval Codieren_in As Byte) As Byte
Tmp = Walze_1(codieren_in)
Tmp = Reflektor(tmp)
Codieren = Walze_1_inv(tmp)
Call Walze_drehen()
End Function


Function Reflektor(byval Reflektor_in As Byte) As Byte
If Reflektor_in.0 = 0 Then
Reflektor_in = Reflektor_in + 1
If Reflektor_in = 27 Then Reflektor_in = 1
Else
Reflektor_in = Reflektor_in - 1
If Reflektor_in = 0 Then Reflektor_in = 26
End If
Reflektor = Reflektor_in
End Function


Sub Init_system()
Walze_1(1) = 23
Walze_1(2) = 15
Walze_1(3) = 9
Walze_1(4) = 24
Walze_1(5) = 7
Walze_1(6) = 1
Walze_1(7) = 22
Walze_1(8) = 17
Walze_1(9) = 12
Walze_1(10) = 13
Walze_1(11) = 26
Walze_1(12) = 2
Walze_1(13) = 5
Walze_1(14) = 21
Walze_1(15) = 14
Walze_1(16) = 25
Walze_1(17) = 11
Walze_1(18) = 6
Walze_1(19) = 16
Walze_1(20) = 8
Walze_1(21) = 3
Walze_1(22) = 18
Walze_1(23) = 4
Walze_1(24) = 19
Walze_1(25) = 10
Walze_1(26) = 20

Walze_1_inv(23) = 1
Walze_1_inv(15) = 2
Walze_1_inv(9) = 3
Walze_1_inv(24) = 4
Walze_1_inv(7) = 5
Walze_1_inv(1) = 6
Walze_1_inv(22) = 7
Walze_1_inv(17) = 8
Walze_1_inv(12) = 9
Walze_1_inv(13) = 10
Walze_1_inv(26) = 11
Walze_1_inv(2) = 12
Walze_1_inv(5) = 13
Walze_1_inv(21) = 14
Walze_1_inv(14) = 15
Walze_1_inv(25) = 16
Walze_1_inv(11) = 17
Walze_1_inv(6) = 18
Walze_1_inv(16) = 19
Walze_1_inv(8) = 20
Walze_1_inv(3) = 21
Walze_1_inv(18) = 22
Walze_1_inv(4) = 23
Walze_1_inv(19) = 24
Walze_1_inv(10) = 25
Walze_1_inv(20) = 26
End Sub


End


Gruß
Chris

MagicWSmoke
12.09.2011, 12:03
Mittlerweile habe ich über 5000 Durchläufe ohne auch nur einen Fehler
Auch auf echter HW ?

ABER: Wo ist der Unterschied?
Kann ich jetzt auch nicht sagen...

Che Guevara
12.09.2011, 12:08
Ja, auf echter Hardware ;) ATMEGA32 aufm RN-Control. Funktioniert einwandfrei :D Nur mein Code funktioniert nicht, obwohls fast der gleiche ist?! ...

Gruß
Chris

MagicWSmoke
13.09.2011, 07:18
... obwohls fast der gleiche ist?! ...
Mit kleinen Ausnahmen:

Else
Reflektor_in = Reflektor_in - 1
If Reflektor_in = 0 Then Reflektor = 26
End If
Reflektor = Reflektor_in
End Function

Che Guevara
13.09.2011, 12:24
Oh, jetzt sehe ich es auch... Danke!
Dann werde ich jetzt mal am Projekt weiterbasteln :)

Vielen Dank & Gruß
Chris