Laborera med SmartCard



Relevanta dokument
IE1206 Inbyggd Elektronik

SmartCard laboration. William Sandqvist

Systemkonstruktion SERIEKOMMUNIKATION

Microprocessor / Microcontroller. Industrial Electrical Engineering and Automation

Digitala Projekt(EITF40) - Larm

Hantering av textsträngar och talsträngar. William Sandqvist

Microprocessor / Microcontroller

PIC-programmeringsuppgift (PROA)

PROJEKT LJUD. KOPIERINGSUNDERLAG Martin Blom Skavnes, Staffan Melin och Natur & Kultur Programmera i teknik ISBN

Enchipsdatorer med tillämpningar LABORATION 7, ROBOT

Projektlaboration 4, synkronisering av klockan

Digital Termometer J10 B4 A4 GND GND GND B1 GND GND GND GND B3 A3 +5V +5V A3 +5V A2 +5V +5V A2. +5v B16 A16 UREG UREG B1 6 AC AC A1 6 A6 6

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Programmera i teknik - kreativa projekt med Arduino

Concept V2.6. Quantum. Programmering via modem

PNSPO! CF-korts hantering till NS-serien. 14 mars 2012 OMRON Corporation

Exempelsamling Assemblerprogrammering

Montering av Wisp628.

Support Manual HoistLocatel Electronic Locks

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

Effektpedal för elgitarr

#include <pic.h> #include <sys.h> char LEFT,RIGHT,MOTORHASTIGHET;

LABORATION DATORKONSTRUKTION TSEA83 UART. Namn och personnummer. Version: (OS)

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

Föreläsningsanteckningar till Konstruktionsmetoder

Programmering av. PADDY mini

InstalationGuide. English. MODEL:150NHighGain/30NMiniUSBAdapter

Flexiservice PS/2. Bruksanvisning

GSM Axcess 2/3 Snabbstart

GPIO - General Purpose Input Output

Enkla datatyper minne

EDI022. Digitala Projekt. Rapport. Björn Åkesson 5/20/2011

Att programmera arduinon

Provmoment: Ladokkod: Tentamen ges för: Tentamen TE111B El3. Namn: Personnummer: Tentamensdatum: Tid: 14:00-18:00.

Programmera och ladda ny mjukvara till DT-serien. Information och nerladdning av SatEdit V3 från: Ladda hem.

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Programmera och ladda ny mjukvara till DT-serien. SatEdit V3 laddas ner från Ladda hem.

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11)

INGENJÖRSHÖGSKOLAN INGENJÖRSHÖGSKOLAN

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC)

Digitala Projekt (EITF11) Hemlarm

DAC500 Door Access Control unit

EITF40 - RFID-terminal. Joakim Marculescu (dt08jm6), Eric Johansson (dt08ej6)

Programmera Avant 5 med PC mjukvara

Träff 1 - Introduktion

Seriekommunikation. Ur innehållet: Nätverkstopologier Nätverksprotokoll Asynkron/synkron seriell överföring Programmering av USART-krets

Lunds Tekniska Högskola. I-10 Grupp 11: David Sundström Max Schulz Albert Lundberg Handledare: Bertil Lindvall

Att använda pekare i. C-kod

Växtviskaren EITF11 Digitala projekt VT15, I12

GPIO - General Purpose Input Output

PROJEKT STAFFAN STALLEDRÄNG

Tentamen Enchipsdatorer med tillämpningar. Lösningar och kommentarer

Det finns en handledning till kortet på hemsidan. AVR STK500.

Övning 7. Timer, serieport

Övning 6. Parallellport, timer

(2B1560, 6B2911) HT08

Datakommunikation med IR-ljus.

HI1024 Programmering, grundkurs TEN

Digitalteknik: CoolRunner-II CPLD Starter Kit

TDIU01 - Programmering i C++, grundkurs

Digitalteknik: CoolRunner-II CPLD Starter Kit Med kommentarer för kursen ht 2012

Thunder s Truck projektrapport

Datorprojekt, del 1. Digitala system 15 p

Chapter 3: Using Classes and Objects

