Forum: Mikrocontroller und Digitale Elektronik Codeschloss mit PIC [Assembler Code]


von Florian G. (dj-en)


Angehängte Dateien:

Lesenswert?

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

von Otto (Gast)


Lesenswert?

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

von Otto (Gast)


Lesenswert?


von Florian G. (dj-en)


Lesenswert?

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

von Sven S. (stepp64) Benutzerseite


Lesenswert?

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.

von Florian G. (dj-en)


Angehängte Dateien:

Lesenswert?

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)

von Moi (Gast)


Lesenswert?

Zum Glück ist der Speicherplatz im Pic gratis dabei... ;)

von Moi (Gast)


Lesenswert?

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.

von ohno (Gast)


Lesenswert?

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

von Florian G. (dj-en)


Lesenswert?

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.

von ohno (Gast)


Lesenswert?

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.

von Sven S. (stepp64) Benutzerseite


Lesenswert?

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.

von Student 32 (Gast)


Lesenswert?

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

von stepp64 (Gast)


Lesenswert?

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

von Student 32 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.