打印

串口发送程序,放在t0的中断程序中不能发送why?

[复制链接]
4921|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rezire199847|  楼主 | 2011-4-19 12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机这样的一个问题,就是我串口发送程序,放在t0的中断程序中不能发送,但是放在主程序中能发送,我在t0中断程序中设置一个变量n,当执行一次中断就n++,然后再让主程序发送n,发现n是0,然后我用软件调试程序,发现程序是执行中断的,而且n的值也是变化的,那么问题在哪里呢?求解

相关帖子

沙发
ayb_ice| | 2011-4-19 13:28 | 只看该作者
上程序

使用特权

评论回复
板凳
rezire199847|  楼主 | 2011-4-19 15:15 | 只看该作者
太长了,就发个中断吧
void Timer0() interrupt 1 using 2
{
    TR0=0;
    TL0 = 0xc0;
    TH0 = 0xff;
    AD_calculate();
    Kalman_Filter(acceler,gyro);
    PWM_calculate();
    PWM_motors(R_motor,L_motor);
    nn=nn+1;
    SendData(nn);
    TR0 = 1;
}

使用特权

评论回复
地板
wy3168| | 2011-4-19 15:26 | 只看该作者
中断不能嵌套吧,你的发送程序SendData()是放在了to的中断程序里面了。

使用特权

评论回复
5
joyme| | 2011-4-19 15:41 | 只看该作者
你的定时器设计的是多长时间,调用这么多函数,会不会还没有执行完毕,下一次定时中断又来了?

使用特权

评论回复
6
twz8858877| | 2011-4-19 16:37 | 只看该作者
在中断程序中最好是不要调用函数,很容易出错,可以置一个标志,在主程序处理,编译器有时候采用工作寄存器的直接地址来传递参数,因为中断程序和主程序采用的工作寄存器不同,导致错误。

使用特权

评论回复
7
ayb_ice| | 2011-4-19 17:24 | 只看该作者
这样的中断程序很恐怖

使用特权

评论回复
8
ayb_ice| | 2011-4-19 17:24 | 只看该作者
这样的中断程序很恐怖

使用特权

评论回复
9
928315| | 2011-4-19 20:51 | 只看该作者
Kalman_Filter(acceler,gyro);

这玩意要花不少时间吧。中断做这事,程序还不乱跑才怪

使用特权

评论回复
10
sysdriver| | 2011-4-19 22:17 | 只看该作者
确实很恐怖

LZ想过没,是否中断优先级的关系?
因为每发完一个串口帧,硬件便置位TI,而默认的的优先级是t0>uart。
但是,你的程序怎么不死循环呢?难道你的发送程序没有TI=0;SBUF=XXX;while(!TI);TI =0;吗?

使用特权

评论回复
11
xlsbz| | 2011-4-20 12:31 | 只看该作者
删掉using 2 再说

使用特权

评论回复
12
rezire199847|  楼主 | 2011-4-20 15:13 | 只看该作者
1、串口程序我写显示出来,不要计较这么多?
2、不嵌套程序的话,是不是可以把要调用的程序直接打在中断里面,就是处理数据的函数直接放到中断里面?
3、处理这么多的东西我也是没有办法的,要不然怎么办?主程序中又不能不断处理数据
4、会不会单片机的定时器中断坏掉了?

使用特权

评论回复
13
rezire199847|  楼主 | 2011-4-20 15:14 | 只看该作者
1、串口程序我写显示出来,不要计较这么多?
2、不嵌套程序的话,是不是可以把要调用的程序直接打在中断里面,就是处理数据的函数直接放到中断里面?
3、处理这么多的东西我也是没有办法的,要不然怎么办?主程序中又不能不断处理数据
4、会不会单片机的定时器中断坏掉了?

使用特权

评论回复
14
lxc806705| | 2011-4-20 15:15 | 只看该作者
设置你的IP,定时器0 的中断优先级默认高于串口,而你要用串口发送数据必须用到中断,因此你在定时器0里肯定发不出去。一半发的在主程序里发,不要放在中断里。

使用特权

评论回复
15
ayb_ice| | 2011-4-20 16:16 | 只看该作者
改void Timer0() interrupt 1 using 2

void Timer0() interrupt 1
在没有真正搞清楚using 前不要使用

使用特权

评论回复
16
twz8858877| | 2011-4-20 17:03 | 只看该作者
2、不嵌套程序的话,是不是可以把要调用的程序直接打在中断里面,就是处理数据的函数直接放到中断里面?
可以

使用特权

评论回复
17
aaron96031| | 2011-4-20 17:14 | 只看该作者
这样的中断,非把CPU累死不可

使用特权

评论回复
18
老鱼探戈| | 2011-4-20 17:46 | 只看该作者
AD_calculate();
    Kalman_Filter(acceler,gyro);
    PWM_calculate();
    PWM_motors(R_motor,L_motor);

LZ数一下这四个函数占多少ROM,看你的中断时间够不够。里面不会有DELAY()这样的延时吧。

使用特权

评论回复
19
老鱼探戈| | 2011-4-20 17:46 | 只看该作者
AD_calculate();
    Kalman_Filter(acceler,gyro);
    PWM_calculate();
    PWM_motors(R_motor,L_motor);

LZ数一下这四个函数占多少ROM,看你的中断时间够不够。里面不会有DELAY()这样的延时吧。

使用特权

评论回复
20
aderson1234| | 2011-4-21 08:33 | 只看该作者
10楼说的很精彩啊!

使用特权

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

本版积分规则

0

主题

60

帖子

1

粉丝