答客問(FAQs): 以下讀者來函,摘錄幾則答問內容。坦白說,自從將授課講義寫成這本拙著後,竟已多年沒有再教這門課了。所以關於進階的問題,讀者亦可以請教 新華電腦(http://www.microtime.com.tw/chinese.asp)的工程師們,他們才是真正專業的! ^_^
Q1:
您好:
我是**大學**系的學生,***,之前我有寄信給您問問題,不知道您是否還記得?
現在我又碰到一些問題想要請教**了:
第一是關於計時中斷的問題:
您的書上p.197的程式中,我想請問:
計時中斷的副程式一定要叫做
"isr" 嗎? 還有為什麼可以不用btfss
INTCON,T0IF就可以做中斷的處理?
第二是關於SPI的問題:
我最近的工作是要在PIC16C781上模擬SPI的傳輸,由於C781本身沒有SPI的功能,
所以我用了兩個pin,一個用來傳資料,一個當時脈,想將資料傳給一塊8051晶片。 但是試了好多次都失敗,不知道您能否給我一些建議?
謝謝!
A1:
Dear **:
1. 計時中斷的副程式一定要叫做 "isr" 嗎?
isr 是 label 名稱,是自訂的,你可試試看別的名稱。
2. 還有為什麼可以不用btfss INTCON,T0IF就可以做中斷的處理?
A. 有些位元,並非都一定程式可控制,你可試試看。
B. p.197的程式是
"計時" 中斷,自己寫指令中斷,怎麼知道時間到了? 若是自己決定中斷,其實就不需中斷了哩。
^_^
3. 你使用的晶片,可參考 "PIC16C7X 原理與實務 何信龍等
全華 03528 007" 一書。 PIC16C7X 都有支援 SPI 呀!若堅持使用此型號晶片,可以利用示波器做輔助偵錯儀器,由觀測波形了解傳送與接收的情形。
Q2:
老師您好,我是**大學的***同學;
關於PIC書中p.196頁的計時中斷程式,我還是有不懂的地方。首先,程式怎麼知道isr那個subroutine是在跑計時中斷呢? isr的第一行
incfsz number是計時中斷發生時才會跑的嗎?
謝謝!
還有一些問題:
isr中執行了goto isr_end之後,程式不是應該從goto isr_end之後的開始執行嗎?
為什麼它又跳回incfsz number執行?
還有,call和goto指令有什麼不同? 不好意思,一直問 ** 問題:
假如有一個PIC晶片沒有SPI傳輸相關的暫存器,我要讀一個暫存器裡的數值,並把它從最低的一個位元一個一個輸出到同一個PORT,要如何做到?
謝謝,不好意思!
A2:
Dear **:
1. "程式怎麼知道isr那個subroutine是在跑計時中斷呢?"
答: 設定 P.195
INTCON 的 兩個 bit ,即啟動 Timer 0 計時中斷。 要配合 P.181的圖理解之。 在 PIC 中,一旦觸發中斷,程式一律跑到 0004 位址,去執行程式。
這樣說明是否一切都了解了呢?如此“isr的第一行 incfsz number是計時中斷發生時才會跑的嗎?”,答案自然是 YES囉! ^_^
2. “ isr中執行了goto isr_end之後,程式不是應該從goto isr_end之後的開始執行嗎? 為什麼它又跳回incfsz number執行?”
答: (1) 請先確定了解
incfsz 指令,見 P. 66,然後再看 P.198的說明,這樣是否了解?
(2) “為什麼它又跳回incfsz
number執行?” 下次再引發計時中斷(本例 4ms一次),然後再跑去 isr ,執行incfsz number 呀! 是否誤會?
最後還是希望你再把第15講的第1
節,及圖 15.1再看一遍,了解中斷程式執行的流程。
3. “call和goto指令有什麼不同?”
答:
call 會去執行一副程式,執行副程式完畢後, “系統”會自動返回當初呼叫處(原理我都寫在第10講的第1節)。
goto 則只管跳去某個label處,繼續向下執行而已。
4. “假如有一個PIC晶片沒有SPI傳輸相關的暫存器,我要讀一個暫存器裡的數值,並把它從最低的一個位元一個一個輸出到同一個PORT,要如何做到?”
答:
這部分,不甚清楚你的問題,我試著回答。以 RS-232 傳輸為例,如果晶片中有 UART【如本書的晶片】,我們只要設定 傳輸格式、Baud Rate (見第19講)
等,就可以輕鬆完成傳送與接收。可是如果晶片中沒有 UART,就要自己來寫這部分的程式了,這部分可參考以下書籍:
“PIC16C5X
單晶片實務應用設計(四) 鍾富昭 編著 全華”
其中第19篇 串列傳輸,作者就自己寫了程式 (PIC16C5X 沒有 UART),
鍾富昭先生,真是單晶片的專家了!
Q3:
您好~我們是剛剛應學業上需要學PIC的學生,碰到了一些困難!就是你著作的那ㄧ本書裡的專題硬體外接部份,例如說專題(一):只要再外接專題(一)電路到示範板上的RB0腳就可以嗎?假設我們把單晶片拔下,直接插到麵包板然後RB0腳再接上電路和PORTC接腳的LED燈就行?還是要再接其他的電路模組呢? 不知是否可為我們解答?謝謝~~~
A3:
1. "例如說專題(一):只要再外接專題(一)電路到示範板上的RB0腳就可以嗎?"
=> Yes! (示範板上已有 震盪源)
2.
"假設我們把單晶片拔下,直接插到麵包板然後RB0腳再接上電路和PORTC接腳的LED燈就行?"
=> No!
有關自行設計 Target Board,我在 第一篇 第八講 P .111 有提到,所以 第八講 宜再閱讀一遍。
參見
P.340 專題8 – “自行設計的學習板”,亦可看出端倪。 總之,一定要有震盪源
(頻率要考慮),否則 單晶片 不會動作哩。
Q4:
您好:
我是一位正在學習PIC16F877的學生,現在正在做您書上的專題3,電路接好後卻無法動作,程式我是照書上打的,組譯後並無錯誤,LCD上排全部都是黑的,但是按4X4鍵盤卻無反應,可以給我一點方向去找出錯誤嗎?
我是將PIC接在麵包板上,除石英震盪器,電源接地之外還要接上其他元件PIC才會運行嗎?
還有4X4的鍵盤是否需要接電源還是如圖接就行了, 因為我參考其他書籍的4X4鍵盤,都有畫接Vcc。
在專題3的PIC電路圖中PD.4和PC.4都是寫23,但PD.4不是第27隻接腳嗎?可以麻煩說明一下嗎
也許我的疑問太過於基本,但是還是希望老師能在百忙撥空為我解答一下,我會非常感激您的。
學生 ***
A4:
Dear **:
從你的問題,我必須告訴你:你這樣子學韌體是不甚正確的。
學韌體與軟體是一樣的,必須由小程式慢慢長大的,不是一下子寫大程式,然後一次作
debug。要學習「步步為營」,以接觸到一個新元件為例,必須先對此元件寫測試程式,每一點訊號都親自量測,如此對元件熟悉,電路工作無誤後,再將程式納入主程式中。這也是為何我在第四篇—上陣篇的一開始,寫那一段話(勸讀者自行寫程式)的緣故。
盼望你按部就班慢慢學習,體會程式慢慢累積,慢慢長大的感覺。否則,即使你僥倖地依照書本專題,作出了成果,只要一旦將來電路出了狀況,你將完全沒有debug的能力,這也是許多單晶片學習者的普遍問題。
有關自行設計
Target Board,我在 第一篇第八講 P .111 有提到,所以至少第八講該看一遍。 ,P.340
另有自行設計的學習板。當然,一定要有震盪源 (頻率要考慮)喔。
再次強調,請由小而大喔。
Q5:
您好:
我是**大學**所的學生,學生購買您所出版的pic單晶片一書,真是讓學生收益良多,不僅老師寫的內容非常的生動及活潑,也很有系統的介紹,讓讀者能很快的吸收到書本上的精髓!
而目前學生有一個問題想請教您,因學生目前在接一個電動車驅動 器的計畫,需要利用PIC來產生 PWM訊號,但因為卡到馬達需要正反轉 的問題,所以需要利用兩組PWM模組及AD轉換模組。
此時的類比輸入腳為RA0及 RA1, 而PWM輸出腳則為 RC1及RC2 ,學生想利用撰寫程式方法來讓PIC判斷,當RA0為高電位時(RA1為低電位) 此時RC2輸出PWM訊號,反之則RA1為高電位時(RA0為 低電位),則RC1輸出PWM訊號!
請問此時要如何撰寫程式,方可讓PIC做出判斷呢?
麻煩老師您了!
A5:
你好:
謝謝你對拙著的愛護。
關於你的問題,建議你先個別寫兩個程式,作出
(1) 讓 RC2輸出你希望的PWM訊號,以及不輸出 PWM訊號 時,該輸出何訊號?
(2) 讓 RC1輸出你希望的PWM訊號,以及不輸出 PWM訊號 時,該輸出何訊號
如此一來,再加上你對 ADC 的了解,你的問題應該自可迎刃而解囉。
祝:
學業順利 愉快
Q6:
您好:
我是您PIC單晶片學習祕笈的讀者,這本書淺顯易懂讓我獲益良多。
在此,我想提出個小疑問,就是在本書第一篇第三講的32頁中間第十行:
“程式記憶體(在PIC16F877中及為Flash Memory)的大小為8kW,或寫成8K*14words”
以上文中,「words」我認為應是「bits」,不知是否正確?
讀者 *** 先生
A6:
Dear * 先生您好:
很高興拙著對您有些幫助。
關於您的問題,我想起當初後面那句話,是看了 DataSheet 後加上去的。
我隨即找DataSheet,終於找到了,請參考以下DataSheet檔案:
http://ww1.microchip.com/downloads/en/devicedoc/39582b.pdf
其中Page. 3 有以下說明:
「Up to 8K x 14 words of Flash
Program Memory,
Up to 368 x 8 bytes of Data
Memory (RAM),
Up to 256 x 8 bytes of EEPROM
Data Memory 」
所以說這種寫法確實是會造成誤會,可是如果習慣了,卻也頗清楚,可以一目了然。
就醬子囉。
^_^
Best Wishes,
Tang