Tác giả: falleaf Diễn dàn PICVIETNAM.COM
Su tầm và biên soạn:[email protected] 1
Vi iu khin PIC - Hc nhanh i vo ng dng
Li khuyờn la chn b cụng c lm vic vi PICMch np: Falleaf PG2C - PIC Tutorial
Chng trỡnh np: IC - PROG
Bootloader: Tiny bootloader
Debugger: ICD2 Clone
Chng trỡnh dch: MPLAB IDE - CCS C
La chn PIC:
- Mi hc: PIC16F628A hoc PIC16F88
- Hc tng hp: PIC16F877A
- Lm ti: PIC16F876A
- Cn mnh hn: PIC18F458
Cỏc loi trờn u cú th dựng PG2C v IC-PROG 1.05D
- iu khin ng c: PIC18F4331, PIC18F4431 (ICD2)
- Lp trỡnh thut toỏn: dsPIC30Fxxxx (dựng ICD2)
trỏnh mt thi gian cỏc cõu hi thng c lp i lp li v PIC, cỏc bn mi hc v
PIC lu ý bi vit ny. Bi vit ny s c update liờn tc khi cú cỏc thụng tin mi.
0) Mt vi iu c bn v PIC
- PIC16F84 l dũng PIC ph bin nht c khuyn khớch cho nhng ngi mi hc. Tuy nhiờn,
Su tầm và biên soạn:[email protected] 2
1) Mch np PIC, Bootloaders v cỏc chng trỡnh np tng ng
Mch np
http://www.olimex.com/
Trang web ny cung cp rt nhiu loi mch np ca PIC, cú s nguyờn lý y , v tt c
cỏc hng dn liờn quan n vic ci t v s dng mch np. Trong ti liu hng dn PIC
Tutorial, chỳng tụi chn s dng mch np PG2C hng dn.
http://siscobf.webcindario.com/winpic800.htm
Hi khú coi mt chỳt vỡ nú l ting Tõy Ban Nha hay sao ú? Nhng khụng vn gỡ, cỏc bn
download v, t ng s hiu phi lm th no. Tụi vn ch trng, ngi cha bit gỡ dựng
PG2C.
In Circuit Debugger
http://www.stolz.de.be/
ICD2 Clone, np c hu ht cỏc loi PIC hin cú, h tr debug trong mch v quan trng nht
l np c cho dũng dsPIC30F
Bootloader
http://www.ac.ugal.ro/staff/ckiku/software/picbootloader.htm
õy l b tinybootloader, l b bootloader xn nht cho n bõy gi m tụi bit.
http://www.dontronics.com/rfarmer.html
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en
012031
Microchip bootloader, ch h tr dũng 16F, nhng l bootloader chớnh thc ca hóng, cung cp
min phớ
Chng trỡnh np
http://www.ic-prog.com/
(TPHCM)
vi giỏ 35.000 ng/b
5) Cỏc a ch tỡm source code ca PIC
http://www.piclist.com/
(a ch nhiu source code ca PIC nht trờn i)
6) Cỏc forum ting Anh v PIC
- Forum chuyờn v MPASM, cú s tham gia ca Nigel Goodwin:
http://www.electro-tech-online.com/
- Forum chuyờn v CCS C, do chớnh CCS C info xõy dng:
http://www.ccsinfo.com/forum/viewforum.php?f=1
- Forum hng dn ca Olimex v SparkFun:
http://www.sparkfun.com/
Trang web ny hng dn cỏc mch do Olimex cung cp, hay núi cỏch khỏc SparkFun l forum
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n:[email protected] 3
của Olimex.
7) http://www.microchip.com/
Trang web chính của Microchip PIC, cung cấp:
- datasheet
- diễn đàn chính của Microchip PIC (nhưng không sôi nổi lắm)
- môi trường soạn thảo và trình dịch MPLAB (luôn có phiên bản mới nhất)
- bán các linh kiện (PIC, dsPIC, rfPIC, mạch nạp, chương trình dịch, linh kiện analog...)
- bootloader chính thức của PIC dùng cho 16F877A và 16F876A
8) Một số trang web mua bán các công cụ hỗ trợ PIC, các sản phẩm từ PIC...
http://www.ccsinfo.com/
(bán chương trình CCS C cho PIC)
Tác giả: falleaf Diễn dàn PICVIETNAM.COM
Su tầm và biên soạn:[email protected] 4
Cơ bản về pic
Di õy l hỡnh mch chy ca PIC16F84A, PIC16F628A v PIC16F88. Tt c cỏc PIC ny u
cú v trớ chõn tng ng nhau, v thm chớ cú th núi PIC16F628A tng thớch PIC16F84A v
PIC16F88 tng thớch vi hai loi cũn li. Cú ngha l trong cỏc ng dng ca PIC16F84A, khi thay
i bng PIC16F88, hay PIC16F628A u c.
Tt nhiờn, 3 loi vi dũng PIC trờn õy cú th tng thớch vi nhiu dũng PIC c hn, nhng vỡ
th trng PIC Vit Nam ph bin vi 3 loi PIC ny, cho nờn chỳng tụi ch cp n 3 loi PIC
thực hiện trong một số tutorial, và gần như là quy ước bất thành văn khi thực hiện các mạch phát
triển cho vi điều khiển. Chân VDD (5V) được nối vào, nhằm sử dụng cho các ứng dụng cần có điện
áp ngõ vào, nhưng không cao lắm như ở trên đã nói (100mA). Tuyệt đối không thiết kế chân VSS
(GND) và chân VDD (5V) ở hai đầu của header, tránh tình trạng đôi khi chúng ta không để ý cắm
nhầm, có thể làm hỏng PIC, hoặc hỏng luôn cả thiết bị ngoại vi.
- Các nút bấm và công tắc, tôi thiết kế là các nút bấm 4 chân, vì hiện nay trên thị trường hầu như
chỉ bán loại nút bấm này, và loại nút bấm này chắc chắn hơn loại 2 chân trước đây. Các bạn cũng
lưu ý sau này khi thiết kế nút bấm cũng nên thiết kế nút bấm 4 chân.
- Con ổn áp 78L05 khác với con 7805. Nó là dạng TO92, tức là nó giống như con transistor thông
thường, nên rất nhỏ, chứ không phải dạng 3 chân và có tấm tản nhiệt phía sau như con 7805. Do
vậy, mạch thiết kế sẽ nhỏ đi khá nhiều.
- Ở đây, tôi không chạy ra mạch in, vì rằng tôi muốn dành công việc này cho các bạn sinh viên
mới học. Sau khi các bạn làm xong mạch in, nếu các bạn có thể chia sẻ với chúng tôi thì thật là
tuyệt vời. Chỉ có một điều lưu ý là, chúng ta thường không cắm trực tiếp vi điều khiển vào mạch
để hàn, mà chúng ta cắm qua một socket để có thể gỡ ra lập trình lại, và để đảm bảo không bị
cháy PIC khi hàn. Do vậy, khi cắm socket, các bạn sẽ có thể nhét hai tụ nối ở thạch anh vào bên
trong socket, khi cắm PIC lên, nó sẽ che hai cái tụ đó đi, và mạch của các bạn sẽ gọn gàng hơn.
Socket loại 18 chân không thể nhét thạch anh và điện trở nối từ chân MCLR đến VDD vào bên
trong được, nhưng sau này khi dùng PIC 28 hoặc 40 chân, các bạn nên nhét tất cả vào bên dưới
socket để cho mạch gọn gàng hơn.
- Một điểm cuối cùng, chúng tôi không thiết kế phần nạp bằng ICSP, bởi vì chúng tôi không muốn
làm cho các bạn mới học PIC cảm thấy bối rối. Chúng ta sẽ thực hiện mạch chạy PIC với các chân
ICSP và bootloader sau.
Lu ý trong hỡnh: Giỏ tr ca in tr c xỏc nh da vo dũng ti a ca vi iu khin, in ỏp
v dũng in ti a ca ốn LED. Nh vy, giỏ tr nh nht ca in tr c dựng c tớnh toỏn
nh trong hỡnh. R = 125 Ohm.
Tuy nhiờn, m bo hot ng ca ốn LED, chỳng ta nõng giỏ tr in tr lờn thnh 200 Ohm.
ốn LED khi sỏng quỏ, ch cn s tay vo nú, hoc cỏc va chm mnh, hoc trng hp b tnh
in, ốn LED cú th b h ngay. Hin tng ny d thy nht l cỏc LED cc sỏng dựng trong
cỏc bng hiu hoc bin bỏo giao thụng, cỏc ốn LED cc sỏng ch cn chm tay vo, s cú hin
tng tnh in v n ngay. Vi cỏc LED thng v dựng trong thớ nghim, khú xy ra hin tng
ny, tuy nhiờn cht lng sn xut ca cỏc ốn LED cng khụng m bo, do vy chỳng ta chn
gii phỏp an ton l trờn ht. Hn na, chỳng ta cng khụng cn ốn LED quỏ sỏng.
bt u bi tp 1, chỳng ta tỡm hiu s qua v cu trỳc mt chng trỡnh vit bng MPASM
nh sau:
Bt c mt chng trỡnh ASM no, cng c bt u bng vic gii thiu v chng trỡnh, tờn
chng trỡnh, ngi thc hin chng trỡnh, ngy thc hin chng trỡnh, ngy hon tt, ngi
kim tra li chng trỡnh, ngy kim tra chng trỡnh, phiờn bn ca chng trỡnh, mụ t phn
cng ca mch giao tip v mt s chỳ thớch. Vỡ vy, tụi a ra õy mt form m tụi cho rng hp
lý, t õy v sau, cỏc bn ch cn ct dỏn form ny, thay i ni dung tng mc lm phn m
u.
Chỳng ta quy nh mt s quy c sau:
;========== dựng phõn cỏch cỏc phn chớnh ca chng trỡnh
;---------------- dựng phõn cỏch cỏc chng trỡnh con ca chng trỡnh T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n:[email protected] 7
quen đưa đoạn chú thích này vào chương trình để các bạn trở nên chuyên nghiệp hơn khi làm việc
với vi điều khiển, cụ thể ở đây là PIC.
Tất nhiên, đây là bài học đầu tiên, do vậy các chú thích sẽ được ghi rất chi tiết, nhất là khi mô tả
phần cứng. Sau này, với các mạch phức tạp hơn, các bạn không thể ghi chú quá chi tiết như thế
này được, các bạn chỉ ghi chú những điểm chính thôi. Cũng tất nhiên, khi lập trình với CCS C hay
HT PIC, các bạn cũng nên ghi chú như vậy trong chương trình chính, nhưng chúng ta chưa bàn
đến CCS C và HT PIC ở đây.
Phần thứ hai các bạn cần học, đó là khởi tạo PIC. Phần này là phần bắt buộc theo sau phần ghi
chú, bởi vì chương trình dịch cần phải hiểu bạn đang làm việc với con PIC nào, làm việc với nó như
thế nào?
Code:
;================================================= ======
TITLE "Mach test LED_1"
PROCESSOR P16F628A
INCLUDE <P16F628A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC
;================================================= ======
Các bạn sẽ thấy rằng có một số từ khoá như sau:
TITLE: dùng để các bạn ghi chú thích tên chương trình. TITLE là ten chương trình chính. Cú pháp
ghi TITLE như trên. Nhớ phải có dấu nháy kép khi viết tên chương trình.
PROCESSOR: dùng để khai báo dòng vi điều khiển mà các bạn sử dụng. Các bạn lưu ý, trong
MPLAB quy định, không viết đầy đủ tên PIC16F628A mà chỉ viết P16F628A, vì trong chương trình
dịch đã quy định như vậy.
INCLUDE: dùng để đưa thêm vào các file mà bạn viết trong chương trình. Mặc định, trong MPLAB
đường dẫn đến thư mục chứa file P16F628A.inc đã có sẵn. Nếu bạn đặt file ở nơi khác không phải
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n:[email protected] 8
_HS_OSC, chúng ta dùng thạch anh 10MHz, tức là chạy chế độ dao động HS. Tham khảo tại:
datasheet PIC16F628A
Section 14. Special Features of the CPU
14.2. Oscillator Configuration
Page 95
Một điểm lưu ý cuối cùng là các bạn phải sử dụng phím TAB để phân cách các cột của một chương
trình viết bằng MPASM. Các dòng khởi tạo này được viết ở cột thứ 3. Các directive __CONFIG,
TITLE, PROCESSOR, INCLUDE được viết vào cột thứ 3. Còn chi tiết khởi tạo được viết vào cột thứ
tư.
Cột thứ nhất dùng để viết các [NHÃN], cột thứ hai để viết mã lệnh, cột thứ ba lại dùng để viết
chi tiết các tham số của lệnh, và cột thứ tư bỏ trống để tạo khoảng cách với cột thứ năm. Cột thứ
năm dùng để viết các chú thích.
Các chú thích bắt đầu bằng dấu chấm phẩy (
. Trên một dòng, tất cả các ký tự viết sau
dấu chấm phẩy đều vô nghĩa. Chính vì vậy, khi viết phần chú thích ban đầu, các bạn thấy rằng tất
cả nội dung đó đều bắt đầu bằng dấu chấm phẩy. Như vậy, một dòng lệnh được cụ thể như sau:
Code:
NHÃN LỆNH thamso1, thamso2 ; chú thích dòng lệnh
Bây giờ chúng ta dành chút thời gian cho lý thuyết, các bạn mở datasheet PIC16F628A trang 15,
Section 4. Memory Organization
Chúng ta sẽ thấy rằng tổ chức bộ nhớ chương trình của PIC được chia ra làm mấy phần như sau:
- Pointer
- Stack
- Interrupt vector
- Program memory
Đây sẽ là cấu trúc một chương trình mà chúng ta sẽ thực hiện. Directive ORG dùng để xác định
địa chỉ mà chúng ta sẽ làm việc. Bây giờ chúng ta xem tiếp đến trang 16 của datasheet. Chúng ta
thấy rằng, bộ nhớ dữ liệu của PIC16F628A được chia ra thành 4 BANK, hay chúng ta gọi tiếng Việt
là 4 BĂNG. Trong 4 băng này, chúng ta thấy rõ nó được chia làm 3 phần. Phần thứ nhất là phần
các thanh ghi có địa chỉ xác định (được ghi chú ở bên cạnh) và có tên tuổi rõ ràng. Những thanh
ghi này được gọi là những thanh ghi đặc biệt của PIC. Tên của chúng, thực ra không có, một
thanh ghi chỉ được xác định bằng địa chỉ của thanh ghi mà thôi.
Tuy nhiên, chúng ta đã làm động tác include file P16F628A.inc, file này đã định nghĩa sẵn
tên các thanh ghi này, và là quy ước của MPLAB, đồng thời cũng là quy ước chung cho tất cả
người dùng PIC. Chúng ta có thể thay đổi, sửa chữa những định nghĩa này, tuy nhiên việc làm đó
vừa không cần thiết, lại vừa gây ra rất nhiều khó khăn khi làm việc nhóm.
Vậy các bạn phải hiểu, những tên thanh ghi này xem như là không thay đổi trong PIC, và
chúng ta sử dụng nó như nó đã tồn tại vài chục năm nay.
Phần thứ hai, đó là phần General Purpose Register. Chúng ta gọi nó là các Thanh Ghi Dùng
Chung. Những thanh ghi này chưa được định nghĩa, và vì thế nó cũng không có tên. Những thanh
ghi này có giá trị như các biến trong chương trình mà chúng ta sẽ sử dụng.
Phần thứ ba, đó là các thanh ghi nằm ở địa chỉ 70h đến 7Fh, và vị trí tương ứng của nó ở
băng 1, 2, 3. Các thanh ghi tương ứng đó ở bank1, 2, 3 sẽ tương thích với các thanh ghi từ 70h
đến 7Fh ở băng 0. Tuy nhiên, chúng ta tạm thời chưa quan tâm đến phần này.
Bây giờ chúng ta học viết chương trình
Code:
;================================================= ==============================
ORG 0x0000
GOTO MAIN ORG 0x0005
OIOIOIOI. Cú ngha l RB0 s l Input, RB1 l Output, RB2 l Input, RB3 l Output.. c nh th
cho n RB7 l Output. Lu ý rng RB0 n RB7 c tớnh t phi sang trỏi.
Sau ú, chỳng ta li thc hin lnh Banksel portb, tc l chỳng ta li nhy v bng 0 (bng cha
thanh ghi portb). Tt c cỏc lnh lm thay i giỏ tr ca thanh ghi portb, s lm thay i tớn hiu
in bờn ngoi chõn ca PORT B. Sau khi chuyn sang bng 0, chỳng ta thc hin lnh BSF
PORTB,0. Cú ngha l chỳng ta set bit v trớ 0 ca portb, tc l chỳng ta cho RB0 = 1.
Cú ngha l ngoi chõn RB0 s mang giỏ tr in ỏp 5V. Khi ú, ốn LED ni vi RB0 s sỏng.
Cỏc bn s thy mach ngoi hot ng nh th ny:
Khi bt in lờn, PIC c reset. Nú lp tc bt sỏng ốn LED RB0, ri sau ú gi nguyờn nh
vy, khụng lm gỡ c.
Bõy gi cỏc bn lu chng trỡnh va vit thnh LED_1.asm vo mt th mc no ú.
Nhn Alt - F10, chng trỡnh s dch LED_1.asm thnh LED_1.hex
Cỏc bn dựng mch np PG2C v chng trỡnh np IC-PROG np vo PIC (tham kho Hng
dn mch np Falleaf PG2C - PIC Tutorial).
Cụng vic ca cỏc bn nh sau:
0) Chy th chng trỡnh ban u
1) Thay i lnh BSF PORTB, 0 bng lnh BSF PORTB, 1. Np li chng trỡnh mi vo PIC. Bn
s thy bõy gi ốn LED khụng sỏng v trớ RB0 na m sỏng v trớ RB1.
2) Thay lnh BSF PORTB,0 bng on lnh
MOVLW b'11110000'
MOVWF PORTB
Bn s thy cỏc cỏc chõn t RB0 n RB3 s tt ốn, v cỏc chõn t RB4 n RB7 ốn s sỏng.
3) Bn thay lnh CLRF TRISB bng on lnh
CLRF TRISB
BSF TRISB, 0
v gi nguyờn lnh
BSF PORTB, 0
Cỏc bn s thy rng ốn LED trong trng hp ny s khụng sỏng na.
Bi vỡ cỏc bn ó lm cho TRISB = 00000001. Nh vy, RB0 tr thnh chõn Input. Khi RB0 tr
thnh chõn Input, thỡ lnh BSF PORTB, 0 s khụng cũn tỏc dng na. RB0 lỳc ny khụng th thay
n thanh ghi W ny, ly thớ d nh ADDLW (cng mt s vo giỏ tr ó cú trong thanh ghi W),
SUBWF (tr giỏ tr ca thanh ghi W cho mt thanh ghi khỏc), XORLW (ly XOR ca mt s v
thanh ghi W)... V cỏc bn ý rng, tng s lnh cú th tng tỏc vi thanh ghi W l 23/35
lnh, gn nh chim ton b tp lnh ca PIC. Vy chỳng ta ghi nhn iu th nht, khi PIC lm
vic, gn nh luụn luụn tng tỏc vi thanh ghi W.
iu th hai, cỏc bn nhỡn trong bn b nh d liu ca PIC, cỏc bn s thy l thanh ghi W l
thanh ghi khụng cú mt bt k bng no ca b nh d liu, trong khi ú thanh ghi STATUS cú
mt c 4 bng. Cỏc bn li thy mt iu rng, thanh ghi W v thanh ghi STATUS cú th c
truy nht t tt c cỏc bng, v t bt k õu trong chng trỡnh, v vỡ vy chỳng tr thnh
nhng thanh ghi ton cc nht. im khỏc bit gia chỳng ra sao? õu l s khỏc bit gia thanh
ghi W v cỏc thanh ghi khỏc?
im th ba, trong tp lnh ca PIC, khụng cú lnh no cho phộp tng tỏc trc tip gia mt
thanh ghi trong b nh d liu dựng chung vi mt giỏ tr thờm vo, m u phi thụng qua thanh