[Vietnamese only] Lập trình PIC trên linux (XC16, ASM30, Pickit2)

Chào các bạn,
Mình kể lại kinh nghiệm lập trình với PIC, dsPIC trên linux. Vì cũng ít thấy ở VN người ta chia sẻ về linux, nên mạo muội chia sẻ chút xíu, hy vọng được góp ý.

Mình hiện dùng Manjaro, dựa trên Arch. Nhưng bạn dùng Ubuntu, Linux Mint hay Linux distro khác cũng tương tự.

1. Để viết code, mình dùng chương trình Mousepad. Ở distro khác thì có thể dùng Gedit… Điểm mạnh của các editor mặc định này so với Notepad trên windows đó là nó hỗ trợ high-light rất nhiều định dạng code. Ví dụ bạn soạn thảo một file văn bản main.c hoặc main.py thì nó sẽ định dạng màu sắc cho văn bản đó dựa trên code C hoặc Python để dễ làm việc. (Có vẻ tương tự Notepad++ nhỉ).
Dù sao thì mình không muốn dùng MPLABX IDE hoặc MPLAB 8 vì lý do máy quá cùi, không chạy mượt để mà lập trình được, và hơn nữa mình cũng chả cần tới mấy tính năng quản lý project cao cấp trên IDE.

Mousepad trên Manjaro.

2. Để biên dịch, mình cài XC16 từ Microchip, bản dành cho Linux. Hiện tại thì XC16 có vẻ là lựa chọn tối ưu để biên dịch cho dsPIC trên linux. Mình có biết SDCC nhưng không rõ nó có hỗ trợ dsPIC chưa. Dù sao đi nữa nếu có trình biên dịch nào mã nguồn mở mình sẽ dùng. Hiện tại chưa tìm được nên đành hài lòng với XC16, bản miễn phí.

http://www.microchip.com/pagehandler…tools/mplabxc/

Sau khi cài xong, thường thì xc16 sẽ nằm ở /opt/microchip/xc16/. Nếu không có, bạn dùng lệnh này để tìm vị trí cài xc16

locate xc16-gcc

Ví dụ để biên dịch file main.c trong thư mục /home/username/project/main.c, mình dùng những lệnh sau trong terminal:

cd /home/username/project/
/opt/microchip/xc16/v1.25/bin/xc16-gcc main.c -mcpu=30F4011 -Wl,--script=p30F4011.gld
/opt/microchip/xc16/v1.25/bin/xc16-bin2hex a.out
mv a.hex main.hex

nếu bạn lưu file code C là tên khác hoặc bạn dùng dsPIC khác thì đổi tên ở dòng thứ 2.
Để tiện lợi thì tốt nhất bạn tạo một file text, với nội dung như sau, ví dụ lưu thành tên file là compile.sh

Nội dung file compile.sh

Code:
#!/usr/bin/bash
# This script compile file main.c into main.hex
# Use for XC16 and dsPIC30F4011.

/opt/microchip/xc16/v1.25/bin/xc16-gcc main.c -mcpu=30F4011 -Wl,--script=p30F4011.gld
/opt/microchip/xc16/v1.25/bin/xc16-bin2hex a.out
mv a.hex main.hex

Nếu bạn dùng Shell khác, ví dụ Korn Shell thì sửa dòng đầu tiên. Thường phổ biến hiện nay là Bash.

Sau đó cho file compile.sh quyền thực thi:

Code:
sudo chmod +x compile.sh

Mỗi khi soạn thảo xong file C, bạn cần biên dịch code, chỉ cần click đôi vào file compile.sh, hoặc gõ terminal:

Code:
./compile.sh

…là file main.c được biên dịch thành main.hex.
Để quá trình biên dịch dễ dàng không báo lỗi, bạn nên copy các file mô tả của dsPIC vào cùng thư mục với file C. Ví dụ mình đang lập trình dsPIC30F4011, mình copy 2 file p30F4011.h và p30F4011.gld vào cùng thư mục file main.c, vậy là ok không lo trình biên dịch báo lỗi không tìm đc file.

Cũng như trên, muốn biết file p30F4011.h hoặc gld nằm ở đâu, dùng lệnh

Code:
locate p30F4011.h

Thường nó nằm ở /opt/microchip/xc16/v1.25/support/dsPIC30F/h/

3. Để nạp vào dsPIC, mình dùng mạch PICkit2 và chương trình pk2cmd. Microchip có cung cấp source code ở đây, mình lấy về và cài. Hoặc trên Manjaro thì trong Repo có cái pk2cmd-plus. Nếu bạn dùng mạch nạp khác hoặc ứng dụng khác, thì chắc có cách riêng của nó. Pk2cmd có bản dành cho windows, mình biết là PICkit2 có GUI cho windows, nhưng dùng command line có cái hay của nó, rất nhanh và tự động hóa được một số bước.
Để nạp file main.hex vào dspic, mình dùng lệnh sau:

