1. Trang chủ
  2. » Thể loại khác

Chapter4 NgonNguC MMC18 GT V2q

30 200 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 30
Dung lượng 577,87 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

CHƯƠNG 4: NGÔN NGỮ LẬP TRÌNH C VÀ TRÌNH MPLAB C18 Trong thiết kế các ứng dụng điều khiển tự động, người thiết kế thường phải sử dụng hai ngôn ngữ chính để lập trình: ngôn ngữ assembly

Trang 1

CHƯƠNG 4: NGÔN NGỮ LẬP TRÌNH C VÀ

TRÌNH MPLAB C18

Trong thiết kế các ứng dụng điều khiển tự động, người thiết kế thường phải sử dụng hai ngôn ngữ chính để lập trình: ngôn ngữ assembly và C Trong đó, assembly đã được hướng dẫn trong chương 3 Trong chương này sẽ xem ngôn ngữ C chuẩn là khả năng lập trình cơ bản mà người tham khảo đã có Như vậy, ở đây sẽ không phân tích và hướng dẫn sâu về C

mà chỉ tóm tắt lại cấu trúc cơ bản của ngôn ngữ C mà thôi Nội dung chính của chương 4 chỉ hướng dẫn trình MPLAB C18 và nó cũng được xây dựng dựa trên nền tảng ngôn ngữ C Mục tiêu chính cho người tham khảo đọc chương này:

 Nắm vững cách viết các vòng chương trình trong C

 Viết được các chương trình C đơn giản dùng trình MPLAB C18

 Có khả năng viết hỗn hợp giữa assembly và C trong MPLAB C18

 Có khả năng áp dụng các hàm thường dùng trong MPLAB C18

4.1.1 Giới thiệu ngôn ngữ C

Phần hỗ trợ này chỉ tóm tắt ngôn ngữ C để có thể sử dụng nó trong lập trình giao tiếp PIC18 cơ bản Ngôn ngữ C dần dần được thay thế hợp ngữ trong các ứng dụng nhúng bởi vì

nó thường được sử dụng trong lập trình nhiều lĩnh vực ứng dụng đa dạng, nên nó khá thân thiện đối người lập trình

Một chương trình C bao gồm các hàm và các biến Hàm chứa đựng các phát biểu để chỉ

rõ các hoạt động để thực hiện Các kiểu phát biểu trong một hàm có thể là sự công bố, chỉ

định, gọi hàm, điều khiển và vô hiệu (null) Biến lưu trữ dữ giá trị để sử dụng trong tính toán

Hàm main() được yêu cầu phải có trong mỗi chương trình C mà điều khiển được thông

qua khi chương trình được thi hành Một chương trình C đơn giản có cấu trúc như sau: (1) #include <stdio.h> /* chứa đựng thông tin về thư viện chuẩn*/

(2) /* Bắt đầu chương trình */

(3) main(void) /* định nghĩa hàm có tên main mà nó nhận*/

/* không có giá trị*/

(4) { /* các phát biểu của main ở trong “{}”*/

(5) int a, b, c; /* định nghĩa 3 biến kiểu int*/

Trang 2

stdio.h cho phép hàm printf( ) được cầu khẩn trong chương trình

Dòng thứ hai là dòng chú thích và nội dung của nó không được biên dịch Chú

thích trong C sẽ có ký hiệu bắt đầu là “/*” và kết thúc là “*/” Các chú thích chỉ ảnh

hưởng đến kích cỡ tập tin văn bản chứ không ảnh hưởng đến dung lượng mã thi hành

Dòng thứ ba main() là nơi chương trình thực hiện bắt đầu Dòng thứ năm định nghĩa 3

biến a, b, c Trong C, các biến phải được khai báo trước khi chúng được sử dụng Dòng

thứ mười, trả kết quả 0 cho việc gọi main() Dòng cuối cùng “}” báo kết thúc main() 4.1.2 Kiểu dữ liệu, biến, toán tử, biểu thức

Các biến và hằng là các đối tượng cơ bản được tính toán trong một chương trình Các biến phải được khai báo trước khi sử dụng

Các loại dữ liệu

Có vài kiểu dữ liệu cơ bản trong C: void, char, int, float, double Kiểu void thường

được sử dụng nhiều nhất với các hàm Biến có 5 kiểu sau:

char: xử lý byte đơn của dữ liệu

int: biểu diễn số nguyên thường có độ dài 16 bit

short và long: bổ sung thêm cho kiểu int

float: xử lý số chấm động có độ dài 32 bit (độ chính xác đơn)

