ตอนที่ 8 วิธีใช้ MPLAB–ICD ในการ 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 8–bit prescaler

RB0/INT

มี

มี

POWER UP TIMER

มี

มี

POWER ON RESET

มี

มี

SLEEP MODE

มี

มี

Watchdog Timer

มี

มี

Code-protection

มี

มี

คุณสมบัติอื่นๆ ของ PIC16F870 จะไม่กล่าวถึงนะครับเพราะว่า PIC16F84 ไม่มี จะเห็นได้ว่า PIC16F870 มีคุณสมบัติทุกอย่างที่ PIC16F84 มีดังนั้นเราก็พอกล้อมแกล้มได้ครับ แต่ว่าจะทำอย่างไรมาดูกันครับ

  1. เราจะใช้ MPLAB-ICD แทน PIC16F84 ก็ให้ตั้ง development mode เป็น PIC16F870 เพราะใกล้เคียงที่สุด
  2. ที่หัวโปรแกรมเปลี่ยนเป็น

list p=16f870 ; list directive to define processor

#include <p16f870.inc> ; processor specific variable definitions

แล้วก็เริ่มเขียน code เลยครับ

  1. ระวังอย่าใช้คุณสมบัติเกินที่ pic16F84 มีนะครับไม่ว่าจะเป็น Program memory, RAM, EEPROM ต้องนึกอยู่เสมอว่ามันเป็น pic16F84
  2. การอ่าน/เขียน EEPROM ของ PIC16F84 กับ PIC16F87X ไม่เหมือนกันนะครับ ดูได้จาก code นี้ครับ เพราะ ว่า Register อยู่คนละตำแหน่งของ memory รวมทั้ง bit setting ก็ไม่เหมือนกันเท่าไหร่ครับ วิธีแก้ก็คือเวลา debug ก็ใช้ code ของ PIC16F870 ไป พอจะใช้เป็น 16F84 ก็เปลี่ยน code ครับ
  3. การอ่านเขียน 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

  4. อย่าลืมข้อจำกัดของ PIC16F87X ใน debug mode นะครับ
ส่วนข้อจำกัดอื่นๆ เท่าที่ดูไม่กระทบกับ PIC16F84 ครับ

สุดท้าย ***** MPLAB-ICD program 16F84 ไม่ได้นะครับ

สรุป จะบอกว่า MPLAB-ICD สามารถจำลอง 16F84 ได้ทุกอย่าง มันก็ไม่จริงซะทีเดียวครับ เพราะมีบางอย่างที่ไม่เหมือนกัน (ซึ่งข้อจำกัดที่ผมพบก็ได้บอกไปแล้ว ถ้าเพื่อนคนไหนเคยลองแล้วเจอข้อแตกต่างข้ออื่นอีกก็ช่วยบอกมาด้วยนะครับ ) แต่ผมคิดว่ามันช่วยอะไรได้ในหลายๆ เรื่อง ดีกว่าเราเขียนโปรแกรมเสร็จ ทำการโปรแกรมตัว chip แล้ว ดูมันวิ่งเฉยๆ

จากประสบการณ์ของผมหลังจาก debug ด้วย MPLAB-ICD แล้ว ลองอัดโปรแกรมใส่ pic16F84 ส่วนใหญ่ต้องมาแก้ไขเล็กน้อย แต่ก็ไม่มากมายครับ แก้นิดหน่อยก็ใช้งานได้แล้ว เพื่อนๆ ก็คงพอได้แนวคิดกันบ้างแล้วนะครับ

 

BACK