|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
avr外部中斷出問(wèn)題了,請(qǐng)求分析 |
| 作者:ipman 欄目:單片機(jī) |
void initExtInt(void) { cbi(DDRD,PD3); sbi(PORTD,PD3); MCUCR = (1<<ISC11);// 下降沿觸發(fā) enable_external_int(_BV(INT1)); } SIGNAL(SIG_INTERRUPT1) { cli(); decode(); sei(); } u08 decode() { PORTA&=0xFE; delay_ms(1000); //結(jié)束碼 PORTA=0xFF; delay_ms(1000); return 0; } 我在2秒內(nèi)快速連續(xù)觸發(fā)2次,PA7連接到一個(gè)LED上,竟然閃爍2次??? * - 本貼最后修改時(shí)間:2005-12-14 16:46:48 修改者:ipman |
| 2樓: | >>參與討論 |
| 作者: javie 于 2005/12/14 16:48:00 發(fā)布:
應(yīng)該是你的delay程序不準(zhǔn)的問(wèn)題 |
|
| 3樓: | >>參與討論 |
| 作者: ipman 于 2005/12/14 16:49:00 發(fā)布:
這個(gè)誤差不大吧 void delay_ms(u16 n) { while(n--) _delay_ms(1); } |
|
| 4樓: | >>參與討論 |
| 作者: ipman 于 2005/12/14 16:52:00 發(fā)布:
快速觸發(fā)2次,應(yīng)該閃爍一次才對(duì),因?yàn)榈诙斡|發(fā)已經(jīng)被屏蔽了啊 |
|
| 5樓: | >>參與討論 |
| 作者: javie 于 2005/12/14 17:07:00 發(fā)布:
最好用示波器看一下波形 |
|
| 6樓: | >>參與討論 |
| 作者: ipman 于 2005/12/14 17:09:00 發(fā)布:
示波器看到的波形
|
|
| 7樓: | >>參與討論 |
| 作者: ipman 于 2005/12/14 17:12:00 發(fā)布:
打電話到雙龍,竟然讓我手動(dòng)清除一下GIFR GCC竟然沒(méi)有GIFR定義,好奇怪 |
|
| 8樓: | >>參與討論 |
| 作者: javie 于 2005/12/14 17:12:00 發(fā)布:
用的多大的晶振? 熔絲位配置對(duì)否? 我懷疑就是delay不準(zhǔn)確 |
|
| 9樓: | >>參與討論 |
| 作者: ipman 于 2005/12/14 17:15:00 發(fā)布:
這么搞都沒(méi)用,到底問(wèn)題在哪里? SIGNAL(SIG_INTERRUPT1) { cli(); enable_external_int(0); decode(remoteId); enable_external_int(_BV(INT1)); sei(); } 程序就這么點(diǎn),bug都無(wú)法查出來(lái) :( |
|
| 10樓: | >>參與討論 |
| 作者: javie 于 2005/12/14 17:15:00 發(fā)布:
雙龍的一些工程師很嫩的,經(jīng)驗(yàn)不夠 不要太相信雙龍 |
|
| 11樓: | >>參與討論 |
| 作者: javie 于 2005/12/14 17:17:00 發(fā)布:
你在中斷服務(wù)程序里玩一下 把這個(gè)時(shí)間弄長(zhǎng)一點(diǎn),比如10S 你再按鍵 看是否是重復(fù)響應(yīng)中斷的問(wèn)題 1S時(shí)間太短了 |
|
| 12樓: | >>參與討論 |
| 作者: kanprin 于 2005/12/14 17:32:00 發(fā)布:
不知道SIGNAL()處理中斷服務(wù)時(shí)是否先清除中斷標(biāo)志? 我一直都沒(méi)有找到SIGNAL()的原函數(shù)。不清楚他是如何寫(xiě)的。如果是一進(jìn)中斷就清楚了中斷標(biāo)志的話,雖然說(shuō)你在中斷處理時(shí)關(guān)了中斷,但中斷標(biāo)志還是會(huì)被硬件置位。所以當(dāng)你退出中斷服務(wù)程序時(shí)還會(huì)再次產(chǎn)生中斷。要不你在中斷返回時(shí)加入 SIGNAL(SIG_INTERRUPT1) { cli(); decode(); //(在此處加上清除外部中斷1標(biāo)志的語(yǔ)句) sei(); } 在看一下還會(huì)不會(huì)有這種情況發(fā)生? |
|
| 13樓: | >>參與討論 |
| 作者: ipman 于 2005/12/14 17:52:00 發(fā)布:
最終被我摸索出來(lái)了,結(jié)論就是別看中文版的手冊(cè) SIGNAL(SIG_INTERRUPT1) { decode(); sbi(GIFR,INTF1); } 再來(lái)看看雙龍的翻譯: ==================== Bit 7 – INTF1: 外部中斷標(biāo)志1 INT1引腳電平發(fā)生跳變時(shí)觸發(fā)中斷請(qǐng)求,并置位相應(yīng)的中斷標(biāo)志INTF1。如果SREG的位 I以及GICR寄存器相應(yīng)的中斷使能位INT1為”1”,MCU即跳轉(zhuǎn)到相應(yīng)的中斷向量。進(jìn)入中 斷服務(wù)程序之后該標(biāo)志自動(dòng)清零。此外,標(biāo)志位也可以通過(guò)寫(xiě)入”1” 來(lái)清零。 ======================= 真是不怎么地 |
|
| 14樓: | >>參與討論 |
| 作者: ipman 于 2005/12/14 17:54:00 發(fā)布:
ATMEL真是好心阿,把中斷期間還發(fā)生的io變化給保存住了 可不知道這個(gè)好心,浪費(fèi)我一下午時(shí)間摸索 |
|
| 15樓: | >>參與討論 |
| 作者: hotpower 于 2005/12/14 18:19:00 發(fā)布:
暈~~~觸發(fā)2次閃爍2次應(yīng)該是對(duì)的,仔細(xì)想想吧 |
|
| 16樓: | >>參與討論 |
| 作者: ipman 于 2005/12/14 20:51:00 發(fā)布:
呵呵,在前一次中斷函數(shù)沒(méi)有結(jié)束前,中斷應(yīng)該屏蔽啊 |
|
| 17樓: | >>參與討論 |
| 作者: hotpower 于 2005/12/14 23:58:00 發(fā)布:
中斷中玩細(xì)活---暈~~~ |
|
| 18樓: | >>參與討論 |
| 作者: kanprin 于 2005/12/15 8:06:00 發(fā)布:
中斷屏蔽只是暫時(shí)不執(zhí)行中斷服務(wù)而已。 當(dāng)再次開(kāi)啟中斷的時(shí)候,只要中斷標(biāo)志還在,中斷仍將產(chǎn)生。 |
|
| 19樓: | >>參與討論 |
| 作者: zsmbj 于 2005/12/15 9:03:00 發(fā)布:
當(dāng)然要保存了,保證每個(gè)中斷都被捕獲,否則中斷還有什么意義。 所以當(dāng)你按第一按鍵時(shí),中斷進(jìn)入,中斷標(biāo)志被自動(dòng)清除,執(zhí)行中斷程序。而第二次按鍵中斷標(biāo)志又被置位,當(dāng)退出中斷時(shí),由于標(biāo)志沒(méi)有被清除,就會(huì)再次進(jìn)入中斷一次。 還有SIGNAL中斷里不需要先cli后sei了,因?yàn)楸旧鞸IGNAL中斷就是有cli功能的,在退出中斷后自動(dòng)sei了,所以你那2句話是多余的。 |
|
| 20樓: | >>參與討論 |
| 作者: hotpower 于 2005/12/16 21:47:00 發(fā)布:
zsmbj真是好老師 SIGNAL搞cli和sei很有暈意... |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |