Những địa chỉ này d9ou7c5 chia thành 3 khu vực bộ nhớ - Bank1: dùng để điều khiển các hoạt động của PIC - Bank0: dùng để thao tác trên dữ liệu 2.1.1 TRISIO Thanh ghi TRISIO đặt tại địa c
Trang 1Đề tài:
TÌM HIỂU VỀ CẤU TRÚC – TẬP LỆNH
ASM VÀ C CHO PIC12XXX
Danh sách thành viên trong nhóm 7:
1.Huỳnh Trung Hiếu
2.Trịnh Văn Xuân
3.Phạm Trọng Nhân
4.Trần Tuấn Lâm
Trang 21. Cấu trúc
Datasheep
Trang 31.1 Chân 7
GPO giao tiếp I/O vào ra, ở đây nó có chức năng nhận hoặc xuất dữ liệu.Ngoài
ra nó còn dùng để lập trình ngắt nữa, ngắt trong hay ngoài tùy mục đích sử dụng.AN0: chân này nó nhận tín hiệu tương tự hoặc số
Cin: so sánh tín hiệu hoặc dòng đi vào
ICSPDAT: là thứ tự các chương trình I/O
1.2 Chân 6
GP1 giao tiếp I/O vào ra, ở đây nó có chức năng nhận hoặc xuất dữ liệu.Ngoài
ra nó còn dùng để lập trình ngắt nữa, ngắt trong hay ngoài tùy mục đích sử dụng.AN1: chân này nó nhận tín hiệu tương tự hoặc số
Cin: so sánh tín hiệu hoặc dòng đi vào Vref hiệu điện thế ngoài
ICSPCLK: thứ tự các xung
1.3 Chân 5
GP2 giao tiếp I/O vào ra, ở đây nó có chức năng nhận hoặc xuất dữ liệu.Ngoài
ra nó còn dùng để lập trình ngắt nữa, ngắt trong hay ngoài tùy mục đích sử dụng.AN2 : chân này nó nhận tín hiệu tương tự hoặc số
T0cki: xung vào
Int: ngắt
COUT: so sánh tín hiệu ra
1.4 Chân 4
GP3 giao tiếp I/O vào ra, ở đây nó có chức năng nhận hoặc xuất dữ liệu.Ngoài
ra nó còn dùng để lập trình ngắt nữa, ngắt trong hay ngoài tùy mục đích sử dụng.MCLR: reset
Trang 4Vpp: lập trình hiệu điện thế
1.5 Chân 3
GP4 giao tiếp I/O vào ra, ở đây nó có chức năng nhận hoặc xuất dữ liệu.Ngoài
ra nó còn dùng để lập trình ngắt nữa, ngắt trong hay ngoài tùy mục đích sử dụng.AN3 : chân này nó nhận tín hiệu tương tự hoặc số
Osc2 : kết nối với thạch anh
1.6 Chân 2 : tương tự như chân 3
1.7 Chân 1 và chân 8
Là nguồn nuôi IC
Trang 5Đối với PIC 12 (L) F1840 :
Có 3 loại bộ nhớ trong PIC 12(L) F1840 : bộ nhớ dữ liệu ,bộ nhớ chương trình và
Việc nâng cao lõi tầm trung có 1 chương trình
15-bit có khả năng truy cập vào 32Kx14 chương
trình trong không gian bộ nhớ
Kích thước bộ nhớ của PIC 12 (L) F1840 : bộ
nhớ chương trình 4096 từ , địa chỉ bộ nhớ chương
trình cuối cùng 0FFFh
Việc truy cập vào một vị trí trên ranh giới này
sẽ tạo ra vỏ bọc xung quanh vùng nhớ đang thực
hiện Vecto thiết lập lại ( Reset) là 0000h và vecto
ngắt tại 0004h
+ Đọc chương trình bộ nhớ như đọc dữ liệu:
Có 2 phương pháp tiếp cận hằng sốtrong bộ nhớ chương trình : **Phương pháp thứ nhất
là dùng lệnh RETLW :
constantsBRW ;Add Index in W to
;program counter to
Trang 6;select dataRETLW DATA0 ;Index0 dataRETLW DATA1 ;Index1 dataRETLW DATA2
RETLW DATA3my_function
;… LOTS OF CODE…
MOVLW DATA_INDEXcall constants
;… THE CONSTANT IS IN WLệnh RETLW có thể được sử dụng để cung cấp các truy cập vào bảng hằng
với thanh ghi INDFx Lệnh MOVIW sẽ đặt giảm 8 bit của địa chỉ của
từ trong thanh W Việc ghi vào bộ nhớ chương trình không thể được thực hiện
thông qua các tahnh ghi INDF Các lệnh truy cập vào bộ nhớ chương trình thông qua các FSR yêu cầu 1 lệnh thêm để hoàn thành 1 chu kỳ
2 Tổ chức bộ nhớ dữ liệu :
Bộ nhớ dữ liệu được phân chia trong 32 thư biện bộ nhớ với 128 bytes trong
1 thư viện Mỗi thư viện bao gồm :
-12 lệnh cốt yếu
Trang 7-20 lệnh hàm đặc biệt
- Bộ nhớ lên đến 80 bytes trong RAM mục đích chung
- 16 bytes Ram chung
Các thư viện hoạt động được lựa chọn bằng cách viết số thư viện lên thanh ghi Chọn thư viện ( BSR)
Nếu chưa thực hiện thì bộ nhớ sẽ đọc như '0' Tất cả các bộ nhớ dữ liệu có thể truy cập 1 cách trực tiếp ( thông qua hướng dẫn sử dụng đăng ký tập tin) hoặc gián tiếp
thông quà tập tin Chọn nhập (FSR)
++ Tình trạng thanh ghi : bao gồm :
-Tình trạng số học của ALU
-Tình trạng thiết lập lại Tình trạng thanh ghi có thể là điểm đến cho bất kỳ thanh ghi , giống như bất kỳ thanh ghi khác Nếu thanh ghi tình trạng là điểm đến cho 1 lệnh
có ảnh hưởng đến các bit Z,DC hoặc C, sau đó việc ghi tới 3 bit đó sẽ
bị vô hiệu hóa Các bit này được thiết lập hoặc xóa theo thiết bị logic Hơn nữa , các
bit TO và PD không cho phép ghi Vì vậy , kết quả của một lệnh với thanh ghi tình trạng như là điểm đến có thể khác nhau so với dự định
++ Thanh ghi hàm đặc biệt :
Các thanh ghi hàm đặc biệt là các thanh ghi được sử dụng bởi các ứngdụng kiểm soát sác hoạt động mong muốn của các chưa ngăng ngoại vi vào điện thoại
++ RAM mục đích chung :
Có đến 80 byte của GPR trong mỗi bộ nhớ của thư viện
Trang 8- Truy cập tuyến tính đến GPR: RAM mục đích chung có thể được truy cập trong 1 phương pháp không thông báo thư viện thông qua FSRs Điều nay2co1 thể
đơn giản hóa truy cập vào cấu trúc bộ nhớ lớn ++ RAM chung :
Có 16 byte bộ nhớ RAM thông thường truy cập từ tất cả các thư viện3 PCL và PCLATH :
Máy tính ( PC) có độ rộng là 15 bit Byte thấp xuất phát từ thanh ghi PCL,
mà nó có thể đọc được và ghi được váo thanh ghi Bit cao (PC<14:8>) thì không thể trực tiếp
đọc hoặc ghi và xuất phát từ PCLATH
++ Sửa đổi PCL :
Các lệnh thực hiện bất kỳ bởi thanh ghi PCL là điểm đến đồng thời tạo ra chương trình đếm trên máy tính <14:8> bit (PCH) được thay thế bắng các nội dung của
thanh ghi PCLATH Điều này cho phép toàn bộ nội dung các chương trình truy cập phải được thay đổi bằng cách viết lệnh mong muốn trên 7 bit của thanh ghi PCLATH ,
tất cả 15 bit chương trình truy cập sẽ thay đổi các giá trị chứa trong các thanh PCLATH và các lệnh khác được viết cho thanh ghi PCL
++ Thuật toán GOTO :
Một thuật toán GOTO được thực hiện bằng cách thêm 1 bù đắp cho chương trình truy cập ( ADDWF PCL) Khi thực hiện 1 bảng đọc sử dụng
phương pháp GOTO,
cẩn thận nên kiểm tra nếu vị trí bảng qua ranh giói bộ nhớ PLC ( mỗi khối 256 byte)
Trang 9Hàm phân nhánh thêm 1 khoảng trống trong máy tính Điều này cho phép ma định vị và mã số mà đi qua ranh giới trang Có hai hình thức phân
Nếu sử dụng BRA, toàn bộ máy tính sẽ được nạp với máy tính + 1 +, giá trị ký của toán hạng của lệnh BRA
4 Stack :
Tất cả các thiết bị này có 16 cấp x 15 bit độ rộng phần cứng Stack Không gian của Stack không phải một phần của 1 trong 2 chương trình hoặc không gian
dữ liệu Máy tính được đẩy váo Stack
khi lệnh CALL hoặc CALLW được thực hiện hoặc 1 gián đoạn tạo ra 1 nhánh Stack d9ou7c5 giải phóng trong trường hợp hàm RETURN , RETLW hoặcRETFIE được thực hiện
PCLATH không bị ảnh hưởng bởi các hoạt động PUSH hoặc POP Stack hoạt động như 1 bộ đệm tròn nếu bit STVREN được lập trình '0' , điều này có nghĩa là sau khi Stack đã được lấy 16 lần , lần
lấy thứ 17 sẽ ghi đè giá trị lên giá trị mà đã được lưu trữ từ lần lấy đầu tiên 5 Địa chỉ gián tiếp :
Thanh ghi INDFn không phải là thanh ghi vật lý , bấy kỳ lệnh nào có thể truy cập vào thanh ghi INDFn thì thực chất là truy cập vào thanh ghi địa chỉ theo quy định của Thanh ghi chọn tập tin ( FSR) Nếu
địa chỉ FSRn quy định cụ thể 1 trong 2 thanh ghi INDFn , quá trình đọc sẽ trả về '0' và ko diễn ra quá trình ghi ( mặc dù bit trạng thái có thể bị ảnh hưởng ) Giá trị của thanh ghi FSRn được tạo bởi cặp thanh ghi
Trang 10FSRnH và FSRnL Thanh ghi FSR tạo thành 1 địa chỉ 16 bit cho phép
không gian địa chỉ là 65536 địa chỉ Những địa chỉ này d9ou7c5 chia thành 3 khu vực bộ nhớ
- Bank1: dùng để điều khiển các hoạt
động của PIC
- Bank0: dùng để thao tác trên dữ liệu
2.1.1 TRISIO
Thanh ghi TRISIO đặt tại địa chỉ 85H để
lập trình cho các chân trên thanh ghi này thông
thường người ta gởi mức 0 hay 1 đến các bit
tương ứng trên thanh ghi, có thể làm điều này
trong cả2 dạng hoặc là bằng số binary (bin)
hay hex Dùng kiểu binary thì rõ ràng hơn là
kiểu hex nhưng mà trông lượm thượm hơn !
2.1.2 GPIO
Trang 11Để làm cho 1 trong những chân Output lên mức cao ta gởi 1 đến bit tương ứngtrên thanh ghi GPIO, giống như cách làm trên thanh ghi TRISIO, có thể kiểm tralại trên từng chân
- Với : <number> là cái mà ta sẽ AND với nội dung trong thanh ghi W, kết
quả AND sẽ lưu trong thanh ghi W.
Lệnh ANDWF cho phép ta AND thanh ghi W với một thanh ghi khác, ví dụ như với GPOI, cú pháp là:
Trang 12ADD là một hàm cộng 2 số với nhau, nếu kết quả lớn hơn 8bit thì cờ CARRY
sẽ được set lên 1 ngược lại nó =0 Cờ CARRY có địa chỉ byte 03h và nằm tại bit0.Một lần nữa con Pic cho ta 2 món chế biến từ hàm ADD, đó là ADDLW vàADDWF
Lệnh ADDLW cộng nội dung của thanh ghi W với một số xác định, cú pháp là:
Hàm SUBnày trừ 1bit với 1bit khác
Lệnh SUBLW và SUBWF có cú pháp tương tự như hàm ADD nhưng thay vì cộng thì nó trừ
Trang 13- Với <register> là thanh ghi, hoặc địa chỉ mà ta chỉ định, còn d thì nói cho
con Pic biết nơi đặt kết quả Nếu d=0 thì kết quả lưu trong thanh ghi W, nếu d=1 kết quả sẽ được lưu trong thanh ghi chỉ định nằm trước nó (tức là <register>)
Bằng cách này ta có thể tiết kiệm ½ bộ nhớ của Pic Nếu ta muốn kết quả lưu trong W thì sử dụng ví dụ trên sau đó thêm một lệnh khác để MOV nội dung trong địa chỉ 0Ch trở vào trong thanh ghi W sau đó đặt vào thanh ghi 0Ch bất cứ cái gì
Có một lệnh increment khác, đó là INCFSZ, lệnh này sẽ tăng thanh ghi mà ta chỉ định lên 1, nhưng nếu thanh ghi này =0 sau khi thực thi lệnh ( xảy ra khi cộng 1vào FFh) thì con Pic sẽ bỏ qua lệnh kế tiếp, đoạn code bên dưới sẽ mô tả lệnh này:Loop
Incfsz 0C
Goto Loop
:
:
Trang 14Rest of program.
Trong đoạn code trên, địa chỉ 0Ch sẽ tăng lên 1 sau đó chương trình nói cho conPic quay về nhãn Loop và gia tăng 0Ch lên lần nữa, nó làm tiếp tục như vậy cho tới khi 0Ch=127 (FFh) Lần này khi tăng lên 1, nội dung của 0Ch sẽ =0 Lệnh INCFSZ sẽ nói cho con Pic bíêt hãy bỏ qua lệnh kế tiếp, trong trường hợp ví dụ trên nó bỏ qua lệnh GOTO Loop để thực thi tiếp đoạn code còn lại
2.2.1.6 Lệnh COMF
Lệnh cuối cùng trong nhóm này là lệnh COMF, nó đảo ngược (Compliment) tất
cả các bit trong thanh ghi được chỉ định, cú pháp là:
COMF <register>,d.
- Với <register> là thanh ghi mà ta muốn đảo và d nói cho con Pic bíêt nơi
lưu kết quả Nếu d=0 kết quả lưu trong thanh ghi W, nếu d=1 thì kết quả lưu trong thanh ghi chỉ định nằm trước d ( tức là <register>)
Xem mô tả sau đây:
0C = 11001100
COMF 0C,1
0C = 00110011
Cái này rất tiện lợi khi mà ta muốn nhanh chóng bật các chân của Port từ
Output trở thành Input hoặc ngược lại
2.2.2 Toán hạng trên bit
Các toán hạng dùng cho Bit cho phép chúng ta thao tác trên các bit đơn lẽ trong byte, nó cho phép MOV, SET và CLEAR bit trong thanh ghi hoặc những địa chỉ được chỉ định, phần cuối của tutorial này ta sẽ trình bày một chương trình làm cho con Led sáng chạy theo nhiều cách khác nhau
Trang 15Chúng ta đã sử dụng lệnh này trong phần trước để thay đổi từ Bank1 sang
Bank0 bằng cách xoá bit trong thanh ghi STATUS, chúng ta cũng có thể Clear 1 bit về 0 tại bất kỳ bit nào trong bất kỳ thanh ghi nào
Trang 162.2.2.3 Lệnh BTFSC
Chúng ta đã có thể Set bit và Clear bit trong thanh ghi, nhưng mà nếu bạn chỉ muốn thử xem bit nào đó trong thanh ghi là = 1 hay = 0 thì sao, rất đơn giản, hảy dùng lệnh BTFSC, nó được gọi là “Bit Test Register F and Skip If It Is Clear”, tạmdịch là “lệnh thử kiểm tra bit trong thanh ghi và bỏ qua lệnh kế nếu bit = 0”, quá rõràng rồi, không cần phải giải thích gì thêm nữa phải không ?!, ta sẽ dùng lệnh này
để kiểm tra một cái cờ (flag) nào đó ví dụ như cờ Carry, nó tránh cho ta khỏi phải đọc thanh ghi STATUS để tìm xem trạng thái của từng bit như thế nào
Ví dụ:
Nếu bạn muốn thử bit cờ Carry =1chưa sau khi bạn cộng 2 byte với nhau, bạn hãy thử làm cái này: BTFSC 03h,0
Nếu cờ Carry=1 thì chương trình thực thi tiếp lệnh đứng kế tiếp, nếu Carry=0
nó sẽ bỏ qua lệnh kế tiếp, xem đoạn code sau:
Trong đoạn code trên, con Pic sẽ đi ra khỏi Loop nếu bit0 trong thanh ghi
STATUS ( hay cờ Carry) bị xoá về 0, nói cách khác nếu cờ Carry=0 lệnh GOTO sẽđược thực hiện
Trang 17Bây giờ hãy xem cái gì sẽ xảy ra nếu bạn có 10000000 và tiếp tục thực thi lệnh RLF.bit 1 của bạn sẽ đi sang cờ Carry, nếu bạn lại tiếp tục RLF thì bit 1 sẽ quay trở
về vị trí 0 trong byte Mọi thứ sẽ diễn ra đúng như vậy đối với lệnh RRF nhưng màbit sẽ di chuyển theo chiều bên phải
Trang 182.3.2 Lệnh MOVLW
Có nghĩa là ‘Move Literal Value Into W’ tạm dịch là di chuyển giá trị của Literal vào thanh ghi W, để rõ ràng hơn ta có thể nói là “ đặt giá trị trực tiếp sau đây (06H) vào trong thanh ghi W
2.3.3 Lệnh DECFSZ
Lệnh DECFSZ sẽ giảm thanh ghi ( trong trường hợp này là COUNT) xuống
một đơn vị được điền sau dấu phẩy (,), trong ví dụ này đơn vị là 1 Nếu nó giảm tớizero chương trình sẽ bỏ qua lệnh kế tiếp để nhảy đến thực thi lệnh thứ 2
Trang 19Điều mà chúng ta phải làm đầu tiên là gán hằng số COUNT = 255, kế đến đặt 1 cái nhãn ngay bên cạnh lệnh defsz.
Lệnh decfsz COUNT,1 sẽ giảm giá trị của COUNT xuống 1 và lưu giá trị đã giảm trở vào trong COUNT, nó cũng sẽ kiểm tra xem COUNT = 0 chưa, nếu chưa
nó sẽ cho chương trình thực thi lệnh kế tiếp, trong ví dụ này nó sẽ thực thi lệnh GOTO để quay về lại điểm bắt đầu ( là LABEL), nếu COUNT = 0 thì nó sẽ cho chương trình bỏ qua lệnh kế tiếp và nhảy đến lệnh thứ 2, trong ví dụ này chương trình sẽ nhảy đến nơi có chữ ‘Carry on here’
Như bạn đã thấy, chúng ta đã làm cho chương trình lưu lại một thời gian trước khi nó tiếp tục làm việc gì đó tiếp theo, cái này gọi là vòng trễ (Delay loop), nếu chúng ta muốn thời gian trễ lớn hơn chúng ta phải làm một vòng trễ kiểu khác, nhưng mà cũng dể dàng để hiểu ra rằng có nhiều Loop hơn thì thời gian sẽ trễ lâu hơn, chúng ta cần ít nhất là 2 Loop như trên nếu muốn nhìn thấy đèn Led chớp
2.3.4 Lệnh BCF
Lệnh BCF thì đối nghịch với BSF, nó có nghĩa là “ Bit Clear F” tạm dịch là xoábit nào đó trong vùng memory hay trong thanh ghi nào đó, trong trường hợp này làthanh ghi STATUS (vì địa chỉ của nó là 03H) và lệnh này xoá bit5 của STATUS
2.4 Thời gian thực thi lệnh (Intruction Timing)
Như bạn đã biết, xung nhịp bên trong của Pic được gọi là chu kỳ lệnh, nếu dùngthạch anh 4MHz thì 1 chu kỳ lệnh là 1/(4MHz/4) = 1uS, một số lệnh chỉ thực thi mất 1 chu kỳ trong khi một số lệnh khác mất 2 chu kỳ để thực thi hoàn toàn, bạn hãy xem trong tập lệnh của Pic để biết thêm chi tiết Cách để nhớ thì hoàn toàn đơngiản, giả sử tất cả các lệnh đều mất 1 chu kỳ, nhưng mà nếu lệnh đó làm cho
chương trình nhảy tới nơi nào đó thì sẽ mất 2 chu kỳ
Trang 20Ví dụ:
- Lệnh MOVWF mất 1 chu kỳ bởi vì lệnh này chỉ mang data từ nơi này sang
nơi khác
- Lệnh GOTO mất 2 chu kỳ bởi vì nó làm cho Program Counter nhảy tới nơi
nào đó trong chương trình
- Lệnh RETURN cũng mất 2 chu kỳ bởi vì nó làm cho PC quay trở về đầu
chương trình
Tuy nhiên có 4 lệnh mà nó có thể mất 1 hoặc 2chu kỳ, đó là DECFSZ,
INCFSZ, BTFSC và BTFSS, những lệnh này có một điểm chung đó là nó sẽ bỏ
qua lệnh kế tiếp nếu nó thoả một điều kiện nào đó Chẳng hạn như lệnh DECFSZ
sẽ giảm giá trị trong thanh ghi F xuống 1, nếu kết quả khác 0 thì lệnh kế tiếp được thực thi, vì vậy nó mất 1 chu kỳ, nhưng nếu kết quả là 0 thì lệnh kế tiếp bị bỏ qua
để thực thi lệnh đứng sau kế, trong trường hợp này lệnh thực thi mất 2 chu kỳ lý do
là nó thay đổi giá trị của PC, nó cần 1 chu kỳ để thực hiện hàm và 1 chu kỳ nữa để thay đổi PC đến vị trí thoả điều kiện của hàm Để rõ hơn, ta xem ví dụ bên dưới
Trang 21Chúng ta quay trở lại lệnh thứ 3(decfsz COUNT), lần này sau khi giảm
COUNT xuống 1 thì COUNT =0, lệnh kế tiếp sẽ bị bỏ qua và nó nhảy đến End chấm dứt chương trình, hành động bỏ qua lệnh kế tiếp được thực hiện trong 1 chu
kỳ khác, vì vậy khi ta đặt 02 vào COUNT thì chương trình này mất 7 chu kỳ, nếu thạch anh là 4MHZ thì:
Dson 32
1/(4MHz/4) = 1uS / chu kỳ 7 chu kỳ mất 7 x 1uS = 7uS
Như vậy khi viết chương trình liên quan đến thời gian thực thi, bạn phải tính toán cẩn thận khi dùng các lệnh DECFSZ, INCFSZ, BTFSC và BTFSS
Bên trong con Pic có một thứ gọi là ‘Fuses’ tạm dịch là cầu chì, nó không giốngnhư cầu chì fuses bảo vệ của ổ điện nhà mà nó giống như một cái Switch điện tử được đóng hay mở bởi lập trình viên Làm sao mà những cái Fuses này được đóng hay mở để cho WDT hoạt động, là viết 2 dòng lệnh tại phần đầu chương trình để nói cho Pic biết enable hay disable cái fuses nào đó
2.4 Delay Loops
Mỗi lệnh thực thi mất 1 chu kỳ xung clock, nếu ta sử dụng thạch anh 4MHz thì mỗi lệnh mất 4/4MHz hay 1us, trong đoạn code trên, ta sử dụng 5 lệnh như vậy mất 5us để thực thi hoàn toàn, quá nhanh để mắt người có thể nhìn thấy đèn led chớp tắt trong khỏang thời gian ngắn ngủi như vậy, cái mà ta cần là làm cho
khoảng thời gian giữa sáng và tắt của led kéo dài ra, nói cách khác là làm trễ
(Delay)
Cơ bản của 1 chương trình Delay là cho đếm ngược lại giá trị đã đặt trước đó, vàkhi nó đến zero (0) thì ta cho dừng bộ đếm, giá trị zero báo cho biết dừng chương trình delay và sẽ tiếp tục thực thi lại nếu ta muốn