1. Trang chủ
  2. » Giáo Dục - Đào Tạo

LẬP TRÌNH với AVR STUDIO , Lập trình Asembly bằng AVR Studio, Lập trình C bằng AVR Studio.

59 1K 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 59
Dung lượng 1,39 MB

Nội dung

LẬP TRÌNH với AVR STUDIO , Lập trình Asembly bằng AVR Studio, Lập trình C bằng AVR Studio.

Trang 1

Lập trình với AVR Studio

1 Lập trình Asembly bằng AVR Studio

AvrStudio 4” xuất hiện, hãy bỏ check ở ô “show dialog at Startup” và nhấn cancel

Hình 1 Welcome to AVR studio 4 Diaolg

Bạn thấy giao diện AVR Studio 4 như sau:

Trang 2

Hình 2 Giao diện AVR Studio

Giao diện AVR Studio rất dễ sử dụng, vì vậy chúng ta sẽ kết hợp tìm hiểu trong lúc viết ví dụ

Tạo Project mới: từ menu Project, chọn “Project/New Project”

Hình 3 Tạo Project mới

Một dialog mới xuất hiện cho phép bạn setting Project của bạn, trong vùng

“Project Type” chọn “Atmel AVR assembler”, tức lập trình bằng ngôn ngữ Assembly

và trình dịch là Atmel AVR assembler (trình dịch tích hợp trong AVR Studio);

Trang 3

“Location”, chọn nơi chứa Project (trong ví dụ này tôi chọn thư mục D/AVR1);

“Project name”, tên Projetc của bạn, hãy đặt là avr1

Trang 4

source code của bạn Bạn có thể nhấn vào switch tab bên dưới cửa sổ Project để xem cửa số “I/O View”, cửa số này chứa thông tin chip dùng khi mô phỏng Cửa số Build chứa thông tin kết quả biên dịch “Editor” là vùng viết chương trình, trong trường hợp này đó là file “avr1.asm” của bạn

Hình 6 Cửa sổ lập trình

Việc còn lại là viết code vào cửa sổ Editor sau đó dịch chương trình bằng phím

F7

II Lập trình C bằng AVRStudio

Về bản chất AVRStudio không hỗ trợ lập trình ngôn ngữ C vì không có trình dịch

C Tuy nhiên nó cho phép tích hợp trình dịch C của bộ công cụ WinAVR Vì thế, nếu muốn sử dụng AVRStudio để lập trình C cho AVR bạn phải cài đặt trình dịch và thư viện avr-gcc từ GNU hoặc đơn giản là cài đặt WinAVR cùng AVRStudio Bạn tham khảo thêm bài hướng dẫn WinAVR để biết cách download cài đặt WinAVR Các

hướng dẫn bên dưới giả sử rằng bạn đã cài đặt thành công AVRStudio và WinAVR

Việc tạo 1 Project lập trình bằng ngôn ngữ C trong AVR Studio không khác mấy

so với việc tạo Project ASM Điều duy nhất cần chú ý là bước chọn trình biên dịch

Xem lại hình 4 khi tạo Project ASM, chúng ta chọn Atmel AVR Assempler làm trình

Trang 5

dịch chính, để tạo Project C chúng ta chọn AVR GCC làm trình biên dịch như trong hình 7 Cần lưu ý là trình dịch AVR GCC chỉ xuất hiện trong danh sách lựa chọn của AVR Studio khi bạn đã cài WinAVR vào máy trước đó

Hình 7 Chọn AVR GCC làm trình biên dịch chính

Xem hình 7, giả sử bạn đặt tên Project là avr1 trong ô Project name, bạn sẽ thấy AVR Studio đề nghị tự tạo ra 1 file chương trình chính tên là avr1 có phần mở rộng là

".c", khác với phần mở rộng ".asm" khi tạo Project Assembly

Các việc còn lại hoàn toàn tương tự trong trường hợp tạo Project ASM nên bạn có thể xem lại phần trên Sau khi tạo Project lập trình C trong AVR Studio, bạn save Project rồi vào thư mục chứa Project mới tạo, bạn sẽ thấy 1 file Makefile được tự động tạo ra Makefle được AVR Studio tạo tự động trong lúc tạo Project, bạn không cần dùng đến trình MFile Ngôn ngữ C cho AVR Studio hoàn toàn là AVR GCC như trong WinAVR, vì thế bạn có thể copy, load 1 file source từ WinAVR vào mà không cần bất kỳ chỉnh sửa nào

Một trong những ưu điểm khác khi bạn lập trình C trong AVR Studio là bạn có thể tận dùng trình AVR Simulator để debug code C trực tiếp Đồng thời, trình biên tập (Editor) của AVR Studio cũng giúp bạn viết code thuận tiện hơn Programmer

notepad

Trang 6

Assembly cho AVR

1 Instruction chỉ dùng cho Register Files

2 Instruction cho các thanh ghi I/O

3 Các con trỏ X, Y, Z và cách truy cập toàn bộ không

Phần này tôi giới thiệu một số instruction mà chúng ta rất hay sử dụng khi lập

trình cho AVR Tôi sẽ chia các instruction này ra thành nhiều nhóm dựa theo phạm

