打印

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

[复制链接]
14022|76
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2009-1-16 20:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
volatile unsigned int SystemRamTest;

void SystemInit(void)
{
  PortInit();
  TimerInit();
//.......
  WdtTest();//测试外部看门狗
}

void PortInit()
{
  P0 = 0xff;
  P1 = 0xff;
  P2 = 0xff;
  P3 = 0xff;
}

void WdtTest()
{
  WdtClr();//喂外狗
  if (SystemRamTest != 0x55aa)
  {//上电复位可认为SystemRamTest是随机且不可能为0x55aa(概率几乎为0)
    LedInit(1);//上电复位,初始化Led全亮,这样在外狗坏时常亮!!!
    Delay100mS();//这里要用软件延时,因为这里还未开中断
    XBYTE[0x0200] = 0x77;//复位DSP
    XBYTE[0x1000] = 0x04;//写板型,上报PC
    SystemCommand = 0;//复位系统命令,但只有在上电时1次复位
    SystemRamTest = 0x55aa;//设置上电复位结束及RAM测试标志
    while(1);//等待外部看门狗复位,测试外部看门狗喂狗硬件引脚
  }
  else
  {//外部看门狗复位测试通过,外狗器件完好
    LedInit(0);//软件或看门狗复位,初始化Led全灭,外狗好时Led闪烁1次!!!
  }
}

void main()
{
  IE = 0;//关中断
  _start_();//启动时执行2次RETI
  SystemInit();
  while(1)
  {
    EA = 1;//开中断
    WdtClr();//喂狗
    TaskMain();//主任务
    PCON |= IDL_;//进入空闲状态
  }
}

本贴由菜农提供"技巧"答谢诸位"狗友"~~~,转贴请注明出处(雁塔菜地)
HotPower@126.com 2009.1.16 于雁塔菜地

相关帖子

来自 2楼
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();        //软件复位
    }   
  //--------------------------
  }
  ...    
}

使用特权

评论回复
板凳
catwill| | 2009-1-16 20:30 | 只看该作者

有些不懂,请教大虾

_start_();//启动时执行2次RETI    ??

    XBYTE[0x0200] = 0x77;//复位DSP  ??
    XBYTE[0x1000] = 0x04;//写板型,上报PC  ??
    SystemCommand = 0;//复位系统命令,但只有在上电时1次复位  ??

菜鸟蠢钝,参透不得,希望大虾赐教。

使用特权

评论回复
地板
hotpower|  楼主 | 2009-1-16 20:33 | 只看该作者
5
catwill| | 2009-1-16 20:47 | 只看该作者

看“红杏出墙”很晕倒啊

小鸟不懂汇编,不过看了您的hotIns.h好像是用C51来“模拟”汇编??
还有,“中断隐身”的概念小鸟不懂,好像机器码都上来了??
可能我对RETI的理解不够深刻吧!
还有hotIns.h里也没有对_start_();的声明吧?

    XBYTE[0x0200] = 0x77;//复位DSP  ??
    XBYTE[0x1000] = 0x04;//写板型,上报PC  ??
    SystemCommand = 0;//复位系统命令,但只有在上电时1次复位  ??
这3句还是不懂……
请赐教。

使用特权

评论回复
6
catwill| | 2009-1-16 20:57 | 只看该作者

您老如果有时间,请移驾“新手专区”

里面有我问的接地的问题(请教高手接地的问题)
,百思不得解,请您老释疑。

使用特权

评论回复
7
hotpower|  楼主 | 2009-1-16 21:03 | 只看该作者

实际是非常广泛应用的一句~~~

这是村里的程序片段摘要~~~

1.
XBYTE[0x0200] = 0x77;//复位DSP  ??

它是51通过双口RAM与DSP通讯的代码.
51上电时通知DSP进行软件复位.

DSP指令:
command = FLASH[worknum] >> 8;//取命令
switch(command)
{
  case 0x77:
       if (worknum == 0)
       {
         SWI_Reset();//复位DSP
       }
       break;
//.....
}

2.
XBYTE[0x1000] = 0x04;//写板型,上报PC  ??

它是51(发送)通过CPLD与工控(PC)单板通讯的代码.

3.
SystemCommand = 0;//复位系统命令,但只有在上电时1次复位  ??

它是51(接收)通过CPLD与工控(PC)单板通讯的代码.
接收数据在SystemCommand中.
而且只能在51上电时初始化为0一次.

这种应用非常广泛~~~
相关链接:http://blog.**/hotpower/193901/message.aspx#

使用特权

评论回复
8
catwill| | 2009-1-16 21:13 | 只看该作者

唉,看来您的系统的深度和广度比我厉害多了……

光是听听里面的DSP、CPLD等……
就把我吓住了……

什么时候我才能有您1成功力啊……

使用特权

评论回复
9
hotpower|  楼主 | 2009-1-16 21:16 | 只看该作者

哈哈~~~也想“红杏出墙”不成???

实际本主帖对内部硬件看门狗的检测一样有效,但应用很少~~~
相关链接:http://blog.**/hotpower/

使用特权

评论回复
10
catwill| | 2009-1-16 21:19 | 只看该作者

不想不想

我汇编也就是能看懂的地步,不会写。

我只想一心练好C51,然后用STM32步入32位世界就满足了……

使用特权

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

_start_();和2次RETI的问题

_start_();实际是"汇编数组"~~~

2次RETI的真正目的是:
保证清除2级"隐身"的中断优先级状态触发器~~~

