1. Trang chủ
  2. » Tất cả

bai2.cau truc avr

51 551 6
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Cấu Trúc Avr
Trường học Trường Đại Học Khoa Học Tự Nhiên
Chuyên ngành Kỹ Thuật Điện Tử
Thể loại bài giảng
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 51
Dung lượng 617,8 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bộ nhớ chương trình Program memory: Là bộ nhớ Flash lập trình được, trong các chip AVR cũ như AT90S1200 hay AT90S2313… bộ nhớ chương trình chỉ gồm 1 phần là Application Flash Section như

Trang 1

Bài 2 - Cấu Trúc AVR

Bài này tiếp tục bài đầu tiên trong loạt bài giới thiệu về AVR, nếu sau bài

"Làm quen AVR" bạn đã phần nào biết cách lập trình cho AVR bằng AVRStudio thì trong bài này, chúng ta sẽ tìm hiểu kỹ hơn về cấu trúc của AVR Sau bài này, bạn sẽ:

 Hiểu được cấu trúc AVR, cấu trúc bộ nhớ và cách thức hoạt động của chip.

 Hiểu về Stack và cách hoạt động.

 Biết được một số instruction cơ bản truy xuất bộ nhớ.

Trang 2

 Học các instruction rẽ nhánh và vòng lặp.

 Chương trình con (Subroutine) và Macro.

 Cải tiến ví dụ trong bài 1.

 Viết 1 ví dụ minh họa cách sử dụng bộ nhớ và vòng lặp.

II Tổ chức của AVR

AVR có cấu trúc Harvard, trong đó đường truyền cho bộ nhớ dữ liệu (data memory bus) và đường truyền cho bộ nhớ chương trình (program memory bus) được tách riêng Data memory bus chỉ có 8 bit và được kết nối với hầu hết các thiết

bị ngoại vi, với register file Trong khi đó program memory bus có độ rộng 16 bits

và chỉ phục vụ cho instruction registers Hình 1 mô tả cấu trúc bộ nhớ của AVR.

Bộ nhớ chương trình (Program memory): Là bộ nhớ Flash lập trình được,

trong các chip AVR cũ (như AT90S1200 hay AT90S2313…) bộ nhớ chương trình chỉ gồm 1 phần là Application Flash Section nhưng trong các chip AVR mới chúng

ta có thêm phần Boot Flash setion Boot section sẽ được khảo sát trong các phần sau, trong bài này khi nói về bộ nhớ chương trình, chúng ta tự hiểu là Application section Thực chất, application section bao gồm 2 phần: phần chứa các instruction (mã lệnh cho hoạt động của chip) và phần chứa các vector ngắt (interrupt vectors) Các vector ngắt nằm ở phần đầu của application section (từ địa chỉ 0x0000) và dài đến bao nhiêu tùy thuộc vào loại chip Phần chứa instruction nằm liền sau đó, chương trình viết cho chip phải được load vào phần này Xem lại phần đầu của ví

Trang 3

Vì chức năng chính của bộ nhớ chương trình là chứa instruction, chúng ta không có nhiều cơ hội tác động lên bộ nhớ này khi lập trình cho chip, vì thế đối với người lập trình AVR, bộ nhớ này “không quá quan trọng” Tất cả các thanh ghi quan trọng cần khảo sát nằm trong bộ nhớ dữ liệu của chip.

Hình 1 Tổ chức bộ nhớ của AVR.

Bộ nhớ dữ liệu (data memory): Đây là phần chứa các thanh ghi quan trọng

nhất của chip, việc lập trình cho chip phần lớn là truy cập bộ nhớ này Bộ nhớ dữ liệu trên các chip AVR có độ lớn khác nhau tùy theo mỗi chip, tuy nhiên về cơ bản phần bộ nhớ này được chia thành 5 phần:

Phần 1: là phần đầu tiên trong bộ nhớ dữ liệu, như mô tả trong hình 1, phần này bao gồm 32 thanh ghi có tên gọi là register file (RF), hay General Purpose Rgegister – GPR, hoặc đơn giản là các Thanh ghi Tất cả các thanh ghi này đều là các thanh ghi 8 bits như trong hình 2.

Hình 2 Thanh ghi 8 bits.

Tất cả các chip trong họ AVR đều bao gồm 32 thanh ghi Register File có địa chỉ tuyệt đối từ 0x0000 đến 0x001F Mỗi thanh ghi có thể chứa giá trị dương từ 0 đến

255 hoặc các giá trị có dấu từ -128 đến 127 hoặc mã ASCII của một ký tự nào đó…Các thanh ghi này được đặt tên theo thứ tự là R0 đến R31 Chúng được chia thành 2 phần, phần 1 bao gồm các thanh ghi từ R0 đến R15 và phần 2 là các thanh ghi R16 đến R31 Các thanh ghi này có các đặc điểm sau:

Trang 4

 Được truy cập trực tiếp trong các instruction.

 Các toán tử, phép toán thực hiện trên các thanh ghi này chỉ cần 1 chu kỳ xung clock.

 Register File được kết nối trực tiếp với bộ xử lí trung tâm – CPU của chip.

 Chúng là nguồn chứa các số hạng trong các phép toán và cũng là đích chứa kết quả trả lại của phép toán.

