PIC18F

壹、PIC18 緣起

PIC系列晶片是美國 MICROCHIP 公司生產的微控制器。有PIC12(8bit)、PIC16(8bit)、PIC18(8bit)、PIC24(16bit)、PIC32(32bit)等型別。
PIC的功能和應用範圍很大,接腳數從18到128都有,目的就是要滿足所有應用上的需要。不只強調功能性,也強調電氣特性,有非常好的省電設計(nano amp)。在8位元微控制器世界中,我想,它應該是第一名了。相對於8051的複雜指令集(CISC)設計;PIC採取精簡指令集(RISC)設計。指令數量較少,大部分都是2bytes的指令,只有少數幾個是4bytes的指令。因為工作上的需要,我接觸了PIC,我使用過PIC18F8722,PIC18F45K20,和PIC18F87J10。其中使用得最熟悉的是PIC18F87J10。

PIC18F87J10 接腳圖


pic18f87j10單版

PICF87J10為100 pin的微控制器,有 TIMER,UART,GPIO,IIC,SPI...等硬體介面。接 40MHZ crystal 後,可跑 10 MIPS。性能不錯。

大部分的腳位都是多功能腳位,意思是說,同一跟腳可以是GPIO,或ADC,或者是IIC功能腳位。畢竟要把那麼多功能做在同一顆晶片中,100 PIN是不夠用的。

除多功能腳位外,其他腳位的功能如下所述。

VCC晶片電壓源輸入腳位,3.3 volt。
VSS晶片電壓源接地腳位。
AVCC晶片類比電壓源輸入腳位,3.3 volt。供類比電路使用的電壓源。
AVSS晶片類比電壓源接地腳位。供類比電路使用的電壓源。
OSC1、OSC2石英震盪時鐘訊號輸入腳位,可接40MHZ 以下的石英振盪器。
ENVREG此腳位接3.3v致能PIC內部整壓器,可藉由3.3 volt 產生 2.5 volt電壓源供PIC18 CORE使用。
VDDCORE當ENVREG=3.3volt,此腳位接10UF之穩壓電容,以提供PIC18 CORE 2.5volt的穩定電壓源。
MCLR,PGC,PGD為PROGRAM和DEBUG的共用腳位。其中MCLR也是晶片的reset腳位。

貳、PIC18 內部構造

要寫好PIC的程式,了解晶片的內部構造是第一步的。也許不用了解,我們也可以寫得出PIC的程式,但當我們要完全的發揮PIC的效益和性能,充分的了解PIC的內部構造就是一件重要的事了。

PIC18G87J10的內部構成如下圖:

pic18f87j10單版

一、PIC18F CORE

負責指令的抓取與執行。當晶片重置後,PROGRAME COUNTER 從 0x0000 開始執行,CORE 的狀態機就開始運作起來,一個指令接著一個指令抓,執行,並儲存執行結果,有些結果會存入STATUS REGISTER,供程式讀取。

二、FLASH ROM

PIC的程式碼儲存在FLASH ROM。
FLASH ROM的配置如下圖:

pic18f87j10單版
RESET VECTOR晶片重置後,指令開始執行的地方。
HIGH PRIORITY INTERRUPT VECTOR中斷優先權致能後,高優先權中斷向量0x0008。如果不致能中斷優先權,那0x0008將是所有中斷執行的地方。
LOW PRIORITY INTERRUPT VECTOR中斷優先權致能後,低優先權中斷向量0x0018。如果不致能中斷優先權,那0x0018只是一般的程式碼記憶體,不是低優先權中斷向量的位址,因為沒有低優先權中斷向量。
PROGRAM CODE AREA一般的程式碼記憶體。所有程式碼都被編排在這個區域中。
CONFIGURATION BITS晶片組態記憶體,用以設定晶片的操作特性。在程式碼尚未執行之前,這部份的記憶體會先被讀取並執行。有8bytes的容量,PIC18F87J10只用到前面四個bytes。

三、STACK RAM

PIC18F87J10 的 STACK MEMORY 容量為 32x21 bits。
為什麼是21bits呢!?這是因為PIC18F的PROGRAM MEMORY容量最大可到 2 Mega bytes,2**21,所以每個堆疊的單位必須 >= 21bits。
又為甚麼是31呢!?這是因為 MICROCHIP 主觀的認為31層的堆疊已經夠用了,還不夠用的話,請調整程式的設計吧。

四、RAM BANKS

PIC18F87J10 有 3936 bytes 的 ram。因為 PIC18F 的 CORE 是 8 bits,對 ram 的存取是用 8 bits 的匯流排,無法直接存取3936 bytes 的 ram。所以有了 BANKING 的觀念發展出來。當然 MICROCHIP 也有提出單一指令存取ram 的方式,不過指令大小比較長,執行速度也比較慢,而且並不是每個指令都可以用,所以了解 BANKING 還是有需要的,尤其是寫組合語言的時候。有一個特殊暫存器 BSR 就是用來處理 BANKING 的動作,BSR[3:2:1:0] 可以存放 0 ~ 15 的 BANK 值。

五、SYSTEM CONTROL BLOCK

以 CONTROL BLOCK 來分解一個微控制器的各部份功能是我的習慣。
SYSTEM CONTROL BLOCK 包含負責微處理器基本的行為的暫存器,PC、STATUS,WREG、BSR、PRODL、PRODH、FSR0L、FSR0H、FSR1L、FSR1H、FSR2L、FSR2H。

