Lê Trung Thắng © Copyright 2008 Lê Trung Thắng Visit: www.dientuvienthong.net or www.dientuvietnam.net VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng “Con người nhờ ước mơ mà vĩ đại” … Tài liệu trước seminar vi điều khiển AVR vào khoảng cuối năm 2007, lúc đầu ghi chép sổ tay để ghi nhớ, đến lúc xong seminar thấy AVR thú vị, nên chỉnh sửa lại ghi chép để soạn thành tài liệu Có lẻ quen với họ 8051 Atmel sản xuất, nên chuyển sang AVR cảm thấy quen thuộc Mục đích mà tơi viết tài liệu để chia sẻ với bạn có sở thích AVR, qua tạo cộng đồng AVR-Friends thật đông đảo sôi Một cộng đồng AVR đơng đảo có ích cho tơi cho bạn, có nhiều hội để trao đổi học hỏi Tài liệu muốn gởi tặng em trai Lê Trung Thông, hy vọng em bổ sung cho anh phần cịn thiếu tài liệu Toàn tài liệu chủ yếu dịch từ datasheet Atmega128, khơng có nhiều thời gian nên tài liệu cịn thiếu nhiều phần, nên hi vọng bạn có kinh nghiệm AVR tiếp tục bổ sung, chỉnh sửa để có tài liệu hồn chỉnh hơn, cần, tơi gởi file word cho bạn để tiện lợi cho việc bổ sung, chỉnh sửa (mail to: thangvl2a@yahoo.com) Sài Gòn, 08-2008 Lê Trung Thắng ĐTVT - K2002 ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Mục Lục: Chương I TỔNG QUAN Chương II -CẤU TRÚC BỘ NHỚ VÀ CỔNG VÀO - RA Chương III BỘ ĐỊNH THỜI CỦA ATmega128 Chương IV CẤU TRÚC NGẮT CỦA ATmega128 Chương V -CÁC BỘ PHẬN NGOẠI VI KHÁC Chương VI -HỆ THỐNG XUNG CLOCK VÀ LẬP TRÌNH BỘ NHỚ ON-CHIP Chương VI - LẬP TRÌNH AVR BẰNG NGÔN NGỮ C ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Chương I TỔNG QUAN Những Tính Năng Chính Của ATmega128: ROM : 128 Kbytes SRAM: 4Kbytes EEPROM : 4Kbytes 64 ghi I/O 160 ghi vào mở rộng 32 ghi đa mục đích định thời bit (0,2) định thời 16 bit (1,3) Bộ định thời watchdog Bộ dao động nội RC tần số MHz, MHz, MHz, MHz ADC kênh với độ phân giải 10 bit (Ở dòng Xmega lên tới 12 bit ) kênh PWM bit kênh PWM lập trình thay đổi độ phân giải từ tới 16 bit Bộ so sánh tương tự lựa chọn ngõ vào Hai khối USART lập trình Khối truyền nhận nối tiếp SPI Khối giao tiếp nối tiếp dây TWI Hỗ trợ boot loader chế độ tiết kiệm lượng Lựa chọn tần số hoạt động phần mềm Đóng gói 64 chân kiểu TQFP Tần số tối đa 16MHz Điện : 4.5v - 5.5v …v.v… Vi điều khiển AVR hãng Atmel ( Hoa Kì ) sản xuất gới thiệu lần đầu năm 1996 AVR có nhiều dịng khác bao gồm dòng Tiny AVR ( AT tiny 13, AT tiny 22…) có kích thước nhớ nhỏ, phận ngoại vi, đến dòng AVR ( chẳn hạn AT90S8535, AT90S8515,…) có kích thước nhớ vào loại trung bình mạnh dịng Mega ( ATmega32, ATmega128,…) với nhớ có kích thước vài Kbyte đến vài trăm Kb với ngoại vi đa dạng tích hợp chip, có dịng tích hợp LCD chip ( dịng LCD AVR ) Tốc độ dòng Mega cao so với dòng khác Sự khác dịng chình cấu trúc ngoại vi, cịn nhân nhau, Hình 1.1 Đặt biệt, năm 2008, Atmel lại tiếp tục cho đời dòng AVR XmegaAVR, với tính mạnh mẽ chưa có dịng AVR trước Có thể nói XmegaAVR dịng MCU bit mạnh mẽ ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Hình1.1 Các dịng AVR khác nhau: Tiny, AVR Mega Cấu trúc vi điều khiển AVR thể hình 1.2 Hình 1.2 Cấu trúc Vi điều khiển AVR ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Chương II CẤU TRÚC BỘ NHỚ VÀ CỔNG VÀO - RA I CẤU TRÚC BỘ NHỚ Giới Thiệu: Bộ nhớ vi điều khiển AVR có cấu trúc Harvard cấu trúc có đường Bus riêng cho nhớ chương trình nhớ liệu Bộ nhớ AVR chia làm phần chính: Bộ nhớ chương trình ( program memory ) nhớ liệu ( Data memory ) Bộ Nhớ Chương Trình : Bộ nhớ chương trình AVR nhớ Flash có dung lượng 128 K bytes Bộ nhớ chương trình có độ rộng bus 16 bit Những địa nhớ chương trình dùng cho bảng véc tơ ngắt ( xem chi tiết bảng véc tơ ngắt chương ) Cần để ý vi điều khiển ATmega128 nhớ chương trình cịn chia làm phần : phần boot loader ( Boot loader program section ) phần ứng dụng ( Application program section ) Phần boot loader chứa chương trình boot loader Chương trình Boot loader phần mềm nhỏ nạp vi điều khiển chạy lúc khởi động Phần mềm tải vào vi điều khiển chương trình người sử dụng sau thực thi chương trình Mỗi reset vi điều khiển CPU nhảy tới thực thi chương trình boot loader trước, chương trình boot loader dị xem có chương trình cần nạp vào vi điều khiển hay khơng, có chương trình cần nạp, boot loader nạp chương trình vào vùng nhớ ứng dụng (Application program section ), thực thi chương trình Ngược lại, boot loader chuyển tới chương trình ứng dụng có sẵn vùng nhớ ứng dụng để thực thi chương trình Phần ứng dụng (Application program section ) vùng nhớ chứa chương trình ứng dụng người dùng Kích thước phần boot loader phần ứng dụng tùy chọn Hình 2.1 thể cấu trúc nhớ chương trình có sử dụng không sử dụng boot loader, sử dụng phần boot loader ta thấy word thay thị cho CPU chuyển tới chương trình ứng dụng người dùng (là chương trình có nhãn start ) thị CPU nhảy tới phần chương trình boot loader để thực trước, quay trở lại thực chương trình ứng dụng ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Hình 2.1 Bộ nhớ chương trình có khơng có sử dụng boot loader Bộ Nhớ Dữ Liệu : Bộ nhớ liệu AVR chia làm phần nhớ SRAM nhớ EEPROM Tuy nhớ liệu hai nhớ lại tách biệt đánh địa riêng Bộ nhớ SRAM có dụng lượng K bytes, Bộ nhớ SRAM có hai chế độ hoạt động chế độ thông thường chế độ tương thích với ATmega103, muốn thiết lập nhớ SRAM hoạt động theo chế độ ta sử dụng bit cầu chì M103C ( M103C fuse bit (9) ) Bộ nhớ SRAM chế độ bình thường : Ở chế độ bình thường nhớ SRAM chia thành phần: Phần đầu 32 ghi chức chung (General Purpose Register ) R0 đến R31 có địa từ $0000 tới $001F Phần thứ không gian nhớ vào với 64 ghi vào ( I/O Register ) có địa từ $0020 tới $005F Phần thứ dùng cho vùng nhớ dành cho ghi vào mở rộng ( Extended I/O Registers ) có địa từ $0060 tới $00FF Phần thứ vùng SRAM nội với 4096 byte có địa từ $0100 tới $10FF Phần thứ vùng nhớ SRAM ( External SRAM ) địa $1100, vùng SRAM mở rộng mở rộng lên đến 64 K byte Khi nói nhớ SRAM có dung ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng lượng K byte nói tới phần thứ ( SRAM nội ) Nếu tính ghi nhớ SRAM chế độ bình thường 4.25 K byte = 4352 byte Bộ nhớ SRAM chế độ tương thích ATmega103 : Ở chế nhớ SRAM giống chế độ bình thường, ngoại trừ phần thứ vùng nhớ dành cho ghi vào mở rộng không tồn tại, ngồi kích thước phần SRAM nội ( internal SRAM ) có 4000 byte so với 4096 byte chế độ bình thường Hình 2.2 thể sơ đồ nhờ liệu hai chế độ : Bình thường tương thích ATmega103 Từ hình 2.2 ta thấy cấu hình để nhớ SRAM hoạt động chế độ tương thích ATmega103 ta bị 160 ghi vào mở rộng ( extended I/O Register ), ghi đóng vai trị quan trọng chế độ hoạt động vi điều khiển Hình 2.2 Bản đồ nhớ liệu A : Chế độ bình thường B: Chế độ tương thích ATmega103 Trong vùng nhớ vào mở rộng ( $0060 - $00FF ) có lệnh sau sử dụng, : ST / STS / STD LD / LDS / LDD ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Lệnh CBI SBI làm việc với 32 ghi thấp vùng nhớ vào , tức ghi I/O có địa từ $20 tới $3F ( địa SRAM ) 64 ghi vào vùng nhớ vào ( phần số ) có kiểu chọn địa : Nếu xem chúng vùng nhớ vào địa $00 - $3F, sử dụng lệnh in, out … ta phải sử dụng địa Nếu xem chúng phần nhớ SRAM có địa $0020 - $005F, ta dùng lệnh LD, ST… ta phải sử dụng kiểu địa (hình 2.3 ) Trong tài liệu địa sử dụng hiểu địa SRAM khơng có giải thích thêm Để ý 160 ghi vào mở rộng ( $0060 - $00FF ) khơng có kiểu chọn địa trên, địa chúng địa SRAM Địa Chỉ Vào Ra $00 Thanh ghi PIN F $0020 $01 Thanh ghi PIN E $0021 64 ghi vào Địa Chỉ SRAM Thanh ghi SPH $3F Thanh ghi SREG $005F Hình 2.3 Vùng nhớ 64 ghi vào có cách chọn địa Chi tiết 64 ghi vào 160 ghi vào mở rộng tìm thấy datasheet vi điều khiển ATmega128 Tiệp ghanh ghi ( register file ) : Tiệp 32 ghi đa chức ( $0000 - $001F ) nói trên, chức ghi đa chức năng, ghi từ R26 tới R31 đôi tạo thành ghi 16 bit X, Y, Z dùng làm trỏ trỏ tới nhớ chương trình nhớ liệu ( Hình 2.4 ) Thanh ghi trị X, Y dùng làm trỏ trỏ tới nhớ liệu, cịn ghi Z dùng làm trỏ trỏ tới nhớ chương trình Các trình biên dịch C thường dùng ghi trỏ để quản lí Data stack chương trình C ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Hình 2.4 Chức trỏ ghi R26 –R31 Bộ nhớ EEPROM : Đây nhớ liệu ghi xóa lúc vi điều khiển hoạt động không bị liệu nguồn điện cung cấp bị cắt Có thể ví nhớ liệu EEPROM giống ổ cứng ( Hard disk ) máy vi tính Với vi điều khiển ATmega128, nhớ EEPROM có kích thước Kbyte EEPROM xem nhớ vào đánh địa độc lập với SRAM, điều có nghĩa ta cần sử dụng lệnh in, out … muốn truy xuất tới EEPROM Để điều khiển vào liệu với EEPROM ta sử dụng ghi sau : Thanh Ghi EEAR ( EEARH EEARL ) EEAR ghi 16 bit lưu giữ địa ô nhớ EEPROM, ghi EEAR kết hợp từ ghi bit EEARH ghi EEARL Vì nhớ ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Ví dụ 2: bit bit_mot ; // bit ghi R2 cấp cho biến bit_mot bit bit_hai ; // bit ghi R2 cấp cho biến bit_hai Để ý biến kiểu bit biến tồn cục, biến bit cục bộ, trình biên dịch cất ghi R15 Các ghi R2 tới R14 cấp phát cho biến ghi (register variable), tùy vào tùy chọn cấu hình cho trình biên dịch (có thể khơng với version trình biên dịch) Biến volatile: - Để tương thích với thiết bị ngoại vi ghép nối với vi điều khiển, chẳn hạn ADC, ghép nối với RTC… người ta dùng biến volatile Biến Volatile biến mà giá trị khơng thay đổi chương trình, thay đổi phần cứng Ví dụ Ta muốn ghép nối MCU với Real time clock (RTC), giá trị ghi RTC đọc sau khoảng thời gian unsigned int *milliseconds = 0x8000 ; // trỏ tới //ghi chứa giá trị giây chip RTC unsigned int x,y,time ; time = *milliseconds ; // (1) Đọc giá trị ghi RTC lần x = time ; time = *milliseconds ; // (2) Đọc giá trị ghi RTC lần y = time ; Đoạn chương trình đọc giá trị ghi RTC có lần nên kết thời gian thể không đúng, nguyên nhân từ dịng (1) tới (2), biến *milliseconds khơng bị thay đổi giá trị (trong chương trình ta khơng làm để thay đổi *milliseconds cả), trình biên dịch tối ưu đoạn code cách bỏ bớt dòng số (2), gán y = x Nhưng thực tế phần cứng (sự đếm đồng hồ) làm thay đổi *milliseconds Do đó, giá trị time (1) khác time (2) ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 85 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Để ngăn trình biên dịch tối ưu đoạn code ta dùng từ khóa volatile cho biến milliseconds Đoạn code cần sửa thành: unsigned int volatile *milliseconds = 0x8000 ; // trỏ tới //thanh ghi chứa giá trị giây chip RTC unsigned int x,y,time ; time = *milliseconds ; // (1) Đọc giá trị ghi RTC lần x = time ; time = *milliseconds ; // (2) Đọc giá trị ghi RTC lần y = time ; Ta định việc lưu trữ biến toàn cục địa cụ thể SRAM cách dùng tốn tử @ Ví dụ 4: int a @0x80 ; // biến nguyên a cất địa 80h //bộ nhớ SRAM c Chuyển Đổi Kiểu Dữ Liệu Trong biểu thức tốn học, tốn hạng có kiểu liệu khác nhau, trình biên dịch tự động chuyển tất toán hạng kiểu Thứ tự ưu tiên chuyển đổi : Char -> unsigned char -> int -> unsigned int -> long -> unsigned long -> float Ví dụ int a ; long c, b; c = a*b ; //a tự động chuyển thành long Ví dụ Phép nhân sau cho kết sai: int a, b = 30000; long c ; c = a*b ; ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 86 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng phép toán nhân a với b trước, với tích thu int bị tràn, chuyển tích thu sang long, gán tích bị tràn cho c Để khơng bị tràn, ta sửa lại biểu thức sau: int a, b = 30000; long c ; c = (long) a*b ; lúc a, b chuyển thành long trước nhân, nên tích long khơng bị tràn, gán kết cho c VII.3 Mảng (Array) Mảng dãy biến xếp liên tục Kí hiệu [ ] dùng để khai báo mảng Mảng khai báo hàm gọi mảng toàn cục (global array), mảng khai báo hàm gọi mảng cục ( local array) Ví dụ: int global_array[4]={1,2,3,4}; //mảng có phần tử (dạng nguyên) có khởi tạo giá trị ban đầu global_array[0] = ; //ghi giá trị vào phần tử mảng int multidim_array[2][3]={{1,2,3},{4,5,6}}; //mảng đa chiều có khởi tạo giá trị ban đầu VII.4 Hàm (Function) - Hàm đoạn chương trình thực trọn vẹn công việc định - Hàm chia cắt việc lớn nhiều việc nhỏ Nó giúp cho chương trình sáng sủa, dễ sửa, chương trình lớn - Chương trình phục vụ ngắt (ISR) xem hàm, khơng có tham số truyền vào khơng có tham số trả (xem sau) - Hàm viết cho MCU giống viết PC, bạn đọc xem lại tài liệu ngôn ngữ C cần thiết - Giá trị trả hàm lưu ghi R30, R31, R22, R23 VII.5 Con Trỏ (Pointer) ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 87 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Những biến lưu trữ địa biến khác gọi trỏ (pointer) Có hai tốn tử liên quan tới trỏ : & * & : toán tử lấy địa chỉ, có nghĩa “địa của” * : tốn tử tham chiếu, có nghĩa “Giá trị trỏ bởi” Để sử dụng trỏ ta phải khai báo Kiểu khai báo sau: type * pointer_name; Ví dụ: int *con_tro ; Để ý dấu (*) mà đặt khai báo trỏ có nghĩa rằng: Đó trỏ hồn tồn khơng liên quan đến tốn tử tham chiếu * mà nói Đó đơn giản hai tác vụ khác biểu diễn dấu Khi biến trỏ khai báo, chưa chứa giá trị cả, giống kiểu biến khác Để gán địa cho trỏ cần phải gán giá trị cho trỏ (tức khởi tạo trỏ) Ví dụ int number; int *con_tro;// khai báo biến con_tro trỏ nguyên con_tro = &number ;// biến con_tro trỏ tới biến number Sau khởi tạo, ta sử dụng trỏ bình thường biểu thức Ví dụ int value1 = ; int value2 = 15; int * mypointer; mypointer = &value1; // trỏ mypointer trỏ tới biến value1 *mypointer = 10; //giá trị biến value1 = 10 mypointer = &value2; // trỏ mypointer trỏ tới biến value2 ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 88 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng *mypointer = 20; // giá trị biến value2 = 20 VII.5 Truy Xuất Các Thanh Ghi Vào/Ra (Accessing The I/O Registers) Việc truy xuất ghi I/O AVR đơn giản, tất ghi I/O AVR khai báo file io.h, ta việc include file header io.h (hoặc file header cho chip cụ thể, mega128.h) vào chương trình sử dụng ghi Chú ý việc truy xuất bit ghi có địa 5Fh trở lên vùng nhớ SRAM khơng thể thực Ví dụ include Char temp ; temp = PIND; // Đọc giá trị cổng D vào biến temp TCCR0 = 0x4F;// ghi giá trị 4Fh vào ghi TCCR0 DDRD |= 0x0C; // set bit ghi DDRD VII.6 Truy Xuất EEPROM Dùng từ khóa eeprom khai báo biến (tồn cục) biến lưu vào EEPROM Để ý, biến eeprom khơng có giá trị khởi tạo chương trình thực thi, khi, khai báo biến eeprom ta có khởi tạo giá trị cho biến Giá trị khởi tạo dùng để nộp trực tiếp vào eeprom phần mềm (Điều khơng xác với phiên trình biên dịch) Ví dụ ( xem thêm ví dụ mục VII.8.h ) eeprom int alfa=1; eeprom char beta ; đây, chương trình bắt đầu thực thi, biến alfa khơng có giá trị 1, giá trị khơng biết trước Do đó, để chắn ghi giá trị vào biến alfa, ta nên viết lại : eeprom int alfa=1; eeprom char beta ; alfa = ; ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 89 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Ta đặt biến vào vị trí tùy ý eeprom cách dùng tốn tử @ Ví dụ: eeprom int alfa @0x10;//biến alfa đặt vị trí 0x10 eeprom VII.6 Sử Dụng Ngắt (interrupt) Để thực thi chương trình ngắt, ta dùng từ khóa interrupt Khn dạng chương trình phục vụ ngắt : interrupt [interrupt_number] void routine_name (void) { //đặt chương trình phục vụ ngắt } - - interrupt_number : số thứ tự vector ngắt, tìm thấy datasheet MCU hay từ file header MCU thư mục inc Ta thay số thứ tự vector ngắt tên gợi nhớ định nghĩa file header MCU routine_name: tên chương trình ngắt, tùy chọn Chương trình phục vụ ngắt khơng có tham số truyền vào khơng có tham số trả Ví dụ // Giả định MCU dùng ATmega128, ngắt tràn Timer interrupt [17] void timer0_overflow(void) { // Đặt chương trình phục vụ ngắt } Hoặc là: interrupt [TIM0_OVF] void timer0_overflow(void) { // Đặt chương trình phục vụ ngắt } Trình biên dịch tự động lưu giữ giá trị ghi bị tác động lúc gọi trình phục vụ ngắt phục hồi lại giá trị ghi khỏi trình phục vụ ngắt Tuy nhiên ta ngăn cản lưu giữ giá trị ghi bị tác động cách dùng thị #pragma savereg - ( khuyến khích khơng nên dùng ☺) ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 90 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng VII.7 Sử Dụng Bộ ADC Trong C, để sử dụng ADC ta cần khai báo thơng số cho ADC hàm main, sau sử dụng mẫu hàm đọc ADC CodeVision AVR tạo Để ý sử dụng chức debug Jtag có số chân ADC (ADC4, ,ADC7) AVR không sử dụng Bạn đọc nên xem phần chống nhiễu cho ADC datasheet Ở tập trung vào khía cạnh lập trình Ví dụ sau dùng ADC 10bit, tốc độ 500.000 kHz, chạy bước (xem thêm phần mô tả ADC trang 61) #include //Khai báo dùng ATmega128 // hàm đọc kết ADC, tên hàm tùy ý,theo chuẩn C unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } // hàm main Void Main( ) { Unsigned int adc_temp ; // khai báo biến để lưu kết ADC // Khởi tạo cho ADC // Tần số biến đổi: 500.000 kHz //Chân làm điện so sánh cho ADC AVCC //Điện AVCC cố định (bằng VCC cấp cho AVR) ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84; // xong phần khởi tạo // adc_temp = read_adc (0) ; //đọc kết ADC chân ADC0 adc_temp = read_adc (1) ; //đọc kết ADC chân ADC1 // adc_temp = read_adc (7) ; //đọc kết ADC chân ADC7 //phải disable chức jtag }; ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 91 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng VII.8 Tóm Tắt Các Cấu Trúc Điều Khiển Phần để giúp bạn tra cứu nhanh, quên a Cấu trúc điều kiện: if else if (condition 1) { Khối lệnh } else if (codition 2) { Khối lệnh } else { Khối lệnh khác } Ví dụ if(input == KEY_1)PORTD = 0x01; else if (input == KEY_2) PORTD = 0x02; else if (input == KEY_3)PORTD = 0x03; else PORTD = 0x00; b Vòng lặp while – While while (expression) statement ; // (1) statement while (condition); // (2) Chức (1) đơn giản lặp lại statement điều kiện expression thoả mãn Chức (2) hồn tồn giống vịng lặp while trừ có điều điều kiện điều khiển vịng lặp tính tốn sau statement thực hiện, statement thực lần condition khơng thoả mãn Ví dụ int i ; while (i < 128) { PORTD = i; i = i*2 ; ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 92 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng } Để lặp vô hạn, ta dùng cấu trúc: While (1) { Statement } c Vòng lặp for for (initialization; condition; increase) statement; Chức lặp lại statement chừng condition mang giá trị đúng, vịng lặp while Nhưng thêm vào đó, for cung cấp chỗ dành cho lệnh khởi tạo lệnh tăng Vì vịng lặp thiết kế đặc biệt lặp lại hành động với số lần xác định initialization thực Nói chung đặt giá khí ban đầu cho biến điều khiển Lệnh thực lần condition kiểm tra, vịng lặp tiếp tục cịn khơng vịng lặp kết thúc statement bỏ qua statement thực Nó lệnh đơn khối lệnh bao cặp ngoặc nhọn Cuối cùng, increase thực để tăng biến điều khiển vòng lặp quay trở lại bước Ví dụ for(int i = 1; i 0; n ) { PORTD = n ; if (n== 7) { break; } } Chương trình cho PORTD = 10, 9, 8, Chú ý, sửa lại thứ tự đoạn code sau: int n; for (n=10; n>0; n ) { if (n== 7) { break; } PORTD = n ; } Thì PORTD = 10, 9, Ví dụ for (int n=10; n>0; n ) { if (n==5) continue; PORTD = n ; ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 94 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng } Kết PORTD = 10, 9, 8, 7, 6, 4, 3, 2, Chú ý, sửa lại thứ tự đoạn code sau: for (int n=10; n>0; n ) { PORTD = n ; if (n==5) continue; } Thì PORTD = 10, 9, 8, 7, 6, 5, 4, 3, 2, e Lệnh nhảy goto Lệnh goto cho phép nhảy vơ điều kiện tới điểm chương trình Ví dụ int n=10; loop : PORTD = n ; n ; if (n>0) goto loop; PORTD = 10, 9, 8, 7, 6, 5, 4, 3, 2, loop nhãn chương trình, giống cách viết hợp ngữ Để ý, lệnh n ,lệnh giảm n Ta viết gọn hai câu lệnh: PORTD = n ; n ; thành: PORTD = n ; lệnh hiểu thực phép gán trước giảm n Nếu sửa lại thành PORTD = n ; giảm n thực phép gán Tức tương đương với: n ; PORTD = n ; Lúc PORTD = 9, 8, 7, 6, 5, 4, 3, 2, Trường hợp ++n n++ hiểu tương tự, với dấu + tăng lên f Cấu trúc lựa chọn switch ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 95 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng switch (expression) { case constant1: block of instructions break; case constant2: block of instructions break; default: default block of instructions } Switch hoạt động theo cách sau: switch tính biểu thức kiểm tra xem có constant1 hay khơng, thực block of instructions tìm thấy từ khố break, sau nhảy đến phần cuối cấu trúc lựa chọn switch Cịn khơng, switch kiểm tra xem biểu thức có constant2 hay khơng Nếu thực block of instructions tìm thấy từ khố break Cuối cùng, giá trị biểu thức khơng định (bạn định câu lệnh case tuỳ thích), chương trình thực lệnh phần default tồn phần khơng bắt buộc phải có Có tương tự lệnh Switch cấu trúc if – else switch (x) { case 1: PORTD = 0x01; break; case 2: PORTD = 0x02; break; default: PORTD = 0x00; } Tương đương với : if (x == 1) { PORTD = 0x01; } ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 96 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng else if (x == 2) { PORTD = 0x02; } else { PORTD = 0x00; } g Chằng Hợp Ngữ Vào Trong Chương Trình C Để viết hợp ngữ chương trình C, ta dùng thị #asm #endasm Các ghi R0, R1, R22, R23, R24, R25, R26, R27, R30, R31 sử dụng đoạn chương trình hợp ngữ Ví dụ #asm Sei // cho phép ngắt tồn cục #endasm Nếu viết dịng viết gọn là: #asm(“sei”) h Tổ Chức Bộ Nhớ SRAM Trình biên dịch phân chia quản lí nhớ SRAM AVR sau (xem ảnh dưới) Để truy xuất trực tiếp tới địa vùng nhớ AVR ta dùng cách sau, cách thích hợp ta muốn quản lí khối nhớ cho chức đó: Truy xuất nhớ RAM unsigned char *Pointer; Pointer=(unsigned char *) 0x90h ; // truy xuất vào địa 0x90h SRAM Truy xuất nhớ Flash: flash unsigned char *Pointer; Pointer=(flash unsigned char *)0x90h ; // truy xuất vào địa // 0x90h flash Truy xuất nhớ Eeprom: eeprom unsigned char *Pointer; Pointer=(eeprom unsigned char *)0x90h; // truy xuất vào địa // 0x90h eeprom ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 97 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Tùy theo số lượng biến (cục toàn cục) mà trình biên dịch phân chia kích thước vùng nhớ cách thích hợp Vùng nhớ heap khơng có chương trình khơng sử dụng đến Vùng Stack cứng dùng để lưu địa quay hàm, tức giá trị trỏ SP (stack pointer) Như vậy, khác với hợp ngữ có vùng stack, nơi lưu giá trị quay chương trình chương trình cần nhảy tới thực thi đoạn chương trình Trong C, vùng data stack lưu biến cục bộ, tham số truyền vào hàm, Còn vùng stack cứng lưu địa quay hàm Vùng nhớ heap dùng để cấp phát biến động (dynamic variable) Kích thước vùng nhớ dễ dàng lựa chọn Codevision AVR (chọn Project -> Configure -> C complier ) Riêng phần stack cứng trình biên dịch khởi tạo start-up code ( Những người học chưa cần quan tâm tới phần này) ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 98 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng PHỤ LỤC: Giải Thích Các Từ Ngữ Trong Tài Liệu ( ) Compare Match (1) : Đây chức định thời, theo đó, giá trị định thời (tức giá trị ghi TCNTn (n=0, ,3)) liên tục so sánh sánh với giá trị ghi OCRn (n=0, ,3) Khi hai giá trị tạo thay đổi mức logic chân OCn (n=0, ,3) Nhờ đó, ta tạo xung PWM ngõ OCn (n=0, ,3) vi điều khiển ( ) Input capture (2) : tên chân lối vào (ICn, n=1, 3) AVR, chân nối với khối input capture unit, chức khối là: Khi có kiện (rising, falling, level) chân input capture giá trị ghi định thời (TCNTn, n=1, 3) cập nhật (copy) vào ghi input capture register (ICRn, n=1, 3) Chức dùng để đo khoảng thời gian kiện Để ý xảy kiện input capture tạo ngắt, ngắt input capture cho phép Ngoài kiện input capture tạo chân ICn, ngõ khối analog Comparator ( ACO ), nối với khối input capture unit nên tạo kiện input capture ( ) Falling (3) : Cạnh xuống tín hiệu ( ) Rising (4) : Cạnh lên tín hiệu ( ) Toggle (5) : Sự thay đổi mức logic từ lên từ xuống ( ) Force Output Compare ( ) : Sự kiện Compare Match hai ghi TCNTn (n=0, ,3) OCRn (n=0, ,3) mà xảy bị ép buộc cách set bít FOCnX (n=0,1,…X=A,B,C) ghi TCCRn ( ) Global interrupt (7) : Ngắt toàn cục Muốn cho phép ngắt riêng rẽ hoạt động phải cho phép ngắt toàn cục trước ( ) Prescaler (8) : Khối chức giúp chia nhỏ giá trị xung clock ( ) Fuse bit (9) : Bit cầu chì, để cấu hình phần cứng cho vi điều khiển trước hoạt động ( 10 ) Trigger event (10) : Bất thay đổi logic xảy chân (thường ngõ vào) của vi điều khiển gọi kiện trigger Tài Liệu Tham Khảo Datasheet 8-bit AVR ATmega128 - © Copyright 2007 Atmel Corporation CodeVisionAVR Help - © Copyright 1998-2008 by Pavel Haiduc and HP InfoTech ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 99 ... khác nhau: Tiny, AVR Mega Cấu trúc vi điều khiển AVR thể hình 1.2 Hình 1.2 Cấu trúc Vi điều khiển AVR ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Chương... 45 VI ĐIỀU KHIỂN AVR – ATmega 128 Lê Trung Thắng Bảng 65 Điều khiển hành vi chân OC2 bit COM20:1 chế độ non-PWM Bảng 66 Điều khiển hành vi chân OC2 bit COM20:1 chế độ PWM nhanh Bảng 67 Điều khiển. .. vừa bit điều khiển vi? ??c ghi liệu vào EEPROM Ở vai trò bit điều khiển bit EEMWE set lên ta set bit EEWE lên bắt đầu trình ghi ĐH Khoa Học Tự Nhiên TP Hồ Chí Minh - 2007 10 VI ĐIỀU KHIỂN AVR – ATmega