Để minh họa, hãy xét ví dụ thực hiện phép cộng 2 thanh ghi bằng instruction ADD như sau:

ADD R1, R2

Bạn thấy trong dòng lệnh trên, 2 thanh ghi R1 và R2 được sửdụng trực tiếp với tên của chúng, dòng lệnh trên khi được dịch sangopcode để download vào chip sẽ có dạng: 0000110000010010 trong

đó 00001=1 tức thanh ghi R1 và 00010 = 2 chỉ thanh ghi R2 Sau phépcộng, kết quả sẽ được lưu vào thanh ghi R1

Tất cả các instruction sử dụng RF làm toán hạng đều có thể truynhập tất cả các RF một cách trực tiếp trong 1 chu kỳ xung clock, ngoạitrừ SBCI, SUBI, CPI, ANDI và LDI, các instruction này chỉ có thểtruy nhập các thanh ghi từ R16 đến R31

Thanh ghi R0 là thanh ghi duy nhất được sử dụng trong instructionLPM (Load Program Memory) Các thanh ghi R26, R27, R28, R29,R30 và R31 ngoài chức năng thông thường còn được sử dụng như cáccon trỏ (Pointer register) trong một số instruction truy xuất gián tiếp.Chúng ta sẽ khảo sát vấn đề con trỏ sau này Hình 3 mô tả các chứcnăng phụ của các thanh ghi

Trang 5

Hình 3 Register file.

Tóm lại 32 RF của AVR được xem là 1 phần của CPU, vì thếchúng được CPU sử dụng trực tiếp và nhanh chóng, để gọi các thanhghi này, chúng ta không cần gọi địa chỉ mà chỉ cần gọi trực tiếp têncủa chúng RF thường được sử dụng như các toán hạng (operand) củacác phép toán trong lúc lập trình

Phần 2: là phần nằm ngay sau register file, phần này bao gồm 64thanh ghi được gọi là 64 thanh ghi nhập/xuất (64 I/O register) hay còngọi là vùng nhớ I/O (I/O Memory) Vùng nhớ I/O là cửa ngõ giao tiếpgiữa CPU và thiết bị ngoại vi Tất cả các thanh ghi điều khiển, trạngthái…của thiết bị ngoại vi đều nằm ở đây Xem lại ví dụ trong bài 1,trong đó tôi có đề cập về việc điều khiển các PORT của AVR, mỗiPORT liên quan đến 3 thanh ghi DDRx, PORTx và PINx, tất cả 3thanh ghi này đều nằm trong vùng nhớ I/O Xa hơn, nếu muốn truy

Trang 6

xuất các thiết bị ngoại vi khác như Timer, chuyển đổi Analog/Digital,giao tiếp USART…đều thực hiện thông qua việc điều khiển các thanhghi trong vùng nhớ này.

Vùng nhớ I/O có thể được truy cập như SRAM hay như các thanh ghi I/O Nếu sử dụng instruction truy xuất SRAM để truy xuất vùng nhớ này thì địa chỉ của chúng được tính từ 0x0020 đến 0x005F Nhưng nếu truy xuất như các thanh ghi I/O thì địa chỉ của chúng đựơc tính từ 0x0000 đến 0x003F.

Xét ví dụ instruction OUT dùng xuất giá trị ra các thanh ghi I/O,lệnh này sử dụng địa chỉ kiểu thanh ghi, cấu trúc của lệnh như sau:OUT A, Rr, trong đó A là địa chỉ của thanh ghi trong vùng nhớ I/O,

Rr là thanh ghi RF, lệnh OUT xuất giá trị từ thanh ghi Rr ra thanh ghiI/O có địa chỉ là A Giả sử chúng ta muốn xuất giá trị chứa trong R6 rathanh ghi điều khiển hướng của PORTD, tức thanh ghi DDRD, địa chỉtính theo vùng I/O của thanh ghi DDRD là 0x0011, như thế câu lệnhcủa chúng ta sẽ có dạng: OUT 0x0011, R6 Tuy nhiên trong 1 trườnghợp khác, nếu muốn truy xuất DDRD theo dạng SRAM, ví dụ lệnhSTS hay LDS, thì phải dùng địa chỉ tuyệt đối của thanh ghi này, tứcgiá trị 0x0031, khi đó lệnh OUT ở trên được viết lại là STS 0x0031,R6

Để thống nhất cách sử dụng từ ngữ, từ bây giờ chúng ta dùng khái niệm “địa chỉ I/O” cho các thanh ghi trong vùng nhớ I/O để nói đến địa chỉ không tính phần Register File, khái niệm “địa chỉ bộ nhớ” của thanh ghi là chỉ địa chỉ tuyệt đối của chúng trong SRAM Ví dụ thanh ghi DDRD có “địa chỉ I/O” là 0x0011 và “địa chỉ bộ nhớ” của nó là 0x0031, “địa chỉ bộ nhớ” = “địa chỉ I/O” + 0x0020.

