ตอนที่ 8 วิธีใช้ MPLABICD ในการ debug PIC16F84
เนื่องจากว่า MPLAB-ICD นั้นถูกสร้างขึ้นมาให้สามารถทำการ debug pic ในตระกูล 16F87X แต่ว่ามันก็ไม่ใช่ว่าจะไม่สามารถ debug ตัวอื่นได้เลย เพราะว่า chip ในตระกูล 16 ของ pic มีคุณสมบัติคล้ายกันมาก ต่างกันเพียงรายละเอียด เล็กๆ น้อยๆ เท่านั้น ผมจะลองกับ 16F84 แล้วกันครับว่าเราจะใช้เจ้า MPLAB-ICD มา debug มันอย่างไร ก่อนอื่นเราลองมาเทียบคุณสมบัติคร่าวๆ ดูก่อนแล้วกันนะครับว่า PIC16F84 มีคุณสมบัติอะไรที่เหมือนกับ PIC16F870 บ้าง ผมจะใช้ PIC16F870 แล้วกันครับเพราะเป็นตัวที่เล็กที่สุดในตระกูล
คุณสมบัติ |
PIC16F84 |
PIC16F870 |
Program memory |
1K flash |
2K flash |
PINS |
18 |
28 |
Data RAM |
36 bytes |
128 bytes |
Data EEPROM |
64 bytes |
64 bytes |
Max frequency |
10 MHz MAX |
20 MHz MAX |
Stack |
8 deep |
8 deep |
INSTRUCTION |
เหมือนกัน |
เหมือนกัน |
PORT |
RA0-RA3,RB0-RB7 |
RA0-RA5,RB0-RB7,RC0-RC7 |
TIMER0 |
8-bit timer/counter with 8-bit prescaler |
8-bit timer/counter with 8bit prescaler |
RB0/INT |
มี |
มี |
POWER UP TIMER |
มี |
มี |
POWER ON RESET |
มี |
มี |
SLEEP MODE |
มี |
มี |
Watchdog Timer |
มี |
มี |
Code-protection |
มี |
มี |
คุณสมบัติอื่นๆ ของ PIC16F870 จะไม่กล่าวถึงนะครับเพราะว่า PIC16F84 ไม่มี จะเห็นได้ว่า PIC16F870 มีคุณสมบัติทุกอย่างที่ PIC16F84 มีดังนั้นเราก็พอกล้อมแกล้มได้ครับ แต่ว่าจะทำอย่างไรมาดูกันครับ
list p=16f870 ; list directive to define processor
#include <p16f870.inc> ; processor specific variable definitions
แล้วก็เริ่มเขียน code เลยครับ
การอ่านเขียน EEPROM ของ PIC16F87X
DATA EEPROM READ
BSF STATUS, RP1 ;
BCF STATUS, RP0 ; Bank 2
MOVLW DATA_EE_ADDR ;
MOVWF EEADR ; Data Memory Address to read
BSF STATUS, RP0 ; Bank 3
BCF EECON1, EEPGD ; Point to DATA memory
BSF EECON1, RD ; EEPROM Read
BCF STATUS, RP0 ; Bank 2
MOVF EEDATA, W ; W = EEDATA
DATA EEPROM WRITE
BSF STATUS, RP1 ;
BCF STATUS, RP0 ; Bank 2
MOVLW DATA_EE_ADDR ;
MOVWF EEADR ; Data Memory Address to write
MOVLW DATA_EE_DATA ;
MOVWF EEDATA ; Data Memory Value to write
BSF STATUS, RP0 ; Bank 3
BCF EECON1, EEPGD ; Point to DATA memory
BSF EECON1, WREN ; Enable writes
BCF INTCON, GIE ; Disable Interrupts
MOVLW 55h ;
MOVWF EECON2 ; Write 55h
MOVLW AAh ;
MOVWF EECON2 ; Write AAh
BSF EECON1, WR ; Set WR bit to begin write
BSF INTCON, GIE ; Enable Interrupts
SLEEP ; Wait for interrupt to signal write complete
BCF EECON1, WREN ; Disable writes
การอ่านเขียน EEPROM ของ PIC16F84
DATA EEPROM READ
BCF STATUS, RP0 ; Bank 0
MOVLW CONFIG_ADDR ;
MOVWF EEADR ; Address to read
BSF STATUS, RP0 ; Bank 1
BSF EECON1, RD ; EE Read
BCF STATUS, RP0 ; Bank 0
MOVF EEDATA, W ; W = EEDATA
DATA EEPROM WRITE
BSF STATUS, RP0 ; Bank 1
BCF INTCON, GIE ; Disable INTs.
BSF EECON1, WREN ; Enable Write
MOVLW 55h ;
MOVWF EECON2 ; Write 55h
MOVLW AAh ;
MOVWF EECON2 ; Write AAh
BSF EECON1,WR ; Set WR bit
BSF INTCON, GIE ; Enable INTs.
; begin write
สุดท้าย ***** MPLAB-ICD program 16F84 ไม่ได้นะครับ
สรุป จะบอกว่า MPLAB-ICD สามารถจำลอง 16F84 ได้ทุกอย่าง มันก็ไม่จริงซะทีเดียวครับ เพราะมีบางอย่างที่ไม่เหมือนกัน (ซึ่งข้อจำกัดที่ผมพบก็ได้บอกไปแล้ว ถ้าเพื่อนคนไหนเคยลองแล้วเจอข้อแตกต่างข้ออื่นอีกก็ช่วยบอกมาด้วยนะครับ ) แต่ผมคิดว่ามันช่วยอะไรได้ในหลายๆ เรื่อง ดีกว่าเราเขียนโปรแกรมเสร็จ ทำการโปรแกรมตัว chip แล้ว ดูมันวิ่งเฉยๆ
จากประสบการณ์ของผมหลังจาก debug ด้วย MPLAB-ICD แล้ว ลองอัดโปรแกรมใส่ pic16F84 ส่วนใหญ่ต้องมาแก้ไขเล็กน้อย แต่ก็ไม่มากมายครับ แก้นิดหน่อยก็ใช้งานได้แล้ว เพื่อนๆ ก็คงพอได้แนวคิดกันบ้างแล้วนะครับ