double: xử lý số chấm động có độ dài 64 bit (độ chính xác gấp đôi)

Trang 3

Khai báo biến

Biến gồm tên và kiểu biến và có thể cung cấp thêm giá trị ban đầu của nó Tên biến có thể bắt đầu bằng ký tự từ A ÷ Z hoặc a ÷ z hoặc ký tự gạch dướ, theo sau có thể là các con số, nhiều chữ cái hay các ký tự gạch dưới Các tên biến không được chứa đựng dấu số học, dấu chấm, hô ngữ, các từ khoá C, các ký tự đặc biệt như là @, #, ? Các ví dụ sau sẽ trình diễn cách khai báo biến:

Có 4 kiểu hằng: số nguyên, ký tự, số chấm động và chuỗi Một hằng số dài (long) được

viết kèm với ký tự cuối là l hay L, chẳng hạn như 44332211L Các ký tự hằng sau đây đã được ấn định trước trong C:

Bảng 4.1: ý nghĩa các ký tự hằng trong C

Tương tự như hợp ngữ, số trong C cũng phải chỉ rõ các cơ số khác nhau Cách thức để

chỉ rõ cơ số của một số là thêm tiền tố (prefix) ở trước số như bảng 4.2:

Bảng 4.2: các tiền tố cho các cơ số khác nhau

Trang 4

Các toán tử bit thông minh

Ngôn ngữ C cung cấp 6 toán tử cho thao tác bit, các toán tử này chỉ xử lý các toán hạng nguyên như là char, short, int và long:

Các toán tử logic và quan hệ

Các toán tử quan hệ được sử dụng trong các biểu thức để thực hiện so sánh các giá trị của hai toán hạng Nếu kết quả so sánh là đúng, khi đó giá trị của biểu thức là 1 Ngược lại, giá trị của biểu thức là 0 Sau đây là các toán tử quan hệ và logic:

Trang 5

Sự ưu tiên của các toán tử

Ngôn ngữ C duy trì độ ưu tiên thực hiện của tất cả các toán tử theo bảng 4.3 Các toán

tử có cấp độ như nhau thì được ước lượng từ trái qua phải

Bảng 4.3: độ ưu tiên các toán tử

Độ ưu tiên Toán tử Tính kết hợp

Bảng 4.4: các ví dụ về độ ưu tiên toán tử

Biểu thức Kết quả Ghi chú

16

9

* có tính ưu tiên cao hơn +

!= có ưu tiên hơn | + có ưu tiên cao hơn <<

4.1.3 Điều khiển lưu trình

Các phát biểu điều khiển lưu trình chỉ rõ trật tự mà các tính toán được thực hiện Trong ngôn ngữ C, dấu “;” cho biết kết thúc một phát biểu Dấu “{” và “}” được sử dụng để nhóm các khai báo và phát biểu cùng trong một phát biểu kép hay khối sao cho chúng tương đương

cú pháp với phát biểu đơn Một phát biểu kép thì không được kết thúc bằng dấu “;”

4.1.3.1 Phát biểu if

Phát biểu if

Phát biểu if là phát biểu có điều kiện Nếu điều kiện đúng thì phát biểu được thực hiện,

ngược lại thì bỏ qua Cú pháp thực hiện như sau:

if (expression)

statement;

Ví dụ:

Trang 6

Phát biểu có điều kiện nhiều hướng

Quyết định nhiều hướng được diễn tả như chuỗi nối tầng các phát biểu if else

if (expression1)

statement1; else if (expression2)

statement2; else if (expression3)

statement3;

else

statementn;

Trang 7

case const_expr2:

statement2; break;

default:

statementn; }

Cú pháp của phát biểu for-loop là

for (expr1; expr2; expr3)

statement;

trong đó, expr1 và expr3 là các chỉ định hay gọi hàm và expr2 là biểu thức quan hệ

Trang 8

được xem là kiểu lập trình tốt Cú pháp thực hiện:

Trang 9

int putchar (int)

Hàm này xuất ra một ký tự dựa vào thiết bị ngõ ra theo tiêu chuẩn Ví dụ,

putchar(‘a’);

xuất ra ký tự a từ thiết bị ngõ ra theo chuẩn

int puts (const char *s)

Hàm này xuất ra chuỗi được định chỉ bởi s dựa vào thiết bị xuất theo chuẩn Ví dụ, phát

biểu sau sẽ phát ra chuỗi “du an PIC dau tien!”:

puts(“du an PIC dau tien! \n”);