/*------------------------------------------------------------------------------------------*/
#define _intjmp_(ADDR) DPTR = (void *)ADDR;_icall_(__reset_code__) //中断隐身函数_intjmp_()声明
#define _reset_() DPTR = __reset_code__ + 5;_icall_(__reset_code__) //软复位函数_reset_()声明
#define _start_() _icall_(__reset_code__ + 4);_icall_(__reset_code__ + 4); //软启动函数_start_()声明
#ifndef __reset__code__
  #define __reset__code__
  _db_(__reset_code__, "xc0x82xc0x83x32xe4xc0xe0xc0xe0x32");//装载数据DB 0xc0..0x32
#endif
/*--------------------------------------------------------------------------------------------
装载代码   __reset_code__: PUSH  DPL;//非典的软复位函数入口(执行2次RETI)
                           PUSH  DPH
                             RETI;//_intjmp_()函数调用到此为止中断退出并跳入子程序隐身(让出中断)
                           CLR   A;//经典的软复位函数入口(执行1次RETI)
                           PUSH  ACC
                           PUSH  ACC
                           RETI;//_reset_()函数调用从此处跳入0x0000开始执行
/*------------------------------------------------------------------------------------------*/
相关链接:http://www.52c51.com/article/251.html

使用特权

评论回复
12
catwill| | 2009-1-16 22:03 | 只看该作者

呵呵,大虾透露了很多“高深武功”啊

可惜我功力尚浅,还不能理解,不过都记下了,以后慢慢参透。

还有借问一句:内部硬件WDT与外部独立WDT不一样吗?
为什么应用少呢?

我用C8051F一般就省去了外部的WDT,因为3V的器件不好找
我这里小地方,不好买。

真诚的希望您去新手园地指导一下小鸟们接地的问题!

相关链接:https://bbs.21ic.com/club/bbs/list.asp?boardid=1&page=1&t=3196823&tp=%u8BF7%u6559%u9AD8%u624B%u63A5%u5730%u7684%u95EE%u9898

使用特权

评论回复
13
hotpower|  楼主 | 2009-1-16 22:15 | 只看该作者

家花(内狗)不如野花(外狗)香,可路边的野花你末要采~~~

内狗一般在上电和复位时是默认关闭的.
外狗一般在管脚悬空时认为关闭,有电平信号(固定或脉冲)是开启的.

故一般外狗的喂狗引脚都上拉电阻,即不可关闭.

所以一般在高可靠应用上都是三狗(内狗,外狗,野狗(软狗))联合应用~~~

使用特权

评论回复
14
mcuisp| | 2009-1-16 23:12 | 只看该作者

还有一个狗,就是关掉电源重来的狗,呵呵。

对付强干扰的绝招。
阎王狗。

使用特权

评论回复
15
PhoenixMY| | 2009-1-17 00:12 | 只看该作者

...

使用特权

评论回复
16
catwill| | 2009-1-17 06:52 | 只看该作者

光个狗狗就这么多道道啊……

我只用过外狗和内狗……
软狗还没考虑过怎么用。

使用特权

评论回复
17
古道热肠| | 2009-1-17 10:27 | 只看该作者

哈哈,有趣

不怕一万,就怕万一.
 {//上电复位可认为SystemRamTest是随机且不可能为0x55aa}
万一上电时SRAM中就是55AA,您就无法复位DSP,写板型了.
要再上加强筋!

使用特权

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

关于55AA的上电概率问题

菜农首次使用55AA可能要追述到1983年左右,主要启蒙于硬盘主引导扇区的55AA.

在一个16年至今的产品中,数万台55AA出现的概率俺没见一次.

在32位ARM中俺喜欢55AA55AA, 在8/16位的MCU/DSP中俺一般使用55AA.

在一些系统中也使用长整型进行RAM上电测试.

新的MCU/ARM/DSP都配备的硬件看门狗和复位标志,但俺还是喜欢用55AA~~~

本主帖主要是一种基本应用方法及实现,真的系统要比其更可靠和复杂.

在有内狗的MCU中,实际还需外狗的冗余保护,它实际是由两层55AA保护的.

所以上电RAM出现55AA的概率几乎为零,何况工控环境几乎都是永不停机的...

使用特权

评论回复
20
香水城| | 2009-1-17 15:35 | 只看该作者

申请专利?—— 哈哈,好像有点班门弄斧的感觉

使用特权

评论回复
21
hotpower|  楼主 | 2009-1-17 15:53 | 只看该作者

硬件看门狗的功能测试对批量产品很有用

尤其是外部看门狗,如813,706,1232等众多硬件看门狗芯片。
以及如74hc123等TTL芯片搭成的外狗更为重要。

因为外狗有喂狗信号引脚,它存在有连接问题,而复位脚也是如此。

这2线有1条出问题都不可,当然还有外狗的电源引脚和外围器件问题。

假若认为外狗都是好的,不附加任何检测程序及手段,那么外狗不起

作用也是从表面看不出来的。

如本主贴一样,施加检测程序后,程序上电时:

若外狗坏,某个LED常亮,如运行灯(假设正常运行时1S闪烁)
若外狗好且无喂狗信号,则LED快闪(复位期间LED灭,测试时亮)

都正常时,LED按1S规律闪烁。

故此方法从1只LED即可检测(看出)外狗是否正常。

使用特权

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

本版积分规则

1460

主题

21619

帖子

506

粉丝