打印

SH66P12的定时器1怎么不能工作?

[复制链接]
2024|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zqg2008877|  楼主 | 2008-2-17 14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zqg2008877|  楼主 | 2008-2-17 21:16 | 只看该作者

具体情况!

我同时用SH66P12的TIMER0和TIMER1,同样的设置,同样的程序,同时用的时候,只有TIMER0工作,TIMER1不工作,请问是那里出了问题?

使用特权

评论回复
板凳
warm_ice| | 2008-2-18 09:18 | 只看该作者

这样

这2个定时器的设置基本上是一致的,如果设置正确,会正常工作.
我想最有可能是中断处理的不好,中颖4位单片机进入中断后,中断使能标志IE会被硬件清零,退出中断时要记得再次打开中断(包括TIMER0和TIMER1中断),另外,在中断内部清除中断标志IRQ时,请只清除相应中断对应的标志位,不要将IRQ全部清零,以免影响到其它中断.
如果以上还不能解决您的问题,请将程序贴上来,再细分析,谢谢!

祝 新年快乐,万事如意!

使用特权

评论回复
地板
zqg2008877|  楼主 | 2008-2-19 00:22 | 只看该作者

具体程序框架,请指教!

您好:斑竹,我的问题是这样的:
我用定时器TIMER0做基准时钟。TIMER1做一些事件处理,PORTB接口中断也做一些时间处理。
我现在的情况是:只有TIMER0可以进中断,TIMER1中断,PORTB中断都进不去。

程序框架是这样的:

IE        EQU    00H
IRQ        EQU    01H
T0M    EQU    02H
T1M    EQU    03H
T0L        EQU    04H
T0H        EQU    05H
T1L        EQU    06H
T1H        EQU    07H

PORTA    EQU    08H
PORTB    EQU    09H
ORG    0000H
JMP        RESET
JMP        EXT_IRQ        ;外部中断入口
JMP        TIMER0_IRQ        ;TIMER0入口
JMP        TIMER1_IRQ        ;TIMER1入口
JMP        PORTB_IRQ        ;PORTB中断入口

EXT_IRQ:
RTNI

TIMER0_IRQ
    ANDIM        IRQ,        1011B    ;清除中断标志
    ;LDI            PORTA,    1111B    ;电亮端口A的灯,测试是否进如中断
    ORIM        IE,        0100B    ;设置中断标志位
RTNI

TIMER1_IRQ
    ANDIM        IRQ,        1101B    ;清除中断标志
    ;LDI            PORTA,    1111B    ;电亮端口A的灯,测试是否进如中断
    ORIM        IE,        0010B    ;设置中断标志位
RTNI

PORTB_IRQ
    ANDIM        IRQ,        1110B    ;清除中断标志
    LDI            PORTA,    1111B    ;电亮端口A的灯,测试是否进如中断
    ORIM        IE,        0001B    ;设置中断标志位

RTNI

RESET:
    LDI        IRQ,    0000B
    LDI        IE,        0000B
    LDI        PORTB,0000B
    
    LDI        T0M,    07H            ;TIMER0初始化
    LDI        T0L,        00H
    LDI        T0H,    08H

    LDI        T1M,    07H            ;TIMER1 初始化
    LDI        T1L    ,    00H
    LDI        T1H    ,    08H

    LDI        IE,        0111B        ;打开所有中断

MAIN:        ;主程序循环
    NOP
    JMP        MAIN
RTNI

END

使用特权

评论回复
5
zqg2008877|  楼主 | 2008-2-19 00:25 | 只看该作者

补充一点调试过程!

我用IDE66仿真,发现用WATCH观察的单步仿真的结果都不对,
比如,LDI IE,0111B,这个指令,WATCH中的IE根本没有变化.

我怀疑是不是IDE66 的V2.0调试软件有问题?

因为我以前用V1.0的编译程序时,编译宏就不能通过,下载个V2.0就可以编译通过了!


谢谢!

使用特权

评论回复
6
warm_ice| | 2008-2-19 10:44 | 只看该作者

这样

