搜档网
当前位置:搜档网 › Ok2440-3看门狗驱动代码详细分析

Ok2440-3看门狗驱动代码详细分析

Ok2440-3看门狗驱动代码详细分析
Ok2440-3看门狗驱动代码详细分析

/*希望与各位共同学习,我的QQ是254206940.红色部分为我添加的注释,蓝色把部分为代码自带的注释,紫色部分为我没理解透的地方(主要是我不不明白为什么要那些代码,它们主要起什么作用)。希望看到我的笔记的同行不吝赐教!

linux/drivers/char/watchdog/s3c2410_wdt.c

*

* Copyright (c) 2004 Simtec Electronics

* Ben Dooks

*

* S3C2410 Watchdog Timer Support

*

* Based on, softdog.c by Alan Cox,

* (c) Copyright 1996 Alan Cox

*

* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License as published by

* the Free Software Foundation; either version 2 of the License, or

* (at your option) any later version.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

* GNU General Public License for more details.

*

* Y ou should have received a copy of the GNU General Public License

* along with this program; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307 USA

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#undef S3C_V A_WA TCHDOG

#define S3C_V A_WA TCHDOG (0)

#include

#define PFX "s3c2410-wdt: "

#define CONFIG_S3C2410_WA TCHDOG_A TBOOT(0)

#define CONFIG_S3C2410_WA TCHDOG_DEFAULT_TIME (15)

static int nowayout = W A TCHDOG_NOW AYOUT;

static int tmr_margin = CONFIG_S3C2410_WA TCHDOG_DEFAULT_TIME;

static int tmr_atboot = CONFIG_S3C2410_WA TCHDOG_A TBOOT;

static int soft_noboot;

static int debug;

module_param(tmr_margin, int, 0);

module_param(tmr_atboot, int, 0);

module_param(nowayout, int, 0);

module_param(soft_noboot, int, 0);

module_param(debug, int, 0);

MODULE_PARM_DESC(tmr_margin, "Watchdog tmr_margin in seconds. default="

__MODULE_STRING(CONFIG_S3C2410_WA TCHDOG_DEFAULT_TIME) ")"); MODULE_PARM_DESC(tmr_atboot,

"Watchdog is started at boot time if set to 1, default="

__MODULE_STRING(CONFIG_S3C2410_WA TCHDOG_A TBOOT)); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="

__MODULE_STRING(WA TCHDOG_NOW AYOUT) ")");

MODULE_PARM_DESC(soft_noboot, "Watchdog action, set to 1 to ignore reboots, 0 to reboot (default depends on ONLY_TESTING)");

MODULE_PARM_DESC(debug, "Watchdog debug, set to >1 for debug, (default 0)");

typedef enum close_state {

CLOSE_STA TE_NOT,

CLOSE_STA TE_ALLOW = 0x4021

} close_state_t;

static unsigned long open_lock;

static struct device *wdt_dev; /* platform device attached to */

static struct resource *wdt_mem;

static struct resource *wdt_irq;

static struct clk *wdt_clock;

static void __iomem *wdt_base;

static unsigned int wdt_count;

static close_state_t allow_close;

static DEFINE_SPINLOCK(wdt_lock);

/* watchdog control routines */

#define DBG(msg...) do { \

if (debug) \

printk(KERN_INFO msg); \

} while (0)

/* functions */

static void s3c2410wdt_keepalive(void)//喂狗,即将计数值赋给WTCNT寄存器

{

spin_lock(&wdt_lock);

writel(wdt_count, wdt_base + S3C2410_WTCNT);

spin_unlock(&wdt_lock);

}

static void __s3c2410wdt_stop(void)

{

unsigned long wtcon;

wtcon = readl(wdt_base + S3C2410_WTCON);

wtcon &= ~(S3C2410_WTCON_ENABLE | S3C2410_WTCON_RSTEN);

writel(wtcon, wdt_base + S3C2410_WTCON);

}

//将WTCON寄存器的位[5]和位[0]清零,不输出复位信号,停止看门狗

static void s3c2410wdt_stop(void)//关看门狗

{

spin_lock(&wdt_lock);

__s3c2410wdt_stop();

spin_unlock(&wdt_lock);

}

static void s3c2410wdt_start(void)

{

unsigned long wtcon;

spin_lock(&wdt_lock);

__s3c2410wdt_stop(); //关看门狗

wtcon = readl(wdt_base + S3C2410_WTCON);

wtcon |= S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV128;

/*#define S3C2410_WTCON_ENABLE (1<<5)

#define S3C2410_WTCON_DIV128 (3<<3)

开启看门狗,设置分频系数为128(这里并没有将其写入控制寄存器,只是设置值而已)*/

if (soft_noboot) {

wtcon |= S3C2410_WTCON_INTEN; //#define S3C2410_WTCON_INTEN (1<<2)使能看门狗中断

wtcon &= ~S3C2410_WTCON_RSTEN; //#define S3C2410_WTCON_RSTEN (0x01),不输出复位信号

} else {

wtcon &= ~S3C2410_WTCON_INTEN; //禁止看门狗中断

wtcon |= S3C2410_WTCON_RSTEN; //允许输出复位信号

}

DBG("%s: wdt_count=0x%08x, wtcon=%08lx\n",

__func__, wdt_count, wtcon);

writel(wdt_count, wdt_base + S3C2410_WTDA T);

writel(wdt_count, wdt_base + S3C2410_WTCNT); //写入计数值

writel(wtcon, wdt_base + S3C2410_WTCON); //写WTCON寄存器,前面的设置会生效spin_unlock(&wdt_lock);

}

static int s3c2410wdt_set_heartbeat(int timeout)

{

unsigned int freq = clk_get_rate(wdt_clock);

//获得时钟,这里的时钟应该是系统初始化时设置好了的。就是pclk的值unsigned int count;

unsigned int divisor = 1;

unsigned long wtcon;

if (timeout < 1)

return -EINV AL;

freq /= 128;

//这个地方有点不明白了,在前面没有设置WTCON寄存器的[4:3]位,怎么就直接采用了128分频呢?难道也是系统初始化时的设置?

count = timeout * freq;

//将看门时间timeout(秒)乘以freq,根据count的值确定是否需要设置看门狗的预分配项。

DBG("%s: count=%d, timeout=%d, freq=%d\n",

__func__, count, timeout, freq);

/* if the count is bigger than the watchdog register,

then work out what we need to do (and if) we can

actually make this value

*/

if (count >= 0x10000) {

for (divisor = 1; divisor <= 0x100; divisor++) {

if ((count / divisor) < 0x10000)

break;

}

//因为WTDA T寄存器为16位,因此当计数值count >= 0x10000时必须采用与分频项,经过这个循环后,divisor的值即为与分频因子。

if ((count / divisor) >= 0x10000) {

dev_err(wdt_dev, "timeout %d too big\n", timeout);

return -EINV AL;

}

//如果count / divisor) >= 0x10000,则说明看门狗时间设得太大了,将会退出。

}

tmr_margin = timeout;

DBG("%s: timeout=%d, divisor=%d, count=%d (%08x)\n",

__func__, timeout, divisor, count, count/divisor);

count /= divisor;

//得到采用预分频后看门狗的计数脉冲数

wdt_count = count;

/* update the pre-scaler */

wtcon = readl(wdt_base + S3C2410_WTCON);

wtcon &= ~S3C2410_WTCON_PRESCALE_MASK;

wtcon |= S3C2410_WTCON_PRESCALE(divisor-1);

//计算看门狗预分配因子

writel(count, wdt_base + S3C2410_WTDA T);

//设置看门狗计数脉冲数

writel(wtcon, wdt_base + S3C2410_WTCON);

//设置看门狗预分频因子

return 0;

}