Vì các thanh ghi trong vùng I/O không được hiểu theo tên gọi nhưcác Register file, khi lập trình cho các thanh ghi này, người lập trìnhcần nhớ địa chỉ của từng thanh ghi, đây là việc tương đối khó khăn.Tuy nhiên, trong hầu hết các phần mềm lập trình cho AVR, địa chỉcủa tất cả các thanh ghi trong vùng I/O đều được định nghĩa trướctrong 1 file Definition, bạn chỉ cần đính kèm file này vào chương trìnhcủa bạn là có thể truy xuất các thanh ghi với tên gọi của chúng Giả sửtrong ví dụ ở bài 1, để lập trình cho chip Atmega8 bằng AVRStudio,

Trang 7

dòng thứ 2 chúng ta sử dụng INCLUDE "M8DEF.INC" để load fileđịnh nghĩa cho chip ATMega8, file M8DEF.INC Vì vậy, trong saunày khi muốn sử dụng thanh ghi DDRD bạn chỉ cần gọi tên củachúng, như: OUT DDRD,R6.

Phần 3: RAM tĩnh, nội (internal SRAM), là vùng không gian chochứa các biến (tạm thời hoặc toàn cục) trong lúc thực thi chương trình,vùng này tương tự các thanh RAM trong máy tính nhưng có dunglượng khá nhỏ (khoảng vài KB, tùy thuộc vào loại chip)

Phần 4: RAM ngoại (external SRAM), các chip AVR cho phépngười sử dụng gắn thêm các bộ nhớ ngoài để chứa biến, vùng này thựcchất chỉ tồn tại khi nào người sử dụng gắn thêm bộ nhớ ngoài vàochip

Phần 5: EEPROM (Electrically Ereasable Programmable ROM) làmột phần quan trọng của các chip AVR mới, vì là ROM nên bộ nhớnày không bị xóa ngay cả khi không cung cấp nguồn nuôi cho chip, rấtthích hợp cho các ứng dụng lưu trữ dữ liệu Như trong hình 1, phần bộnhớ EEPROM được tách riêng và có địa chỉ tính từ 0x0000

Câu hỏi bây giờ là AVR hoạt động như thế nào?

Hình 4 biểu diễn cấu trong bên trong của 1 AVR Bạn thấy rằng 32thanh ghi trong Register File được kết nối trực tiếp với ArithmeticLogic Unit -ALU (ALU cũng được xem là CPU của AVR) bằng 2line, vì thế ALU có thể truy xuất trực tiếp cùng lúc 2 thanh ghi RF chỉtrong 1 chu kỳ xung clock (vùng được khoanh tròn màu đỏ trong hình4)

Trang 8

Hình 4 Cấu trúc bên trong AVR.

Các instruction được chứa trong bộ nhớ chương trình Flashmemory dưới dạng các thanh ghi 16 bit Bộ nhớ chương trình đượctruy cập trong mỗi chu kỳ xung clock và 1 instruction chứa trongprogram memory sẽ được load vào trong instruction register,instruction register tác động và lựa chọn register file cũng như RAMcho ALU thực thi Trong lúc thực thi chương trình, địa chỉ của dònglệnh đang thực thi được quyết định bởi một bộ đếm chương trình – PC(Program counter) Đó chính là cách thức hoạt động của AVR

AVR có ưu điểm là hầu hết các instruction đều được thực thi trong

1 chu kỳ xung clock, vì vậy có thể nguồn clock lớn nhất cho AVR cóthể nhỏ hơn 1 số vi điều khiển khác như PIC nhưng thời gian thực thivẫn nhanh hơn

III Stack.

Trang 9

Stack được hiểu như là 1 “tháp” dữ liệu, dữ liệu được chứa vàostack ở đỉnh “tháp” và dữ liệu cũng được lấy ra từ đỉnh Kiểu truy cập

dữ liệu của stack gọi là LIFO (Last In First Out – vào sau ra trước).Hình 5 thể hiện cách truy cập dữ liệu của stack

Hình 5 Stack

Khái niệm và cách thức hoạt động của stack có thể được áp dụng cho AVR, bằng cách khai báo một vùng nhớ trong SRAM là stack ta

có thể sử dụng vùng nhớ này như một stack thực thụ

Để khai báo một vùng SRAM làm stack chúng ta cần xác lập địachỉ đầu của stack bằng cách xác lập con trỏ stack-SP (Stack Pointer)

SP là 1 con trỏ 16 bit bao gồm 2 thanh ghi 8 bit SPL và SPH (chữ L làLOW chỉ thanh ghi mang giá trị byte thấp của SP, và H = HIGH), SPL

và SPH nằm trong vùng nhớ I/O Giá trị gán cho thanh ghi SP sẽ là địachỉ khởi động của stack Quay lại ví dụ ở bài 1, phần khởi tạo các điềukiện đầu

; KHOI TAO CÁC DIEU KIEN DAU

Trang 10

