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
> 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
Hallo Maxe, bei einem Inserenten der ELEKTOR (G***t Elektronik, Villingen-Schwenningen) koenntest du noch einen Bausatz bekommen. Gruss Rainer
@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.
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.
Hallo Maxe, zum Verstaendnis des BASIC-Dialektes habe ich mal eine Application-Note von Parallax angehaengt. MfG Rainer
@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
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
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)
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.