int printf (formatting string, arg 1 , arg 2 , , arg n )

Hàm này thực hiện chuyển đổi, định dạng và in các đối số dựa vào ngõ ra chuẩn dưới

điều kiện của formatting string, arg 1 , arg 2 , , arg n là các đối số mà nó biểu diễn các phần

tử dữ liệu ra riêng lẻ Các đối số có thể được viết như hằng, biến đơn hay các tên mảng, hoặc các biểu thức phức tạp hơn Chuỗi định dạng được soạn trong những nhóm riêng biệt của các

ký tự, với một nhóm ký tự được liên kết với mỗi phần tử dữ liệu ra Nhóm ký tự tương ứng

với một phần tử dữ liệu phải được bắt đầu bằng % Ở dạng đơn giản nhất, một nhóm ký tự

riêng lẻ sẽ mang dấu % được theo sau một ký tự chuyển đổi để chỉ loại phần tử dữ liệu tương ứng Một tập con của nhiều ký tự chuyển đổi thường sử dụng được liệt kê trong bảng 4.5

Bảng 4.5: các ký tự chuyển đổi được sử dụng tổng quát cho dữ liệu xuất

Ký tự

chuyển đổi Ý nghĩa

c

d

Phần tử dữ liệu được hiển thị như một ký tự đơn

Dữ liệu được hiển thị như một số thập phân có dấu

Trang 10

Dữ liệu được hiển thị như một giá trị chấm động với số mũ

Dữ liệu được hiển thị như một giá trị chấm động không có số mũ

Dữ liệu được hiển thị như một giá trị chấm động dùng hoặc kiểu chuyển đổi e hoặc f, tuỳ thuộc vào giá trị; đuôi có các số 0, đuôi chấm động sẽ không được hiển thị

Dữ liệu được hiển thị như số nguyên thập phân có dấu

Dữ liệu được hiển thị như số nguyên bát phân, không có chữ số 0 ở đầu

Dữ liệu được hiển thị như một chuỗi

Dữ liệu được hiển thị như số nguyên thập phân không dấu

Dữ liệu được hiển thị như số nguyên thập lục, không có chữ số 0 ở đầu Giữa ký tự % và ký tự chuyển đổi có thể là các phần tử sau:

 Một dấu trừ, để chỉ rõ sự điều chỉnh trái của đối số được chuyển đối

 Một con số để chỉ độ rộng vùng tối thiểu Đối số được chuyển đổi sẽ được in trong vùng ở tối thiểu độ rộng này

 Một chu kỳ để tách biệt độ rộng vùng từ sự chính xác

 Một số, độ chính xác để chỉ con số tối đa các ký tự được in từ một chuỗi, hoặc số các con số sau chấm thập phân của số chấm động, hoặc số tối thiểu các con số của số nguyên

 Ký tự h nếu số nguyên được in dạng short hay l nếu là long

Nhiều lệnh printf đúng được gọi như sau:

printf(“PIC18 de dang su dung! \n”); /* xuất ra chỉ là chuỗi*/

printf(“%d %d %d”, x1, x2, x3); /* xuất ra các biến x1, x2, x3 dùng số

tối thiểu các con số với một khoảng trắng tách biệt mỗi giá trị*/ printf(“Nhiet do hom nay la %4.1d \n ”, temp);

/* hiển thị chuỗi Nhiet do hom nay la

theo sau là giá trị của temp Hiển thị một con số lẻ và tối thiểu 4 con

số cho giá trị.*/ Lưu ý, hàm printf() không hỗ trợ cho trình biên dịch PIC18

4.1.5 Các hàm và cấu trúc chương trình

Mỗi chương trình C đều chứa tối thiểu một hàm Nếu chương trình có nhiều hàm, các định nghĩa không thể được nhúng trong hàm khác Tổng quát, hàm sẽ xử lý thông tin từ vị trí

gọi hàm và trả lại kết quả nhờ phát biểu return Các thông tin xử lý trong hàm được gọi là

các đối số (arguments) Đôi khi, hàm có xử lý thông tin nhưng không trả lại kết quả đã thực

hiện (như hàm printf)

Trang 11

Cú pháp định nghĩa hàm như sau:

return_type function_name(declarations of arguments)

{

declarations and statements }

Sự khai báo một đối số trong định nghĩa hàm gồm hai phần: kiểu và tên của biến Kiểu

trả về (return_type) của hàm là void nếu nó không trả về bất kỳ giá trị nào

