È possibile utilizzare le chip card telefoniche (anche utilizzate) come chiave elettronica per il controllo accessi.
Controllo accessi con card telefonica
Il circuito non scrive alcun dato sulla carta, bensì legge i primi 16 byte della memoria della carta, li confronta con quelli memorizzati in un database interno, quindi, se la carta è presente nel database attiva un relè. Per aggiungere una carta al database basta inserirla nello slot e premere il tasto SW2, mentre per rimuovere una card memorizzata è sufficiente inserirla e premere SW3. La EEPROM interna del micro è di 128 byte per cui è possibile registrare fino ad 8 card diverse. Premendo SW3 per almeno due secondi senza alcuna carta inserita, verrà cancellata l’intera memoria EEPROM del micro. La figura 1 riporta lo schema elettrico del circuito, mentre il listato seguente contiene il codice assembler per AVR studio 4.
;***** Definizione dei pin
.equ reg_crd =0 ;Pulsante di registrazione card PB0 (SW2)
.equ unreg_crd =1 ;Pulsante di rimozione card PB1 (SW3)
.equ relay =2 ;uscita rele
.equ crd_sw =3 ;Switch di lettura card PB3
.equ Data =4 ;Input-Output pin PB4
.equ CLK =5 ;Clock pin PB5
.equ RST =6 ;Reset pin PB6
.equ green_led =0 ; LED verde PD0
.equ red_led =1 ; LED rosso PD1
;***** varibili
.def temp =R16
.def byte_length =R17
.def group_length =R18
.def EEadr =R19 ;indirizzo EEPROM da leggere
.def Byte =R20 ; card data
.def delay2seconds =R20
.def temp2 =R21
.def leds_flash =R22
.include "2313def.inc"
reset:
ldi temp,RAMEND
out SPL,temp
ldi temp,0b11100100
out DDRB,temp
ser temp
out PortB,temp
ldi temp,0xff
out DDRD,temp
clr temp
out portD,temp
;--------------------------------------------------------------------------
; Lettura card
;--------------------------------------------------------------------------
read_card:
cbi portD,red_led
cbi portD,green_led
cbi portB,relay ;diseccitazione rele
ldi delay2seconds,6
chk_sw3:
sbic PINB,unreg_crd ;controllo pressione di SW3.
rjmp nxt ;non premuto
rcall delay
rcall delay
rcall delay
rcall delay
;ritardo di 2 secondi, per vedere se SW3 viene premuto per + di 2 secondi
dec delay2seconds
brne chk_sw3 ;richiesta cancellazione EEPROM?
ldi group_length,127 ;si
clr EEadr ;cancellazione EEPROM
ldi Byte,$0F ;scrittura del valore $0F
ldi leds_flash,4 ;lampeggio di 4 volte del led rosso
flash_led2:
cbi portD,green_led ;spegnimento led rosso
rcall delay
rcall delay
rcall delay
rcall delay
sbi portD,green_led ;accensione led rosso
rcall delay
rcall delay
rcall delay
rcall delay
dec leds_flash
brne flash_led2
rcall clr_group
nxt:
sbis PINB,crd_sw ;card inserita?
rjmp read_card ;no
rcall delay ;si
sbi portB,RST ;reset della card
rcall delay
rcall delay
rcall delay
rcall delay
cbi portB,RST
rcall delay
rcall delay
rcall delay
rcall delay
ldi YL,96 ;primo indirizzo RAM
clr eeadr
ldi group_length,16 ;lettura dei primi 16 byte della card
next_byte:
clr Byte
ldi byte_length,8
next_bit:
ror Byte
sbi PORTB,clk
nop
nop
nop
nop
sbic PINB,data
sbr Byte,0x80
nop
nop
nop
nop
cbi PORTB,clk
nop
nop
nop
nop
dec byte_length
brne next_bit
st Y+,Byte ;memorizzazione del byte in RAM
dec group_length
brne next_byte ;controllo se ultimo byte
;--------------------------------------------------------------------------
; comparazione del byte letto con quello memorizzato in EEPROM
;--------------------------------------------------------------------------
compare:
ldi YL,96
clr EEadr
ldi group_length,16
ldi temp,16
lnb:
ld temp2,Y+
rcall EEread
dec group_length
breq arm_relay
cp Byte,temp2
breq lnb
ldi temp2,15
ldi group_length,16
add temp2,temp
mov temp,temp2
ldi YL,96
mov EEadr,temp
cpi temp,127
breq read_switches
rjmp lnb
;--------------------------------------------------------------------------
; corrispondenza trovata, eccitazione del rele
;--------------------------------------------------------------------------
arm_relay:
sbi portD,green_led
cbi portD,red_led
sbi portB,relay
rcall delay
sbis PINB,unreg_crd
rjmp unregister_card
sbic PINB,crd_sw ;controllo se la card è ancora inserita
rjmp arm_relay
rjmp read_card
;--------------------------------------------------------------------------
; corrispondenza non trovata. Controllo per la registrazione di una nuova card
;--------------------------------------------------------------------------
read_switches:
cbi portD,green_led
sbi portD,red_led
sbic PINB,crd_sw
rjmp read_next_sw ;richiesta la registrazione della card?
rcall delay
rjmp read_card
read_next_sw:
sbis PINB,reg_crd
rjmp reg_card ;si
rjmp read_switches ;no
;--------------------------------------------------------------------------
; Registrazione di una card in EEPROM
;--------------------------------------------------------------------------
reg_card:
sbis PINB,reg_crd
rjmp reg_card
ldi temp2,8
clr EEadr
read_again_eeprom:
ldi temp,16
rcall EEread
dec EEadr
cpi Byte,$0F
breq store
dec temp2
breq memory_full
add EEadr,temp
rjmp read_again_eeprom
store:
ldi group_length,16
ldi YL,96
nxt_byte:
ld Byte,Y+
rcall EEwrite
dec group_length
brne nxt_byte
rjmp reset
;--------------------------------------------------------------------------
; Eliminazione di una card da EEPROM
;--------------------------------------------------------------------------
unregister_card:
sbis PINB,unreg_crd ;
rjmp unregister_card
ldi group_length,16
subi EEadr,16
ldi Byte,$0F
clr_group:
rcall EEwrite
dec group_length
brne clr_group
rjmp read_card
;--------------------------------------------------------------------------
; Lettura di un byte da EEPROM
;--------------------------------------------------------------------------
EERead:
sbic EECR,EEWE
rjmp EERead
out EEAR,EEadr
sbi EECR,EERE
in Byte,EEDR
inc EEadr
ret
;--------------------------------------------------------------------------
; Scrittura di un byte da EEPROM
;--------------------------------------------------------------------------
EEWrite:
sbic EECR,EEWE
rjmp EEWrite
out EEAR,EEadr
out EEDR,Byte
sbi EECR,EEMWE
sbi EECR,EEWE
inc eeadr
ret
;--------------------------------------------------------------------------
; EEPROM piena, lampeggio di 4 volte dei LED
;--------------------------------------------------------------------------
memory_full:
ldi leds_flash,4
flash_leds:
sbi portD,red_led
cbi portD,green_led
rcall delay
rcall delay
rcall delay
rcall delay
dec leds_flash
cbi portD,red_led
sbi portD,green_led
rcall delay
rcall delay
rcall delay
rcall delay
dec leds_flash
brne flash_leds
ret
;--------------------------------------------------------------------------
; Routine di ritardo
;--------------------------------------------------------------------------
delay:
ldi temp2,255
delay_:
ldi temp,255
delay1:
dec temp
brne delay1
dec temp2
brne delay_
ret
;--------------------------------------------------------------------------
; Contenuto della EEPROM interna (128 bytes)
;--------------------------------------------------------------------------
.eseg
.db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F
.db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F
.db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F
.db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F
.db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F
.db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F
.db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F
.db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F






Con questo articolo si apre una infinita’ di applicazioni: migliorare la sicurezza nel riconoscimento, aggiungere moduli gsm…bell’articolo! Nulla vieta di usare il pic e tradurre in c il codice.
Bellissimo articolo,
ma è prevista una versione dell’articolo in C per PIC?
Grazie
Salve Enzo,
non non sono previste altre versioni del firmware. Ma essendo abbastanza semplice non sarà difficile portarlo in asm per il PIC 😉
Articolo molto interessante. Sto cercando di interfacciare un lettore Smart card (carta nazionale servizi) con Arduino, tuttavia non riesco a trovare una libreria adatta.