Leitor RFID
Leitor RFID
Cartões RFID são normalmente usados para controle de acesso e tickets de ônibus e metrôs. Eles são Cartões RFID são normalmente usados para controle de acesso e tickets de ônibus e metrôs. Eles são convenientes porque não precisam de contato direto para transferir informações depara o cartão. Como convenientes porque não precisam de contato direto para transferir informações depara o cartão. Como estes cartões são alimentados pelos pr!prios leitores" dispensam o uso de baterias que precisariam ser estes cartões são alimentados pelos pr!prios leitores" dispensam o uso de baterias que precisariam ser recarre#adas.
recarre#adas.
$ara os meus e%perimentos estou usando catrões da &ID I'$ro%. Estes cartões são os mais simples de toda $ara os meus e%perimentos estou usando catrões da &ID I'$ro%. Estes cartões são os mais simples de toda a lin(a de cartões RFID" que somente arma)enam um n*mero de s+rie e não usam cripto#rafia. ,
a lin(a de cartões RFID" que somente arma)enam um n*mero de s+rie e não usam cripto#rafia. , frequ-ncia da portadora + de /0k&).
frequ-ncia da portadora + de /0k&).
1 primeiro passo + descobrir como desenvolver um leitor simples. 2!s sabemos que o cartões RFID + 1 primeiro passo + descobrir como desenvolver um leitor simples. 2!s sabemos que o cartões RFID + alimentado pelo campo ma#n+tico emitido pelo leitos. ,s
alimentado pelo campo ma#n+tico emitido pelo leitos. ,s tagstags3 RFID transferem informação de volta ao3 RFID transferem informação de volta ao
leitor consumindo este campo ma#n+tico" que + detectado pelo leitor como uma variação no campo. leitor consumindo este campo ma#n+tico" que + detectado pelo leitor como uma variação no campo.
3 'ão c(amados de 4
3 'ão c(amados de 4tagstags5 RFID todos os elementos que arma)enam informações e são m!veis" como o5 RFID todos os elementos que arma)enam informações e são m!veis" como o
cartão" neste caso espec6fico. cartão" neste caso espec6fico.
1 pro7eto mais comum de um leitor RFID fa) uso de um circuito ressonante s+rie. Ele consiste de um 1 pro7eto mais comum de um leitor RFID fa) uso de um circuito ressonante s+rie. Ele consiste de um indutorsimples e um capacitor" e%citados por uma fonte de tensão de bai%a imped8ncia. 'e o 9 do circuito indutorsimples e um capacitor" e%citados por uma fonte de tensão de bai%a imped8ncia. 'e o 9 do circuito for alto o suficiente" a tensão no ponto de amostra#em :;sample< vai e%ceder a tensão de alimentação. for alto o suficiente" a tensão no ponto de amostra#em :;sample< vai e%ceder a tensão de alimentação. 9uando o RFID + alimentado por este campo ma#n+tico o 9 do circuito cai. 1 resultado + uma pequena 9uando o RFID + alimentado por este campo ma#n+tico o 9 do circuito cai. 1 resultado + uma pequena alteração na tensão de amostra#em :;sample no circuito mostrado<.
Eu criei um leitor simples com componentes encontrados em min(a sucata. =sando um #erador de função Eu criei um leitor simples com componentes encontrados em min(a sucata. =sando um #erador de função como fonte de sinal e um oscilosc!pio no ponto de amostra#em" eu pude sintoni)ar a frequ-ncia at+
como fonte de sinal e um oscilosc!pio no ponto de amostra#em" eu pude sintoni)ar a frequ-ncia at+ encontrar o ponto ressonante do circuito. Eu continuei substituindo os capacitores neste circuito at+ encontrar o ponto ressonante do circuito. Eu continuei substituindo os capacitores neste circuito at+ encontrar a frequ-ncia que eu estava procurando. 1 c>lculo da frequ-ncia + este?
encontrar a frequ-ncia que eu estava procurando. 1 c>lculo da frequ-ncia + este?
$or al#uma ra)ão eu me confundi e iniciei o pro7eto tendo em mente a frequ-ncia de 0@k&) ao inv+s de $or al#uma ra)ão eu me confundi e iniciei o pro7eto tendo em mente a frequ-ncia de 0@k&) ao inv+s de /0k&). ,s
/0k&). ,s tagstags RFID respondem bem a uma frequ-ncia mais alta" então eu mantive assim para evitar RFID respondem bem a uma frequ-ncia mais alta" então eu mantive assim para evitar
voltar a tr>s e redesen(ar todo o circuito. voltar a tr>s e redesen(ar todo o circuito.
Com um a7uste simples eu verifiquei quais alterações aconteciam quando a ta# RFID era submetida a A ou Com um a7uste simples eu verifiquei quais alterações aconteciam quando a ta# RFID era submetida a A ou 0 ciclos de frequ-ncia da portadora. =ma ve) que o sinal precisa ser ,C e não DC" eu assumi que a
0 ciclos de frequ-ncia da portadora. =ma ve) que o sinal precisa ser ,C e não DC" eu assumi que a frequ-ncia de transmissão seria 0@k&B B.0k&) ou 0@k&)@ 0k&). Este detal(e eu encontrei frequ-ncia de transmissão seria 0@k&B B.0k&) ou 0@k&)@ 0k&). Este detal(e eu encontrei em um site que foi realmente *til por conter boas informações sobre
em um site que foi realmente *til por conter boas informações sobre RFID?
RFID?(ttp?instruct.cit.cornell.educourseseeAFinal$ro7ectss/@@c7rGebsiteinde%.(tm(ttp?instruct.cit.cornell.educourseseeAFinal$ro7ectss/@@c7rGebsiteinde%.(tm..
,
, tag tag aparentemente codifica o dado usando F'H. ,s duas frequ-ncias representam o @ e l!#icos. aparentemente codifica o dado usando F'H. ,s duas frequ-ncias representam o @ e l!#icos.
Com esta informações em mãos" eu avancei e iniciei o pro7eto do meu pr!prio indutorantena. =ma ve) Com esta informações em mãos" eu avancei e iniciei o pro7eto do meu pr!prio indutorantena. =ma ve) que eu mantive a id+ia de usar 0@k&) como frequ-ncia da portadora" eu fi) o c>lculo e fiquei com uma que eu mantive a id+ia de usar 0@k&) como frequ-ncia da portadora" eu fi) o c>lculo e fiquei com uma indut8ncia de @u& e um capacitor de @nF. Eu utili)ei a se#uinte equação para estimar o n*mero de indut8ncia de @u& e um capacitor de @nF. Eu utili)ei a se#uinte equação para estimar o n*mero de
voltas que precisaria em min(a bobina? voltas que precisaria em min(a bobina?
1nde %" J são o comprimento e a lar#ura da bobina" ( + a altura e b + a espessura da parte condutora. Eu 1nde %" J são o comprimento e a lar#ura da bobina" ( + a altura e b + a espessura da parte condutora. Eu utili)er %Jcm" (cm e b@.cm. 1 n*mero encontrado foi A. Eu enrolei a bobina em uma cai%a de utili)er %Jcm" (cm e b@.cm. 1 n*mero encontrado foi A. Eu enrolei a bobina em uma cai%a de papel que encontrei" de onde eu e%trai o % e J
papel que encontrei" de onde eu e%trai o % e J. Depois de enrolada" a bobina foi e%tra6da e presa com fita. Depois de enrolada" a bobina foi e%tra6da e presa com fita adesiva.
adesiva.
$ara um a7uste fino da frequ-ncia ressonante do sistema todo eu decidi brincar com o valor da $ara um a7uste fino da frequ-ncia ressonante do sistema todo eu decidi brincar com o valor da
capacit8ncia. =sando o #erador de função para variar a frequ-ncia e visuali)ando o pico da sa6da com um capacit8ncia. =sando o #erador de função para variar a frequ-ncia e visuali)ando o pico da sa6da com um oscilosc!pio" eu variei os valores dos capacitores at+ que o pico da resposta ressonante fosse a 0@k&). 1 oscilosc!pio" eu variei os valores dos capacitores at+ que o pico da resposta ressonante fosse a 0@k&). 1 capacitor final foi de @.@0uF. =ma ve) que o meu capacitor precisa ser um valor de mercado" a bobina capacitor final foi de @.@0uF. =ma ve) que o meu capacitor precisa ser um valor de mercado" a bobina que eu constru6 precisa ter uma indut8ncia maior que @u&.
que eu constru6 precisa ter uma indut8ncia maior que @u&.
1 pr!%imo est>#io era
1 pr!%imo est>#io era pro7etar o circuito pro7etar o circuito anal!#ico. Eu usei o canal!#ico. Eu usei o confi>vel ,K$1$ onfi>vel ,K$1$ LM@/ :eu 7> possuiaLM@/ :eu 7> possuia v>rios desses em casa<. ,s frequ-ncias envolvidas neste circuito são relativamente bai%as" então a bai%a v>rios desses em casa<. ,s frequ-ncias envolvidas neste circuito são relativamente bai%as" então a bai%a
peformace em frequ-ncia deste ,K$1$ não + problema. Eu (avia decidido evitar um circuito comple%o" então ele#i o circuito mais simples que poderia ser usado.
Então" a id+ia + usar um simples diodo detector. Este detector de tensão passar por um primeiro ,K$1$ confi#urado como amplificador inversor com uma resposta em frequ-ncia passa bai%a. Isso remover> uma boa parte do volume da portadora. 1 pr!%imo est>#io do circuito anal!#ico + e%trair o sinal F'H. 1
circuito mais simples que me veio a mente foi um filtro ressonante passa banda com frequ-ncia central em torno de k&). Isso s! me custaria um ,K$1$. Este circuito foi desen(ado no '$ICE e o #r>fico da frequ-ncia de resposta + mostrado no final desta p>#ina.
, sa6da do passa banda + um sinal que pode ser diretamente conectado N um microcontrolador $IC. Eu escol(i para este pro7eto o bom e vel(o microcontrolador $ICF/B,. Com o comparador interno eu posso receber o sinal diretamente do ,K$1$ e e%trair o sinal di#ital.
, decodificação do sinal F'H + feita por softOare" o que realmente + interessante para não aumentar a nossa lista de componentes.
$ara decodificar o sinal F'H eu implementei tr-s subrotinas que usam o LKR@ para marcar o tempo passado entre as mudanças detectadas na sa6da do comparador. 2en(uma interrupção + usada. ,o inv+s
disso" as rotinas foram colocadas em loop at+ que um estado de mudança + detectado. 1 loop que fa) a detecção leva em torno de tr-s ciclos de C$= para rodarP assim" dependendo de quando a mudança ocorre" o erro m>%imo + de ciclos.
,l#u+m que con(ece como o (ardOare do $IC funciona poderia me per#untar porque eu não usei o m!dulo CC$ :Compare and Capture<. Infelismente eu utili)ei o m!dulo $GK para #erar a portadora de 0@k&). Como o CC$ compartil(a recursos com o m!dulo $GK" apenas um deles pode ser ativado por ve).
$ara ter uma id+ia #eral de como o sinal F'H aparece depois de di#itali)ado" eu adicionei um modo debu# onde ele ir> capturar um n*mero de ciclos de C$= ocorridos entre cada mudança no sinal de entrada.
Devido Ns limitações da mem!ria onc(ip" somente B@QA pontos de dados foram capturados. Isso não + #rande o sufuciente para decodificar o dado" mas + suficiente para n!s desen(armos uma visão #eral de como o sinal se parece.
2este #r>fico" os n*meros no ei%o representam o tempo :em ciclos de C$=< entre cada mudança de estado no sinal de entrada. Eu decidi que B0 era um n*mero bom para saber se o sinal de entrada era )ero ou um. 2o futuro eu acabei decidindo alterar a rotina de decodificação para contar o tempo #asto entre cada borda de subida do sinal :uma ve) que o sinal não possui componente DC" isto economi)aria
mem!ria 7> que eu s! #uardaria um bit ao inv+s de dois<. ,ssim" a constante utili)ada no firmOare do $IC cresceu e eu estou usando @ :/% B0<.
, sequ-ncia decodificada dos dados se parece com?
0000000000000000000000001111111111111111000001111110000001111100000011111000000111111 ... ...
1111110000011111100000011111000000111111111100000000000011111111111000000111110000000 00000 ...
0000001111110000001111111111000000111111000000000000000000000000111111111111111100000
;oc- pode ver que o dado inicia com v>rios )eros" se#uidos de al#uns n*meros que são o dado atual. , sequ-ncia inteira continua a se repetir.
Eu con(eço o sinal codificado em Kanc(ester" então" a partir do sinal" eu posso c(e#ar N se#uinte conclusão?
. , sinal inicia com uma sequencia de )eros" superior a vinte )eros.
/. , se#unda sequ-ncia tamb+m + sempre uma sequ-ncia de com pelo menos 0 bits. . $ara cada bit e%istem entre @ e / n*meros )ero ou um.
A. 1 bit + )ero se não e%iste nen(uma mudança no sinal durante o tempo de um bit.
1111110000011111100000011111000000111111111100000000000011111111111000000111110000000 00000 ---|---|---|_________|___________| __________|---|___________ 1 1 1 0 0 0 1 0
Com essas re#ras em mente" eu adicionei a função para decodificar o dado. Como um resumo de todo o sistema eu adicionei os se#uintes dia#ramas?
Diagrama de blocos
Esquemáticos:
nalógico
'onclus#o
,tualmente eu a7ustei o ;cc para @;. , tensão se Q0; + e%tra6da a partir de um re#ulador de tensão BM@0. 1 ;ref + setado pata a metade da tensão de alimentação" /"0;. Isso + feito utili)ando um simples divisor resistivo de A"k o(m.
1 c!di#o fonte pode ser bai%ado lo#o abai%o. E%istem duas versões?
Revisão ? S de Kaio de /@@ T Mançamento inicial
Revisão /? 0 de Kaio de /@@ T Revisão /
Recursos adicionados?
,uto start" iniciado quando o pino $U + colocado em n6vel altoP 'uporte a um bu))er" sa6da no pino A
Desenvolvido por Rick &uan#.
,daptado para o portu#u-s por Eletronica.or#" com autori)ação do autor.
,ne%os
• FirmOare Meitor RFID Revisão / • FirmOare Meitor RFID Revisão
PVV
PVV RFID reader section" #enerate 0@H&) carrier frequencJ PVV and decode t(e basic data stream
PVV
PVV Gritten bJ Rick &uan#" CopJri#(t :C< /@@ PVV Revision KKDD
PVV Rev . /@@@A/W Initial release
PVV Rev /. /@@@0@0 ,dd automatic card detect PVV
PVV Command Functions
PVV XX Uasic decode" binarJ data output PVV X/X Debu# capture" Bbit data output PVV XX Full capture and decode
PVV XAX &e% test ec(o anJ (e% input PVV XX ,uto card detect mode PVV XX
PVV PVV
PVV L(is pro#ram is free softOareP Jou can redistribute it andor modifJ PVV it under t(e terms of t(e Y2= Yeneral $ublic Micense as publis(ed bJ PVV t(e Free 'oftOare FoundationP eit(er version / of t(e Micense" or PVV :at Jour option< anJ later version.
PVV
PVV L(is pro#ram is distributed in t(e (ope t(at it Oill be useful"
PVV but GIL&1=L ,2 G,RR,2LP Oit(out even t(e implied OarrantJ of
PVV KERC&,2L,UIMIL or FIL2E'' F1R , $,RLIC=M,R $=R$1'E. 'ee t(e PVV Y2= Yeneral $ublic Micense for more details.
PVV
PVV ou s(ould (ave received a copJ of t(e Y2= Yeneral $ublic Micense PVV alon# Oit( t(is pro#ramP if not" Orite to t(e Free 'oftOare
PVV Foundation" Inc." 0W Lemple $lace" 'uite @" Uoston" K, @/@ =',
PVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
PVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV PVV 21LE? Disable t(e GDL O(en debu##in# t(e code" (oOever" make sure
PVV t(e GDL is enabled O(en puttin# t(e sJstem into lift time test PVV L(e timeout for GDL is about / seconds Oit( /B? prescaler
PVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
include Zpf/B.inc[
\\confi# \&'\1'C ] \GDL\12 ] \M;$\1FF ] \U1DE2\12 ] \KCMRE\12 ] \$GRLE\12 PVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV PVV ;ariables LempG E9= @( P UitMocation E9= ( CounterU E9= /( 2e%tF'R E9= ( P
UitCount E9= 0( MastUit;al E9= (
Data@ E9= ( P Final data output
Data E9= B(
Data/ E9= W(
Data E9= a(
DataA E9= /(
^ero E9= b( P ^erois @%@@
'erData E9= c(
Lemp E9= d(
1utput E9= e(
Counter E9= f(
LKRsample E9= @(
UinCnt E9= (
Lo##le E9= (
L(reeLrJ E9= A(
FCData@ E9= 0( P First data captured
FCData E9= (
FCData/ E9= (
FCData E9= B(
FCDataA E9= W(
GrittenUit E9= a(
_define \$1,' $1RLU" P $oOer 12 ,uto 'tart
_define \D1=L $1RLU" P
_define \HE $1RLU" 0 P HeJ #ood output _define \UEE$$1RLU" A P Ueeper output
_define \$GK\1 $1RLU" P $GK 0@k&) _define \L`D $1RLU" / P =,RL
_define \R`D $1RLU" P =,RL
_define \=2= $1RLU" @ P =nused
_define Decision;al dX@X P&ard decision" @ 0W cJcle" WB cJcle
PVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV PVV $ro#ram code (ere
#oto 'tart
1RY A POaitin# for Z@@@A[
Pinterrupt vector P#oto Interrupt 1RY 0 PVVVVVVVVVVVVVVVVVVVVVVVVVVVVV D,L, 'trin#'tart? $GelcomeKs#? addOf $CM" F DL Gelcome
DL &X@dX" &X@aX" &X@@X $CommandKs#?
DL &X@dX" &X@aX" &X@@X $$arameterKs#?
DL $arameter Error DL &X@dX" &X@aX" &X@@X $2o,ckKs#?
DL Kissin# ,ck DL &X@dX" &X@aX" &X@@X 'trin#End?
GelcomeKs# E9= @
CommandKs# E9= $CommandKs# 0 P 0 is t(e offset O(ere t(e $arameterKs#E9= $$arameterKs# 0 P 'trin#s start
2o,ckKs# E9= $2o,ckKs# 0
&e%Lable?
addOf $CM" F
DL @/A0BW,UCDEF
PVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV PVVVVVVVVVVVVVVVVVVVV $ro#ram 'tarts (ere
'tart?
PVVVVVVVVVVVVVVVVVVVVV 'etup GDL
PVVVVVVVVVVVVVVVVVVVVVV 'ettin# up LKR@" used to decode F'H
bcf \UEE$ clrOdt bsf 'L,L='" R$@ movlO bX@@@@X P$rescaler to GDL" ?/B movOf 1$LI12\REY clrOdt PVVVVVVVVVVVVVVVVVVVVV 'ettin# up environment movlO bX@@@@@@X P'erial port in too
movOf LRI'U P'et port U I1 movlO bX@@@@@X
movOf LRI', P'et port , I1 bcf 'L,L='" R$@
clrf $1RL,
PVVVVVVVVVVVVVVVVVVVVVV Disable f/B specific features movlO bX@@@@@@X P'etup comparator
movOf CKC12
PVVVVVVVVVVVVVVVVVVVVVV 'ettin# up $GK module for 0@H&) si#nal movlO bX@@@@@@X PEnable $GK module" dutJ /
movOf CC$C12
movlO bX@@@@@@@X P=sin# source frequencJ /K&) movOf CC$RM
movlO bX@@@@@@X P'ettin# up LKR/" $rescale ?A movOf L/C12
bsf 'L,L='" R$@ movlO bX@@@@@@@X
bcf 'L,L='" R$@
PVVVVVVVVVVVVVVVVVVVVVV 'etup =,RL bsf 'L,L='" R$@
movlO dX/X P0@@ for /K&) Clock" &i#( speed movOf '$URY PL(e onlJ rate Oit( loO mismatc( movlO bX@@@X P,sJnc Bbit &i#( speed
movOf L`'L,
bcf 'L,L='" R$@
movlO bX@@@@@X PEnable serial port movOf RC'L,
clrf ^ero
movlO GelcomeKs# PDisplaJ Oelcome strin# on startup call 'end'trin# P Debu# insert #oto 'kipDebu# movlO @a@( movOf F'R movlO bX@@@@@@X movOf I2DF incf F'R" F movlO bXX movOf I2DF incf F'R" F movlO bX@@X movOf I2DF incf F'R" F movlO bX@@@X movOf I2DF incf F'R" F movlO bX@@@@@@X movOf I2DF incf F'R" F movlO bX@@@@X movOf I2DF incf F'R" F movlO bX@@@X movOf I2DF incf F'R" F movlO bX@@@@@X movOf I2DF incf F'R" F #oto FD\DecodeEntrJ 'kipDebu#?
P Gait for command GaitKore?
btfsc \$1,' #oto ,utoDecode clrOdt
#oto ClearError btfss $IR" RCIF
#oto GaitKore movfORCREY movOf 'erData
movOf L`REY P'end it back out call ''pace
movlO XX PDecode command
%orOf 'erData" G btfsc 'L,L='" ^
#oto ,ttempt'ample P'tart a RFID sample movlO X/X
%orOf 'erData" G btfsc 'L,L='" ^
#oto Debu#'ample PDebu# run" output sampled data movlO XX
%orOf 'erData" G btfsc 'L,L='" ^
#oto FullDecode PFullJ capture and decode data movlO XAX
%orOf 'erData" G btfsc 'L,L='" ^
#oto &e%Lest PLestin# &E` routine movlO X0X
%orOf 'erData" G btfsc 'L,L='" ^
#oto UinLest PLestin# Uin dump routine movlO XX
%orOf 'erData" G btfsc 'L,L='" ^
#oto ,utoDecode P2o Debu# messa#e" auto card detection movlO XX %orOf 'erData" G btfsc 'L,L='" ^ #oto LestUeep movlO XBX %orOf 'erData" G btfsc 'L,L='" ^ #oto DummJ2oO
DummJ2oO? PFor all command not in use movlO CommandKs#
call 'end'trin# P'end error command messa#e #oto GaitKore
PVVVVVVVVVVVVVVVVVVVVV Clear recevin# overrun error ClearError?
movfORCREY movfORCREY
bcf RC'L," CRE2 bsf RC'L," CRE2
#oto GaitKore
P Commands e%ecution PVVVVVVVVVVVVVVVVVVVVVV Command ?
,ttempt'ample? PCommand ? 'ample RFID data" do @/A bits call CompC(eck PDummJ read once to setup condition
movlO @a@(
movOf F'R P=se F'R to store data movlO dXB@X PDo t(is for B@ bJtes
movOf Counter
'ampleMoop?
call CaptureUJte
incf F'R" F P, bJte is full" move to t(e ne%t one decfs) Counter" F
#oto 'ampleMoop
P 'Oitc( memorJ bank movlO @/@(
movOf F'R P=se F'R to store data movlO dXAX PDo t(is for A bJtes
movOf Counter
'ampleMoop/?
call CaptureUJte
incf F'R" F P, bJte is full" move to t(e ne%t one decfs) Counter" F
#oto 'ampleMoop/
P Data is full" noO dump t(e data out movlO dXB@X PDo t(is for B@ bJtes
movOf Counter movlO @a@(
movOf F'R P=se F'R to access data
'ampleMoop@? movfOI2DF call 'endUin incf F'R" F decfs) Counter" F #oto 'ampleMoop@ P 'Oitc( bank
movlO dXAX PDo t(is for A bJtes movOf Counter
movlO @/@(
movOf F'R P=se F'R to access data
'ampleMoop? movfOI2DF
call 'endUin incf F'R" F decfs) Counter" F #oto 'ampleMoop call 2eOMine #oto GaitKore
PVVVVVVVVVVVVVVVVVVVVVVV Command / Debu# mode
Debu#'ample? PCommand /? 'ample RFID data" debu# mode call CompC(eck PDummJ read once to setup condition
movlO @a@(
movOf F'R P=se F'R to store data movlO dXB@X PDo t(is for B@ bJtes
movOf Counter
Debu#'Moop? call CompC(eck
movfO LKRsample movOf I2DF
incf F'R" F P, bJte is full" move to t(e ne%t one decfs) Counter" F
#oto Debu#'Moop
P 'Oitc( memorJ bank movlO @/@(
movOf F'R P=se F'R to store data movlO dXAX PDo t(is for A bJtes
movOf Counter
Debu#'Moop/?
call CompC(eck movfO LKRsample movOf I2DF
incf F'R" F P, bJte is full" move to t(e ne%t one decfs) Counter" F
#oto Debu#'Moop/
P Data is full" noO dump t(e data out movlO dXB@X PDo t(is for B@ bJtes
movOf Counter movlO @a@(
movOf F'R P=se F'R to access data
Debu#'Moop@? movfOI2DF call 'end&e% call 2eOMine
incf F'R" F decfs) Counter" F #oto Debu#'Moop@
P 'Oitc( bank
movlO dXAX PDo t(is for A bJtes movOf Counter
movlO @/@(
movOf F'R P=se F'R to access data
Debu#'Moop? movfOI2DF call 'end&e% call 2eOMine incf F'R" F decfs) Counter" F #oto Debu#'Moop call 2eOMine #oto GaitKore
PVVVVVVVVVVVVVVVVVVVVVVV Command Full capture and decode
FullDecode? PGait for start sequence" t(an start capture call CompC(eck PDummJ read once to setup condition
call GaitLill'tart PGait for start
movlO @a@(
movOf F'R P=se F'R to store data movlO dXB@X PDo t(is for B@ bJtes
movOf Counter
FDMoop?
call CaptureUJte
incf F'R" F P, bJte is full" move to t(e ne%t one decfs) Counter" F
#oto FDMoop
P Data is full" noO dump t(e data out movlO dXB@X PDo t(is for B@ bJtes
movOf Counter movlO @a@(
movOf F'R P=se F'R to access data
FDMoop@? movfOI2DF call 'endUin incf F'R" F decfs) Counter" F #oto FDMoop@
call 2eOMine FD\DecodeEntrJ?
P Collaspe data bits
movlO dXBX P'et up for bit read movOf UitMocation
movlO @a@( movOf 2e%tF'R
P 'tart e%traction
clrf Data@ PClear data (older clrf Data clrf Data/ clrf Data clrf DataA clrf Lo##le FD\UitMoop^? call YetUitCount movfO UitCount movlO dX/@X subOf UitCount" G btfsc 'L,L='" C
#oto FD\DoneDecode P Uitcount 0 $ositive" Mooped alreadJ" 'L1$
movlO dXX
subOf UitCount" G btfss 'L,L='" C
#oto FD\'end/bit P2e#ative" bits movlO XVX P$ositive" / bit call 'endC(ar call 'endC(ar bsf 'L,L='" C call Mon#'(ift call Mon#'(ift #oto FD\2e%tUit FD\'end/bit? movlO X\X call 'endC(ar bcf 'L,L='" C call Mon#'(ift FD\2e%tUit? movlO @ef(
subOf 2e%tF'R" G P2e%tF'R G btfss 'L,L='" C
#oto FD\UitMoop^ P2e#ative" keep loopin#
call 2eOMine P$ositive" 2e%tF'R [ @%ef
P Final data output FD\DoneDecode?
call 2eOMine movfODataA call 'end&e% movfOData call 'end&e% movfOData/ call 'end&e% movfOData call 'end&e% movfOData@ call 'end&e% call 2eOMine #oto GaitKore
PVVVVVVVVVVVVVVVVVVVVVVV Command ? ,uto detection of card ,utoDecode? clrOdt movlO @( PL(ree trJs movOf L(reeLrJ ,D\Capture,#ain? clrf GrittenUit clrOdt
call CompC(eck PDummJ read once to setup condition call GaitLill'tart PGait for start condition
movlO @a@(
movOf F'R P=se F'R to store data movlO dXB@X PDo t(is for B@ bJtes
movOf Counter
,DMoop?
call CaptureUJte
incf F'R" F P, bJte is full" move to t(e ne%t one decfs) Counter" F
#oto ,DMoop
,D\DecodeEntrJ?
P Collaspe data bits
movlO dXBX P'et up for bit read movOf UitMocation
movlO @a@( movOf 2e%tF'R
P 'tart e%traction
clrf Data@ PClear data (older clrf Data
clrf Data/ clrf Data
clrf DataA clrf Lo##le ,D\UitMoop^? call YetUitCount movlO dX/@X subOf UitCount" G btfsc 'L,L='" C
#oto ,D\DoneDecode P Uitcount 0 $ositive" 'tart condition a#ain" 'L1$ movlO dXX
subOf UitCount" G btfss 'L,L='" C
#oto ,D\'end/bit P2e#ative" bits bsf 'L,L='" C P$ositive" / bit call Mon#'(ift call Mon#'(ift #oto ,D\2e%tUit ,D\'end/bit? bcf 'L,L='" C call Mon#'(ift ,D\2e%tUit? incf GrittenUit" F movlO @ef(
subOf 2e%tF'R" G P2e%tF'R G btfss 'L,L='" C
#oto ,D\UitMoop^ P2e#ative" keep loopin#
P$ositive" 2e%tF'R [ @%ef" error #oto ,utoDecode PRestart...
P C(eck data is t(e same for t(ree times ,D\DoneDecode?
movlO dX@X PError c(eck" if too manJ )ero bits" restart subOf UitCount" G
btfsc 'L,L='" C
#oto ,utoDecode PLoo manJ bits
movlO (XAX PC(eck number of bit Oritten" too little" restart subOf GrittenUit" G
btfss 'L,L='" C #oto ,utoDecode
movlO (X00X PC(eck number of bit Oritten" too manJ" restart subOf GrittenUit" G btfsc 'L,L='" C #oto ,utoDecode movlO dXX %orOf L(reeLrJ" G btfss 'L,L='" ^ PFirst trJ indicator
#oto ,D\2otFirstLrJ movfOData@ movOf FCData@ movfOData movOf FCData movfOData/ movOf FCData/ movfOData movOf FCData movfODataA movOf FCDataA decf L(reeLrJ" F #oto ,D\Capture,#ain ,D\2otFirstLrJ? movfOData@ %orOf FCData@" G btfss 'L,L='" ^
#oto ,utoDecode P2ot matc(ed" restart movfOData
%orOf FCData" G btfss 'L,L='" ^
#oto ,utoDecode P2ot matc(ed" restart movfOData/
%orOf FCData/" G btfss 'L,L='" ^
#oto ,utoDecode P2ot matc(ed" restart movfOData
%orOf FCData" G btfss 'L,L='" ^
#oto ,utoDecode P2ot matc(ed" restart movfODataA
%orOf FCDataA" G btfss 'L,L='" ^
#oto ,utoDecode P2ot matc(ed" restart decfs) L(reeLrJ" F
#oto ,D\Capture,#ain
P Final data output call 2eOMine movfODataA call 'end&e% movfOData call 'end&e% movfOData/ call 'end&e% movfOData call 'end&e% movfOData@ call 'end&e% call 2eOMine
call Ueep #oto GaitKore
PVVVVVVVVVVVVVVVVVVVVVVV Command A"0 'erial debu#
&e%Lest?
call Rcv&e% PCommand A? &e% test movfO 1utput
call 'end&e% call 2eOMine #oto GaitKore
UinLest?
call Rcv&e% PCommand 0? Uin test movfO 1utput
call 'endUin call 2eOMine #oto GaitKore
LestUeep?
call Ueep PCommand ? Lest beep call 2eOMine
#oto GaitKore
PVVVVVVVVVVVVVVVVVVVVVVVVVVVVV '=UR1=LI2E P P Mon#'(ift" '(ift bit of t(e data into Data@?A re#ister P '(ift onlJ bit per tOo calls
P Input? C Mon#'(ift? btfss Lo##le" @ #oto Lo##le2ot'et rlf Data@" F rlf Data" F rlf Data/" F rlf Data" F rlf DataA" F bcf Lo##le" @ return Lo##le2ot'et? bsf Lo##le" @ return P P CaptureUJte" Capture a sin#le bJte of data
P 1utput? I2DF CaptureUJte?
call CompC(eck
movlO Decision;al P&ard decision" @ 0W cJcle" WB cJcle subOf LKRsample" G
rlf I2DF" F P'tore t(e data into pointed address
call CompC(eck PDo t(is for B times to fill up a bJte movlO Decision;al subOf LKRsample" G rlf I2DF" F call CompC(eck movlO Decision;al subOf LKRsample" G rlf I2DF" F call CompC(eck movlO Decision;al subOf LKRsample" G rlf I2DF" F call CompC(eck movlO Decision;al subOf LKRsample" G rlf I2DF" F call CompC(eck movlO Decision;al subOf LKRsample" G rlf I2DF" F call CompC(eck movlO Decision;al subOf LKRsample" G rlf I2DF" F call CompC(eck movlO Decision;al subOf LKRsample" G rlf I2DF" F return P P GaitLill'tart" Gait until t(e start sequence is detected P L(is is marked bJ /@ or more )eros
GaitLill'tart?
movlO dX/@X
GL'\ne%t? clrOdt
call CompC(eck movlO Decision;al subOf LKRsample" G
btfsc 'L,L='" C PC(eck for a @ value #oto GaitLill'tart PIf " restart
decfs) CounterG" F
#oto GL'\ne%t PMoop until done return
P
P CompC(eck" C(eck t(e comparator output and store t(e informtion in P 1utput? LKRsample
CompC(eck?
P$rocess? Moop until a transition" clear LKR@" POait till ne%t @ transition
'C'ampleM?
btfsc CKC12" C1=L #oto 'C'ampleM
'C'ampleM/? PGas a loO" Oait for a (i#( btfss CKC12" C1=L
#oto 'C'ampleM/
movfOLKR@
movOf LKRsample P'tore t(e result in LKRsample clrf LKR@ PClear LKR@ for t(e ne%t bit return
P P YetUitCount" Count number of bits until t(e ne%t c(an#e P 1utput? UitCount
P ,ddress? UitMocation" 2e%tF'R
P =se? MastUit;al" UitCount" 2e%tF'R" UitMocation" LempG YetUitCount?
clrf UitCount btfss MastUit;al" @
#oto YUC\lastbit@
P #oto YUC\lastbit PMast bit is a YUC\loop?
call Yet2e%tUit btfss 'L,L='" ^ #oto YUC\done
incf UitCount" F PContinue if value is a )ero #oto YUC\loop
YUC\done? PDone if bit c(an#e to one bcf MastUit;al" @
YUC\lastbit@? PMast bit is a @ YUC\loop@?
call Yet2e%tUit btfsc 'L,L='" ^ #oto YUC\done@
incf UitCount" F PContinue if value is a one #oto YUC\loop@
YUC\done@? PDone if bit c(an#e to one bsf MastUit;al" @
return
P P Yet2e%tUit" Yet a bit from t(e buffer
P 1utput? ^
P ,ddress? UitMocation" 2e%tF'R" UitMocation for M'U Yet2e%tUit?
movfO 2e%tF'R movOf F'R
movfO UitMocation movOf CounterU
decfs) UitMocation" FPYo to t(e ne%t bit #oto Y2U\ne%t'tep
movlO dXBX
movOf UitMocation
incf 2e%tF'R" F PRollover for t(e ne%t read Y2U\ne%t'tep?
clrf LempG
bsf 'L,L='" C Y2U\loop?
rlf LempG" F PLempG contain bit mask decfs) CounterU" F
#oto Y2U\loop movfO LempG
andOf I2DF" G PResult in ^ return
PVVVVVVVVVVVVVVVVVVVVVVVVVVVVV '=UR1=LI2E P P 'end&e%" 'end a sin#le bJte out of serial port" (e% format P Input? data stored in G
'end&e%? movOf Lemp sOapf Lemp" G andlO @@f( call &e%Lable &e%GaitMoop?
btfss $IR" L`IF PGait till buffer is emptJ #oto &e%GaitMoop
movf Lemp" G andlO @@f( call &e%Lable &e%GaitMoop/?
btfss $IR" L`IF PGait till buffer is emptJ #oto &e%GaitMoop/
movOf L`REY return
P
P 'endUin" 'end a sin#le bJte out of serial port" binarJ format P Input? data stored in G
'endUin?
movOf Lemp movlO B( movOf UinCnt
UinGaitMoop?
btfss $IR" L`IF PGait till buffer is emptJ #oto UinGaitMoop movlO X@X btfsc Lemp" movlO XX movOf L`REY rlf Lemp" F decfs) UinCnt" F #oto UinGaitMoop return P
P Rcv&e%" Receive a sin#le bJte from serial port in (e% format P 1utput? data stored in 1utput
Rcv&e%?
btfss $IR" RCIF #oto Rcv&e% movfORCREY movOf 'erData
movOf L`REY P 'end it back out
movlO @(
subOf 'erData" F movlO @(
subOf 'erData" G P F G
btfsc 'L,L='" C P $ositive means letter input #oto Metter
sOapf 'erData" G movOf 1utput Rcv&e%Moop? btfss $IR" RCIF #oto Rcv&e%Moop movfORCREY movOf 'erData
movOf L`REY P 'end it back out
movlO @(
subOf 'erData" F movlO @(
subOf 'erData" G P F G
btfsc 'L,L='" C P $ositive means letter input #oto Metter/ RtnMetter/? movfO'erData iorOf 1utput" F call ''pace return Metter? movlO @( subOf 'erData" F movlO @( subOf 'erData" G
btfsc 'L,L='" C P $ositive means bad input #oto MetterE #oto RtnMetter MetterE? movlO dX/X subOf 'erData" F #oto RtnMetter Metter/? movlO @( subOf 'erData" F movlO @( subOf 'erData" G
btfsc 'L,L='" C P $ositive means bad input #oto Metter/E #oto RtnMetter/ Metter/E? movlO dX/X subOf 'erData" F #oto RtnMetter/ P P Mon#DelaJ" 0 cJcles" inscJcle //.0u' for BK() clock lon#\delaJ?
movlO dX0X movOf Counter
lon#\delaJ\M?
decfs) Counter" F #oto lon#\delaJ\M return
P P 'end'trin#" send t(e strin# out to serial port
P Input? 'trin# location in G 'end'trin#?
movOf Counter 'endMoop?
btfss $IR" L`IF PGait till buffer is emptJ #oto 'endMoop
call 'trin#'tart iorOf ^ero" G
btfsc 'L,L='" ^ P^ero is t(e end of strin# return movOf L`REY incf Counter" F movfO Counter #oto 'endMoop P P 2eOMine" send s neOline c(aracter into serial port P Input? 2one
2eOMine?
btfss $IR" L`IF PGait till buffer is emptJ #oto 2eOMine
movlO @d( movOf L`REY movlO @a( 2eOMineMoop?
btfss $IR" L`IF PGait till buffer is emptJ #oto 2eOMineMoop
movOf L`REY return
P P 'pace" send a space c(aracter into serial port
P Input? 2one ''pace?
btfss $IR" L`IF PGait till buffer is emptJ #oto ''pace
movlO X X
movOf L`REY return
P P 'endC(ar" send a c(aracter into serial port