Hallo alle zusammen, ich habe bis jetzt noch kein Forum aufgesucht bin also absouluter Neuling. -Habe schon seit einigen Monaten ein Projekt am laufen und komme einfach nicht weiter. Vorab: Habe schon zahlreiche Threats durchgelesen und ich finde leider keinen wirklichen ansatz für mein Problem und ich hoffe dass ich nichts übersehen habe. Beschreibung: Auch in diesem Forum ist das Thema Codeschloss einige male gefallen und ich möchte hier kurz mein Projekt schildern: Wir hatten bisher an unserer Haustüre eine Schaltung durch die man mit einem eingegebenen Code die Türe öffnen kann. Diese war duch einen Zeitgeber NE555 und ein Schieberegister realisiert- ist jetzt aber auch egal - jedenfall funktioniert Sie schon seit ca. 2 Jahren nicht mehr habe sie schon mal repariert aber die Platine ist doch schon sehr kaputt Oxidation etc. Also hätte ich so oder so ein neues Layout entwickeln müssen deshalb wollte ich die ganze Sache mit einem PIC realisieren. Habe schon mit dem PIC 16F84a in der Ausbildung einige Projekte realisiert und deshalb reizt mich diese Schaltung. Nun Kurz zu meinem Aufbau: 4x4 Matrix Tastatur Abfrage, Summer, LED Relais dazu natürlich Etprellung, Gleichrichter-Schaltung mit Glättung power on reset etc. Die Platine ist Funktionstüchtig und die Matrix Abfrage funktioniert bereits. (Quellcode im Anhang) Problem: Ich komm auf keinen grünen Zweig was die Codeabfrage betrifft?! mir wäre schon sehr geholfen wenn mir jemand mal so einen Tipp geben könnte wie man es überschaubar realisieren kann also z. b. Eingangsabfrage in Register ablegen und diese mit einem vorgegebenen Wert vergleichen oder so aber es sollte dann doch sicher sein also könnte mir jemand mal ein paar Zeilen als Verdeutlichung posten? -Ich weis es gibt da eine Elektor Lösung aber die verstehe ich nicht wirklich und die vielen Variablen machen es nicht einfacher - will es selbst programmieren und nich einfach elektor kopieren ohne es zu verstehen Ich wäre sehr dankbar für einen Denkansatzt und bedanke mich schon mal gruß flo
Hallo Florian, vorab: ich arbeite nicht (mehr) mit Pics - aber im Grundsatz funktioniert ein Codeschloss wie folgt: 1. auf Taste warten 2. Taste 1 erkannt, Taste merken, Zähler erhöhen, Timeout setzen 3. Zähler prüfen, wenn <> gewünschte Stellen weiter mit 1 sonst 5. 4. Timeout prüfen, wenn <> 0 weiter mit 1 sonst 6. 5. gemerkte Tasten 1-n mit Code vergleichen, Tür öffnen, weiter mit 6. Werte und Zähler löschen Otto
Vielen dank genau soetwas habe ich mir vorgestellt ... manchmal hat man wie ein Brett vor dem Kopf werde das im laufe der nächsten Woche mal umsetzten und dann mein feedback posten gruß flo
Otto wrote: > Hallo Florian, > > vorab: ich arbeite nicht (mehr) mit Pics - aber im Grundsatz > funktioniert ein Codeschloss wie folgt: > > 1. auf Taste warten > 2. Taste 1 erkannt, Taste merken, Zähler erhöhen, Timeout setzen > 3. Zähler prüfen, wenn <> gewünschte Stellen weiter mit 1 sonst 5. > 4. Timeout prüfen, wenn <> 0 weiter mit 1 sonst 6. > 5. gemerkte Tasten 1-n mit Code vergleichen, Tür öffnen, weiter mit > 6. Werte und Zähler löschen > > Otto Hallo, man kann aber bei 2. auch einfach nur ein Bit setzen, wenn die Zahl falsch war und bei 5 dann dieses Bit auswerten. Den PIN könntest du dir im EEPROM merken. Nun denkst du dir noch eine Möglichkeit aus, den PIN ändern zu können und schon ist dein Türschloss dem Schieberegisterteil überlegen.
Also wie gesagt danke nochmal, hab das jetzt mal probiert so gut wie möglich umzusetzen also so ein paar ausgange Programmieren oder Eingänge abfragen was ich bisher gemacht habe das ist ja ein Witz gegen so ein Codeschloss also im moment fehlt noch der Vergleich wäre über ein paar Verbesserungsvorschläge und eine Problem Lösung mit dem Vergleich sehr Dankbar gruß Flo (Modell code im Anhang)
Mal abgesehen von dem Stacküberlauf, welcher ständig entsteht, sehr unschön programmiert.... Aber sollte es funktionieren (was ich aufgrund des unübersichtlichen Codes nicht sagen kann), dann gut.
Am besten alles löschen und noch mal von vorn. Nicht einfach drauf los Tippen sondern erst Programmablaufplan auf Papier. EQU Anweisungen vorm Codebereich Symbole benutzen (PORTB statt 86h) Unterprogramme nutzen
Also danke mal für die Verbesserungsvorschläge! -mach mich auch wieder ans Werk Möchte mich allerdings zu dem "einfach drauf los tippen" äußern, das stimmt nicht so ganz ich hab ein PAP gemacht, aber die Umsetzung ist nicht immer so leicht wie beim PAP. Und die Unübersichtlichkeit lichtet sich wenn man später das Programm verbessert es sollte eigentlich auch nur Zeigen, dass ich am arbeiten bin und wie Weit. Übung macht den Meister ;-) Also bitte Sachlich bleiben und nicht gleich voreilige schlüsse über andere ziehen.
War nicht böse gemeint sieht halt ein bischen chaotisch aus der Code. Vor allem die doppelte Matrixabfrage. Lass doch mal deinen PAP sehen. Ich hau auch alles in die Tonne wenn ich garnicht mehr weiter komme mach was ganz anderes und fang dann nochmal von vorn an. Versuch mal jemanden der gar keine ahnung hat zu erklären was du vor hast das hilft Fehler zu erkennen.
Schau doch mal bei sprut.de. Dort findest du Beispiele, wie man eine 4x3 Tastatur abfragt. Dort findest du auch Routinen, wie man den EEPROM nutzt. Speichere deine PIN im EEPROM. Nimm eine Zählvariable, welche die Stelle der Ziffer in der PIN zählt (also von 0 bis 5). Diese Variable nimmst du als Zeiger auf die EEPROM Zelle und gleichzeitig als Zählvariable wie viele Ziffern schon eingegeben wurden. Immer wenn eine Ziffer eingegeben wurde, vergleichst du diese mit der entsprechenden Zelle im EEPROM. Ist sie richtig, wartest du auf die nächste Ziffer. Ist sie falsch, setzt du ein FLAG. Nach der letzten Ziffer, schaust du ob das FLAG gesetzt ist -> dann ist der PIN falsch -> Fehler -> von vorn anfangen (eventuell warten, wegen probieren). Ansonsten ist er richtig und das Relais wird geschaltet -> Zähler und FLAG zurücksetzen. Interrupt: Im Interrupt wird ein Timer von ca. 2-3 Sekunden runtergezählt, welcher immer zurückgesetzt wird, wenn eine Taste betätigt wurde. Ist der Zähler abgelaufen und es wurden noch nicht alle Ziffern eingegeben, dann Zähler und FLAG löschen -> Fehler -> von vorn anfangen. Das kann man in einer Schleife machen. Allerdings bist du wohl programmtechnisch noch nicht so weit. Mach aber weiter. Nur so lernst du die Tricks und Feinheiten der Assemblerprogrammierung. Manchmal muss man ein wenig um die Ecke denken. Ich widme mich jetzt mal der zweiten Hälfte meiner Rotweinflasche. Prost ;-) Sven PS: Ach ja, warum includierst du die .inc und benutzt dann nicht die Namen, der Register statt die Adressen. So kann und wird das keiner lesen.
Hallo zusammen, bin gerade im Studium und sollte mir eine Studienarbeit heraussuchen... habe ein Codeschloss mit Matrixabfrage gewählt und zunächst mal gegooglt was es im Internet da so gibt aber für die Verarbeitung des Codes bin ich noch nicht sonderlich weit gekommen. Matrix hängt wie oben von Florian beschrieben an Port B wobei B0-3 als Ausgänge geschaltet werden und b4-7 als Eingänge. an Ra habe ich zunächst mal eine LED gehängt, die den Sumer simulieren soll. Wie in diesem Threat beschrieben habe ich mir die Matrix abfrage von der Sprut 3x4 Matrix durchgelesen und diese auf meine angepasst. Abfrage funktioniert man kann auch den Binärcode mit dem Oszi nachmessen. Mein derzeitiger Stand ist nun der Binärcode der von einer gedrückten Taste im Register Taste gespeichert wird. Mein Problem liegt in der Umsetztung um den code mit der Vorgabe zu vergleichen bzw. wie ich weiter mit den Rechenoperatoren in Assembler verfahre?! Hier mal mein bisheriger Code für die Matrix abfrage, mir wäre schon sehr geholfen wenn jemand mal eine Art beispielprogramm für ein weiteres verfahren mit dem Vergleichen der Vorgabe anfügen könnte ... Zeitschleife für die Abfrage und andere Feinheiten bekomme ich dann schon irgendwie auf die Reihe aber mir fehlt im Moment der Übergangsschritt zwischen PAP und Programm Danke für Eure Hilfe gruß Björn Programmcode: LIST p=16f84A #include <P16f84A.INC> __CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC ;***************************************************************** org 0x00 Taste equ 0eh ;***************************************************************** Initialisierung bsf STATUS,RP0 ;in Bank 1 wechseln clrf TRISA ;Register TRISA löschen (alles auf Ausgang) movlw B'11110000' ;RB4...RB7 Eingänge -rest Ausgänge movwf TRISB ;Arbeitregister in TRISB schreiben bcf STATUS,RP0 ;in Bank 0 zurück wechseln ;***************************************************************** Main call Tastatur ;Unterprogramm Tastaturabfrage movwf Taste ;Taste in Taste Register kopieren movwf PORTA goto Main ;***************************************************************** Row1 equ 1 ;0,1,2,A (RB0) Row2 equ 2 ;3,4,5,B (RB1) Row3 equ 3 ;6,7,8,C (RB3) Row4 equ 4 ;9,F,E,D (RB3) Tastatur movlw B'00000' ;wenn keine Taste gedrück Arbeitsregister 0 bsf PORTB,Row1 bcf PORTB,Row2 bcf PORTB,Row3 bcf PORTB,Row4 call key1 ;1.Spalte abfragen bcf PORTB,Row1 bsf PORTB,Row2 bcf PORTB,Row3 bcf PORTB,Row4 call key2 ;2.Spalte abfragen bcf PORTB,Row1 bcf PORTB,Row2 bsf PORTB,Row3 bcf PORTB,Row4 call key3 ;3.Spalte abfragen bcf PORTB,Row1 bcf PORTB,Row2 bcf PORTB,Row3 bsf PORTB,Row4 call key4 ;4.Spalte abfragen movwf Taste return key1 btfsc PORTB,4 retlw B'00001' ;Taste 0 btfsc PORTB,5 retlw B'00010' ;Taste 1 btfsc PORTB,6 retlw B'00011' ;Taste 2 btfsc PORTB,7 retlw B'00100' ;Taste A return key2 btfsc PORTB,4 retlw B'00101' ;Taste 3 btfsc PORTB,5 retlw B'00110' ;Taste 4 btfsc PORTB,6 retlw B'00111' ;Taste 5 btfsc PORTB,7 retlw B'01000' ;Taste B return key3 btfsc PORTB,4 retlw B'01001' ;Taste 6 btfsc PORTB,5 retlw B'01010' ;Taste 7 btfsc PORTB,6 retlw B'01011' ;Taste 8 btfsc PORTB,7 retlw B'01100' ;Taste C return key4 btfsc PORTB,4 retlw B'01101' ;Taste 9 btfsc PORTB,5 retlw B'01110' ;Taste F btfsc PORTB,6 retlw B'01111' ;Taste E btfsc PORTB,7 retlw B'10000' ;Taste D return end
Vergleiche machst du in PIC-Assembler indem du beide zu vergleichenden Werte voneinander abziehst und dann das Z-Bit (Vergleich auf Übereinstimmung) oder das C-Flag (Vergleich ob größer oder kleiner) im STATUS-Register auswertest. Bsp. Test ob TasteA = TasteB ist: movfw TasteA subwf TasteB,w btfss STATUS,Z goto Nicht0 Gleich0 : Nicht0 : Sven
Ok, das hilft mir schon mal weiter also nach diesem Schema müsste ich ja dann Jede einzelne Zahl mit einer Vorgabe vergleichen also bsp.: Vorgabe = 12345 Tastatur abfrage Taste = A dann Tatste mit einem Register vergleichen indem 1 Steht Tastatur abfrage Taste = B dann Tatste mit einem Register vergleichen indem 2 Steht Etc. Wenn alle stimmen aufmachen falls nicht z.b. ein Bit für 3 versuche setzten, nicht öffnen von vorne. Oder?!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.