lap trinh avr voi c www.eeelabs.org chuong4 bai1

16
Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG Trần Thừa – 2010 56 CHƯƠNG 4: THỰC HÀNH GIAO TIẾP VỚI CÁC NGOẠI VI CƠ BẢN BÀI 1: GIAO TIẾP NHẬP XUẤT VỚI LED ĐƠN VÀ PHÍM ĐƠN Các bài thực hành trong chương này sử dụng Atmega16 I. Phần cứng. +Do Atmega16 có khả năng cấp dòng khá cao (khoảng 20mA) nên có thể mắc trực tiếp led đơn vào chân I/O của các port. +Phím đơn có thể mắc theo 2 cách, dùng điện trở kéo lên =>mức tác động thấp hoặc dùng điện trở kéo xuống => mức tác động cao. Hình 1. Nút nhấn tác động thấp và nút nhấn tác động cao. Trong chương này chủ yếu sử dụng nút nhấn tác động thấp. Module giao tiếp phím ấn và led đơn bao gồm 8 phím ấn và 8 led đơn với 2 cổng kết nối. Module này thích hợp sử dụng với board phát triển đã giới thiệu ở chương 1. Sơ đồ của module được giới thiệu ở hình 2. R1 10k R2 8k2 SW1 BUTTON VCC I/O PIN VCC SW2 BUTTON I/O PIN

Upload: spy004

Post on 23-Jun-2015

1.419 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 56

CHƯƠNG 4: THỰC HÀNH GIAO TIẾP VỚI CÁC NGOẠI VI CƠ BẢN

BÀI 1: GIAO TIẾP NHẬP XUẤT VỚI

LED ĐƠN VÀ PHÍM ĐƠN

Các bài thực hành trong chương này sử dụng Atmega16

I. Phần cứng.

+Do Atmega16 có khả năng cấp dòng khá cao (khoảng 20mA) nên có thể mắc trực tiếp led đơn vào chân I/O của các port.

+Phím đơn có thể mắc theo 2 cách, dùng điện trở kéo lên =>mức tác động thấp hoặc dùng điện trở kéo xuống => mức tác động cao.

Hình 1. Nút nhấn tác động thấp và nút nhấn tác động cao.

Trong chương này chủ yếu sử dụng nút nhấn tác động thấp.

Module giao tiếp phím ấn và led đơn bao gồm 8 phím ấn và 8 led đơn với 2 cổng kết nối. Module này thích hợp sử dụng với board phát triển đã giới thiệu ở chương 1.

Sơ đồ của module được giới thiệu ở hình 2.

R110k

R28k2

SW1

BUTTON

VCC

I/O PIN

VCC

SW2

BUTTON

I/O PIN

Page 2: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 57

Hình 2. Module giao tiếp phím nhấn và led đơn.

II. Giao tiếp với led đơn.

Trong chương 1 đã giới thiệu, việc xuất dữ liệu của các PORT được điều khiển bởi thanh ghi PORTx và các bit của thanh ghi này tương ứng với các PIN của PORTx.

Thực hành:

- Chạy MikroC và tạo 1 dự án mới có tên là BAI1_1_A, cấu chọn tần số thạch anh là 16Mhz, dùng vi điều khiển Atmega16, chọn tất cả các thư viện

- Không sử dụng file bai1.c mà tạo file khác có tên là bai1_1_A, sử dụng file này làm file nguồn.

- Soạn thảo chương trình sau:

Bài 1 _ 1 _A: Tạo và quản lý project

unsigned char i;

void main(){

DDRA=0xFF;// CẤU HÌNH PORTA LÀ PORT XUẤT

while(1){

for(i=1;i<=255;i++){

PORTA=i;

Delay_ms(500);// TRÌ HOÃN 500ms

SW1BUTTON

VCC

SW2BUTTON

SW3BUTTON

SW4BUTTON

VCC D1LED

R5330

D2LED

R6330

D3LED

R7330

D4LED

R8330

D5LED

R9330

D6LED

R10330

D7LED

R11330

D8LED

R12330

SW5BUTTON

SW6BUTTON

SW7BUTTON

SW8BUTTON

R13

10k

123456789

J1

PORT_8_PIN

123456789

10

VCC

J2

PORT_8_PIN

12345678910

Page 3: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 58

}

}

}

