打印

匠人逼良为**,菜农拒收裤子~~~

[复制链接]
楼主: hotpower
手机看帖
扫描二维码
随时随地手机跟帖
21
栏杆| | 2009-1-18 16:51 | 只看该作者 回帖奖励 |倒序浏览

听大哥的课

要有时间,有信心!

使用特权

评论回复
22
Batistuta_| | 2009-1-18 17:30 | 只看该作者

看了HOT大叔10楼的链接**,有点疑问

文章中说的软件复位,什么时候用? 
也就是说,怎么检查MCU已经跑飞,要用软件复位.
//-----------------------------------------------------------
另外: 俺的理解不知道对不对,请大叔指点。
为什么要软件复位?---有时候MCU跑飞了,需要复位,但是,又要保持一部分寄存器的状态,所以不能用外狗复位(假设有外狗),用软件复位。

使用特权

评论回复
23
Batistuta_| | 2009-1-18 17:50 | 只看该作者

这样?

#define    SOFT_DOG_TIME  XX    // xx小于硬件狗溢出时间的一半
bit   **_soft_dog=0;
uchar soft_dog_timer=0;
main()
{
  ... 
  while(1)
  {
     ...
     //-----------------
     **_soft_dog = 0;
     //-----------------
     ... 
  }
}

time_interrupt()    //通用定时器
{
  ...
  //--------------------------
  soft_dog_timer++;
  if(soft_dog_timer>=SOFT_DOG_TIME)
  {
     soft_dog_timer = 0;
  }   
  if(**_soft_dog)
  {
     soft_reset();        //软件复位
  }
  else
  {
     **_soft_dog = 1;
  }
  //--------------------------
  ...    
}

使用特权

评论回复
24
hotpower|  楼主 | 2009-1-18 20:52 | 只看该作者

软件复位和硬件复位的区别

硬件复位一般为内部模块的初始化。它在PC执行第1条指令前就已执行。
软件复位一般为跳转到PC执行的第1条指令处。


软件复位可以人为地再对内部模块初始化

使用特权

评论回复
25
computer00| | 2009-1-18 20:56 | 只看该作者

要对一堆寄存器初始化...很容易漏掉搞错...

上次搞一个51的IAP时,就是软件复位寄存器搞得不够彻底,导致程序运行一段时间后莫名其妙死掉...
后来干脆不用软件去复位寄存器了,直接设置一个寄存器让系统复位(或者打开内狗),然后再判断
该执行用户程序还是IAP程序,不再倒塌,问题解决...

使用特权

评论回复
26
hotpower|  楼主 | 2009-1-18 21:00 | 只看该作者

关于MCU跑飞及要保持一部分寄存器的状态的问题

只要有手段复位,则跑飞前的一部分寄存器的状态本身不会被破坏。

但是由于复位,特别是硬件复位,那么内部模块被初始化为默认状态。

所以为了恢复,如P1口内容,则必须采用缓冲驱动思路,

即为P0口设置缓存寄存器Port1, 再根据Port1来驱动P1.

这样就解决了复位后,由于Port1未变化,所以主循环前即可恢复P1




使用特权

评论回复
27
hotpower|  楼主 | 2009-1-18 21:11 | 只看该作者

00说得没错,软件复位是需要代价和功力的~~~

当程序飞后,内部模块可能都乱了~~~

假定你根本未使用T2,那么你就不会考虑T2的初始化问题。

假定软件复位没进行ET2=0,TR2=0,且未未在T2Isr处加reti

则EA=1后,若跑飞时ET2=1,TR2=1,后果可知~~~

所以忠告大家:

初始化一定要彻底,一切系统资源都要初始化,哪怕未用!!!

有硬件看门狗时,最好while(1)自毁~~~

这样可对自己的有用模块再初始化,切记:所有中断向量表(程序)

无用的都应该用reti.

使用特权

评论回复
28
hotpower|  楼主 | 2009-1-18 21:22 | 只看该作者

关于23楼软件看门狗的问题

大致应该这样(测试速度比23楼快):
#define    SOFT_DOG_TIME  XX    // xx小于硬件狗溢出时间的一半
volatile bit   **_soft_dog=1;//注意加volatile,好像Keil的bit不需要
main()
{
  ... 
  while(1)
  {
     ...
     //-----------------
     **_soft_dog = 1;
     //-----------------
     ... 
  }
}

time_interrupt()    //通用定时器
{
static uchar soft_dog_timer=0;//应该用局部变量,最好少用全局变量
  ...
  //--------------------------
  if(**_soft_dog)
  {
    **_soft_dog = 0;
    soft_dog_timer = 0;
  }
  else
  {
    soft_dog_timer++;
    if(soft_dog_timer>=SOFT_DOG_TIME)
    {
      soft_dog_timer = 0;
      soft_reset();        //软件复位
    }   
  //--------------------------
  }
  ...    
}

使用特权

评论回复
29
computer00| | 2009-1-18 21:23 | 只看该作者

有些光RETI还不够的...ET2还有更晕的问题...要软件清中断...

如果不小心让T2跑起来中断了,光有RETI,清不了中断标志,那将一直处于中断状态,
主程序每次只有执行一条指令的机会...结果就是系统变得很慢...

所以不用的中断最好是在里面做错误处理,检测到误中断干脆倒塌掉重新来过更爽...

使用特权

评论回复
30
hotpower|  楼主 | 2009-1-18 21:26 | 只看该作者

忘了TF2需要软件清除~~~

使用特权

评论回复
31
程序匠人| | 2009-1-18 22:25 | 只看该作者

呵呵,既然大婶有裤子情结,送一条又有何妨呢?

使用特权

评论回复
32
洪七公| | 2009-1-18 22:28 | 只看该作者

逼良为**???拒收裤子!!!

使用特权

评论回复
33
hotpower|  楼主 | 2009-1-18 22:36 | 只看该作者

请求匠人收回本贴的裤子!!!跪求了!!!

21ic的技术氛围已经看不见了。。。

俺不缺裤子!!!

俺认为有质量和技巧的应该送裤子,但绝非人情!!!

每个论坛都有精华版贴,这应该是真正的精华。

这样人们可以省去看水贴的时间。

使用特权

评论回复
34
hotpower|  楼主 | 2009-1-18 22:37 | 只看该作者

不收此裤俺跪求到250楼~~~

使用特权

评论回复
35
zyok| | 2009-1-18 22:39 | 只看该作者

hot前辈也别太在意...

其实匠人也挺不容易的...

使用特权

评论回复
36
hotpower|  楼主 | 2009-1-18 22:39 | 只看该作者

不收此裤俺跪求到250楼~~~~

使用特权

评论回复
37
hotpower|  楼主 | 2009-1-18 22:40 | 只看该作者

不收此裤俺跪求到250楼~~~~~~

使用特权

评论回复
38
hotpower|  楼主 | 2009-1-18 22:40 | 只看该作者

不收此裤俺跪求到250楼~~~~~~~

使用特权

评论回复
39
hotpower|  楼主 | 2009-1-18 22:41 | 只看该作者

不收此裤俺跪求到250楼~~~~!

使用特权

评论回复
40
hotpower|  楼主 | 2009-1-18 22:42 | 只看该作者

哈哈~~~回家了~~~明天再跪求收裤子~~~

使用特权

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

本版积分规则