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