• 沒有找到結果。

結論及建議

在文檔中 中 華 大 學 (頁 54-84)

RFID 是一個新興的科技,也刺激了許多新的應用領域,透過本論文我們提供了 一套完整的 RFID 模組開發的設計,從 Reader 和 Tag 之間的通訊協定開始規劃,並 注重現場環境的架設,阻絕可能 RF 訊號干擾源的布建,以提高讀取效果。我們以一 個簡單的 RFIC 實做出一個完整的 RFID 系統,此系統並整合小型 GPS 模組,可以應 用在大範圍且多人的人員識別定位系統(如監獄、安養院、礦場),當範圍內的人員突 然消失,或長時間呆在某定點時,後端平台即會發出警報,告訴相關人員加以注意。

或可應用於一定時間的競賽運動(如路跑活動、腳踏車、溜冰)軌跡紀錄,跑者在 到達終點後,可以將其活動軌跡資料透過 RFID 往後端平台送,減少有線傳輸的排隊 時間,同時也可以藉此判斷跑者是否有依照規定的路線進行路跑活動,避免爭議。

也可應用於車輛管理系統(如:計程車、貨運、公車)之軌跡紀錄,當車輛於下班 後返回公司,即可進行行車軌跡資料的搜集,並藉此可以判斷出司機是否有繞路、或 偷懶,甚至若裝設在貨櫃上,亦可減少中途換貨甚至走私的情況發生。

隨著各項運動休閒活動越來越多,人們運動的比例也大幅提高,此系統亦可以提 供全民健康管理與體適能諮詢系統,並與既有之健康保健食品咨詢服務、深度(精緻)

休閒旅遊認證關懷服務、區域諮詢照護追蹤服務等機制相結合,提供全民安全、安心 的體適能運動管理及健康諮詢的全方位服務。

透過此系統可提供運動人員即時的身體資訊監測及記錄計時的功能,不但可簡化 練習時繁瑣的計時工作,同時也可避免因為不夠瞭解自己身體狀況而發生危險。可以 應用於公園、運動場、健身房、自行車步道等經常從事運動的人員身上。更進一步,

未來此系統可以與外加相關模組的生理資訊標籤相互結合,即可隨時得知目前的身體 資訊,例如:心跳、脈搏、血壓等。透過活動區域讀取裝置的外加顯示系統,則會將

身體資訊即時顯示於 LED 看板,讓運動人員能立即了解自身的運動量及生理狀態。

透過後端 Web 網路設定,亦可即時提供訊息傳遞服務,當配戴此健康管理專用標籤 時,通過讀取顯示器、亦可接收顯示好友或家人傳遞之即時訊息;此外標籤會傳回目 前感測到的生理資訊,監控中心將資料比對後,如判斷此人員身體狀況異常時,則即 時發出警訊並通知相關人員即刻處理,避免運動人員發生危險。運動人員亦可以在回 家之後,透過網站入口從伺服端資料庫了解過去 3 個月的運動資料,此後端伺服器亦 可提供相關之健康諮詢服務。

參考文獻

[1] Rene Martinez, and Harley Heinrich, ” Power reflection coefficient analysis for complex impedances in RFID tag design,” IEEE transactions on MICROWAVE THEORY AND TECHNIQUES, VOL. 53, NO. 9, September 2005

[2] RFID Handbook , Fundamentals and Applicationsin Contactless Smart Cards and Identification, Second Edition,Klaus Finkenzeller Giesecke &Devrient GmbH, Munich, Germany. Translatedby Rachel Waddington, Member of the Institute of Translation and Interpreting. Copyright 2003.

[3] P.H. Cole, D.C. Ranasinghe & B. Jamali,“Coupling Relations in RFID Systems II:

Practical Performance Measurements,” Auto-ID CentreWhite Paper, 2003.

[4] 國立交通大學電信工程學系,2006 年第32 期無線通訊天線設計。

[5] Sung-Fei Yang,”Design of RFID Tag Antenna Based on Gravure Printing and Vacuum Deposition Technology” July 2007

[6] 張博光,”全球定位系統及慣性參考導航系統複合之研究”,私立中華工學院航 太所碩士論文,1994。

[7] C. A. Balanis, “Antenna Theory, Analysis and Design”, second edition, John Wiley &

Sons, Inc., 1997.