Ví dụ 4.5: hàm chuyển đổi ký tự thường thành ký tự hoa

Ví dụ 4.6: viết hàm để tìm phần tử lớn nhất của mảng số nguyên

Giải pháp: các thông số được đưa vào hàm này gồm địa chỉ đếm và bắt đầu của mảng

int arr_max(int ar_cnt, int arr[])

}

Ví dụ 4.7: viết hàm để tính căn bậc hai của số 32-bit sử dụng phương pháp xấp xĩ

Giải pháp: hàm được viết như sau:

unsigned sq_root(unsigned long int xz)

{

Trang 12

unsigned int sar, guess_mask, rest_mask;

rest_mask = ~guess_mask; /*rest_mask để bỏ giá trị đoán không đúng*/

sar | = guess_mask; /* dự đoán bit thứ i là 1*/

char test_prime(int a);

Ví dụ 4.8: viết hàm để kiểm tra một số nguyên có phải là số nguyên tố không

Giải pháp: số 1 không phải là số nguyên tố Một số là số nguyên tố nếu nó thì không thể chia

được cho số nguyên bất kỳ giữa 2 và căn bậc hai của nó

unsigned sq_root(unsigned long int xz)

/* Hàm này trả lại 1 khi ka là số nguyên tố Ngược lại, trả về 0.*/

char test_prime(unsigned long int ka)

Trang 13

{

unsigned int i, limit;

if (ka == 1) return 0;

else if (ka == 2) return 1;

limit = sq_root(ka); /* tìm căn bâc hai của ka.*/

for (i = 2; i <= limit; i++)

Con trỏ trong C là một biến mà nó nắm giữ địa chỉ của một biến Con trỏ có thể sử dụng

để đưa thông tin ra sau và trước giữa một hàm và điểm gọi tham chiếu của nó Trường hợp đặc biệt, các con trỏ cung cấp cách thức để trả về các dữ liệu từ một hàm thông qua các đối

cho biết con trỏ cp kiểu char

Để truy xuất giá trị đã được định vị bằng con trỏ, có thể thực hiện như sau:

int a,*ax; /*ax là con trỏ kiểu int*/

a = *ax;

Chúng ta có thể gán địa chỉ của một biến đối với con trỏ bằng cách sử dụng toán tử

nguyên phân (unary operator) & Ví dụ,

int x, y;

int *ip; //ip là con trỏ kiểu int//

Trang 14

ip = &x; //gán địa chỉ của biến x cho ip

y = *ip; //y nhận giá trị của x

Lưu ý sự khác nhau giữa biến thông thường và biến con trỏ: một biến thông thường thì

nó nhận giá trị của nó Đối với biến con trỏ, nó sẽ lấy địa chỉ của vị trí bộ nhớ nơi mà giá trị của biến được lưu

4.1.6.2 Mảng

Nhiều ứng dụng yêu cầu xử lý biến mang nhiều dữ liệu mà có tính chất giống nhau Trong trường hợp như thế, để thuận lợi hơn ta đặt các phần tử dữ liệu của nó vào trong một mảng

Tổng quát, mảng một chiều được biểu diễn là

ip = &ax[0]; //ip chứa địa chỉ của ax[0]

x = *ip; //nạp nội dung của ax[0] vào x

char strgx[5] = {‘A’, ‘F’, ‘h’, ‘y’, 0};

char title[18] = {My auto controller};

Trang 15

4.1.6.5 Cấu trúc

Cấu trúc là một nhóm của các biến có liên hệ mà nó có thể được truy xuất nhờ một tên chung Mỗi phần tử bên trong một cấu trúc có kiểu dữ liệu riêng Cú pháp khai báo một cấu trúc như sau:

unsigned int date;

unsigned chat rev;

} card; //biến card là kiểu của catalog_tag

type_name n element n ; };

Ví dụ,

union flags

Trang 16

{

unsigned char x;

unsigned int y;

} P; //P là tag của flags

Các biến x và y chiếm hữu vùng nhớ giống nhau, và cỡ của hợp nhất này là 2 byte (cỡ của thành viên lớn nhất là cỡ của hợp nhất) Khi đó, biến y được nạp giá trị 2-byte, biến x sẽ

lấy giá trị byte thấp của y Trong ví dụ sau, y được nạp giá trị 16-bit là 0xAEFA và x sẽ nhận giá trị là 0xFA:

P.y = 0xAEFA;

4.1.7 Phát biểu #pragma

Người thảo chương trình biên dịch có thể thêm các lựa chọn thi hành độc lập đối với C