vi tác động và chức năng của chúng

Trước hết chúng ta thống nhất một số cách sử dụng ký hiệu trong cách viết cú

pháp của các instruction như sau:

• Rd: thanh ghi nguồn và cũng là đích thuộc Register File

• Rr: thanh ghi nguồn thuộc Register File

Khái niệm nguồn (Source), đích (Destination) là chỉ các toán hạng và kết quả trong

các phép toán đại số và Logic, ví dụ ADD R1, R2 là lệnh cộng 2 giá trị chứa trong 2

thanh ghi R1, R2, trong trường hợp này cả R1 và R2 đều được gọi là nguồn vì chứa

giá trị trước khi thực hiện phép cộng Sau khi phép cộng được thực hiện, kết quả được

chứa lại trong R1 và vì thế R1 được gọi là đích trong trường hợp này R1 vừa là

nguồn, vừa là đích trong khi R2 chỉ là nguồn, nếu viết ví dụ này dưới dạng tổng quát

sẽ là : ADD Rd, Rr

• R: kết quả sau khi lệnh được thực thi

• K: hằng số

• k: hằng số chỉ địa chỉ tuyệt đối của thanh ghi

• b: (0 đến 7) số thứ tự bit trong các thanh ghi của Register File và vùng nhớ I/O

• s: (0 đến 7) số thứ tự bit trong thanh ghi trạng thái SREG

• X,Y,X: các thanh ghi địa chỉ tương đối (X=R27:R26, X=R29:R28,

X=R31:R30)

• A: địa chỉ I/O

• q: độ dịch chuyển của địa chỉ tuyệt đối

I Instruction chỉ dùng cho Register Files

-LDI (LoaD Immediate)

Trang 7

• Cú pháp: LDI Rd,K

• Chức năng: Load hằng số K vào thanh ghi Rd

• Giới hạn: chỉ áp dụng cho các thanh ghi từ R16 đến R31

• Ví dụ: LDI R16, 99 kết quả là thanh ghi R1 mang giá trị 99

-MOV (MOVE)

• Cú pháp: MOV Rd, Rr

• Chức năng: Copy giá trị trong thanh ghi Rr vào thanh ghi Rd

• Giới hạn: áp dụng cho tất cả các thanh ghi trong RF

• Ví dụ: MOV R15, R16 kết quả là R15 có cùng giá trị với R16 (R15=R16=99)

-CLR (CLEAR Register)

• Cú pháp: CLR Rd

• Chức năng: Copy giá trị trong thanh ghi Rr vào thanh ghi Rd

• Giới hạn: áp dụng cho tất cả các thanh ghi trong RF

• Ví dụ: áp dụng cho tất cả các thanh ghi trong RF

-SER (SET Register)

• Chức năng: xóa các bit trong thanh ghi Rd với “mặt nạ” K, nếu Bit nào trong K

là 1 thì Bit tương ứng trong Rd sẽ bị xóa

• Giới hạn: chỉ áp dụng cho các thanh ghi từ R16 đến R31

• Ví dụ: CBR R16, 0xF0 kết quả là 4 bit cao nhất của R16 bị xóa vì

K=11110000 (B)

-SBR (SET Bit in Register)

• Cú pháp: SBR Rd, K

• Chức năng: set các bit trong thanh ghi Rd với “mặt nạ” K, nếu Bit nào trong K

là 1 thì Bit tương ứng trong Rd sẽ được set lên 1

• Giới hạn: chỉ áp dụng cho các thanh ghi từ R16 đến R31

• Ví dụ: SBR R16, 0xF0 kết quả là 4 bit cao nhất của R16 được set lên 1 vì K=11110000 (B)

-BLD (Bit LoaD from T Flag)

Trang 8

Kết quả là bit 4 của thanh ghi R16 được set lên 1 vì giá trị của bit T là 1

-BST (Bit Storage from T Flag)

• Cú pháp: BST Rd,b

• Chức năng: Copy bit thứ b trong thanh ghi Rd vào trong cờ T của thanh ghi SREG Đây cũng chính là chức năng chính của cờ T

• Giới hạn: áp dụng cho tất cả các thanh ghi trong RF

• Ví dụ: BST R16, 4 kết quả là cờ T chứa giá trị của bit 4 của thanh ghi R16

-CPI (COMPARE with Immediate)

Kết quả là cờ Z được set thành 1 vì lúc này R16 =10

-ANDI (AND with Immediate)

Trang 9

LDI R17, 0xAA; (10101010)

AND R1, R17

Kết quả là R1=0xAA vì 11111111 & 10101010 =10101010

-ORI (Logical OR with Immediate)

• Chức năng: dịch tất thanh ghi Rd sang trái 1 vị trí, Bit 7 (bit lớn nhất) của Rd sẽ

được chứa trong cờ nhớ C, bit 0 của Rd bị xóa thành 0 Thực chất LSL tương đương với phép nhân thanh ghi Rd với 2 Bạn xem hình minh họa bên dưới

• Giới hạn: áp dụng cho tất cả các thanh ghi trong RF

-LSR (Logical Shift Right)

