|
Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
|---|---|---|---|---|
|
初級會員
![]() |
補上附檔
發表於: 2025/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就能完結了
發表於: 2025/3/20 16:04
|
|||
|
||||
|
Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
|---|---|---|---|---|
|
初級會員
![]() |
參照:
1.#pragma config DEBUG = OFF // 將RB6,RB7設為IO腳 我原本就有設定 2. 想知道只檢查腳位對應的Bit這部分的原因是什麼呢? 因為判斷PORTB的初始模塊是我主管寫的 只是我接手後按鍵增加到RB6時明顯感覺有問題 我想推翻這個寫法也要有理由,不然就只能私下避免用RB6
發表於: 2025/3/19 15:23
|
|||
|
||||
|
Re: PIC16F877的RB6作為按鍵輸入無法使用
|
||||
|---|---|---|---|---|
|
初級會員
![]() |
補充,電源供電5V,相同程式電路試了三顆PIC16F877都會重復發生,如果我測試沒問題應該就是RB6有什麼架構影響,我希望能知道原因,並作記錄告訴自己以後按鍵別用到RB6
發表於: 2025/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); } }
發表於: 2025/3/12 13:40
|
|||
|
||||
|
Re: 25LC256的WREN功能請教
|
||||
|---|---|---|---|---|
|
初級會員
![]() |
我改用
0x05+8CLK 0x06 0x05+8CLK 0x02+address+DATA 0x05+8CLK 我發現Write Enable Latch (WEL)在0x06之後等於1 在0x02+address+DATA之後等於0 所以每次寫入DATA前必須下一次0x06 有什麼辦法可以只下一次就好嗎? 因為我每次寫入4個DATA,我要多下好幾次0x06,寫入的時間就變很長
發表於: 2023/7/12 15:27
|
|||
|
||||
|
25LC256的WREN功能請教
|
||||
|---|---|---|---|---|
|
初級會員
![]() |
我目前使用25LC256
我的WP和HOLD都是接上拉電阻到VCC沒使用 然後我嘗試寫入資料讀取資料時發現 如果我是(空一行代表CE回到high) 0x06 0x02+0x0000+4筆DATA 0x02+0x0004+4筆DATA 0x02+0x0008+4筆DATA 0x02+0x000C+4筆DATA 這樣寫資料再去讀發現,只有address0x0000~0x0003能寫入,後面0x0004~0x000F都沒有寫進去 我必須改成(空一行代表CE回到high) 0x06 0x02+0x0000+4筆DATA 0x06 0x02+0x0004+4筆DATA 0x06 0x02+0x0008+4筆DATA 0x06 0x02+0x000C+4筆DATA 每次寫DATA錢我都送一次Write Enable的指令才能正常的全部寫入 但是我中間明明都沒有下達Write Disable的指令,為什麼會這樣? 還是我搞錯SPEC的意思了?本來就應該用後面那種寫法?
發表於: 2023/7/12 14:17
|
|||
|
||||
|
Re: PIC16F877A,為什麼用For迴圈會出現問題?
|
||||
|---|---|---|---|---|
|
初級會員
![]() |
我想要請教的是,為什麼RC1在輸出時固定在1.1mS會有延遲
是硬體架構還是編譯器導致的?
發表於: 2023/3/15 17:06
|
|||
|
||||
|
Re: PIC16F877A,為什麼用For迴圈會出現問題?
|
||||
|---|---|---|---|---|
|
初級會員
![]() |
補充一下,已知error時間點是在1mS左右,加一段2mS的Delay
原本的DATA會有error,但是現在避開出現error的時間點就正常了 所以可以證明這一個現象是跟著時間走,跟程式沒有任何關係 https://imgur.com/LA1bRLQ
發表於: 2023/3/10 17:21
Edited by IOP14759 on 2023年03月10日 17:59:20
Edited by IOP14759 on 2023年03月10日 18:00:25 |
|||
|
||||