Code:
pk2cmd -P DSPIC30F4011 -M -F main.hex

Nếu bạn thấy lệnh dài quá thì đừng sợ, mình sẽ dùng “bí danh” để gọi nó mỗi lần cần cho ngắn. Mở file .bashrc trong thư mục home:

Code:
mousepad ~/.bashrc #Nếu dùng editor khác thì đổi tên lệnh chỗ này, ví dụ gedit ...

Thêm dòng sau vào cuối file:

Code:
alias pk="pk2cmd -PDSPIC30F4011 -M -F"

Lưu lại là ok. Mỗi lần cần nạp file main.hex vào dsPIC chỉ cần gõ:

Code:
pk main.hex

là đủ.

4. Về bootloader, để làm việc tiện lợi thật không thể thiếu nó. Mình cũng vò đầu bứt tai với tinybootloader trên linux. Mới đầu còn chưa hiểu tí gì về bootloader nên rất khó khăn.
Để “biên dịch” (assemble – dịch thế nào nhỉ?) file bootloader, mình sẽ dùng XC16 luôn. Và chỗ này là chỗ command line làm tốt việc còn GUI ko được nè.
Không rõ có phải thế không, nhưng có vẻ từ XC16 đã không còn cái gọi là ASM30 nữa, mà XC16 sẽ assemble ASM cho dsPIC luôn. Vì vậy bạn hoàn toàn có thể assemble cho dsPIC trên MPLABX, nhưng mình đã thử, và có một điểm khó chịu. Bootloader chỉ chiếm khoảng 87 words cuối của Flash dsPIC, nhưng khi assemble xong, lại lòi đâu ra thêm một đống lệnh từ địa chỉ 0x100 trở đi. Việc này làm cho bootloader không chay được bình thường. Vò đầu bứt tai thì ra là bởi XC16 chạy trên MPLABX, khi assemble nó lại đem một số “macro” của C ra dùng. Ở đoạn 0x100 là đoạn khởi tạo environment, stack các kiểu… Trong khi chúng ta không cần tới. Vì vậy mình đã thử tìm hiểu dùng command line xem sao. Kết quả rất OK. Như sau:

Tạo một file có tên asm.sh với nội dung như sau:

Code:
#!/usr/bin/bash
#This script to execute commands to assemble dsPIC .s file into Intel Hex file for burning later.
#Assembler:
#input file=tinybld_ds30F4011.s  
#output file=tinybld_ds30F4011.o with format ELF, also create a list file named tinybld_ds30F4011.lst
/opt/microchip/xc16/v1.25/bin/xc16-as -o tinybld_ds30F4011.o -p30F4011 -omf=elf -alsm -a=tinybld_ds30F4011.lst tinybld_ds30F4011.s


#Linker:
#input file=tinybld_ds30F4011.o
#output file=tinybld_ds30F4011.out
/opt/microchip/xc16/v1.25/bin/xc16-ld -omf=elf --script=p30F4011.gld --no-data-init tinybld_ds30F4011.o -o tinybld_ds30F4011.out

#[Optional] Dump the Linked Object file to a file to examine:
/opt/microchip/xc16/v1.25/bin/xc16-objdump tinybld_ds30F4011.out -D -s > tinybld_ds30F4011.objdmp

#Convert Linked Object file into Intel HEX file for dspic:
/opt/microchip/xc16/v1.25/bin/xc16-bin2hex tinybld_ds30F4011.out

Nếu dùng cho chip khác, thì bạn phải đổi tên chip trong code này. Đồng thời nếu tên file asm khác, thì cũng phải đổi tương ứng. Kết quả cho ra file hex có tên cùng tên file asm (mà microchip đặt đuôi là .s)
Cũng cho file này quyền thực thi:

Code:
sudo chmod +x asm.h

Để chạy, cũng như compile.sh, có thể double click, hoặc thực thi trong terminal

Code:
./asm.h

chương trình trên máy tính thì dùng Tiny Multi Bootloader+ (hỗ trợ rất nhiều chip không chỉ của microchip mà còn AVR, TI MSP…), và mã nguồn mở. Tức một cái là nó lại chạy trên windows, và viết bằng Visual. Muốn chạy trên linux phải dùng Mono (một lớp ảo hỗ trợ chạy ứng dụng windows. Sở dĩ không dùng Wine được mà phải dùng Mono vì Wine chưa hỗ trợ cổng USB). Ở đây: http://sourceforge.net/projects/tinypicbootload/

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s