SM125 RFID reader ile ilgilenenler

Başlatan canbulut, 03 Temmuz 2011, 14:49:26

salih_arel

bende sonmicronun sm125 modülü var hocam. ben kartı okuyucuya yaklaştırdığımda dready pini high oluyor ve ben picin ao bacağına bağladım bunu. fakat burdan sonra nasıl bir bilgi yollayıp hangi registerdan ne okuyacağımı bilmiyorum. elinizde örnek kodlar varsa yardımcı olabilirmisiniz acaba? uart ile haberleşmek isterdim fakat pici uart ile bilgisayara bağlıcam bu yüzden uart kullanamam.

arm-beginner

Üzgünüm, yardımcı olamiyacam. Çünkü Atmega ile yapmışdım o çalışmamı. Bendede tüm UART kanalar dolu idi (güya i2c ile haberleşecektim ya :) ). Software uart ile - pcb'ye dokunmadan -  işimi çözebilmişdim.
İdaya girmek istemem, ama sanırım Microchip'in sitesinde mutlaka soft-uart için hazır bir çözüm bulursun.

salih_arel

software uart ile derken biraz daha açabilirmisin?

arm-beginner

Normalde UART'ı kullanarak haberleşirken, bir byte'ı bir register'e yazıyorsun, veya bir register'den okuyorsun.
MCU'nun UART bölümü bu byte'ı alıyor ve belli bir pin üzerin bit bit senin bilirtiğin baudrate ile dışarı kaydırıyor. Veya okurken, belli bir pin'i sürekli kontrol ediyor ve gelen bit-stream'i bit bit bir register'e kaydırıyor ve byte tamamlanınca, sana bir interrupt veya neyse artık haber veriyor. Ve sen gidiyorsun o byte'ı register'den okuyorsun.

Soft-Uart 'da bu işlemleri sen yapıyorsun. Yazdırması nisbeten kolay. Okuması biraz kıl. Ama mümkün.


salih_arel

ben daha yeniyim picde  ;D i2c ile yapmam gerek çünkü hocam bunu kullanmamı istiyor fakat hiç bir yardımda bulunmuyor :)) biraz datasheetine bakıp bana yardımcı olabilirmisinz hocam?

http://www.sonmicro.com/trx/downloads/125/ds_SM125_V30.pdf

arm-beginner

Alıntı yapılan: salih_arel - 05 Eylül 2012, 22:03:30
ben daha yeniyim picde  ;D i2c ile yapmam gerek çünkü hocam bunu kullanmamı istiyor fakat hiç bir yardımda bulunmuyor :)) biraz datasheetine bakıp bana yardımcı olabilirmisinz hocam?
http://www.sonmicro.com/trx/downloads/125/ds_SM125_V30.pdf

Birkaç ileti evvel https://www.picproje.org/index.php/topic,34285.msg305342.html#msg305342 bu modülün i2c protokolü beni cıldırtığı için kendi modülümü tasarladığımı belirtiyorum, ve sen benden bu modül için i2c protokol desteği istiyorsun. Tekrarmı cıldırmamı istiyorsun? :)

salih_arel

Pardon :)) Artık bende çıldırıcam kesin burdan bunu anlıyoruz  :'( başka bir entegremi kullanıyım napıyım sizce?

arm-beginner


salih_arel

Benden istenilen şey bir kart okuyucu tasarlamam ve bir lcd kullanmam. tasarlıyacağım okuyucu pic ile i2c ile haberleşicek ve bilg ilk rs232 üzerinden haberleşerek küçük bir programda okunan kartların bilgisinin tutucak. yapmam gerekn şey bu ;D

arm-beginner

Alıntı yapılan: salih_arel - 05 Eylül 2012, 22:19:04
Benden istenilen şey bir kart okuyucu tasarlamam ve bir lcd kullanmam. tasarlıyacağım okuyucu pic ile i2c ile haberleşicek ve bilg ilk rs232 üzerinden haberleşerek küçük bir programda okunan kartların bilgisinin tutucak. yapmam gerekn şey bu ;D
Biraz karmaşık bir cümle yapın var; analadığım kadar senden istenen:
- 1. tasarlıyacağın kart: PIC içeren bir kart okuyucu
- 2. tasarlıyacağın kart: PIC, LCD ve RS232 port içeren bir kart
Bu 2 kart birbiri ile i2c üzerinden haberleşecekler.
Sanırım birşeyleri yanlış anladım. Bu durumda SM125 ne işe yarıyor?

salih_arel

Benden istenilen şey

