Lập trình C trong CodeVisionAVR
Hôm nay chúng ta sẽ tìm hiểu về C cho AVR, bài viết này sẽ liệt kê tất cả cách khai báo C trong CodeVisionAVR.
1. Khai báo thư viện
Ta sử dụng khai báo #include , VD: #include <delay.h> Khai báo này báo cho trình biên dịch biết lấy file thư viện trong thư mục mặc định của CAVR
Cách 2 là #include “adc.h” Khai báo này trình biên dịch sẽ tìm file trong thư mục Project của ta.
2. Khai báo tên thay thế
Ta sử dụng khai báo #define BUT PINC.5 Từ BUT sẽ thay cho PINC.5, tương tự ta có thể khai báo bất kỳ dữ liệu nào bạn muốn #define Time 400 .............
3. Khai báo kiểu dữ liệu biến
Kiểu
|
Số Byte
|
Khoảng giá trị
|
Char |
1
|
-128 – +127 |
Unsigned char |
1
|
0 – 255 |
Int |
2
|
-32768 - +32767 |
Unsigned int |
2
|
0 - 65535 |
Long |
4
|
-2147483648 - +2147483647 |
Unsigned long |
4
|
0 – 4294967295 |
Float |
4
|
VD: unsigned char time; hoặc unsigned int dem=1000; (Gán giá trị ban đầu cho biến, mặc định = 0)
Khai báo nhiều biến chung một kiểu dữ liệu unsigned char x=10, y=1, z, t;
Lưu ý: Khi sử dụng biến nếu giá trị vượt quá cho phép sẽ bị tràn và không lưu dc ví dụ như ta khai báo kiểu 8bit unsigned char mà ta muốn lưu giá trị 257 là bị tràn, ta phải dùng kiểu 16bit để chứa giá trị trên
4. Khai dữ liệu mảng
- Mảng 1 chiều: unsigned char led[10];
- Mảng 2 chiều:unsigned char led[2][10]; Công thức dữ liệu: 2x10 dữ liệu
- Mảng 3 chiều: unsigned char led[5][2][10]; Công thức dữ liệu: 5x2x10 dữ liệu - Phức tạp ít sử dụng trong lập trình
...................
Chọn bộ nhớ lưu mảng, mặc định trong trình biên dịch luôn luôn là RAM nếu bạn không khai báo gì cho nó, để tiết kiệm tài nguyên RAM cho các biến khác ta sẽ cho các mảng cố định vào trong ROM, lưu ý chỉ mảng cố định mà ta không thay đổi dữ liệu trong quá trình sử dụng.
Rất đơn giản ta thêm chữ flash vào trước khai báo ta sẽ được như sau: flash unsigned char led[10];
Truy suất mảng trong code khá là đơn giản, dữ liệu đầu tiên mang giá trị 0 vì 0 là bắt đầu chứ không phải là 1 đâu nha, VD: PORTD=led[0]; xuat gia tri đầu tiên của mảng
Với mảng 2 chiều cũng tương tự ta xuất theo công thức (trục x,y) PORTD=led[1][2]; xuat gia tri thứ 13 của mảng theo khai báo led[2][10]
Nghe có vẻ hơi khó hiểu chỗ này đúng k, ta hiểu đơn giản như sau nhóm 10 dữ liệu lại thành một nhóm lớn ở đây có 2 nhóm lớn, mỗi nhóm lớn sẽ có 10 dữ liệu bên trong như vậy ta sẽ truy suât led[1][2] tức lấy nhóm lớn thứ 2 và dữ liệu trong nhóm nằm ở vị trí thứ 3 trong mảng.
5. Khai báo bộ nhớ EEPROM
Đây là khai báo đặc biệt chỉ có trong CodeVisionAVR các phần mềm khác không hỗ trợ, với các viết sau các bạn không cần phải viết hàm lưu dữ liệu vào EEPROM nội của AVR nữa mà trình biên dịch sẽ tự động làm việc này.
Đơn giản nó chỉ là một biến, tức ta cho thể đọc và ghi vào biến này như các biến bình thường.
Khai báo như sau: eeprom unsigned char abc;
Thật là đơn giản đúng không, lúc này ta chỉ cần viết abc = 123; lưu giá trị 123 vào eeprom nội, vậy đọc ra thì sẽ như thế nào. Quá đơn giản: data = abc; data là biến lưu trong RAM và data sẽ mang giá trị 123
Còn bạn muốn chỉ định địa chỉ thì thêm @địa_chỉ VD eeprom unsigned char abc@0x02;
6. Khai báo chân giao tiếp xuất nhập
Trong AVR mỗi PORT của nó có tới 3 thanh ghi điều khiển: DDRx, PINx, PORTx Trong khi 8051 chỉ có 1, PIC có 2 phụ trách điều hướng và xuất nhập dữ liệu.
- Trong đó DDRx là thanh ghi điều hướng, set lên 1 cho bit nào là chân đó làm OUTPUT và set 0 là INPUT
- Thanh ghi PINx là thanh ghi lấy dữ liệu về dùng cho INPUT, ta sẽ đọc dữ liệu từ thanh ghi này
- Thanh ghi PORTx là thanh ghi xuất dữ liệu ra chân vi điều khiển, ta sẽ ghi mức logic vào đây
VD:
DDRD = 0xff; PORT D làm OUTPUT
PORTD = 0xff; Xuất mức 1 ra 8 chân của PORT D
abc = PIND; Đọc trạng thái logic trên PORT D lưu vào biến abc
Ta có thể sử dụng trở câu nội của AVR trong trường hợp làm INPUT bằng cách khai báo set:
DDRD = 0x00;
PORTD = 0xff;
Nếu không sử dụng trở câu toàn bộ chân AVR sẽ ở trạng thái hở. Khác hẳn với 8051 chỉ P0 là hở
CodeVisionAVR cho phép bạn set bit cho từng chân của PORT
VD: PIND.6 , PORTD.2, DDRC.3
Các bạn có thể tìm hiểu thêm một số cách set bit trong thanh ghi cũng như kiểm tra bit nào đó trong một thanh ghi VD: while(!(UCSRA & (1<<UDRE))); kiểmtra bit UDRE trong thanh ghi UCSRA
Về cơ bản ta lập trình như nhau các bạn có thể tham khảo bài sau:
http://sangtaoclub.net/bai-viet/31-ngon-ngu-lap-trinh-c-co-ban-cho-8051.html
Chúc bạn học tốt............!
Bài viết sửa lúc 29-04-2014, 12:29 bởi Vũ Văn Thái