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.
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:
- cung_hoc_avr_avr2_cau_truc_avr.pdf