1-Bir kart okuyucu sistem yapmam. Bunun içinde pic ve lcd bulunucak.
2-Kart okuyucu sistem bilgisayar ile haberleşicek ve küçük bir arayüzlü program yazılarak okunan kard ıd leri programda gösterilicek.

Burda sm125 modül kartı okumaya yarıyor. Bunun için kullanıyorum.

arm-beginner

Peki, şu ana kadar ne yaptın? Elinde ne var?

salih_arel

Şu ana kadar yaptığım GLCD sürüyorum ve pic ile bilgisayar arasında haberleşebiliyorum. Küçük bir programda yazabilicem seviyede visual studio öğrendim.  ;D ;D Tek eksiğim asıl önemli olan kartı okuyup i2c ile pice yollayamıyorum :'(

arm-beginner

#28
Baya birşeyler yapmışın. Birde GLCD! Bravo.
Gördüğüm kadar bu forumda dosya ekleme özelliği yok. Veya bana kapalı.
Herneyse, arşivimde i2c çalışmamalarımı buldum. 1,5 sene evvel C++ ile yazmışım. Basit bir akışı var, sanırım hemen anlarsın.
Ama açıkcasına, bu dosyalar hangi aşamada arşive eklendi hiç hatırlamiyorum. Sanırım çalışır hali ile; ama çokda emin değilim.

İlkönce Init() çağırdıkdan sonra, ReadCard() ile kartı okuyabiliyorsun.
Senin için anlamsız şeyleri tabii silmen ve C++ ile çalışmiyorsan, C'ye cevirmen lazım.
https://hotfile.com/dl/170664094/6c93917/rfid.rar.html
Bol şanslar.

salih_arel

Çok teşşekür ederim hocam. Aslında bende bir dosya buldum datasheetin içinde. I2C references api başlığı altında. Kodu ekliyorum. Koddan bişeler anlıyorum fakat bazı kodlar hakkında hiç bir fikrim yok malesef. :-\ Belki siz bişeyler anlardınız.

kodlar:



#define BYTE_TRACK 0x01
#define EM4100 0x02
#define EM4100_DECODED 0x03
#define BLK_1 0x01
#define BLK_2 0x02
#define BLK_3 0x03
#define BLK_4 0x04
#define BLK_5 0x05
#define BLK_6 0x06
#define BLK_7 0x07

char myArray[8];
char token;
void get_token(void);
void read_token(void);
void read_tag(BYTE mode,BYTE block_no);
void wait_until_tag_read(void);
void Request_Data(void);
void Stop_Read(void);
void Reset(void);
void Sleep(void);
void Write_Output_Pins(BYTE output_states);
void Read_Input_Pin(void);
void main()
{
  unsigned int i;
        I2CHW_1_EnableMstr();   
I2CHW_1_EnableInt();
     M8C_EnableGInt;
While(1)
{
  get_token();
  asm("nop"); 
  read_tag(EM4100_DECODED,BLK_2);
  get_token();
  asm("nop"); //Token should be 0x6B, Slave is Reading Tag
  wait_until_tag_read();
  asm("nop"); //Token should be 0x6E, Slave is Ready to transmit Tag data
  Request_Data();
   
  //Read Tag Data
  myArray[4]=0;
  while(myArray[4]!='F') 
  {
    //'F'(Final) means at myAray[4], there wont be next data sequence. 
    //'N'(Next) means there will be next 5 byte data sequence needs to be read
 
    //Read 5 byte.. First 4 byte is data the 5th byte is (Next byte indicator)
    I2CHW_1_fReadBytes(0x41, myArray,5, 0);   
    while (!(I2CHW_1_bReadI2CStatus() & I2CHW_RD_COMPLETE));   
     I2CHW_1_ClrRdStatus(); 
    asm("nop"); 
   //Every loop you should see 4 byte in myArray[0..3]
   //myArray[4] will be 'N' or 'F'
   }
 
asm("nop");
get_token();
asm("nop"); 
//Token can be 0x6B(If Auto Read mode is enabled) or 
//0x6A (Auto mode is disabled, slave not reading tag)
   
}
}
void get_token()
{
int8 i;
 
//0x88 means, slave is busy. So put some mini delay
token=0x88;
while( token==0x88) //Read until Slave is not busy
{
  read_token();
   
  if (token==0x88)
  {
   //Put some mini delay (This is REQUIRED!)
   for (i=0;i<255;i++)
   asm("nop");
   
  }
   
}
 
}
void read_token()
{
 
I2CHW_1_fReadBytes(0x41, myArray,1, 0);   
while (!(I2CHW_1_bReadI2CStatus() & I2CHW_RD_COMPLETE)); 
I2CHW_1_ClrRdStatus(); 
token=myArray[0];   
}
void read_tag(BYTE mode,BYTE block_no)
{
 
myArray[0]=0x10; //Read Tag Command
myArray[1]=mode;
myArray[2]=block_no;
myArray[3]=0;
myArray[4]=0;
myArray[5]=0;
myArray[6]=0;
myArray[7]=myArray[0]+myArray[1]+myArray[2]+myArray[6]; //Checksum
   
I2CHW_1_bWrites(0x41, myArray, 8, 0);
while (!(I2CHW_1_bReadI2CStatus() & I2CHW_WR_COMPLETE));   
I2CHW_1_ClrWrStatus(); 
 
}
void wait_until_tag_read()
{
unsigned int i;
token=0;
while (token!=0x6E)
{
  read_token();
  asm("nop"); //69
   
  //Put some delay, so we do not continuously disturb
// the Slave. A better option other than checking token continuously,
// is to detect P1[2] logic high.
  for (i=0;i<50000;i++)
  asm("nop");
 
}
}
void Request_Data()
{
//Send 'R'(0x52) to Request Data
myArray[0]='R';
I2CHW_1_bWriteBytes(0x41, myArray, 1, 0); 
while (!(I2CHW_1_bReadI2CStatus() & I2CHW_WR_COMPLETE));
I2CHW_1_ClrWrStatus(); 
   }
