|
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)該把輕重緩急搞清楚,該快的地方快速處理,可以慢的地方慢慢處理,所有程序互不影響。 |
評分
-
查看全部評分
|