Chinaunix首页 | 论坛 | 博客
  • 博客访问: 594015
  • 博文数量: 99
  • 博客积分: 5128
  • 博客等级: 大校
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-27 19:40
文章分类

全部博文(99)

文章存档

2012年(3)

2011年(5)

2010年(4)

2009年(31)

2008年(56)

分类:

2008-12-10 15:18:00

EMC系列单片机有多种型号,每个IC由于设计方面的原因,各有不同,例如 EM78P153 的中断向量位置 跟 EM78P259 ,EM78P447等都不相同,如果只用一种IC开发的话,那倒问题不大,如果工作用用到各种IC的话,来回切换,给写程序带来了不便。于是我们想建立一个模板,结合宏的强大功能,方便的初始化IC,迅速建立运行环境,其实这里做的,有点类似 C 里面的 runtime 初始化部分,也类似bootloader,总之,目的就是快速建立环境,我们只需要从 main 函数开始写,而不需要花精力在芯片初始化部分。嘿嘿,理论上来这样算是比较方便的,但不是究极的方便,看过UBOOT就会有感触,为啥人家能支持那么多CPU,说到尾还是利用了宏定义的强大功能。当然,我在构思是否能利用一下shell的强大功能实现一个特殊的软件,恩,思考一下……
 
宏方面的使用原理,其实不难,本质上跟C是一样的,可以参看我之前的笔记:
 
道理上来说,这东西不难,关键是比较烦,得有人去学写繁琐的宏定义,好吧,我吃螃蟹了,搞了一大堆东西出来,非常的方便。本文章所有东西原创。
 
主程序:EM78P153.DT

/*--------------------------------------------------------------------------
        1. 项目 : EM78P153程序框架
        2. 作者 : Etual / Etual@163.com
        3. 日期 : 2008 - 12 - 10
        4. 编译平台 : WicePlus2.6081015
---------------------------------------------------------------------------*/
     /*
      * 包含下面用到的宏定义符号
      */
     include "head153.h"

;---------------------------------------------------------------------------------
     /*
      * 寄存器定义
      */
ABUFF EQU 0x10
PSWBUFF EQU 0x11
IntrCnt EQU 0x12

/*-------------------------------------------------------------------------------*/
               /*
                * 中断向量
                */
               ORG 0X00
               jmp start
               ORG 0X08
               jmp int_tcc
               
               ORG 0x20
               /*
                * TCC 中断服务函数
                */
INT_TCC:
               mov abuff,a
               swap abuff
               swapa psw
               mov pswbuff,a
              /*
               * 产生几个基准时间
               */
               inc IntrCnt
;---------------------------------------------------------------------
              /*
               * 在这里添加需要的中断函数
               */
               
               nop
;---------------------------------------------------------------------
int_end:
               bc 0x0f,0 ; Clear TCC interrupt flag
               swapa pswbuff
               mov psw,a
               swapa abuff
reti



               
;---------------------------MAIN PROGRAM------------------------------
start:
               call SysInit
loop:
              /*
               * 主循环,添加实际项目的功能模块
               */
              
               com 0x06
              ;-----------------------------
HaltProc:
               eni
               wdtc
               /*
                * 大循环周期 0.128ms * 128 = 16.3ms
                */
               mov a,@128
               sub a,Intrcnt
               jbs psw,c
               jmp HaltProc
               clr Intrcnt
               jmp loop





/*---------------------------------------------------------------------------------
               功能 : 系统初始化。
---------------------------------------------------------------------------------*/
SysInit:
               disi
           ; jbs psw,4 ; 程序看门狗复位纠错处理
           ; jmp error_proc

InitSRAM:
               /*------------------------------------------------
                               上电清空所有的RAM
               调用格式    :
                       CLEAR_ALL_RAM FROM,TO
               宏参数定义    :
                       FROM: 开始地址
                       TO    : 结束地址
               -------------------------------------------------*/
               nop
               CLEAR_ALL_RAM

