PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfaches Codeschloss



murdocg
01.10.2009, 20:56
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:

$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

kalletronic
02.10.2009, 09:35
Hi,



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.


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:

If Dim Code = 0 Then
Rot = 1
Gelb=0
Else
Rot = 0
Gelb=1
End If


Gruß Kalle

murdocg
02.10.2009, 14:32
Ok, die IF-Abfrage hab ich mal zusammen gepackt.

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

LG Fabian

murdocg
03.10.2009, 10:41
So, ich hab meinen Code nochmal überarbeitet, den compiliert er jetzt ohne Fehler:


$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.

kalletronic
05.10.2009, 07:40
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.

Basteltisch
11.10.2009, 00:11
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:


$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