作者ResolaQQ (ResolaQQ)
看板Electronics
标题[问题] 请问8051序列传输的中断要怎麽产生
时间Wed Aug 19 21:54:24 2015
参照
http://www.finetech.idv.tw/techdoc/8051serial/8051serial.htm
他说中断法的执行效率远超过等待法,所以我也想采用中断法
不过我的程式只需要把资料传送出去,不需要接收,看起来大概像这样
void serial_isr() __interrupt 4
{
// 把 buffer 的资料传送出去
}
main()
{
while (1)
{
// 把资料塞到 buffer
}
}
问题是这样不会动,看起来 serial_isr 并没有被呼叫
於是我试着在 main 里先传送一个数字,serial_isr 就有被呼叫了
我猜大概是因为中断是在传送完成之後才产生,没传送任何东西自然也不会有任何中断
那麽如果我想维持让 main 负责产生资料,serial_isr 负责传送资料
该怎麽写才能让 serial_isr 开始跑呢?
应该不能在 main 里呼叫 serial_isr 吧?这样资料好像会乱掉
感觉是个很蠢的问题,可是 google 不到答案,还请各位帮忙一下
--
放着养蚊子的部落格
http://resolaqq.blogspot.tw
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.165.41.215
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1439992468.A.DD3.html
1F:推 yudofu: main只要一直检查传送有没有完成、完成就写进去,中断那边 08/19 23:20
2F:→ yudofu: 是检查到有东西要写的中断就把东西送出去、一直到确认写完 08/19 23:21
3F:→ yudofu: 清空旗标再挑出去,中断涵式本身没有在呼叫 08/19 23:21
4F:→ dsplab: 未必,使用1T的8051,921600bps下使用询问方式也是可以的 08/20 08:43
5F:推 yudofu: 就算polling可以,可是原po想要要用中断提高效率啊,没有 08/20 09:25
6F:→ yudofu: 必要硬去用polling吧。总之中断写好之後,main要去"触发" 08/20 09:25
7F:→ yudofu: 中断而不是"呼叫"中断 08/20 09:25
8F:→ ResolaQQ: 问题就是我不知道要怎麽触发 interrupt 4 的中断呀 08/20 09:37
9F:→ ResolaQQ: 似乎是接收到一个资料(我的程式没在接收) 08/20 09:38
10F:→ ResolaQQ: 或是刚传送完一个资料(但第一个资料都还没开始传) 08/20 09:38
11F:→ ResolaQQ: 上面两种看起来都不可行,那要怎麽产生中断 冏 08/20 09:39
12F:推 yudofu: 你的范例不是就写中断4了吗?当你使用并enable uart中断的 08/20 10:03
13F:→ yudofu: 时候,收送产生ti/ri都会产生中断 08/20 10:03
14F:→ ResolaQQ: 我刚试了一下,手动把TI从0改到1似乎不会产生中断对吧? 08/20 10:33
15F:推 yudofu: 中断4的using1是用timer1的内部中断,timer1的时间设定好b 08/20 11:13
16F:→ yudofu: aud rate之後,就会触发中断 08/20 11:13
17F:→ ResolaQQ: 不晓得您方不方便提供简单范例,我真的搞不定... 08/20 17:39
18F:→ ResolaQQ: 用开关ES的方式写是成功了,但跑的比while(TI==0);还慢 08/20 17:40
20F:→ yudofu: 范例,里面注解是简体的,他的范例是用中断去定时检查UART 08/20 20:39
21F:→ yudofu: 的收、有要发的时候main自己发,你的应用可以把发放在中断 08/20 20:39
22F:→ yudofu: 里面,中断触发时间检查要送的东西是不是空的,是空的就跳 08/20 20:40
23F:→ yudofu: 出不送,有的话就用阵列循环发送到空为止,至於要送的资料 08/20 20:41
24F:→ yudofu: 就在main里面写。它的范例只是单纯的把你输入的字元loop回 08/20 20:41
25F:→ yudofu: 去,你可以把main里面的程式通通搬到中断,main里面只有 08/20 20:42
26F:→ yudofu: while(1)工作也是正常,证明全部都是中断在处理。 08/20 20:42
27F:→ ResolaQQ: 太感谢了,不过看着有点不太对劲,现在写到脑袋打结 08/20 20:57
28F:→ ResolaQQ: 等睡醒再来研究,写软体跟写硬体差好多,一堆怪问题... 08/20 20:58
29F:→ ResolaQQ: 他应该不是用中断定时检查耶,是因为有收到东西 08/21 03:42
30F:→ ResolaQQ: RI自动触发中断,我把它的程式烧进去试的结果是这样 08/21 03:43
31F:→ yudofu: RI/Ti会触发中断,但是触发之後用timer1按照鲍率去检查中 08/21 06:38
32F:→ yudofu: 段要做的事情然後相当於自动设定timer把字节一个一个送出 08/21 06:40
33F:→ yudofu: 去 总之....就像程式写的这样啦 哈 08/21 06:40
34F:→ ResolaQQ: 了解,我先写个基本款,确定会动再来处理这个问题好了 08/21 07:16
35F:→ ResolaQQ: 实作後发现延迟并不明显,远比软体buffer的问题还小 08/23 17:10
36F:→ ResolaQQ: 看来可以不用管XD 以後有需要的时候再来研究 08/23 17:11