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

[复制链接]
6147|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的中断程序里面了。
joyme 发表于 2011-4-19 15:41 | 显示全部楼层
你的定时器设计的是多长时间,调用这么多函数,会不会还没有执行完毕,下一次定时中断又来了?
twz8858877 发表于 2011-4-19 16:37 | 显示全部楼层
在中断程序中最好是不要调用函数,很容易出错,可以置一个标志,在主程序处理,编译器有时候采用工作寄存器的直接地址来传递参数,因为中断程序和主程序采用的工作寄存器不同,导致错误。
ayb_ice 发表于 2011-4-19 17:24 | 显示全部楼层
这样的中断程序很恐怖
ayb_ice 发表于 2011-4-19 17:24 | 显示全部楼层
这样的中断程序很恐怖
928315 发表于 2011-4-19 20:51 | 显示全部楼层
Kalman_Filter(acceler,gyro);

这玩意要花不少时间吧。中断做这事,程序还不乱跑才怪
sysdriver 发表于 2011-4-19 22:17 | 显示全部楼层
确实很恐怖

LZ想过没,是否中断优先级的关系?
因为每发完一个串口帧,硬件便置位TI,而默认的的优先级是t0>uart。
但是,你的程序怎么不死循环呢?难道你的发送程序没有TI=0;SBUF=XXX;while(!TI);TI =0;吗?
xlsbz 发表于 2011-4-20 12:31 | 显示全部楼层
删掉using 2 再说
 楼主| rezire199847 发表于 2011-4-20 15:13 | 显示全部楼层
1、串口程序我写显示出来,不要计较这么多?
2、不嵌套程序的话,是不是可以把要调用的程序直接打在中断里面,就是处理数据的函数直接放到中断里面?
3、处理这么多的东西我也是没有办法的,要不然怎么办?主程序中又不能不断处理数据
4、会不会单片机的定时器中断坏掉了?
 楼主| rezire199847 发表于 2011-4-20 15:14 | 显示全部楼层
1、串口程序我写显示出来,不要计较这么多?
2、不嵌套程序的话,是不是可以把要调用的程序直接打在中断里面,就是处理数据的函数直接放到中断里面?
3、处理这么多的东西我也是没有办法的,要不然怎么办?主程序中又不能不断处理数据
4、会不会单片机的定时器中断坏掉了?
lxc806705 发表于 2011-4-20 15:15 | 显示全部楼层
设置你的IP,定时器0 的中断优先级默认高于串口,而你要用串口发送数据必须用到中断,因此你在定时器0里肯定发不出去。一半发的在主程序里发,不要放在中断里。
ayb_ice 发表于 2011-4-20 16:16 | 显示全部楼层
改void Timer0() interrupt 1 using 2

void Timer0() interrupt 1
在没有真正搞清楚using 前不要使用
twz8858877 发表于 2011-4-20 17:03 | 显示全部楼层
2、不嵌套程序的话,是不是可以把要调用的程序直接打在中断里面,就是处理数据的函数直接放到中断里面?
可以
aaron96031 发表于 2011-4-20 17:14 | 显示全部楼层
这样的中断,非把CPU累死不可
老鱼探戈 发表于 2011-4-20 17:46 | 显示全部楼层
AD_calculate();
    Kalman_Filter(acceler,gyro);
    PWM_calculate();
    PWM_motors(R_motor,L_motor);

LZ数一下这四个函数占多少ROM,看你的中断时间够不够。里面不会有DELAY()这样的延时吧。
老鱼探戈 发表于 2011-4-20 17:46 | 显示全部楼层
AD_calculate();
    Kalman_Filter(acceler,gyro);
    PWM_calculate();
    PWM_motors(R_motor,L_motor);

LZ数一下这四个函数占多少ROM,看你的中断时间够不够。里面不会有DELAY()这样的延时吧。
aderson1234 发表于 2011-4-21 08:33 | 显示全部楼层
10楼说的很精彩啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

60

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部