InitCont:
               /*-------------------------------------------------
                               TCC定时器设置
               调用格式    :
                       CONT_SETUP MACRO arg1
               宏参数定义    :
                       TCC_1_1 ~ TCC_1_256 预分频
                    TCC_SRC_INT / TCC_SRC_EXT TCC源选择 INT:内部时钟,EXT 外部计数
                    TCC_EDGE_RISE / TCC_EDGE_FALL 触发弦选择 RISE 上升弦,FALL 下降弦
                    TCC_PRESCAL / WDT_PRESCAL 预分频分给TCC还是WDT
               -------------------------------------------------*/
               nop
               CONT_SETUP TCC_PRESCAL | TCC_1_1 | TCC_SRC_INT
InitIO:
               /*-----------------------------------------------
                            IO 口方向以及上下拉设置
               IOW MACRO ARG1,ARG2
                               IOR REG1,REG2 IOR REG2 -> REG1
                               IOW REG1,REG2 IOW REG2 -> REG1
               ------------------------------------------------*/
               nop
               mov a,@0X00
               iow 0x05 ; port5 I/O
               mov a,@0x00
               iow 0X06 ; port6 I/O
               mov a,@0XFF
               iow 0x0b ; PULL DOWN 0:ENABLE, 1:DISABLE
               mov a,@0X00
               iow 0x0c ; OPEN DRAIN 0:DISABLE, 1:ENABLE
               mov a,@0xff
               iow 0X0D ; PULL HIGH 0:ENABLE, 1:DISABLE
InitWatchdog:
               /*------------------------------------------------
                                 看门狗设置
               WDT_SETUP MACRO arg1
               宏参数定义:
                       WDT_ENABLE / WDT_DISABLE 允许看门狗
                    ROC_ENABLE / ROC_DISABLE R OPTION
                    EIS_IO / EIS_INT P60 作为IO还是外部中断
               -------------------------------------------------*/
               nop
               WDT_SETUP WDT_ENABLE | ROC_DISABLE | EIS_IO
InitInterrupt:
               /*------------------------------------------------
                                中断设置
               IMR1_SETUP MACRO arg1
                    argument : IMR_TCC /IMR_EXT
               ------------------------------------------------*/
               nop
               IMR1_SETUP IMR_TCC
ret

宏定义 head153.h

 

/*--------------------------------------------------------------------------
        1. 项目 : EM78P153 宏定义
        2. 作者 : Etual / Etual@163.com
        3. 日期 : 2008 - 12 - 10
---------------------------------------------------------------------------*/


/*****************************************************
                   寄存器名字定义
*****************************************************/
R0 == 0X00
TCC == 0X01
PC == 0X02
PSW == 0X03
C == 0
DC == 1
Z == 2
POWERDOWN == 3
TIMEOUT == 4
R4 == 0X04
P5 == 0X05
P6 == 0X06
P7 == 0X07
R8 == 0X08
R9 == 0X09
RA == 0X0A
RB == 0X0B
RC == 0X0C
RD == 0X0D
RE == 0X0E
RF == 0X0F
;-----------------------------------------------------
IOC5 == 0X05
IOC6 == 0X06
IOC7 == 0X07
IOC8 == 0X08
IOC9 == 0X09
IOCA == 0X0A
IOCB == 0X0B
IOCC == 0X0C
IOCD == 0X0D
IOCE == 0X0E
IOCF == 0X0F
;-----------------------------------------------------

/*****************************************************
* 端口变化唤醒 *
*****************************************************/
IO_CHANGE_WAKEUP MACRO
          mov a,@0b00001110 ; 设置WDT预分频
          contw
          wdtc ; 清看门狗
          ior 0x0e
          and a,@0x7f ; 关闭看门狗
          iow 0x0e
          mov a,@0xff
          mov 0x06,0x06 ; 保存端口数据
          ior 0x0f
          or a,@0x02 ; 置能端口变化中断
          iow 0x0f
          disi ; 关闭全局中断
          nop
          slep ; 睡眠
          nop
          wdtc
ENDM

