로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Build your Project
PROJECT 자료실
작성자 leeky        
작성일 2007/02/04
첨부#1 m8_em4095v2.c_.zip (10KB) (Down:135)
첨부#2 rfid_125khz_card_tag.gif (25KB) (Down:45)
ㆍ추천: 0  ㆍ조회: 777   
  ATmega8을 사용한 EM4095 RFID Reader의 제작

● 프로젝트 : ATmega8을 사용한 EM4095 RFID 읽기전용 장치의 제작
RFID 읽기장치의 소스를 입수하여 시험 했으나, 제대로 되는 하드웨어 회로와 펌웨어가 없었다.
결국 EM4095의 제조사 사이트에서 자료를 구해서, 이것을 참조하여  AVR MPU에 소스를 포팅했다.
물론 AVR용으로 개조된 소스는 충분히 벌레잡기를 한 것이며, 회로대로 정상적으로 만들어진 하드웨어에서,
첨부된 펌웨어용 HEX 파일을 AVR-ISP로 구우면 100% 작동 할 것이다.
.
● ATmega8과 EM4095로 제작한 125KHz ASK 방식 RFID 읽기전용 장치
 
 
● 125KHz ASK 방식 RFID 읽기전용 장치의 계통도
 
읽기전용 장치의 용도는 사원증, 학생증, 학원증, 회원증, 전자열쇄, 동물인식, 물품인식 등에 주로 사용된다. 

● 125KHz ASK 수신전용 Frontend 회로의 예 
  
SoC(System on Chip) IC를 사용하지 않고 이산형 부품을 사용한 Frontend 회로이므로 RFID 장치의 원리를 이해하기 좋다.
.
● 이 프로젝트에서 사용한 M4095 125KHZ RFID 읽기장치 회로도
   
(EM4095는 16핀 SO 패키지로 시중에서 2,500 원에 구입이 가능하다)
.
● 안테나 코일의 제작 (사진의 가장우측에  있는 코일은 직경 65mm로 만든 안테나 코일의 사진이다.)
 
 
간단히 실험하기 위해서는 R1을 10 옴으로 변경하고, 안테나 코일은 70x70mm의 크기로 20회를 감고
C_res를 223을 연결하면 우선 작동이 됩니다, 그러나 안테나 회로의 Q가 낮으므로 비교적 출력이 적습니다.
기판의 패턴을 이용한 코일로 설계를 할 때는, 카드크기의 기판에 패턴 코일을 40 회 정도로 만들고,
C-res를 103 ~ 203으로 조정하여 공진주파수를 125KHz로 맞춥니다. (40회 패턴 코일은 80~120 uH이다)
나의 경우는 플라스틱 판재에 양면 테이프를 붙히고, 0.24mm 절연전선을 한면에 20회씩 양면 테이프위에 절연전선을 붙혀서,
한면에 20회씩 (양면에 40회) 감은 감은 코일위에 투명 비닐 테이프를 덮어서 시험용 코일을 만들었습니다.
.
C-res를 103 이하로 125KHz에서 공진을 시키려면, 0.25mm 폴리우레탄 코팅 전선을 70 x 70 mm의 크기로
110회를 감으면 LCR 메터에서 인덕턴스 측정결과가 1.4mH로 나온다면, 125KHz에서 공진이 됩니다.
안테나 코일의 공진주파수가 125KHZ일 때, 안테나 코일 출력은 약 120 Vp-p가 나옵니다.
이때 출력이 너무 크면 절연문제가 나올 수도 있으므로, R1을 조정하여 100 Vp-p 이하로 맞춥니다.
.
project : EM4095 RFID Reader V2.0
Target : MEGA8-16AU
Crystal: 14.7456 Mhz
Input : EM4095 RFID 125KHz
Output : RS232C 115200,N,8,1
Compiler : ICC-AVR V6.26C
Author. : leeky
Email : info@ledshop.co.kr
.
● ATMEGA8-16AU TQFP32를 사용할 때의 Pin 배열  (회로도는 ATMEGA8-16PI를 사용)
#30 PD0/RXD <--- RXD (RS232C)
#31 PD1/TXD ---> TXD (RS232C)
# 9 PD5/T1 <--- TIMER1 EXT-T1 <--- RDY-CLK (EM4095)
#10 PD6 ---> SHD (EM4095)
#11 PD7 ---> MOD (EM4095)
#12 PB0/ICAP <--- TIMER1 ICAP <--- DEMOD (EM4095)
#13 PB1 ---> LED (READY)
#14 PB2 ---> BUZZER (BEEP)
#15 PB3 ---> RELAY (DOOR OPEN)
.
● 읽기전용 RFID 장치에서 출력되는 직렬통신 데이터 (ASCII로 출력되며 통신속도는 115200,N,8,1이다.)
LF+ 10 of Nibbles HEXA + CR <--- HEXA는 10 자리의 '0' 에서 'F' 까지의 ASCII 값으로 출력된다.
예 : LF+0461167A89+CR (샘플 ID 카드를 읽은 경우)
.
● 시중에서 판매되는 무선인식 태그의 예 (125 KHz 읽기전용)
 
 
품명 :  RF125-ROT_1
크기 : Ø33mm  
주파수 : 125KHz  
기판 재질 : PCB
안테나 코일 : Copper Coil (권선굵기 0.03~0.08 자기유도용량 4~8mH)
응용 : 가축 인식
판매 사이트 : http://www.rflink.co.kr/Products/Products_1.htm
 
 
 
