• No results found

USE DELAY(CLOCK=SPEED)

In document 1056_Thiet_ke_canh_tay_robot (Page 41-47)

Æ Khai báo tần số hoạt động để phục vụ cho việc tính toán delay trong chương trình.

speed

Là giá trị OSC (tần số dao động) mà vi điều khiển dùng, đơn vị tính bằng Hz.

Ví dụ:

#use delay(clock=4000000) // Tần số dao động cho PIC là 4 MHz Ta có: 1 chu kỳ lệnh = 4 chu kỳ xung clock

= 4*(1/4000000)

= 1 us (micô giây)

Nếu dùng #use delay(clock=20000000) (20 MHz) thì mỗi chu kỳ lệnh là 0.2us. Chỉ khi có chỉ thị này thì chương trình mới dùng được các hàm delay như: daley_cycles(), delay_us(),delay_ms().

#FUSES option

Æ Khai báo các yếu tố đặc trưng bảo vệ của thiết bị PIC sử dụng như : loại bộ dao động, có bảo vệ mã hay không, có WDT không,…

option

HS : Dao động thạch anh tần số cao. NOPROTECT : Không bảo vệ mã

NOWDT : Không có giám sát thời gian. …

Chi tiết thêm có thể tra cứu trong HELP > Preprocessor cmds #BYTE id=x

Æ Dùng để gán tên biến id cho địa chỉ thanh ghi x, sau đó có thể gán hay kiểm tra địa chỉ thanh ghi x chỉ cần dùng biến id, không tốn thêm bộ nhớ.

id

Tên gợi nhớ chức năng thanh ghi ở địa chỉ đó.

Giá trị id theo giá trị thanh ghi và thay đổi do theo hoạt động của chương trình. Không nên dùng id cho thanh ghi đa mục đích, vì CCSC có thể dùng các thanh ghi này bất kỳ lúc nào cho chương trình, nếu muốn dùng riêng phải khai báo #locate.

Ví dụ:

#byte port_b=0x06

Tên biến tự đặt, có thể đặt là cong_b, port_b hay bất kỳ tên gợi nhớ nào. Khi đặt các tên biến trùng nhau cho việc định nghĩa thì khi biên dịch chương trình, CCSC sẽ cảnh báo.

0x06 là địa chỉ thanh ghi Port B của PIC16F877A.

#BIT id=x.y

Æ Tạo 1 biến đặt ở vị trí y của byte x id : Tên biến

x : Biến số có độ dài *8 bit (8, 16, 32 bit tùy chip) hay hằng số địa chỉ của thanh ghi.

y : Vị trí bit y trong thanh ghi x.

Khai báo này tiện lợi cho việc kiểm tra hay gán giá trị cho bit của thanh ghi. Không tốn bộ nhớ, do id chỉ là địa chỉ danh định đại diện cho bit chỉ định ở biến x, thay đổi giá trị id (0 hay 1) sẽ thay đổi giá trị bit y, tương ứng thay đổi giá trị x.

Ví dụ 1:

#bit co_timer0=0xb.2

Bit cờ ngắt timer 0 ở địa chỉ bit 2 của 0xb (16F877A). Nếu gán co_timer0=0; thì sẽ xóa cờ ngắt timer 0. Ví dụ 2:

int8 a=20; // a=00010100b #bit b=a.4 // địa chỉ bit 4 của a

Nếu gán b=0; thì bit 4 của a=0 Æ a= 00000100b= 4

Lưu ý không được dùng hàm if(0xa.4) … trực tiếp, mà phải gán qua biến như trên mới dùng được, như là if(b) … .

Ví dụ 3:

#byte cong_b=0x06; // địa chỉ Port B #bit b0=cong_b.1 // b0 – bit 0 c ủa Port B #bit b1=cong_b.1 // b1 – bit 1 c ủa Port B

#LOCATE id=x

Æ Làm việc như #byte nhưng có thêm chức năng bảo vệ không cho CCSC sử dụng địa chỉ đó vào mục đích khác.

Ví dụ 1:

#locate t=0x020 // địa chỉ thanh ghi đa mục đích Hay

int8 t;

#locate t=0x020

Sử dụng #locate để gán biến cho 1 dãy địa chỉ kề nhau (cặp thanh ghi) sẽ tiện lợi hơn thay vì dùng 2 byte với #byte.