[8] 吳靜雯、蔡長俽、簡良益,”PaPaGO!SDK Mobile 行動GIS系統開發實務”, 研勤 科技股份有限公司,2005

[9] 李世興,”詳解EMC觀念與對策”,全華科技圖書股份有限公司,2002

[10] 劉銘中、林琮烈,”MCS-51單晶片原理與設計實務(KEIL C語言版)”,儒林出版 社,2007

[11] 賴麒文,”C與8051單晶片韌體設計-實務篇(使用KEIL C)”,文魁資訊股份有限公

司,2005

[12] 林伸茂,”8051單晶片徹底研究實習篇”,旗標出版股份有限公司,2002

[13] NORDIC Semiconductor, “nRF9E5 433/868/915MHz RF Transceiver with Embedded 8051 Compatible Microcontroller and 4 Input, 10 Bit ADC”, NORDIC Semiconductor

[14] NORDIC Semiconductor,” Small loop antennas(nAN400-03)”

[15] Frank Karlsen ,“Guidelines to low cost wireless system design” NORDIC Semiconductor

[16] NORDIC Semiconductor ,“nRF905 RF and antenna layout(nAN900-04)”

[17] SkyTraq Technology,”Venus638FLPx GPS Module Data Sheet”,2010

[18] 鄭同伯,”RFID EPC無線射頻辨識完全剖析”,博碩文化股份有限公司,2004 [19] 胡榮勝、李達生,”RFID系統及EPC標準架構”,國立台灣大學出版中心,2010 [20] 柳猛、王大志,”射頻無線技術在TPMS中的應用”,電子技術,2007

附 錄 一

EPC Class 1 Gen-2 的 Q 演算法

在 Gen-2 協定中,讀取器用來設定 slot-count 參數 Q 的演算法(簡稱 Q 演算法) 如 圖 4-13 所示,利用在 Query 或 Query Adjust 命令參數調整 Q 值(0,15)來取得標籤的回 應,在圖 4-13 中,Qfp 定義為 Q 的浮點表示式,讀取器依 Qfp 的循環,取出最接近 整數的值(替代為 Q),並放入 Query 指令使用,在圖中之 C 值係介於 0.1<C <0.5,若 Q 值較大時,讀取器會取較小的 C 值,若 Q 值較小時,讀取器會取較大的 C 值,由 圖可知有三種情形改變 Qfp 值,說明如下:

  只有一個標籤回應,Qfp= Qfp。

  沒有標籤回應,由於可能係選擇的 slot 空值,故 Qfp= Qfp-C。

  二個以上標籤回應,代表選擇的 slot 導致碰撞發生,故 Qfp= Qfp+C。

Q algorithm(圖資來源:EPCglobal C1G2 規範) 程式碼

Reader sends Query.

for inventory procedure

Every tag generates RN16 & slot counter.

for current frame

If slot counter == 0

Tag replies its RN16.

end

If a single tag replies

Reader sends ACK with RN16.

If RN16 received by tag == RN16 saved in tag Tag sends EPC to reader.

end

Reader sends QueryRep.

else if multiple tags reply

Reader sends QueryRep or QueryAdjust.

else if no tag replies

Reader sends QueryRep or QueryAdjust.

end

If tag receives QueryRep

slot counter = slot counter – 1 end

end

Reader sends QueryAdjust.

end

附 錄 二

Active RFID 接收發射模組程式碼[10][11][12]

nRF9E5 基本參數設定程式

/*--- * reg9e5.h

* Keil C51 header file for the Nordic Semiconductor nRF9E5 433-968MHz RF * transceiver with embedded 8051 compatible microcontroller.

* $Revision: 3 $

*---*/

#ifndef __REG9E5_H__

#define __REG9E5_H__

/* BYTE Registers */

sfr P0 = 0x80;

sfr SP = 0x81;

sfr DPL = 0x82;

sfr DPH = 0x83;

sfr DPL1 = 0x84;

sfr DPH1 = 0x85;

sfr DPS = 0x86;

sfr PCON = 0x87;

sfr TCON = 0x88;

sfr TMOD = 0x89;

sfr TL0 = 0x8A;

sfr TL1 = 0x8B;

sfr TH0 = 0x8C;

sfr TH1 = 0x8D;

sfr CKCON = 0x8E;

sfr P1 = 0x90;

