www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀] msp430的外中斷歸根到底 其實只需要兩個部分的配置就可以了:1. 引腳配置2. 中斷函數(shù)配置一 引腳配置(以引腳P2.1為例)P2DIR = 0x01;//配置為輸入P2IE |= 0x01;P2IES |= 0x01;其他寄存器可配置,可不配

msp430的外中斷歸根到底 其實只需要兩個部分的配置就可以了:

1. 引腳配置

2. 中斷函數(shù)配置



一 引腳配置(以引腳P2.1為例)


P2DIR = 0x01;//配置為輸入

P2IE |= 0x01;

P2IES |= 0x01;


其他寄存器可配置,可不配置。注意引腳功能選擇為一般引腳,不是功能引腳。雖然引腳的配置很簡單,但是只要出錯,就無法產(chǎn)生中斷。


二 中斷函數(shù)配置


#pragma vector =PORT2_VECTOR
__interrupt void tangle_make(void)

{

//用戶自定義函數(shù)

P2IFG = 0x00;

}


中斷函數(shù)比較簡單,只需要記得將中斷標志位清0就可以了。




注意:引發(fā)外中斷的外模塊最好能夠與系統(tǒng)的電源模塊使用一個電源,使用其他電源供電會產(chǎn)生外中斷頻發(fā)狀態(tài)。



2016年8月18號更新

最近一直卡在外中斷和串口中斷之間。自己在查看了一會原版的手冊之后,發(fā)現(xiàn)以下幾個問題。


Q1:在外中斷程序中開總中斷,有的時候總是莫名的卡死。

Q2:給外中斷加上外部觸發(fā)模塊,比如紅外,門磁等模塊時,外中斷總是不停的觸發(fā)。

Q3:外中斷觸發(fā)后,程序還能運行,不過每到串口中斷就需要外中斷促進程序往下跑。


A1:這個問題涉及到中斷嵌套問題。

對于多源中斷,需要手動清除標志位。比如:P1、P2的中斷,需要手動清楚相應的標志位。如果在這種中斷中使用“_EINT();”,開中斷,而在打開中斷之前,沒有進行原來中斷標識位的清除工作,就會有相同的中斷不斷的進行嵌套。而導致堆棧溢出引起復位,所以在這類中斷中,必須先清除標志位,再打開中斷開關。要不然等著死機吧。

總之,就是說在開總中斷之前,需要將多源中斷標志位清掉。

A2:這個問題我到現(xiàn)在也不是很明白為什么會這樣,不過我還是有幾個經(jīng)驗可以寫下來。

首先,必須保證硬件的正常,一般的紅外模塊不需要外加電阻什么的,可以直接接在IO口上。測量紅外輸出引腳的高低電平是不是正常的,高的時候是不是接近3v,低的時候是不是0v。(在3V情況下,低電平為0.9-1.3V,高電平為1.5-1.9V。1.3V-1.5V為不穩(wěn)定狀態(tài)。)

其次,并沒有配置什么上拉下拉電阻。就是依照上面的3個寄存器配置的。可以用。(芯片是msp430f149)。

硬件沒有問題,就是要用軟件來解決了:

第一種方法:在外中斷中關閉 外中斷使能,然后在外部程序合適的地方再開啟。

第二種方法:在外中斷中 加入消抖,就可以了。至于為什么,我也不清楚。。

A3:這個問題我到現(xiàn)在也想不通,理不順,如果有大神看到的話,請一定要留言告訴我。

/*********************2016.10.18更新***************/
在師兄的幫助下整個系統(tǒng)算是完成了。
更正一下上面的一些問題。
對于外部輸入到芯片的引腳,首先值得質疑一下:這個輸入引腳的狀態(tài)到底能不能用萬用表來測量。我這里給出的答案是不可取的。(感覺可以用示波器查看,原理的話不是很清楚)所以在寫完代碼后測試的時候,不應該靠萬用表的數(shù)值來看是不是產(chǎn)生中斷,萬用表是不靠譜的,建議使用msp430的仿真器來查看,硬件仿真有時候可以解決很多問題。
下面說一下持續(xù)的調試過程中的問題和經(jīng)驗。PS:建議使用仿真器,可以大大提高一些自己不必要的考慮因素。前期自己用小燈來測試感覺真的是蠢的出血。

在調試過程中碰到的最大的問題其實是一般人都碰不到的:那就是考慮電流的問題,首先我的板子是自己焊接的,使用430f149驅動外接模塊sim900a發(fā)送接受數(shù)據(jù)和繼電器驅動鎖開門,紅外檢測門的開關。整個系統(tǒng)使用同一個電源。發(fā)現(xiàn)在每次開門后都會自動的發(fā)送一個關門的指令。在經(jīng)過上百次的測試和調試后,我提出可能是當鎖開啟的時候需要瞬間的電流,導致系統(tǒng)中其他部分的電流不夠用,所以紅外模塊才會產(chǎn)生中斷,導致每次都會產(chǎn)生一次關門的指令。

所以在以后的學習中,可以把電流的分流作為一個考慮的因素。

另外,外中斷里的內容寫的越少越好,buffer的清空,標志位的清空可以放在外中斷函數(shù)外邊實現(xiàn),這個系統(tǒng)中我使用了P1口的6和7兩個引腳來實現(xiàn)檢測門的開關。(對于門的狀態(tài)檢測之前想了好多辦法,最后采用了使用一個紅外模塊接到兩個引腳上,兩個引腳分別使用上升沿觸發(fā)和下降沿觸發(fā),這樣就可以檢測到門的開和關了)
下面貼一下外中斷的關鍵部分代碼:
//****************************************


#pragma vector=PORT1_VECTOR
__interrupt void SIO_rx (void)
{
volatile unsigned int x;
/***************************/

if((P1IFG&0x80)== 0x80)
{
for (x = 0xff; x > 0; x--);
if(((P1IN&0x80)== 0x00))
{
P1IFG &= 0x7f;
_EINT();
IOinterruptClose();
closedoor = 1;
opendoor = 0;
}
}

/***************************/

if((P1IFG&0x40)== 0x40)
{
for (x = 0xff; x > 0; x--);
if((P1IN&0x40)== 0x40)
{
P1IFG &= 0xBf;
_EINT();
IOinterruptClose();
opendoor = 1;
closedoor = 0;
}
}
P1IFG &=0X00;
}

//********************代碼貼完了^_^


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉
關閉