bản đã dịch của trang avr

31
Bản đã dịch của trang AVR.doc # Include chỉ thị có thể được sử dụng để bao gồm một tập tin trong mã nguồn của bạn. Bạn có thể làm tổ như nhiều như 300 # bao gồm các tập tin. Ví dụ: / * File sẽ được xem xét trong thư mục inc / trình biên dịch. * / # Bao gồm <file_name> hoặc / * File sẽ được xem xét trong thư mục dự án hiện tại. Nếu nó không nằm ở đó, sau đó nó sẽ được bao gồm từ thư mục / inc của trình biên dịch. * / # Include "FILE_NAME" Chỉ thị # define có thể được sử dụng để xác định vĩ mô. Ví dụ: # Xác định ALFA 0xff Tuyên bố này định nghĩa "ALFA 'biểu tượng cho các giá trị 0xff . Tiền xử lý C sẽ thay thế 'ALFA với 0xff trong văn bản nguồn trước khi biên dịch. Macros cũng có thể có các thông số. Tiền xử lý sẽ thay thế các vĩ mô với sự mở rộng của nó và các thông số chính thức với những người thực sự. Ví dụ: # Xác định SUM (a, b) a + b / * Chuỗi mã sau đây sẽ được thay thế bằng int i = 2 +3 * / int i = SUM (2,3);

Upload: linh-nguyen-duc

Post on 10-Aug-2015

35 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Bản đã dịch của trang AVR

Bản đã dịch của trang AVR.doc

# Include chỉ thị có thể được sử dụng để bao gồm một tập tin trong mã nguồn của bạn.

Bạn có thể làm tổ như nhiều như 300 # bao gồm các tập tin.

Ví dụ: 

/ * File sẽ được xem xét trong thư mục inc / trình biên dịch. * /

# Bao gồm <file_name> 

hoặc 

/ * File sẽ được xem xét trong thư mục dự án hiện tại.

Nếu nó không nằm ở đó, sau đó nó sẽ được bao gồm từ

thư mục / inc của trình biên dịch. * /

# Include "FILE_NAME" 

Chỉ thị # define có thể được sử dụng để xác định vĩ mô.

Ví dụ: 

# Xác định ALFA 0xff 

Tuyên bố này định nghĩa "ALFA 'biểu tượng cho các giá trị 0xff .

Tiền xử lý C sẽ thay thế 'ALFA với 0xff trong văn bản nguồn trước khi biên dịch. 

Macros cũng có thể có các thông số. Tiền xử lý sẽ thay thế các vĩ mô với sự mở rộng của nó và các thông số chính thức với những người thực sự.

Ví dụ: 

# Xác định SUM (a, b) a + b

/ * Chuỗi mã sau đây sẽ được thay thế bằng int i = 2 +3 * /

int i = SUM (2,3); 

Khi xác định các macro, bạn có thể sử dụng toán tử # để chuyển đổi các tham số vĩ mô để một chuỗi ký tự.

Ví dụ: 

# Xác định PRINT_MESSAGE (t) printf (# t) 

/ * ...... * /

/ * Chuỗi mã sau đây sẽ được thay thế bằng printf ("Hello"); * /

PRINT_MESSAGE (Xin chào); 

Page 2: Bản đã dịch của trang AVR

Hai thông số có thể được nối bằng cách sử dụng # # điều hành.

Ví dụ: 

# Xác định ALFA (a, b) a, b # # 

/ * Chuỗi mã sau đây sẽ được thay thế bằng char xy = 1 * /

char ALFA (x, y) = 1; 

Một định nghĩa vĩ mô có thể được mở rộng để một dòng mới bằng cách sử dụng \.

Ví dụ: 

# Xác định THÔNG ĐIỆP "Điều này là rất \

dài văn bản ... " 

Một vĩ mô có thể được sử dụng không xác định # undef chỉ thị.

Ví dụ: 

# Undef ALFA 

# Ifdef, # ifndef, # else và # endif chỉ thị có thể được sử dụng để biên dịch có điều kiện.

Cú pháp là: 

# Ifdef macro_name

Báo cáo 1]

# Khác

Báo cáo 2

# Endif 

Nếu alfa 'là một tên vĩ mô được xác định, sau đó các biểu hiện # ifdef đánh giá đúng sự thật và các thiết lập báo cáo 1 sẽ được biên dịch.

Nếu không thiết lập báo cáo 2 sẽ được biên dịch.

# Khác và thiết lập các báo cáo 2 là tùy chọn.

Nếu "alfa" không được định nghĩa, # ifndef biểu hiện đánh giá đúng sự thật.

Phần còn lại của cú pháp tương tự như # ifdef. 

# If, # elif, # else và # endif chỉ thị có thể cũng được sử dụng để biên dịch có điều kiện. 

# Nếu expression1

Báo cáo 1]

# Elif expression2

Page 3: Bản đã dịch của trang AVR

Báo cáo 2

# Khác

Báo cáo 3

# Endif 

Nếu expression1 đánh giá đúng sự thật, các thiết lập báo cáo 1 sẽ được biên dịch.

Nếu expression2 đánh giá đúng sự thật, thiết lập các báo cáo 2 sẽ được biên dịch.

Nếu không thiết lập các báo cáo 3 sẽ được biên dịch.

# Khác và thiết lập các báo cáo 3 là tùy chọn. 

Có các macro được xác định trước sau đây : 