sfr EXIF = 0x91;

sfr MPAGE = 0x92;

sfr SCON = 0x98;

sfr SBUF = 0x99;

sfr IE = 0xA8;

sfr IP = 0xB8;

sfr T2CON = 0xC8;

sfr RCAP2L = 0xCA;

sfr RCAP2H = 0xCB;

sfr TL2 = 0xCC;

sfr TH2 = 0xCD;

sfr PSW = 0xD0;

sfr EICON = 0xD8;

sfr ACC = 0xE0;

sfr B = 0xF0;

sfr EIE = 0xE8;

sfr EIP = 0xF8;

sfr P0_DRV = 0x93;

sfr P0_DIR = 0x94;

sfr P0_ALT = 0x95;

sfr P1_DIR = 0x96;

sfr P1_ALT = 0x97;

sfr P2 = 0xA0;

sfr PWMCON = 0xA9;

sfr PWMDUTY = 0xAA;

sfr REGX_MSB = 0xAB;

sfr REGX_LSB = 0xAC;

sfr REGX_CTRL = 0xAD;

sfr RSTREAS = 0xB1;

sfr SPI_DATA = 0xB2;

sfr SPI_CTRL = 0xB3;

sfr SPICLK = 0xB4;

sfr TICK_DV = 0xB5;

sfr CK_CTRL = 0xB6;

sfr CKLFCON = 0xBF;

/* BIT Registers */

/* PSW */

sbit CY = PSW^7;

sbit AC = PSW^6;

sbit F0 = PSW^5;

sbit RS1 = PSW^4;

sbit RS0 = PSW^3;

sbit OV = PSW^2;

sbit F1 = PSW^1;

sbit P = PSW^0;

/* TCON */

sbit TF1 = TCON^7;

sbit TR1 = TCON^6;

sbit TF0 = TCON^5;

sbit TR0 = TCON^4;

sbit IE1 = TCON^3;

sbit IT1 = TCON^2;

sbit IE0 = TCON^1;

sbit IT0 = TCON^0;

/* IE */

sbit EA = IE^7;

sbit ET2 = IE^5;

sbit ES = IE^4;

sbit ET1 = IE^3;

sbit EX1 = IE^2;

sbit ET0 = IE^1;

sbit EX0 = IE^0;

/* IP */

sbit PT2 = IP^5;

sbit PS = IP^4;

sbit PT1 = IP^3;

sbit PX1 = IP^2;

sbit PT0 = IP^1;

sbit PX0 = IP^0;

/* P0 */

sbit T1 = P0^6;

sbit T0 = P0^5;

sbit INT1 = P0^4;

sbit INT0 = P0^3;

/* P1 */

sbit T2 = P1^0;

sbit EECSN = P1^3;

/* SCON */

sbit SM0 = SCON^7;

sbit SM1 = SCON^6;

sbit SM2 = SCON^5;

sbit REN = SCON^4;

sbit TB8 = SCON^3;

sbit RB8 = SCON^2;

sbit TI = SCON^1;

sbit RI = SCON^0;

/* T2CON */

sbit TF2 = T2CON^7;

sbit EXF2 = T2CON^6;

sbit RCLK = T2CON^5;

sbit TCLK = T2CON^4;

sbit EXEN2 = T2CON^3;

sbit TR2 = T2CON^2;

sbit C_T2 = T2CON^1;

sbit CP_RL2 = T2CON^0;

/* EICON */

sbit SMOD1 = EICON^7;

sbit WDTI = EICON^3;

/* EIE */

sbit EWDI = EIE^4;

sbit EX5 = EIE^3;

sbit EX4 = EIE^2;

sbit EX3 = EIE^1;

sbit EX2 = EIE^0;

/* EIP */

sbit PWDI = EIP^4;

sbit PX5 = EIP^3;

sbit PX4 = EIP^2;

sbit PX3 = EIP^1;

sbit PX2 = EIP^0;

/* RADIO Port (P2) */

sbit SPI_SCK = P2^0;

sbit SPI_MOSI = P2^1;

sbit RACSN = P2^3;

sbit TXEN = P2^4;

sbit TRX_CE = P2^5;

sbit SPI_MISO = P2^2;

sbit EOC = P2^4;

sbit DR = P2^5;

sbit CD = P2^6;

sbit AM = P2^7;

sbit P00 = P0^0;