先说一下程序中的几个问题:
1.任何中断,进入后一定要首先保存累加器A的值,退出时最后一条是读出保存的累加器A,做法是这样:
中断:
   STA  TEMP   ,00H     ;TEMP为一个临时寄存器,需要您自己定义
   ...
   ...
   LDA  TEMP   ,00H
   RTNI


2.任何中断产生后,IE标志会被硬件清零,这样,退出中断时要重新置IE标志.拿您的TIMER0中断来说,置IE标志时,用了这条指令:
ORIM        IE,        0100B    ;设置中断标志位
这样调协后,只能将TIMERO中断置起,因为进入中断时IE已经被硬件清零了.如果需要用到其它2个中断,要这样设置:
ORIM        IE,        0111B
或者
LDI         IE,        0111B
这样就可以了.

另外,仿真工具IDE66的问题是这样的,单步运行时,虽然不进入中断,但中断同样会产生,如同前面所说的,中断产生后,IC内部会清零IE,所以你看到IE始终为0.

使用特权

评论回复
7
zqg2008877|  楼主 | 2008-2-20 00:00 | 只看该作者

谢谢!

还是不能工作,我再调试调试.

使用特权

评论回复
8
iammercy| | 2008-2-22 11:06 | 只看该作者

RE:例子

以SH69P43為例,對ROM空間進行劃分
         list    P = 69P43            ;core processor
    romsize = 3072            ;core ROM size
    include        Ram_SH69P43.inc    ;system RAM resource
    include        Ram_User.inc    ;user RAM resource
    include        OS_cfg.inc    ;System constance 
    org        0000h
;interrupt entrance    
      jmp        POWERON        ;Entrance to POWERON
    jmp        $        ;Entrance to ADC ISR
    jmp        ISR_TIMER0    ;Entrance to Timer0 ISR
    jmp        ISR_TIMER1    ;Entrance to Timer1 ISR
    jmp        ISR_PORT        ;Entrance to Port ISR
;bank0 rom document list                     ;2K ROM size
    org        0005h        
    include        Main.asm        ;main looping    
    include        Sys_ISR.asm    ;ISR routine
    jmp        $        
         org        07ffh
    jmp        $
;bank1 rom document list                  ;1K ROM size
    org        0800h    
    jmp        $        
    org        0Bffh
    jmp        $    
    end


在Ram_User.inc定義一些常數:
    INT_ADC                EQU    1000b
    INT_Timer0            EQU    0100b
    INT_Timer1            EQU    0010b
    INT_Port                     EQU    0001b

用于中斷現場保護的RAM
在Ram_User.inc自定義zAcc和zIEBackup這2個RAM用于保護現場與恢復現場, 因為程序執行過程中發生中斷會跳到中斷服務子程序
此時必須備份MCU的累加器,由于進入中斷后系統中斷會被清0,所以執行完中斷后要重新設置系統中斷,最后恢復MCU累加器的值,例如:

    

在main.asm中開Timer0和Timer1
PowerOn:
    ...
    ...
    andim        rzIRQ        ,0000b        //開Timer0和Timer1中斷
    ldi        zIEBackup    ,INT_Timer0 + INT_Timer1    
    sta        rzIE        ,0        
Main:
    ...
    ...
    jmp Main

在Sys_ISR.asm中處理中斷事件
ISR_TIMER0:
        sta        zAcc    ;保存MCU的累加器
        andim             rzIRQ    ,INT_Timer0^0fh
        ;---------------------------------------
        …
        …
        ;---------------------------------------
ISR_TIMER0_Over:    
        lda        zIEBackup        ;重置中斷
        sta        rzIE                            ;
        lda        zAcc    ;恢復MCU的累加器
        rtni  

ISR_TIMER1:
        sta        zAcc    ;保存MCU的累加器
        andim             rzIRQ    ,INT_Timer1^0fh
        ;---------------------------------------
        …
        …
        ;---------------------------------------
ISR_TIMER1_Over:    
        lda        zIEBackup        ;重置中斷
        sta        rzIE                            ;
        lda        zAcc    ;恢復MCU的累加器
        rtni  





使用特权

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

本版积分规则

8

主题

23

帖子

0

粉丝