Rfid rc522 ile baştan yardım

Başlatan cemilsivas, 03 Kasım 2019, 15:30:14

cemilsivas

Merhaba arkadaşlar. Aslında bu modülü kendim datasheet'i okuyup kendin çalıştırmak istedim. Yaklaşık 1 aydır uğraştım. Ama pek ileriye gidemedim. Buradan sonra sizin yardımlarınıza ihtiyacım var.
Rc522 chip kullanan rfid modülü aldım. Güzelce birkaç kere dahasheet'i ve örnek programları inceledim. Kendimce birkaç program yaptım. Ancak bir türlü düzenli çalıştıramadım. Ben de sizlerin yardımıyla adım adım yapmaya çalışacağım.



Buradaki bağlantı şekline göre rfid modülünü bağladım. Burada adresin 7. Bit 0 ise yazma, 1 ise okuma yapıyor. Okuma ve yazmada adresin bir öncesi datalar geliyor. Anladığım kadarıyla mesela 04 adresteki bilgileri talep edersek 03'teki adresi bilgileri geliyor. Bunun için örnek programlarda hep adresi sağa kaydırarak kullanmışlar. Mesela 11 deki adres kayıtları için reg=reg<<1 | $80 ile okuma sağlıyorlar.
Ben de modülü ilk çalıştırdığımda adres ve datalar normal geldi. Tekrar aç kapat yaptığımda ya hepsi 0 ya da son bit 1 olarak geliyor. Buradaki sıkıntı ne olabilir? Daha sorum çok ama bir anda bu gönderiyi soruya boğmak istemedim. Yardımcı olursanız çok sevinirim. Herkese iyi günler.

Bu da bağlatı şeklim. Adaptör 500 ma ayarlı adaptör.

cemilsivas

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 04.10.2019                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

@ DEVICE pic16F628a
@ DEVICE pic16F628a, WDT_ON
@ DEVICE pic16F628a, PWRT_ON
@ DEVICE pic16F628a, BOD_ON
@ DEVICE pic16F628a, PROTECT_OFF
@ DEVICE pic16F628a, LVP_OFF
@ DEVICE pic16F628a, CPD_OFF
@ DEVICE pic16F628a, MCLR_OFF
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT
TRISA=%01000000  'A portu 6. pin giriş diğerleri çıkış olarak ayarlandı.
TRISB=0  'B portu çıkış olarak ayarlandı.

'mfrc 522 tanımlamaları
miso var porta.6   'master in slave out
mosi var porta.7  'master out slave in
sck var porta.0  'sck pini
nss var porta.1 'sda pini
x var byte

PORTA=0
PORTB=0

CMCON=7      'komparatörler iptal.
OPTION_REG=7 'pull up direncleri pasif   
 'lcd tanımlamaları
DEFINE LCD_DREG PORTB 'lcd data pinleri portb ye bağlı  
DEFINE LCD_DBIT 0     'lcd data pinleri 0. pinden başlıyor.
DEFINE LCD_EREG PORTB  'enable pini portb de
DEFINE LCD_EBIT 4      'enable portb 4. pine bağlı
DEFINE LCD_RSREG PORTB  ' rs pini portb de 
DEFINE LCD_RSBIT 5      ' rs portb 5. pine bağlı
DEFINE LCD_BITS 4       'data 4 pini bağlı
DEFINE LCD_LINES 2       'lcd 2 satır
pause 200

'veri tanımlaması
veri var byte(10)
reg var byte



nss=0
reg=$02
reg=reg<<1
pause 1
shiftout mosi, sck, 1,[reg,$0F]    'soft reset
pause 5
nss=1
pause 500

basla:
for x=1 to 10
reg=x
reg=(reg<<1) | $80

nss=0
shiftout mosi, sck, 1,[reg]
shiftin miso,sck,1,[veri(0)]
nss=1

lcdout $fe,1,"adres :",HEX x
lcdout $fe,$c0,"veri  :",bin8 veri(0)

pause 2000
next x

'goto basla

end


Bunlar da benim meşhur kodlar. En basit yazdığımla başlamak istedim.

fatih88

Bu rfid o kadar kolay okunmuyor nxp nin datasheetleri çok karışık ben pek birsey anlayamadım bir ara deneyim dedim elimde modül var atmel için yazmaya çalışmıştım ama becerememiştim 😀😀😀
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

cemilsivas