sbit P01 = P0^1;

sbit P02 = P0^2;

sbit P03 = P0^3;

sbit P04 = P0^4;

sbit P05 = P0^5;

sbit P06 = P0^6;

sbit P07 = P0^7;

sbit P10 = P1^0;

// SPI Commands

#define WRC 0x00 //W_RF_CONFIG

#define RRC 0x10 //R_RF_CONFIG

#define WTP 0x20 //W_TX_PAYLOAD

#define RTP 0x21 //R_TX_PAYLOAD

#define WTA 0x22 //W_TX_ADDRESS

#define RTA 0x23 //R_TX_ADDRESS

#define RRP 0x24 //R_RX_PAYLOAD

#define RAD 0x40 //R_ADC_DATA

#define WAC 0x44 //W_ADC_CONFIG

#define RAC 0x46 //R_ADC_CONFIG

#define WTU 0x50 //W_TEST_UNLOCK (use with data A5)

#define WTR 0x52 //W_TEST_REGISTER

#define RTR 0x53 //R_TEST_REGISTER

#define CC 0x80 //CHANNEL_CONFIG

#define SAV 0xC0 //START_ADC_CONV

#define NOP 0xFF //NO_OP

#endif

RF 傳送程式

#include "MicDev.h"

//=========[ Radio START ]========== =========

#ifdef RF_HIGHFREQ

#define HFREQ 1 // 0=433MHz, 1=868/915MHz

#else

#define HFREQ 0 // 0=433MHz, 1=868/915MHz

#endif

#define POWER 0 // 0=min power...3 = max power char code cID[8] = {'H','e','a','D', // 識別 HEader

0x27,0x10, // Sleep Interval= 10000 milli-seconds, 0x27,0x10

// 預設為 8200 milli-seconds 要 wake-up,因為 Deep Sleep 時 RC Crystal 不準,故要校正 } ;

char code cSlaveID[DEFAULT_ADDRESS_WIDTH] = {0x34,0x77,0x36,0x4F} ; char idata DevID[DEFAULT_ADDRESS_WIDTH] ;

nRfStruc idata nRfData ;

//*********************************************************************************

//function Config905();

//*********************************************************************************

void Config905(void) {

unsigned char tmp;

//TRX_CE = 0; //test //設置 nRF905 為待機方式 RACSN = 0;

SpiReadWrite(WRC | 0x05); // Write to RF config address 5 (RX_ADDRESS(Deivce_ID) for (tmp=0;tmp<DEFAULT_ADDRESS_WIDTH;tmp++)

SpiReadWrite(cSlaveID[tmp]); //接收有效位址 RACSN = 1;

RACSN = 0;

SpiReadWrite(WRC | 0x03); // Write to RF config address 3 (RX payload) SpiReadWrite(RX_PAYLOAD_WIDTH);

SpiReadWrite(TX_PAYLOAD_WIDTH);

RACSN = 1;

RACSN = 0;

SpiReadWrite(RRC | 0x01); // Read RF config address 1

tmp = SpiReadWrite(0) & 0xf0; // Clear the power and frequency setting bits RACSN = 1;

RACSN = 0;

SpiReadWrite(WRC); // Write RF config address 0 SpiReadWrite(CH_NO_FREQ & 0xFF) ;

SpiReadWrite(tmp | (POWER <<2) | (HFREQ << 1) | ((CH_NO_FREQ >> 8) & 0x01));

RACSN = 1;

}

void FillReplyAddress(void) {

unsigned char i;

for (i=0;i<DEFAULT_ADDRESS_WIDTH;i++) // Write 4 bytes address

nRfData.TxBuffer[i + RF_PACKET___REPLY_ADDR_INDEX] = cSlaveID[i] ; }

void Delay(unsigned char n) {

unsigned int i;

while(n--)

for(i=0;i<80;i++);

}

