打印

如何用定时器延长喂狗的时间?

[复制链接]
3555|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wtt1314|  楼主 | 2007-1-7 13:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
coldra| | 2007-1-7 13:18 | 只看该作者

这个理由不成立,程序结构,喂狗位置不太合适吧

---------------------------------
由于是通信的程序,时间比较长
---------------------------------

使用特权

评论回复
板凳
wtt1314|  楼主 | 2007-1-7 13:23 | 只看该作者

回coldra

是这样的,我是在主程序里面喂得。我把一部分程序贴出来;
main()
{    
    
    SCON = 0x50;  
    TMOD = 0x20;          
    TH1   = B9600;
    TL1 = B9600;
    TCON =TCON|0x40;
    ES =1;
    ET0 = 1;
    
    TMOD = TMOD |1;
    TCON=TCON|0x10;
    //PCON=1;
    EA=1;

    WTDRST=0x1E;//初始化看门狗
    WTDRST=0xe1;  
    
    while(1)
    {
      
       
        if (ptr1!=ptr2)
            tongx();//串口有新数据
    
        if (t0fg==1)
           {
            t0fg=0;
            t0chuli();
            }

            WTDRST=0x1E;//喂狗指令
            WTDRST=0xE1; 
    }

void t0chuli()
{
            static uchar i=0;
            i++;
            if(i==30)
            {
                sendstr("AT+CSQ? ");
.......
问题就在这,如果不加看门狗,能够完整地将AT+CSQ发送出去,现在反而只能发A,就复位了。

使用特权

评论回复
地板
coldra| | 2007-1-7 13:32 | 只看该作者

不知道发送数据是用什么方式

 sendstr("AT+CSQ? ");这个函数是串口发送吧?如果是的话并且数据量比较大,不要停在这里做长时间工作只到发送完成,这里只做启动串口发送即可,并设置发送数据数目,即只发第一个数据,发送完成后中断发下一个数据,中断函数内自己计数并判断发送是否完成。

使用特权

评论回复
5
wtt1314|  楼主 | 2007-1-7 13:43 | 只看该作者

void sendstr(char *str)
{
    char i;
    for (i=0;str!=0;i++)
    { 
       
        while (txfg==1);
        SBUF=str;
        txfg=1;//我在程序内疚已经设置好了中断
        {
        uint i;
        for(i=0;i<=0x1200;i++);
        }
    }
}
   这下该怎么办谢谢!

使用特权

评论回复
6
stycx| | 2007-1-7 13:49 | 只看该作者

在 sendstr() 中喂狗

使用特权

评论回复
7
wtt1314|  楼主 | 2007-1-7 13:52 | 只看该作者

回stycx

我也试了。就在for循环之后,结果还是一样的,晕

使用特权

评论回复
8
coldra| | 2007-1-7 13:54 | 只看该作者

这样

//程序开始时写好串口中断发送初始化

void sendstr(char *str)//只做启动发送第一个数据
{
i=0;
        SBUF=str[0];
}
 
串口发送完成中断函数(函数名)
{
i++;
if(str!=0)SBUF=str;
}

这样就差不多了

使用特权

评论回复
9
wtt1314|  楼主 | 2007-1-7 14:01 | 只看该作者

恩,我试试,等会就来

使用特权

评论回复
10
stycx| | 2007-1-7 14:06 | 只看该作者

看减少延时能否工作

应该是 for(i=0;i<=0x1200;i++);
超时了
看减少延时能否工作
还有 狗的时间能加长就加长

要不就改为
 for(i=0;i<=0x1200;i++)
{
 WTDRST=0x1E;//喂狗指令
 WTDRST=0xE1; 
}

使用特权

评论回复
11
hotpower| | 2007-1-7 14:06 | 只看该作者

为何不测TI减小发送间隔时间???我倒塌了~~~

使用特权

评论回复
12
wtt1314|  楼主 | 2007-1-7 14:14 | 只看该作者

还是不行

估计我得加一个中断函数了,我本来用的中断是利用TI和RI来判断的,哎呀!
static void scon_int() interrupt 4
{
    if(TI==1)
    {
        TI=0;
        txfg=0;
    }
    
    if (RI==1)
    {   
        RI=0;
        buf[ptr1++]=SBUF;
        if (ptr1>=BUFLEN)
        {
            ptr1=0;
        }
    }
    
}

使用特权

评论回复
13
wtt1314|  楼主 | 2007-1-7 14:18 | 只看该作者

呵呵,好了

我把时间改小了,果然行了,谢谢!

使用特权

评论回复
14
coldra| | 2007-1-7 14:19 | 只看该作者

中断中不用判断TI和RI

仿真能进入中断函数吗?

一般发送完中断和接收完中断函数是固定而不是同一个的,用什么编译器?keil?

使用特权

评论回复
15
hotpower| | 2007-1-7 14:32 | 只看该作者

中断中必须判断TI和RI,以区分是发送还是接收中断

而且发送首字符最好用TI=1激活.

使用特权

评论回复
16
coldra| | 2007-1-7 14:36 | 只看该作者

C51很久没写过了,都忘了,晕

51的串口中断是一个,不分接收和发送呀,还要判断,太落伍了

使用特权

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

本版积分规则

23

主题

75

帖子

0

粉丝