Báo cáo đồ án thực tập tốt nghiệp
Nội dung: Thiết kế mạch điều khiển động cơ DC và hiển thị
tốc độ ra màn hình LCD.
Giáo viên hướng dẫn: Đặng Thị Hương Giang
Hà Thanh Sơn
Nhóm sinh viên thực hiện: nhóm tối 3, 5,7. ca 5h30-8h
1051070056 Ngô Thị Mai 22/06/1992
1051070048 Nguyễn Hoàng Long 22/02/1992
1051070060 Nguyễn Thị Oanh 24/11/1992
1051070069 Nguyễn Hồng Quân 18/09/1992
1051070063 Đàm Văn Phương 28/01/1992
1051070081 Nguyễn Thị Sản 01/02/1992
1051070093 Nguyễn Thị Thao 15/01/1991
1051070003 Nguyễn Việt Điển 01/04/1991
1051070104 Nguyễn Minh Tú 11/10/1991
1051070109 Đỗ Văn Tuấn 28/09/1991
1051070099 Nguyễn Thanh Tùng 07/07/1991
1051070100 Cao Thế Tùng 07/05/1992
1051070101 Vũ Thanh Tùng 19/01/1992
1051070113 Nguyễn Thị Thanh Tuyền 28/11/1992
1051070118 Dương Thị Xiêm 16/08/1992
1051070090 Dương Quyết Thắng 23/01/1992
Phần A giới thiệu
Báo cáo đồ án thực tập tốt nghiệp.
Lời giới thiệu.
Từ giữa những năm 80 đến nay công nghệ chế tạo linh kiện bán dẫn có
những phát triễn vược bật để hỗ trợ cho sự phát triễn của công nghệ
thông tin, và sự tự động hóa trong công nghiệp, … Với độ tích hợp ngày
càng cao, công suất tiêu tán bé hơn, thông minh hơn nó đã làm thay đổi
hẵn cấu trúc của nền công nghiệp hiện tại. Bước vào đầu thế kỷ 21 kỹ
thuật điện tử_vi điều khiển sẽ là “Chiếc chìa khóa kỹ thuật“ cho các
nước trên thế giới bước vào kỷ nguyên mới_ kỷ nguyên của công nghệ
thông tin.
Tuy chỉ mới thâm nhập vào nước ta nhưng công nghệ điện tử đã phát
triễn rất nhanh và ngày càng giữ vai trò quan trọng trong nền công
nghiệp nước nhà.
Hiện nay, do nhu cầu tự động háo, hiện đại hóa của các nghành nghề từ
nông nghiệp đến công nghiệp. Dựa vào đó chúng em chọn đề tài “thiết
kế mạch điều khiển động cơ DC và hiển thị tốc độ ra màn hình
LCD.”
Do kiến thức còn hạn chế, với kinh nghiệm ít ỏi và thời gian có hạn,
chắc chắn rằng tập đồ án này ít nhiều không thể tránh khỏi thiếu sót,
kính mong quí thầy cô và bạn bè vui lòng bỏ qua và đóng góp ý kiến để
tập đồ án ngày càng hoàn thiện hơn.
NHÓM THỰC HIỆN ĐỒ ÁN
Lời cảm ơn
2 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
Để hoàn thành được đồ án này không thể thiếu được sự gúp đỡ
nhiệt tình của các bạn và thầy cô giáo. Chúng em xin chân thành
gửi lời cảm ơn đên:
Cô giáo Đặng Thị Hương Giang giáo viên trường ĐH KINH
TẾ KỸ THUẬT CÔNG NGHIỆP. Cô đã hết lòng quan tâm,
hướng dẫn tạo mọi điều kiện để chúng em hoàn thành tốt đồ án
này. Thầy giáo Hà Thanh Sơn người trực tiếp hướng dẫn chúng
em hoàn thành đồ án này.
Chúng em cũng chân thành cảm ơn các thầy cô trong khoa điện
điện tử đã chỉ dạy cho chúng em những kiến thức cần thiết cho
đồ án, đồng thời nâng cao kiến thữ cho chúng em.
Và cuối cùng xin gửi lời cảm ơn đến tất cả các bạn bè đã chung
tay giúp sức cho chúng tôi trong những ngày tháng làm đồ án.
Xin chân thành cảm ơn !
Nhóm thực hiện đồ án.
Mục Lục
3 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
Phần A: giới thiệu
Lời giới thiệu
Lời cảm ơn
Phần B: nội dung chính
Tóm tắt nội dung đề tài
CHƯƠNG I GIỚI THIỆU LINH KIỆN QUAN TRỌNG TRONG ĐỒ ÁN
I. GIỚI THIỆU CHUNG VỀ CHÍP ATMEGA8 7
II. TÌM HIỂU LCD 16x2 22
III. TÌM HIỂU IC 74LS151 (74HC151)…………………………………… 27
IV. TÌM HIỂU ĐỘNG CƠ DC……………………………………………….29
CHƯƠNG II MẠCH NGHUYÊN LÝ VÀ NGUYÊN LÝ LÀM VIỆC
I. MẠCH ĐIỀU KHIỂN PHÍM BẤM 35
1. Sơ đồ nguyên lý
2. Nghuyên lý làm việc
II. MẠCH ĐIỀU KHIỂN ĐỘNG CƠ DC 36
1. Sơ đồ nguyên lý
2. Nguyên lý làm việc
III. MẠCH ĐIỀU KHIỂN TRUNG TÂM 37
1. Sơ đồ nguyên lý
2. Nguyên lý làm việc
CHƯƠNG III CODE ĐIỀU KHIỂN THIẾT BỊ VÀ MÔ PHỎNG PROTEUS….38
1. Code điều khiển
2. Mạch mô phỏng
CHƯƠNG IV: KẾT LUẬN ………………………………………………………44
TÀI LIỆU THAM KHẢO 44
TÓM TẮT NỘI DUNG ĐỀ TÀI
4 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
mạch điều khiển động cơ DC và hiển thị tốc độ ra màn hình LCD.
Làm việc dựa trên việc điều khiển của khối chung tâm chính, mà ở đây
là IC Atmega8 có chức năng điều khiển tốc độ của động cơ thông qua
việc điều chỉnh 16 phím bấm( bao gông các phím số từ 0 đến 9 và các
nút chức năng khác)được ghép gián tiếp với IC Atmega8 thông qua IC
74ls151 là IC dồn kênh 8 ngõ vào dữ liệu. khi muốn điều chỉnh độ rộng
xung cấp cho động cơ thì ta dùng phím bấm ở đây dữ liệu tối đa là 255.
Nếu vượt quá 255 hệ thống sẽ thông báo lỗi. độ rộng xung cấp cho động
cơ được hiển thị thông qua màn hình LCD. Màn hình cho biết tốc độ của
động cơ khi ta nhập 1 giá trị số liệu trong khoảng từ 0 đến 255. Từ đó ta
biết được hướng điều chỉnh đọng cơ cho phù hợp với công việc yêu cầu.
Phần B
5 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
nội dung chính
CHƯƠNG I
6 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
I. GIỚI THIỆU LINH KIỆN QUAN TRỌNG TRONG
ĐỒ ÁN
GIỚI THIỆU CHUNG VỀ CHÍP ATMEGA8
Tổng quan về VĐK Atmega8:
- Tốc độ tối đa: 16MHz.
- Dung lượng bộ nhớ chương trình: 8 KB.
- Bộ nhớ EEPROM: 512 Byte.
- Dung lượng bộ nhớ RAM: 1 KB.
Bộ nhớ chương trình có khả năng ghi 10.000 lần, bộ nhớ
EEPROM có thể ghi 100.000 lần.Hỗ trợ bootloader, có khả năng
tự ghi vào bộ nhớ chương trình, cập nhật chương trình cho chip
mà không cần mạch nạp.
- Timer 8 bit: 2.
- Timer 16 bit: 1.
- ADC: 6 kênh, 10 bit.
- Giao tiếp: TWI (I2C), UART, SPI
Điện áp hoạt động:
Atmega8L: 2.7V – 5.5V.
Atmega8: 4.5V – 5.5V.
…
Sơ đồ chân:
7 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
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
8 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
(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.
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à
9 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
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:
• Đượ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.
10 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
Để 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 sang opcode để 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ép cộ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ể
truy nhập tất cả các RF một cách trực tiếp trong 1 chu kỳ xung
clock, ngoại trừ 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
instruction LPM (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ác con 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ức năng phụ của các thanh ghi.
11 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
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 thanh ghi này, chúng ta không cần gọi địa chỉ mà chỉ cần gọi
trực tiếp tên của chúng. RF thường được sử dụng như các toán
hạng (operand) của cá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 64 thanh ghi được gọi là 64 thanh ghi nhập/xuất (64 I/O
register) hay còn gọi là vùng nhớ I/O (I/O Memory). Vùng nhớ
I/O là cửa ngõ giao tiếp giữa CPU và thiết bị ngoại vi. Tất cả các
thanh ghi điều khiển, trạng thá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ỗi PORT liên quan đến 3
12 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
thanh ghi DDRx, PORTx và PINx, tất cả 3 thanh ghi này đều
nằm trong vùng nhớ I/O. Xa hơn, nếu muốn truy 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
thanh ghi 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 ghi I/O có địa chỉ là A. Giả sử chúng ta muốn
xuất giá trị chứa trong R6 ra thanh 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ệnh của chúng ta sẽ có
dạng: OUT 0x0011, R6. Tuy nhiên trong 1 trường hợp khác, nếu
muốn truy xuất DDRD theo dạng SRAM, ví dụ lệnh STS hay
LDS, thì phải dùng địa chỉ tuyệt đối của thanh ghi này, tức giá
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.
13 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
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ình cầ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ước trong 1 file Definition, bạn chỉ cần đính
kèm file này vào chương trình củ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, 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 sau này khi
muốn sử dụng thanh ghi DDRD bạn chỉ cần gọi tên của chúng,
như: OUT DDRD,R6.
Phần 3: RAM tĩnh, nội (internal SRAM), là vùng không gian
cho chứ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ó dung lượ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ép người sử dụng gắn thêm các bộ nhớ ngoài để chứa biến,
vùng này thực chất chỉ tồn tại khi nào người sử dụng gắn thêm
bộ nhớ ngoài vào chip.
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ất thí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 32 thanh ghi trong Register File được kết nối trực tiếp với
14 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
Arithmetic Logic Unit -ALU (ALU cũng được xem là CPU của
AVR) bằng 2 line, 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ình 4).
Hình 4. Cấu trúc bên trong AVR.
Các instruction được chứa trong bộ nhớ chương trình Flash
memory dưới dạng các thanh ghi 16 bit. Bộ nhớ chương trình
được truy cập trong mỗi chu kỳ xung clock và 1 instruction
chứa trong program memory sẽ được load vào trong instruction
register, instruction register tác động và lựa chọn register file
cũng như RAM cho ALU thực thi. Trong lúc thực thi chương
trình, địa chỉ của dòng lệ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.
15 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
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 thi vẫn nhanh hơn.
Stack.
Stack được hiểu như là 1 “tháp” dữ liệu, dữ liệu được chứa
vào stack ở đỉ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 địa chỉ đầ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.
16 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
Giá trị gán cho thanh ghi SP sẽ là địa chỉ khởi động của stack.
Quay lại ví dụ ở bài 1, phần khởi tạo các điều kiện đầu.
; KHOI TAO CÁC DIEU KIEN DAU
LDI R16, HIGH(RAMEND)
LDI R17, LOW(RAMEND)
OUT SPH, R16
OUT SPL, R17
Bốn dòng khai báo trên mục đích là gán giá trị của
RAMEND cho con trỏ SP, RAMEND (tức End of Ram) là biến
chứa địa chỉ lớn nhất của RAM nội trong AVR, biến này được
định nghĩa trong file M8DEF.INC. Như thế sau 4 dòng trên, con
trỏ SP chứa giá trị cuối cùng của SRAM hay nói cách khác vùng
stack bắt đầu từ vị trí cuối cù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, tuy
nhiê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ỏi stack. 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 khi khởi động, con trỏ SP trỏ đến vị trí
0x045F trong SRAM, nếu ta viết các câu lệnh sau:
LDI R16, 1
PUSH R16
LDI R16, 5
PUSH R16
17 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
LDI R16, 8
PUSH R16
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.
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
instruction POP đượ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ộc vào chip). Sử dụng stack không đúng cách đôi khi sẽ
làm chương trình thự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ất của stack là sử dụng trong các
chương trình con (Subroutine), khi chúng ta cần “nhảy” từ một
vị trí trong chương trình chính đến 1 chươ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ệnh RCALL
18 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
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 khi
nhả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ằng cách này chúng ta có thể quay lại vị trí trước đó.
Chính vì các lệnh RCALL 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ức nă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ùng của vùng nhớ I/O) là một trong số các thanh ghi quan trọng
nhất của AVR, 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ả 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
19 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
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ép toá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ào thấy cần thiết.
• 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ác phép toán với số BCD.
• Bit 6 – T (Bit Copy Storage): được sử dụng trong 2
Instruction BLD (Bit LoaD) và BST (Bit STorage). Tôi sẽ giải
thích chức năng Bit T trong phần giới thiệu về BLD và BST.
20 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
• 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 bit ngắ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óa thô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
ghi SREG, cụ thể chức năng và cách sử dụng của từng bit chúng
ta sẽ tìm hiểu trong các trường hợp cụ thể sau này, người đọc có
thể tự tìm hiểu thê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.
21 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
Hình 8. Ảnh hưởng của các phép toán lên SREG.
TÌM HIỂU LCD 16x2
Text LCD là các loại màn hình tinh thể lỏng nhỏ dùng để
hiển thị các dòng chữ hoặc số trong bảng mã ASCII. Không
giống các loại LCD lớn, Text LCD được chia sẵn thành
từng ô và ứng với mỗi ô chỉ có thể hiển thị một ký tự
ASCII. Cũng vì lý do chỉ hiện thị được ký tự ASCII nên
loại LCD này được gọi là Text LCD (để phân biệt với
22 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
Graphic LCD có thể hiển thị hình ảnh). Mỗi ô của Text
LCD bao gồm các “chấm” tinh thể lỏng, việc kết hợp “ẩn”
và “hiện” các chấm này sẽ tạo thành một ký tự cần hiển thị.
Trong các Text LCD, các mẫu ký tự được định nghĩa
sẵn. Kích thước của Text LCD được định nghĩa bằng số ký
tự có thể hiển thị trên 1 dòng và tổng số dòng mà LCD có.
Ví dụ LCD 16x2 là loại có 2 dòng và mỗi dòngcó thể hiển
thị tối đa 16 ký tự. Một số kích thước Text LCD thông
thường gồm16x1, 16x2, 16x4, 20x2, 20x4…Hình dưới là
một ví dụ Text LCD 16x2.
Hình 1. Text LCD 16x2.
Text LCD có 2 cách giao tiếp cơ bản là nối tiếp (như I2C)
và song song.
1. Sơ đồ chân.
Các Text LCD thường có 16 chân trong đó 14 chân kết nối
với bộ điều khiển và 2 chân nguồn cho “đèn LED nền”. Thứ tự
các chân thường được sắp xếp như sau:
23 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
Bảng 1. Sơ đồ chân.
Trong một số LCD 2 chân LED nền được đánh số 15 và 16
nhưng trong một
số trường hợp 2 chân này được ghi là A (Anode) và K
(Cathode). Hình dưới mô tả cách kết nối LCD với nguồn và
mạch điều khiển.
24 | P a g e
Báo cáo đồ án thực tập tốt nghiệp.
Chân 1 và chân 2 là các chân nguồn, được nối với GND và
nguồn 5V. Chân 3 là chân chỉnh độ tương phản (contrast), chân
này cần được nối với 1 biến trở chia áp như trong hình 2.Trong
khi hoạt động, chỉnh để thay đổi giá trị biến trở để đạt được
độtương phản cần thiết, sau đó giữ mức biến trở này. Các chân
điều khiển RS, R/W, EN và các đường dữ liệu được nối trực tiếp
với vi điều khiển. Tùy theo chế độ hoạt động 4 bit hay 8 bit mà
các chân từ D0 đến D3 có thể bỏ qua hoặc nối với vi điều khiển.
25 | P a g e