Rapport Digitala Projekt EITF11 Grupp 4 Axel Sundberg, Jakob Wennerström Gille Handledare: Bertil Lindvall

Snabbmanual IC-PCR100.

Typ Beskrivning Kraftmatning

Robotfotboll med Arduino

Programexempel 1 AND-funktionen

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

GSM Axess 2 Snabbstart ESIM 110. a x e m a Sida 1

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Varför behövs det? I Allegro finns t.ex. stöd för:

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

BRUKSAVISNING EASY GSM

ATU. Användarmanual. Larmöverföringsenhet Firmware Version

Tentamen PC-teknik 5 p Lösningar och kommentarer

Dessa komponenter plus några motstånd, klockkrets, kondensatorer och annat smått och gott har åstadkommit ett fungerande POV-hjul.

Fax & Navtexmottagare. Modell FAX-30 HANDHAVANDE. utdrag avseende PC

På servern För att registrera och köra en Topocad 17 nätverkslicens krävs att man installerar den senaste Licensservern

Datorteknik 1 (AVR 1)

Digitala Projekt(EITF40) - Larm

LABORATION PIC-PROGRAMMERARE

Grundläggande programmering med C# 7,5 högskolepoäng

En kort text om programmering i C.

PU002 Sweex 2 Port Serial PCI Card. Före installation, kontrollera om följande delar finns. Följande delar måste finnas i lådan:

ESIM 110. GSM Axcess 2 Snabbstart. Se:

Programmeringsteknik med C och Matlab

Z-LYFTEN PRODUKTION AB MONTERINGSANVISNING

E-tentavakt - Invigilator

Teknisk Handbok ESPA-interface

Rapport. Fyra i rad-spel. Rapport Digitala Projekt EITF11 Grupp 9 Emma Rasmusson & Louise Ragnarsson Handledare: Bertil Lindvall

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Ett program som frågar regelbundet om något skall utföras. Exempelvis om spänningen på ett batteri sjunkit under en viss nivå.

EV3 Roboten. Sida 1 av 13

Programmering med Arduino

PlantPuppy Räddaren för den som inte kan hålla växterna vid liv

SNABB-GUIDE FÖR GOOGOL T1 PROGRAMMERING.

VPN (PPTP) installationsguide för Windows 7

Digitalt lärande och programmering i klassrummet

Transkript:

Laborera med SmartCard GoldCard = PIC16F84 GoldCard är ett blankt SmartCard som är bestyckat med en picprocessor 16F84 ( och ett extra flash-minne ). En typisk tillämpning för ett sådant SmartCard kan vara som medlemskort i en förening eller klubb. Korten kan tex. programmeras att ge tillträde till olika lokaler eller resurser, vissa dagar, eller för en viss tid eller för ett antal gånger. Bara fantasin sätter gränserna. Samma teknik används i bankernas kort, men då gäller naturligtvis helt andra krav på säkerhet. Kopplingsschema för ett GoldCard med PIC16F84 och ett Flash-minne 24LC16. Som framgår av kopplingsschemat kan man bara nå Flash-minnet via processorn, det är inte anslutet till någon kontaktyta. 1

Programmering av SmartCard Smartcardprogrammerar-sats: Vill man programmera ett GoldCard, behöver man en SmartCard hållare/kontakt och en Kretsprogrammerare. Den utrustningen finns i skolans labsal. Observera att det är processorn 16F84 som sitter i SmartCardet och som därför skall väljas vid kretsprogrammeringen. Saknas den rätta includefilen 16F84.h kan den kopieras från kompilatormappen C:...\Picproj\Cc5c\16F84.h. PIC USB-programmeraren används både till 16F84 på Smartcardet och till 16F628 på kopplingsdäcket. Böj undan plastlåsningen med nageln när Du flyttar programmeraren mellan utrustningarna annars drar Du sönder kablarna! 2