Trang 10

• Cú pháp: LSR Rd

• Chức năng: dịch tất thanh ghi Rd sang phải 1 vị trí, Bit 0 (bit nhỏ nhất) của Rd

sẽ được chứa trong cờ nhớ C, bit 7 của Rd bị xóa thành 0 Thực chất LSR tương

đương với phép chia thanh ghi Rd cho 2 Bạn xem hình minh họa bên dưới

• Giới hạn: áp dụng cho tất cả các thanh ghi trong RF

• Ví dụ:

LDI R1, 0B11000110 ; (dạng nhị phân của 195)

LSR R1

Kết quả là R1=01100001 và cờ C =1 vì thanh ghi R1 đã được dịch sang phải 1

vị trí, trước khi dịch bit 0 của R1 là 1 nên sau khi dịch bit này được chứa trong

• Chức năng: tăng thanh ghi Rd 1 đơn vị và kết quả đặt lại trong Rd Lệnh này

đặc biệt thích hợp cho các ứng dụng lặp, kết hợp với BREQ hay BRNE có thể

tạo thành 1 vòng lặp FOR

• Giới hạn: áp dụng cho tất cả các thanh ghi trong RF

• Ví dụ: INC R17 kết quả là R17 được tăng thêm 1 đơn vị

-SUB (SUBtract without Carry)

Trang 11

• Chức năng: giảm thanh ghi Rd 1 đơn vị và kết quả đặt lại trong Rd Lệnh này

đặc biệt thích hợp cho các ứng dụng lặp, kết hợp với BREQ hay BRNE có thể

tạo thành 1 vòng lặp FOR

• Giới hạn: áp dụng cho tất cả các thanh ghi trong RF

• Ví dụ: DEC R17 kết quả là R17 được giảm đi 1 đơn vị

-MUL (MULtiply unsigned)

• Cú pháp: MUL Rd, Rr

• Chức năng: thực hiện phép nhân không dấu 2 thanh ghi 8 bit Rd, Rr, kết quả là

1 số 16 bit đặt trong 2 thanh ghi R1:R0 Chú ý nếu Rd và Rr là các thanh ghi R1

và R0 thì kết quả sau khi tính được sẽ được viết đè lên Xem hình minh họa

instruction MUL bên dưới

• Giới hạn: áp dụng cho tất cả các thanh ghi trong RF

• Ví dụ:

LDI R16, 30

LDI R17, 25

Trang 12

MUL R16, R17

Kết quả là R1=0x2, R0=0xEE, vì 30x25=750=0x02EE

II Instruction cho các thanh ghi I/O

Bốn instruction sau đây được thiết kế riêng để truy cập vùng nhớ I/O, các instruction này sử dụng địa chỉ I/O của các thanh ghi trong vùng nhớ này Vì là thiết kế riêng cho vùng nhớ I/O, bạn không thể sử dụng các thanh ghi này để truy cập RF hay SRAM Trong các cú pháp của instruction này, khái niệm địa chỉ A là địa chỉ I/O, 0 ≤ A ≤ 63, nếu trong ví dụ A=0x00 thì đó là thanh ghi đầu tiên của vùng I/O, không phải là thanh ghi R0

-OUT (OUTPUT Data)

32 thanh ghi đầu (địa chỉ từ 0 đến 31)

• Giới hạn: b là số thứ các bit trong thanh ghi, 0≤b≤7; A bị giới hạn từ 0 đến 31

• Ví dụ:

SBI 0x12, 2

Trang 13

Kết quả là bit 2 của thanh ghi có địa chỉ 0x12 trong vùng I/O, tức thanh ghi PORTD, được set lên 1 Đây chính là ví dụ set chân PD2 của PORTD

-CBI (Clear Bit in I/O Register)

• Cú pháp: CBI A, b

• Chức năng: xóa bit thứ b trong thanh ghi có địa chỉ A trong vùng nhớ I/O Tuy nhiên lệnh này không có tác dụng trên toàn bộ vùng I/O mà chỉ có tác đối với

32 thanh ghi đầu (địa chỉ từ 0 đến 31)

• Giới hạn: b là số thứ các bit trong thanh ghi, 0≤b≤7; A bị giới hạn từ 0 đến 31

• Ví dụ:

CBI 0x12, 2

Kết quả là bit 2 của thanh ghi có địa chỉ 0x12 trong vùng I/O, tức thanh ghi PORTD, bị xóa thành 0 Đây chính là ví dụ xóa chân PB2 của PORTD

III Các con trỏ X, Y, Z và cách truy cập toàn bộ không gian bộ nhớ

Trong Register File của AVR, các thanh ghi từ R26 đến R31ngoài chứa năng thanh ghi thông thường còn có chức năng là con trỏ (Pointer) trong việc truy cập bộ nhớ (cả

bộ nhớ data và bộ nhớ Program) Nếu được sử dụng như các Pointer, các thanh ghi trên được biết đến với tên gọi X, Y, Z Định nghĩa như sau: X=R27:R26, Y=R29:R28, Z=R31:R30 Chúng là 3 thanh ghi 16 bit được định nghĩa trước cho tất cả các AVR Ngoài ra trong các file định nghĩa cho chip chúng ta có thêm 6 định nghĩa khác là XL,