M8DEF.INC Như thế sau 4 dòng trên, con trỏ SP chứa giá trị cuốicùng của SRAM hay nói cách khác vùng stack bắt đầu từ vị trí cuốicùng của bộ nhớ SRAM Nhưng tại sao là vị trí cuối cùng mà không là

1 giá trị khác Có thể giải thích như sau: stack trong AVR hoạt động từtrên xuống, sau khi dữ liệu được đẩy vào stack, SP sẽ giảm giá trị vìthế khởi động SP ở vị trí cuối cùng của SRAM sẽ tránh được việc mất

dữ liệu do ghi đè Bạn có thể khởi động stack với 1 địa chỉ khác, tuynhiên vì lý do an toàn, nên khởi động stack ở RAMEND

Hai instruction dùng cho truy cập stack là PUSH và POP, trong đóPUSH dùng đẩy dữ liệu vào stack và POP dùng lấy dữ liệu ra khỏistack Dữ liệu được đẩy vào và lấy ra khỏi stack tại vị trí mà con trỏ

SP trỏ đến Ví dụ cho chip ATMega8, RAMEND=0x045F, sau khikhởi động, con trỏ SP trỏ đến vị trí 0x045F trong SRAM, nếu ta viếtcác câu lệnh sau:

Khi đó nội dung của stack sẽ như trong hình 6

Hình 6 Nội dung stack trong ví dụ

Sau mỗi lần PUSH dữ liệu, SP sẽ giảm 1 đơn vị và trỏ vào vị trítiếp theo

Trang 11

Bây giờ nếu ta dùng POP để lấy dữ liệu từ stack, POP R2, thì R2 sẽmang giá trị của ngăn nhớ 0x045D, tức R2=8 Trước khi instructionPOP được thực hiện, con trỏ SP được tăng lên 1 đơn vị, sau đó dữ liệu

sẽ được lấy ra từ vị trí mà SP trỏ đến trong stack

Stack trong AVR không phải là “vô đáy”, nghĩa là chúng ta chỉ cóthể PUSH dữ liệu vào stack ở 1 độ sâu nhất định nào đấy (phụ thuộcvào chip) Sử dụng stack không đúng cách đôi khi sẽ làm chương trìnhthực thi sai hoặc tốn thời gian thực thi vô ích Vì thế không nên sửdụng stack chỉ để lưu các biến thông thường Ứng dụng phổ biến nhấtcủa stack là sử dụng trong các chương trình con (Subroutine), khichúng ta cần “nhảy” từ một vị trí trong chương trình chính đến 1chương trình con, sau khi thực hiện chương trình con lại muốn quay

về vị trí ban đầu trong chương trình chính thì Stack là phương cách tối

ưu dùng để chứa bộ đếm chương trình trong trường hợp này Xem lại

ví dụ trong bài 1, trong chương trình chính chúng ta dùng lệnhRCALL DELAY để nhảy đến đoạn chương trình con DELAY,RCALL là lệnh nhảy đến 1 vị trí trong bộ nhớ chương trình, trước khinhảy, PC được cộng thêm 1 và PUSH một cách tự động vào stack.Cuối chương trình con DELAY, chúng ta dùng instruction RET,instruction này POP dữ liệu từ stack ra PC một cách tự động, bằngcách này chúng ta có thể quay lại vị trí trước đó Chính vì các lệnhRCALL và RET sử dụng stack một cách tự động nên ta phải khởiđộng stack ngay từ đầu, nếu không chương trình sẽ thực thi sai chứcnăng

Tóm lại cần khởi động stack ở đầu chương trình và không nên sửdụng stack một cách tùy thích nếu chưa thật cần thiết

IV Thanh ghi trạng thái - SREG (STATUS REGISTRY).

Nằm trong vùng nhớ I/O, thanh ghi SREG có địa chỉ I/O là0x003F và địa chỉ bộ nhớ là 0x005F (thường đây là vị trí cuối cùngcủa vùng nhớ I/O) là một trong số các thanh ghi quan trọng nhất củaAVR, vì thế mà tôi dành phần này để giới thiệu về thanh ghi này.Thanh ghi SREG chứa 8 bit cờ (flag) chỉ trạng thái của bộ xử lí, tất cả

Trang 12

các bit này đều bị xóa sau khi reset, các bit này cũng có thể được đọc

và ghi bởi chương trình Chức năng của từng bit được mô tả như sau:

Hình 7 Thanh ghi trạng thái

Bit 0 – C (Carry Flag: Cờ nhớ): là bit nhớ trong các phép đại

số hoặc logic, ví dụ thanh ghi R1 chứa giá trị 200, R2 chứa 70, chúng

ta thực hiện phép cộng có nhớ: ADC R1, R2, sau phép cộng, kết quả

sẽ được lưu lại trong thanh ghi R1, trong khi kết quả thực là 270 màthanh ghi R1 lại chỉ có khả năng chứa tối đa giá trị 255 (vì có 8 bit)nên trong trường hợp này, giá trị lưu lại trong R1 thực chất chỉ là 14,đồng thời cờ C được set lên 1 (vì 270=100001110, trong đó 8 bit sau

00001110 =14 sẽ được lưu lại trong R1)