- Tiến hành biên dịch và nạp xuống board hoặc mô phỏng bằng proteus.

Hàm trì hoãn bao gồm 2 loại:

Delay_ms(đối số vào); /*trì hoãn với đơn vị mili giây và đối số vào là thời gian cần thiết */

Delay_us(đối số vào); /*trì hoãn với đơn vị micro giây và đối số vào là thời gian cần thiết */

Các bạn hãy tìm hiểu thêm về 2 hàm này bằng công cụ help(F1).

- Mở cửa sổ Statistics để xem tài nguyên đã chiếm dụng: Project>View Statistics.

- Mở cửa sổ watch(shift+F5) để xem giá trị biến i và thanh ghi PORTA.

Thử thay đổi tần số thạch anh trong Project Setting sau đó biên dịch lại và mô phỏng bằng proteus. Ta thấy có sự sai lệch về thời gian trì hoãn nhưng chương trình vẫn chạy, qua đó nói lên vai trò của thạch anh.

Sau đây là 1 số bài ví dụ để các bạn có thể làm quen với các bước thay đổi file nguồn dự án, soạn thảo biên dịch chương trình.

Ví dụ 1: Viết chương trình chạy 1 led sáng từ phải sang trái và trái sang phải.

Bài 1 _ 1 _B: Chương trình dịch led 1

char i;

void main(){

DDRA=0xFF;// Cấu hình PORTA là PORT xuất

while(1){// Vòng lặp vô tận

for(i=0;i<=7;i++){ // Vòng lặp 8 lần

PORTA=0x01<<i; /*Dịch trái từ 0 đến 7 bit*/

delay_ms(500);// Trì hoãn 0.5s

}

}

}

Yêu cầu: các bạn cải tiến chương trình để 1 led sáng chạy sang phải đến biên rồi chạy trở về bên trái đến biên.

Page 4: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 59

Ví dụ 2: Viết 1 chương trình để 2 led sáng từ 2 biên chạy vào giữa, rồi chạy trở ra 2 biên.

Bài 1 _ 1 _B: Chương trình dịch led 2

char i;

void main(){

DDRA=0xFF;

while(1){

for(i=0;i<=3;i++){

PORTA=0x01<<i|0x80>>i;

delay_ms(500);

}

for(i=1;i<=2;i++){

PORTA=0x10<<i|0x08>>i;

delay_ms(500);

}

}

}

Từ các ví dụ trên, ta có thể thấy sự tương quan dữ liệu của thanh ghi PORTA và các chân PORTA. Các led chính là mô hình của các bit có giá trị 0 và 1 được thay đổi liên tục thông qua các toán tử.

Các trường hợp trên, ta đã tìm ra quy luật của sự thay đổi trạng thái của các led như yêu cầu. Thực tế đôi khi ta chưa tìm ra quy luật vận động của dữ liệu, trong trường hợp đó ta có thể dùng phương pháp lựa chọn và gán các dữ liệu cần thiết vào mảng.

Ví dụ 3: Viết lại chương trình của ví dụ 2.

Bài 1 _ 1 _B: Chương trình dịch led 3

char i;

char table[8]={0x81,0x42,0x24,0x18,0x24,0x42};

void main(){

DDRA=0xFF;

while(1){

for(i=0;i<=5;i++){

PORTA=table[i];/*Lấy phần tử i của mảng */

Page 5: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 60

delay_ms(500);

}

}

}

Bài tập: Viết 1 chương trình điều khiển 8 led sáng chạy dần từ trái sang phải (tốc độ 250ms/1led), chớp 2 lần mỗi lần cách nhau 1s.

(Xem bài giải trong file BAI1_1_E.c)

Từ các ví dụ trên, nếu thay các led bằng các tầng công suất, ta có thể ghép nhiều led thành các ký tự, hình vẽ để trang trí, rất thích hợp cho việc quảng cáo và các hình thức biểu diễn rất phong phú và đa dạng.

III. Giao tiếp phím nhấn đơn.

Phím đơn là 1 ngoại vi cho phép đưa tín hiệu số vào vi điều khiển để xử lý, vì vậy trước hết ta cần cấu hình PORTx giao tiếp theo hướng nhận dữ liệu.

Dữ liệu nhận vào được lưu trong thanh ghi PINx, và dữ liệu này thay đổi khi trạng thái các chân nhập xuất thay đổi.

Phím đơn có 1 hạn chế đó là hiện tượng dội cơ khí. Hiện tượng này xảy ra khi ta ấn phím, phím không lập tức tiếp xúc bền với tiếp điểm mà sẽ dội ra – dập vào liên tiếp nhiều lần(ta không thể cảm nhận được hiện tượng này). Do đó, tín hiệu sinh ra do phím nhấn sẽ không phải là xung vuông mà sẽ là 1 chuỗi xung liên tiếp có độ rộng xung khá bé. Để sử dụng được phím nhấn, ta phải khắc phục hiện tượng dội cơ khí. Ta sẽ không quan tâm đến các biện pháp chống dội bằng Smith trigger hay chốt RS mà sẽ nghiên cứu việc chống dội bằng phần mềm tức là viết chương trình có khả năng chống dội cơ khí.

1. Giao tiếp phím nhấn đơn giản.

Ở phần này chúng ta chưa đề cập đến hiện tượng dội cơ khí mà chỉ xem xét việc nhận dữ liệu qua thanh ghi PINx.

Thực hành:

- Sử dụng tiếp dự án BAI1, ta tạo file nguồn mới với tên là BAI1_2_A.c

- Soạn thảo và biên dịch chương trình sau:

Bài 1 _ 2 _A: Đọc PORT đơn giản

// Hàm (chương trình con) khởi tạo PORT giao tiếp

void init(){

DDRA=0xff;// Cấu hình PORTA là port xuất

Page 6: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 61

DDRC=0x00;// Cấu hình PORTC là port nhập

}

// Chương trình chính

void main(){

init();// Gọi hàm khởi tạo

while(1){ // Vòng lặp đọc phím liên tục

PORTA=PINC; // Gán giá trị đọc về cho PORTA

}

}

- Chương trình trên là chương trình đọc phím đơn giản, nó đọc giá trị nhận được ở PORTC và xuất ra led để hiển thị trạng thái của PORTC.

- Chạy mô phỏng chương trình và xem kết quả. Ta thấy, thời gian đáp ứng rất nhanh, trong ứng dụng này ta không cảm nhận được hiện tượng dội cơ khí.

- Chương trình tiếp theo có yêu cầu là: khi nhấn phím 1( kết nối với PORTC0) thì giá trị PORTA tăng 1 đơn vị, ấn phím 2 ( kết nối với PORTC1) thì giá trị phím giảm 1 đơn vị (PORTA hiển thị giá trị nhị phân).

Bài 1 _ 2 _B: Đọc phím, thực hiện công việc

char i;

void init(){

DDRA=0xFF;

DDRC=0x00;

}

void main(){

init();

while(1){

DDRC=0x00;

//Kiểm tra trạng thái chân C0

if(PINC0_bit==0){

i++; // Nếu có ấn thì tăng i 1 đơn vị

delay_ms(100);

}

//Kiểm tra trạng thái chân C0

Page 7: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 62

if(PINC1_bit==0){

i--;// Nếu có ấn thì tăng i 1 đơn vị

delay_ms(100);

}

PORTA=i;

}

}

Với chương trình trên, ta thực hiện các thử nghiệm sau:

+Bỏ 2 hàm delay sau đó biên dịch và mô phỏng. Ta thấy, Proteus sẽ tự động kéo giản thời gian để mô phỏng hiện tượng dội phím. Ta ấn phím 1 lần rồi nhả ra nhưng giá trị PORTA không ngừng tăng(hoặc giảm) cho đến 1 khoảng thời gian nhất định.

