Cùng học AVR - AVR2: 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 1 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ớ.

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

pdf25 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: tuando | Lượt xem: 621 | Lượt tải: 1download
Tóm tắt nội dung Cùng học AVR - AVR2: Cấu trúc AVR, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
CHO R16 
MAIN: 
 OUT PORTB, R16 ; XUAT GIA TRI TRONG R16 RA PORTB 
 RCALL DELAY ; GOI CHUONG TRINH CON DELAY 
 ROL R16 ; XOAY THANH GHI R16 SANG TRAI 1 VI TRI 
 RJMP MAIN ; NEU R16 ≠0, NHAY VE MAIN, TIEP TUC QUET 
 ;////////////////////////////////////////////////////////////////////////////////////////// 
 Có thể không cần giải thích bạn cũng đã có thể hiểu đoạn code trên, đây chỉ là 1 trong 
những cách có thể, bạn hãy viết lại theo cách 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ức nă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 trong mạch điện hình 9. Hoạt động của mạch điện tử như sau: 1 
chip ATMega8 được sử dụng như một counter, có thể dùng để đếm lên và đếm xuống, 2 button 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
trong mạch điện tác động như 2 “kicker”, nhấn button 1 để đếm lên và button để đếm xuống, giá 
trị đếm nằm trong khoảng từ 0 đến 9. Giá trị đếm được hiển thị trên 1 LED 7 đoạn loại anod 
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ếp trên các LED 7 
đoạn, chip 7447 có nhiệm vụ chuyển 1 dữ liệu dạng digit 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ư trong hình 9 bằng phần mềm Proteus 
(xem cách vẽ mạch điện bằng Proteus trong ví dụ bài 1), mạch điện chỉ có 5 loại linh kiện là chip 
ATMega8 (từ khóa mega8), 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. 
Sử dụng AVRStudio tạo 1 project mới với tên gọi avr2 (xem lại ví dụ bài 1 để biết 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 
.INCLUDE "M8DEF.INC" 
.CSEG. 
.ORG 0x0000 
 RJMP BATDAU 
.ORG 0x0020 
BATDAU: 
 ;KHOI DONG STACK POINTER 
 LDI R17, HIGH(RAMEND) 
 LDI R16, LOW(RAMEND) 
 OUT SPL, R16 
 OUT SPH,R17 
 ; KHOI DONG CAC PORT 
 CLR R16 ; XOA R16, R16=0 
 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 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
 OUT DDRD, R16; DDRD=0xFF, PORTD LA NGO XUAT 
 CLR R25; XOA R25, R25 LA THANH GHI DUNG CHUA SO DEM 
 SER R20 ; R21 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 
 CPI R25, 255 
 BREQ RESET9; NEU GIA TRI DEM =255 THI TRA VE 9 
 RJMP QUAYVE; NHAY DEN NHAN QUAYVE 
RESET0: 
 LDI R25,$0; TRA GIA TRI DEM VE 0 
 RJMP QUAYVE 
RESET9: 
 LDI R25,$9; GAN 9 CHO GIA TRI DEM 
QUAYVE: 
 RET 
; ************************************************************ 
; **************subroutine tang so dem 1 don vi neu dieu kien thoa 
TANG: 
 SBRS R20,0 
 RET 
 INC R25 
 RET 
; **************subroutine giam so dem 1 don vi neu dieu kien thoa 
GIAM: 
 SBRS R20,1 
 RET 
 DEC R25 
 RET 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Trong ví này này, chúng ta sử dụng 2 PORT của chip ATMega8, PORTD dùng xuất dữ liệu 
(số đếm) ra chip 7447 và sau đó hiển thị trên LED 7 đoạn. PORTB dùng như ngõ nhập, tín hiệu từ 
các button sẽ được chip ATMega8 nhận thông qua 2 chân PB0 và PB1 của PORTB. 
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ện tương đương của 1 chân trong các PORT xuất nhập của AVR trong hình 10. 
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ăng bảo vệ chân PORT, nhưng 
điện trở Rpu (R Pull up) đóng vai trò quan trọng như là điện trở kéo lên khi chân của PORT làm 
nhiệm vụ nhận tín hiệu (ngõ nhập). Tuy nhiên trong AVR, điện trở kéo lên này không phải luôn 
kích hoạt, chúng ta biết rằng mỗi PORT của AVR có 3 thanh 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ề, đặc 
biệt thanh ghi PORTx vẫn được sử dụng trong mode này, đó là thanh ghi xác lập điện trở kéo lên, 
như thế nếu DDRx=0 và PORTx=0xFF thì các chân PORTx là ngõ nhập và được kéo lên bởi 1 
điện trở trong chip, 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ới GND, đấ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 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 thanh ghi R21 tạo thành 1 “bộ đếm cạnh xuống” của các button. Để hiểu thấ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. 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
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ị đếm không thay đổi, bây giờ nếu nhấn button, chân PB0 
được nối trực tiếp với GND, chân này sẽ bị kéo xuống mức thấp, bằng cách kiểm tra trạng thái 
chân PB0, nếu PB0=0 ta tăng giá trị đếm 1 đơn vị. Ý tưởng như 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ủa chương trình rất ngắn so với thời gian chúng ta giữ button. Để khắc phục, chúng ta dùng 
phương pháp kiểm tra cạnh xuống, chỉ khi nào phá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ưu trạ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 ngay sau đó (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ự SBRC nhưng skip sẽ xảy ra nếu bit trong thanh ghi ở 
mức 1. Dựa vào đây chúng ta giải thích 4 dòng sau: 
 SBRS R21,0 
 RCALL TANG 
 SBRS R21,1 
 RCALL GIAM 
Dòng 1 dùng kiểm tra trạng thái bit 0 trong R21 (chú ý R21 chứa giá trị của PINB), nếu bit 
này bằng 1 (set), tức chân PB0=1 hay button khô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. 
TANG: 
 SBRS R20,0 
 RET 
 INC R25 
 RET 
Dòng đầu tiên của chương trình con TANG là kiểm tra trạng thái trước đó của chân PB0 
(được lưu ở bit 0 trong thanh ghi R20), nếu trạng thái này bằng 0, nghĩa là không có sự chuyển từ 
1 xuống 0 ở chân PB0, dòng 2 (lệnh RET) sẽ được thực thi để quay về chương trình chính. Nhưng 
nếu PB0 trước đó bằng 1, nghĩa là có sự thay đổi 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ều kiện: chân PB0 hiện tại =0 
(button đang được nhấn) và trạng thái trước đó của PB0 phải là 1 (tránh trường hợp tăng liên tục). 
Phương pháp này có thể áp dụng cho rất nhiều trường hợp đếm dạng đếm xung. 
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. 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Chúng ta kết thúc bài 2 ở đây, sau bài này tôi hy vọng bạn sẽ nắm được một cách chung nhất 
cấu trúc và hoạt động của chip AVR, đây là cơ sở quan trọng để sử dụng hiệu quả loại vi điều 
khiển này. Kể từ các bài sau, chúng ta sẽ tìm hiểu hoạt động và ứng dụng của các thiết bị ngoại vi 
trên AVR như Timer, chuyển đổi analog to digital (ADC), các chuẩn giao tiếp 
Các thắc mắc về nội dung và cách sử dụng tài liệu, các bạn có thể liên hệ tác giả qua email: 
thanhtam.h@gmail.com hoặc sim@mophong.org 

File đính kèm:

  • pdfcung_hoc_avr_avr2_cau_truc_avr.pdf