Labuppkoppling med SmartCard-läsare Smartcardläsar-sats: Bygg om labdäcket enligt figuren. Denna uppkoppling kommer sedan att kunna behållas under alla SmartCard-experimenten. Labuppkoppling med SmartCard-läsare och seriekommunikation med PC. De två seriekommunikationsledningarna kopplas inte direkt till PIC-processorns Tx och RX utan till dioderna ( en diodgrind ). OBSERVERA hur kristalloscillatorns enda skarpa hörn orienterats på kopplingsdäcket. SmartCard hållare Vår ledningsstandard +5V Gul C1 C5 Gnd Blå MCLR/PGM Grön C2 C6 RB6/PGC/OSC Grå C3 C7 RB7/PGD I/O violett C4 C8 Kontakt Svart, Vit För att "läsa" ett SmartCard behövs en läsare. En sådanbyggs på vårt kopplingsdäck med 16F628. För att kunna "avlyssna" kommunikationen mellan kort och läsare med PC behövs seriekommunikationstillsatsen ( Observera! något ombyggd ). Eftersom kortet inte har någon egen kristall måste man tillföra klockpulser utifrån. Det sker enklast med en färdig 4 MHz kristalloscillator. Ett SmartCard har åtta kontaktytor, men i praktiken har man som användare bara tillgång till en enda pinne C7 (RB7). De övriga kontaktytorna används som matningsspänning, jord, reset, och klockpulser. 3

PIC16F628 ansluten till SmartCard-kontakt och seriekommunikationskrets för PC. Lysdioden på RA2 symboliserar låset, locked/unlocked. Kopplingsschemat Den vanliga användningen av ett SmartCard är att använda pinnen C7 till seriekommunikation. Kortet måste programmeras att omväxlande använda denna ledning för sändning och mottagning. ( Man kan således inte sända och ta emot samtidigt, sk. "halv duplex" gäller - som att tala i en Walki-Talki ). Processorn 16F628 och PC:n kommunicerar däremot med två ledningar, så dessa har kopplats samman med hjälp av en diodgrind till kortets enda ledning. Detta inkopplingssätt får till följd att alla tecken som sänds ( oavsett varifrån ) "ekas tillbaks" automatiskt. Man kan "avlyssna" kommunikationen mellan kortet och 16F628 med PC:n, och man kan kommunicera med kortet eller med 16F628 från PC:n. På så sätt har man möjlighet att prova och felsöka systemet del för del. Gör man som vi en helt egen tillämpning spelar valet av klockfrekvens ingen roll. Vi använder därför den vanliga frekvensen 4 MHz. Standarden för SmartCard är annars klockfrekvensen 3,58 MHz. 4

Programexempel för SmartCard Kontroll av SmartCard med kopplingsdäcket! Kretsen 16F628 används inte vid dessa tester, man kan därför programmera den att vara "tyst" och "passiv". Programmet quiet62x.c är lämpligt för detta ändamål. Observera att det är kretsen 16F628 som sitter på kopplingsdäcket och som därför ska väljas vid kretsprogrammeringen. /* quiet62x.c 16F628 serial port is off */ #include "16F628.h" #pragma config = 0x3f90 void main( void) TRISB.2 = 0; PORTB.2 = 1; /* Marking line */ TRISB.1 = 1; while( 1) nop(); De delar på kopplingsdäcket som tillfälligtvis inte används är gråtonade på alla "koppla så här"-figurerna. ( de behöver inte tas bort från labuppkopplingen ). Snabbkoll om kortet fungerar? Programmera ditt SmartCard med 12Vprogrammeraren och prova det sedan med kopplingsdäcket. Mellan 16F628 RB1 ( pinne 7 ) och gnd ansluts en 5V lysdiod. GoldCard blinkar med lysdioden... ( se koppla så här bild ) Fil ( för 16F84 ): crdblink.c Snabbkoll om kortet fungerar? Mellan 7667 pinne 3 (Gnd) och 4 ansluts en piezoelektrisk hörtelefon ( den blir därigenom ansluten till SmartCard C7 ). GoldCard spelar upp en melodi... ( se koppla så här bild ) Filer ( för 16F84 ): cardmel.c och lookup.c ( en annan melodi lookup2.c ) 5

Koppla så här bilder crdblink.c crdmel.c 6

