找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3604|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

AVR單片機(jī)的串口通信被中斷打亂的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:28415 發(fā)表于 2021-6-4 09:51 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
ATMEGA328P單片機(jī)在接收串口信號時,INT0外部中斷發(fā)生。串口信號是否會被打亂,顯示出亂碼或完全接收不到串口信號了?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:342822 發(fā)表于 2021-6-4 10:49 | 只看該作者
補(bǔ)一下中斷優(yōu)先級
回復(fù)

使用道具 舉報

板凳
ID:883031 發(fā)表于 2021-6-4 11:54 | 只看該作者
你看看外部中斷和串口中斷的優(yōu)先級,51單片機(jī)的外部中斷0的優(yōu)先級最高,如果你沒有把串口設(shè)為高優(yōu)先級的話,肯定是會被打斷的。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:28415 發(fā)表于 2021-6-4 13:50 | 只看該作者
很多朋友們都對我說要設(shè)定一下中斷優(yōu)先級,其實(shí)我的問題是:是否串口通信會被外部中斷打亂,并不是如何讓串口通信正常而忽略外部中斷。
回復(fù)

使用道具 舉報

5#
ID:28415 發(fā)表于 2021-6-4 13:51 | 只看該作者
其實(shí)我是想問當(dāng)串口通訊和外部中斷都存在時,串口通信是否會被外部中斷打亂導(dǎo)致亂碼。并不是設(shè)置優(yōu)先級的問題。
回復(fù)

使用道具 舉報

6#
ID:236035 發(fā)表于 2021-6-4 13:59 | 只看該作者
會不會被打亂,確實(shí)與優(yōu)先級有關(guān)。所以那個中斷更重要,就要提高哪個中斷的優(yōu)先級。
當(dāng)外部中斷優(yōu)先級更高時,串口通信肯定會被打亂,導(dǎo)致亂碼,甚至通訊失敗。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

7#
ID:28415 發(fā)表于 2021-6-4 14:01 | 只看該作者
好的,感謝感謝
回復(fù)

使用道具 舉報

8#
ID:383215 發(fā)表于 2021-6-4 21:58 | 只看該作者
AVR單片機(jī)有關(guān)中斷優(yōu)先級的指令,一條都沒有,AVR單片機(jī)響應(yīng)第一中斷,就會自動關(guān)閉所有中斷,需要響應(yīng)第二中斷,就要在進(jìn)入第一中斷打開第二中斷的允許,需要響應(yīng)第三中斷,就要在進(jìn)入第二中斷打開第三中斷的允許,越往后打開的中斷,優(yōu)先級越高,退出第一中斷,又自動打開被允許的所有中斷,AVR的這種中斷處理方式比51單片機(jī)先進(jìn)很多,51單片機(jī)也可以用這種方式處理中斷,只是退出中斷時要把關(guān)閉的中斷打開,不必設(shè)置中斷優(yōu)先級。
接收串口信號時,INT0外部中斷發(fā)生。串口信號是否會被打亂?這個要看具體情況,INT0外部中斷從響應(yīng)到退出的最大時間,不大于串口接收一個字節(jié)的時間,串口信號不會打亂,反之,肯定會打亂,只有在INT0外部中斷里加一個串口接收中斷的允許,相當(dāng)于串口接收的優(yōu)先級高于INT0外部中斷,也就是串口接收中斷可以嵌套于INT0外部中斷,這個還必須保證串口接收中斷不能影響INT0外部中斷,否則還要另外想辦法。最理想的編程方式是主程序和各個中斷程序互不影響,最近我用兩片ATMEGA8編串口程序,從機(jī)發(fā)給主機(jī)的主要數(shù)據(jù)只有三個字節(jié),次要數(shù)據(jù)也是三個字節(jié),我就用四個字節(jié)當(dāng)數(shù)據(jù)頭,加上六個數(shù)據(jù),一共十個數(shù)據(jù),就在INT0外部中斷里發(fā)送,我的INT0外部中斷是過零信號,也就是0.01秒響應(yīng)一次,這個INT0外部中斷不能被任何程序打斷,否則過零觸發(fā)可控硅就不準(zhǔn)確了,那么我只要保證這個INT0外部中斷程序的最大時間不大于0.01秒就可以了,用INT0外部中斷計數(shù),每十次發(fā)一個數(shù)據(jù),那么我發(fā)送一個數(shù)據(jù)的時間不超過0.1秒,INT0外部中斷和發(fā)送程序就互不干擾,連發(fā)送中斷都不需要,主機(jī)每0.1秒接收一次數(shù)據(jù),相當(dāng)于有了一個每0.1秒進(jìn)入一次接收數(shù)據(jù)的中斷,就保證了兩個單片機(jī)的時鐘同步,主機(jī)發(fā)送給從機(jī)的數(shù)據(jù)僅有一個字節(jié),就一秒鐘發(fā)一次,只要從機(jī)的任何程序不超過一秒鐘,接收就沒有問題,從機(jī)肯定沒有超過一秒的程序,隨便找個空閑的地方,打開接收中斷允許,進(jìn)入接收中斷收到數(shù)據(jù)后立即關(guān)閉接收中斷。這樣的結(jié)果是從機(jī)發(fā)給主機(jī)到接收到主機(jī)的信號,最大時間是兩秒鐘了,然而對我控制的電器沒有影響,編任何單片機(jī)程序都應(yīng)該把輕重緩急搞清楚,該快的地方快速處理,可以慢的地方慢慢處理,所有程序互不影響。

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

9#
ID:28415 發(fā)表于 2021-6-4 22:20 | 只看該作者
kmsj 發(fā)表于 2021-6-4 21:58
AVR單片機(jī)有關(guān)中斷優(yōu)先級的指令,一條都沒有,AVR單片機(jī)響應(yīng)第一中斷,就會自動關(guān)閉所有中斷,需要響應(yīng)第二 ...

感謝你的分享。
與你寫的方法類似,我現(xiàn)在也是用2片單片機(jī),第一片單片機(jī)用來接收外部中斷,10個中斷后發(fā)送一個串口指令給第2片單片機(jī),并且連發(fā),當(dāng)?shù)?片單片機(jī)接收到完整的一串指令后回復(fù),只有第1個單片機(jī)得到回復(fù)指令后,才會停止發(fā)送。第2片單片機(jī)主要用來處理數(shù)據(jù)和接收完整的數(shù)據(jù)。
回復(fù)

使用道具 舉報

10#
ID:383215 發(fā)表于 2021-6-5 22:15 | 只看該作者
mxlslf 發(fā)表于 2021-6-4 22:20
感謝你的分享。
與你寫的方法類似,我現(xiàn)在也是用2片單片機(jī),第一片單片機(jī)用來接收外部中斷,10個中斷后 ...

不用謝!那你只要把串口收發(fā)中斷設(shè)置為高優(yōu)先級,就不會被外部中斷打亂,串口收發(fā)中斷不影響外部中斷,程序就不難編。無論是51還是AVR,我編的串口程序很少,這次編串口程序發(fā)現(xiàn),按一定的時間一個數(shù)據(jù)一個數(shù)據(jù)的收發(fā),比收發(fā)一串?dāng)?shù)據(jù)更簡單,我傳送的是溫度和重量值,這些值是漸變,不是突變,我就可以慢慢傳,我編程序喜歡慢中求穩(wěn)。
回復(fù)

使用道具 舉報

11#
ID:932412 發(fā)表于 2021-6-6 11:27 | 只看該作者
你先確保只有串口一個中斷時,顯示是否正常,如果正常,在排查其他方面吧。至少保證第一步接收不會時亂碼
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表