/*

* /dev/watchdog handling

*/

static int s3c2410wdt_open(struct inode *inode, struct file *file)

{

if (test_and_set_bit(0, &open_lock)) //上锁,因此同时只有一个进程打开看门狗设备文件,该函数的功能为:设置&open_lock的位0为1,返回原来位0 的值。

return -EBUSY;

if (nowayout)

__module_get(THIS_MODULE);

allow_close = CLOSE_STA TE_NOT; //这个状态用来干什么的呢?

/* start the timer */

s3c2410wdt_start(); //启动看门狗

return nonseekable_open(inode, file);

}

static int s3c2410wdt_release(struct inode *inode, struct file *file)

{

/*

* Shut off the timer.

* Lock it in if it's a module and we set nowayout

*/

if (allow_close == CLOSE_STA TE_ALLOW)

s3c2410wdt_stop();

else {

dev_err(wdt_dev, "Unexpected close, not stopping watchdog\n");

s3c2410wdt_keepalive();

}

allow_close = CLOSE_STA TE_NOT;

clear_bit(0, &open_lock); //释放锁

return 0;

}

static ssize_t s3c2410wdt_write(struct file *file, const char __user *data,

size_t len, loff_t *ppos)

{

/*

* Refresh the timer.

*/

if (len) {

if (!nowayout) {

size_t i;

/* In case it was set long ago */

allow_close = CLOSE_STA TE_NOT;

for (i = 0; i != len; i++) {

char c;

if (get_user(c, data + i)) //用户空间到内核空间

return -EFAULT;

if (c == 'V') //如果写入了V,允许关闭

allow_close = CLOSE_STA TE_ALLOW;

}

}

s3c2410wdt_keepalive();

}

return len;

}

#define OPTIONS WDIOF_SETTIMEOUT| WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE

static const struct watchdog_info s3c2410_wdt_ident = {

.options = OPTIONS,

.firmware_version = 0,

.identity = "S3C2410 Watchdog",

};

static long s3c2410wdt_ioctl(struct file *file,unsigned int cmd,

unsigned long arg)

{

void __user *argp = (void __user *)arg;

int __user *p = argp;

int new_margin;

switch (cmd) {

case WDIOC_GETSUPPORT:

return copy_to_user(argp, &s3c2410_wdt_ident,

sizeof(s3c2410_wdt_ident)) ? -EFAULT : 0;

case WDIOC_GETSTA TUS:

case WDIOC_GETBOOTSTA TUS:

return put_user(0, p);

case WDIOC_KEEPALIVE:

s3c2410wdt_keepalive();

return 0;

case WDIOC_SETTIMEOUT:

if (get_user(new_margin, p))

return -EFAULT;

if (s3c2410wdt_set_heartbeat(new_margin))

return -EINV AL;

s3c2410wdt_keepalive();

return put_user(tmr_margin, p);

case WDIOC_GETTIMEOUT:

return put_user(tmr_margin, p);

default:

return -ENOTTY;

}

}

/* kernel interface */

static const struct file_operations s3c2410wdt_fops = { .owner = THIS_MODULE,

.llseek = no_llseek,

.write = s3c2410wdt_write,

.unlocked_ioctl = s3c2410wdt_ioctl,

.open = s3c2410wdt_open,

.release = s3c2410wdt_release,

};

static struct miscdevice s3c2410wdt_miscdev = { .minor = W A TCHDOG_MINOR,

.name = "watchdog",

.fops = &s3c2410wdt_fops,

};

/* interrupt handler code */

static irqreturn_t s3c2410wdt_irq(int irqno, void *param)

{

dev_info(wdt_dev, "watchdog timer expired (irq)\n");

s3c2410wdt_keepalive(); //喂狗

return IRQ_HANDLED;

}

/* device interface */

static int s3c2410wdt_probe(struct platform_device *pdev)

{

/*入口参数

struct platform_device s3c_device_wdt = {

.name = "s3c2410-wdt",

.id = -1,

.num_resources = ARRAY_SIZE(s3c_wdt_resource),

.resource = s3c_wdt_resource,

};

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

说明:num_resources:设备占用的资源数量

static struct resource s3c_wdt_resource[] = {

[0] = {

.start = S3C24XX_PA_WA TCHDOG,

说明:S3C24XX_PA_WA TCHDOG 等于(0x53000000)

WTCON寄存器的物理地址即为0x53000000

.end = S3C24XX_PA_WA TCHDOG + S3C24XX_SZ_WA TCHDOG - 1, 说明:S3C24XX_SZ_WA TCHDOG等于0x00100000

.flags = IORESOURCE_MEM,

说明:该标志用来资源的类型

},

[1] = {

.start = IRQ_WDT,

.end = IRQ_WDT,

说明:#define IRQ_WDT 17 /* 0x00020000 */

.flags = IORESOURCE_IRQ,

}

};

struct resource *res;

struct device *dev;

unsigned int wtcon;

int started = 0;

int ret;

int size;

DBG("%s: probe=%p\n", __func__, pdev);

dev = &pdev->dev;

wdt_dev = &pdev->dev;

/*说明:把dev和wdt_dev指针指向入口参数platform_device s3c_device_wdt 的dev成员*/ /* get the memory region for the watchdog timer */

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

/*struct resource *platform_get_resource(struct platform_device *dev,

unsigned int type, unsigned int num)

{

int i;

for (i = 0; i < dev->num_resources; i++) {

struct resource *r = &dev->resource[i];

if (type == resource_type(r) && num-- == 0)

return r;

}

return NULL;

}

/*说明:这个函数查找platform_device 中成员resource 资源中标志为type 类型的资源,如果找到了就返回resource 类型的资源*/

这里返回res为指向下面resourse的指针

Resourse={

.start = S3C24XX_PA_WA TCHDOG,

.end = S3C24XX_PA_WA TCHDOG + S3C24XX_SZ_WA TCHDOG - 1,

.flags = IORESOURCE_MEM,

},

*/

if (res == NULL) {

dev_err(dev, "no memory resource specified\n");

return -ENOENT;

}

size = (res->end - res->start) + 1;

/*size的值为S3C24XX_SZ_WA TCHDOG – 1,即0x00100000*/

wdt_mem = request_mem_region(res->start, size, pdev->name);

/*申请IO内存,size =0x00100000多个内存地址,这些地址从S3C24XX_PA_WA TCHDOG 开始,设备的名字为s3c2410-wdt*/

if (wdt_mem == NULL) {

dev_err(dev, "failed to get memory region\n");

ret = -ENOENT;

goto err_req;

}

wdt_base = ioremap(res->start, size);

/* IO内存重映射,返回的地址wdt_base 即为映射后的首地址,此后可以通过wdt_base 加上适当的偏移量来访问看门狗的IO空间*/

if (wdt_base == NULL) {

dev_err(dev, "failed to ioremap() region\n");

ret = -EINV AL;

goto err_req;

}

DBG("probe: mapped wdt_base=%p\n", wdt_base);

wdt_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);

if (wdt_irq == NULL) {

dev_err(dev, "no irq resource specified\n");

ret = -ENOENT;

goto err_map;

}

ret = request_irq(wdt_irq->start, s3c2410wdt_irq, 0, pdev->name, pdev);