+Thay đổi giá trị thời gian trì hoãn của 2 hàm delay, ta thấy thời gian trì hoãn có tác dụng nhất định, nó bỏ qua giai đoạn xuất hiện các chuỗi xung không mong muốn.

Chương trình trên vẫn chưa sử dụng được vì phím không nhạy (cần thời gian trì hoãn nhiều) và nếu ấn giữ thì phím sẽ thực hiện công việc liên tục.

Ta sẽ nghiên cứu thêm về phương pháp chống dội phím ở phần sau.

Để truy xuất từng bit (từng chân) của các PORT ta xử lý các biến sau:

+Nhận dữ liệu: PINxy_bit với x là tên PORT, y là tên chân .

+Xuất dữ liệu : PORTxy_bit với x là tên PORT, y là tên chân .

Ví dụ : PORTA1_bit=PINC1_bit ;

2. Chống dội phím với thư viện có sẵn của MikroC.

MikroC cung cấp cho chúng ta 1 thư viện phím (nút nhấn - button). Để sử dụng thư viện này, ta phải khai báo bằng cách dùng công cụ Library manager(View>Library Manager).

Sau đây là bảng tóm tắt về hàm button trong thư viện này:

Prototype unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time, unsigned short active_state);

Kết quả trả về +255 nếu chân được tác động

+0 nếu xảy ra trường hợp khác.

Mô tả -port: tên thanh ghi PINx của port mà phím đang kết nối vào

-pin: Chân của port mà phím kết nối có giá trị từ 0-7

-time: thời gian trì hoãn để chống dội phím (khoảng 100ms)

Page 8: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 63

Yêu cầu Chân kết nối với phím phải cấu hình là ngõ vào

Ví dụ bit oldstate; // Cờ trạng thái trước void main() { DDC0_bit = 0; // Cấu hình PORTC0 là ngã vào DDRA = 0xFF; //Cấu hình PORTA là ngã ra PORTA = 0xAA; // Tạo giá trị đầu cho PORTA oldstate = 0; do { if (Button(&PINB, 0, 1, 0)) { // Phát hiện được phím ấn oldstate = 1; // Cập nhật cờ - đặt } if (oldstate && Button(&PINB, 0, 1, 0)) { //Trước đó có phím ấn và bây giờ có phím ấn thì thực hiện PORTC = ~PORTC; // Đảo PORTC oldstate = 0; // Cập nhật cờ - xóa } } while(1); // Vòng lặp mãi mãi

}

Hãy biên dịch và chạy mô phỏng ví dụ trên, đã có sự cải tiến khi dùng biến oldstate (trạng thái cũ) để kiểm tra xem tín hiệu nhận vào đã ổn định chưa rồi mới thực thi. Tuy nhiên, khi bỏ qua thời gian delay (thời gian delay trong chương trình trên = 1 xem như bỏ qua) thì công việc thực thi quá nhanh khiến người dùng không kiểm soát được. Vì vậy ta tiến hành xây dựng 1 chương trình chống dội phím khác với yêu cầu đặt ra là:

+ Thực thi công việc 1 lần ngay sau khi ấn phím.

+ Công việc chỉ thực hiện lần nữa khi nhả phím và ấn lại lần nữa.

+Khi giữ phím thì các công việc khác(các đoạn lệnh khác của chương trình) vẫn hoạt động bình thường.

Từ các yêu cầu trên, ta tham khảo giải thuật chống dội phím ở phần tiếp theo.

Page 9: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 64

3. Chống dội phím bằng phương pháp phát hiện cạnh lên.

Lưu đồ giải thuật chống dội phím:

Có Có

Bắt đầu

Đọc mức logic ở tất cả các phím, cho biết vị trí phím bị tác động

(từ 1 đến n).

Có phím bị tác động hay

không?

Phím có được ấn trước đó hay không?

Không Không

Trì hoãn 20ms

Phím đã nhả, cho phép xử lý công việc nếu lần tiếp theo có phím ấn

Báo là lần đọc này không có phím ấn

Báo hiệu là phím đang được ấn. Trả về vị trí phím đọc được để bắt đầu xử lý (xử lý xong thì không cho phép xử lý công việc này đến khi phím nhả).