● RF-Tag에 사용되는 칩:
EM 4100, EM4102, TK4100, T5557, EM4069, EM4150, MF1S50, S70, Hitag1, Hitag2, HitagS, I-Code I, I-Code II, Ti TMS 37122 등을 사용하고 있으며, 단일속도와 단일 포맷으로 출력하는 RFID-Tag 이외의 RF/8, RF/16, RF/32, RF/40,RF/50, RF/64, RF/100, RF/128 등의 다양한 속도로 BIN, FSK, PSK, Manchester등으로 선택하여 출력하는 RFID-Tag는 Reader에서 RFID-Tag에서 출력하는 포맷과 속도를 프로그램해 주어야 읽을 수 있다. (포맷과 속도가 변경되는 R/W RFID-Tag는 비밀번호, 출력포맷, 데이터 블록 수, 쓰기방지 등을  설정할 수 있다.)
.
● RF-Card에 주로 사용되는 칩의 규격 (EM, TEMIC, MIFARE)
 

 
● EM type (읽기 전용 RFID 카드)의 출력 데이터 구조 (EM4100, EM4102)
 
 
 
● Manchester 코드의 복조방법
 
 
위와 같은 시이컨스 처리에 의한 방법 외에도, 125KHz 동기클럭(RF/32는 동기클럭이 데이터의 32배의 규격)을
1/16 분주하여 데이터의 2배속(RF/2)의 클럭을 만들고, 1/16로 분주된 클럭과 수신된 맨체스터 코드를
XOR 연산하여 간단하게 원래의 데이터를 복조할 수도 있다. (1/16 분주기와 XOR 로직으로 만들어도 된다)
.
또한 펄스폭이 넓으면 비트값을 반전하고, 펄스폭이 좁으면 이전 비트값을 사용하는 방식만으로 복조를 하면
매 에지마다 비트가 생성되므로, 복조된 비트의 숫자가 원래의 송신비트와 일치하지 않는 문제가 발생하게 된다.
(결과는 펄스폭이 넓어 반전된 비트의 갯수는 맞지만, 펄스폭이 좁아 비반전된 비트는 갯수는 틀리게 된다)
.
그외에 MPU의 내부클럭으로 각각의 에지에서 펄스폭을 측정하여 맨체스터 코드를 복조하기도 한다.
그러나 이 방법은 동기클럭을 사용하는 방식보다 복조된 펄스폭이 조금씩 흔들리는 불안정한 특징이 있으며,
특히 안테나 코일의 공진특성을 되먹임하여 발진주파수가 변동하는 RFID 장치의 경우에는 불안정한 특성이 있다.      
.
또한 맨체스터 코드는 데이터의 모서리 부분에 원래의 클럭이 그대로 들어 있으므로,
데이터를 입력으로 재생된 연속클럭을 출력하는 Clock Regnenrator IC도 생산되고 있다.
같은 방식을 사용하는 Ethernet의 물리층 변조/복조 IC의 내부에는 이러한 회로를 사용하고 있다.
.
1111 11111 = Header = 9 bit
______--__--__--__--__--__--__--__--__-- (wave)
0-0 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 (edge)
(x)<>(1)=(1)=(1)=(1)=(1)=(1)=(1)=(1)=(1) (code)
.
Custom-ID (10 bits)
--__--__--__--__--__--____----__--____-- (wave)
1-0 1-0 1-0 1-0 1-0 1-0 0-1 1-0 1-0 0-1 (edge)
(0)=(0)=(0)=(0)=(0)=(0)<>(1)<>(0)=(0)<>(1) (code)
D3 =D2 =D1 =D0 =P =D3 -D2 -D1 =D0 -P (=은 극성유지, -는 극성반전, P는 parity,)
.
EM 타입 RFID 카드나 Tag의 출력 데이터는 일반적으로 64 비트 읽기전용이며,
EM4095 칩을 사용하면, 반송파 주파수 125KHz의 동기클럭과 EM4095 칩에서 수신된
카드의 신호가 3.9KHz(넓은 폭) ~ 1.95KHz(좁은 폭)로 DEMOD 핀에서 출력됩니다.
.
이 신호는 Manchester로 변조된 신호이므로, TIMER1 포착카운터를 T1입력으로 동기클럭을 사용하면,
폭이 좁으면 동기클럭의 값으로 32가 포착되며, 넓은 폭인 경우는 동기클럭으로 64가 포착된다.
그러므로 폭의 넓고 좁음을 확인할 때 기준값 40과 비교하면, 40보다 작으면 신호의 레벨이 전과 동일한 것이며,
포착된 펄스폭의 값이 40보다 큰 경우는 직전의 레벨이 반전된 것으로 수신비트를 저장하면 복조가 된다.
.
또한 이 장치는 RFID-Tag가 보내오는 Parity를 검사하여 헤드와 패리티가 정상일 때에,
10 자리의 ASCII 코드를 UART로 송신합니다, 전송속도는 115200,N,8,1로 포맷은 다음과 같습니다.
LF+ 헤드 2자리 + 데이터 8자리 + CR을 1초에 5번 송신합니다.
LED는 수신루틴이 작동중인 상태를 나타내며, BUZEER는 오류가 수신되었을 때 점등되며,
RELAY는 정상적으로 수신이 되었을 때 만 출력이 됩니다. (LED를 연결하여 시험을 합니다)
.
타이머1은 16비트 카운터와 클럭을 T1 외부입력 핀에서 받도록 아래와 같이 초기화한다.
// ***********************************************
// TIMER1 초기화 : 0000으로 시작하고 16진 타이머이다.
// 클럭은 EM4096의 RDY-CLK가 EXT_T1 핀으로 들어온다.  
// PB0/ICP에 연결된 EM4095의 DEMOD 출력으로 ICPR에 포착된다.
// ***********************************************
void timer1_init(char edge)
{
  TCCR1B = 0x00;         // stop timer1
  TCNT1H = 0x00;
  TCNT1L = 0x00;        // start from 0000
  TCCR1A = 0x00;
  TCCR1B = 0x00;        // stop timer1,
.
  // 포착 카운터의 포착방향은 TCCRB의 비트 6과 5를 설정으로 선택한다.
  if (edge ==1) TCCR1B = 0x40;  // ICAP capture from T1 riging.
  else TCCR1B = 0x20;        // ICAP capture from T1 falling.
  // 포착카운터로 사용하는 타이머1의 가로채기는 타이머1 Overflow와 타이머1 Capture 다로채기로 다음과 같다.
  TIMSK |= 0x24;         // timer1 capture, overflow interrupt sources
}
.
// ***********************************************
// TIMER1 초과 가로채기 처리
// ***********************************************
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
  //TIMER1 has overflowed
  TCNT1H = 0x00;        // reload counter high value
  TCNT1L = 0x00;        // reload counter low value
}
.
이렇게 타이머1을 포착기능으로 초기화하면 T1 핀은 EM4095의 RDY-CLK를 연결하여 타이머1을 구동하고
DEMOD 출력은 타이머1의 포착신호인 ICAP 핀에 연결하여 타이머1의 값을 포착할 수 있다.
포착방향은 High와 Low 레벨로 변화하는 가로채기로 입력신호의 펄스폭이 ICPR1에 자동으로 포착된다.
또한 펄스폭 비교기준값과 타이머1의 클럭이 EM4095의 동기클럭을 사용하므로써,
온도변화나 안테나 코일의 변경으로 반송파의 발진 주파수가 바뀌어도 신호를 처리하는데 전혀 문제가 없다
또한 동기클럭에 의해서 안정한 펄스폭을 검출하는 것이 가능하므로 신뢰성이 높은 장치로 작동된다.
.
다음은 포착신호가 High나 Low로 변화하여 ICPR1에 가로채기가 일어 났을 때의 처리방법이다.
// ***********************************************
// PB0/ICP 입력으로 포착된 타이머1 값은 ICR1에 들어 있다.
// 16 비트 포착기 ICR1 에서 읽는다.(반드시 하위부터 8비트씩 읽는다)
// 현재의 포착방향은 다음번 포착을 위해서 반전시킨다.
// 모든 신호의 수신과 폭의 확인은 여기에서 처리한다.
// ***********************************************
#pragma interrupt_handler timer1_capt_isr:6
void timer1_capt_isr(void)
{
  int value;                // 현재 포착된 TIMER1의 값
  int width;                // 현재값 -이전값 =수신폭
  value =ICR1L;        // Read low byte first
  value |=(int)ICR1H << 8; // Read high byte and shift into top byte
.
  // 매번 포착 가로채기 마다, 다음번의 포착방향을 반대로 변경한다.
  if (edge_dir)        // 모서리 방향을 바꾼다.
  {
    TCCR1B &= ~0x40;
    TCCR1B |= 0x20;        // ICP를 하강 포착으로 설정
    edge_dir =0;        // 다음번의 포착방향을 하강으로.    
  }
  else
  {
    TCCR1B &= ~0x20;
    TCCR1B |= 0x40;        // ICP를 하강 포착으로 설정
    edge_dir =1;        // 다음번의 포착방향을 상승으로.
  }
  width =value -old_width; // 현재값 -이전값 =수신폭
  old_width =value;               // 현재값을 이전값에 저장 (다음 수신폭 측정을 위함)
.
  // 전송기에서 들어오는 manchester 포맷된 데이터를 수신한다.
  // 최초 수신비트는 1이 되어야 하므로 bit_value를 0으로 해서,
  // 펄스폭이 40 보다 넓으면 수신비트를 반전하여 1로 저장한다.
  if(width > 40)        // 반전 비트는 펄스폭이 64 이다,
  {
    bit_value = ~bit_value;     // 반전된 비트값을 저장한다
    rf_bit_store(bit_value);     // 반전된 경우 비트를 무조건 저장한다                                
    ++bit_trans_num;        // 반전된 수신비트 갯수를 +1
    bit_saved = 0;          // 중복저장을 방지
  }
.
  // 펄스폭이 넓을 때 앞에서 저장된 비트의 중복된 저장을 방지하는 플랙을 처리                
  if(bit_saved)                // 먼저번에 저장되었나?
  {
    rf_bit_store(bit_value);        // 비트를 시프트하고 저장한다.                        
    ++bit_trans_num;                // 반전된 수신비트 갯수를 +1
   }
   bit_saved = ~bit_saved;          // 수신비트를 1/2 만 저장하도록 저장비트를 반전한다.
}
.                        
다음은 위에서 포착된 machester 코드를 복조한 비트를 버퍼에 저장하는 루틴이다.
// ***********************************************
// 포인터가 지정하는 바이트의 최하위 비트에  들어온 비트를 저장하고 비트 포인터를 +1한다.
// 8비트를 모두 저장하였다면, 비트포인터를 리셋하고, 바이트 포인터를 +1 한다.
// 바이트 포인터가 끝이면, rf_buff_end를 세트한다.
// ***********************************************
void rf_bit_store(char bit_value)
{
  char byte;
  if(!(rf_buff_ptr ==sizeof(rf_buff)))        // 포인터의 끝이 아니면 실행한다
  {
    byte =rf_buff[rf_buff_ptr];        // 포인터로 이전에 저장된 바이트를 읽음
    byte =(byte << 1);                // 먼저 저장된 비트를 좌로 시프트하고
    if (bit_value) byte |=0x01;        // 수신비트가 1이면 lsb를 세트
    else byte &=0xfe;                // 수신비트가 0이면 lsb를 리셋
    rf_buff[rf_buff_ptr] =byte;          // 수신비트를 포인터로 버퍼에 저장한다
.
    if(++rf_bit_ptr == 8)                // 비트 포인터터 8비트를 모두 처리 했는가?
    {
      rf_bit_ptr = 0;                 // 비트 포인터를 리셋
     ++rf_buff_ptr;                // 바이트 포인터를 +1
    }
  }
}
.
실지로 가로채기에서 펄스폭을 복조하는 루틴을 제어하는 보조함수는 다음과 같다.
// ***********************************************
// 입력 : 수신하는 비트의 갯수, 포착할 비트의 모서리 방향
// 수신된 비트는 rf_buff에 저장한다. (EM4100의 출력 비트수는 64 개)
// 출력 : 시간초과(60ms 이내)를 검사하고, 수신된 비트의 갯수를 bit_trans_num에 저장한다
// ***********************************************
void get_bits_num(char num_bits, char edge)
{
  set_rf_edge(edge);          // 포착할 수신신호의 방향을 설정
  // 저장플랙을 1로 하면, 최초 펄스가 좁으면 수신비트를 0으로 저장된다.
  bit_saved =1;                                              
  // 강제로 0이된 수신비트는, 최초 펄스폭이 넓으므로 반전되어 1로 저장된다.
  // 최초펄스는 반드시 헤더이므로, 신호의 극성은 1이 되어야 한다.
  bit_value =0;        // 수신된 비트를 0으로 설정
  rf_buff_ptr =0;           // 수신버퍼 포인터를 0으로 설정
  rf_bit_ptr =0;                     // 수신비트 포인터를 0으로 설정
  bit_trans_num =0;               // 비트전송 갯수를 0으로 설정
  timer_over =0;            // 시간초과 값을 0으로 설정
  old_width =0;        // 이전 수신폭 값을 0으로 설정
.
  TCCR1B = 0x00;        // stop Timer1 from EXT-T1
  TCNT1H = 0x00;
  TCNT1L = 0x00;        // 타이머1을 0으로 설정
  TCCR1B = 0x07;        // EXT-T1으로 타이머1 시작  
.
  // 타이머가 60ms 이내이면 펄스폭을 검출하여 64비트가 모두 수신될 때까지
  // 타이머1 포착 가로채기를 허용하여 Manchester 코드를 복조하고 버퍼에 저장한다.
  TIMSK |= 0x20;         // timer1 capture 가로채기를 허가
  // 수신비트를 저장한 갯수가 num_bits 보다 작으면 수신계속
  while(bit_trans_num < num_bits  && timer_over < 60)
  {
  }  
  // 수신비트를 저장한 갯수가 num_bits 보다 크면 수신 끝.
  // 시간초과 값이 60ms 이상이면 수신 끝 (시간 초과)      
  TIMSK &= ~0x20;         // timer1 capture 가로채기를 금지
.
  // 수신이 끝나면 수신된 데이터의 처리를 위해서 포인터를 리셋한다.
  rf_buff_ptr = 0;         // 수신버퍼 포인터를 0으로 설정
  rf_bit_ptr = 0;            // 수신비트 포인터를 0으로 설정
}
.
다음은 수신된 Machester 코드를 비트단위로 읽어오는 보조함수이다.
// ***********************************************
// 수신버퍼에서 포인터로 지정된 비트를 읽어 온다, 그리고 다음 비트로 포인터를 옮긴다,
// 출력 : 수신된 데이터의 비트 (0 혹은 1)
// ***********************************************
char get_buff_bit(void)
{
  char bit;
  char byte;
  if(!(rf_buff_ptr ==sizeof(rf_buff)))
  {
    byte =rf_buff[rf_buff_ptr];
    byte =(byte << rf_bit_ptr);        // bit shift for 0~7
    byte &=0x80;
    if (byte ==0x80) bit =0x01;
    else bit =0x00;                // make 1 bit result
                                                
    if(++rf_bit_ptr == 8)                // end of bit pointer?
    {
      rf_bit_ptr = 0;                // bit pointer =0
      rf_buff_ptr++;                 // byte pointer +1 
    }
  }
  return bit;                        // return bit result
}
.
● 첨부파일 : ImageCraft ICCAVR V6용 C 소스와 펌웨어용 HEX 파일이 들어 잇습니다.
Cicuit image file [101.41 KB] (Feb 3, 2007) 게시된 회로도를 클릭해서 받으십시요
ICC AVR-C Source and Hex file for EM4095 RFID reader (업그레이드 중입니다, 완료되면 올릴 예정입니다)
.
● 주의 사항 :
이 소스는 학생용, 개인 프로젝트 용으로만 공개되어 있습니다.
이 소스를 인용한 상용 제품의 제조, 판매를 하려면 저자의 허락을 받아야 합니다.
연락처 : : info@ledshop.co.kr
.
● 영문 사이트 : http://www.avrfreaks.net/ -> Project (Need Login) -> Search EM4095
Project details : EM4095 RFID Reader V2.0
Author : leeky LEDshop Inc, Republic of Korea
Type : Complete code with HW
Compiler : ImageCraft ICCAVR V6
Added : 2007-02-04
Email  : info@ledshop.co.kr
.
참조 : http://www.emmicroelectronic.com/
저자 : http://avrtools.co.kr/
이 자료의 무단 복제, 배포 및 사이트 링크없는 무단게시를 일절 금합니다.
 
