- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 6 von 6

Thema: Einfaches Codeschloss

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.10.2008
    Beiträge
    234

    Einfaches Codeschloss

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi Leute,
    habe mir heute ein einfaches Codeschloss gebastelt.

    Funktionsprinzip:
    3Taster:
    - Variable +1
    - Eingabe
    - Reset

    Momentan weiß ich noch nicht wie ich das ganze im Code machen soll. Ich habe zwar schon einen Ansatz, bräuchte aber noch ein wenig Hilfe.

    Also ich habe 2 Variablen. Eine ist = 0 und eine ist = ? (die gewünschte einstellige Codezahl)
    Wenn ich jetzt den Taster Variable +1 betätige wird zur ersten Variable 1 addiert. Man muss den Taster drücken bis die Variable den richtigen Wert hat. Dann bestätigt man über den Eingabe Taster (die beiden Variablen werden verglichen). Wenn die Zahlen übereinstimmen öffnet sich das Schloss. Wenn nicht, leuchtet wieder die rote LED und man muss das Passwort erneut eingeben. Der Reset Taster dient zum zurücksetzen der Variable auf null.

    Momentan sieht mein Code noch so aus:
    Code:
    $regfile = "m8def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    
    
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    
           Gelb Alias Portb.1
           Gruen Alias Portb.2
           Rot Alias Portb.3
    
    Config Pinb.0 = Input
    Config Pind.7 = Input
    Config Pind.6 = Input
    
           Taste1 Alias Pind.6
           Eingabe Alias Pind.7
           Neu Alias Pinb.0
    
    
    
           Portb.0 = 1
           Portd.7 = 1
           Portd.6 = 1
    
    
    Dim Code(1) As Byte
    Dim Pass(1) As Byte
    
    
    Dim Pass = 5
    Dim Code = 0
    
    Do
    
    If Dim Code = 0 Then
      Rot = 1
    Else
      Rot = 0
    End If
    
    
    If Dim Code = 0 Then
      Gelb = 0
    Else
      Gelb = 1
    End If
    
    
    If Taster1 = 0 Then
      Dim Code = Code + 1
    End If
    
    
    If Dim Code = Dim Pass Then
        Gruen = 1
    Else
        Gruen = 0
    End If
    
    
    Loop
    Wäre über Hilfe beim Code sehr dankbar.

    LG Fabian

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.02.2005
    Ort
    Südtirol
    Beiträge
    283
    Hi,

    Code:
    Dim Code(1) As Byte
    Dim Pass(1) As Byte
    
    
    Dim Pass = 5
    Dim Code = 0
    du brauchst die Variablen nur einmal zu definieren, bei den restlichen kannst du ruhig das "Dim" weglassen. Warum definierst du eig "Code" und "Pass" als Arry, die "(1)" kannste bei beiden Variablen auch weglassen.

    Code:
    If Dim Code = 0 Then
      Rot = 1
    Else
      Rot = 0
    End If
    
    
    If Dim Code = 0 Then
      Gelb = 0
    Else
      Gelb = 1
    End If
    Das kannst du alles in einer IF Abfrage machen weil du ja beidesmal auf Code=0 abfrägst und auch ohne "Dim" also so:
    Code:
    If Dim Code = 0 Then
      Rot = 1
      Gelb=0
    Else
      Rot = 0
      Gelb=1
    End If
    Gruß Kalle

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.10.2008
    Beiträge
    234
    Ok, die IF-Abfrage hab ich mal zusammen gepackt.

    Aber wie funktioniert das jetzt genau? Also Variablen Definiton, und dann damit arbeiten.

    LG Fabian

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.10.2008
    Beiträge
    234
    So, ich hab meinen Code nochmal überarbeitet, den compiliert er jetzt ohne Fehler:

    Code:
    $regfile = "m8def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    
    
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    
           Gelb Alias Portb.1
           Gruen Alias Portb.2
           Rot Alias Portb.3
    
    Config Pinb.0 = Input
    Config Pind.7 = Input
    Config Pind.6 = Input
    
           Taste1 Alias Pind.6
           Eingabe Alias Pind.7
           Neu Alias Pinb.0
    
    
    
           Portb.0 = 1
           Portd.7 = 1
           Portd.6 = 1
    
    
    
    Dim Pass As Byte
    Dim Code As Byte
    
    Pass = 5
    Code = 0
    
    Do
    
    If Code = 0 Then
      Rot = 1
      Gelb = 0
    Else
      Rot = 0
      Gelb = 1
    End If
    
    
    If Taste1 = 0 Then
       Code = Code + 1
    End If
    
    
    If Code = Pass Then
        Gruen = 1
    Else
        Gruen = 0
    End If
    
    
    Loop
    Hab das ganze eben ausprobiert, hat noch nicht funktioniert. Ich denke der Fehler liegt in der Hardware, das überprüf ich nachher nochmal.

    Ich hab mal ein Bild angehängt.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken dsc00282_116.jpg  

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.02.2005
    Ort
    Südtirol
    Beiträge
    283
    Hi, es kann sein, daß dein Taster zu stark prellt und dadurch beim drücken die Variable gleich mehrmals hochzählet. Such hier im Forum doch mal nach "entprellen" .
    Du kannst auch versuchen deinen Controller mal über die Serielle Schnittstelle an den PC dranzuhängen und dir die Variablen in nem Terminalprogramm anzeigen lassen, dann siehst du auch ob überhaupt etwas hochzählt.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.07.2009
    Ort
    Gustorf
    Beiträge
    217
    Hallo,
    ich glaube ich kann tatsächlich zum erstenmal jemandem helfen

    Also ich habe das selbe Projekt wie du nur mit 4 Tastern. Mein Code funktioniert auch wunderbar. Dies ist er:

    Code:
          $regfile = "m8def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    
    
    Config Portd.5 = Output
                   Config Pind.4 = Input
                    Config Pinb.0 = Input
                    Config Pind.7 = Input
                    Config Pinc.3 = Input
    
                    Taste1 Alias Pind.7
                    Taste2 Alias Pinb.0
                    Taste3 Alias Pind.4
                    Taste4 Alias Pinc.3
    
                    Portd.7 = 1
                    Portb.0 = 1
                    Portc.3 = 1
         Portd.4 = 1
    
    Dim Code(4) As Byte
    
    Do
    
    If Taste1 = 0 Then                                          'wenn kein Widerstand vorhandem, d.h. strom fliesst
    Portd.5 = 1
                           Code(1) = Code(2)
                           Code(2) = Code(3)
                           Code(3) = Code(4)
                           Code(4) = 1
    While Taste1 = 0
    Wend
    
    
    Elseif Taste2 = 0 Then
    Portd.5 = 1
                           Code(1) = Code(2)
                           Code(2) = Code(3)
                           Code(3) = Code(4)
                           Code(4) = 2
    
    While Taste2 = 0
    Wend
    
           Elseif Taste3 = 0 Then
    
           Portd.5 = 1
    
                           Code(1) = Code(2)
                           Code(2) = Code(3)
                           Code(3) = Code(4)
                           Code(4) = 3
    
    While Taste3 = 0
    Wend
           Elseif Taste4 = 0 Then
    
           Portd.5 = 1
                           Code(1) = Code(2)
                           Code(2) = Code(3)
                           Code(3) = Code(4)
                           Code(4) = 4
    
    While Taste4 = 0
    Wend
    
           Else
           Portd.5 = 0                                          'kein strom auf pin
    
         End If
    
    If Code(1) = 1 Then
    If Code(2) = 2 Then
          If Code(3) = 3 Then
                If Code(4) = 4 Then
    
                      Portd.5 = 1
    
                End If
          End If
    End If
    End If
    
    
    
      Loop

    Der Code überwacht 4 Pins ob sie verbunden werden (Taster gedrückt) und schreibt die Nummer des Pins in eine Variable.
    Diese wird immer weiter nach vorn verschoben, so dass wenn das Array die richtige konstelation aufweist darauf reagiert wird (in diesem fall das bewegen eines Servos, was ich aber noch ändere).

    Wichtig hierbei ist nach jedem erkannten Tastendruck die Schleife die solange wartet wie die Taste gedrückt ist. Damit wird verhindert das die Zahl mehrmals in das Array geschrieben wird wenn die Taste nur einmal gedrückt wird.

    Ich hoffe ich konnte helfen.

    Es grüßt,
    Basteltisch

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad