Forum: Mikrocontroller und Digitale Elektronik Smartcard-Kode-Schloss mit PIC16F84


von Maxe (Gast)



Lesenswert?

Hallo zusammen.

Ich habe vor ein paar tagen folgendes gefunden(anhang) und würde es 
gerne nachbauen da es leider nicht mehr als bausatz zu kaufen gibt.
Ein smartcard-kode-schloss (Elektor 11/98, ich weiss ist schon ein 
bißchen älter).
Ich habe schon länger interesse an elektrik/elektronik und habe 
ausreichend lötkenntnisse um so eine schaltung zusammen zu löten aber 
mein problem ist das ich keinerlei erfahrung mit programmierung(C,C++ 
usw.) habe.
Ich habe probiert mich selber schlau zu machen aber das internet ist so 
voll mit tutorials und tips und tricks das ich garnicht weiß wo ich 
anfangen soll zu lesen.

In der pdf steht "PBASIC-Listing des PIC-Programms vor der Kompilierung"



‘DUAL smart card lock with PIC16F84
‘copyright (c) 1998 Patrick GUEULLE
symbol f = B0
symbol g = B1
symbol e = B2
symbol r = B3
symbol BLINK = B4
symbol h = B5
DIRS = %11100110
PINS = %00000010
high 7
high 6
low 6
low 7
high 6
low 6
high 5
if PIN3 = 0 then learn
if PIN3 = 1 then check
learn:
for f = 0 to 31
e = 0
for g = 0 to 7
e = e * 2
e = e + PIN4
high 6
low 6
next g
h = 32 * PIN0
h = h + f
write h,e
next f
PINS = 0
BLINK = 50
goto led
check:
for f = 0 to 31
e = 0
for g = 0 to 7
e = e * 2
e = e + PIN4
high 6
low 6
next g
read f,r
if e <> r then other
goto cont
other:
h = f + 32
read h,r
if e <> r then error
cont:
next f
PINS = %00000110
goto forever
error:
PINS = 0
BLINK = 255
goto led
led:
for f = 0 to 10
high 1
pause BLINK
low 1
pause BLINK
next f
forever:
goto forever



Davon verstehe ich keine einzige zeile.
Jetzt meine frage.Kann mir irgendjemand das ganze in C 
übersetzten(kompilieren würde ich mit mplab und cc5x grade so noch 
hinkriegen) oder am besten schon ein fertiges hex-file zukommen lassen?
Laut der pdf ist das programm in pbasic verfaßt und ich hab bis jetzt 
kein kompilierer für pbasic gefunden.Das brennen des pic`s würde ich zur 
not auch noch hinbekommen.Hab da auch schon vieles drüber gelesen.

Bin dankbar um jede hilfe.

Mfg Maxe

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> Davon verstehe ich keine einzige zeile.

ich auch nicht. Ohne Einrückung des Codes sieht das total schh**** 
..lecht aus. "ordnung ist das halbe Leben... " Mit Einrückungen 
erschließt sich dir dann manche Zeile sofort von selbst.

Übrigens: Programmieren hat übrigens nix zwangsläufig mit irgendwelchen 
bestimmten Programmiersprachen zu tun, genausowenig wie musikalisches 
Verständnis nicht zwangsläufig an ein bestimmtes Musikinstrument 
gekoppelt ist....

Versuch einfach die Logik (=den Algorithmus) der da hinter steckt zu 
verstehen, dann gehts auch ganz einfach mit der Portierung auf jede 
beliebige dir genehme Programmiersprache.

Das mit diesem üblen Basic "goto" rumgespringe solltest du dir auf jeden 
Fall gar nicht angewöhnen, auch wenn manche C Dialekte sowas auch als 
Befehl kennen.



Hier mal der Code in etwas eingerückt und lesbar. Ich hab schon mal 
angefangen das ein wenig zu kommentieren. Den Rest bekommst du 
sicherlich selbst hin ;-)

----------------------------------------

‘DUAL smart card lock with PIC16F84
‘copyright (c) 1998 Patrick GUEULLE
symbol f = B0
symbol g = B1
symbol e = B2
symbol r = B3
symbol BLINK = B4
symbol h = B5
DIRS = %11100110
PINS = %00000010
high 7
high 6
low 6
low 7
high 6
low 6
high 5


if PIN3 = 0 then learn
if PIN3 = 1 then check

learn:
  for f = 0 to 31
    e = 0
    for g = 0 to 7
      e = e * 2
      e = e + PIN4
      high 6
      low 6
    next g
    h = 32 * PIN0
    h = h + f
    write h,e
  next f
  PINS = 0
  BLINK = 50
  goto led


check:
  for f = 0 to 31
    e = 0
    for g = 0 to 7
      e = e * 2
      e = e + PIN4
      high 6
      low 6
    next g
    read f,r
    if e <> r then other
    goto cont

  other:
    h = f + 32
    read h,r
    if e <> r then error

  cont:
  next f

PINS = %00000110
goto forever

error:
  PINS = 0
  BLINK = 255
  goto led

led:
   for f = 0 to 10        ; wiederhole 11 mal
     high 1               ; setze bit 1 auf "high"
     pause BLINK          ; mache eine Pause der Dauer BLINK
     low 1                ; setze bit 1 auf "low"
     pause BLINK          ; mache eine Pause der Dauer BLINK
   next f

forever:
   goto forever           ; eine sackgasse aus der keiner mehr rauskommt

von Rainer (Gast)


Lesenswert?

Hallo Maxe,

bei einem Inserenten der ELEKTOR (G***t Elektronik, 
Villingen-Schwenningen)
koenntest du noch einen Bausatz bekommen.

Gruss    Rainer

von Eddy C. (chrisi)


Lesenswert?

@Wegstaben Verbuchsler

Würde Deine Mutter den Code verstehen, nun, wo Du in eingerückt hast? 
Oder könnte Sie nun die fehlenden Kommentare einfügen?

Siehst Du. Das ist es was mich an manchen Programmierern so fasziniert: 
Ihr fehlendes Einfühlungsvermögen.

Kannst Du nicht verstehen, was es bedeutet, wenn jemand sagt: "keinerlei 
erfahrung mit programmierung"?

Klar. Jemand MIT Programmiererfahrung fängt sofort an, den Code 
einzurücken.

von Maxe (Gast)


Lesenswert?

Hallo nochmal.

@ Rainer

Hab ich schon probiert.Den bausatz gibt es nicht mehr.Wäre mir auch 
lieber gewesen, denn so muss ich wohl oder übel programmieren lernen.
Aber trotzdem danke für deinen tipp.

@ Wegstaben Verbuchsler/Eddy Current

Das mit dem einrücken hat mir ehrlich gesagt einbißchen geholfen.
(hab mich einbißchen durchs internet durchgelesen (asm-c-c++ tutorials))
Aber wie -Eddy Current- schon sagte, für einen der noch nie mit 
programmierung zutun hatte(vor 2 wochen angefangen) ist es verdammt 
schwer da durch zu blicken.
Mein größtes problem im momment das ist daß ich nicht weiß was folgende 
zeilen bedeuten:

symbol f = B0
symbol g = B1
symbol e = B2
symbol r = B3
symbol BLINK = B4
symbol h = B5

Um genau zu sein was das B0,B1,B2,B3,B4 und B5 hinter dem = heißen soll.
Ich denke irgendwelche register.Aber welche??
Wenn mir das einer erklären könnte dann könnte ich mir den rest schon 
selber zusammen reimen.Hoffe ich.
Ich weiß was das "symbol" bedeutet(glaube ich).Das müsste das gleiche 
sein wie in ASM das "EQU".(oder?)

Oder gibt es ein kompiler für pbasic?Am besten kostenlos.

von Rainer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Maxe,

zum Verstaendnis des BASIC-Dialektes habe ich mal eine
Application-Note von Parallax angehaengt.

MfG   Rainer

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

@Maxe

gib mal in Google folgendes ein:

http://www.google.de/search?q=pbasic+symbol&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:de:official&client=firefox-a

direkt der erste Link führt dich zu einem Dokument, welches die Nutzung 
des PBASIC Dialekts beschreibt.

Übrigens wird die Programmiersprache Basic (speziell solche 
"amputierten" basics wie das hier verwendete nicht zu unrecht als 
ziemlich "bäh" angesehen. Sie hat sprachliche Besonderheiten die die 
Transparenz eines Programmes nicht grade fördern

Zu deinem Verständnisproblem:

ja, genau erkannt. Die Stamp hat nur ein paar interne Speicherplätze für 
Variablen. Damit man sie zuordnet bzw. mit einem "sprechernderen" Namen 
ansprechen kann (ob Variablen mit einem Buchstaben so dolle sind sei 
dahingestellt) gibt es die SYMBOL Anweisung

von Maxe (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute.
Vielen dank erstmal für eure hilfe.
Ich habe in den letzten paar monaten viel gelesen und habe das ganze 
Kartenschloss-Ding mal probiert in ASM zu schreiben.Um genauer zu sein 
habe ich es erstmal in einer "abgespeckten version" probiert.
D.h. ich takte in dem programm keine karte an (das ist auch mein 
problem,aber dazu später) sondern schreibe einfach,im ersten schritt, 
die zahl 1 ins 1. EEPROM-Byte und die zahl 2 in die restlichen 31 
EEPROM-Byte.Und im zweiten schritt vergleiche ich das ganze.
Klingt eigentlich simpel :-)

Hier der quelltext:


;**************************************************************
; PIC wählen und Includedatei für den 16F84 einbinden

  list     p=16F84
  #include   P16f84.INC
  Errorlevel  -302      ; Bank-Warnung ausschalten (asm)

;***************************************************************
;Konfiguration

       __CONFIG        _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

;***************************************************************
; Variablen und Constanten festlegen

;#define              PORTA     ; Chipkartendata an RA3
;#define    rst       PORTB,7   ; Chipkarte RESET
;#define    clk       PORTB,6   ; Chipkarte CLOCK
#define    jumper    PORTB,3   ; Jumper
#define    ledR      PORTB,5   ; Grüne LED
#define    ledG      PORTB,1   ; Rote LED
schleife1  equ       01h       ; Schleifenzähler

;**************************************************************
; Startadresse

  org      00h                 ; Startadresse
  goto     init

;**************************************************************
; Initialisierung der Port`s

init:
  bsf    STATUS,RP0            ; auf Bank 1 umschalten (TRISB)
  movlw  B'00011000'           ; PORTB definiere
  movwf  TRISB
  bcf    STATUS,RP0            ; auf Bank 0 umschalten
  goto   start

;**************************************************************
; Programmstart

start:
  btfsc  jumper                ; wenn RB3 nicht gestezt
  goto   schreiben
  goto   lesen                 ;          dann gehe zu lesen

;**************************************************************
; Wenn Jumper gesteckt

schreiben:
  bcf    STATUS,RP0            ; Auf Bank 0 umschalten
  movlw  20                    ; Schleifenzähler laden
  movwf  schleife1
  goto   loop1
loop1:
  movlw  20h                   ; Ich möchte EEPROM-Zelle 20h beschreiben
  movwf  EEADR                 ; schreibe 20h in EEADR
  movlw  1                     ; Eine 1 will ich da rein schreiben
  movwf  EEDATA
  goto   loop3
loop2:
  bcf    STATUS,RP0            ; Bank 0 umschalten (EEADR und EEDATA)
  incf   EEADR,1               ; EEPROM-Adresse um 1 erhöhen
  movf   EEADR,0
  movwf  EEADR
  movlw  2                     ; Eine 2 will ich da rein schreiben
  movwf  EEDATA
  goto   loop3
loop3:
  bsf    STATUS,RP0            ; auf Bank 1 umschalten (EECON1)
  bsf    EECON1,WREN           ; nun ist Schreiben erlaubt
  bcf    EECON1,EEIF
  movlw  0x55
  movwf  EECON2                ; schreibe 55h nach EECON2
  movlw  0xAA
  movwf  EECON2                ; schreibe AAh nach EECON2
  bsf    EECON1,WR             ; starte den Schreibzyklus
  goto   warte
warte:                         ; Warten bis
  btfss  EECON1,EEIF           ;        das EEPROM
  goto   warte                 ;               beschrieben ist
  goto   weiter
weiter:
  bcf    STATUS,RP0            ; Auf Bank 0 umschalten
  decfsz schleife1,1           ; Schleifenzähler 1 abziehen
  goto   loop2                 ;       wenn null dann gehe zu blink
  goto   blink

;************************************************************
; Wenn Jumper nicht gesteckt

lesen:
  bcf    STATUS,RP0            ; Bank 0
  movlw  20                    ; Schleifenzähler laden
  movwf  schleife1
  goto   loop4
loop4:
  movlw  20h                   ; Ich will die EEPROM-Zelle
  movwf  EEADR                 ;     20h auslesen
  bsf    STATUS,RP0            ; auf Bank 1 umschalten (EECON1)
  bsf    EECON1,RD
  bcf    STATUS,RP0            ; Bank 0
  movlw  1                     ; Eine 1 ins W-Register schreiben
  subwf  EEDATA,0              ; Subtrahiere W von EEPROM
  btfss  STATUS,Z              ; Ist das ergebnis gleich
  goto   RLED                  ; dann überspringe diesen befehl
  goto   loop6
loop5:
  incf   EEADR,1               ; EEPROM Adresse 1 erhöhen
  movf   EEADR,0
  movwf  EEADR
  bsf    STATUS,RP0            ; auf Bank 1 umschalten (EECON1)
  bsf    EECON1,RD             ; Neue EEPROM-Adresse auslesen
  bcf    STATUS,RP0            ; Bank 0
  movlw  2                     ; Eine 2 ins W-Register schreiben
  subwf  EEDATA,0              ; Subtrahiere W von EEPROM
  btfss  STATUS,Z              ; Ist das ergebnis gleich
  goto   RLED                  ; dann überspringe diesen befehl
  decfsz schleife1,1           ; Schleifenzähler 1 abziehen
  goto   loop5                 ; Wenn 32 byte gelesen
  goto   GLED                  ;   dann gehe zu Grüne LED
loop6:
  decf   schleife1,1
  goto   loop5

;**************************************************************
; LED Blinken

blink:
  bcf    STATUS,RP0            ; auf Bank 0 umschalten (PORTB)
   bsf   ledG
  nop                          ; Die NOP`s muss ich noch durch
  nop                          ;    warteschleifen ersätzen
  bcf  ´ ledG
  nop
  nop
  goto   blink                  ; endlosschleife

;**************************************************************
; Grüne und Rote LED

RLED:
  bsf    ledR
  goto   RLED
GLED:
  bsf    ledG
  goto   GLED

  end


So,das ganze programm habe ich mit "MPLAB 8.10" fehlerfrei compiliren 
können und habe dann die hex-file mal durch den "PIC Simulator IDE von 
OshonSoft" gejagt.Das funktioniert einwandfrei.

Dazu 1 bild im anhang.
 1 : EEPROM beschreiben
 2 : EEPROM vergleichen (ist gleich)
 3 : EEPROM vergleichen (ist ungleich)



Meine problem ist jetzt der teil wo es um die antaktung der karte geht.
Die karte reseten ist kein problem.

;************** Chipkarte reseten ******************************
  bsf    rst         ; PORTB 7
  bsf    clk         ; PORTB 6
  bcf    clk         ; PORTB 6
  bcf    rst         ; PORTB 7
;***************************************************************

Jedes weitere

  bsf    clk         ; PORTB 6
  bcf    clk         ; PORTB 6

erhöht den adresszähler der chipkarte und gibt dabei jedes mal eine bit 
an I/0 raus.(?)
Ich hoffe ich habe es soweit richtig verstanden.
Aber wie kriege ich jetzt die 8 bit mit hilfe von RA3 in der richtigen 
reihenfolge und ohne sie gegnseitig zu überschreiben in eine zelle?
Mit RRF oder RLF befehlen oder muss ich das ganze irgendwie verknüpfen?

Ich kriege das bis jetzt nicht hin.

Würde denn das programm so überhaupt laufen wenn ich es mit der 
antaktung hinbekommen habe oder hat das programm irgendwelche 
gravierende fehler?
Kann man solchen PIC Simulatoren trauen?


Bin um jede antwort dankbar.

MfG Maxe

von Sebastian (Gast)


Lesenswert?

Zuerst einmal Respekt für die Assemblerübersetzung.

Verschieben könnte eine Lösung sein: Nach Hinzufügen des eingelesenen 
Bits in das niederwertigste Bit des Bytes, in dem das Ergebnis stehen 
soll (Addition), könnte man das Ergebnisbyte eine Stelle nach links 
verschieben und das nächste Bit hinzuaddieren.

Aber: Wenn das ganze wirklich PBASIC ist, hätte man doch einfach eine 
Basic-Briefmarke (vorprogrammierter Controller von Parallax, erhältlich 
z.B. bei Elektronikladen.de) verwenden können. Die alte, originale 
Entwicklungssoftware (für DOS), mit der man das kompiliert und in den 
EEPROM lädt, findet man noch, ggf. auch über Wilke, die das hier in 
Deutschland vertrieben haben.

Solange der Code nach Übersetzung nicht größer als 64 Byte ist, geht 
auch die kostenlose Lösung für PIC16F84, "BS4": 
http://www.dontronics.com/bs4.html (unterer Abschnitt der Seite ist 
relevant)

von Rainer (Gast)


Lesenswert?

@Sebastian

Ich glaube der interne EEPROM-Bereich wird in dieser Applikation zum 
Abspeichern der Code-Ziffern benutzt.

@Maxe

Hast du dir schon einmal MicroBasic von MikroElektronika angesehen:

http://www.mikroe.com/en/compilers/

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.