AVRTOOLS™
   
이름아이콘 김국세
2007-10-16 20:11
 항상 좋은 자료 감사 합니다.
많이 배우고 있습니다.
   
 
윗글 74HC595를 사용한 소형 8x24 LED 전광판의 제어
아래글 13.56MHz ISO-15693 RFID 태그 읽기장치 제작
    N         제목    글쓴이 작성일 조회 추천
14 가변-정전압,정전류-직류전원의 제작 avrtools™ 2011/08/08 (월) 252 0
13 전력제어기기는 USB 포트를 절연하자 avrtools™ 2011/07/03 (일) 194 0
12 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 195 0
11 AVR studio용 USBasp to AVR-ISP 제작 avrtools™ 2009/10/22 (목) 322 0
10 ATmega8 AVRISP-mkII의 제작 avrtools™ 2009/09/30 (수) 447 0
9 VGA CAM C328R 카메라 모듈의 제작 avrtools™ 2009/08/12 (수) 228 0
8 ODB-II 엔진 스캐너 PC 인터페이스 제작 avrtools™ 2008/10/04 (토) 511 0
7 Mega8 칼라센서 TCS230 색상인식 장치 leeky 2006/03/07 (화) 869 3
6 74HC595를 사용한 소형 8x24 LED 전광판의 제어 [3] leeky 2006/05/02 (화) 1364 3
5 ATmega8을 사용한 EM4095 RFID Reader의 제작 [1] leeky 2007/02/04 (일) 777 0
4 13.56MHz ISO-15693 RFID 태그 읽기장치 제작 [5] leeky 2007/03/15 (목) 666 0
3 AVR 프로그래머 AVR910-ISP 제작 [1] leeky 2006/08/06 (일) 1134 0
2 USB AVR-ISP의 제작과 펌웨어 Upgrade leeky 2006/03/07 (화) 1366 8
1 JTAG ICE의 제작과 펌웨어 업그레이드 leeky 2006/03/07 (화) 1046 3
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0