__CODEVISIONAVR__ Phiên bản và sửa đổi của trình biên dịch biểu diễn như là một ví dụ, số nguyên V2.04.7 này sẽ được 2047

__STDC__ Bằng đến 1

__LINE__ Số dòng hiện hành của các tập tin được biên dịch

__FILE__ Biên soạn tập tin hiện tại

__TIME__ Thời gian hiện tại trong hh: mm: ss định dạng

__UNIX_TIME__ Unsigned dài đại diện cho số giây trôi qua kể từ nửa đêm UTC của ngày 01 tháng 1 năm 1970, không kể giây nhuận

__DATE__ Ngày hiện tại trong mmm dd yyyy định dạng

__BUILD__ Các số xây dựng

_CHIP_ATXXXXX_ Nơi ATXXXXX là các loại chip, chữ hoa, quy định tại Dự án | Cấu hình | C Compiler | Code Generation | Chip tùychọn

_MCU_CLOCK_FREQUENCY_ Đồng hồ AVR tần số quy định trong dự án | Cấu hình | C Compiler | Code Generation | Đồng hồ lựa chọn, thể hiện là một số nguyên dài không dấu trong Hz

_MODEL_TINY_ Nếu chương trình được biên soạn bằng cách sử dụng mô hình bộ nhớ TINY

_MODEL_SMALL_ Nếu chương trình được biên soạn bằng cách sử dụng mô hình bộ nhớ NHỎ

_MODEL_MEDIUM_ Nếu chương trình được biên soạn bằng cách sử dụng mô hình bộ nhớ TRUNG

_MODEL_LARGE_ Nếu chương trình được biên soạn bằng cách sử dụng mô hình bộ nhớ LARGE

Page 4: Bản đã dịch của trang AVR