Bit 1 – Z (Zero Flag: Cờ 0): cờ này được set nếu kết quả phéptoán đại số hay phép Logic bằng 0

Bit 2 – N (Negative Flag: Cờ âm): cờ này được set nếu kết quảphép toán đại số hay phép Logic là số âm

Bit 3 – V (Two’s complement Overflow Flag: Cờ tràn của bù 2): hoạt động của cờ này có vẻ sẽ khó hiểu cho bạn vì nó liên quanđến kiến thức số nhị phân (phần bù), chúng ta sẽ đề cập đến khi nàothấy cần thiết

Trang 13

Bit 4 – S (Sign Bit: Bit dấu): Bit S là kết quả phép XOR giữa 1

cờ N và V, S=N xor V

Bit 5 – H (Half Carry Flag: Cờ nhờ nữa): cờ H là cờ nhớ trong

1 vài phép toán đại số và phép Logic, cờ này hiệu quả đối với cácphép toán với số BCD

Bit 6 – T (Bit Copy Storage): được sử dụng trong 2 InstructionBLD (Bit LoaD) và BST (Bit STorage) Tôi sẽ giải thích chức năngBit T trong phần giới thiệu về BLD và BST

Bit 7 – I (Global Interrupt Enable) : Cho phép ngắt toàn bộ):Bit này phải được set lên 1 nếu trong chương trình có sử dụng ngắt.Sau khi set bit này, bạn muốn kích hoạt loại ngắt nào cần set các bitngắt riêng của ngắt đó Hai instruction dùng riêng để Set và Clear bit I

là SEI và CLI

Chú ý: tất cả các bit trong thanh ghi SREG đều có thể được xóathông qua các instruction không toán hạng CLx và set bởi SEx, trong

đó x là tên của Bit.Ví dụ CLT là xóa Bit T và SEI là set bit I

Tôi chỉ giải thích ngắn gọn chức năng của các bit trong thanh ghiSREG, cụ thể chức năng và cách sử dụng của từng bit chúng ta sẽ tìmhiểu trong các trường hợp cụ thể sau này, người đọc có thể tự tìm hiểuthêm trong các tài liệu về INSTRUCTION cho AVR

Tôi cung cấp thêm 1 bảng tóm tắt sự ảnh hưởng của các phép toán đại số, logic lên các Bit trong thanh ghi SREG

Trang 14

Hình 8 Ảnh hưởng của các phép toán lên SREG.

IV Macro và chương trình con.

Macro là khái niệm chỉ một đoạn code nhỏ để thực hiện một côngviệc nào đó, nếu có 1 đoạn code nào đó mà bạn rất hay sử dụng khilập trình thì bạn nên dùng macro để tránh việc phải viết đi viết lạiđoạn code đó Lập trình ASM cho AVR cho phép bạn sử dụng Macro,

để tạo 1 Macro bạn sử dụng DIRECTIVE

.MACRO delay4

NOP

NOP

NOP

Trang 15

.ENDMACRO

Đoạn Macro trên có tên delay4 thực hiện việc delay 4 chu kỳ máybằng 4 lệnh NOP, nếu trong chương trình bạn cần dùng Macro này thì chỉ cần gọi delay4 ở bất kỳ dòng nào

[…] ; code của bạn

Delay4

[…] ; code của bạn

Mỗi lần tên của Macro được gọi, trình biên dịch sẽ tìm đến Macro

đó và copy toàn bộ nội dung Macro vào vị trí bạn gọi Như vậy thựcchất con trỏ chương trình không nhảy đến Macro, Macro không làmgiảm dung lương chưong trình mà chỉ làm cho việc lập trình nhẹnhàng hơn Đây chính là khác biệt lớn nhất của Macro và Subroutine(chương trình con)

Chương trình con cũng là 1 đoạn code thực hiện 1 chức năngđặc biệt nào đó Tuy nhiên khác với Macro, mỗi khi gọi chương trìnhcon, con trỏ chương trình nhảy đến chương trình con đề thực thichương trình con và sau đó quay về chương trình chính Như thếchương trình con chỉ được biên dịch 1 lần và có thể sử dụng nhiều lần,

nó làm giảm dung lượng chưong trình Đây là ưu điểm và cũng làđiểm khác biệt lớn nhất giữa chương trình con và Macro Tuy nhiêncần chú ý là việc nhảy đến chương trình con và nhảy về chương trìnhchính cần vài chu kỳ máy, có thể làm chậm chương trình, đây lànhược điểm của chương trình con so với macro

Chương trình con cho AVR luôn được bắt đầu bằng 1 Label, đócũng là tên và địa chỉ của chương trình con Chương trình con thườngđược kết thúc với câu lệnh RET (Return) Chúng ta đã biết về chươngtrình con qua ví dụ của bài 1, trong đó DELAY là 1 chương trình con

Để gọi chương trình con từ 1 vị trí nào đó trong chương trình,chúng ta có thể dùng lệnh CALL hoặc RCALL(Relative CALL) (xemlại ví dụ bài 1 về cách sử dụng RCALL) Mỗi khi các lệnh này đượcgọi, bộ đếm chương trình được tự động được PUSH vào stack và khichương trình con kết thúc bằng lệnh RET, bộ đếm chương trình đượcPOP trở ra và quay về chương trình chính Lệnh CALL có thể gọi 1