/*****************************************************
* CONT REGISTER *
*****************************************************/
TCC_1_1 == 0X08 /* TCC PRESCALE 1:1 (DEFAULT) */
TCC_1_2 == 0X00 /* TCC PRESCALE 1:2 */
TCC_1_4 == 0X01 /* TCC PRESCALE 1:4 */
TCC_1_8 == 0X02 /* TCC PRESCALE 1:8 */
TCC_1_16 == 0X03 /* TCC PRESCALE 1:16 */
TCC_1_32 == 0X04 /* TCC PRESCALE 1:32 */
TCC_1_64 == 0X05 /* TCC PRESCALE 1:64 */
TCC_1_128 == 0X06 /* TCC PRESCALE 1:128 */
TCC_1_256 == 0X07 /* TCC PRESCALE 1:256 */
                                                              /* 1/FOSC*PRESCAL*256 */
WDT_1_1 == 0X00
WDT_1_2 == 0X01
WDT_1_4 == 0X02
WDT_1_8 == 0X03
WDT_1_16 == 0X04
WDT_1_32 == 0X05
WDT_1_64 == 0X06
WDT_1_128 == 0X07
/****************************************************/
TCC_SRC_INT == 0X00 /* INTERNAL INSTRUCTION CLOCK */
TCC_SRC_ERX == 0X20 /* EXTERNAL CLOCK(TCC/P54 PIN)(DEF) */
TCC_EDGE_RISE == 0X00
TCC_EDGE_FALL == 0X10
TCC_PRESCAL == 0X00
WDT_PRESCAL == 0X08
/****************************************************/
CONT_SETUP MACRO ARG1
          mov a,@ARG1
          contw
ENDM

/*****************************************************
* WDT ENABLE *
*****************************************************/
WDT_ENABLE == 0x80
WDT_DISABLE == 0x00
ROC_ENABLE == 0X01
ROC_DISABLE == 0X00
EIS_IO == 0X00
EIS_INT == 0X40
/****************************************************/
WDT_SETUP MACRO ARG1
         mov a,@ARG1
         iow 0x0e
ENDM



/*****************************************************
* INTERRUPT MASK REGISTER *
*****************************************************/
IMR1 == 0X0F
IMR_TCC == 0X01
IMR_ICI == 0X02
IMR_EXT == 0X04
IMR1_ALL_DISABLE == 0X00
IMR1_ALL_ENABLE == 0XFF
/****************************************************/
IMR1_SETUP MACRO ARG1
          mov a,@ARG1
          iow 0x0f
ENDM

/*****************************************************
* CLEAR ALL RAM *
*****************************************************/

CLEAR_ALL_RAM macro
          mov a,@0x10
          mov 0x04,a
clr_ram:
          clr 0x00
          inc 0x04
          mov a,@0x2f
          and a,0x04
          jbs 0x03,2
          jmp clr_ram
ENDM

阅读(5960) | 评论(7) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-07-29 09:19:05

恩,很不错!!!

chinaunix网友2009-06-14 18:55:57

楼上,不要激动,先检讨一下自己。 1,为什么人家要帮你?至少需要等价交换吧?先问问自己贡献过什么再说吧。 2,简单?什么为之简单?我写的这些都觉得很简单了啊,而且都是为了方便才研究出来的东西,我并不觉得难。 我不知道你怎么定义那个简单。我当年刚毕业就进现在的公司了,刚开始接触EMC单片机,在学校就学过C51的课程,课外没有做过任何的练习。 也是从点LED,点数码管开始学的。你看到人家今天能写程序了,你有没有想过人家当初花了多少工夫???? 你有没有检讨一下自己花了多少工夫?才1天两天写不出程序就在那里叫,叫有用吗?叫有用的话我也叫啊?有人教我吗? 笑话。 两点意见 如果想学下去的话,就先收掉现在的浮躁情绪,定心下来学。 不想学的话干脆就不要玩单片机了,看着都觉得辛苦,做的那么辛苦干嘛?

chinaunix网友2009-06-13 15:31:30

拿出来看看会死啊,包括我买的仿真器,他们公司有工程师有也以前用过的一些程序,发给我看看都怕,真搞不懂,为什么这么小气...

chinaunix网友2009-06-13 15:27:07

我靠,难道全世界就一个人会写义隆的153吗?下面的网页全是转这个人写的,难道就没有人会写简单点的?小点的跑马灯程序?

chinaunix网友2009-06-13 14:52:03

高手啊,发个跑马灯程序到HJXK@163.COM我参考参考吧,现在有个仿真器,但无从下手,不知道怎么写啊.