/*申请看门狗中断,中断处理函数为s3c2410wdt_irq ,传入的参数为s3c_device_wdt */ if (ret != 0) {

dev_err(dev, "failed to install irq (%d)\n", ret);

goto err_map;

}

wdt_clock = clk_get(&pdev->dev, "watchdog");

if (IS_ERR(wdt_clock)) {

dev_err(dev, "failed to find watchdog clock source\n");

ret = PTR_ERR(wdt_clock);

goto err_irq;

}

clk_enable(wdt_clock);

/* see if we can actually set the requested timer margin, and if

* not, try the default value */

if (s3c2410wdt_set_heartbeat(tmr_margin)) {

//如果s3c2410wdt_set_heartbeat(tmr_margin)函数成功(返回0),则设置好了用户采用的看门狗时间。如果为1则执行下面的操作。

started = s3c2410wdt_set_heartbeat(

CONFIG_S3C2410_WA TCHDOG_DEFAULT_TIME);

if (started == 0)

dev_info(dev,

"tmr_margin value out of range, default %d used\n",

CONFIG_S3C2410_WA TCHDOG_DEFAULT_TIME);

//采用默认的看门狗时间

else

dev_info(dev, "default timer value is out of range, cannot start\n");

//设置的时间超出范围

}

ret = misc_register(&s3c2410wdt_miscdev);

if (ret) {

dev_err(dev, "cannot register miscdev on minor=%d (%d)\n",

WA TCHDOG_MINOR, ret);

goto err_clk;

}

if (tmr_atboot && started == 0) {

//此时tmr_atboot 与started均为0,条件成立。

dev_info(dev, "starting watchdog timer\n");

s3c2410wdt_start();

} else if (!tmr_atboot) {

/* if we're not enabling the watchdog, then ensure it is

* disabled if it has been left running from the bootloader

* or other source */

s3c2410wdt_stop();

//关看门狗

}

/* print out a statement of readiness */

wtcon = readl(wdt_base + S3C2410_WTCON);

dev_info(dev, "watchdog %sactive, reset %sabled, irq %sabled\n", (wtcon & S3C2410_WTCON_ENABLE) ? "" : "in",

(wtcon & S3C2410_WTCON_RSTEN) ? "" : "dis",

(wtcon & S3C2410_WTCON_INTEN) ? "" : "en");

return 0;

err_clk:

clk_disable(wdt_clock);

clk_put(wdt_clock);

err_irq:

free_irq(wdt_irq->start, pdev);

err_map:

iounmap(wdt_base);

err_req:

release_resource(wdt_mem);

kfree(wdt_mem);

return ret;

}

static int s3c2410wdt_remove(struct platform_device *dev)

{

release_resource(wdt_mem);

kfree(wdt_mem); //释放内存

wdt_mem = NULL;

free_irq(wdt_irq->start, dev);

wdt_irq = NULL;

clk_disable(wdt_clock);

clk_put(wdt_clock);

wdt_clock = NULL;

iounmap(wdt_base);

misc_deregister(&s3c2410wdt_miscdev);

return 0;

}

static void s3c2410wdt_shutdown(struct platform_device *dev)

{

s3c2410wdt_stop(); //关闭看门狗

}

#ifdef CONFIG_PM

static unsigned long wtcon_save;

static unsigned long wtdat_save;

static int s3c2410wdt_suspend(struct platform_device *dev, pm_message_t state)

{

/* Save watchdog state, and turn it off. */

wtcon_save = readl(wdt_base + S3C2410_WTCON); //保存WTCON的值

wtdat_save = readl(wdt_base + S3C2410_WTDA T);//保存的WTDA T值

/* Note that WTCNT doesn't need to be saved. */

s3c2410wdt_stop(); //停止看门狗

return 0;

}

static int s3c2410wdt_resume(struct platform_device *dev)

{

/* Restore watchdog state. */

writel(wtdat_save, wdt_base + S3C2410_WTDA T);

writel(wtdat_save, wdt_base + S3C2410_WTCNT); /* Reset count */

writel(wtcon_save, wdt_base + S3C2410_WTCON); //恢复WTDA T,WTCNT,WTCON

printk(KERN_INFO PFX "watchdog %sabled\n",

(wtcon_save & S3C2410_WTCON_ENABLE) ? "en" : "dis");

return 0;

}

#else

#define s3c2410wdt_suspend NULL

#define s3c2410wdt_resume NULL

#endif /* CONFIG_PM */

static struct platform_driver s3c2410wdt_driver = {

.probe = s3c2410wdt_probe,

.remove = s3c2410wdt_remove,

.shutdown = s3c2410wdt_shutdown,

.suspend = s3c2410wdt_suspend,

.resume = s3c2410wdt_resume,

.driver = {

.owner = THIS_MODULE,

.name = "s3c2410-wdt",

},

};

static char banner[] __initdata =

KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics\n";

static int __init watchdog_init(void)

{

printk(banner);

return platform_driver_register(&s3c2410wdt_driver);

}

static void __exit watchdog_exit(void)

{

platform_driver_unregister(&s3c2410wdt_driver);

}

module_init(watchdog_init);

module_exit(watchdog_exit);

MODULE_AUTHOR("Ben Dooks , "

"Dimitry Andric ");

MODULE_DESCRIPTION("S3C2410 Watchdog Device Driver"); MODULE_LICENSE("GPL");

MODULE_ALIAS_MISCDEV(WA TCHDOG_MINOR);

MODULE_ALIAS("platform:s3c2410-wdt");

_看门狗_芯片的选择及软件控制

电子世界2004年1 期 26??单片机与可编程器件 “看门狗”芯片的选择 及软件控制 ?吉林化工学院自动化系 梁 伟 ?