XH, YL, YH, ZL, ZH cũng chính là tên gọi của R26-> R31 Phần này chúng ta khảo sát một số instruction dùng truy cập toàn bộ khồi nhớ của AVR bằng cách sử dụng địa chỉ trực tiếp và bằng cách sử dụng Pointer

-LDS (LoaD direct from data Space)

• Cú pháp: LDS Rd, k

• Chức năng: load giá trị 1 byte từ thanh ghi có địa chỉ k trong SRAM vào thanh ghi Rd, k là dạng địa chỉ tuyệt đối có giới hạn từ 0 đến 65535(2^16-1)

• Giới hạn: Rd là thanh ghi bất kỳ trong RF nhưng giá trị lớn nhất của k là 65535,

vì thế với lệnh này ta không thể truy cập vượt quá khoảng không gian 64KB Nếu muốn truy cập vùng không gian lớn hơn 64KB chúng ta cần một số hỗ trợ, tuy nhiên ở đây tôi giả sử bộ nhớ của chip (thường là bộ nhớ data) không vượt quá 64KB (thực tế chưa có chip AVR nào có SRAM hay EEPROM vượt quá 64KB)

Trang 14

• Chức năng: instruction này hoàn toàn giống LDS nhưng dùng để xuất dữ liệu

từ thanh ghi Rr ra RAM, ngươi đọc có thể tham khảo phần giải thích cho LDS

Sử dụng địa chỉ trực tiếp thì câu lệnh sẽ đơn giản nhưng rất khó nhớ phần địa chỉ, thông thường SRAM là vùng chúng ta hay sử dụng để chứa biến tạm thời, trong các ngôn ngữ cấp cao ta chỉ cần nhớ tên biến nhưng với ASM chúng ta phải nhớ địa chỉ của chúng Một cách tốt để tránh việc này là dùng chỉ thị (DIRECTIVE, bạn xem lại bài 1) EQU để gán tên biến cho 1 địa chỉ, ví dụ EQU bientam = 0x0060 và sau đó

sử dụng bientam thay cho 0x0060

Một cách khác được dùng để truy cập bộ nhớ mà không dùng địa chỉ tuyệt đối là sử dụng sử dụng con trỏ Có 2 instruction hỗ trợ con trỏ là LD(LoaD indirec from data Space), và ST (STorage indirec to data Space), LD đọc dữ liệu từ SRAM vào thanh ghi còn ST lưu dữ liệu từ thanh ghi vào SRAM Cả 3 con trỏ X, Y và Z đều có thể

được dùng nhưng có một số điểm lưu ý: cả 3 đều dùng được trong trường hợp truy

xuất thông thường nhưng với cách truy cập có offset, con trỏ X không sử dụng được

Để truy xuất bộ nhớ chương trình bằng con trỏ thì Z là giải pháp duy nhất…Dưới đây

là 1 số cách sử dụng LD, ST kết hợp với con trỏ, chúng ta xét thông qua các ví dụ

Ví dụ 1:

CLR R27 ; xóa R27, tức xóa byte cao của pointer X

LDI R26, 0x60 ; load giá trị 0x60 vào R26, tức byte thấp của pointer X

; sau 2 dòng trên, giá pointer X là 0x0060, sẵn sàng để trỏ đến vị trí đầu tiên trong SRAM

LD R1, X+ ; Load giá trị ở ố nhớ 0x0060 vào R1 (vì X trỏ đến 0x0060), sao đó tăng giá trị ;X lên 1, như thế sau lệnh này X=0x0061

LD R2, X+ ; Load giá trị ở ố nhớ 0x0061 vào R2, sao đó tăng giá trị ;X lên 1, như thế sau lệnh này X=0x0062

LD R3, X ; Load giá trị ở ô nhớ 0x0062 vào R3 và không thay đổi X

LD R4, -X ; Giảm giá trị của X trước (X=0x0061), sau đó load giá trị ở ô nhớ 0x0061 vào R4

Từ ví dụ này chúng ta thấy có 3 cách cơ bản để load dữ liệu từ SRAM bằng con trỏ, cách Load trực tiếp trong trường hợp LD R3, X, cách load post-increment (hoặc post-decrement) như trong trường hợp LD R1, X+ và cách load pre-decrement (hoặc pre-increment) trong trường hợp LD R4, -X

Chúng ta có thể viết lại ví dụ trên nhưng sử dụng con trỏ Y hoặc Z thay cho X Ví dụ viết cho instruction ST cũng hoàn toàn tương tự

Tuy nhiên cách truy cập theo cách pre hay post đều làm thay đổi giá trị của con trỏ,

điều này có 1 bất lợi là nếu chúng ta muốn quay lại vị trí ô nhớ nào đó, chúng ta phải

tiếp tục thay đổi con trỏ Để tránh việc làm này, 1 cách truy cập khác được hỗ trợ là truy cập “Offset” Xét ví dụ sau:

Trang 15

LD R1, Y+1

Đây chính là cách truy cập Offset dùng con trỏ Y, cách viết trên là tương đương với