Seriekommunikation Kortet kommunicerar via en seriekommunikationsanslutning för halv duplex ( typ comradio ) med PC-programmet MTTTY ( eller Hyperterminalen). "Hello World!" ( se koppla så här bild ) Fil ( för 16F84 ): crdhello.c Rätt eller fel? Kortet frågar - du svarar. ( koppla så här ) Welcome! Who is burried in Grant's tomb? Grant Congratulations! that's correct! Fil ( för 16F84 ): cardcomp.c Använda PIC16F84-processorns inbyggda Flash-minne. ( se koppla så här bild ) Welcome! I recall from my memory: ********** What Do you want me to remember now: abcdefgh Ok! I'll remember that. Now you can take out the card. Fil ( för 16F84 ): cardmemo.c Koppla så här bilder crdhello.c cardcomp.c cardmemo.c 7

Programmeringsuppgift: Lås med SmartCard och 16F628 Uppgiften innebär att två olika program ska kommunicera med varandra, ett med 16F84 på kortet, och ett på kopplingsdäcket med 16F628. Om detta sker korrekt så ska en lysdiod på kopplingsdäcket tändas. Detta symboliserar att låset öppnas. Med PC:n kan man "avlyssna" kommunikationen. När kortet sätts in i hållaren sluts en kontakt ( Card detect ). Detta känns av med 16F628 pinne RB3. En lysdiod på 16F628 pinne RA2 symboliserar om vi låter "låset" vara låst eller upplåst. Som nyckel används ett smartcard. För att prova utrustningen kan man programmera smartcardet med exempelprogrammet smartkey.hex, och PIC16F628 med exempelprogrammet smrtlock.hex. Kontrollera din uppkoppling med de två hexkodprogrammen, smartkey.hex och smrtlock.hex. Om det inte fungerar så beror det på något missförstånd, eller något hårdvarufel. Uppgiften är sedan att själv skriva ett sådant lås-c-program som tillsammans med ett nyckel-program bildar en "nyckel och lås kombination". Börja med att göra låsprogrammet så att det fungerar med nyckelexempel-programmet. När detta fungerar ändrar Du nyckelprogrammet till att bli din egen nyckel och följdändrar låsprogrammet till att öppna för denna nyckel! "Nyckelprogrammet" ges i filen smartkey.c. Till låsprogrammet finns en program-mall lockmall.c. Nyckelexempel-program för SmartCard ( 16F84 ) JSP-diagram över SmartCardprogrammet. 8

Exempelprogram för låset ( 16F628 ) Koppla så här bild av låset JSP-diagram över låsprogrammet. Lycka till! 9