电子世界2004年1期 27??单片机与可编程器件 个问题的方法就是做一个看门狗清除脉冲子程序,在延时等循环的圈内中加入它,可以保证万无一失。 2. 使用其它软件方法配合看门狗除了保证对看门狗的合理控制外,还要考虑使用其它软件方法配合看门狗,才能够保证MCU可靠运行。许多书籍在分析MCU失控后的情况时,几乎都假定一般是PC错位,进入未知区域,并不再进入正常程序代码段。但实际并非如此,以下就两种情况做具体分析,并给出解决方法。(1)干扰造成PC出错,但出错后进入了正常代码段,并在错误的情况下继续运行,看门狗没有起作用,但系统实际上已经瘫痪。解决这个问题可以使用软件路标法,几乎所有软件的主程序都是在一个大循环里工作,可以在循环中设置一些断点,断点处设置路标,程序运行 时随时检查路标,这样就可以判断程序是否有非法进入的可能。具体的路标可以是一个计数器,每个断点加1,在终点清除。因为断点数固定,因此每个断点处路标值固定,只需要检测路标值就可以进行对非法进入的判断。余下的问题就是发现错误后如何处理,正常的处理就是设置死循环,等待看门狗复位。对于PHILIPS的LPC系列MCU也可以置位AUXR1寄存器的SRST位立即进行软件复位。(2)干扰导致内部寄存器及RAM出错,但PC未错,因为错误的数据和标志导致程序在错误状态下运行。解决这种问题可以采用RAM校验的方法,具体是在MCU的内部RAM中开辟几个校验区,复位时写入固定代码,如55H或者AAH,并编制校验子程序,运行时随时调用校验,发现错误马上处理,处理方法同(1)。 考虑到可靠性,应该多设置几个校验区, 但要付出RAM资源代价,应酌情处理。此方法如果与(1)方法同时使用,则会获得更好的效果。 结束语 以上对看门狗的芯片选择和软件控制做了一些介绍,笔者通过合理运用,成功地设计出了许多应用系统,这些系统在恶劣的环境下都能够正常工作。但设计看门狗的初衷是防止系统万一死机的弥补措施,设计者本身是希望它永远也不要启动的。因此对于设计MCU系统,不应该过分依靠看门狗,而应该在电源及抗干扰措施上下足功夫,同时合理选择MCU芯片,尽可能选择那些抗干扰能力强,同时低EMI的品种。只有在各个环节都精心设计,才能够保证最终系统的可靠性。◆ Protel 99SE是基于Windows环境下的EDA电子辅助设计软件。一般来讲,利用Protel软件设计工程最基本的完整过程可以分为四大步骤:(1)查找资料,确定方案;(2)电路原理图的设计;(3)产生网络表;(4)印刷电路板的设计。 本文按照实际的设计流程顺序,来谈一谈如何使用Protel 99SE软件准确、高效地设计出电路原理图和设计印刷电路板的一些技巧。 电路原理图的设计 在电路原理图的设计过程中主要应 注意以下方面: 1.设置图纸 在设计开始之前首先要选择好图纸的大小,否则在打印时,若需将图纸由大号改为小号,而电路原理图不会跟着缩小,就存在部分原理图超出图纸范围打印不出来,从而返工的问题。通常的设计顺序为从左到右,从上到下。 2.放置元件 (1)利用元件库浏览器放置元件,对于元件库内未包括的元件要自己创建。创建的元件其引脚没有必要和实物一致, Protel 99SE 软件的实用技巧 ?上海海运学院商船学院轮机工程系 黄志坚 胡以怀? 可将功能相近或相同的引脚放到一起,以方便布线。(2)自创建元件时,还要注意,一定要在工作区的中央(0,0)处 (即“十”字形的中心) 绘制库元件,否则可能会出现在原理图中放置(place)制作的元件时,鼠标指针总是与要放置的元件相隔很远的现象。 (3) 在画原理图时,有时一不小心,使元件(或导线)掉到了图纸外面,却怎么也清除不了。这是由于Protel在原理图编辑状态下,不能同时用鼠标选中工作面内外的元件。要清除图纸外的元件,可点击 【Edit】/【Select】/【Outside Area】,然后框选整张图纸,再点击【Edit】/【Cut】即可。 元件放置好后,最好及时设置好其属性(Attributes),若找不到其相应的封装形式,也要及时为其创建适当的封装形式。 3.原理图布线 (1)根据设计目标进行布线。布线应该用原理图工具栏上的(Wiring Tools)工具,不要误用了(Drawing Tools)工具。(Wiring Tools)工具包含有电气特性,而(Drawing Tools)工具不具备电气特性,会导致原理图出错。 (2) 利用网络标号(Net Label)。网络标号表示一个电气连接点,具有相同网络标号的电气接线表明是连接在一起的。虽然网络标号主要用于层次式电路或多重式电路中各模块电路之间的连接,但若在同一张普通的原理图中也使用网络 标号,则可通过命名相同的网络标号使它们在电气上属于同一网络(即连接在一起),从而不用电气接线就实现了各引脚之间的互连,使原理图简洁明了,不易出错,不但简化了设计,还提高了设计速度。 4.编辑和调整编辑和调整是保证原理图设计成功很重要的一步。 (1)当电路较复杂、或是元器件的数目较多时,用手动编号的方法不仅慢,而且容易出现重号或跳号。重号的错误会在PCB编辑器中载入网络表时表现出来,跳号也会导致管理不便,所以Protel提供了很好的元件自动编号功能,应该好好地利用,即【Tools】/【Annotate...】。 (2)在原理图画好后,许多细节之处

实验5-2 看门狗实验

实验5-2 看门狗定时器应用实验 1、实验目的 了解watchdog 的作用 掌握S3C2410A 的watchdog 定时器的使用方法 2、实验内容 实现看门狗复位 编程实现看门狗喂狗 3、实验设备 S3C2410A 开发板 ADS1.2 集成开发环境,ARM 仿真器、串口连接线 4、实验原理 4.1 看门狗功能简述 嵌入式系统运行时受到外部干扰或者系统错误,程序有时会出现“跑飞”,导致整个系 统瘫痪。为了防止这一现象的发生,在对系统稳定性要求较高的场合往往要加入看门狗(watchdog)电路。看门狗的作用就是当系统“跑飞”而进入死循环时,恢复系统的运行。 4.2 看门狗的工作原理 其基本原理为:设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti, Ti>Tp,在程序正常运行时,定时器就不会溢出,若由于干扰等原因使系统不能在Tp 时刻修改定时器的记数值,定时器将在Ti 时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控的作用。 4.3 S3C2410A 的看门狗 S3C2410A 的看门狗定时器有两个功能: 作为常规时钟,并且可以产生中断; 作为看门狗定时器使用,当时钟计数减为0(超时)时,它将产生一个128 个时钟 周期(PCLK)的复位信号。 主要特性如下: 通用的中断方式的16bit 定时器。 当计数器减到0(发生溢出),产生128 个PCLK 周期的复位信号。 下图为看门狗的电路示意图,看门狗时钟使用PCLK 作为他的时钟源,PCLK 通过预分 频产生适合的看门狗时钟。 看门狗模块包括一个预比例因子放大器,一个是四分频器,一个16bit 计数器。看门狗 的时钟源来自PCLK,为了得到较宽范围的看门狗信号,PCLK 先被预分频,之后再经过分频器分频。预分频比例因子的分频值,都可以由看门狗控制器(WTCON)决定,预分频值的有效范围从0 到256-1。分频因子可以选择16、32、64 或者128。 看门狗定时器记数值的计算公式如下: t_watchdog=1/ [PCLK/( prescaler value +1)/ Division_factor ]

看门狗电路及原理

看门狗电路。在单片机中,为了能使得程序能够正常的运行。设定的及时根据程序所返回的值检测程序运行情况的定时电路。 在主程序中设定一定的值,把这个值在看门狗定时电路数值益处之前定时赋给看门狗赋给定时电路,让看门狗定时器复位。主程序的赋值周期要小于看门狗定时电路的运行周期。 看门狗 百科名片 单片机"看门狗" 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog) 目录[隐藏] 应用 基本原理 看门狗使用注意 看门狗运用 设计思路 [编辑本段]应用 看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,

即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。 [编辑本段]基本原理 看门狗,又叫watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813 ,5045, IMP 813等,价格4~10元不等. 软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,我们还是以51系列来讲,我们知道在51单片机中有两个定时器,我们就可以用这两个定时器来对主程序的运行进行监控。我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。对于T1我们用来监控主程序的运行,我们给T1设定一定的定时时间,在主程序中对其进行复位,如果不能在一定的时间里对其进行复位,T1 的定时中断就会使单片机复位。在这里T1的定时时间要设的大于主程序的运行时间,给主程序留有一定的的裕量。而T1的中断正常与否我们再由T0定时中断子程序来监视。这样就够成了一个循环,T0监视T1,T1监视主程序,主程序又来监视T0,从而保证系统的稳定运行。51 系列有专门的看门狗定时器,对系统频率进行分频计数,定时器溢出时,将引起复位.看门狗可设定溢出率,也可单独用来作为定时器使用。凌阳61的看门狗比较单一,一个是时间单一,第二是功能在实际的使用中只需在循环当中加入清狗的指令就OK了。AVR系列中,avr-libc 提供三个API 支持对器件内部Watchdog 的操作,它们分别是:wdt_reset() // Watchdog 复位wdt_enable(timeout) // Watchdog 使能wdt_disable() // Watchdog 禁止C8051Fxxx单片机内部也有一个21位的使用系统时钟的定时器,该定时器检测对其控制寄存器的两次特定写操作的时间间隔。如果这个时间间隔超过了编程的极限值,将产生一个WDT复位。-------------------------------------------------------------------------------- [编辑本段]看门狗使用注意

