標題: 單片機外部中斷問題 [打印本頁]

作者: xjtong    時間: 2024-5-10 02:37
標題: 單片機外部中斷問題

void init(){
        IT0=1;
        EX0=1;
        EA=1;
}

就是每中斷一次從數組abc中取一個值給t
for循環(huán)是讀xu的值,值是多少led閃幾下,
發(fā)現LED閃的不對呀,按理來說,中斷一次led多閃一次,但實際不是,

用的P32的外部中斷0,這個需要上拉或下拉嗎????
P3PU |= 0x04;
這個內部上拉,用和不用,都沒作用。


作者: xiaobendan001    時間: 2024-5-10 08:25
中斷觸發(fā)方式呢?
作者: cy009    時間: 2024-5-10 09:28
EA放在中斷函數里不科學吧!
作者: lightday    時間: 2024-5-10 09:35
中斷程序加延時是大忌,完全偏離中斷的意義。
可以在中斷里改變閃爍次數變量,然后在主程序里實現閃爍。

作者: tyrl800    時間: 2024-5-10 09:38
編譯沒通過吧
作者: Longan.Wang    時間: 2024-5-10 09:57
編程技巧先不說,延時短了,眼睛根本看不到閃
作者: xiaobendan001    時間: 2024-5-10 10:29
cy009 發(fā)表于 2024-5-10 09:28
EA放在中斷函數里不科學吧!

有啥不科學的?
作者: xiaobendan001    時間: 2024-5-10 10:30
lightday 發(fā)表于 2024-5-10 09:35
中斷程序加延時是大忌,完全偏離中斷的意義。
可以在中斷里改變閃爍次數變量,然后在主程序里實現閃爍。

樓主的中斷只是用來接收開關信號的,又不是定時器中斷,加點延時咋了?
作者: lkc8210    時間: 2024-5-10 13:06
沒電路圖盲猜按鍵接中斷
你沒加按鍵消抖,并在中斷里延時了
于是中斷在延時期間收到抖動信號,誤判了
反復進入中斷
作者: lkc8210    時間: 2024-5-10 13:26


作者: xjtong    時間: 2024-5-10 14:28
lkc8210 發(fā)表于 2024-5-10 13:06
沒電路圖盲猜按鍵接中斷
你沒加按鍵消抖,并在中斷里延時了
于是中斷在延時期間收到抖動信號,誤判了

你說對了。
我覺得是抖動的問題,所以在中斷是把EA關了呀。
在中斷里延時也是怕抖動的問題。

重點是有一個邏輯我沒弄明白。比如中斷里的程序還沒處理為又發(fā)生中斷,這時單片機怎么處理,是直接無視,還是排對處理呀???
作者: xjtong    時間: 2024-5-10 14:29
Longan.Wang 發(fā)表于 2024-5-10 09:57
編程技巧先不說,延時短了,眼睛根本看不到閃

一次是10ms,20次是200ms
作者: xjtong    時間: 2024-5-10 14:36

應該就是這個問題,
所以我關EA,開EA,加延時。
看樣子加延時是沒用的。
開關EA也不行,那應該怎么處理呀??

drrteet.JPG (57.07 KB, 下載次數: 36)

drrteet.JPG

作者: lkc8210    時間: 2024-5-10 14:43
xjtong 發(fā)表于 2024-5-10 14:28
你說對了。
我覺得是抖動的問題,所以在中斷是把EA關了呀。
在中斷里延時也是怕抖動的問題。

"中斷里的程序還沒處理完又發(fā)生中斷"
單片機會繼續(xù)運行中斷函數
直到運行完畢跳出中斷函數
單片機會立刻再次運行中斷函數
作者: tyrl800    時間: 2024-5-10 15:30
都說了編譯通不過呀
作者: npn    時間: 2024-5-10 15:39
外部中斷接的是什么? 如果是按鍵需要消抖處理。
作者: xjtong    時間: 2024-5-10 17:29
問題解決了。
void int0() interrupt 0
{
        u8 i;
        if(!P32){
        for(i=0;i<xu;i++){
                led=1;dd(20);
                led=0;dd(20);
        }
        t=abc[xu++];
        xu &=0x07;
        }
}


