Controllo accessi con card telefonica

È  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.

Figura 3

Figura 1: Schema elettrico

;***** 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

4 Commenti

  1. Maurizio Di Paolo Emilio Maurizio 27 febbraio 2016
  2. enzocavallaro 28 febbraio 2016
    • Emanuele Bonanni Emanuele 29 febbraio 2016
  3. roccco80 5 aprile 2016

Scrivi un commento

Send this to a friend