_OPTIMIZE_SIZE_ Nếu chương trình được biên dịch với tối ưu hóa kích thước ( Dự án | Cấu hình | C Compiler | Code Generation | Tối ưu hóa: Kích thước tùy chọn hoặc optsize pragma # + )

_OPTIMIZE_SPEED_ Nếu chương trình được biên dịch với tối ưu hóa cho tốc độ ( dự án | Cấu hình | C Compiler | Code Generation | Tối ưu hóa: Tốc độ tùy chọn hoặc pragma # optsize)

_WARNINGS_ON_ Nếu những lời cảnh báo được kích hoạt bởi các dự án | Cấu hình | C Compiler | Tin nhắn | Cảnh báo tùy chọn Enable hoặc # pragma cảnh báo +

_WARNINGS_OFF_ Nếu những lời cảnh báo được vô hiệu hóa bởi các dự án | Cấu hình | C Compiler | Tin nhắn | Kích hoạt tính năng cảnh báo tùy chọn hoặc # pragma cảnh báo

_PROMOTE_CHAR_TO_INT_ON_ Nếu tự động ANSI char int xúc tiến loại được kích hoạt bởi các dự án | Cấu hình | C Compiler | Code Generation | Đẩy mạnh char int tùy chọn hoặc promotechar pragma # +

_PROMOTE_CHAR_TO_INT_OFF_ Nếu ANSI tự động char int xúc tiến loại là vô hiệu hóa bởi các dự án | Cấu hình | C Compiler | Mã số thế hệ | Quảng bá char int tùy chọn hoặc # pragma promotechar -

_AVR8L_CORE_ Tín hiệu chương trình được biên dịch bằng cách sử dụng các thiết lập chính hướng dẫn giảm, được sử dụng trong các chip như ATtiny10 , ATtiny20, ATtiny40. Không ADIW, SBIW, LDD và STD hướng dẫn được tạo ra trong trường hợp này.

_ENHANCED_CORE_ Nếu chương trình được biên dịch bằng cách sử dụng các hướng dẫn lõi nâng cao có sẵn trong các chip mới của atmega

_ATXMEGA_DEVICE_ Tín hiệu rằng chương trình được biên dịch cho một loại chip ATxmega

_EXTERNAL_STARTUP_ Tín hiệu Dự án | Cấu hình | C Compiler | thế hệ luật | Sử dụng khởi tạo một tập tin khởi động bên ngoài tùy chọn được kích hoạt

_IO_BITS_DEFINITIONS_ Nếu Dự án | Cấu hình | C Compiler | Code Generation | Preprocessor | Bao gồm I / O Đăng ký Bits định nghĩa tùy chọn được kích hoạt

_SRAM_START_ Địa chỉ bắt đầu on-chip SRAM

_SRAM_END_ Địa chỉ cuối cùng của SRAM truy cập vào chương trình biên dịch, bao gồm bộ nhớ bên ngoài cuối cùng

_DSTACK_START_ Ngăn xếp dữ liệu địa chỉ bắt đầu

_DSTACK_END_ Địa chỉ cuối cùng của SRAM được phân bổ cho ngăn xếp dữ liệu

_DSTACK_SIZE_ Ngăn xếp dữ liệu kích thước quy định trong Dự án | Cấu hình | C Compiler | Code Generation | dữ liệu ngăn xếp Kíchthước tùy chọn

_HEAP_START_ Đống địa chỉ bắt đầu

Page 5: Bản đã dịch của trang AVR

_HEAP_SIZE_ Kích thước đống quy định tại Dự án | Cấu hình | C Compiler | Code Generation | Heap Kích thước tùy chọn

_UNSIGNED_CHAR_ Nếu Dự án | Cấu hình | C Compiler | Code Generation | char unsigned tùy chọn trình biên dịch được kích hoạt hoặc được sử dụng # pragma + uchar

_8BIT_ENUMS_ Nếu Dự án | Cấu hình | C Compiler | Code Generation | 8 bit enums tùy chọn trình biên dịch được kích hoạt hoặc8bit_enums pragma # + được sử dụng

_ATXMEGA_USART_ Quy định cụ thể ATxmega USART con chip được sử dụng bởi các getchar và putchar tiêu chuẩn C Chức năng đầu vào / đầu ra

_ATXMEGA_SPI_ Quy định cụ thể mà ATxmega chip SPI điều khiển được sử dụng bởi các chức năng SPI

_ATXMEGA_SPI_PORT_ Quy định cụ thể mà ATxmega con chip I / O port là được sử dụng bởi bộ điều khiển SPI. 

Chỉ thị # line có thể được sử dụng để sửa đổi được xác định trước __LINE__ và macro __FILE__.

Cú pháp là: 

# Line integer_constant ["FILE_NAME"] 

Ví dụ: 

/ * Đây sẽ thiết lập __LINE__ 50 và

__FILE__ Để "file2.c" * /

# Dòng 50 "file2.c" 

/ * Điều này sẽ thiết lập __LINE__ đến 100 * /

# Line 100 

Chỉ thị # lỗi có thể được sử dụng để ngăn chặn tiến trình biên dịch và hiển thị một thông báo lỗi.

Cú pháp là: 

# Lỗi error_message 

Ví dụ: 

# Lỗi này là một lỗi! 

Chỉ thị # cảnh báo có thể được sử dụng để hiển thị một thông điệp cảnh báo.

Cú pháp là: 

# Cảnh báo warning_message 

Ví dụ: 

Page 6: Bản đã dịch của trang AVR

# Cảnh báo này là một cảnh báo! 

Chỉ thị # tin nhắn có thể được sử dụng để hiển thị một cửa sổ hộp thoại tin nhắn trong IDE CodeVisionAVR.

Cú pháp là: 

# Nhắn general_message 

Ví dụ: 

# Xin chào thế giới tin nhắn

* Đây là một nhận xét * /

/ * Đây là một

nhiều dòng chú thích * / 

Một dòng bình luận cũng có thể được định nghĩa bằng cách sử dụng chuỗi "/ / ".

Ví dụ: 

/ / Đây cũng là một bình luận 

Ý kiến lồng nhau không được phép. 

  __eeprom

__flash

__interrupt

__task

_Bool

phá vỡ

bit

bool

trường hợp

char

const

tiếp tục

mặc định

xác định

làm

đôi

Page 7: Bản đã dịch của trang AVR

eeprom

khác

enum

ở ngoai

đèn flash

phao

cho

goto

nếu

nội tuyến

int

gián đoạn

dài

đăng ký

trở lại

ngắn

đã ký

sizeof

sfrb

sfrw

tĩnh

struct

chuyển đổi

typedef

công đoàn

unsigned

khoảng trống

bay hơi

trong khi

Page 8: Bản đã dịch của trang AVR

Hằng số chương trình có thể được khai báo là toàn cầu (có thể truy cập đến tất cả các chức năng trong chương trình) hoặc địa phương (truy cập chỉ trong các chức năng chúng được khai báo) .

Tờ khai liên tục cú pháp là tương tự như của các biến, nhưng trước bởi từ khóa const : 

const <type definition> <identifier> = biểu hiện liên tục; 

Ví dụ: 

/ * Khai báo hằng số toàn cầu * /

const char char_constant = 'a';

const int b = 1234 5;

const dài long_int_constant1 = 99L;

const dài long_int_constant2 = 0x10000000;

const float pi = 3,14; 

void main (void) {

/ * Địa phương khai báo hằng số * /

const dài f = 22222222;

const float x = 1,5; 

Hằng số có thể được nhóm lại thành mảng, có thể có tối đa đến 64 kích thước.

Yếu tố đầu tiên của một mảng luôn là 0 chỉ số .

Ví dụ: 

const char string_constant2 [] = "Đây là một chuỗi liên tục";

const int abc [3] = {1,2,3};

/ * Hai yếu tố đầu tiên sẽ là 1 và 2,

phần còn lại sẽ là 0 * /

const int integer_array2 [10] = {1,2};

/ * Mảng đa chiều * /

const int multidim_array [2] [3] = {{1,2,3}, {4,5,6}}; 

Nếu Dự án | Cấu hình | C Compiler | Code Generation | Lưu trữ hằng số toàn cầu trong bộ nhớ FLASH tùy chọn được kích hoạt, các hằng số toàn cầu đã được khai báo bằng cách sử dụng từ khóa const sẽ được đặt bởi trình biên dịch bộ nhớ trong Flash.

Page 9: Bản đã dịch của trang AVR

Nếu tùy chọn ở trên là không được kích hoạt, các hằng số toàn cầu tuyên bố bằng cách sử dụng từ khóa const sẽ được đặt trong bộ nhớ RAM.

Hằng số địa phương sẽ luôn luôn được đặt trong bộ nhớ RAM. 

Đèn flash hoặc __flash các từ khóa có thể được sử dụng để xác định một hằng số phải được đặt bộ nhớ trong Flash, không có vấn đề nhànước của các hằng số cửa hàng toàn cầu trong tùy chọn bộ nhớ FLASH là những gì: 

đèn flash <type definition> <identifier> = biểu hiện liên tục;

__flash <type definition> <identifier> = biểu hiện liên tục; 

Ví dụ: 

đèn flash int integer_constant = 1234 5;

đèn flash char char_constant = 'a';

đèn flash dài long_int_constant1 = 99L;

đèn flash dài long_int_constant2 = 0x10000000;

đèn flash int integer_array1 [] = {1,2,3};

đèn flash char string_constant1 [] = "Đây là một chuỗi liên tục nằm trong Flash"; 

Các chuỗi liên tục char đen, kèm theo trong dấu ngoặc kép, được thông qua như là đối số chức năng, được lưu trữ trong các loại bộ nhớ được trỏ bởi con trỏ được sử dụng như một tham số chức năng.

Ví dụ: 

/ * Chức năng này hiển thị một chuỗi nằm trong bộ nhớ RAM. * /

void display_ram (char * s) { 

/ * ....... * / 

/ * Chức năng này hiển thị một chuỗi nằm trong FLASH. * /

void display_flash (đèn flash char * s) { 

/ * ....... * / 

/ * Chức năng này hiển thị một chuỗi nằm trong EEPROM. * /

void display_eeprom (eeprom char * s) { 

/ * ....... * / 

void main (void) {

Page 10: Bản đã dịch của trang AVR

/ * Chuỗi chữ "Xin chào thế giới" sẽ được đặt

bởi trình biên dịch bộ nhớ trong Flash và sao chép của chương trình

khởi động vào bộ nhớ RAM, do đó, nó có thể được truy cập bởi con trỏ

RAM được sử dụng như một tham số chức năng .

Hiệu suất đang thấp, bởi vì cả hai FLASH và

Những kỷ niệm RAM được sử dụng cho việc lưu trữ chuỗi. * /

display_ram ("Hello world"); 

/ * Chuỗi chữ "Xin chào thế giới" sẽ được đặt

bởi trình biên dịch bộ nhớ trong Flash chỉ, mã tốt

hiệu quả beeing đạt được. * /

display_flash ("Hello world"); 

/ * Chuỗi chữ "Xin chào thế giới" sẽ được đặt

bởi trình biên dịch chỉ trong bộ nhớ EEPROM.

Hiệu quả mã là rất tốt bởi vì không có

Bộ nhớ Flash sẽ được phân bổ cho chuỗi. * /

display_eeprom ("Hello world"); 

trong khi (1) ;

}

Các không gian được phân bổ cho các cấu trúc trong bộ nhớ bằng tổng hợp các kích thước của tất cả các thành viên. 

Cùng một kiểu cấu trúc chung có thể được tuyên bố trong bất kỳ loại bộ nhớ: RAM, Flash hay EEPROM: 

/ * Generic loại cấu trúc * /

struct my_structure {

char a, b;

int c;

char d [30], [10];

char * pp;

}; 

/ * Cấu trúc toàn cầu nằm trong bộ nhớ RAM * /

struct my_structure sr; 

Page 11: Bản đã dịch của trang AVR

/ * Con trỏ toàn cầu nằm trong bộ nhớ RAM để cấu trúc bộ nhớ RAM nằm * /

struct my_structure * ptrsr = &sr; 

/ * Con trỏ toàn cầu nằm trong Flash để cấu trúc bộ nhớ RAM nằm * /

struct my_structure * đèn flash ptrfsr = &sr; 

/ * Con trỏ toàn cầu nằm trong EEPROM để cấu trúc bộ nhớ RAM nằm * /

struct my_structure * eeprom ptresr = &sr; 

/ * Cấu trúc toàn cầu liên tục nằm trong Flash * /

đèn flash struct my_structure sf = {0,0,0, {0} {0}, 0}; 

/ * Con trỏ toàn cầu nằm trong bộ nhớ RAM các cấu trúc nằm FLASH * /

đèn flash struct my_structure ptrsf = &sf; 

/ * Con trỏ toàn cầu nằm trong Flash cấu trúc FLASH nằm * /

đèn flash struct my_structure * đèn flash ptrfsf = &sf; 

/ * Con trỏ toàn cầu nằm trong EEPROM cấu trúc FLASH nằm * /

đèn flash struct my_structure * eeprom ptresf = &sf; 

/ * Cấu trúc toàn cầu liên tục nằm trong EEPROM * /

eeprom struct my_structure se; 

/ * Con trỏ toàn cầu nằm trong bộ nhớ RAM các cấu trúc nằm EEPROM * /

eeprom struct my_structure * ptrse = &se; 

/ * Con trỏ toàn cầu nằm trong Flash cấu trúc nằm EEPROM * /

eeprom struct my_structure * đèn flash ptrfse = &se; 

/ * Con trỏ toàn cầu nằm trong EEPROM cấu trúc nằm EEPROM * /

eeprom struct my_structure * eeprom ptrese = &se; 

void main (void) {

/ * Địa phương cấu trúc * /

struct my_structure sl;

/ * Địa phương con trỏ trỏ tới bộ nhớ RAM nằm cấu trúc toàn cầu * /

struct my_structure * ptrlsr = &sr;

/ * Con trỏ địa phương FLASH nằm ở cấu trúc toàn cầu * /

đèn flash struct my_structure ptrlsf = &sf;

/ * Con trỏ địa phương để cơ cấu toàn cầu đặt EEPROM * /

Page 12: Bản đã dịch của trang AVR

eeprom struct my_structure * ptrlse = &se; 

/ * ............. * / 

Các cấu trúc có thể được nhóm lại trong mảng.

Ví dụ làm thế nào để khởi tạo và truy cập vào một mảng cấu trúc toàn cầu được lưu trữ trong EEPROM: 

/ * Mảng cấu trúc toàn cầu nằm trong EEPROM * /

eeprom struct eeprom_structure {

char a;

int b;

char c [15];

} Se [2 ]={{' a ', 25, "Hello"},

{'B', 50, "thế giới"}}; 

void main (void) {

char k1, k2, k3, K4;

int i1, i2; 

/ * Định nghĩa một con trỏ đến cấu trúc * /

struct eeprom_structure eeprom * ep; 

/ * Truy cập trực tiếp đến các thành viên cấu trúc * /

k1 = se [0] a;

i1 = se [0] b;

k2 = se [0] c [2].

k3 = se [1] a;

i2 = se [1] b;

K4 = se [1] c [2]. 

/ * Truy cập cùng một cấu trúc cho các thành viên bằng cách sử dụng một con trỏ * /

ep = &se; / * khởi tạo con trỏ với cấu trúc địa chỉ * /

k1 = ep-> a;

i1 = ep-> b;

k2 = ep-> c [2];

Page 13: Bản đã dịch của trang AVR

+ + Ep / * tăng con trỏ * /

k3 = ep-> a;

i2 = ep-> b;

K4 = ep-> c [2];

Bởi vì một số thiết bị AVR có một số lượng nhỏ bộ nhớ RAM, để giữ cho kích thước của Stack   dữ liệu  nhỏ, nó được khuyến khích không để vượt qua các cấu trúc như các thông số chức năng và sử dụng con trỏ cho mục đích này.

Ví dụ: 

cấu trúc alpha {

int a, b, c;

} S = {2,3};

/ * Xác định các chức năng * /

cấu trúc alpha * sum_struct (struct alpha * sp) {

/ * Thành viên c = thành viên a + thành viên b * /

sp-> c = sp-> a + sp-> b;

/ * Trả về một con trỏ đến cấu trúc * /

trở lại sp;

}

void main (void) {

int i;

/ * S-> c = s-> a + s-> b * /

/ * I = s-> c * /

i = sum_struct (s) -> c;

Cơ cấu thành viên có thể được khai báo là các lĩnh vực bit, có chiều rộng 1-32.

Các lĩnh vực bit được phân bổ theo thứ tự kê khai, bắt đầu từ bit ít quan trọng .

Ví dụ: 

/ * Cấu trúc này sẽ chiếm 1 byte trong bộ nhớ RAM

là lĩnh vực kiểu dữ liệu bit là unsigned char * /

struct alpha1 {

Page 14: Bản đã dịch của trang AVR

unsigned char a: 1; / * bit 0 * /

unsigned char b: 4; / * bit 1 .. 4 * /

unsigned char c: 3; / * bit 5 .. 7 * /

}; 

/ * Cấu trúc này sẽ chiếm 2 byte trong RAM

lĩnh vực kiểu bit dữ liệu là int * /

struct Alpha2 {

unsigned int a: 2; / * bit 0 .. 1 * /

unsigned int b: 8; / * bit 2 .. 9 * /

unsigned int c: 4; / * bit 10 .. 13 * /

/ * Bit 14 .. 15 không được sử dụng * /

}; 

/ * Cấu trúc này sẽ chiếm 4 byte trong bộ nhớ RAM

như lĩnh vực kiểu dữ liệu bit là unsigned long * /

struct alpha3 {

unsigned long: 10; / * bit 0 .. 9 * /

unsigned long b: 8; / * bit 10 .. 17 * /

unsigned long c: 6; / * bit 18 .. 23 * /

/ * Bit 24 .. 31 không được sử dụng * /

};

Các không gian được phân bổ cho các công đoàn trong bộ nhớ bằng với kích thước của các thành viên lớn nhất.

Thành viên công đoàn có thể được truy cập trong cùng một cách là thành viên cấu trúc. Ví dụ: 

/ * Đoàn khai báo * /

công đoàn alpha {

LSB unsigned char;

từ unsigned int;

} Dữ liệu;

 

void main (void) {

Page 15: Bản đã dịch của trang AVR

unsigned char k; 

/ * Định nghĩa một con trỏ đến các công đoàn * /

công đoàn alpha * dp; 

/ * Truy cập trực tiếp để đoàn viên * /

data.word = 0x1234;

k = data.lsb; / * nhận được LSB của 0x1234 * / 

/ * Truy cập cùng một đoàn viên bằng cách sử dụng một con trỏ * /

dp = &data; / * khởi tạo con trỏ với địa chỉ của nghiệp đoàn * /

dp-> word = 0x1234;

k = dp-> LSB; / * nhận được LSB của 0x1234 * /

Bởi vì một số thiết bị AVR có một số lượng nhỏ bộ nhớ RAM, để giữ cho kích thước của Stack   dữ liệu  nhỏ, nó được khuyến khích không để vượt qua các đoàn thể như các thông số chức năng và sử dụng con trỏ cho mục đích này .

Ví dụ: 

# Bao gồm <stdio.h> / * printf * /

công đoàn alpha {

LSB unsigned char;

từ unsigned int;

} Dữ liệu;

/ * Xác định các chức năng * /

unsigned char thấp (công đoàn alpha lên) {

/ * Trả lại LSB của từ * /

trở lại lên-> LSB;

}

void main (void) {

data.word = 0x1234;

printf ("LSB x%% 2x", data.word, thấp (dữ liệu));

Liên minh các thành viên có thể được khai báo là các lĩnh vực bit, có chiều rộng 1-32.

Page 16: Bản đã dịch của trang AVR

Các lĩnh vực bit được phân bổ theo thứ tự kê khai, bắt đầu từ bit ít quan trọng .

Ví dụ: 

/ * Đoàn này sẽ chiếm 1 byte trong bộ nhớ RAM

là lĩnh vực kiểu dữ liệu bit là unsigned char * /

công đoàn alpha1 {

unsigned char a: 1; / * bit 0 * /

unsigned char b: 4; / * bit 0 .. 3 * /

unsigned char c: 3; / * bit 0 .. 2 * /

}; 

/ * Đoàn này sẽ chiếm 2 byte trong bộ nhớ RAM

lĩnh vực kiểu bit dữ liệu là int * /

công đoàn Alpha2 {

unsigned int a: 2; / * bit 0 .. 1 * /

unsigned int b: 8; / * bit 0 .. 7 * /

unsigned int c: 4; / * bit 0 .. 3 * /

/ * Bit 8 .. 15 không được sử dụng * /

}; 

/ * Đoàn này sẽ chiếm 4 byte trong bộ nhớ RAM

như lĩnh vực kiểu dữ liệu bit là unsigned long * /

công đoàn alpha3 {

unsigned long: 10; / * bit 0 .. 9 * /

unsigned long b: 8; / * bit 0 .. 7 * /

unsigned long c: 6; / * bit 0 .. 5 * /

/ * Bit 10 .. 31 không được sử dụng * /

};

Các loại liệt kê dữ liệu có thể được sử dụng để cung cấp nhận dạng dễ nhớ cho một tập hợp các giá trị char hoặc int.

Các từ khóa enum được sử dụng cho mục đích này.

Cú pháp là: 

[<memory Attribute>] [<storage modifier>] enum [<enum tag-name>] {

Page 17: Bản đã dịch của trang AVR

[<constant-name[[=constant-initializer], Constant-name, ...]>]}

[<enum Variables>]; 

Ví dụ: 

/ * Các hằng số liệt kê sẽ được khởi tạo như sau :

chủ nhật = 0, thứ hai = 1, thứ ba = 2 ,..., Thứ bảy = 6 * /

enum ngày {

chủ nhật, thứ hai, thứ ba, thứ tư,

Thứ năm, thứ sáu, thứ bảy} days_of_week; 

/ * Các hằng số liệt kê sẽ được khởi tạo như sau :

Tháng Một = 1, Tháng hai = 2, diễu = 3 ,..., Tháng Mười Hai = 12 * /

enum tháng {

= 1 tháng một, tháng hai, tháng ba, tháng tư, có thể, tháng sáu,

tháng bảy, tháng tám, tháng chín, tháng mười, tháng mười một, Tháng mười hai}

months_of_year;

 

void main {

/ * Days_of_week biến được khởi tạo với

giá trị số nguyên 6 * /

days_of_week = thứ bảy;

Liệt kê có thể được lưu trữ trong bộ nhớ RAM, EEPROM hoặc FLASH.

Eeprom hoặc các thuộc tính bộ nhớ __eeprom phải được sử dụng để xác định lưu trữ liệt kê trong EEPROM .

Ví dụ: 

ngày tại eeprom enum {

chủ nhật, thứ hai, thứ ba, thứ tư,

Thứ năm, thứ sáu, thứ bảy} days_of_week; 

Các bộ nhớ flash hoặc các thuộc tính __flash phải được sử dụng để xác định lưu trữ liệt kê trong bộ nhớ FLASH.

Ví dụ: 

Page 18: Bản đã dịch của trang AVR

tháng tại đèn flash enum {

Tháng một, tháng hai, tháng ba, tháng tư, có thể, tháng sáu,

tháng bảy, tháng tám, tháng chín, tháng mười, tháng mười một,

Tháng mười hai}

months_of_year;

bit <identifier>; 

Ví dụ: 

/ * Khai báo và khởi tạo một chip ATtiny2313

có GPIOR0, GPIOR1 và GPIOR2 đăng ký * /

bit alfa = 1; / * Bit0 của GPIOR0 * /

bit beta; / * Bit1 GPIOR0 * / 

void main (void)

{

nếu (alfa) beta = beta; 

/ * ........ * /

Cấp phát bộ nhớ cho các biến bit toàn cầu được thực hiện, trình tự kê khai, bắt đầu với các bit 0 của GPIOR0, sau đó bit 1 của GPIOR0 và như vậy, thứ tự tăng dần .

Sau khi tất cả các đăng ký GPIOR được phân bổ, các biến bit tiếp tục được phân bổ trong R2 đến R14 .

Nếu chip không có đăng ký GPIOR, phân bổ trực tiếp bắt đầu từ đăng ký R2. 

Kích thước của các biến bit toàn cầu được phân bổ cho chương trình có thể được quy định tại các dự án | Cấu hình | C Compiler | Code Generation | Bit biến Kích thước hộp danh sách .

Kích thước này nên càng thấp càng tốt, để đăng ký miễn phí để phân bổ vào các biến toàn cầu khác.

Nếu không được khởi tạo, các biến bit toàn cầu sẽ được tự động thiết lập là 0 tại chương trình khởi động. 

Trình biên dịch cho phép khai báo lên đến 8 bit biến địa phương sẽ được phân bổ trong sổ đăng ký R15.

Ví dụ: 

void main (void)

{

Page 19: Bản đã dịch của trang AVR

bit alfa; / * bit 0 của R15 * /

bit beta; / * bit 1 của R15 * /

/ * ........ * /

Trong các biến bit đánh giá biểu hiện tự động thăng unsigned char

Các biến toàn cầu có thể được lưu trữ tại SRAM và EEPROM cụ thể địa điểm tại thời gian thiết kế bằng cách sử dụng các nhà điều hành @.

Ví dụ: 

/ * Biến số nguyên "a" được lưu trữ

trong RAM tại địa chỉ 80h tới * /

int a @ 0x80; 

/ * Cấu trúc "alfa" được lưu trữ

trong RAM tại địa chỉ 90h * /

struct s1 {

int a;

char c;

} Alfa @ 0x90; 

/ * Biến float "b" được lưu trữ

EEPROM tại địa chỉ 10h * /

eeprom float b @ 0x10; 

/ * Cấu trúc "beta" được lưu trữ

trong RAM tại địa chỉ 20h * /

eeprom struct s2 {

int i;

lâu j;

} Beta @ 0x20; 

Các thủ tục sau đây phải được sử dụng nếu một biến toàn cầu, được đặt tại một địa chỉ cụ thể bằng cách sử dụng các nhà điều hành @, phải được khởi tạo trong quá trình khai báo: 

/ * Biến sẽ được lưu trữ trong bộ nhớ RAM tại địa chỉ 0x182 * /

nổi pi @ 0x182;

Page 20: Bản đã dịch của trang AVR

/ * Và nó sẽ được khởi tạo với giá trị 3,14 * /

nổi pi = 3,14; 

/ * Biến sẽ được lưu trữ trong EEPROM tại địa chỉ 0x10 * /

eeprom int abc @ 0x10;

/ * Và nó sẽ được khởi tạo với giá trị 123 * /

eeprom int abc = 123;

một trong các toán hạng là kiểu float sau đó các toán hạng khác được chuyển đổi cùng loại . 

Nếu một trong các toán hạng là kiểu int dài dài int hoặc unsigned sau đó các toán hạng khác được chuyển đổi cùng loại. 

Nếu không, nếu một trong các toán hạng là kiểu int unsigned int hoặc sau đó các toán hạng khác được chuyển đổi cùng loại. 

Vì vậy loại hoặc kiểu char unsigned char được ưu tiên thấp nhất. 

Sử dụng đúc, bạn có thể thay đổi các quy tắc này .

Ví dụ: 

void main (void) {

int a, c;

dài b;

/ * B số nguyên dài biến sẽ được điều trị ở đây là một số nguyên * /

c = a + (int) b;

Điều quan trọng là cần lưu ý rằng nếu các dự án | Cấu hình | C Compiler | Mã số thế hệ | Đẩy mạnh char int tùy chọn không được chọn hoặc không được sử dụng # pragma promotechar +, char tương ứng unsigned char, phép toán loại không tự động thúc đẩy int, tương ứngint unsigned, như trong các trình biên dịch nhắm mục tiêu cho 16 hoặc 32 bit CPU.

Điều này giúp viết nhiều kích cỡ và tốc độ mã hiệu quả cho một CPU 8 bit như AVR .

Để ngăn chặn tràn ngày 8 Ngoài ra bit hay nhân, đúc có thể được yêu cầu .

Trình biên dịch các vấn đề cảnh báo trong những tình huống này.

Ví dụ: 

void main (void) {

unsigned char a = 30;

Page 21: Bản đã dịch của trang AVR

unsigned char b = 128;

unsigned int c; 

/ * Điều này sẽ tạo ra một kết quả không chính xác, bởi vì các nhân

được thực hiện trên 8 bit sản xuất một kết quả 8 bit, mà tràn .

Chỉ sau khi các nhân kết quả 8 bit được thăng chức

unsigned int * /

c = a * b; 

/ * Đúc lực lượng nhân được thực hiện trên 16 bit,

sản xuất một kết quả 16 bit, mà không tràn * /

c = (unsigned int) a * b;

Trình biên dịch sẽ cư xử khác nhau cho các nhà khai thác sau đây:

+ =

-=

*=

/ =

% =

& =

| =

^ =

<<=

>> = 

Đối với các nhà khai thác này, kết quả là được viết lại vào toán hạng bên trái (có phải là một biến ). Vì vậy, các trình biên dịch sẽ chuyển đổi toán hạng bên phải tay vào các loại toán hạng bên trái.

Trình biên dịch sử dụng các từ khóa sfrb và sfrw để truy cập các vi điều khiển AVR Đăng ký I / O, bằng cách sử dụng IN và OUT hướngdẫn lắp ráp.

Ví dụ: 

/ * Xác định các SFR * /

sfrb Pina = 0x19; / * 8 bit truy cập vào các SFR * /

sfrw TCNT1 = 0x2c; / * 16 bit truy cập SFR * / 

Page 22: Bản đã dịch của trang AVR

void main (void) {

unsigned char a;

Pina =; / * Đọc Porta chân đầu vào * /

TCNT1 = 0x1111; / * Viết thư để đăng ký TCNT1L & TCNT1H * /

Đối với chip ATxmega cú pháp sau đây phải được sử dụng : 

/ * I / O đăng ký định nghĩa cho các chip ATxmega128A1 * /

# Bao gồm <xmega128a1.h> 

void main (void) {

unsigned char a;

/ * Thiết lập tất cả các chân Porta như là đầu vào * /

PORTA.DIR = 0x00;

/ * Đọc Porta chân đầu vào * /

một PORTA.IN =;

/ * Thiết lập tất cả các chân PORTB như kết quả đầu ra * /

PORTB.DIR = 0xFF;

/ * Ghi dữ liệu kết quả đầu ra PORTB * /

PORTB.OUT = 0x11;

/ * Thiết lập PORTB pin 2-1 * /

PORTB.OUTSET = 1 <<2;

/ * Thiết lập PORTB pin 4-0 * /

PORTB.OUTCLR = 1 <<4;

/ * Chuyển đổi PORTB pin 0 * /

PORTB.OUTTGL = 1 <<0;

ATxmega cổng I / O có thể được truy cập bằng cách sử dụng các cổng ảo: 

/ * I / O đăng ký định nghĩa cho các chip ATxmega128A1 * /

# Bao gồm <xmega128a1.h> 

void main (void) {

unsigned char a;

Page 23: Bản đã dịch của trang AVR

/ * Bản đồ Porta ảo cổng VPORT0

PORTB để ảo cổng VPORT1 * /

PORTCFG.VPCTRLA = PORTCFG_VP1MAP_PORTB_gc | PORTCFG_VP0MAP_PORTA_gc;

/ * Đặt tất cả các VPORT0 (Porta) chân như đầu vào * /

VPORT0_DIR = 0x00;

/ * Đọc VPORT0 (Porta) đầu vào chân * /

một VPORT0_IN =;

/ * Đặt tất cả các VPORT1 (PORTB) chân như các kết quả đầu ra * /

VPORT1_DIR = 0xFF;

/ * Ghi dữ liệu VPORT1 (PORTB) kết quả đầu ra * /

VPORT1_OUT = 0x11;

/ * Thiết lập VPORT1 (PORTB) pin 2-1 * /

VPORT1_OUT | = 1 <<2;

/ * Thiết lập VPORT1 (PORTB) pin 4-0 * /

VPORT1.OUT & = 1 <<4;

/ * Chuyển VPORT1 (PORTB) pin 0 * /

VPORT1_OUT ^ = 1 <<0;

Thông tin chi tiết về truy cập vào các cổng I / O cho các chip ATxmega có thể được tìm thấy trong các tài liệu Atmel sau đây:

· AVR1000: Bắt đầu viết mã cho C-XMEGA

AVR XMEGA A Manual

AVR XMEGA D bằng tay.

Nếu một trong các toán hạng kiểu float sau đó các toán hạng khác được chuyển đổi cùng loại. 

Nếu một trong các toán hạng là kiểu int dài dài int hoặc unsigned sau đó các toán hạng khác được chuyển đổi cùng loại. 

Nếu không, nếu một trong các toán hạng là kiểu int unsigned int hoặc sau đó các toán hạng khác được chuyển đổi cùng loại. 

Vì vậy loại hoặc kiểu char unsigned char được ưu tiên thấp nhất. 

Sử dụng đúc, bạn có thể thay đổi các quy tắc này .

Page 24: Bản đã dịch của trang AVR

Ví dụ: 

void main (void) {

int a, c;

dài b;

/ * B số nguyên dài biến sẽ được điều trị ở đây là một số nguyên * /

c = a + (int) b;

Điều quan trọng là cần lưu ý rằng nếu các dự án | Cấu hình | C Compiler | Mã số thế hệ | Đẩy mạnh char int tùy chọn không được chọn hoặc không được sử dụng # pragma promotechar +, char tương ứng unsigned char, phép toán loại không tự động thúc đẩy int, tương ứngint unsigned, như trong các trình biên dịch nhắm mục tiêu cho 16 hoặc 32 bit CPU.

Điều này giúp viết nhiều kích cỡ và tốc độ mã hiệu quả cho một CPU 8 bit như AVR .

Để ngăn chặn tràn ngày 8 Ngoài ra bit hay nhân, đúc có thể được yêu cầu .

Trình biên dịch các vấn đề cảnh báo trong những tình huống này.

Ví dụ: 

void main (void) {

unsigned char a = 30;

unsigned char b = 128;

unsigned int c; 

/ * Điều này sẽ tạo ra một kết quả không chính xác, bởi vì các nhân

được thực hiện trên 8 bit sản xuất một kết quả 8 bit, mà tràn .

Chỉ sau khi các nhân, kết quả 8 bit được thăng chức

unsigned int * /

c = a * b; 

/ * Đúc lực lượng nhân được thực hiện trên 16 bit,

sản xuất một kết quả 16 bit, mà không tràn * /

c = (unsigned int) a * b;

Trình biên dịch sẽ cư xử khác nhau cho các nhà khai thác sau đây:

+ =

Page 25: Bản đã dịch của trang AVR

-=

*=

/ =

% =

& =

| =

^ =

<<=

>> = 

Đối với các nhà khai thác này, kết quả là được viết lại vào toán hạng bên trái (có phải là một biến ). Vì vậy, các trình biên dịch sẽ chuyển đổi toán hạng tay bên phải vào loại của toán hạng bên trái