Ví dụ 2:

Thanh ghi CCP1 có giá trị là một cặp thanh ghi 0x15 (byte thấp) v à 0x16 (byte cao). Để gán giá trị cho CCP1 :

int16 ccp1;

Khi gán giá trị cho ccp1, chương trình sẽ tự động gán vào cả 2 thanh ghi. Ví dụ:

ccp1=1133; // ccp1 = 0000 0100 0110 1101 b Thanh ghi 0x15 sẽ có giá trị byte thấp là 0110 1101

Thanh ghi 0x16 sẽ có giá trị byte cao là 0000 0100 #DEFINE id text

Æ Dùng định nghĩa giá trị cho biến id là một chuỗi hay số text : Có thể là chuỗi ký tự hay số

Ví dụ: int a;

#define b 8

a=a+b; // Tương tự như lệnh a=a+8; #DEFINE id(x,y...) text

Æ Dùng định nghĩa giá trị cho biến id là một chuỗi hay số, kết hợp gán biến nội.

Ví dụ:

int a=1; // a = 0000 0001 b

#define b(x) (x<<2) // b(x) = x<<2 – Dịch sang trái 2 bit a= b(a); // Tương tự như lệnh a=a<<2; lúc đó a=4 = 0000 0100 b

#ASM và #ENDASM

Æ Cho phép đặt một đoạn mã ASM ở giữa 2 chỉ thị này, riêng chỉ thị này chỉ đặt trong 1 cấu trúc của hàm hay chương trình con, không đặt chung ở khu vực khai báo chỉ thị tiền xử lý. CCSC định nghĩa sẵn 1 biến 8 bit _RETURN_ để gán giá trị trả về cho hàm từ đoạn mã ASSEMBLY