這樣就好了。
作者: xjtong    時間: 2024-5-10 17:33
tyrl800 發(fā)表于 2024-5-10 15:30
都說了編譯通不過呀

編譯一直沒問題,就是中斷是亂的。應該是中斷重入的問題。
作者: xjtong    時間: 2024-5-10 17:34
npn 發(fā)表于 2024-5-10 15:39
外部中斷接的是什么? 如果是按鍵需要消抖處理。

恩,直接用杜邦線點GND,按鍵都省了。
作者: xiaobendan001    時間: 2024-5-10 17:37
不關是不是重復中斷,這樣延時的閃爍都應該正常才對啊,先軟件模擬一下看看那些變量都是多少
作者: Hephaestus    時間: 2024-5-10 17:39
xjtong 發(fā)表于 2024-5-10 14:28
你說對了。
我覺得是抖動的問題,所以在中斷是把EA關了呀。
在中斷里延時也是怕抖動的問題。

再發(fā)生中斷會掛起pending,退出中斷處理程序后會再次進入中斷處理程序。
作者: xjtong    時間: 2024-5-10 17:49
就是用單片機操作續(xù)電器,續(xù)電器控制風扇。

有一個2。4G雷達,有運動就開風扇,開的時間用延時控制。
中斷的作用是改變延時的時候,從而改變風扇運行的時候。

#include <STC8G.h>
#include <intrins.h>
#define u16 unsigned int
#define u8 unsigned char
       
sbit leda = P5^5;
sbit led = P5^4;
sbit fan = P3^3;

const unsigned int data abc[8]={0xea60,0xa410,0x8ca0,0x7530,0x4650,0x1770,0x0bb80,0x05dc};
u16 t;
u8 xu;

void Delay10ms(void)        //@11.0592MHz
{
        unsigned char data i, j;
        _nop_();_nop_();
        i = 144;
        j = 157;
        do
        {
                while (--j);
        } while (--i);
}

void dd(unsigned int tttt){
        while(tttt--)Delay10ms();
}

void init(){
        IT0=1;
        EX0=1;
        EA=1;
}

void int0() interrupt 0
{
        u8 i;
        if(!P32){
        for(i=0;i<xu;i++){
                led=1;dd(20);
                led=0;dd(20);
        }
        t=abc[xu++];
        xu &=0x07;
        }
}

void main(){
        u16 tt;
        P5M0 &= ~0x30; //P54雙向口,P55高阻
        P5M1 = (P5M1 & ~0x10) | 0x20;
        P3M0 = (P3M0 & ~0x04) | 0x08; //P33 推挽
        P3M1 &= ~0x0c;
        P3PU |= 0x04; //P3.2上拉開打
        init();
        led=0;
        while(1){
                if(leda)tt=t;   //5min
                led=leda;
                if(tt){tt--;fan=1;Delay10ms();} else {fan=0;}
        }
}


這樣基本就沒問題的。就是中斷重入的問題。開始LED閃爍明顯不對,F在一切正常了。
作者: tyrl800    時間: 2024-5-10 19:42
xjtong 發(fā)表于 2024-5-10 17:33
編譯一直沒問題,就是中斷是亂的。應該是中斷重入的問題。

我用KEIL 4編譯你程序不過,修改下int0 通過,程序一切正常,沒有亂入問題
作者: zzzy01    時間: 2024-5-11 14:38
xiaobendan001 發(fā)表于 2024-5-10 10:30
樓主的中斷只是用來接收開關信號的,又不是定時器中斷,加點延時咋了?

只要是中斷,都是不建議有延時的,反正linux內核的中斷是這樣的思想




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1