Thoát Đọc mức logic ở tất cả các phím, cho biết vị trí phím bị tác động

(từ 1 đến n) lần nữa.

Có phím bị tác động hay không?

Không

Page 10: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 65

Giải thích:

Bắt đầu chương trình con đọc phím chống dội:

+Gọi hàm đọc phím: hàm này sẽ dùng hàm Button của MikroC để đọc trạng thái các chân kết nối với phím và trả về vị trí phím(ưu tiên các phím có thứ tự thấp).

+Nếu hàm trả về 0 nghĩa là hiện tại không có phím bị tác động, ta xét tiếp:

-Trước đó có phím ấn: báo là lần đọc này không có phím ấn bằng biến pr (pr=1 thì có phím ấn và bằng 0 là không có phím ấn) và thoát ra mà không trả về giá trị nào cả.

-Trước đó không có phím ấn: các phím đang ở trạng thái không bị tác động nên thoát ra mà không trả về giá trị nào cả.

+Nếu hàm trả về vị trí phím bị tác động thì tại trì hoãn 20ms sau đó gọi hàm đọc phím lần nữa.

+Nếu hàm trả về 0 nghĩa là hiện tại không có phím bị tác động, ta có thể nói lần đọc trước đó phím bị tác động là do dội cơ khí. Thoát ra mà không trả về giá trị nào cả.

+ Nếu hàm trả về vị trí phím bị tác động (không thể khác giá trị trước đó vì 20ms thì người dùng ko đủ thời gian nhả phím và ấn lại phím khác) thì khẳng định đã có phím được ấn. Thoát khỏi hàm đọc phím – chống dội và trả về vị trí phím đọc được.

Chương trình chính sẽ lấy giá trị phím đọc được đem đi xử lý. Điều kiện xử lý là:

Vị trí phím mới nhận được là số liệu mới(đã nhả phím và ấn phím).

Phải có điều kiện này là do nếu lần sau không có phím nhấn, số liệu cũ vẫn còn nên chương trình sẽ xử lý tiếp gây sai yêu cầu.

Điều kiện số liệu nhận được là số liệu mới ta thực hiện như sau:

+Sau khi thực hiện công việc xong thì xóa biến flag để báo là xử lý xong không cho phép xử lý tiếp.

+Nếu không có phím ấn nữa thì đặt lại flag để báo là đã nhả phím.

+Trước khi xử lý công việc thì kiểm tra là có phím nhấn(pr=1) và trước đó đã nhả phím (flag=1).

Sau đây là code tham khảo:

Bài 1 _ 2 _Mau: Chương trình đọc phím chống dội tham khảo

char key, pr,flag;

//HAM DOC PHIM - TRA VE VI TRI PHIM DUOC AN

Page 11: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 66

char Button_Read(){

if(Button(&PINC,0,10,0)) return 1;

if(Button(&PINC,1,10,0)) return 2;

if(Button(&PINC,2,10,0)) return 3;

if(Button(&PINC,3,10,0)) return 4;

return 0;

}

//HAM DOC PHIM VA CHONG DOI

char Button_Read_Debounce(){

char temp;

temp=Button_Read();

if(temp==0){

if(pr==1){

pr=0;

return;

}

else {

flag=1;

return;

}

}

else{

delay_ms(50);

temp=Button_Read();

if(temp==0) return;

else{

pr=1;

return temp;

}

}

}

//CHUONG TRINH CHINH

void main(){

DDRA=0xff;

DDRC=0x00;

key= Button_Read_Debounce();

if((pr!=0)&&(flag==1)){

Page 12: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 67

flag=0;

công việc ;

}

}

Thực hành kết hợp ứng dụng đọc phím và điều khiển led.

Tạo file nguồn mới với tên là BAI1_TH1. Soạn thảo và biên dịch chương trình với yêu cầu sau :

+Dùng 2 phím nhấn điều khiển 8 led.

+Khi ấn phím thứ nhất các led sáng dần từ trái sang phải rồi tắt dần từ trái sang phải.