安川伺服驱动器的常用故障代码

安川伺服驱动器的常用故障代码 A.00 绝对值数据错绝对值错误或没收到 A.02 参数中断用户参数检测不到 A.04 参数设置错误用户参数设置超出允许值 A.10 过流电源变压器过流 A.30 再生电路检查错误再生电路检查错误 A.31 位置错误脉冲溢出位置错误,脉冲超出参数Cn-1E设定值 A.40 主电路电压错误主电路电压出错 A.51 过速电机转速过快 A.71 过载(大负载) 电机几秒至几十秒过载运行 A.72 过载(小负载) 电机过载下连续运行 A.80 绝对值编码器差错绝对值编码器每转脉冲数出错ssszxx f A.81 绝对值编码器失效绝对值编码器电源不正常 A.82 绝对值编码器检测错误绝对值编码器检测不正常 A.83 绝对值编码器电池错误绝对值编码器电池电压不正常 A.84 绝对值编码器数据不对绝对值编码器数据接受不正常 A.85 绝对值编码器转速过高电机转速超过400转/分后编码器打开 A.A1 过热驱动器过热 A.B1 给定输入错误伺服驱动器CPU检测给定信号错误 A.C1 伺服过运行伺服电机(编码器)失控 A.C2 编码器输出相位错误编码器输出A、B、C相位出错 A.C3 编码器A相B相断路编码器A相B相没接 A.C4 编码器C相断路编码器C相没接 A.F1 电源缺相主电源一相没接 A.F3 电源失电电源被切断 CPF00 手持传输错误1 通电5秒后,手持与连接仍不对 CPF01 手持传输错误2 传输发生5次以上错误 A.99 无错误操作状态不正常 安川伺服报警代码 报警代码报警名称主要内容 A.00 绝对值数据错误不能接受绝对值数据或接受的绝对值数据异常A.02 参数破坏用户常数的“和数校验”结果异常 A.04 用户常数设定错误设定的“用户常数”超过设定范围 A.10 电流过大功率晶体管电流过大 A.30 测出再生异常再生处理回路异常 A.31 位置偏差脉冲溢出位置偏差脉冲超出了用户常数“溢出(Cn-1E)”的值

C51单片机看门狗电路及程序设计方案

C51单片机看门狗电路及 程序设计案 院系:信息工程学院 年级:2010级 电子一班禹豪 电子一班训虎 电子二班邓启新 一、引言 在由单片机构成的微型计算机系统中,程序的正常运行常常会因为来自外界的电磁场干扰等原因而被打断,从而造成程序的跑飞,而陷入死循环。由此导致单片机控制的系统无法继续工作,造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片或程序,俗称"看门狗"(watchdog) (1)看门狗电路基本原理 看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连**,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。 *此处设计原理实际上为下文中硬件看门狗设计思路。

(2)看门狗电路一般设计式 “看门狗”电路一般分为硬件看门狗与软件看门狗两种设计式。 硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位。如果出现死循环,或者说PC指针不能回来,那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813,5045,IMP 813等,价格4~10元不等. 软件看门狗技术的原理和硬件看门狗类似,只不过是用软件的法实现(即利用单片机部定时器资源,通过编程模拟硬件看门狗工作式),以51系列为例:因在51单片机中有两个定时器,在利用部定时器资源来对主程序的运行进行监控时。可以对T1(或T0)设定一定的定时时间(设定的定时值要小于主程序的运行时间),当产生定时中断的时候对一个变量进行赋值(此变量在主程序运行的开始已有一个初值)。当主程序运行至最后时对此变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。 考虑到设计要求,本设计采用软件看门狗设计思路。 二、看门狗电路整体设计思路 根据设计要求,本设计利用C51单片机部自带的定时器1进行编程,并配合少量电路实现“看门狗“电路功能。整个设计分为软件部分与硬件部分,如下: (1)软件部分设计原理: 软件设计分为三部分:“看门狗“定时器设置程序、溢出中断服务程序和喂狗代码。 1.1设计思路: 1)在主程序开头,“看门狗“定时器设置程序设置定时器1计时50ms。 2)当定时达50ms时,定时器1产生溢出中断,溢出中断服务程序开始工作,将看门狗标志num加1。当num的值等于100时,说明看门狗定时器已经计时5s,此时,单片机I/O端口P1.0输出高电平,对程序进行复位。 3)在此过程中,喂狗代码将被穿插于程序中循环体末尾。当循环体结束时,喂狗代码执行,关闭定时器1、清空num并重新初始化定时器设置。若循环体进入死循环,喂狗代码无法执行,num将一直累加至100,此时程序复位。 注:喂狗代码放置位置可根据num预计数值进行调整:当num门限值较小,即看门狗计数时间较短时,喂狗代码可放于程序中各循环体之后或均匀分布于整个主程序中。当num门限值较大,即看门狗计数时间较长时,喂狗代码可放于程序主循环体末尾。但是需注意看门狗计数时间必须长于正常工作时间,以免非正常复位。 1.2软件设计流程图:

嵌入式系统看门狗实验报告

竭诚为您提供优质文档/双击可除嵌入式系统看门狗实验报告 篇一:《嵌入式系统原理与应用》实验报告04-看门狗实验 《嵌入式系统原理与接口技术》实验报告 实验序号:4实验项目名称:看门狗实验 1 2 3 4 篇二:嵌入式实验报告 目录 实验一跑马灯实验................................................. (1) 实验二按键输入实验................................................. .. (3)

实验三串口实验................................................. . (5) 实验四外部中断实验................................................. .. (8) 实验五独立看门狗实验................................................. (11) 实验七定时器中断实验................................................. (13) 实验十三ADc实验................................................. .. (15) 实验十五DmA实验................................................. .. (17) 实验十六I2c实验................................................. .. (21) 实验十七spI实

富士伺服驱动器报警代码

富士伺服驱动器报警代码 一、报警显示的含义 序号 显示 名称 说明 种类 1 oc1 过电流1 重大故障 2 oc2 过电流2 3 oS 超速 4 Hu 过电压 5 Et1 编码器异常1 6 Et2 编码器异常2 7 ct 控制电路异常 8 dE 存储器异常 9 Fb 保险丝断 10 cE 电机组合异常 11 tH 再生晶体管过热 12 Ec 编码器通信异常 13 ctE CONT 重复 14 oL1 过载1 15 oL2 过载2 16 rH4 浪涌电流抑制电路异常 17 LuP 主电路电压不足 轻微故障 18 rH1 内部再生电阻过热 19 rH2 外部再生电阻过热 20 rH3 再生晶体管异常 21 oF 偏差超出 22 AH 放大器过热 23 EH 编码器过热 24 dL1 ABS 数据丢失1 25 dL2 ABS 数据丢失2 26 dL3 ABS 数据丢失3 27 AF 多旋转溢出 28 ' E 初始化错误 29 ˉPoF 未给伺服电机通电 防撞开关急停 30 ˉPn0 速度零停止(通过输入强制停止信号,以速度零停止) 介质定位装置没有放下 31 =PP1 脉冲列输入运行中 正常状态显示 32 =Pot 检测正/负方向的超程信号中 原点位置时显示(Y 向驱动器显示)

