答客問(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輸出腳則為 RC1RC2 學生想利用撰寫程式方法來讓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