- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Enigma auf dem µC

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578

    Enigma auf dem µC

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    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.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von vohopri
    Registriert seit
    11.09.2004
    Ort
    südlich der Alpen
    Beiträge
    1.708
    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?

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    @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 Ein- bzw. Ausgabe sind noch unklar, es wird aber auf jeden Fall mehrere Module geben, welche über I2C kommunizieren. Details folgen

    Gruß
    Chris

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    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.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Oooh stimmt, danke
    Habs jetzt so gemacht:
    Code:
    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
    Geändert von Che Guevara (12.09.2011 um 11:38 Uhr)

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    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:
    Code:
    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 ?

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test