+Khi ấn phím thứ hai thì led sáng từ 2 biên vào rồi tắt từ biên vào.

Bài tham khảo :

Bai1 _ TH: Thực hành chống dội phím và điều khiển led

char key, pr, flag, i, j;

//HAM DOC PHIM

//HAM DOC PHIM - TRA VE VI TRI PHIM DUOC AN - MUC TAC DONG PHIM LA THAP

char Button_Read(){

if(Button(&PINC,0,10,0)) return 1;

if(Button(&PINC,1,10,0)) return 2;

if(Button(&PINC,2,10,0)) return 3;

if(Button(&PINC,3,10,0)) return 4;

return 0;

}

//HAM DOC PHIM VA CHONG DOI

char Button_Read_Debounce(){

char temp;

temp=Button_Read();

if(temp==0){

if(pr==1){

pr=0;

return;

}

Page 13: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 68

else {

flag=1;

return;

}

}

else{

delay_ms(50);

temp=Button_Read();

if(temp==0) return;

else{

pr=1;

return temp;

}

}

}

//CHUONG TRINH CHINH

void main(){

DDRA=0xff;

DDRc=0x00;

while(1){

key= Button_Read_Debounce();

if((pr==1)&&(flag==1)){

flag=0;

switch(key){

case 1:

PORTA=0x00;

for(i=0;i<=7;i++){

PORTA=0x01<<i|PORTA;

delay_ms(50);

}

for(i=0;i<=7;i++){

PORTA=0xFE<<i&PORTA;

delay_ms(50);

}

break;

case 2:

PORTA=0x00;

Page 14: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 69

for(i=0;i<=3;i++){

PORTA=0x01<<i|0x80>>i|PORTA;

delay_ms(150);

}

for(i=0;i<=3;i++){

PORTA=0x7F>>i&0xFE<<i&PORTA;

delay_ms(150);

}

break;

}

}

}

}

- Thử bỏ dòng lệnh flag=0 và kiểm tra kết quả.

- Hãy viết thêm vài ứng dụng điều khiển led cho các phím còn lại

III. Thực hành các kiểu dữ liệu.

Việc sử dụng thành thạo các kiểu dữ liệu là khá quan trọng, nó giúp ta tránh các lỗi thông thường nhưng khó phát hiện (ví dụ như vòng lặp hữu hạn nhưng lại lặp vô hạn).

a. Tiến hành soạn thảo và biên dịch chương trình sau :

Bai1_3_A : Thực hành các kiểu dữ liệu

// KHAI BAO CAC BIEN KIEU NGUYEN

unsigned char _unsigned_char;

signed char _signed_char;

int _signed_short;

unsigned short _unsigned_short;

unsigned int _unsigned_int;

signed long _signed_int;

char bin[10];

char i;

// KHAI BAO CAC BIEN KIEU SO THUC

float _float;

double _double;

long _long_double;

Page 15: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 70

//CHUONG TRINH CHINH

void main(void){

// GAN CAC BIEN KIEU NGUYEN

_unsigned_char=20;

_signed_char=_unsigned_char -50;

_signed_short=255;

_unsigned_short=255;

_unsigned_int=65534;

_signed_int=65535;

// GAN CAC BIEN KIEU O THUC

_float=-255.124;

_double=-255.124;

_long_double=-235.124;

}

Dùng công cụ debuger (F9) để chạy mô phỏng chương trình rồi điền kết quả vào bảng sau :

Bảng 1 :

Biến Số byte Giá trị

_unsigned_char

_signed_char

_signed_short

_unsigned_short

_signed_int

_unsigned_int

_signed_long

_unsigned_long

Bảng 2:

Biến Số byte Giá trị

_float

Page 16: Lap Trinh Avr Voi c Www.eeelabs.org Chuong4 Bai1

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Trần Thừa – 2010 71

_double

_long_double

Các bạn hãy tự thay đổi các giá trị của các biến sau đó tiến hành debug lại chương trình, quan sát sự thay đổi các giá trị để hiểu về các kiểu dữ liệu cơ bản.