MC68HC908RF2在汽车远程无匙进入系统中的应用
[复制链接]
简介 MC68HC908RF2是M68HC08家族中的一员,采用增强型内核,是专为无匙进入系统(RKE)的发射端设计的一款性价比较高的微控制器。它的主要特点如下: ⑴ 高性能的M68HC08结构 ⑵ 在3.3V供电时的内部总线频率为4MHz ⑶ 2K字节可加密闪速存储器 ⑷ 128字节的片上随机存储器 ⑸ 2个16位的定时器 ⑹ 12个通用IO口,其中6个具有键盘唤醒功能 ⑺ 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所示。 图2 高频发射模块(UHF)功能管脚 图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
|