智能车制作

标题: 求指教! [打印本页]

作者: 709632728    时间: 2013-3-20 16:37
标题: 求指教!
本人在调一块开发板,遇到一个很奇怪的问题,程序编写定时器1S灯闪烁1次,点仿真器上的运行、复位完全正确运行,可是同样的程序按板子上的复位键,定时不准,大概到了2S,再按软件上的复位、运行又对,为什么这样呢?

作者: 一棵小草    时间: 2013-3-20 18:34
板子是你自己焊接的吗?
作者: 709632728    时间: 2013-3-20 20:10
一棵小草 发表于 2013-3-20 18:34
板子是你自己焊接的吗?

不是!

作者: 709632728    时间: 2013-3-20 20:12
而且是涉及到定时器的程序都这样,如果程序编的是1S,执行时就会变2S,反正就是会变慢!但是软件仿真时运行完全正确!
作者: 709632728    时间: 2013-3-20 20:13
有程序,大家可以看看!

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "cpu.h"


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

//实现1秒精确定时,4个LED灯1S亮。1S灭

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

void main(void) {
   

    CPMU_PEE_8MHz();                                        //设置fbus=4MHz
    TIM0_TSCR1_TEN=1;                                       //允许定时器正常工作
    TIM0_TSCR2_PR2=1;
    TIM0_TSCR2_PR1=1;
    TIM0_TSCR2_PR0=1;                                       //设置ftc=fbus/128=32us  
    TIM0_TSCR2_TOI=1;                                       //允许溢出
    TIM0_TCNTHi=0x85;
    TIM0_TCNTLo=0xED;
    DDRR = 0x0F;                                             /* PORTR 0~3 = output */
    PTR = 0x0F;                                              //刚开始的时候让灯灭         
                                                            //设置初值十进制为34285,增加一次32us   
                                                            /*故65535-34285=31250 31250X32=1000000us=1s */
EnableInterrupts;                                           //开总中断


  for(;;) {
                                                            //_FEED_COP(); /* feeds the dog */
  }                                                         /* loop forever */
                                                             /* please make sure that you never leave main */
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED                      //定时器中断服务程序
interrupt VectorNumber_Vtim0ovf void timer0(void){


    TIM0_TCNTHi = 0x85;
    TIM0_TCNTLo = 0xED;   
    PTR = ~PTR ;
    TIM0_TFLG2_TOF = 1 ;                                       //清空标志
}
  
//#pragma CODE_SEG DEFAULT

作者: 一棵小草    时间: 2013-3-20 21:01
定时中断里面写的程序有点复杂,超出了定时的时间
作者: 709632728    时间: 2013-3-22 16:03
一棵小草 发表于 2013-3-20 21:01
定时中断里面写的程序有点复杂,超出了定时的时间

呵呵,问题已经找出,是那个定时器写初值的时候只能用于仿真,实际运行不支持初值的写入,不可对TCNT寄存器进行写操作!
谢谢您的热心帮助!希望您也能从中学到一些知识!

作者: 一棵小草    时间: 2013-3-24 15:41
不客气,大家相互学习,共同进步




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2