chuẩn bằng cách sử dụng các phát biểu #pragma Phát biểu này thường được sử dụng để khai

báo các đoạn dữ liệu và mã, khai báo các thuộc tính, các vector ngắt và thủ tục ngắt và nhiều đặc trưng thi hành độc lập khác

Kiểu đoạn #pragma

Trình biên dịch MPLAB C18 sử dụng kiểu phát biểu này để quản lý bộ nhớ Một đoạn chương trình của một ứng dụng được định vị để chỉ địa chỉ của bộ nhớ Có hai kiểu đoạn chương trình thực hiện cho mỗi loại bộ nhớ:

 Bộ nhớ chương trình

code: chứa đựng các lệnh thi hành

romdata: chứa đựng các biến và hằng

 Bộ nhớ dữ liệu

udata: chứa đựng các biến người dùng chưa được khởi tạo được cấp phát tĩnh

idata: chứa đựng các biến người dùng đã khởi tạo được cấp phát tĩnh

Cú pháp các đoạn khai báo như sau:

#pragma udata [attribute-list] [section-name [location]]

#pragma idata [attribute-list] [section-name [location]]

#pragma romdata [overlay] [section-name] [location]

#pragma code [overlay] [section-name] [location]

trong đó, attribute-list có thể được truy xuất, chồng lấp hoặc cả hai; section-name phải dạng C đúng; location là địa chỉ bắt đầu của đoạn và phải là số nguyên Sự truy xuất

thuộc tính báo cho trình biên dịch để định vị đoạn được chỉ rõ đối với bank truy xuất

Trang 17

Thuộc tính chồng lấp cho phép các đoạn được đặt địa chỉ vật lý giống nhau để chiếm giữ bộ nhớ

Thỉnh thoảng, một chương trình cần gọi hàm hợp ngữ từ chương trình C hoặc gọi hàm

C từ chương trình hợp ngữ

4.2.1 Các quy ước gọi

Trình biên dịch MPLAB C18 sử dụng cả ngăn xếp bằng phần mềm và bộ nhớ toàn cục

(trong bộ nhớ dữ liệu) để cấp phát các biến cục bộ, nhập các thông số và các kết quả trả về

Trong chương 3, ngăn xếp bằng phần mềm đi từ địa chỉ thấp đến địa chỉ cao hơn Con

trỏ ngăn xếp (FSR1) luôn chỉ đến vị trí ngăn xếp hiện diện kế tiếp MPLAB C18 sử dụng

FSR2 như là con trỏ khung, cung cấp khả năng truy xuất nhanh tới các biến cục bộ và thông

cố Khi một hàm được cầu khẩn, các đối số theo ngăn xếp của nó được đẩy lên phía trên của ngăn xếp theo trật tự từ phải sang trái, đối số hàm cực tả sẽ ở trên đỉnh của ngăn xếp mềm Hình 4.1 mô tả sự ưu tiên tức thời của ngăn xếp mềm đối với sự gọi hàm

Hình 4.1: ví dụ về trật tự ưu tiên tức thời của ngăn xếp phần mềm

Con trỏ khung tham chiếu vị trí trên ngăn xếp mà nó tách biệt với các đối số ngăn xếp

cơ sở từ các biến cục bộ ngăn xếp cơ sở Các đối số ngăn xếp cơ sở được đặt tại các khoảng cách âm từ con trỏ khung, và các biến cục bộ ngăn xếp cơ sở được đặt tại các khoảng cách dương từ con trỏ khung Ngay tức thời trên ngõ vào của hàm C, hàm được gọi đẩy các giá trị của FSR2 lên trên ngăn xếp và sao chép giá trị FSR1 vào trong FSR2, bằng cách đó sự lưu trữ ngữ cảnh của hàm gọi và sử khởi tạo con trỏ khung của hàm hiện hành Kích cỡ tổng của các biến cục bộ ngăn xếp cơ sở cho hàm được cộng thêm vào con trỏ ngăn xếp, cấp phát không gian ngăn xếp cho các biến đó Khi cần thì hàm hiện hành có thể lưu trữ các thanh ghi

cụ thể trước khi cấp phát các biến cục bộ Hình 4.2 diễn tả ngăn xếp mềm sau một sự gọi đối với hàm C, hình này cũng cho biết rằng hàm hiện tại không lưu trữ bất kỳ thanh ghi nào trong ngăn xếp mềm

Ngày đăng: 21/12/2017, 12:18

TỪ KHÓA LIÊN QUAN

w