Trang 16

chương trình con ở bất kỳ vị trí nào trong khi RCALL chỉ gọi trongkhoảng bộ nhớ 4KB, nhưng RCALL cần ít chu kỳ xung clock hơn khithực thi.

Hai instruction khác có thể được dùng để gọi chương trình con đó

là JMP (Jump) và RJMP (Relative Jump) Khác với các lệnh call, cáclệnh jump không cho phép quay lại vì không tự động PUSH bộ đếmchương trình vào Stack, để sử dụng các lệnh này gọi chương trình conbạn cần một số lệnh jump khác ở cuối chương trình con

Tóm lại bạn nên viết 1 chương trình con đúng chuẩn và dùngCALL hoặc RCALL để gọi chương các chương trình này, chỉ nhữngtrường hợp đặc biệt hoặc bạn hiểu rất rõ về chúng thì có thể dùng cáclệnh jump

V Ví dụ minh họa.

Nếu bạn đã đọc và hiểu đến thời điểm này thì bạn đã có thể hiểuhết hoạt động của chương trình ví dụ trong bài 1, thật sự ví dụ đó rấtđơn giản và dễ hiểu Tuy nhiên, bạn có thề tối ưu hóa ví dụ đó theohướng làm giảm dung lượng chương trình và tất nhiên, chương trình

sẽ khó hiểu hơn cho người khác Các phần khởi động vị trí bộ nhớ,stack và chương trình con DELAY chúng ta không thay đổi, chỉ thayđổi phần chương trình chính, 1 trong những cách viết chương trìnhchính như cách sau:

; CHUONG TRINH CHINH , BAI 1, VI DU 1, VERSION2///////////////////////////////

MAIN:

RCALL DELAY ; GOI CHUONG TRINH CON DELAY

;/////////////////////////////////////////////////////////////////////////////////////////

Có thể không cần giải thích bạn cũng đã có thể hiểu đoạn codetrên, đây chỉ là 1 trong những cách có thể, bạn hãy viết lại theo cách

Trang 17

của riêng bạn với yêu cầu là chương trình phải thực hiện đúng chứcnăng và ngắn gọn.

Bây giờ chúng ta sẽ thực hiện một ví dụ minh họa cho những gìchúng ta đã học trong bài 2 này Nội dung của ví dụ thể hiện trongmạch điện hình 9 Hoạt động của mạch điện tử như sau: 1 chipATMega8 được sử dụng như một counter, có thể dùng để đếm lên vàđếm xuống, 2 button trong mạch điện tác động như 2 “kicker”, nhấnbutton 1 để đếm lên và button để đếm xuống, giá trị đếm nằm trongkhoảng từ 0 đến 9 Giá trị đếm được hiển thị trên 1 LED 7 đoạn loạianod chung (dương chung), chip 7447 được dùng để giải mã từ giá trịBCD xuất ra bởi ATMega8 sang tín hiệu cho LED 7 đoạn anod chung,chúng ta cần sử dụng 7447 vì tín hiệu xuất ra từ chip ATMega8 làdạng nhị phân hoặc BCD , tín hiệu này không thể hiển thị trực tiếptrên các LED 7 đoạn, chip 7447 có nhiệm vụ chuyển 1 dữ liệu dạngdigit BCD sang mã phù hợp cho LED 7 đoạn

Để thực hiện ví dụ, trước hết bạn hãy vẽ mạch điện như tronghình 9 bằng phần mềm Proteus (xem cách vẽ mạch điện bằngProteus), mạch điện chỉ có 5 loại linh kiện là chip ATMega8 (từ khóamega8), 1 LED 7 đoạn anod chung với tên đầy đủ trong Proteus là7SEG-COM-AN-GRN (từ khóa 7SEG), 1 chip 7447 (từ khóa 7447), 1điện trở 10 Ω và 2 button (từ khóa button)

Hình 9 Ví dụ cho bài 2

Trang 18

Sử dụng AVRStudio tạo 1 project mới với tên gọi avr2 (xem lại

cách tạo Project mới trong AVRStudio) Viết lại phần code bên dưới

vào vào file avr2.asm

List 1 Ví dụ cấu trúc AVR

OUT DDRB, R16 ; DDRB=0, PORTB LA NGO NHAP

LDI R16, 0xFF ; SET TAT CA CAC BIT CUA R16 LEN 1

OUT PORTB,R16 ;DDRB=0, PORTB =0xFF, KEO LEN CAC CHAN PORTB

OUT DDRD, R16 ;DDRD=0xFF, PORTD LA NGO XUAT

CLR R25 ;XOA R25, R25 LA THANH GHI DUNG CHUA SO DEM

SER R20 ; R20 LA THANH GHI TAM CHUA GIA TRI TRUOC DO CUA PINB

MAIN:

IN R21,PINB ;DOC GIA TRI TU PINB, TUC TU CAC BUTTON

