打印

请教VRS51L3074定时器中断程序问题

[复制链接]
2048|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
asgpc|  楼主 | 2007-6-12 14:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  那位先生对RAMTRON公司的VRS51L3074有研究,请帮帮忙...小弟是个小菜鸟,用51汇编写了一个定时中断的小程序,但是没有中断产生,实在查不出程序有什么问题,没办法了.我是用Timer0做定时器,设置定时溢出中断方式工作.定时器在JTAG调试的时候已经有溢出的标志位产生,但是就是没有中断产生不知道是怎么回事,我用的是Keil uVision 3来编译产生HEX文件的.我怀疑可能是编译器的问题.具体的原代码如下:
   #include<VRS51L3074_Keil.INC>

    T250usFlag BIT 7FH ;Time flag definition(bit address area)           
    T500usFlag BIT 7EH ;Time flag definition    (bit addressable area)
    T1msFlag BIT 7DH
    T2msFlag BIT 7CH
    T4msFlag BIT 7BH
    T10msFlag BIT 7AH
    T100msFlag BIT 79H

    IncTCounterFlag EQU 7FH ;Time counter definition(common data area)
    ResvITCFlag EQU 7EH     ;Reserve the last IncTCounterFlag value       
    T10msCounter EQU 7DH
    T100msCounter EQU 7CH

        ORG 0000H
        LJMP MAIN

        ORG 001BH
        LJMP TimeInterrupt

        ORG 0090H
MAIN:    LCALL INITTIMER
        
SCAN:    LCALL TimeFlagGenerator
        AJMP SCAN
;//-------------------------------------------------------------------------
;//****************TIMER0 INITIALIZATION(定时器0初始化)*******************//
;//-------------------------------------------------------------------------
;//说明:子程序初始化timer0为16-bit自动重载中断模式下的定时器。
;//-------------------------------------------------------------------------
INITTIMER:
    MOV GENINTEN,#00H  ;Enable all interrupts
    MOV A,PERIPHEN1 ;Timer0 Enable
    ORL A,#01H
    MOV PERIPHEN1,A    ;Bit7-Enable SPI CS Line
                    ;Bit6-SPI Interface Enable
                    ;Bit5-I2C Interface Enable
                    ;Bit4-UART1 Interface Enable
                    ;Bit3-UART0 Interface Enable
                    ;Bit2-Timer2 Enable
                    ;Bit1-Timer1 Enable
                    ;Bit0-Timer0 Enable

    MOV A,INTSRC1
    ANL A,#0F7H
    MOV INTSRC1,A
    
    MOV T0T1CFG,#00H ;Bit7-Not used ;Configure timer0 as a 16-bit timer
                      ;Bit6-Timer1 Gating Enable
                      ;Bit5-Timer0 Gating Enable
                     ;Bit4-Timer1 Clock Source
                     ;Bit3-Timer1 Output Enable
                     ;Bit2-Timer1 8-bit Operating Mode Enable
                     ;Bit1-Timer0 Output Enable
                     ;Bit0-Timer0 8-bit Operating Mode Enable


    MOV T0T1CLKCFG,#00H ;Timer0 prescaler initialization

    MOV 8BH,#0D8H ;Load TH0
    MOV 8AH,#0EFH ;Load TL0

    MOV RCAP0H,#0D8H ;The reload capture register initialization
    MOV RCAP0L,#0EFH

    MOV A,INTEN1;Timer0 interrupt enable 
    ORL A,#080H
    MOV INTEN1,A

    MOV GENINTEN,#01H ;Activate global interrupts

    MOV T0CON,#04H ;Start timer0

    RET
 
;//-------------------------------------------------------------------------
;//******************TIMER INTERRUPT (定时中断服务程序)*******************//
;//-------------------------------------------------------------------------    
;//     Description:计数器每250us产生一次中断,中断服务程序定义一个存储单元
;//IncTCounterFlag用于计算250us的中断产生次数,每次中断,IncTCounterFlag加1
;//置位250us中断标志中断返回.
;//-----------------------------------------------------------------------//
TimeInterrupt:

    MOV GENINTEN,#02H ;All interrrupt are deactivated

    SETB T250usFlag ;Set 100 microsecond flag

    INC  IncTCounterFlag  ;Increase time counter flag

    MOV GENINTEN,#01H  ;Activate globe interrupt

    RETI

