Hier eine kleine Software für den ATMEL Tiny13, mit der sich die Tiny Experimentierplatine in ein kleines Codeschloss verwandeln lässt.
Link zur Experimentierplatine:
http://www.loetstelle.net/projekte/tinydil/tinydil.html
Normale Code-Schlösser haben meist ein numerisches Tastenfeld, um die Zahlenkombination einzugeben. Das hier vorgestellte
Codeschloss hingegen verwendet nur einen einzigen Taster, um den Code einzugeben. Der Code besteht dabei aus Tastenimpulsen
verschiedener Länge..
Der Code besteht aus Tastenimpulsen, die entweder "lange" oder "Kurz" sein können. Wurde die Kombination richtig eingegeben,
wird ein Ausgang für ca 0.5s aktiviert, damit kann dann ein Türöffner etc betätigt werden..
Um einen eigenen Code einzugeben, muss der Onboard-Taster an PB3 während der Code-Eingabe gedrückt gehalten werden. Das
bewirkt, dass die erkannte Tastenfolge im internen EEProm abgelegt wird und somit als neuer Code fungiert. Die Eingabe eines
Codes wird dabei durch kurzes Aufblinken der Status-LED an PB3 angezeigt. .
Wurde der Code 3 mal falsch eingegeben, verweigert das Codeschloss für ca 10 Minuten das Aktivieren des Ausgangs. .
Die Schaltung ist sehr gut für Batteriebetrieb geeignet, da der Prozessor die meiste Zeit im Power Down Modus ist und nur
wenige uA benötigt. Durch Drücken des Tasters wacht der Controller auf (Pin Change Intrrupt) und ist für die Eingabe eines
Codes bereit, wobei der Prozessor dabei ebenfalls meistens im Sleep Modus verweilt. über den Watchdog-Timer erwacht der
Controller ca alle 8 Sekunden und gibt einen kurzen "Blitz" mit der Status-LED aus, um die Funktionsbereitschaft anzuzeigen.
.
Die Anzahl der benötigten Tastendrücke kann über den Parameter CODELENGTH eingestellt werden, je nachdem wie hoch das "Sicherheitsbedürfnis"
des Anwenders ist. Da jeder Tastendruck und jeder Codeteil recht verschwenderisch in einem eigenen Byte abgelegt wird, kann
die Codelänge maximal ca 55 Stellen betragen (Beim Tiny13, SRAM-Stack), was mehr als ausreichend sein sollte. .
Ich betreibe diese Schaltung als "verdeckten Türöffner", der mir schon einige male einen Anruf beim Schlüsseldienst und
viel ärger erspart hat. Fast jeder kennt das Problem, wenn die Haustür ins Schloss fällt und der Schlüssel in der Wohnung
liegt. Man bräuchte jemanden, der von Innen den Türöffner betätigt (Meine Wohnungstüre hat einen Türöffner eingebaut). Genau
das kann diese Schaltung: .
über einen Optokoppler habe ich die Schaltung parallel zu meiner Türklingel (über 1 Widerstand , 1 Diode und 1 Kondensator,
da meine Klingel mit Wechselspannung läuft..) angeschlossen. Normales Klingeln ignoriert das Codeschloss. Aber wenn das
Klingeln mit der richtigen Impulsfolge erfolgt, wird kurz der Türöffner aktiviert, und Voila, Sesam öffne Dich. .
Eine relativ kurze Codelänge ist dabei für mich kein Sicherheitsrisiko, denn wenn ich meinen Schlüssel mal nicht in der
Wohnung vegessen habe, sperre ich die Haustüre natürlich noch extra ab, wenn ich weggehe. .
Quellcode: ( Klick hier für Download)
.include "tn13def.inc"
.def wrongcount = r24
.equ TASTER_INTERN = 3 .equ TASTER_EXTERN = 4
//Wartezeit bei überschreiten der Fehlversuche
.equ CODELENGTH = 5 //Die Schluessel-Länge, maximal RAM / EEprom Groesse- Stack)
.org WDTAddr
.org PCI0Addr
reset:
//Stack Pointer initialisieren
//Output und Status-Pins als Ausgang
out portb,temp1
//Prescaler sezten und Timer Starten
//interne Zaehler zurücksetzen
//Watchdog init
sei
//Pulsieren , dabei wird auch die Sleep-Semaphore wieder geloescht.
cbi portb,STATUS
//Power Down Modus
OVF0Handler:
dec pulseoutput
testbutton:
//prüfen, ob taster gedrückt
//maximal 10 Interrupt-Zyklen lang hochzählen
// Taster wurde losgelassen
//zu kurz gedrückt / entprellung
valid: ldi temp1,$00
inc temp1
//Erkannten Tastendruck im SRAM speichern
rcall eval
wdthandler: in r1,sreg
pcihandler: in r1,sreg
out sreg,r1
eval: //Wenn alle uebereinstimmen, dann Ausgang aktivieren oder
//CODELENGTH aufeinanderfolgende Bytes aus EEPROM lesen und vergleichen
ldi temp2,low(code)
dec temp4
rcall pulse
exiteval: rcall status_short
setcode: //code im EEPROM abspeichern
writeloop:
rcall status_long ret
readeeprom:
status_short:
status_long:
//Ausgang aktivieren
.eseg
code: .byte CODELENGTH
|