RCALL SOSANH ;GOI CHUONG TRINH CON SOSANH

OUT PORTD, R25 ;XUAT GIA TRI DEM RA PORTD

SBRS R21,0 ;NEU BIT 0 CUA R21 (TUC CHAN PB0) =1 THI BO QUA DONG ;TIEP THEO

RCALL TANG ;NHAY DEN CHUONG TRINH CON TANG GIA TRI DEM

SBRS R21,1 ;NEU BIT 1 CUA R21 (TUC CHAN PB1) =1 THI BO QUA DONG ;TIEP THEO

RCALL GIAM ;NHAY DEN CHUONG TRINH CON GIAM GIA TRI DEM

MOV R20,R21 ;LUU LAI TRANG THAI PINB

RJMP MAIN

;**********************CHUONG TRINH CON************************

; **************subroutine kiem tra gioi hang (tu 0 den 9) cua so dem

SOSANH:

CPI R25, 10

BREQ RESET0 ;NEU GIA TRI DEM=10 THI TRA VE 0

Trang 19

BREQ RESET9 ;NEU GIA TRI DEM =255 THI TRA VE 9

RJMP QUAYVE ;NHAY DEN NHAN QUAYVE

sẽ được chip ATMega8 nhận thông qua 2 chân PB0 và PB1 củaPORTB

Hoạt động của cac PORT và việc xác lập 1 PORT như các ngõxuất chúng ta đã khảo sát trong bài 1 Ở đây chúng ta khảo sát thêm vềxác lập PORT như 1 ngõ nhập, trước hết bạn hãy quan sát mạch điệntương đương của 1 chân trong các PORT xuất nhập của AVR tronghình 10

Trang 20

Hình 10 Cấu trúc chân trong PORT của AVR.

Trong mạch điện hình 10, các diode và tụ điện chỉ có chức năngbảo vệ chân PORT, nhưng điện trở Rpu (R Pull up) đóng vai trò quantrọng như là điện trở kéo lên khi chân của PORT làm nhiệm vụ nhậntín hiệu (ngõ nhập) Tuy nhiên trong AVR, điện trở kéo lên này khôngphải luôn kích hoạt, chúng ta biết rằng mỗi PORT của AVR có 3thanh ghi: DDRx, PORTx và PINx, nếu DDRx=0 thì PORT x là ngõnhập, lúc này thanh ghi PINx là thanh ghi chứa dữ liệu nhận về, đặcbiệt thanh ghi PORTx vẫn được sử dụng trong mode này, đó là thanhghi xác lập điện trở kéo lên, như thế nếu DDRx=0 và PORTx=0xFFthì các chân PORTx là ngõ nhập và được kéo lên bởi 1 điện trở trongchip, nghĩa là các chân của PORTx luôn ở mức cao, muốn kích đểthay đồi trạng thái chân này chúng ta cần nối chân đó trực tiếp vớiGND, đấy là lý do tại sao các button trong mạch điện của chúng ta có

1 đầu nối với chân của chip còn đầu kia được nối với GND Đây cũng

là ý nghĩa của khái niệm điện trở kéo lên (Pull up resistor) trong kỹthuật điện tử Đoạn code trong phần “KHOI DONG CAC PORT” của

ví dụ này xác lập PORTD là ngõ xuất (DDRD=0xFF) , PORTB là ngõnhập có sử dụng điện trở kéo lên (DDRB=0, PORTB=0xFF) Chúng ta sẽ giải thích hoạt động của đoạn chương trình chính vàcác đoạn chương trình con Trước hết, trong chương trình này, chúng

ta sử dụng 3 thanh ghi chính là R20, R21 và R25, trong đó R25 làthanh ghi chứa số đếm, giá trị của thanh ghi R25 sẽ được xuất ra

Trang 21

PORTD của chip, thanh ghi R21 chứa trạng thái của thanh ghi PINB

và cũng là trạng thái của các button, thanh ghi R20 kết hợp với thanhghi R21 tạo thành 1 “bộ đếm cạnh xuống” của các button Để hiểuthấu đáo hoạt động đếm (cũng là hoạt động chính của ví dụ này)chúng ta xét trạng thái chân PB0 như trong hình 11

Hình 11 Thay đổi trạng thái ở các chân I/O

Trong trạng thái bình thường (button không được nhấn), chân PB0

ở mức cao (do điện trở kéo lên), bộ đếm không hoạt động, giá trị đếmkhông thay đổi, bây giờ nếu nhấn button, chân PB0 được nối trực tiếpvới GND, chân này sẽ bị kéo xuống mức thấp, bằng cách kiểm tratrạng thái chân PB0, nếu PB0=0 ta tăng giá trị đếm 1 đơn vị Ý tưởngnhư thế có vẻ hợp lý, tuy nhiên nếu áp dụng thì chương trình sẽ hoạtđộng không đúng chức năng, khi bạn nhấn 1 lần giá, trị đếm có thểtăng đến cả trăm hoặc không kiểm soát được, hiệu ứng này tương tựkhi bạn nhấn và giữ 1 phím trên bàn phím máy tính, lý do là vì chúng