cách viết

LD R1, Y+

Nhưng điểm khác biệt ở đây là cách viết Offset không làm thay đổi giá trị của con trỏ

Y Sử dụng Offset có ưu điểm như sử dụng mảng (array) trong các ngôn ngữ lập trình cấp cao Cần chú ý là giá trị offset không vượt quá 63 và phương pháp này chỉ dùng cho 2 thanh ghi Y và Z

IV Rẽ nhánh và vòng lặp

Không giống như các ngôn ngữ cấp cao, khi lập trình bằng ASM bạn không được hỗ trợ các cấu trúc điều khiển như If, For, While…người lập trình ASM phải tự xây dựng cho mình các cấu trúc này từ những instruction cơ bản Nếu bạn có trong tay tài liệu tra cứu instruction cho AVR bạn sẽ thấy có rất nhiều instruction có dạng BRxx, với

BR là viết tắt của từ Branch (rẽ nhánh) Đây là các instruction cơ bản giúp bạn xây dựng các cấu trúc điều khiển tương đương If, For, While…cho riêng mình

Trước hết ta sẽ khảo sát instruction BRNE bằng cách xem lại ví dụ trong bài "Làm quen AVR", đây là đoạn chương trình con DELAY:

Bạn hãy chú ý 4 dòng lệnh nằm giữa đoạn chương trình trên (bắt đầu từ dòng 4), dòng

đầu tiên thì bạn đã biết - load giá trị 255 vào thanh ghi R21, sau đó tôi đặt 1 label

DELAY1- xem như là 1 cột mốc, dòng 3, instruction DEC bạn mới được học hôm nay

- giảm giá trị thanh ghi R21 đi 1 đơn vị, và cuối cùng BRNE DELAY1, BRNE là viết tắt của BRanch if Not Equal – rẽ nhánh nếu không bằng, thực ra bản chất của lệnh này

là rẽ nhánh nếu cờ Zero không bằng 1 Như thế câu lệnh BRNE DELAY1 của chúng

ta được AVR thực hiện như sau: kiểm tra cờ Z, nếu Z=1 tiếp tục thực hiện dòng tiếp theo sau mà không quan tâm đến nhãn DELAY1, nhưng nếu Z=0 thì nhảy đến nhãn DELAY1 Bạn thấy rằng ban đầu R21 =255, sau khi giảm 1 bởi DEC, thanh ghi

R21=254≠0, cờ Z =0, rẽ nhánh xảy ra, bộ đếm chương trình nhảy về nhãn DELAY1 Quá trình này lặp lại khoảng 255 lần trước khi R21 =0 dẫn đến Z=1

Trang 16

Bao bên ngoài vòng lặp của nhãn DELAY1 là vòng lặp của nhãn DELAY0, cách hiểu hoàn toàn tương tự nhưng trước khi lệnh DEC R20 được thực thi thì phải chờ cho vòng lặp DELAY1 kêt thúc Bản thân DELAY0 cũng là 1 vòng lặp 255 lần kết quả cuối cùng là ta thu được 1 vòng lặp khoảng 255x255 lần mà không làm gì cả, đó chính

là ý nghĩa và cách hoạt động của đoạn chương trình con DELAY

Bên cạnh BRNE chúng ta có 1 số instruction phục vụ rẽ nhánh khác như:

-BREQ (BRanch if EQual)

• Cú pháp: BREQ LABEL

• Chức năng: Nhảy đến nhãn LABEL nếu cờ Z =1 Cờ Z chịu tác động của rất nhiều instruction như CP, CPI, SUB, SUBI…vì thế BREQ thường được sử dụng sau các instruction này

; thực hiện những việc khi rẽ nhánh

Kết quả là việc rẽ nhánh xảy ra vì khi so sánh bằng CP, R17=R16 nên cờ Z tự

động được set bằng 1, lệnh BREQ được thực thi và nhảy đến nhãn RENHANH

Ví dụ này tương đương cấu trúc if (R16=R17) {thực hiện những việc khi rẽ nhánh}

-BRLO (BRanch if LOwer)

• Cú pháp: BRLO LABEL

• Chức năng: bản chất của câu lệnh là nhảy đến nhãn LABEL nếu cờ C =1 Tuy nhiên, thông thường lệnh này sử dụng theo sau các instruction như CP, CPI, SUB, SUBI…khi đó việc rẽ nhánh sẽ xảy ra nếu thanh ghi Rd

• Ví dụ:

EOR R16, R16 ;XOR R16 với chính nó, tương đương CLR R16

VONG LAP:

INC R16 ;tăng R16 thêm 1 đơn vị

CPI R16, $10 ;so sánh R16 với số hexadecimal $10

BRLO VONGLAP ;nhảy về VONGLAP nếu R16 <$10

NOP ;câu lệnh này sẽ được thực thi nếu điều kiện rẽ nhánh ở trên không thỏa,

; NOP là 1 instruction, chức năng là không làm gì cả

Kết quả là phần lệnh bên trong VONGLAP sẽ được thưc hiện khoảng 16 lần ($10=16) trước khi thực hiện lệnh NOP

