作者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/m.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