壹、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 接腳圖
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的內部構成如下圖:
一、PIC18F CORE
負責指令的抓取與執行。當晶片重置後,PROGRAME COUNTER 從 0x0000 開始執行,CORE 的狀態機就開始運作起來,一個指令接著一個指令抓,執行,並儲存執行結果,有些結果會存入STATUS REGISTER,供程式讀取。
二、FLASH ROM
PIC的程式碼儲存在FLASH ROM。 FLASH ROM的配置如下圖:
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。
PC | program counter,21 bits,紀錄目前程式的執行位址。不可讀寫,但在STACK中,我們可以看到它的影子,因為STACK的 32x21 bits 正是因它而有。 |
STATUS | STATUS register,位址 FD8h。紀錄程式的狀態,有5 bits [- - - N OV Z DC C]
N | negative bit,1 is negative,0 is positive。 |
OV | overflow bit,1 is overflow,0 is no overflow。 |
Z | zero bit,1 if arithmetic or logic operation is zero。 |
DC | digital carry or /borrow bit,1 for low 4 bit has carry out. |
C | carry bit,1 is a carry out from operation. |
|
WREG | Working register,like acc in 8051,算術運算指令、邏輯運算指令、邏輯條件運算指令,以及其他指令都會用到它。 |
BSR | Bank selection register,用於選擇ram bank,所有會用到banking的指令都會用到它。 |
PRODL | 乘法結果暫存器的低位元組。 |
PRODH | 乘法結果暫存器的高位元組。 |
FSR0L | File select register,FSR0的低位元組,用於間接定址。 |
FSR0H | File select register,FSR0的高位元組,用於間接定址。 |
FSR1L | File select register,FSR1的低位元組,用於間接定址。 |
FSR1H | File select register,FSR1的高位元組,用於間接定址。 |
FSR2L | File select register,FSR2的低位元組,用於間接定址。 |
FSR2H | File 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。
TIMER0 | INTCON、T0CON、TMR0L、TMR0H、TRISA。 |
TIMER1 | INTCON、T1CON、TMR1L、TMR1H、PIR1、PIE1、IPR1。 |
TIMER2 | INTCON、T2CON、TMR2、PR2、PIR1、PIE1、IPR1。 |
TIMER3 | INTCON、T1CON、T3CON、TMR3L、TMR3H、PIR2、PIE2、IPR2。 |
TIMER4 | INTCON、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 接在上面供系統使用。
目前這塊板子已經功成身退了,所以我就拿它來寫PIC的程式設計網頁。 接下來我要寫的是一隻 C 的 Bootloader 和一隻 C 的應用程式。最好是還有一隻多工的程式,那就太棒了。至於組合語言部份,我也有一點點的CODING經驗,不過暫時還是以C為主。
|