-BRSH (BRanch if Same or Higher)

Trang 17

• Cú pháp: BRSH LABEL

• Chức năng: bản chất của câu lệnh là nhảy đến nhãn LABEL nếu cờ C =0 Tuy nhiên, thông thường lệnh này sử dụng theo sau các instruction như CP, CPI, SUB, SUBI…khi đó việc rẽ nhánh sẽ xảy ra nếu thanh ghi Rd ≥Rr

• Ví dụ:

SUBI R16, 4 ;trừ R16 đi 4 đơn vị

BRSH RENHANH ; nhảy đến RENHANH nếu R16 ≥ 4

rẽ nhánh này, để làm được như vậy bạn cần xem kỹ tài liệu hướng dẫn

INSTRUCITON cho AVR

Trang 18

Mô phỏng chương trình với Proteus

1 Vẽ mạch điện trong Proteus

Proteus VSM (Virtual Simulation Machine) của Labcenter Electronics là phần mềm mô phỏng mạch điện rất được ưa thích hiện nay So với các phần mềm mô phỏng mạch điện tử khác, Proteus có nhiều ưu điểm nổi trội như: mô phỏng được rất nhiều linh kiện điện tử và các thiết bị hiển thị, kết quả mô phỏng rất trực quan như một mạch điện tử thật Và một tính năng mà chúng ta, những người học vi điều khiển, quan tâm nhất là khả năng mô phỏng các chip vi điều khiển với chương trình

do người dùng nạp Proteus hỗ trợ rất nhiều các chip vi điều khiển như 8051, AVR, PIC, HC11, ARM7/LPC2000 Nếu bạn đang muốn học AVR mà không có điều kiện hoặc kinh nghiệm để làm các mạch phát triển hoặc bạn muốn kiểm tra chương trình trước khi nạp vào mạch phát triển thì Proteus là lựa chọn không thề bỏ qua

Trong các bài hướng dẫn AVR trên website này, tôi chủ yếu dùng Proteus để mô phỏng minh họa các ví dụ lập trình Vì thế trong phần này tôi sẽ hướng dẫn cơ bản cách sử dụng Proteus để vẽ và mô phỏng một mạch điển đơn giản với AVR Tôi dùng mạch quét LED trong bài "Làm quen AVR" để minh họa

Trước hết, bạn hãy download bản demo Proteus từ website Labcenter Electronics hoặc ở đây Sau khi cài đặt phần mềm chúng ta sẽ thực hiện tuần tự các bước sau để tạo điện quét LED

I Vẽ mạch điện

Chạy Proteus: sau đó nhấn vào buton “Components” rồi “Pick Devices” để chọn linh kiện

Trang 19

Hình 1 Giao diện Proteus

Chọn linh kiện: trong dialog Pick Divices, ô “Keywords” nhập mega8, bạn sẽ

thấy 1 linh kiện có tên “ATMEGA8” bên cửa sổ “Results”, double click vào linh kiện

đó để mang nó ra cửa sổ “Object selector”

Trang 20

Hình 2 Chọn linh kiện

Để tìm điện trở, bạn đánh keyword “res”, chọn “Resistors” trong “category” và Double click vào link kiện “RES” trong ô “Results”

Trang 21

Hình 3 Chọn điện trở

Thực hiện tương tự để chọn GREEN - LED bằng keyword “green led”

Hình 4 Chọn Green LED

Sau khi chọn 3 loại linh kiện cần thiết bạn hãy nhấn OK và quay về cửa số chính,

khi đó bạn thấy trong cửa sổ “Object selector” như sau:

Trang 22

Hình 5 Các link kiện cần cho mô phỏng

Thao tác với mouse trong Proteus: khác với 1 số chương trình vẽ mạch điện khác, tháo tác mouse trong Proteus hơi lạ nên có thể gây bối rối cho bạn, hãy theo hướng dẫn sau đây:

• Chọn linh kiện để vẽ: left – click lên tên linh kiện trong cửa sổ “Object

selector”

cửa số mạch điện sẽ làm cho linh kiện đó được bao bởi màu “đỏ”, tức bạn đang chọn linh kiện đó

• Bỏ chọn linh kiện: thực hiện bằng cách Right – click lên một vị trí trống trên cửa sổ mạch điện

• Delete linh kiện: Right – click 2 lần lên 1 linh kiện là delete linh kiện đó khỏi cửa sổ mạch điện, hoặc Right click 1 lần lên 1 linh kiện đã được chọn trước đó (có màu đỏ) cũng sẽ xóa linh kiện này

• Di chuyển linh kiện: chọn linh kiện trước (right – click) và drag để di chuyển linh kiện bằng mouse left

• Xoay và lật linh kiện: chọn linh kiện cần xoay hay lật (right – click), dùng các nút công cụ để xoay hoặc lật linh kiện

Hình 6 Các nút công cụ xoay và lật linh kiện

• Hiện cửa sổ thuộc tính linh kiện: rất nhiều khi bạn cần thay đổi 1 số thuộc tính của linh kiện (ví dụ giá trị của điện trở), bạn thực hiện điều này trong cửa sổ thuộc tính của linh kiện Để hiện cửa sổ thuộc tính của 1 linh kiện bạn hãy right – click trước (để chọn linh kiện – linh kiện sẽ đỏ lên) và sau đó left – click sau

