Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
我試完了,一樣沒用,因為RB6的問題感覺是硬體問題
以下是我周五與今天早上進行的測試 1.原本的電路按RB6連中斷都不會進入 2.RB6改接函數波產生器,用1Hz頻率方波模擬按鍵,中斷正常動作 3.根據1&2,我們推測試RB6這隻腳做輸入時對bounce特別敏感 4.在RB6與按鍵間串一個1K歐姆,按RB6正常動作 5.拿掉1K歐姆根據您的程式,一樣不會進入到中斷 但就是只有RB6會有這問題,PORTB其他腳都很正常
發表於: 3/24 11:26
|
|||
|
Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
---|---|---|---|---|
管理員
![]() ![]() ![]() |
IOP14759 你好
有可能是進入中斷和判斷Input狀態的時序問題,可以嘗試參考以下程式碼來測試RB6
...
發表於: 3/21 17:18
|
|||
|
Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
補上附檔
發表於: 3/21 8:53
|
|||
|
Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
我改用單獨判斷一個IO腳的方式沒用,依然只有if(RB6==0)中的程式不動作
懷疑是根本沒進去中斷程式,把程式改成附檔中的樣子 不論我按哪個鍵,RB0都用示波器確認由H=>L,都應該進去中斷 可是只有我按RB6時,RC1的LED沒反應 按RB1/2/3/4/5/7時RC1的LED都會亮,RB0和RB6用示波器也確認H=>L 後來同事叫我把20M的振盪改成11.0592M的,這時候RB6按鍵就正常了 所以看起來跟程式沒有關係是頻率影響的,那我就更困惑了 20M應該是符合SPEC的吧? 我同事是擔心我們用的是殘次品,因為我們都小批量使用,都蝦皮買的 我是覺得應該不至於,20M用了幾年了到目前只有RB6按鍵出問題 所以只要告訴我RB6別用,那我做個文檔提醒10M以上不要用RB6就能完結了
發表於: 3/20 16:04
|
|||
|
Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
參照:
1.#pragma config DEBUG = OFF // 將RB6,RB7設為IO腳 我原本就有設定 2. 想知道只檢查腳位對應的Bit這部分的原因是什麼呢? 因為判斷PORTB的初始模塊是我主管寫的 只是我接手後按鍵增加到RB6時明顯感覺有問題 我想推翻這個寫法也要有理由,不然就只能私下避免用RB6
發表於: 3/19 15:23
|
|||
|
Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
---|---|---|---|---|
管理員
![]() ![]() ![]() |
IOP14759 你好
RB6 和 RB7 在除錯模式下是專用的調試引腳。如果DEBUG被設置為 0,則 RB6 和 RB7 將被用作調試引腳。如果目前是利用除錯模式來測試可能會有影響,建議加入的修改: #pragma config DEBUG = OFF // 禁用調試模式 另外注意到你目前在中斷的程式碼段落中加入Delay,建議避免在 ISR 中使用延遲,如果需要此功能可以設計移至其他非中斷的段落來執行。 在判斷PORTB的部分注意到你是同時判斷整個Byte,建議修改程式在判斷時只檢查腳位對應的Bit,避免因為其他狀況造成非預期結果。
發表於: 3/19 10:51
|
|||
|
Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
補充,電源供電5V,相同程式電路試了三顆PIC16F877都會重復發生,如果我測試沒問題應該就是RB6有什麼架構影響,我希望能知道原因,並作記錄告訴自己以後按鍵別用到RB6
發表於: 3/14 16:14
|
|||
|
PIC16F877的RB6作為按鍵輸入無法使用
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
我平時用到RB6時一直怪怪的,剛剛我用一個電路測試
B PORT當作輸入,把除了RB0的其他7個輸入接一個二極體到RB0 這樣子每隻輸入都能做為中斷,電路圖如附檔 (平時使用時我還有接4.7K上拉,測試為了方便就使用內部上拉) 程式放在文章最後 每個按鍵程式都一樣,但是我發現只要使用RB6作為輸入時MCU都會有BUG 而且很具體的就是只有按下RB6(PORTB =0xBE)時有問題,把RB6(PORTB =0xBE)中的動作放到其他按鍵下依然能正常動作 所以我才把每個按鍵的動作都改的跟RB6(PORTB =0xBE)一樣,但是其他動作就是不會有問題 目前這程式比較簡化,頂多只是按KEY沒反應 我平時使用的程式會出現按完RB6的KEY放開之後,RB6就直接=L不變了 但是我讀了一下TRISB6 確定仍然是輸入,根本不知道這時候MCU卡死到哪邊去了 必須我按MCLR重置後RC6才重新=H 我就有點懷疑是硬體線路問題,我就把電路上的二極體和KETY對調,但問題仍穩定出現在RB6上 可是我看了一下規格書RB4~7的IO接腳都是相同架構,不明白為什麼單單只有RB6有問題 目前解法是不用RB6,多用幾個二極體AND比較,但還是上來問看看 void main() { TRISC=0x00; PORTC=0x00; TRISB=0xFF; PORTB=0xFF; OPTION_REG=0b00111111; INTCON=0b10010000;//Global Interrupt Enable bit=1,External Interrupt Enable bit=1 key_mode=0; st: if(key_mode==6){RC0=1;key_mode=0;RC0=0;} goto st; } void interrupt ISR(void) { if(INTF)//external interrupt { inputData = PORTB & 0xFF; INTF=0; switch (inputData) { case 0xFC://cyc_key if(key_mode==0 || key_mode==6) { key_mode=6; } break; case 0xFA://r_key if(key_mode==0 || key_mode==6) { key_mode=6; } break; case 0xF6://g_key if(key_mode==0 || key_mode==6) { key_mode=6; } break; case 0xEE://b_key if(key_mode==0 || key_mode==6) { key_mode=6; } break; case 0xDE://dim_key if(key_mode==0 || key_mode==6) { key_mode=6; } break; case 0xBE://sleep_key if(key_mode==0 || key_mode==6) { key_mode=6; } break; case 0x7E://sleep_key2 if(key_mode==0 || key_mode==6) { key_mode=6; } break; } __delay_ms(200); } }
發表於: 3/12 13:40
|
|||
|