#3
Hocam. Dediğiniz gibi biraz zor bir modülmüş. Ama örneklerden falan yola çıkarak birşeyler yaparız gibime geliyor. İnanın Ardunio kütüphanesini bile inceledim.
Bu arada yeni bir şey daha öğrendim. Adrese giderken adresi and $79 ile işleme tabi tutuyorlar.
Örnek, 11. adresi okumak için.
reg=11
reg=(reg<<1) & $79
reg= reg | $80
Bunu niye yaptıklarını anlamadım ama.

ete

#4
Bu modüle ait data sheet de sanırım profesyoneller için yazılmış. Leb demeden leblebiyi anlayacaklar için yani.
Bir amatör için bu iş çok zor gerçekten. Bir ara incelemiştim. Bir kaç kez okudum anlamaya çalıştım ama anlamakta zorlandım. Hem teknik lisan ağır hemde her şey açık olarak anlatılmamış Özelliklere boğmuşlar okuyanı. Fazla ve lüzumsuz detaylar var gibi geliyor bana aralarından gerçek bilgiyi çıkarmak günler alır. Günlerce bu işle uğraşmamak için örnek kod bulmak gerekir. Hangi dilde olursa olsun diyeceğim ama Kütüphane kullanan Arduino yada C dilinde örnek kod incelemek işi çözmüyor maalesef. Basic kodları gerekir. Yada detaylı açıklamalar lazım. Şu işi yapmak için şunları yapman gerek şeklinde açıklamalar.
Bilen yada sahip olan var ise buraya koysun lütfen.
Ben bazı şeyler toplamış idim. İlişikte koyuyorum. Epeyce yardımı olacaktır. Konuyu güncel tutup çalışmaları yayınlarsanız sevinirim. Dosya içinde bir BAS ve birde PBP dosyası var. BAS dosyası diğerine include edilmiş bir nevi kütüphane dosyası şeklinde.


EteBu eki görüntüleyemezsiniz.

cemilsivas

Ete hocam. İnşaallah hep birlikte zamanımız el verdiği kadar çözmeye çalışırız. Ben başarabileceğimize inanıyorum. Sizin sayenizde nrf24l01 modülünü datasheet inceleyerek çalıştırmıştım. Bu özgüvenle yola çıktım. Allah yardımcımız olsun.
Hocam picbasic.co.uk sitesinde bir vatandaş bu kodlarla test işlemini yapmış. Ayrıca kodlar arasında da açıklama yapmış.
Include "modedefs.bas" 'Deffinitions for serial

b var byte
x var word
y var word
z var word
NSS var PORTA.5
TRISA.5 = 0 'NSS
income var word(66)

RST var PORTC.1
TRISC.1 = 0
high RST
pause 100

'Bit shifting and masking already done, for instance:
'CommandRegister = 0x01 = 0000 0001
'Shift left = 0x02 = 0000 0010 Write
'Mask $80 = 0x82 = 1000 0010 Read

'============Self Test=============================
'SoftReset:
low NSS
pause 5
shiftout PORTC.5, PORTC.3, MSBFIRST, [$02,$0F]
pause 1
high NSS
Pause 500

'Flush FIFO:
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$14,$80]
pause 1
high NSS
Pause 1

for x = 1 to 25
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$12,$0]'FIFO Data Reg
pause 1
high NSS
pause 1
next x

'Transfer 25 bytes to internal buffer
low NSS
pause 5
shiftout PORTC.5, PORTC.3, MSBFIRST, [$02,$01]
pause 10
high NSS
Pause 20

'Flush FIFO:
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$14,$80]
pause 1
high NSS
Pause 1

'Enable Self Test:
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$6C,$09]
pause 1
high NSS
pause 1

'"00h" to FIFO buffer:
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$12,$00]
pause 1
high NSS
pause 1

'Calc command
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$02,$03] 'Calc
pause 1
high NSS
Pause 2000

gosub idle

for x = 1 to 64
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$12, x]
pause 1
high NSS
Pause 10
next x

'-------------------------------------------------------

'Write Bitframe Register
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$1A,$87]
pause 1
high NSS
Pause 1

'Write Bitframe Register
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$1A,$07]
pause 1
high NSS
Pause 1

for x = 1 to 64
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$92] '"0x92"] 'Read FIFOData
pause 1
Shiftin PORTC.4, PORTC.3, LSBFIRST, [income(x)]
pause 1
high NSS
next x

Serout2 PORTB.0, 84, [12]
pause 10

y = 1
for x = 1 to 64
Serout2 PORTB.0, 84, [hex income(x)," "]
pause 10
if Y = 4 then
Serout2 PORTB.0, 84, [13]
y = 0
endif
y = y + 1
pause 3000
next x


mainloop:
goto Mainloop



idle: 'Write Comand MFRC522_IDLE
Pause 10
low NSS
pause 1
shiftout PORTC.5, PORTC.3, MSBFIRST, [$02,$00]
pause 1
high NSS
Pause 1
return
Yalnız bu arkadaş adresleri kendi direkt değiştirmiş.
datasheet sayfa 82 de testin nasıl yapılacağı da mevcut.



Hocam bir de şu aklıma takıldı. Ben modülü lm317 ile besliyorum. Lm317'i 3.3v'ye ayarlıyorum. Modülü bağlayım enerji verdiğimde lm317 nin çıkışı 2v ye düşüyor. Bu normal mi?

ete

LM317 nin 2 volta düşmesi bence normal değil. Çekilen akım fazla olsa gerek. Devrenin akını ölçmen gerek.

Ete

cemilsivas

#7
Hocam. 35 ma çekiyor toplam devre. Bu arada yaptığım bir yanlışı buldum. Ben reg değişkeni yazarken dec olarak yazıyorum. Değişken adresleri hex olduğu için doğal olarak değer vermiyordu. Şimdi onu düzelttim. Kodu şöyle düzenleyince versiyon adresini okuyabildim çok şükür.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 04.10.2019                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

@ DEVICE pic16F628a
@ DEVICE pic16F628a, WDT_ON
@ DEVICE pic16F628a, PWRT_ON
@ DEVICE pic16F628a, BOD_ON
@ DEVICE pic16F628a, PROTECT_OFF
@ DEVICE pic16F628a, LVP_OFF
@ DEVICE pic16F628a, CPD_OFF
@ DEVICE pic16F628a, MCLR_OFF
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT
TRISA=%01000000  'A portu 6. pin giriş diğerleri çıkış olarak ayarlandı.
TRISB=0  'B portu çıkış olarak ayarlandı.

'mfrc 522 tanımlamaları
miso var porta.6   'master in slave out
mosi var porta.7  'master out slave in
sck var porta.0  'sck pini
nss var porta.1 'sda pini
x var byte

PORTA=0
PORTB=0

CMCON=7      'komparatörler iptal.
OPTION_REG=7 'pull up direncleri pasif   
 'lcd tanımlamaları
DEFINE LCD_DREG PORTB 'lcd data pinleri portb ye bağlı  
DEFINE LCD_DBIT 0     'lcd data pinleri 0. pinden başlıyor.
DEFINE LCD_EREG PORTB  'enable pini portb de
DEFINE LCD_EBIT 4      'enable portb 4. pine bağlı
DEFINE LCD_RSREG PORTB  ' rs pini portb de 
DEFINE LCD_RSBIT 5      ' rs portb 5. pine bağlı
DEFINE LCD_BITS 4       'data 4 pini bağlı
DEFINE LCD_LINES 2       'lcd 2 satır
pause 200

'veri tanımlaması
veri var byte(10)
reg var byte



nss=0
reg=$02
reg=reg<<1
pause 1
shiftout mosi, sck, 1,[reg,$0F]    'soft reset
pause 5
nss=1
pause 500

basla:

reg= $37   'Burada sayı biçimlerine dikkat et. adresler hex formatı. Burası dec formati.
reg=(reg<<1) | $80

nss=0
shiftout mosi, sck, 1,[reg]
shiftin miso,sck,0,[veri(0)]
nss=1

lcdout $fe,1,"adres :",hex reg ' versiyon reg $ee ile okunuyor.
lcdout $fe,$c0,"veri  :",bin8 veri(0)

pause 2000


nss=0
reg=$02
reg=reg<<1
pause 1
shiftout mosi, sck, 1,[reg,$0F]    'soft reset
pause 5
nss=1
pause 500



end


Şimdi de test yaptırmaya çalışacağım.

cemilsivas

Merhaba arkadaşlar. Uzun süren rfid çalışmaların malesef sonuç vermedi. İçine iyice daldığımda Ete hocamın da dediği gibi çok karmaşık bir okuma prosedürüne sahip. Ben de bir örnek kodu dilimin döndüğünce açıkladım. Sizler de bana yardımcı olursanız sevinirim. Asıl amacım okuma prosedürü nasıl işliyor. Bir yere kadar geldim. Sonrasında tıkandım. Yardımcı olursanız sevinirim.
Not: Anladığım kadarıyla asıl işlevi gören etiket RC522_ToCard etiketi. Ben özellikle bu etiket üzerine yoğunlaştım.


Powered by EzPortal