ta sử dụng phương pháp kiểm tra mức để đếm, thời gian quét củachương trình rất ngắn so với thời gian chúng ta giữ button Để khắcphục, chúng ta dùng phương pháp kiểm tra cạnh xuống, chỉ khi nàophát hiện chân PB0 thay đổi từ 1 xuống 0 thì mới tăng giá trị đếm 1đơn vị, kết quả là mỗi lần nhấn button thì giá trị đếm chỉ tăng 1 (ngay

cả khi ta nhấn và giữ button), thanh ghi R20 được sử dụng để lưutrạng thái trước đó của PINB (cũng là trạng thái của các button) Trong chương trình, tôi sử dụng 2 istruction mới là SBRC vàSBRS để kiểm tra trạng thái các chân của PORTB (button) SBRC –Skip if Bit in Register is Clear, lệnh này sẽ bỏ qua 1 dòng lệnh ngaysau đó (chỉ bỏ qua 1 dòng duy nhất) nếu 1 bit trong thanh ghi ở mức 0,SBRC – Skip if Bit in Register is Set- hoạt động tương tự SBRCnhưng skip sẽ xảy ra nếu bit trong thanh ghi ở mức 1 Dựa vào đâychúng ta giải thích 4 dòng sau:

Trang 22

SBRS R21,0 ;NEU BIT 0 CUA R21 (TUC CHAN PB0) =1 THI BO QUA DONG ;TIEP THEO

RCALL TANG ;NHAY DEN CHUONG TRINH CON TANG GIA TRI DEM

QUA DONG ;TIEP THEO

RCALL GIAM ;NHAY DEN CHUONG TRINH CON GIAM GIA TRI DEM

Dòng 1 dùng kiểm tra trạng thái bit 0 trong R21 (chú ý R21 chứagiá trị của PINB), nếu bit này bằng 1 (set), tức chân PB0=1 hay buttonkhông được nhấn, thì nhảy bỏ qua dòng lệnh tiếp theo để đến dòng 3

Ở dòng 3 chương trình kiểm tra trạng thái chân PB1 (button thứ 2).Quay lại dòng 1, nếu chương trình kiểm tra phát hiện chân PB0=0(button thứ nhất được nhấn) thì dòng lệnh thứ 2 được thực thi, kết quả

là chương trình nhảy đến chương trình con TANG

từ 1->0 ở chân này, giá trị đếm sẽ được tăng thêm 1 nhờ INC R25, sau

đó quay về chương trình chính.Tóm lại muốn tăng giá trị đếm thêm 1 đơn vị cần thỏa mãn 2 điềukiện: chân PB0 hiện tại =0 (button đang được nhấn) và trạng tháitrước đó của PB0 phải là 1 (tránh trường hợp tăng liên tục) Phươngpháp này có thể áp dụng cho rất nhiều trường hợp đếm dạng đếmxung

Quá trình giảm giá trị đếm được hiểu tương tự, phần còn lại của ví

dụ này bạn đọc hãy tự giải thích theo những gợi ý trên

Trang 23

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 gian bộ nhớ.

4 Rẽ nhánh và vòng lặp.

Làm quen AVR.

Cấu trúc AVR WinAVR

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

Trang 24

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).

 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).

Trang 25

 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).

Ngày đăng: 14/03/2013, 21:21

Xem thêm

HÌNH ẢNH LIÊN QUAN

Hình 1. Tổ chức bộ nhớ của AVR. - bai2.cau truc avr
Hình 1. Tổ chức bộ nhớ của AVR (Trang 3)
Hình 3. Register file. - bai2.cau truc avr
Hình 3. Register file (Trang 5)
Hình 4. Cấu trúc bên trong AVR. - bai2.cau truc avr
Hình 4. Cấu trúc bên trong AVR (Trang 8)
Hình 5. Stack. - bai2.cau truc avr
Hình 5. Stack (Trang 9)
Hình 6. Nội dung stack trong ví dụ. - bai2.cau truc avr
Hình 6. Nội dung stack trong ví dụ (Trang 10)
Hình 8. Ảnh hưởng của các phép toán lên SREG. - bai2.cau truc avr
Hình 8. Ảnh hưởng của các phép toán lên SREG (Trang 14)
Hình 9. Ví dụ cho bài 2. - bai2.cau truc avr
Hình 9. Ví dụ cho bài 2 (Trang 17)
Hình 2. Giao diện pn - bai2.cau truc avr
Hình 2. Giao diện pn (Trang 46)
Hình 3. Option cho pn. - bai2.cau truc avr
Hình 3. Option cho pn (Trang 47)
Hình 4. Add chức năng tạo file COFF cho pn. - bai2.cau truc avr
Hình 4. Add chức năng tạo file COFF cho pn (Trang 48)
Hình 6. Tools menu. - bai2.cau truc avr
Hình 6. Tools menu (Trang 49)
Hình 7. Chương trình tiện ích MFile. - bai2.cau truc avr
Hình 7. Chương trình tiện ích MFile (Trang 50)

TỪ KHÓA LIÊN QUAN

w