/**********************************************************************************

//function TxPacket();

/**********************************************************************************

void TxPacket(char index) {

unsigned char i;

FillReplyAddress() ;

RACSN=0; // Spi enable for write a spi command SpiReadWrite(WTP); // Write payload command for (i=0;i<TX_PAYLOAD_WIDTH;i++)

{

SpiReadWrite(nRfData.TxBuffer[i]); // Write 32 bytes Tx data }

RACSN=1; // Spi disable

RACSN=0; // Spi enable for write a spi command SpiReadWrite(WTA); // Write address command

for (i=0;i<DEFAULT_ADDRESS_WIDTH;i++) // Write 4 bytes address {

SpiReadWrite(cEchoID0[i]);

}

RACSN=1; // Spi disable TXEN=1;

TRX_CE=1;

Delay(1) ; while (DR == 0) ; }

/**********************************************************************************

//function RxPacket();

/**********************************************************************************

#if 0

void RxPacket(void) {

unsigned char i;

RACSN=0; // Spi enable for write a spi command SpiReadWrite(RRP); // Read payload command for (i=0;i<RX_PAYLOAD_WIDTH;i++)

{

nRfData.RxBuffer[i]=SpiReadWrite(NOP); // Read data and save to buffer }

RACSN=1; // Disable spi

//--- 等待 DR 和 AM 恢復為 LOW while(DR||AM);

//RADIO_ENABLE ;

for (i=0;i<DEFAULT_ADDRESS_WIDTH;i++) {

DevID[i] = nRfData.RxBuffer[RF_PACKET___REPLY_ADDR_INDEX + i ] ; }

#ifdef TRACE_SW

putchar('R') ; putchar('X') ; putchar(':') ; for (i=0;i<RX_PAYLOAD_WIDTH;i++) {

HexOutByte(nRfData.RxBuffer[i]) ; putchar(' ');

}

#endif }

#endif

/**********************************************************************************

// The Transceiver Operateing mode is ShockBurst TX.

/**********************************************************************************

void SetTxMode(void) {

RADIO_SHOCKBURST_TX ; RADIO_ENABLE ;

Delay(7); // delay for mode change(>=650us) }

/**********************************************************************************

// The Transceiver Operateing mode is ShockBurst RX.

/**********************************************************************************

void SetRxMode(void)

{

RADIO_SHOCKBURST_RX ; RADIO_ENABLE ;

}

void ReadRFConfig(void) {

char i;

unsigned char c ; RACSN = 0;

SpiReadWrite(RRC); // Read RF config for (i=0;i<10;i++)

{

c = SpiReadWrite(NOP) ; HexOutByte(c);

}

PutString("\r\n");

RACSN = 1;

}

void TransmitPacket(unsigned char b) {

char i ;

RACSN = 0;

SpiReadWrite(WTP);

SpiReadWrite(b);

RACSN = 1;

TRX_CE = 1;

RACSN=0; // Spi enable for write a spi command SpiReadWrite(WTA); // Write address command

for (i=0;i<DEFAULT_ADDRESS_WIDTH;i++) // Write 4 bytes address {

SpiReadWrite(cMasterID[i]); // Master 要回話給剛才傳資料過來的 SlaveID }

RACSN=1; // Spi disable TRX_CE = 0;

}

void Transmitter(void) {

TXEN = 1;

TransmitPacket(P0);

}

UART 傳送資料程式

#include "MicDev.h"

// 若 SlaveDev 有 UART 的功能, 就 define UART_SW, 否則 remark 掉

#ifdef UART_SW

const char code hex_tab[] = "0123456789ABCDEF";

unsigned char inbuf[UART_BUFFER_SIZE] ; unsigned char istart_0 ;

unsigned char iend_0 ;

#define OLEN 4 // size of serial transmission buffer

unsigned char idata ostart; // transmission buffer start index unsigned char idata oend; // transmission buffer end index char idata outbuf[OLEN]; // storage for transmission buffer bit sendfull_0; // flag: marks transmit buffer full, Uart0 bit sendactive; // flag: marks transmitter active

void Uart0_isr (void) interrupt 4 using 2 {

char c;

/*--- Received data interrupt. ---*/

if (_testbit_(RI) ) {

c = SBUF ; if (c == 0x0A) {

LineComplete = 1 ; }

UartData.buffer[UartData.counter] = c ; ++UartData.counter ;

if (UartData.counter >= UART_BUFFER_SIZE) UartData.counter = 0 ;

//----[ for Circular buffer ]--- c = SBUF; // read character

inbuf[iend_0] = c ;

iend_0 = (iend_0 + 1) % UART_BUFFER_SIZE; // Write char to Receive buffer RI = 0; // clear interrupt request flag

}

/*--- Transmitted data interrupt. ---*/