;!!!  下面的程序不用考虑  !!!
;//-------------------------------------------------------------------------
;//******************TIMER FLAG GENERATOR(时间标志产生器)*****************//
;//-------------------------------------------------------------------------
;//说明:时间标志产生器以250us为基本计时单位,中断服务程序每250us产生一次溢              
;//        出中断,中断服务程序设置250us时间中断标志,并使计数器IncTCounterFlag加1
;//        时间产生器程序定义了ResvITCFlag用于保存上一次计数器IncTCounterFlag的值
;//        每次程序被调用时,都将IncTCounterFlag的值与上一次的比较,存储单元的8为
;//        那一位发生改变,并设置相应的时间标志.8位地址单元的高3位未用,低5位与时间
;//        标志位的关系如下所示:
;//           Bit      Timer_Flag
;//         Bit.0            无
;//         Bit.1        500usFlag
;//         Bit.2        1msFlag
;//         Bit.3        2msFlag
;//         Bit.4        4msFlag
;//         Bit.5          未用(可用于产生8msFlag)     
;//         Bit.6          未用(可用于产生16msFlag)      
;//         Bit.7          未用(可用于产生32msFlag)       
;//        10msCounter 10msFlag
;//        100msCounter_100msFlag
;//资源占用情况:R0、R1、Timer0、内部数据存储器位寻址区79H-7EH、非位寻址区
;//        的7EH单元。
;//输出参数:T500usFlag、1msFlag、2msFlag、4msFlag、10msFlag、100msFlag位状态
;//------------------------------------------------------------------------- 
TimeFlagGenerator:
;--------------------------------------------
;--------------Timer run test ---------------
;---测试出Timer0已经启动并且产生了溢出标志---
;--------------------------------------------
;    MOV A,T0CON 
;    ANL A,#080H 
;    JZ TimeFlagGenerator 
;    MOV A,T0CON
;    ANL A,#7FH
;    MOV T0CON,A
;--------------------------------------------
    MOV A,ResvITCFlag ;Fetch the last IncTCounterFlag value
    MOV ResvITCFlag,IncTCounterFlag;Reserve the current IncTCounterFlag value in ResvITCFlag
    XRL A,IncTCounterFlag ;Which bit has been changed
;Set500usFlag:
    JNB ACC.1,Set1msFlag ;ACC.1无变化跳转
    SETB  T500usFlag ;有变化,设置500us时间标志
Set1msFlag:
    JNB ACC.2,Set2msFlag ;ACC.2无变化跳转
    SETB T1msFlag ;有变化,设置1ms时间标志
    INC T10msCounter    ;10毫秒计数器加1
    INC T100msCounter;100毫秒计数器加1
Set2msFlag:
    JNB ACC.3,Set4msFlag ;ACC.3无变化,跳转
    SETB T2msFlag ;有变化,设置2ms时间标志
Set4msFlag:
    JNB ACC.4,Set10msFlag ;ACC.4无变化,跳转
    SETB T4msFlag ;有变化,设置4ms时间标志
Set10msFlag:
    MOV A,T10msCounter ;取10毫秒计数器值
    CJNE A,#10,Set100msFlag    ;计数器值不等于10跳转
    SETB T10msFlag ;计数器值等于10,设置10毫秒时间标志
    MOV T10msCounter,#00H ;计数器值清0
Set100msFlag:
    MOV A,T100msCounter ;取100毫秒计数器值
    CJNE A,#100,GeneratorRet  ;100毫秒计数器值不等于100跳转
    SETB T100msFlag    ;计数器值等于100,设置100毫秒时间标志
    MOV T100msCounter,#00H ;100毫秒计数器值清0
GeneratorRet: ;子程序返回
    RET
    END











 万分感谢!

相关帖子

沙发
ayb_ice| | 2007-6-12 14:26 | 只看该作者

一个定时器有这么难吗,看来你真是菜鸟。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

15

帖子

0

粉丝