Board logo

标题: [求助] 新手请教一个奇怪的问题 [打印本页]

作者: johdon23    时间: 2008-8-19 11:16     标题: [求助] 新手请教一个奇怪的问题

片子是XDT512,写了一个简单的定时器中断闪烁小灯的程序,在仿真里运行程序,小灯正常闪烁。脱离仿真,正常上电运行,结果小灯不闪烁,检查发现程序只进了一次定时器中断就死掉了!请高手帮忙看看是啥原因!
作者: 康桥人    时间: 2008-8-19 17:24

你怎么知道只进了一次中断的呢?
作者: johdon23    时间: 2008-8-25 09:01

因为在中断里有控制小灯闪烁,运行后,灯就一直亮着没闪。
作者: strongchen    时间: 2008-8-25 16:51

怎么叫“在仿真里运行”?另外,你的小灯闪烁的频率大概是多少?
作者: johdon23    时间: 2008-8-28 09:14

就是编译通过之后,点“Debug”,进入调试环境,在调试环境下点击"Run"。 PS:通过BDM仿真的。

另外,之前是用定时器溢出中断出现的问题。但是我昨天又试了下用模数递减计数器,却完全没有问题!


作者: cyy833    时间: 2008-8-28 14:33

有没有喂看门狗?


作者: johdon23    时间: 2008-8-29 08:52

喂了。看门狗肯定没问题,其它程序都跑得很正常。

关键是我Debug的情况下跑得很正常,但是脱离仿真环境,正常上电启动就不正常,实在太奇怪了


作者: strongchen    时间: 2008-8-29 15:21

有些寄存器在调试模式下可以随意读写,但在正常运行模式下只能写一次。检查一下是否有这样的问题。
作者: johdon23    时间: 2008-9-10 11:33

我检查了程序,并没有用到什么特殊的寄存器。注:SMALL模式

/*************************************************


PLL初始化


*************************************************/
void PLL_init(void)
{
CLKSEL_PLLSEL=0; // 选用外部晶振作为系统时钟
PLLCTL_PLLON=0; // 锁相环电路禁止
SYNR=19; // 设置倍频系数,Fpllclk=2*4M*(19+1)/(1+1)=80M,所以总线频率为40M
REFDV=1;
PLLCTL_PLLON=1; // 锁相环电路使能
while(!CRGFLG_LOCK);
CLKSEL_PLLSEL=1; // 选用锁相环电路作为系统时钟
}


/*************************************************


CPU硬件部分初始化


*************************************************/
void periph_init(void)
{
DDRB_DDRB0 = 0; // Port B[0..3] input (SW3 1-4)
DDRB_DDRB1 = 0;
DDRB_DDRB2 = 0;
DDRB_DDRB3 = 0;
DDRB_DDRB4 = 1; // Port B[4..7] output (LED1-LED4)
DDRB_DDRB5 = 1;
DDRB_DDRB6 = 1;
DDRB_DDRB7 = 1;


LED1 = OFF; // 将LED全部关闭
LED2 = OFF;
LED3 = OFF;
LED4 = OFF;


DDRP_DDRP0 = 0; // Port BP_0 and BP_1 equals input
DDRP_DDRP1 = 0; // SW1 and SW2


PUCR_PUPBE = 1; // Turn on the pullups for SW3 (1-4)


DDRJ_DDRJ7=0; // PJ7定义为输入
PPSJ_PPSJ7=0; // 下降沿触发中断
PIEJ_PIEJ7=1; // PJ7中断使能
}

/*************************************************


定时器初始化程序


*************************************************/
void Timer_init(void)
{
TSCR1_TEN=0; // 禁止定时器
TSCR1_TFFCA=1; // 快速清除标志位
TSCR2_TOI=1; // TOF置1时申请硬件中断
TSCR2_PR=3; // 预分频系数为8
//TSCR2_PR1=1;
//TSCR2_PR0=1;
TCNT=0x1000; // 设置定时计数器初值
TSCR1_TEN=1; // 使能定时器
}

/*************************************************

定时器溢出中断程序


*************************************************/
#pragma CODE_SEG NON_BANKED
interrupt void TimerOverflow_ISR(void)
{
DisableInterrupts;
TFLG2_TOF=1; // 写1清标志位
TCNT=0x1000; // 重新载入定时计数器初值
LED4=~LED4;
EnableInterrupts;
}
#pragma CODE_SEG DEFAULT

void main(void)
{
uint intTempData;
uchar charTempData;

PLL_init();
periph_init();

Timer_init();

EnableInterrupts; // 全局中断使能
for(;;)
{


}
}

[此贴子已经被作者于2008-9-10 11:33:56编辑过]






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0