if (_testbit_(TI)) {

if (ostart != oend) // if characters in buffer and {

SBUF = outbuf[ostart++ & (OLEN-1)]; // transmit character sendfull_0 = 0; // clear 'sendfull' flag

}

else // if all characters transmitted

{

sendactive = 0; // clear 'sendactive' }

} }

/*--- // Parameter:

// speed = 0 --> Baud rate = 57600 // = 1 --> Baud rate = 19200 //--- // |---|

// |16 MHz CPU clock | // |---|---|---|---|---|

// | speed |Baud Rate |C/T2 |RCAP2H |RCAP2L | // |---|---|---|---|---|

// | 0 |57.6 Kb/s | 0 | 0xFF | 0xF7 | // | 1 |19.2 Kb/s | 0 | 0xFF | 0xE6 | // | 2 | 9.6 Kb/s | 0 | 0xFF | 0xCC | // | 3 | 4.8 Kb/s | 0 | 0xFF | 0x98 | // | 4 | 2.4 Kb/s | 0 | 0xFF | 0x30 | // | 5 | 1.2 Kb/s | 0 | 0xFE | 0x5F | // |---|---|---|---|---|

void Uart0_initialize_T2(char speed) {

//--- Config T2 As Baud Rate Generator, 57600,N,8,1--- TCLK = 1;

RCLK = 1;

C_T2 = 0; //in T2CON the CP/RL2- bit is enabled by default 0 for up counter switch(speed)

{

case 0: // 57600 bps

RCAP2H = 0xFF ; RCAP2L = 0xF7 ; break ; case 1: // 19200 bps

RCAP2H = 0xFF ; RCAP2L = 0xE6 ; break ; case 2: // 9600 bps

RCAP2H = 0xFF ; RCAP2L = 0xCC ; break ; case 3: // 4800 bps

RCAP2H = 0xFF ; RCAP2L = 0x98 ; break ; case 4: // 2400 bps

RCAP2H = 0xFF ; RCAP2L = 0x30 ; break ; case 5: // 1200 bps

RCAP2H = 0xFE ; RCAP2L = 0x5F ; break ; }

CKCON |= 0x20; // T2M=1 (/4 timer clock) PCON |= 0x80; // SMOD=1 (double baud rate)

SCON = 0x52; // Serial port mode=01,TI=1, enable receiver(REN=1) TMOD = 0x20; // Timer1 8bit auto reload

TR2 = 1; // Start timer1

P0_ALT |= 0x06; // Select alternate functions on pins P0.1 and P0.2 P0_DIR |= 0x02; // P0.1 (RxD) is input

}

/*=============================================

* putbuf: write a character to SBUF or transmission buffer

===================================================*/