二、报警的处理方法: oc1 过电流1:从伺服放大器输出的电流超过规定值 oc2 过电流2: 原因措施 伺服电机的输出配线错误修复动力线(U、V、W)的配线 确认电线(目测、导通检查),并更换 伺服电机的输出配线短路 伺服电机绝缘不良绝缘电阻测定(对地间在数MΩ以上) 伺服电机的故障线间电阻测定(各线间为数Ω) 再生电阻器的电阻值不合适更换为可适用范围的再生电阻器 因编码器的异常引起的电流不平稳更换伺服电机 未接地线连接地线 oS 超速:伺服电机的转速超过最高速度的1.1倍 原因措施 伺服电机的输出配线错误修复动力线(U、V、W)的配线 伺服电机的转速超速●延长PA1_37:加速时间 ●增大PA1_52:一次延迟S形时间常数 ●提高PA1_15:自整定增益1 Hu 过电压:伺服放大器内部直流电压高于上限值 原因措施 电源电压过高(刚接通电源后)●确认电源电压在规格范围内 ●若有功率改进用电容器则插入电抗器 外部再生电阻器的未连接或误配线连接外部再生电阻器 再生晶体管破损更换伺服放大器 Et1 编码器异常1:编码器的1转位置检测异常 Et2 编码器异常2 :编码器存储数据的读取异常 原因措施 来自编码器的数据异常使用屏蔽线以免爱噪音影响 编码器出现故障更换伺服电机 ct 控制电路异常:伺服放大器内部的控制电源电压存在异常,内部电路有出现的故障的可能性 原因措施 伺服放大器出现故障即使再次接通电源也未恢复时,更换伺服放 大器 dE 存储器异常:伺服放大器内保存参数数据损坏 原因措施

看门狗溢出实验 按键不停喂狗

/*----------------------------------------------- 名称:看门狗溢出实验按键不停喂狗 论坛:https://www.sodocs.net/doc/b43474103.html, 编写:shifang 日期:2009.5 修改:无 内容:通过按键喂狗防止溢出复位看门狗演示程序在16383个机器周期内必须至少喂狗一次 标准A T89s52单片机试验通过。 ------------------------------------------------*/ #include sfr WDTRST = 0xA6; sbit K1 = P3^0; sbit K2 = P3^1; sbit LED1=P1^1; sbit LED2=P1^2; void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时 /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { LED1=0; DelayMs(100); LED1=1; DelayMs(100); TMOD=0x01; TH0=0xc6; //定时16ms

TL0=0x66; EA=1; ET0=1; WDTRST=0x1e; //在程序初始化中激活看门狗。 WDTRST=0xe1; //先送1E,后送E1 if(K1==0) { TR0=1; } while(1) { if(K2==0) { TR0=0; } LED2=1; LED1=1; DelayMs(100); LED2=0; DelayMs(100); } } /*------------------------------------------------ 定时器中断函数 ------------------------------------------------*/ void T ime0(void) interrupt 1 { TH0=0xc6; //定时16ms TL0=0x66; WDTRST=0x1e; //喂狗指令 WDTRST=0xe1; } /*------------------------------------------------ uS延时函数,含有输入参数unsigned char t,无返回值

伺服驱动器报警解决方法..

保护功能 报警 代码 故障原因应对措施 控制电源 欠电压 11 控制电源逆变器上P、N 间电压低于规定值。1)交流电源电压太低。瞬时失电。 2)电源容量太小。 电源接通瞬间的冲击电流导致电压跌落。 3)驱动器(内部电路)有缺陷。 测量 L1C、L2C 和r、t 之间电压。 1)提高电源电压。更换电源。 2)增大电源容量。 3)请换用新的驱动器。 过电压 12 电源电压高过了允许输入电压的范围。 逆变器上 P、N 间电压超过了规定值。 电源电压太高。 存在容性负载或UPS(不间断电源),使得 线电压升高。 1)未接再生放电电阻。 2)外接的再生放电电阻不匹配,无法吸收再 生能量。 3)驱动器(内部电路)有缺陷。 测量 L1、L2 和L3 之间的相电压。 配备电压正确的电源。 排除容性负载。 1)用电表测量驱动器上P、B 间外接电阻阻值。如果读数是“∞”,说明电阻没有真正地接入。请换一个。 2)换用一个阻值和功率符合规定值的外接电阻。 3)请换用新的驱动器。 主电源 欠电压 13 当参数Pr65(主电源关断时欠电压报警触发 选择)设成1 时,L1、L3 相间电压发生瞬时 跌落,但至少是参数Pr6D(主电源关断检测 时间)所设定的时间;或者,在伺服使能(Servo-ON)状态下主电源逆变器P-N 间相 电压下降到规定值以下。

1)主电源电压太低。发生瞬时失电。 2)发生瞬时断电。 3)电源容量太小。 电源接通瞬间的冲击电流导致电压跌落。 4)缺相:应该输入3 相交流电的驱动器实际输入的是单相电。 5)驱动器(内部电路)有缺陷。 测量 L1、L2、L3 端子之间的相电压。 1)提高电源电压。 换用新的电源。 排除电磁继电器故障后再重新接通电源。 2)检查Pr6D 设定值,纠正各相接线。 3)请参照“附件清单”,增大电源容量。 4)正确连接电源的各相(L1、L2、L3)线路。单相电源请只接L1、L3 端子。 5)请换用新的驱动器。 过电流 和 接地错误 14 * 流入逆变器的电缆超过了规定值。 1)驱动器(内部电路、IGBT 或其他部件) 有缺陷。 2)电机电缆(U、V、W)短路了。 3)电机电缆(U、V、W)接地了。 4)电机烧坏了。 5)电机电缆接触不良。 6)频繁的伺服ON/OFF(SRV-ON)动作导 1)断开电机电缆,激活伺服ON 信号。如果马上出现此报警,请换用新驱动器。 2)检查电机电缆,确保U、V、W 没有短路。正确的连接电机电缆。 3)检查U、V、W 与“地线”各自的绝缘电阻。如果绝缘破坏,请换用新机器。 4)检查电机电缆U、V、W 之间的阻值。如果阻值不平衡,请换用新驱动器。 5)检查电机的U、V、W 端子是否有松动或未接,应保证可靠的电气接触。 6)请换用新驱动器。 Minas A4 系列驱动器技术资料选编- 61 - 保护功能 报警 代码 故障原因应对措施

用CD4060制作看门狗报警电路

用CD4060制作看门狗报警电路 看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。 原理图: CD4060芯片特性 1) 电压范围宽,应该可以工作在3V~15V,输入阻抗高,驱动能力差外,跟74系列的功能基本没有区别; 2) 输入时,1/2工作电压以下为0,1/2工作电压以上为1; 3) 输出时,1=工作电压;0=0V; 4) 驱动能力奇差,在设计时最多只能带1个TTL负载; 5) 如果加上拉电阻的话,至少要100K电阻; 6) 唯一现在使用的可能就是计数器,CD4060的计数器可以到14级二进制串行计数。 以AT89C51为例: 看门狗电路由14位二进制计数器CD4060和三极管VT1、VT2等组成。

