Vi Điều Khiển

Chào mừng các bạn đến với thế giới của Vi điều khiển!

--welcome to the world of microcontrollers^^ --

Điện Tử Cơ Bản

nơi khởi đầu

Lập Trình

linh hồn của phần cứng

Hiển thị các bài đăng có nhãn cấu trúc lệnh. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn cấu trúc lệnh. Hiển thị tất cả bài đăng

Chủ Nhật, 26 tháng 2, 2012

Hướng Dẫn CCS Cho PIC - Bài 2: Sử dụng Biến và Hàm, Cấu trúc lệnh, Chỉ thị tiền xử lý



Bài trước: +Bài 1: Hướng dẫn lập trình cho PIC bằng CCS ver3.242
Bài tiếp: +Bài 3: Các Hàm Xử Lý Số, Xử Lý Bit, Delay trong CCS





Bài 2: Sử dụng Biến và Hàm, Cấu trúc lệnh, Chỉ thị tiền xử lý trong CCS


I / KHAI BÁO VÀ SỬ DỤNG BIẾN , HẰNG , MẢNG : 


1 /Khai báo biến  , hằng  ,mảng : 


+ Các loại biến sau được hỗ trợ : 


int1  số  1 bit = true hay false ( 0 hay 1)
int8  số  nguyên 1 byte ( 8 bit)
int16  số nguyên 16 bit
int32  số nguyên 32 bit
char  ký tự 8 bit
float  số thực 32 bit
short  mặc định như  kiểu int1
byte  mặc định như kiểu int8
int  mặc định như kiểu int8
long  mặc định như kiểu int16


+ Thêm signed hoặc unsigned phía trước để chỉ đó là số có dấu hay không dấu .Khai báo như trên mặc định là không dấu . 4 khai báo cuối không nên dùng vì dễ nhầm lẫn . Thay vào đó nên dùng 4 khai báo đầu .




VD : 
Signed int8  a ; // số a là 8 bit dấu ( bit 7 là bit dấu ). 
Signed int16 b , c , d ; 
Signed int32 , . . .  


+ Phạm vi biến :  


 Int8 :0 , 255  signed int8 : -128 , 127
 Int16 : 0 ,2^15-1 signed int16 : -2^15 , 2^15-1
 Int32 : 0 , 2^32-1 signed int32 : -2^31 , 2^31-1


+ Khai báo hằng : 
VD : 
 Int8 const  a=231 ; 


+ Khai báo 1 mảng hằng số : 
VD :
Int8 const a[5] = { 3,5,6,8,6 } ;  //5 phần tử , chỉ số mảng bắt đầu từ 0 : a[0]=3 


+ Một mảng hằng số có kích thước tối đa tuỳ thuộc loại VĐK: 


*NếuVĐK là PIC 14 ( VD :16F877 )  : bạn chỉ được khai báo 1 mảng hằng số  có kích thước tối đa là 256byte .


 Các khai báo sau là hợp lệ :
Int8 const a[5]={ . . .};  // sử dụng 5 byte , dấu . . . để bạn điền số vào  
Int8 const a[256]={ . . .};  // 256 phần tử x 1 byte = 256 byte  
Int16 const a[12] = { . . . };  // 12 x 2= 24 byte 
Int16 const a[128] = { . . . }; // 128 x 2= 256 byte 
không hợp lệ :


Int16 const a[200] = { . . . }; // 200 x 2 =400 byte


*Nếu VĐK là PIC 18 : khai báo mảng hằng số thoải mái , không giới hạn kích thước .


+ Lưu ý : 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ẽ 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 .
VD :
int8 const a [7] = { 0 , 3,5 ,9 }   // các phần tử a[4] ,a[5],a[6] đều =0 


+ Mảng hằng số thường  dùng làm bảng tra (ví dụ bảng tra sin ) , viết dễ dàng và nhanh chóng , gọn hơn so với khi dùng ASM để viết .


+ Khai báo 1 biến mảng : kích thước tuỳ thuộc khai báo con trỏ trong #device  và loại VDK:


*PIC 14 : Nếu bạn khai báo con trỏ 8 bit : VD: # device *=8  : 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 VĐK của bạn có hơn 256 byte RAM (Vd : 368 , . . .)  và biến mảng có kích thước tối đa tuỳ thuộc độ phân mảnh bộ nhớ , với 16F877 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 vô duyên : "not enough ram for all variable"  trong khi thực sự VDK còn rất nhiều RAM . Nếu khai báo con trỏ 16 bit : VD : #device *=16 , không gian bộ nhớ là đầy đủ ( trừ đi 1 ít RAM do CCS chiếm làm biến tạm ) .VD : với 16F877  bạn dùng đủ 368 byte RAM . Nhưng kích thước mảng cũng không quá 60 byte .


* PIC 18 : kích thước mảng không giới hạn, xài hết RAM thì thôi . Với khai báo con trỏ 8 bit , bạn chỉ được xài tối đa 256 byte RAM , nếu khai báo con trỏ 16 bit , bạn xài trọn bộ nhớ RAM thực sự . VD: Khai báo biến mảng : int16  a[125] ; // biến mảng 126 phần tử , kích thước 252 byte ram . 






2 / Cách sử dụng biến : 


+ Khi sử dụng các phép toán cần lưu ý : sự tràn số , tính toán với số âm , sự chuyển kiểu và ép kiểu .


A ) Một vài ví dụ  về tràn số  , làm tròn :  
VD :  
Int8 a=275;  // a =275-256=19 
Int8 const a=275 //a=19 
Int8 a=40 , b=7 , c; 
C=a * b ;  //c=280-256=24 
C=a / b ;  //c=5 


+ Bạn có thể ép kiểu , thường là tiết kiệm ram , hay muốn tiết kiệm thời gian tính , . . .. VD : 
Int8 a =8 , b=200; 
Int16 c ; 
C=  ( int16) a * b ; 
// c= 1600 , a chuyển sang 16 bit , 16bit*8bit => b tự động chuyển sang 16 bit , kết quả là 16 bit trong c , lưu ý biến a , b vẫn là 8 bit .  


+ 8bit * 8bit  =>  phép nhân là 8 bit , KQ là 8 bit
+ 16bit * 8 bit  =>  phép nhân là 16 bit , KQ là 16 bit
+ 32bit * 16 bit  =>  phép nhân là 32 bit , KQ là 32 bit
+ 16bit * 16 bit  =>  phép nhân là 16 bit , KQ là 16 bit
. . . v . v . . .


+ Có thể ép kiểu kết quả : VD : 16b*8b => 16bit , nếu gán vào biến 8 bit thì KQ sẽ cắt bỏ 8 bit cao .


B )Phạm vi sử dụng  biến : 


+ Giống  như C trong lập trình C cho máy tính . Biến có thể được khai báo như toàn cục hay cục bộ . Biến khai báo trong hàm sẽ là cục bộ và sẽ chỉ dùng được trong hàm đó , kể cả trong hàm main() . Ngoài ra còn có thể khai báo ngay trong 1 khối lệnh , và cũng chỉ tồn tại trong khối lệnh đó . Do vậy nếu dùng MPLAB để mô phỏng , thì khi nhảy vào hàm hay khối lệnh có chứa khai báo biến đó thì biến đó mới có giá trị , có khi nhảy ra ngoài hàm thì biến đó sẽ là” out of scope” khi ta quan sát chúng trong cửa sổ Watch.
+ Chi tiết về phạm vi biến xem tài liệu lập trình C trên máy tính .
+ CCS có hỗ trợ cả con trỏ , tuy nhiên ít dùng .
+ CCs không hỗ trợ lập trình hướng đối tượng như C++ . Tuy vậy CCS có hỗ trợ các biến cấu trúc .


3 / Các phép toán , sự thực thi và vấn đề tối ưu mã , chương trình: