日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

1. 引腳配置

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



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


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

P2IE |= 0x01;

P2IES |= 0x01;


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


二 中斷函數(shù)配置


#pragma vector =PORT2_VECTOR
__interrupt void tangle_make(void)

{

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

P2IFG = 0x00;

}


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




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



2016年8月18號(hào)更新

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


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

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

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


A1:這個(gè)問題涉及到中斷嵌套問題。

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

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

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

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

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

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

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

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

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

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

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

所以在以后的學(xué)習(xí)中,可以把電流的分流作為一個(gè)考慮的因素。

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


#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;
}

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


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