PCprogram counter,21 bits,紀錄目前程式的執行位址。不可讀寫,但在STACK中,我們可以看到它的影子,因為STACK的 32x21 bits 正是因它而有。
STATUSSTATUS register,位址 FD8h。紀錄程式的狀態,有5 bits
[- - - N OV Z DC C]
Nnegative bit,1 is negative,0 is positive。
OVoverflow bit,1 is overflow,0 is no overflow。
Zzero bit,1 if arithmetic or logic operation is zero。
DCdigital carry or /borrow bit,1 for low 4 bit has carry out.
Ccarry bit,1 is a carry out from operation.
WREGWorking register,like acc in 8051,算術運算指令、邏輯運算指令、邏輯條件運算指令,以及其他指令都會用到它。
BSRBank selection register,用於選擇ram bank,所有會用到banking的指令都會用到它。
PRODL乘法結果暫存器的低位元組。
PRODH乘法結果暫存器的高位元組。
FSR0LFile select register,FSR0的低位元組,用於間接定址。
FSR0HFile select register,FSR0的高位元組,用於間接定址。
FSR1LFile select register,FSR1的低位元組,用於間接定址。
FSR1HFile select register,FSR1的高位元組,用於間接定址。
FSR2LFile select register,FSR2的低位元組,用於間接定址。
FSR2HFile select register,FSR2的高位元組,用於間接定址。

六、INTERRUPT CONTROL BLOCK

PIC18 的中斷控制方式很別出心裁,如果不分優先權的話,所有中斷都可以在同一個函式中處理。如果分優先權的話,會分兩群中斷處理,就是高優先權的中斷會在高優先權中斷函式中一起處理,低優先權的中斷在低優先權中斷函式中處理。高優先權的中斷向量是在0x0008,低優先權的中斷向量是在0x0018。

相關的特殊暫存器有 INTCON、INTCON2、INTCON3、PIR1、PIR2、PIR3、PIE1、PIE2、PIE3、IRP1、IRP2、IRP3、RCON

七、TIMER CONTROL BLOCK

PIC18 有五個計時器 ,TIMER0、TIMER1、TIMER2、TIMER3,TIMER4。

TIMER0INTCON、T0CON、TMR0L、TMR0H、TRISA。
TIMER1INTCON、T1CON、TMR1L、TMR1H、PIR1、PIE1、IPR1。
TIMER2INTCON、T2CON、TMR2、PR2、PIR1、PIE1、IPR1。
TIMER3INTCON、T1CON、T3CON、TMR3L、TMR3H、PIR2、PIE2、IPR2。
TIMER4INTCON、T4CON、TMR4、PR4、PIR3、PIE3、IPR3。

八、EUSART CONTROL BLOCK

這個特殊功能區塊支援同步、非同步傳送接收,我把它翻譯成"加強型通用同步非同步接收傳送器"。UART就是非同步傳送接受,在短距離的通訊上常常被用到,可以用來做 DEBUG、BOOTLOADER、或其他通訊用途。

九、GPIO CONTROL BLOCK

所有的特殊功能接腳都可以當作 GPIO 使用。
GPIO 是 general purpose input ouput 的縮寫,即"一般用途輸出入埠"。我多加了一個"埠"字。
PIC18F87J10 的 GPIO 有 GPIO A,B,C,D,E,F,G,H,J,(沒有 I )。
如果沒有啟動特殊功能的話,那 GPIO 就是 GPIO,可以做 INPUT 或 OUTPUT 的功能接腳。

十、MSSP CONTROL BLOCK

這個特殊功能區塊有 SPI,IIC 等特殊功能。

十一、CCP CONTROL BLOCK

這個特殊功能區塊有五支腳位可設定為CAPTURE、COMPARE、PWM 等三種功能。

十二、ECCP CONTROL BLOCK

這個特殊功能區塊有五支腳位可設定為加強型的CAPTURE、COMPARE、PWM 等三種功能。

十三、ADC CONTROL BLOCK

這個特殊功能區塊有 10 BITS 的類比對數位轉換器 。

十四、COMPARATOR CONTROL BLOCK

這個特殊功能區塊有電位比較器 。


參、PIC18 指令集
資料搬移指令MOVLB、MOVLW、LFSR、CLRF、MOVF、MOVFF、MOVWF、RLCF、RLNCF、RRCF、RRNCF、SETF、SWAPF、CLRWDT、POP、PUSH
算術運算指令ADDLW、SUBLW、MULLW、ADDWF、ADDWFC、DECF、INCF、MULWF、SUBFWB、SUBWF、SUBWFB
布林運算指令IORLW、XORLW、ANDLW、ANDWF、COMF、IORWF、NEGF、XORWF、DAW、
邏輯運算指令CPFSEQ、CPFSGT、CPFSLT、DECFSZ、DCFSNZ、INCFSZ、INFSNZ、TSTFSZ
位元運算指令BCF、BSF、BTFSC、BTFSS、BTG
跳躍指令RETLW、BC、BN、BNC、BNN、BNOV、BNZ、BOV、BRA、BZ、CALL、GOTO、RCALL、RETFIE、RETLW、RETURN
其他NOP、RESET、SLEEP

我焊了下面的板子做實驗,把lcm,led,button,eeprom,spi flash 接在上面供系統使用。

pic18f87j10單版 pic18f87j10單版

目前這塊板子已經功成身退了,所以我就拿它來寫PIC的程式設計網頁。
接下來我要寫的是一隻 C 的 Bootloader 和一隻 C 的應用程式。最好是還有一隻多工的程式,那就太棒了。至於組合語言部份,我也有一點點的CODING經驗,不過暫時還是以C為主。