Program-mall till låsuppgiften lockmall.c Vad brukar ställa till med problem? Ett SmartCard har bara en pinne över för kommunikationen. Man måste därför koppla ihop sändning och mottagning till en och samma ledning som vi gjort på kopplingsdäcket. En konsekvens av detta är att man får ett "inbyggt" eko av tecknen. Man måste därför ta bort alla rader som ger eko från funktioner. Detta har gjorts i programskalet nedan ( t.ex. //putchar( c ); /* don't echo the character */ ). Ett annat tillägg till funktionerna är att getchar() har försetts med "timeout". Om ett "felaktigt" ( tex felvänt ) kort stoppas in i kortläsaren så skulle låset annars få vänta förgäves på något svar. Vill man felsöka låsprogrammet kan man tillfälligt "kommentera bort" raden //if(i > 10000) return '\r'; /* timeout */, man hinner annars inte ge låset rätt svar tillräckligt snabbt från tangentbordet! Windows genererar ett tecken '\r' för Enter-tangenten, en Unix-terminal behöver två tecken '\n' och '\r' för att både returnera markören till början av en rad och flytta ner den en rad. Det bekvämaste är därför att genomgående bara använda ett tecken '\r', och att ställa om terminalprogrammet för denna Windows-stil. I programmet Hyperterminalen görs inställningen i menyvalet File, Properties, settings, ASCII Setup..., ASCII recieving, bocka för rutan "Append line feed to incoming line ends". I programmet MTTTY bockar man för rutan "CR => CR/LF". 10

Ett programskal /* lockmall.c question and answer, compare strings and unlock */ /* serial input/output */ /* Ett programskal som hjälp vid smartcard-laborationen */ /* Ett system med smartcard får "inbyggt" eko */ /* därför "ekar" funktionerna inga tecken */ /* \/ lock-<- RA2 16F628 RA1 RA3 RA0 RA4-od RA7/OSC1 RA5/MCLR RA6/OSC2 GND--- Vss Vdd -- +5V RB0/INT (RB7)/PGD CrdComOut ->- RB1/Rx (RB6)/PGC CrdComIn -<- RB2/Tx RB5 CrdContact ->- RB3/CCP (RB4)/PGM -1k- GND */ /* 16F628: Serial output is at PORTB.2 ( pin 8 ) */ /* 16F628: Serial input is at PORTB.1 ( pin 7 ) */ #include "16F628.h" #pragma config = 0x3f90 char s[16]; /* global 15 char buffer for input string */ /* Function prototypes */ void initserial( void ); bit putchar( char ); char getchar( void ); /* with timeout! */ void OverrunRecover(void); void string_in( void ); char answer_from_card( char ); /* Denna funktion skriver Du själv! */ char question_to_card( char ); /* Denna funktion skriver Du själv! */ void delay( char ); 11

void main( void) char i, c, d; /* dom här variablerna behövde jag... */ bit compare; /* card contact is input TRISB.? =?; */ /* lock (lightdiode) is output TRISA.? =?; */ initserial(); while(1) /* Vänta på att Kortet införes.... */ /* Observera! Kort in => 0 Kort ut out => 1 */ delay(100); /* card debounce delay */ /* Ställ fråga till kortet.... */ delay(50); /* wait until last char sent */ OverrunRecover(); /* empty the reciever FIFO */ /* Vänta på svarssträng från Kort s[].... */ /* Jämför svaret med facitsträng.... */ /* Lås upp, om rätt svar.... */ /* Vänta tills Kortet dras ut.... */ /* Lås, Kortet är utdraget.... */ delay(100); /* card debounce delay */ 12

/******************** FUNCTIONS ========= *********************/ char question_to_card( char x) /* skriv själv! kortets inmatningsfunktion förväntar sig ett '\r' */ char answer_from_card( char x) /* skriv själv låsets jämförelsesträng OBS! inget '\r' */ void initserial( void ) /* initialise serialcom port */ /* One start bit, one stop bit, 8 data bit, no parity. 9600 Baud. */ SPEN = 1; SYNC = 0; BRGH = 1; /* Async high speed */ TXEN = 1; /* transmit enable */ SPBRG = 26-1; /* 9600 Baud @ 4 MHz-clockfrequency */ CREN = 1; /* Continuous receive */ RX9 = 0; /* 8 bit reception */ TRISB.2 = 0; /* serial_out is output */ TRISB.1 = 1; /* serial_in is input */ void OverrunRecover(void) char trash; trash = RCREG; trash = RCREG; CREN = 0; CREN = 1; bit putchar( char d_out ) /* sends one char */ if(d_out == '\0') return 0; /* refuse to send 0 "end of string" */ while (!TXIF) ; /* wait until previus character transmitted */ TXREG = d_out; return 1; /* done */ 13

char getchar( void ) /* recieves one char */ char d_in; unsigned long i; /* wait for a char or timeout */ for (i= 1;;i++) if(rcif == 1) break; /* recieved one char */ if(i > 10000) return '\r'; /* timeout */ d_in = RCREG; return d_in; void string_in( void ) /* get input to global string s[] */ char charcount, c; for( charcount = 0; ; charcount++ ) c = getchar( ); /* input 1 character */ s[charcount] = c; /* store the character */ //putchar( c ); /* don't echo the character */ if( (charcount == 15) (c=='\r' )) /* end of input */ s[charcount] = '\0'; /* add "end of string" */ return; void delay( char millisec) /* Delays a multiple of 1 milliseconds at 4 MHz using the TMR0 timer */ OPTION = 2; /* prescaler divide by 8 */ do TMR0 = 0; while ( TMR0 < 125) /* 125 * 8 = 1000 */ ; while ( -- millisec > 0); 14