摘 要:汽车远程无匙进入(RKE)方案对于汽车的配置来说,已经作为一种标准配置,成为汽车不 可或缺的部分。汽车远程无匙进入(RKE)对于提高汽车的防盗性、控制性有重要意义。本文介绍了一种基于飞思卡半导体(前摩托罗拉半导体)公司的MC68HC908RF2汽车远程无匙进入(RKE)
方案。
关键词:无匙进入(RKE);高频发射(UHF);微控制器(MCU)
简介
MC68HC908RF2是M68HC08家族中的一员,采用增强型内核,是专为无匙进入系统(RKE)的发射端设计的一款性价比较高的微控制器。它的主要特点如下:
⑴ 高性能的M68HC08结构
⑵ 在3.3V供电时的内部总线频率为4MHz
⑶ 2K字节可加密闪速存储器
⑷ 128字节的片上随机存储器
⑸ 2个16位的定时器
⑹ 12个通用IO口,其中6个具有键盘唤醒功能
⑺ 1个外部中断管脚,内部有上拉电阻
⑻ 1个高频发射模块
系统框图
原理图如图1示。
图1 原理图(略)
⑴ 电源系统
系统采用3V的钮扣电8池供电,MC68HC908RF2具有停止模式(STOP MODE),功耗非常低。
⑵ 键盘扫描
系统接入3个键盘,分别作为上锁、解锁、寻车功能。接入PORTA口的A1、A2、A3。当按下任一键盘时将CPU08唤醒,并进入相应的中断处理程序中。处理完毕后,重新进入停止模式(STOP
MODE)。
⑶ LED指示
将PORTA口的A7作为输出,控制LED的点亮、熄灭。
⑷ 高频发射
高频发射模块的相应功能管脚如图2。
图2 高频发射模块(UHF)功能管脚(略)
各功能管脚的作用如下:
VCC:电源管脚。
MODE:模式选择,接高电平时选择FSK模式,接低电平时选择OOK模式,在本系统中采用OOK方式,MODE接低电平。
ENABLE: 高频发射模块(UHF)允许,当在该管脚接高电平时,高频发射模块(UHF)允许工作,在该管脚接低电平时,禁止高频发射模块(UHF)工作,在本系统中,ENABLE管脚与PTA0相连,用PTA0来控制高频发射模块(UHF)的状态。
DATA:数据输入端与PTB2相连。
BAND:选择频段,当接高电平时选择315MHz和434MHz,如果选择868MHz时,BAND管脚接低电平。在系统中采用315
MHz发射频率。
RFOUT:高频输出管脚,为了能够获得最大输出发射功率需在该管脚外部配接少量元件。
GNDRF:接低电平。
REXT:配接12K的下拉电阻。
XTA1,XTA2:如果选择发射的频率为315MHz,配接9.84375 MHz的晶振,如果选434MHz的发射频率配接13.56
MHz的晶振。
DATACLK:数据同步时钟,与PTB3相连。
CFSK:OOK和FSK模式选择,悬空选择OOK模式,接低电平选择FSK模式。
为了降低系统的功耗,只用在需要发送数据时,才将高频发射模块(UHF)置为有效,其余时刻将高频发射模块(UHF)置为无效。典型的发射时序列如图3所示。
图3 典型发射时序(略)
系统软件框图
图3 软件框图(略)
中断处理程序流程图如图4。
图4 中断流程图(略)
软件清单
$Include 'C:\pemicro\ics08rkz\rk2regs.inc'
;定义起始地址
RAMStart EQU $0080 ;数据存储区起开始地址
RomStart EQU $7800 ;程序存储区起开始地址
VectorStart EQU $FFF2 ;中断向量表
;定义A口各位的定义
; Porta A
PLLEn equ 0 ; UHF模块控制位
Row0 equ 1 ; 键盘占用PORTA口的PA.1,PA.2,PA.3
Row1 equ 2 ;
Row2 equ 3 ;
Led equ 7 ; Led占用PORTA口的PA.7
ACKK EQU 2
;定义A口各位的方向:PA.0和PA.7定义为输出,其余定义为输入
DDRAInit equ %10000001 ;
PortAInit equ %11111111 ;
;定义B口各位的定义
; Porta B
Data equ 2 ; 数据输出
DClk equ 3 ; 数据时钟
DDRBInit equ %00000100 ;
PortBInit equ %00000000 ;
org RamStart
;以下为发射数据存储区
Buffer0 DS 1 ;
Buffer1 DS 1 ;
Buffer2 DS 1 ;
Buffer3 DS 1 ;
Buffer4 DS 1 ;
Buffer5 DS 1 ;
Buffer6 DS 1 ;
CRC DS 1 ;
BitCount DS 1 ;
LastRow DS 1 ;
LastCol DS 1 ;
TxCnt DS 1 ;
TEMP DS 1 ;
; Costanti
Dly300ms equ $03 ;300ms@8Mhz
MinTx equ $01 ;Minimum number of frame
transmitted;//03
FrameDly equ $ff ;Delay between frames
(771*FrameDly cycles)
org RomStart
main
mov #%00000011,CONFIG ;禁止 COP 允许 Stop 指令
rsp ;初始化堆栈指针
clra ;
clrx
clr buffer0 ;
clr buffer1 ;
clr buffer2 ;
clr buffer3 ;
clr buffer4 ;
clr buffer5 ;
clr buffer6 ;
clr crc ;
clr BitCount ;
clr LastRow ;
clr LastCol ;
clr TxCnt ;
clr TEMP;
WarmStart
mov #DDRAInit,DDRA ;初始化PORTA口
mov #PortAInit,PORTA ;
bset led,porta
mov #DDRBInit,DDRB ;初始化PORTB口
mov #PortBInit,PORTB ;
mov #%00100011,INTKBSR ;
mov #%00011110,INTKBIER ;
BSET ACKK,INTKBSR ;
mov #%00100001,INTKBSR ;
StopProc
bclr pllen,porta
STOP
bra StopProc
KeybIRQ
brclr 7,INTKBSR,KeyboardProc ;检查是否为外部中断
jmp IRQProc ;不是有效的键盘中断,
退出
KeyboardProc bset 2,INTKBSR ;清除键盘中断标志
clrx
BCLR Led,PORTA ;电亮LED
WaitRow
lda PORTA ;读取PORTA口数据
coma ;
and #%00011110 ;
lsra ;
bne RowOk ;
dbnza $ ;
dbnzx WaitRow ;如果PORTA口数据为0,一直读取,直到延时时间到
jmp ExitKeyb 延时到
RowOk
sta LastRow ;Save Row number
clr INTKBIER ;Clear Keyboard interrupt enable bits
lda #%00011110 ;All rows to 1
ora DDRA ;
sta DDRA ;
lda #%00011110 ;
ora PORTA ;
sta PORTA ;
clrx ;
mov #$10,BitCount ;
ColLoop
lda #$40 ;
KeyLoop
dbnzx KeyLoop ;
dbnza KeyLoop ;
;组织待发射数据
SetKey
lda lastrow
lsla
lsla
lsla
lsla
sta Buffer4 ;Init Key Code
LDA ID0
STA Buffer0 ;
lda ID1 ;Init ID
sta Buffer1 ;
lda ID2 ;
sta Buffer2 ;
lda ID3 ;
sta Buffer3 ;
lda #Dly300ms ;Attendi 350ms
psha ;
clra ;
clrx ;
ToggleDly
dbnzx $ ;[3*256=768]
dbnza ToggleDly ;[256*771]
dbnz 1,SP,ToggleDly ;[197379*Dly300ms]
pula ;
lda PORTA ;Check if key still down
and #%01100000 ;
nsa ;
lsra ;
bne NoToggle ;
bset 0,Buffer0 ;键盘没有释放
NoToggle
;
lda #$01 ;
add Buffer6 ;
sta Buffer6 ;
clra ;
adc Buffer5 ;
sta Buffer5 ;
clc
lda Buffer6 ;
and #$0F ;
beq NoRotate ;
tax
NextRotate
lda Buffer5 ;
rora ;
ror Buffer0 ;
ror Buffer1 ;
ror Buffer2 ;
ror Buffer3 ;
ror Buffer4 ;
ror Buffer5 ;
dbnzx NextRotate ;
NoRotate
ldhx #Buffer0 ;
lda ,X ;
eor 1,X ;
sta 1,X ;
eor 2,X ;
sta 2,X ;
eor 3,X ;
sta 3,X ;
eor 4,X ;
sta 4,X ;
eor 5,X ;
sta 5,X ;
clr CRC ;
ldhx #Buffer0 ;
NextCRCByte LDA ,X
ADD BUFFER1
ADD BUFFER2
ADD BUFFER3
ADD BUFFER4
ADD BUFFER5
ADD BUFFER6
STA CRC
;发送程序
mov #DDRAInit,DDRA ;初始化A口方向寄存器
mov #PortAInit,PORTA ;初始化A口
mov #%00011110,INTKBIER
mov #MinTx,TxCnt ;一共发送3帧相同的数据
bset PLLEn,PORTA ;允许UHF模块
ldx #FrameDly ;
clra ;
FrameBlank
dbnza $ ;
dbnzx FrameBlank
lda #$0c
;********产生24个TE******************************* *******************
HX301
BCLR Data,PORTB
mov #%00110000,TASCR
ldhx #$0200
sthx TAMODH ;
bclr 5,TASCR ;计数器开始计数
brclr 7,TASCR,* ;Wait
BSET Data,PORTB
mov #%00110000,TASCR
ldhx #$0214
sthx TAMODH ;
bclr 5,TASCR ;计数器开始计数
brclr 7,TASCR,* ;Wait
dbnza HX301
bclr Data,portb
lda #$09
HX302 mov #%00110000,TASCR
ldhx #$023e
sthx TAMODH ;
bclr 5,TASCR ;计数器开始计数
brclr 7,TASCR,* ;Wait
dbnza HX302
NextFrame
ldhx #CRC ;指向CRC的RAM地址
psha ;
NextTxByte
lda #$08 ;
sta 1,SP ;
NextTxBit lda 0,X ;将X+0指向的地址的内容
ACC中
rora ;带进位位右移
ror 0,X ;将X+0的地址的内容带进位
右移后结果保存在X+0的地址中
bcs Bit1 ;C位为1跳转,电平的持续时间为(1/3)T
bit0 mov #%00110000,TASCR ;mov #%00110111,TASCR
bset data,portb
pshx
PSHH
ldhx #$425
sthx tmodh
PULH
pulx
bclr 5,TASCR
brclr 7,TASCR,*
mov #%00110000,TASCR
pshx
PSHH
ldhx #$1E0
sthx tmodh
PULH
pulx
bclr data,portb
bclr 5,TASCR
brclr 7,TASCR,*
jmp bit2
bit1 mov #%00110000,TASCR
pshx
PSHH
ldhx #$1E0
sthx tmodh
PULH
pulx
bset data,portb
bclr 5,TASCR
brclr 7,TASCR,*
mov #%00110000,TASCR
pshx
PSHH
ldhx #$425
sthx tmodh
PULH
pulx
bclr data,portb
bclr 5,TASCR
brclr 7,TASCR,*
bit2 dbnz 1,SP,NextTxBit ;
decx ;
cpx #Buffer0-1 ;
bne NextTxByte ;
pula ;Free stack
clra ;
dbnza $ ;
bset led,porta
tst TxCnt ;
beq ChkKey ;
dbnz TxCnt,NextFrame ;
;检查键盘是否释放
ChkKey lda PORTA ;
coma ;
and #%00011110 ;
BNE CHKKEY;
bclr PLLEn,PORTA ;禁止UHF模块
ExitKeyb mov #DDRAInit,DDRA ;
;mov #PortAInit,PORTA ;
mov #%00011110,INTKBIER ;
WaitKeyUp lda PORTA ;
coma ;
and #%00011110 ;
bne WaitKeyUp ;
bset ACKK,INTKBSR;
bset Led,PORTA ;
tst 5,SP ;Test Return Address Low
bne DecLow ;
dec 4,SP ;
DecLow dec 5,SP ;
rti ;
IRQProc bset 6,INTKBSR;Reset IRQ Flag
rti
DUMMY_INT:RTI
ID0 fcb $04
ID1 fcb $05
ID2 fcb $06
ID3 FCB $07
org VectorStart
dw DUMMY_INT ; ICG 中断
dw DUMMY_INT ; TIM1 溢出中断
dw DUMMY_INT ; TIM1 通道1中断
dw DUMMY_INT ; TIM1通道0中断
dw KeybIRQ ; 外部中断/键盘中断共享一个
向量
dw DUMMY_INT ; SWI 中断
dw main ; 复位向量
END
|