void Stop_Read()
  {
myArray[0]=0x12; //Stop Read Command
myArray[1]=0;
myArray[2]=0;
myArray[3]=0;
myArray[4]=0;
myArray[5]=0;
myArray[6]=0;
myArray[7]=0x12; //Checksum
   
I2CHW_1_bWriteBytes(0x41, myArray, 8, 0); 
while (!(I2CHW_1_bReadI2CStatus() & I2CHW_WR_COMPLETE));
I2CHW_1_ClrWrStatus(); 
 
     
   }
void Reset()
{
 
myArray[0]=0x51; //Reset Command
myArray[1]=0;
myArray[2]=0;
myArray[3]=0;
myArray[4]=0;
myArray[5]=0;
myArray[6]=0;
myArray[7]=0x51; //Checksum
   
I2CHW_1_bWriteBytes(0x41, myArray, 8, 0); 
while (!(I2CHW_1_bReadI2CStatus() & I2CHW_WR_COMPLETE));
I2CHW_1_ClrWrStatus(); 
 
}
void Sleep()
{
myArray[0]=0x60; //Sleep Command
myArray[1]=0;
myArray[2]=0;
myArray[3]=0;
myArray[4]=0;
myArray[5]=0;
myArray[6]=0;
myArray[7]=0x60; //Checksum
   
I2CHW_1_bWriteBytes(0x41, myArray, 8, 0); 
while (!(I2CHW_1_bReadI2CStatus() & I2CHW_WR_COMPLETE));
I2CHW_1_ClrWrStatus(); 
 
}
void Write_Output_Pins(BYTE output_states)
{
//output_state = 0 Output1->Logic 0 Output0->Logic 0
//output_state = 1 Output1->Logic 0 Output0->Logic 1
//output_state = 2 Output1->Logic 1 Output0->Logic 0
//output_state = 3 Output1->Logic 1 Output0->Logic 1
myArray[0]=0x62; //Write Output Pins
myArray[1]=output_states; //States of Output0 and Output1
myArray[2]=0;
myArray[3]=0;
myArray[4]=0;
myArray[5]=0;
myArray[6]=0;
myArray[7]=myArray[0]+myArray[1]; //Checksum
   
I2CHW_1_bWriteBytes(0x41, myArray, 8, 0); 
while (!(I2CHW_1_bReadI2CStatus() & I2CHW_WR_COMPLETE));
I2CHW_1_ClrWrStatus(); 
}
void Read_Input_Pin(void)
{
myArray[0]=0x63; //Read Input pin
myArray[1]=0;
myArray[2]=0;
myArray[3]=0;
myArray[4]=0;
myArray[5]=0;
myArray[6]=0;
myArray[7]=0x63;
   
I2CHW_1_bWriteBytes(0x41, myArray, 8, 0); 
while (!(I2CHW_1_bReadI2CStatus() & I2CHW_WR_COMPLETE));
I2CHW_1_ClrWrStatus(); 
//use read_token() to get input pin state
}