Vout接单片机AT89C51的引脚输出口P1.7,由单片机的CPU向看门狗电路发送喂狗信号——正脉冲,在两个正脉冲间隔内,P1.7保持为低电平(此功能要结合软件才能实现,相应的软件设计在下面介绍)。我们知道,单片机AT89C51的I/O口带灌电流负载的能力比较大,每个引脚低电平时的吸入电流为20 mA,带拉电流负载的能力却很小,实测情况是,每个引脚高电平时的输出电流仅25μA,现在P1.7口被设计成带拉电流负载的方式,为了提高P1.7口带拉电流负载的能力,所以,电路中设置了上拉电阻R3。 14位二进制计数器CD4060的计数脉冲由其内部振荡器和外接阻容元件R1、R2、C1组成的电路产生,振荡周期为 T0SC=2.2×R1×C1=0.22 ms 振荡器产生的计数脉冲(矩形波)可以直接引出,同时还可以从CD4060的10个输出端Q4~Q10和Q12~Q14得到不同分频系数的方波输出,各方波输出信号的周期如表1所示。这样,如果CD4060得不到CPU通过P1.7口发送来的喂狗信号——正脉冲,则CD4060的输出端Q14在1.8S内将产生一个完整周期的方波信号,而且低电平在前,高电平在后,其高电平经三极管VT1、VT2处理后形成单片机AT89C51的复位信号,使单片机AT89C51复位。由此可见,单片机AT89C51正常工作时,只要在0.9S内从P1.7口送出一个正脉冲,便可及时清零看门狗,输出端Q14就不会产生定时溢出信号,从而使看门狗电路对单片机系统不起作用。并且,从CD4060的10个输出端Q4~Q10和Q12~Q14可以得到不同周期的方波信号,经三极管VT1、VT2处理后形成单片机系统的复位信号,可以适应不同用户应用程序,从而该硬件看门狗电路可以适应不同的单片机应用系统。 对MCS-51系列的单片机而言,它所需要的复位信号是高电平宽度大于2个机器周期的正脉冲,例如,单片机的时钟脉冲频率为12 MHz时,则所需要的复位信号高电平宽度为2μs以上就可以了,而由上面的分析可知,CD4060的Q14输出的是高电平宽度为0.9 s的方波,如果让它直接作为单片机的复位信号,则单片机的复位时间势必在0.9 s以上,这样尽管可以使程序跑飞的单片机复位,但是显然没有做到尽快地引导跑飞的程序到正确的轨道来,如果这样做的话,对于某些单片机应用系统而言可能带来非常严重的后果。图1中的三极管VT1、VT2及其周围阻容元件构成波形转换电路,把较宽的正脉冲变换为较窄的正脉冲,从而较好地解决了上述的问题。三极管VT1、VT2构成的2级直接耦合放大器作为缓冲器使用,它是CD4060的输出端Q14的灌电流负载,C2、R8是微分电路。 经分析后不难看出,电路中的R7、R8、C2还具有单片机上电复位的功能。 2 上电复位与看门狗信号复位的不同处理过程 由于程序跑飞很可能会造成一些随机破坏事件,对某些系统而言,希望尽可能从断点处恢复运行,因此,有必要妥善解决跑飞的程序回复后的处理。 单片机应用系统上电时,上电复位电路会使得单片机处于复位状态,这一般称为冷启动,这种情况下,单片机处于复位状态表现为: (1) 程序计数器PC的值为0000H。 (2) I/O口(P0、P1、P2、P3(1))为FFH状态,即准双向I/O口的输入状态。 (3) 堆栈指示器SP=07H,即堆栈底为片内RAM的07H单元。 (4) 除上述状态外,所有特殊功能寄存器SFR的有效位均为0。 (5) 上电复位时,由于是重新供电,RAM在断电时数据丢失,上电复位后为随机数。

单片机心得与看门狗程序整理知识分享

单片机学习心得 时光飞逝,一转眼,一个学期又接近尾声了,本学期的单片机的课程学习也结束了。这里说说我学习单片机的心得和体会。 1、万事开头难、要勇敢迈出第一步。开始的时候,不要老是给自己找借口,说KEIL 不会建项目啦、没有实验板啦之类的。遇到困难要一件件攻克,不会建项目,就先学它,这方面网上教程很多,随便找找看一下,做几次就懂了。然后可以参考别的人程序,抄过来也无所谓,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少,总得建个项目,再配置一下项目,然后建个程序,加入项目中,再写代码、编译、生成HEX刷进单片机中、运行。必须熟悉这一套工序。个人认为,一块学习板还是必要的,写好程序在上面运行一下看结果,学习效果会好很多,仿真器就看个人需要了。单片机是注重理论和实践的,光看书不动手,是学不会的。 2、知识点用到才学,不用的暂时丢一边。 厚厚的一本书,看着人头都晕了,学了后面的,前面的估计也快忘光了,所以,最好结合实际程序,用到的时候才去看,不必说非要把书从第一页看起,看完它才来写程序。比如你写 流水灯,完全就没必要看中断的知识,专心把流水灯学好就是了,这是把整本书化整为零,一小点一小点的啃。 3、程序不要光看不写,一定要自己写一次。 最开始的时候,啥都不懂,可以抄人家的程序过来,看看每一句是干什么用的,达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次,你会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。当你自己能写出来的时候,说明你就真的懂了。 4、必须学会掌握调试程序的方法。不少人写程序,把代码写好了,然后一运行,不是自己想要的结果,就晕了,然后跑到论坛上发个帖子,把程序一贴,问:为什么我的程序不能正常运行?然后就等别人来给自己分析。这是一种很不好的行为,应该自己学会发现问题和学会如何解决问题。这就需要学习调试程序的方法,比如KEIL里,可以下断点啦,查看寄存器内容等等,这些都是调试程序的手段,当你发现你写的程序运行结果和你想象中不一样的时候,你可以单步,也可以下断点,然后跟踪,查看各相关寄存器内容,看看程序运行过中是不是有什么偏差,找出影响结果的地方,改正过来。这一个过程非常重要,通过程序的排错,你可以学到的知识是书上得不到的。 5、找到解决问题思路比找到代码更重要。 我们用单片机来控制周边器件,达到我们想到的目的,这是一个题目,而如何写出一个程序,来控制器件按你想要的结果去运作,这个就是解题的思路。要写程序,就得先找到解决问题的思路,你学会找出这个解题思路,比你找到代码更为重要。不少人很喜欢找人家的代码,有的人甚至有了代码就直接复制到自己的程序中,可以说,这不是一种学习的态度,无助于你编程水平的提高。我几乎不怎么看人家的代码,多数时候是看别人的思路,有方框图最好,没有的话文字说明也可以,要从代码中看出别人处理问题的思路,是相当困难的,特别是大型的程序,看起来是非常的累人,所以现在我也明白了,以前读书时说的程序流程图很重要,现在算是知道了。当你知道一个问题怎么去解决了,那么剩下的只是你安排代码去完成,这就已经不是什么问题了。 6、开动脑筋,运用多种方法,不断优化自己的程序。 想想用各种不同方法来实现同一功能。这是一个练习和提高的过程,一个问题,你解决了,那么你再想想,能不能换种写法,也可以实现同一功能,或者说,你写出来的代码,能不能再精简一点,让程序执行效率更高,这个过程,就是一个进步的过程。很多知识和经验的获得,并不是直接写在书让

看门狗实验