Trang 23

Theo hướng dẫn trên, bạn hãy click vào ATMEGA8 và đặt linh kiện này lên mạch

điện của bạn (đặt lên cửa sổ làm việc lớn) bằng cách left - click lên bất vị trí nào trên

cửa sổ mạch điện Thực hiện tương tự cho 8 LED và 1 điện trở như hình vẽ bên dưới

Hình 7 Đặt linh kiện lên mạch điện

Tiếp theo là đặt “Ground” cho LED, nhấn vào nút công cụ “Inter – sheet

Terminal” như hình bên dưới

Trang 24

Hình 8 Nút công cụ Inter – sheet Terminal

Bạn thấy trong cửa sổ “Object devices” có 1 số thiết bị, hãy chú ý dến “POWER”

và “GROUND”, đây là nguồn và mass cho mạch điện của bạn Hãy chọn GROUND

và đặt lên mạch điện của bạn

Bước tiếp theo, nối dây: không cần công cụ, để nối dây bạn chỉ cần rê mouse đến

điểm cần nối của linh kiện, bạn sẽ thấy xuất hiện 1 dấu chéo “x”, lúc đó hãy click

mouse và di chuyển (không cần giữ mouse) đến vị trí tiếp theo và click lần nữa

Hình 9 Nối dây

Theo cách này bạn hãy nối dây cho mạch điện của bạn, mạch điện hoàn chỉnh như sau

Trang 25

Hình 10 Sau khi nối dây

Bây giờ hãy thay đổi giá trị của điện trở, giá trị mặc định là 10k, giá trị này quá lớn, dòng điện sẽ rất nhỏ, khi mô phỏng bạn sẽ không thấy các LED sáng lên Bạn hãy thay đổi nó thành 100 (100 Ohm) Trước hết cho hiện cửa sổ thuộc tính của điện trở (right click rồi left click lên điện trở), thay đổi ô resistance của nó

Trang 26

Hình 11 Thay đổi giá trị của điện trở

II Nạp chương trình và mô phỏng

Đổ chương trình vào chip Atmega8: hãy hiện cửa sổ thuộc tính của chip Atmega8, trong ô “Program file” hãy click và tìm đến file “avr1.hex” mà bạn đã tạo trong thư mục Project của bài AVR1 sau khi biên dịch Chú ý thay đổi thông số

“Clock frequency” là 1 Mhz

Hình 12 Đổ chương trình cho chip

Hãy lưu mạch điện của bạn và việc cuối cùng là chạy mô phỏng, sử dụng thanh công cụ Play để chạy mô phỏng mạch điện của bạn, kết quả như sau

Trang 27

Hình 13 Kết quả mô phỏng

Trang 28

Lập trình với WinAVR

Download WinAVR

• Làm quen AVR

WinAVR là công cụ chính tôi dùng trong các bài hướng dẫn sử dụng các

modules trên chip AVR bằng ngôn ngữ C Tuy nhiên, bài này tôi không nói về lập trình C mà chủ yếu hướng dẫn cách cài đặt và sử dụng WinAVR Tôi sẽ dùng ví dụ quét LED của bài "Làm quen AVR" để minh họa, nhưng phần code sẽ được viết lại bằng ngôn ngữ C thay cho ASM

I Giới thiệu WinAVR

Tại sao C: như tôi đã trình bày ở các bài học trước, khi bạn đã hiểu về AVR, để thực hiện các ứng dụng, bạn có thể không nhất thiết phải luôn lập trình bằng ASM Ngôn ngữ cấp cao như C sẽ giúp cho bạn xây dựng các ứng dụng nhanh chóng và dễ dàng hơn, tuy nhiên không vì thế mà bạn “quên” ASM, lập trình bằng C kết hợp ASM

là giải pháp hay nhất Một chú ý là chúng ta chỉ sử dụng C để đơn giản hóa lập trình tính toán, cấu trúc điều khiển…lập trình C cho AVR không có nghĩa là bạn không cần biết cấu trúc và cách thức hoạt động của chip!!!

Tại sao WinAVR: WinAVR (đọc là Whenever: theo tác giả của WinAVR) là một

bộ phần mềm mã nguồn mở bao gồm các công cụ cho dòng vi điều khiển AVR

WinAVR chạy trên nền hệ điều hành Windows, nó bao gồm các công cụ sau:

• Trình biên dịch avr-gcc: GNU GCC là trình biên dịch C, C++ phát triển bởi cộng đồng mã nguồn mở GNU, avr-gcc phát triển riêng cho AVR

• Chương trình nạp chip avrdude

• Chương trình debugger avr-gdb

• Programmer Notepad: trình biên tập code hỗ trợ nhiều ngôn ngữ như C, C++, CSS, HTML, Java,…

• MFile: tiện ích tạo các file Makefile dùng trong quá trình biên dịch code…