Ví dụ: int ctr_a(int n) { int c; #asm _return_ #endasm } Các chỉ thị tiền xử lý là cơ bản, thường dùng. Các chỉ thị tiền xử lý khác có thể tra cứu trong HELP > Preprocessor cmds của chương trình.

Tương tự cũng có thể tra cứu thêm nhiều thông tin bổ ích khác trong HELP này. Cụ thể xem hình dưới đây và chọn các thông tin hướng dẫn phù hợp.

• Khai báo các biến, mảng

Cách khai báo các biến và mảng tương tự lập trình ngôn ngữ C đã học. Cấu trúc chung là:

<kiểu dữ liệu> <biến/mảng> Ví dụ:

Khai báo biến số:

signed int8 a; // số a là 8 bit dấu (bit 7 là bit dấu) có giá trị từ – 128 đến +127

int8 b; // số b là 8 bit không dấu, có giá trị từ 0 đến +255 int16 a,b,c;

...

Khai báo hằng số: (phải có tham số CONST nằm giữa kiểu dữ liệu và tên hằng)

int8 const a=23; // a là một hằng số có giá trị là 23 Khai báo mảng :

int16 a[125];

Phải có tham số CONST giữa kiểu dữ liệu và tên mảng nếu là mảng hằng số.

int8 const a[5]={1,2,3,4,5}; // a có 5 phần tử, chỉ số mảng bắt đầu từ a[0]=1

Một mảng hằng số có kích thước tối đa tùy thuộc loại chip vi điều khiển. Đối với PIC 14 bit (16F877A) thì chỉ được khai báo 1 mảng hằng số có kích thước tối đa là 256 byte.

Các khai báo mảng vượt quá có số phần tử vượt quá giới hạn đều không hợp lệ, khi đó chương trình sẽ thông báo lỗi.

Ví dụ:

int8 const a[256]={...}; // hợp lệ : 256 (phần tử) x 1 (byte) = 256 (byte)

int16 const b[128]={...}; // hợp lệ : 128 (phần tử) x 2 (byte) = 256 (byte)

int16 const c[256]={...}; // không hợp lệ : 256 x 2 = 512 (byte) > 256 byte

Nếu đánh không đủ số phần tử vào trong ngoặc kép như đã khai báo, các phần tử còn lại sẽ mặc định có giá trị là 0.

Truy xuất giá trị vượt quá chỉ số mảng khai báo sẽ làm chương trình chạy vô tận.

Khai báo 1 biến mảng với kích thước tùy thuộc khai báo con trỏ (pointer) trong #device và loại vi điều khiển.

Đối với PIC 14 bit (16F877A), nếu khai báo pointer 8 bit (#device *=8) thì không gian bộ nhớ chỉ có 256 byte cho tất cả các biến chương trình bất chấp PIC đang dùng có hơn 256 byte RAM; và biến mảng có kích thước tối đa tùy thuộc độ phân mảnh bộ nhớ, với PIC16F877A có 368 byte RAM, thường thì kích thước không quá 60 byte, có khi dưới 40 byte, nếu khai báo lớn hơn sẽ gặp lỗi không đủ bộ nhớ (Not enough RAM for all variable) trong khi thực sự PIC còn rất nhiều RAM.

Nếu khai báo 16F877A với pointer 16 bit (#device *=16), không gian bộ nhớ sẽ là đầy đủ (trừ đi ít RAM do CCSC chiếm làm biến tạm), dùng đầy đủ bộ nhớ 368 byte RAM, nhưng kích thước mảng cũng không quá 60 byte.

Ví dụ:

int16 a[125]; // biến mảng a 126 phần tử (0–125), kích thước 252 byte RAM.

• Các cấu trúc lệnh

Các cấu trúc lệnh thường dùng bao gồm: if..., if...else, for..., while..., switch... Tất cả có thể tham khảo trong HELP của chương trình ở HELP > Statements

• Các hàm xử lý bit hay dùng bit_set(var,bit)

bit_clear(var,bit)

Æ Dùng xóa về 0 (clear) hay đặt lên 1 (set) được chỉ định bởi vị trí bit trong biến var. var – biến 8, 16, 32 bit bất kỳ

bit – vị trí bit được xóa về 0 (clear) hay đặt lên 1 (set). bit 0 – 7 (đối với biến 8 bit)

bit 0 – 15 (đối với biến 16 bit) bit 0 – 31 (đối với biến 32 bit) Hàm không trả về trị.

Ví dụ: int x;

x=11; // x=1011b

bit_clear(x.1);// giá trị x thay đổi thành x=1001b sau khi xóa bit 1 của biến x.

bit_test(var,bit)

Æ Dùng kiểm tra vị trí bit trong biến var.

Hàm trả về giá trị 0/1 là giá trị bit đó trong biến var. Ví dụ:

Giả sử có biến x 12 bit đếm từ 0 lên và muốn kiểm tra xem có lớn hơn 4096 (212) không, thì hàm if(x>=4096) … mất khoảng 5 us. Trong 1 vòng l ặp, việc kiểm tra thường xuyên như vậy sẽ làm mất thời gian đáng kể. Để tối ưu, chỉ cần dùng if(bit_test(x,12)) … chỉ mất khoảng 0.4 us đối với thạch anh dao động 20 MHz.

Kiểm tra đếm lên tới những giá trị đặc biệt (như 2i), dùng hàm này rất tiện lợi. • Các toán tử thường dùng: +, -, *, /, ++, --, +=, -=, *=, /=, ==, &, &=, |, |=, !=, >, <, >=, <=, ... >>, <<, <<= >>= dịch phải, dịch trái, ... Ví dụ: int x=1; // x = 0000 0001 b int y=4; x<<1; // lúc này x = 0000 0010b

x<<=y; // x=x<<y; tức là x<<4, lúc này x = 0010 0000 b Các kiểu dữ liệu, khai báo biến, hằng, mảng, các hàm xử lý bit khác và các toán tử, … có thể tra cứu trong HELP của chương trình: HELP > Operators, Data types, …

• Các hàm xử lý xuất nhập I/O

output_low() output_high() output_X() output_bit()

input_X() input() …

output_low(pin) output_high(pin)

Æ Dùng thiết lập mức 0 (low, 0V), mức 1 (high, 5V) cho chân IC. pin : chỉ vị trí chân của Port

Hàm này sẽ đặt pin làm ngõ ra một cách tự động, thực ra là nhiều thao tác gộp lại (xem cụ thể trong mã ASM)

Hàm này dài từ 2 đến 4 chu kỳ máy.

Nếu dùng để xuất xung, có thể khai báo tiền xử lý #use fast_io (sử dụng truy xuất nhanh I/O), sau đó phải tự set_tris_X(value) để định hướng xuất nhập, rồi mới dùng hàm output như trên.

Ví dụ:

main() {

{

In document 1056_Thiet_ke_canh_tay_robot (Page 41-47)

Related documents