看门狗实验 1. 为什么要看门狗?看门狗的原理是什么? 外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog)它的基本原理为,给看门狗设置一个时间周期,如果在这个周期内程序不能正常运行结束,定时器会自动益处,则系统会自动复位,使系统重新运行进而得到监控系统的作用。假设程序运行的时间为Tp,定时器时间为Ti,Ti>Tp,在Ti时间内程序正常结束则不会发生益处的现象,如果受干扰等原因系统不能在Tp时刻内修改计数器的值,则在Ti时刻时系统会自动复位,引发系统重新运行。 一般情况下都是应用程序在运行结束后去喂狗,当应用程序出现异常而不能去喂狗时,在超过看门狗定时器的时间范围后,cpu会复位,起始喂狗的过程就是给看门狗的寄存器置位,当程序开始运行时,看门狗的计数器开始递减,在减到零之前必须喂狗,否则系统会复位,当减到零时还没有喂狗则系统复位。 2. 看门狗的功能 1)作为常规功能可以产生中断,通用的中断用16bit定时器 2)作为看门狗使用,当时钟计数器减为0时(超时),他将产生一个128个时 (PCLK)钟的的复位信号 我们常见的时钟有3个,FCLK,HCLK,PCLK,他们的工作频率分别是400MHz,400/3MHz,和400/6MHz,看门狗使用的是PCLK时钟。 下图为看门狗的电路示意图 PCLK经过两次降频,prescaler的值从0到256-1,Division_factor的值为16,32,64,128。 看门狗定时器记数值的计算公式如下: t_watchdog的值是寄存计数器(WDTCNT)多长时间自减一次,他的单位是时间,一旦看门狗定时器被允许,看门狗定时器数据寄存器(WTDAT)的值不能被自动的装载到看门狗计数器(WTCNT)中,因此,看门狗启动前要将一个初始值写入看门狗计数器 (WTCNT)中。

富士伺服驱动器的常用故障代码及其检查与维护

一、检查 1、警报检出内容 (图1) (按键面板的7段LED显示器以秒的间隔闪烁。) 2、警报检出时的动作 (1)在检出的同时自由运转 (图2) (2)以最大转矩减速,停止后自由运转 (图3) 二、维护 1、过电流 【显示】 (图4) 【检出内容】 主回路晶体的输出电流超过规定值。

【要因与处置】 (图5) 伺服马达的动力沛县有可能漏电或短路。 通常,对地间有数MΩ以上,线圈之间的电阻值均衡。 2、过速度 【显示】 (图6) 【检出内容】 伺服马达的回转速度超过最高速度的倍。 【要因与处置】 (图7) 马达的回转速度有可能出现峰突。 (图8) 3、过电压 【显示】 (图9) 【检出内容】 伺服驱动器内部的直流中间电压比上限值大。

【要因与处置】 (图10) 可以在按键面板的监视模式确认内部的中间电压。 On 16:直流中间电压(最大值)On 17:直流中间电压(最小值)约在420V时检出电压。 4、编码器异常 【显示】 (图11) 【检出内容】 伺服马达内部的编码器可能已损坏。 【要因与处置】 (图12) 编码器内部的CPU是以自我诊断的结果来检出警报的。 这时,伺服驱动器马达之间正在进行通信。 5、控制电流异常 【显示】 (图13) 【检出内容】

伺服驱动器内部的控制电源发生异常,有损坏的可能性。 【要因与处置】 (图14) 6、记忆体异常 【显示】 (图15) 【检出内容】 保存在伺服驱动器EEPROM内部的参数内容已损坏。 【要因与处置】 (图16) 发生记忆体异常时,请执行参数的初始化。 执行初始化之后仍然会检出记忆体异常时,必须更换驱动器。 7、回生晶体过热 【显示】 (图17) 【检出内容】 伺服驱动器内装的回生处理用晶体过热。 【要因与处置】

实验八 看门狗实验

实验八看门狗实验 一、实验目的 1、了解看门狗的作用; 2、掌握看门狗的使用方法。 二、实验内容 1、编程实现看门狗功能,观察看门狗作用; 2、编程实现看门狗喂狗。 三、实验设备 1、硬件: JX44B0实验板; PC机; JTAG仿真器; 2、软件: PC机操作系统(WINDOWS 2000); ARM Developer Suite v1.2; Multi-ICE V2.2.5(Build1319); 四、基础知识 1、用ADS集成开发环境,编写和调试程序的基本过程; 2、应用程序的框架结构。 五、实验说明 1、看门狗的功能和工作原理 嵌入式系统运行时受到外部干扰或者系统错误,程序有时会出现“跑飞”,导致整个系统瘫痪。为了防止这一现象的发生,在对系统稳定性要求较高的场合往往要加入看门狗电路。看门狗的作用就是当系统“跑飞”而进入死循环时,恢复系统的运行。 其基本原理为:当本系统程序完整运行一周期的时间为Tp,看门狗的定时周期时Ti,Ti>Tp,在程序运行一周期后,就修改定时器的计数值,(俗称“喂狗”),只要程序正常运行,定时器就不会溢出,若由于干扰等原因使系统不能在Tp时刻修改定时器的计数值,定时器将在Ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控作用。 在一个完整的嵌入式机系统或单片机最小系统中通常都有看门狗定时器。而且一般集成在处理芯片中,看门狗实际上就是一个定时器,只是它在期满后将自动引起系统复位。 2、S3C44B0看门狗的控制 S3C44B0的看门狗定时器有两个功能: 1)为常规定时器使用,而且可以引发中断; 2)为看门狗定时器使用,期满时,它可以产生128个时钟周期的复位信号。 下图是S3C44B0看门狗的示意图。输入时钟为MCLK(该时钟频率等于系统的主频),它经过两级分频,最后将分频后的时钟作为该定时器的输入时钟,当计数器期满后可以产生中断或者复位信号。

服务器USB防死机看门狗解决方案

服务器USB防死机看门狗 解决方案 适用设备:基于Windows系统的工控机、监控主机、DVR、触摸屏主机、广告发布机、排号机、无人值守游戏工作室、电子 警察主控机、服务器、PC机等需要长时间稳定运行的设 备。嵌入式系统、linux系统暂不支持。 主要功能:当Windows或监视的应用程序、服务无响应后自动恢复,恢复不成功则自动重启机器。 独有特点:软件采用多任务技术,可同时连续监测128个应用程序或Windows服务。USB接口芯片采用英国FT公司的工业级 产品以确保防死机智能卡硬件的稳定可靠。独有的计划任 务功能设置功能可以定期重新启动电脑以保障系统的稳 定。 使用价值:智能监测,灵敏度高;无需人工到达现场手动重启,响应速度快,实现真正的24小时无人值守。 专业设计:软硬件部分均由amdtech进行的可靠性,稳定性及安全性设计,给客户带来省心放心的防死机效果。 一、系统组成

本系统由监测软件(守护精灵V2.0)、硬件板卡及若干连接线组成。 图1软件界面 图2硬件狗卡板 1、USB口 2、两个RESET口; 3、电源指示灯(D1); 4、工作指示灯(D2) 注意:红色电源指示灯(3)亮表示工作正常。绿色工作指示灯(4)

亮表示工作正常;绿灯灭表示当前正在系统设置或系统正 在重启或系统没有正常工作。 5、PC-USB端口连接线(红色端接VCC,白色端接GND) 6、reset 线 图3连接线 二、硬件安装(★★★安装前请先关闭主机电源★★★) 第一步:用USB线(5)连接硬件狗USB口(1)和主机上的USB口。 注意:硬件狗卡板上从左至右依次是VCC, Data-,Data+,GND,另外PC-USB端口连接线红色端接VCC, 白色端接GND,请务必按照该线序连接。 第二步:将机箱reset按钮连接线接到硬件狗的reset口(2)(两个任选一个),用reset线(6)连接主板reset跳线和硬件狗上剩 下的reset口(2)。 第三步:用固定螺丝将硬件卡板固定在主机内部。

相关主题