Cốt lõi của WinAVR là trình biên dịch GNU GCC và thư viện avr-libc, đây là bộ công cụ lập trình C miễn phí hoàn chỉnh duy nhất cho AVR Có thể nói bộ công cụ này góp phần không nhỏ giúp cho chip AVR ngày càng trở nên phổ biến WinAVR liên tục được cập nhật và hoàn thiện bởi rất nhiều người, nguồn tài liệu và chương trình mẫu viết bằng công cụ này là rất lớn…Đây là những lí do chính khiến tôi chọn WinAVR để giới thiệu với bạn

Trang 29

Download và cài đặt: có 2 cách để bạn cài đặt bộ công cụ C cho AVR, cách thứ nhất, bạn download từng phần gồm binutils, gnu-gcc, avr-libc, và avrdude…rồi cài đặt (cách này thường được sử dụng trên hệ điều hành Linux…tôi sẽ giới thiệu trong 1 tài liệu khác) và cách thứ 2 là dùng WinAVR (dành cho windows) Bạn có thể download trực tiếp phiên bản mới nhất tại website chính thức của WinAVR:

http://winavr.sourceforge.net/index.html Quá trình cài đặt tương đối dễ dàng vì bạn

có thể chỉ cần làm theo các lựa chọn mặc định Sau khi cài đặt WinAVR vào máy (tôi giả sử thư mục cài đặt của bạn là C:\WinAVR) bạn sẽ có đầy đủ bộ công cụ từ IDE (Integrated Development Environment) để biên tập code, trình biên dịch, linker,

chương trình nạp chip, tiện ích tạo Makefile…

Programmer Notepad (pn): Programmer Notpad là phần mềm môi trường phát triển tích hợp (IDE) miễn phí cho việc lập trình các ngôn ngữ như C, C++, CSS,

HTML, Java,…Tuy giao diện của pn khá đơn giản nhưng đây là công cụ rất hoàn hảo

và được tích hợp sẵn trong WinAVR, avr-gcc lugin được tích hợp sẵn trong pn cho WinAVR nên chúng ta có thể biên dịch code, download chương trình vào chip trực tiếp với pn (có thể tham khảo thêm về pn tại website http://www.pnotepad.org) (chú

ý, bạn có thể viết code cho avr-gcc bằng AVRStudio, Eclipse IDE hay ngay cả với Windows Notepad )

MFile: để biên dịch 1 chương trình bằng trình biên dịch gnu gcc, bạn cần 1 file tên

là Makefile không có phần mở rộng, file này chứa thông tin cần thiết như thông tin về trình biên dịch, target (tên các file code cần dịch), loại chip, trình nạp chip…MFile là tiện ích giúp chúng ta tạo các Makefile nhanh chóng và chinh xác MFile được tích hợp sẵn trong WinAVR

II Khởi động cùng Programmer Notepad (pn)

Sau khi cài đặt WinAVR, trên desktop của bạn có thể sẽ xuất hiện 2 icon của pn

và MFile như trong hình 1

Hình 1 Icons trên Desktop

Phần này chúng ta tìm hiểu cách viết một chương trình C trong pn thông qua 1 ví

dụ đơn giản Từ Desktop, hãy khởi động pn, lần đầu chạy pn bạn sẽ thấy giao diện của chương trình như trong hình 2

Ngày đăng: 28/11/2015, 06:51

HÌNH ẢNH LIÊN QUAN

Hình 1.  Welcome to AVR studio 4 Diaolg. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
Hình 1. Welcome to AVR studio 4 Diaolg (Trang 1)
Hình 2. Giao diện AVR Studio. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
Hình 2. Giao diện AVR Studio (Trang 2)
Hình 5. Chọn Platform và device. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
Hình 5. Chọn Platform và device (Trang 3)
Hình 4.Setting Project. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
Hình 4. Setting Project (Trang 3)
Hình 6. Cửa sổ lập trình. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
Hình 6. Cửa sổ lập trình (Trang 4)
Hình 7. Chọn AVR GCC làm trình biên dịch chính. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
Hình 7. Chọn AVR GCC làm trình biên dịch chính (Trang 5)
Hình  1. Giao diện Proteus. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
nh 1. Giao diện Proteus (Trang 19)
Hình  2. Chọn linh kiện. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
nh 2. Chọn linh kiện (Trang 20)
Hình  3. Chọn điện trở. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
nh 3. Chọn điện trở (Trang 21)
Hình  7. Đặt linh kiện lên mạch điện. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
nh 7. Đặt linh kiện lên mạch điện (Trang 23)
Hình  9. Nối dây. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
nh 9. Nối dây (Trang 24)
Hình  10. Sau khi nối dây. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
nh 10. Sau khi nối dây (Trang 25)
Hình  11. Thay đổi giá trị của điện trở. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
nh 11. Thay đổi giá trị của điện trở (Trang 26)
Hình  13. Kết quả mô phỏng. - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
nh 13. Kết quả mô phỏng (Trang 27)
Hình 2. Giao diện pn - LẬP TRÌNH với AVR STUDIO ,  Lập trình Asembly bằng AVR Studio,  Lập trình C bằng AVR Studio.
Hình 2. Giao diện pn (Trang 30)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w