void Uart0_putbuf (char c) {

if (!sendfull_0) // transmit only if buffer not full {

if (!sendactive) // if transmitter not active:

{

sendactive = 1; // transfer first character direct SBUF = c; // to SBUF to start transmission }

else {

ES = 0; // disable serial interrupts during buffer update

outbuf[oend++ & (OLEN-1)] = c; // put char to transmission buffer if (((oend ^ ostart) & (OLEN-1)) == 0)

{

sendfull_0 = 1; // set flag if buffer is full }

ES = 1; // enable serial interrupts again }

} }

/*=================================================

* Replacement routine for the standard library putchar routine.

* The printf function uses putchar to output a character.

*/=================================================

char putchar (char c) {

while (sendfull_0); // wait until there is space in buffer Uart0_putbuf (c); // place character into buffer return (c);

}

char putchar(char c) {

while(!TI) ; TI = 0;

return ( SBUF = c ) ; }

void PutString(const char *s) {

while(*s != 0) putchar(*s++);

}

void HexOutNib(unsigned char n) {

putchar(hex_tab[n & 0x0f]);

}

void HexOutByte(unsigned char b) {

HexOutNib(b >> 4);

HexOutNib(b & 0x0f);

}

void InitUartVars(void) {

ostart = 0; // empty transmit buffers oend = 0;

sendactive = 0; // transmitter is not active sendfull_0 = 0; // clear 'sendfull' flag iend_0 =0 ;

istart_0 = 0 ; }

char GetChar(void) {

while(!RI) ; RI = 0;

return SBUF;

}

unsigned char HexInNib(void) {

unsigned char c;

c = GetChar();

if (c >= '0' && c <= '9') return c - '0';

else if (c >= 'a' && c <= 'f') return c - 'a' + 10;

else

return c - 'A' + 10;

}

unsigned char HexInByte(void) {

char nh = HexInNib();

return (nh << 4) | HexInNib();

}

unsigned int HexInWord(void) {

unsigned int bh = HexInByte();

return (bh << 8) | HexInByte();

}

#endif //UART_SW

TH1 = 243; // 19200@16MHz (when T1M=1 and SMOD=1) CKCON |= 0x10; // T1M=1 (/4 timer clock)

PCON = 0x80; // SMOD=1 (double baud rate) SCON = 0x52; // Serial mode1, enable receiver TMOD = 0x20; // Timer1 8bit auto reload TR1 = 1; // Start timer1

P0_ALT |= 0x06; // Select alternate functions on pins P0.1 and P0.2 P0_DIR |= 0x02; // P0.1 (RxD) is input

各項時間相關參數設定資料

#include "MicDev.h"

#ifdef SLEEP_MODE_SW

//--- unsigned int SleepInterval ;

#define WAIT_BUSY__RTC_WATCHDOG while(REGX_CTRL & 0x10) void WriteRTC(unsigned int w)

{

TICK_DV = 0x03; // Init value -> 1ms tick WAIT_BUSY__RTC_WATCHDOG ; REGX_MSB=0x00;

REGX_LSB=0x00;

REGX_CTRL=0x09; // Address 1001b -> WGTIMER

WAIT_BUSY__RTC_WATCHDOG ;

REGX_MSB = w >> 8;

REGX_LSB = w & 0xff;

REGX_CTRL = 0x0a;

WAIT_BUSY__RTC_WATCHDOG ;

REGX_MSB=0xC0;

REGX_LSB=0x00;

REGX_CTRL=0x0C;

WAIT_BUSY__RTC_WATCHDOG ;

}

void EnableWakeupTimer(void) {

WriteRTC(SleepInterval) ; }

//---[ Power Saving Mode ]---

// 進入 Deep Power Down Mode 後,要靠 RTC/WakeUp 才能醒過來.

// 目前訂在 60 秒鐘醒來一次.

void EnterPowerDownMode(void) {

WAIT_BUSY__RTC_WATCHDOG ;

CK_CTRL = MODE__DEEP_POWER_DOWN ; }

extern char code cID[8];

void InitSleepVar(void) {

unsigned int r ;

r= cID[6] << 8 | cID[7] ; if (h>0)

{ f = h / r;

SleepInterval = (unsigned int)(h / f) ; }

else {

SleepInterval = h ; }

SleepInterval = r ; }

#endif // SLEEP_MODE_SW

//~~~~~~~~~~~~~~~~~~~~[ TIMER 0 ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// 1. OSC = 16MHz, 設 T0M (CKCON.3)=1 使 Tiemr0 Clock=CPU_CLK/4 // 16M/4=4M, Invert this value= 1/4M=0.25uS per Instruction cycle.

// 1ms = 0.25uS*4000 , 故要 4000 次 Instuction cycle 才是 1mS.

// 為了 nRF9E5 可以處理得來, 我們設成 10ms OverFlow 一次, // 所以一個 Tick = 10ms.

// 2. TH0/TL0 的初值計算

// 65536-40000=25536=0x63C0, 故 TH0=0x63, TL0=0xC0

#define TIMER0_RELOAD_HIGH 0x63

#define TIMER0_RELOAD_LOW 0xC0 volatile unsigned long MilliSeconds ;

void InitTimer(void) {

MilliSeconds = 0 ; TR0 = 0;

TMOD = (TMOD & 0xF0) | 0x01; //Set T/C0 Mode 1 CKCON |= 0x08;

TH0 = TIMER0_RELOAD_HIGH ; TL0 = TIMER0_RELOAD_LOW ; TF0 = 0;

ET0 = 1; //Enable Timer 0 Interrupts TR0 = 1; //Start Timer 0 Running }

void Timer0ISR (void) interrupt 1 //using 1 {

TR0 = 0 ; TF0 = 0 ;

TH0 = TIMER0_RELOAD_HIGH ; TL0 = TIMER0_RELOAD_LOW ; ++MilliSeconds ;

TR0 = 1 ; }

RF 相關參數設定程式

#ifndef __NRF9X5_HEADER__KIN__

#define __NRF9X5_HEADER__KIN__

#include "Reg9E5.h"

#include <stdio.h>

#include <intrins.h> // for _nop_() //=====[ Uart switch ]=====

#define UART_SW

//=====[ rf 頻率的設定開關 ]=====

#define RF_HIGHFREQ

//=====[ Debug Message 輸出設定開關 ]=====

// 要使用_TRACE 也要打開 UART_SW

#define TRACE_SW

//--- // nrf905 配置寄存器(10Byte)

//工作頻率 f=(422.4+CH_NO/10)*(1+HFREQ_PLL)MHz

//---

#define CH_NO_FREQ_422_4MHz 0x000 //工作頻率 422.4MHz

#define CH_NO_FREQ_422_5MHz 0x001 //工作頻率 422.5MHz

#define CH_NO_FREQ_425_0MHz 0x01a //工作頻率 425.0MHz

#define CH_NO_FREQ_427_5MHz 0x033 //工作頻率 427.5MHz

#define CH_NO_FREQ_430_0MHz 0x04c //工作頻率 430.0MHz

#define CH_NO_FREQ_433_0MHz 0x06a //工作頻率 433.0MHz

#define CH_NO_FREQ_433_1MHz 0x06b //工作頻率 433.1MHz

#define CH_NO_FREQ_433_2MHz 0x06c //工作頻率 433.2MHz

#define CH_NO_FREQ_434_7MHz 0x07b //工作頻率 434.7MHz

#define CH_NO_FREQ_473_5MHz 0x1ff //工作頻率 473.5MHz

#define CH_NO_FREQ_844_8MHz 0x000 //工作頻率 844.8MHz

#define CH_NO_FREQ_862_0MHz 0x056 //工作頻率 862.0MHz

#define CH_NO_FREQ_868_0MHz 0x074 //工作頻率 868.0MHz

#define CH_NO_FREQ_868_2MHz 0x075 //工作頻率 868.2MHz

#define CH_NO_FREQ_868_4MHz 0x076 //工作頻率 868.4MHz

#define CH_NO_FREQ_869_8MHz 0x07d //工作頻率 869.8MHz

#define CH_NO_FREQ_895_8MHz 0x0ff //工作頻率 895.8MHz

#define CH_NO_FREQ_896_0MHz 0x100 //工作頻率 896.0MHz

#define CH_NO_FREQ_900_0MHz 0x114 //工作頻率 900.0MHz

#define CH_NO_FREQ_902_2MHz 0x11f //工作頻率 902.2MHz

#define CH_NO_FREQ_902_4MHz 0x120 //工作頻率 902.4MHz

#define CH_NO_FREQ_915_0MHz 0x15f //工作頻率 915.0MHz(

#define CH_NO_FREQ_927_8MHz 0x19f //工作頻率 927.8MHz

#define CH_NO_FREQ_947_0MHz 0x1ff //工作頻率 947.0MHz

#ifdef RF_HIGHFREQ

#define CH_NO_FREQ CH_NO_FREQ_927_8MHz //工作頻率 927.8MHz

#else

#define CH_NO_FREQ CH_NO_FREQ_433_0MHz //工作頻率 433.0MHz

#endif

#define CH_NO_BYTE CH_NO_FREQ & 0xff // 工 作 頻 率 低 8 位 元 Byte0 01101100

#define AUTO_RETRAN 0x20 //重發數據包 Byte1.5 0

#define RX_RED_PWR 0x10 //接收低功耗模式 Byte1.4 0

#define PA_PWR__10dBm 0x00 //輸出功率-10dBm Byte1.3~2 00

#define PA_PWR_2dBm 0x04 //輸出功率+2dBm Byte1.3~2

#define PA_PWR_6dBm 0x08 //輸出功率+6dBm Byte1.3~2

#define PA_PWR_10dBm 0x0c //輸出功率+10dBm Byte1.3~2

#define HFREQ_PLL_433MHz 0x00 //工作在 433MHz 頻段 Byte1.1 0

#define HFREQ_PLL_868MHz 0x02 //工作在 868MHz 頻段 Byte1.1

#define HFREQ_PLL_915MHz 0x02 //工作在 915MHz 頻段 Byte1.1

在文檔中 中 華 大 學 (頁 54-84)

相關文件