|
|||||||||||
| 技術(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 |
關(guān)于RB.7腳電平變化引起中斷的實(shí)驗(yàn)中的疑問(wèn)? |
| 作者:zdtdl 欄目:單片機(jī) |
小弟又做了一個(gè)實(shí)驗(yàn),實(shí)驗(yàn)功能要求及實(shí)現(xiàn)方法(使用20MHZ晶振): 從RB.7腳上輸入一個(gè)信號(hào)源,是噪聲時(shí)脈沖雜亂一片,正常信號(hào)到來(lái)時(shí),脈沖穩(wěn)定,一個(gè)周期中高電平60us而低電平4us,單片機(jī)通過(guò)檢測(cè)脈沖寬度以識(shí)別正確的信號(hào)。 利用pic單片機(jī)RB7腳具有的電平變化產(chǎn)生中斷的功能,并利用TMR1定時(shí)器計(jì)時(shí),RB.7腳電平變化產(chǎn)生中斷后定時(shí)器開始計(jì)時(shí),直到再次產(chǎn)生同樣電平變化產(chǎn)生中斷為止停止計(jì)時(shí),將定時(shí)器記錄的時(shí)間長(zhǎng)度與一個(gè)脈沖周期64us比較,考慮執(zhí)行中斷等指令耗費(fèi)的時(shí)間,只要記錄時(shí)間寬度在50us~65us之間都判斷為正確信號(hào)(具體程序中按連續(xù)檢測(cè)判斷兩次的方式確認(rèn)),通過(guò)RA.0上接發(fā)光管反復(fù)顯示說(shuō)明。其他的都認(rèn)為是噪聲。 編程試驗(yàn)以后發(fā)現(xiàn)有以下疑問(wèn): 1.RB.7腳上發(fā)生從1到0電平變化時(shí)才產(chǎn)生中斷,但數(shù)據(jù)手冊(cè)上沒有提到,不知道是不是因?yàn)楦唠娖綍r(shí)間太長(zhǎng),還是RB.7本身特性就如此? 我的中斷程序如下 MOVF STATUS,W ;保護(hù)中斷現(xiàn)場(chǎng) MOVWF status_temp BTFSS INTCON,RBIF ; RBIF標(biāo)記位是否為1 goto other_int BCF INTCON,RBIF ; 是RB中斷,清除中斷標(biāo)志RBIF BTFSC PORTB,7 ; 讀RB.7,看是否是因0到1的電平變化 GOTO end_int ;如不是,則中斷返回,繼續(xù)等待下一次中斷 BSF TEST,0 ;如果是,則中斷產(chǎn)生檢測(cè)位置1,進(jìn)行數(shù)據(jù)處理 INCF JS,1 ;中斷次數(shù)單元加1 GOTO end_int other_int ; 其他中斷服務(wù)代碼 BCF STATUS,RP0 nop ; other isr code can be added end_int MOVF status_temp,W MOVWF STATUS RETFIE 2.實(shí)驗(yàn)過(guò)程中發(fā)現(xiàn)pic還可以通過(guò)RB.7腳竊電,正常信號(hào)的高電平為+5V,當(dāng)正常信號(hào)加在RB.7上時(shí),單片機(jī)可以正常工作,RA.0發(fā)光管按正常反復(fù)指示。單片機(jī)VDD腳電壓為0V,MCLR腳為高電平,當(dāng)發(fā)光管亮?xí)r,信號(hào)電平幅度隨著降低。但是要是脈沖信號(hào)源與之不共地,則信號(hào)不能讓單片機(jī)工作。這樣單片機(jī)是什么工作狀況呢?是否會(huì)不穩(wěn)定?如果這樣沒什么問(wèn)題,那有的簡(jiǎn)單的系統(tǒng)中單片機(jī)耗電就可以更少了,不知道各位大俠有什么見解? |
| 2樓: | >>參與討論 |
| 作者: xieyuanbin 于 2004/12/30 10:00:00 發(fā)布:
PIC中的端口除與MCLR共用腳之外均有鉗位二極管到電源 所以如果VDD沒有供電但I(xiàn)O腳上有共地的電的話MCU還能啟動(dòng).但隨負(fù)載不同工作并不穩(wěn)定. 當(dāng)IO口設(shè)置成輸入時(shí)如果信號(hào)源平時(shí)也是高阻的話應(yīng)該接上拉或下拉電阻以防干擾. |
|
| 3樓: | >>參與討論 |
| 作者: martin 于 2004/12/30 10:57:00 發(fā)布:
re 1.RB.7腳上發(fā)生從1到0電平變化時(shí)才產(chǎn)生中斷,但數(shù)據(jù)手冊(cè)上沒有提到,不知道是不是因?yàn)楦唠娖綍r(shí)間太長(zhǎng),還是RB.7本身特性就如此? >>PORTB4-7的狀態(tài)變化中斷是從高到低或從低到高都可以中斷,但每次退出中斷前要讀一次PORTB,否則下一次下一次中斷將不產(chǎn)生。 2.謝版主已經(jīng)給你解答,在Vdd不供電時(shí),IO的電壓會(huì)通過(guò)鉗位二極管給Vdd供電。 |
|
| 4樓: | >>參與討論 |
| 作者: zdtdl 于 2004/12/30 16:13:00 發(fā)布:
多謝兩位斑竹,第二疑問(wèn)解決,但第一問(wèn)中 我已經(jīng)在中斷程序中用 BTFSC PORTB,7 語(yǔ)句代替讀PORTB口的功能,單片機(jī)能夠繼續(xù)進(jìn)入中斷說(shuō)明這個(gè)不是問(wèn)題的關(guān)鍵,我將以高低電平相同寬度的脈沖信號(hào)進(jìn)行實(shí)驗(yàn),看看是否有新的發(fā)現(xiàn) |
|
| 5樓: | >>參與討論 |
| 作者: zdtdl 于 2004/12/31 16:30:00 發(fā)布:
將我試驗(yàn)的結(jié)論陳述如下,請(qǐng)大俠們指教 為了排除外部信號(hào)的因素,我先用儀器信號(hào)源輸出不同占空比的高低脈沖然后輸入到RB.7腳進(jìn)行實(shí)驗(yàn),實(shí)驗(yàn)現(xiàn)象如下: 當(dāng)RB.7腳檢測(cè)1到0的電平變化(下降沿觸發(fā))即用 BTFSC PORTB,7 語(yǔ)句讀PORTB口時(shí),不論輸入信號(hào)高低電平脈寬誰(shuí)長(zhǎng)誰(shuí)短,只要中斷處理時(shí)間足夠小滿足保持時(shí)間范圍內(nèi),就可以觸發(fā)中斷程序。 但當(dāng)RB.7腳檢測(cè)0到1的電平變化(上升沿觸發(fā))即用 BTFSS PORTB,7 語(yǔ)句讀PORTB口時(shí),只有當(dāng)?shù)碗娖矫}寬小于高電平脈寬時(shí),才能觸發(fā)中斷程序;反之要是高電平脈寬大于低電平脈寬,則不能產(chǎn)生中斷。 只要高低電平脈寬相同,即信號(hào)是占空比相同的方波,則RB.7腳即能被上升沿也能被下降沿觸發(fā)中斷。 我在用外部信號(hào)進(jìn)行試驗(yàn)中發(fā)現(xiàn),以 BTFSC PORTB,7 進(jìn)行判斷時(shí),誤觸發(fā)現(xiàn)象比較嚴(yán)重,但以 BTFSS PORTB,7 進(jìn)行判斷,則無(wú)法產(chǎn)生中斷。 為了實(shí)驗(yàn)方便,以下是我簡(jiǎn)化判斷后的測(cè)試程序: ;************************************************************************ ;簡(jiǎn)單的RB腳電平變化產(chǎn)生中斷測(cè)試程序 ; file: sy.asm list P=16F73 ; 告訴編譯程序使用何種PIC單片機(jī) #include "P16F73.inc" ; 定義了特殊寄存器等內(nèi)容的頭文件 __CONFIG _PWRTE_ON & _HS_OSC & _WDT_OFF ; 配置字 ;變量定義 reg1 EQU 0x30 ;計(jì)數(shù)單元1 reg2 EQU 0x31 ;計(jì)數(shù)單元2 reg3 EQU 0x32 ;計(jì)數(shù)單元3 reg4 EQU 0x33 ;計(jì)數(shù)單元4 JS EQU 0x34 ;中斷次數(shù)計(jì)數(shù)單元 TEST EQU 0x35 ;測(cè)試單元,TEST.0為中斷產(chǎn)生檢測(cè)位 R1 EQU 0x36 ;計(jì)數(shù)單元5 R2 EQU 0x37 ;計(jì)數(shù)單元6 R3 EQU 0x38 ;計(jì)數(shù)單元7 w_temp EQU 0x70 status_temp EQU 0x71 pclath_temp EQU 0x72 ;************************************************************************ ORG 0x00 ;復(fù)位向量地址為0x00 NOP GOTO MAIN ORG 0x04 GOTO BREAK ;跳轉(zhuǎn)到中斷子程序 MAIN BSF STATUS,RP0 ;換bank1 MOVLW B'11000000' ;1代表輸入,0代表輸出 MOVWF TRISA MOVLW B'10000000' MOVWF TRISB ;RB7作為信號(hào)輸入口,電平變化產(chǎn)生中斷 MOVLW 0x07 MOVWF ADCON1 ;RA口作為數(shù)字I/O BCF STATUS,RP0 ;換bank0 CLRF PORTB ;初始化PORTA/B口 BCF PORTA,0 CLRF TEST ;測(cè)試單元清零 CLRF JS BCF INTCON,PEIE ;關(guān)閉第二梯隊(duì)外圍中斷 BCF INTCON,INTE ;關(guān)閉INT中斷允許位 BSF INTCON,RBIE ;打開RB中斷允許位 BSF INTCON,GIE ;打開總中斷允許位 next1 BTFSS TEST,0 ;中斷檢測(cè)位是否為1,產(chǎn)生中斷則跳轉(zhuǎn) GOTO next1 ;為0沒有中斷產(chǎn)生則等待 BCF INTCON,GIE ;關(guān)閉總中斷允許位 BCF TEST,0 ;中斷檢測(cè)位清零 MOVF JS,0 SUBLW 04H |
|
| 6樓: | >>參與討論 |
| 作者: zdtdl 于 2005/1/4 20:31:00 發(fā)布:
改成RB.0外部中斷腳來(lái)檢測(cè)信號(hào),又有疑問(wèn)了??? 用另一個(gè)16F73.html">PIC16F73單片機(jī)(機(jī)2)作為信號(hào)產(chǎn)生源,一個(gè)管腳輸出占空比不同的脈沖信號(hào)(實(shí)驗(yàn)時(shí)用40us/60us的脈沖波),這邊的單片機(jī)(機(jī)1)RB.0腳接信號(hào)輸入線,發(fā)現(xiàn)機(jī)1無(wú)法正常工作,從現(xiàn)象看是一次中斷后不能繼續(xù)產(chǎn)生中斷。 不知道RB0/INT外部中斷腳是否有其他特殊設(shè)置要求,為何上升沿或者下降沿均不能產(chǎn)生中斷。還有一個(gè)奇怪現(xiàn)象:當(dāng)機(jī)2加電時(shí),RB0/INT腳上的脈沖波消失,代替出現(xiàn)2.8V左右的電平,相連的機(jī)1管腳也同樣出現(xiàn)2.8V電平,脈沖波不見了,于是就機(jī)1更不會(huì)產(chǎn)生中斷了:( 機(jī)1程序如下: ;************************************************************************ list P=16F73 ; 告訴編譯程序使用何種PIC單片機(jī) #include "P16F73.inc" ; 定義了特殊寄存器等內(nèi)容的頭文件 __CONFIG _PWRTE_ON & _HS_OSC & _WDT_OFF ; 配置字 ;變量定義 reg1 EQU 0x30 ;計(jì)數(shù)單元1 reg2 EQU 0x31 ;計(jì)數(shù)單元2 reg3 EQU 0x32 ;計(jì)數(shù)單元3 reg4 EQU 0x33 ;計(jì)數(shù)單元4 JS EQU 0x34 ;中斷次數(shù)計(jì)數(shù)單元 TEST EQU 0x35 ;測(cè)試單元,TEST.0為中斷產(chǎn)生檢測(cè)位 R1 EQU 0x36 ;計(jì)數(shù)單元5 R2 EQU 0x37 ;計(jì)數(shù)單元6 R3 EQU 0x38 ;計(jì)數(shù)單元7 w_temp EQU 0x70 status_temp EQU 0x71 pclath_temp EQU 0x72 ;************************************************************************ ORG 0x00 ;復(fù)位向量地址為0x00 NOP GOTO MAIN ORG 0x04 GOTO BREAK ;跳轉(zhuǎn)到中斷子程序 MAIN BSF STATUS,RP0 ;換bank1 BCF OPTION_REG,INTEDG ;RB0/INT腳“1”上升沿/“0”下降沿觸發(fā) MOVLW B'11000000' ;1代表輸入,0代表輸出 MOVWF TRISA MOVLW B'00000001' MOVWF TRISB ;RB0作為外部信號(hào)輸入口 MOVLW 0x07 MOVWF ADCON1 ;RA口作為數(shù)字I/O BCF STATUS,RP0 ;換bank0 CLRF PORTB ;初始化PORTA/B口 BCF PORTA,0 CLRF TEST ;測(cè)試單元清零 CLRF JS BCF INTCON,PEIE ;關(guān)閉第二梯隊(duì)外圍中斷 BCF INTCON,RBIE ;關(guān)閉RB電平變化中斷允許位 BSF INTCON,INTE ;打開INT中斷允許位 BSF INTCON,GIE ;打開總中斷允許位 next1 BTFSS TEST,0 ;中斷檢測(cè)位是否為1,產(chǎn)生中斷則跳轉(zhuǎn) GOTO next1 ;為0沒有中斷產(chǎn)生則等待 BCF INTCON,GIE ;關(guān)閉總中斷允許位 BCF TEST,0 ;中斷檢測(cè)位清零 MOVLW 0xFF ;500ms左右延時(shí) MOVWF R1 MOVLW 0xFA &nb |
|
| 7樓: | >>參與討論 |
| 作者: laoben 于 2005/1/5 9:22:00 發(fā)布:
RB0 引腳的中斷緩沖器輸入是施密特觸發(fā)輸入 一個(gè)一個(gè)解決你的問(wèn)題 1- 改成RB.0外部中斷腳來(lái)檢測(cè)信號(hào),又有疑問(wèn)了??? PORTB 在多數(shù)情況下是TTL 電平輸入的,所以當(dāng)有一個(gè)3V 電平輸入( VDD = 5V)時(shí),讀端口的結(jié)果將為1。然而RB0 引腳的中斷緩沖器輸入是施密特觸發(fā)輸入,它的高電平輸入要求電壓比TTL的高電平輸入要求電壓要高。所以讀RB0引腳為1,但卻可能無(wú)法產(chǎn)生中斷。RB0引腳中斷采用具有滯后效應(yīng)的施密特觸發(fā)器輸入,可以降低噪聲。引腳上輸入的短噪聲脈沖可能使數(shù)據(jù)產(chǎn)生錯(cuò)誤,這與噪聲引起中斷不是一回事。(摘自PICmicro® 中檔單片機(jī)系列參考手冊(cè)9-17頁(yè)) |
|
| 8樓: | >>參與討論 |
| 作者: zdtdl 于 2005/1/5 20:11:00 發(fā)布:
那具體到RB0外中斷編程硬件和軟件需要注意哪些問(wèn)題呢? 現(xiàn)在對(duì)我來(lái)說(shuō)硬件軟件都有問(wèn)題,硬件單片機(jī)上電后RB0被置為2.8V的高電平保持不變。軟件上看來(lái)問(wèn)題最大,一次中斷后就不再產(chǎn)生中斷………… |
|
| 9樓: | >>參與討論 |
| 作者: zdtdl 于 2005/1/7 15:31:00 發(fā)布:
不好意思,終于發(fā)現(xiàn)是硬件的問(wèn)題,換了一塊電路板一切正常 RB0外中斷腳一切正常,只是RB7電平變化中斷腳依然存在那個(gè)上升沿不能觸發(fā)中斷的問(wèn)題………… |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |