You are on page 1of 103

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

KHOA ĐIỆN TỬ - VIỄN THÔNG

ĐỒ ÁN
TỐT NGHIỆP ĐẠI HỌC
Đề tài:
THIẾT KẾ BẢNG QUẢNG CÁO LED SỬ DỤNG
VI ĐIỀU KHIỂN ATMEGA 16
MODULE ĐIỀU KHIỂN HIỂN THỊ

Sinh viên thực hiện: PHẠM MINH ĐỨC


Lớp ĐT12 – K49
Giảng viên hướng dẫn: TS. NGUYỄN TIẾN DŨNG
Cán bộ phản biện: TS. HOÀNG MẠNH THẮNG

Hà nội, 5-2009
BỘ GIÁO DỤC VÀ ĐÀO TẠO CỘNG HÒA XÃ HÔI CHỦ NGHĨA VIỆT NAM
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Độc lập - Tự do - Hạnh phúc
-------------------------------------------------- ---------------------------------

NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP

Họ và tên sinh viên: .…PHẠM MINH ĐỨC……... Số hiệu sinh viên: …20040847…
Khoá:………...49.……….Khoa: Điện tử - Viễn thông Ngành: ……………….........
1. Đầu đề đồ án:
Thiết kế bảng quảng cáo LED sử dụng vi điều khiển ATMEGA16
Module điều khiển hiển thị
2. Các số liệu và dữ liệu ban đầu:
……………………………………..……………………………………………..……..……………………………

……………………………………………………………………………………………………………………………….

…..………………………..…………………………………………………………………………………….

3. Nội dung các phần thuyết minh và tính toán:


………………………………………………………………………………………………………………..….

………………………………………………………………………………………………………………………………

……..….

………………………………………………………………………………………………………………………………

………..….……………………………………………………………………………………………

4. Các bản vẽ, đồ thị ( ghi rõ các loại và kích thước bản vẽ ):
………………………………………………………………………………………………………………………..….

…………………………………………………………………………………………………………………………..

……….………………………………………………………………………………………………………….

5. Họ tên giảng viên hướng dẫn: …………… NGUYỄN TIẾN DŨNG ..……………………

6. Ngày giao nhiệm vụ đồ án: ……………………………………………….……………


7. Ngày hoàn thành đồ án: ………………………………………………………………………..………
Ngày tháng năm
Chủ nhiệm Bộ môn Giảng viên hướng dẫn

Sinh viên đã hoàn thành và nộp đồ án tốt nghiệp ngày tháng năm
Cán bộ phản biện

2
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
---------------------------------------------------

BẢN NHẬN XÉT ĐỒ ÁN TỐT NGHIỆP

Họ và tên sinh viên: ............. PHẠM MINH ĐỨC ............ Số hiệu sinh viên: .....20040847......
Ngành: .................................................................................................. Khoá: .............. 49 .........................
Giảng viên hướng dẫn:....................... TS. NGUYỄN TIẾN DŨNG ....................................................
Cán bộ phản biện: .......................................................................................................................................
1. Nội dung thiết kế tốt nghiệp:
...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

......................................................................................................................

2. Nhận xét của cán bộ phản biện:


...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

...................................................................................................................................................................................................

..........................................................................

Ngày tháng năm


Cán bộ phản biện

Lời nói đầu

Quảng báo được sử dụng trong rất nhiều lĩnh vực của đời sống xã hội . Hầu
như đi đâu ta cũng có thể thấy những bảng quảng cáo với nhiều hình thức khác
nhau. Với mục đích làm nổi bật lên sản phẩm của mình cả khi trời sáng hay tối
người ta đã sử dụng rộng rãi các bảng quảng cáo điện tử. Bảng quảng báo điện tử có
nhiều loại , được sử dụng trong nhiều lĩnh vực khác nhau , có khả năng hiển thị hình
ảnh và màu sắc phong phú . Tuy nhiên do điều kiện có hạn nên trong đồ án này
chúng em mong muốn tìm hiểu về nguyên lý thiết kế một bảng quảng cáo điện tử có
khả năng điều khiển hiển thị các kí tự theo như mong muốn và thiết kế một module
led quảng báo cỡ nhỏ để thử nghiệm.

Đầu tiên chúng em xin cảm ơn sự hướng dẫn chỉ bảo tận tình của thầy
Nguyễn Tiến Dũng . Thầy đã cung cấp cho chúng em các tài liệu về đề tài giúp
chúng em dễ dàng hơn trong quá trình tìm hiểu đồ án . Trong quá trình làm thực
hiện đồ án thầy đã chỉ bảo chúng em mỗi khi gặp khó khăn để đồ án có thể hoàn
thành.

Chúng em cũng xin cảm ơn các thầy cô giáo trong khoa đã tận tình dạy dỗ
chúng em trong nhưng năm học vừa qua đã giúp chúng em có những kiến thức cơ
sở để làm đồ án này.

Sinh viên

Phạm Minh Đức

4
Tóm tắt đồ án

Nội dung chính của đồ án là việc điều khiển hiển thị led ma trận. Khi điều
khiển hiển thị led ma trận có 2 phương pháp cấp nguồn theo từng hàng hay từng
cột. Đồ án sẽ tập trung trình bày về phương pháp cấp nguồn theo từng cột . Việc cấp
nguồn cho các cột được thực hiện bằng cách sử dụng IC giải mã 74HC138 , cấp
nguồn cho các hàng trong cột được thực hiện bằng cách sử dụng bộ ghi dịch
74HC595. Dữ liệu mã hóa cấp nguồn cho các hàng trong cột được gửi ra bộ ghi
dịch thông qua việc sử dụng SPI của vi điều khiển. Việc điều khiển thời gian cấp
nguồn cho ma trận tạo tốc độ quét được thực hiện bằng cách sử dụng bộ định thời.
Phần cuối của đồ án sẽ trình bày về cách tạo một số hiệu ứng cho ma trận led khi sử
dụng phương pháp cấp nguồn theo cột.

Project abstract

The main content of this project is led matrix display control. There has two
power supply methods for controlling the led matrix : row by row or column by
column . In this project , I will introduce the column once. When using this method,
the 74HC138 decoder is used to power for each column and the 74HC595 shift
register is used to power every row in the column which is chosen by 74HC138.
The data which is coded the power suply for every row in each column is tranfered
to the shift register by using the SPI of the microcontroller. Timing to power the led
matrix can be done by using the timer/counter of the microcontroller. This is the
simple method to controll the scan rate for led matix display. Some led matrix
display effects will be presented in the final part of this document.

5
Mục lục
Lời nói đầu...............................................................................................................4

Tóm tắt đồ án...........................................................................................................5

Danh sách các hình vẽ.............................................................................................8

Danh sách các bảng.................................................................................................8

Danh sách các công thức.........................................................................................9

Phần mở đầu..........................................................................................................10

Chương 1 : Giới thiệu chung................................................................................12


1.1) Quảng cáo...............................................................................................12
1.2) Bảng led quảng báo.................................................................................13
1.2.1) Một số đặc trưng .........................................................................13
1.1.2) Quảng cáo bằng led .....................................................................14
1.3) Giới thiệu chung về hệ thống...................................................................18

Chương 2 : Giới thiệu về vi điều khiển AVR Atmega16....................................21


2.1) Giới thiệu về vi điều khiển họ AVR..........................................................21
2.1.1) Một số đặc trưng .........................................................................21
2.1.2) Một số đặc trưng .........................................................................23
2.1.3) Một số đặc trưng .........................................................................25
2.1.4) Một số họ vi diều khiển AVR ......................................................26
2.2) Sơ bộ về vi điều khiển Atmega16.............................................................26
2.2.1) Đặc trưng .....................................................................................28
2.2.2) CPU .............................................................................................31
2.2.3) Bộ nhớ .........................................................................................37

Chương 3 : Nguyên tắc điều khiển led ma trận...................................................42


3.1) Cấu trúc và nguyên lý cấp nguồn cho led ma trận..................................42
3.2) Nguyên tắc tạo font chữ hiển thị .............................................................43
3.3) Điều khiển hiển thị led ma trận ..............................................................44

Chương 4: Điều khiển cấp nguồn cho led ma trận..............................................47


4.1) Điều khiển cấp nguồn cho cột dùng 74HC138........................................47
4.1.1) Chức năng của 74HC138..............................................................47
4.1.2) Sử dụng 74HC138 để cấp nguồn cho các cột ma trận..................48
4.2) Điều khiển cấp nguồn cho hàng dùng 74HC595.....................................50

6
4.2.1) Chức năng của 74HC595..............................................................50
4.2.2) Sử dụng 74HC595để cấp nguồn cho các hàng của ma trận.........51
4.3) Truyền dữ liệu cấp nguồn cho hàng sử dụng SPI....................................54
4.3.1) Atmega16 SPI..............................................................................54
4.3.2) Thiết lập SPI truyền dữ liệu cho 74HC595...................................58
4.3) Kết luận...................................................................................................59

Chương5: Tạo tần số quét cho ma trận...............................................................60


5.1) Timer1 Atmega16 .................................................................................60
5.1.1) Một số chế độ hoạt động..............................................................60
5.1.2) Các thanh ghi................................................................................65
5.2) Tạo tần số quét ma trận .......................................................................70
5.3) Kết luận ...............................................................................................71

Chương 6: Hiệu ứng hiển thị bảng led.................................................................72


6.1) Bảng led hiển thị.....................................................................................72
6.2) Dịch trái, phải........................................................................................74
6.3) Dịch lên xuống.......................................................................................78
6.4) Hiển thị từng kí tự...................................................................................81
6.5) Kết luận..................................................................................................83

Kết luận..................................................................................................................84

Tài liệu tham khảo.........................................................................................85

Phụ lục A: Sơ đồ ghép nối hệ thống điều khiển led ma trận..............................86

Phụ lục B: Mã chương trình nạp cho vi điều khiển............................................90

7
Danh sách các hình vẽ

Danh sách các bảng

8
Danh sách các công thức

9
Phần mở đầu
Quảng cáo luôn là một trong các vấn đề đóng vai trò quan trọng trong sự
phát triển của một công ty, doanh nghiệp hay thậm chí là của một cửa hàng. Quảng
cáo tốt sẽ đem lại nhiều lợi ích to lớn. Cũng chính vì vậy mà không ngạc nhiên khi
hàng năm các doanh nghiệp đã đầu tư rất nhiều vào vấn đề này. Một trong những
biện pháp được ưa dùng hiện nay đó là sử dụng bảng quảng cáo bằng đèn LED, vì
sự đơn giản, hiện đại, bắt mắt, chi phí hợp lý cũng như tính hiệu quả của nó. Những
bảng thông tin, cổng chào hay những bảng LED quảng cáo với màu sắc sặc sỡ, bắt
mắt, gây nhiều chú ý chắc hẳn đã không còn xa lạ đối với người dân, nhất là người
dân đô thị.
Quảng cáo bằng đèn LED hiện nay được ứng dụng rất rộng rãi trong nhiều
ngành, nhiều lĩnh vực. Nó không chỉ giới hạn bởi việc hiển thị các dòng chữ, các
biển hiệu nhấp nháy mà còn có thể hiển thị các hình ảnh đồ họa, các hình ảnh full
colour và đặc biệt là có thể hiển thị được cả video. Nó cũng không chỉ giới hạn
trong việc quảng cáo trong nhà (indoor), bán ngoài trời (semi – outdoor ) mà còn có
thể quảng cáo ở cả ngoài trời, ngay giữa ban ngày với độ sáng và độ sắc nét cao.
(Chương I sẽ giới thiệu chi tiết hơn về vấn đề quảng cáo bằng đèn LED).
Tuy nhiên do còn hạn chế về nhiều mặt nên trong đồ án này chúng em chỉ
giới hạn ở việc hiển thị các dòng chữ được truyền từ máy tính xuống với định dạng
font tiếng anh đã lưu sẵn trong bộ nhớ Flash của AVR và một số hiệu ứng hiển thị
cơ bản.

Trong 2 chương đầu tiên của đồ án chúng em sẽ giới thiệu chung về quảng
cáo bằng bảng LED, giới thiệu hệ thống cũng như sơ lược về vi điều khiển AVR và
họ ATMega 16. Các chương tiếp theo chúng em sẽ trình bày về đóng góp của mình

10
cho đề tài. Các khối khuếch đại công suất và giao tiếp máy tính sẽ được bạn Bùi
Lưu Quỳnh và Nghiêm Xuân Quyền sẽ trình bày nên trong đồ án này em sẽ tập
trung trình bày về việc điều khiển hiển thị, chốt dữ liệu cho ma trận :

- Chương 3 sẽ trình bày về nguyên tắc cơ bản khi điều khiển ma trận led

- Chương 4 sẽ trình bày cề cách sử dụng các IC thông dụng để điều khiển cấp
nguồn cho ma trận led

- Chương 5 sẽ trình bày về cách tạo tần số quét cho ma trận sử dụng timer

- Chương 6 sẽ trình bày về giải thuật tạo một số hiệu ứng hiển thị kí tự trên
ma trận led.

Đồ án đã hoàn thành có thể điều khiển hiển thị các ký tự trên ma trận gồm có
2x3 ma trận led 8x8, có khả năng lựa chọn màu sắc, tốc độ quét, hiệu ứng hiển thị
cho ma trận đồng thời có khả năng mở rộng cho các ma trận kích thức lớn hơn.

11
Chương 1 : Giới thiệu chung

1.1) Quảng cáo


Hàng ngày, dù ở bất cứ đâu chúng ta cũng đều bắt gặp những loại hình quảng
cáo khác nhau : trong nhà thì là trên ti vi, đài radio, internet … còn ngoài trời thì là
các băng rôn, bảng, biển quảng cáo và thậm chí là cả tờ rơi nữa. Vậy quảng cáo là
gì và tại sao lại phải quảng cáo ?

Quảng cáo là hình thức tuyên truyền, giới thiệu thông tin về sản phẩm, dịch
vụ, công ty hay ý tưởng. Quảng cáo là những nỗ lực nhằm tác động tới hành vi, thói
quen mua hàng của người tiêu dùng hay khách hàng bằng cách cung cấp những
thông điệp bán hàng theo cách thuyết phục về sản phẩm hay dịch vụ của người bán.
Các nhà hàng, công ty, doanh nghiệp … tham gia các hoạt động quảng cáo không
ngoài mục đích quảng bá hình ảnh, giới thiệu sản phẩm, dịch vụ, thông tin … của
họ để từ đó thu hút được thêm các khách hàng tiềm năng, nâng cao tính cạnh tranh
và đem lại nhiều nguồn lợi cho công ty. Một chiến dịch quảng cáo tốt sẽ góp phần
tích cực vào sự phát triển của doanh nghiệp vì thế cũng có thể nói rằng, quảng cáo
đã, đang và vẫn sẽ tiếp tục đóng một vai trò quan trọng trong cuộc sống của xã hội
loài người hiện nay.

Trên thế giới, quảng cáo hiện nay đã phát triển tới những trình độ cao, tuy
nhiên ở Việt Nam - do còn nhiều hạn chế - nên đa số các sản phẩm quảng cáo vẫn
còn ở trình độ thấp. Các sản phẩm quảng cáo để có thể đến với khách hàng tiềm
năng cần phải được truyền tải qua cac hương tiện truyền thông, như: báo in, tạp chí,
đài phát thanh, truyền hình, báo điện tử.

Các loại hình quảng cáo phổ biến hiện nay :

12
 Truyền hình.
 Internet.
 Báo chí.
 Phát thanh.
 Quảng cáo trực tuyến.
 Quảng cáo qua bưu điện.
 Quảng cáo trên các phương tiện vận chuyển.
 Quảng cáo qua các trang vàng.
 Quảng cáo trên tờ rơi, áp phích, pano hay băng rôn.
 Quảng cáo trên bao bì sản phẩm.
 Quảng cáo qua các thư gửi trực tiếp.
 Quảng cáo truyền miệng.
 Quảng cáo bằng đèn LED.

1.2) Bảng led quảng báo


Trong các loại hình quảng cáo đề cập đến ở trên thì quảng cáo bằng đèn LED
là một loại hình quảng cáo được sử dụng rộng rãi bởi nhiều công ty, cửa hàng bởi
tính đơn giản, hiện đại cũng như hữu dụng của nó. Ta hãy cùng tìm hiểu đèn LED là
gì, hoạt động ra sao và tại sao nó lại được sử dụng cho mục đích quảng cáo và xu
hướng phát triển của quảng cáo bằng đèn LED.

1.2.1) Một số đặc trưng


LED (Light Emitting Diode – đi ốt phát quang) là các loại đi ốt có khả năng
phát ra ánh sáng hay tia hồng ngoại, tử ngoại. Cũng giống như đi ốt, LED được cấu
tạo từ một khối bán dẫn loại P ghép với một khối bán dẫn loại N.
Hoạt động của LED cũng giống như nhiều loại đi ốt bán dẫn khác : khối bán
dẫn loại P chứa nhiều lỗ trống tự do mang điện tích dương nên khi ghép với khối
bán dẫn loại n chứa các điện tử tự do thì các lỗ trống này có xu hướng chuyển động
khuếch tán sang khối N, cùng lúc đó khối P lại nhận thêm các điện tử (điện tích âm)
từ khối N chuyển sang. Kết quả là khối P tích điện âm (thiếu hụt lỗ trống và thừa

13
điện tử) trong khi khối n tích điện dương (thiếu hụt điện tử và thừa lỗ trống). Ở biên
giới hai mặt tiếp giáp, một số điện tử bi lỗ trống thu hút và khi chúng tiến lại gần
nhau, chúng có xu hướng kết hợp với nhau tạo thành các nguyên tử trung hòa. Quá
trình này có thể giải phóng năng lượng dưới dạng ánh sáng (hay các bức xạ điện từ
có bước sóng gần đó). Tùy theo mức năng lượng giải phóng là cao hay thấp mà
bước sóng ánh sáng phát ra khác nhau (tức màu sắc của LED sẽ khác nhau). Mức
năng lượng (và màu sắc của LED) hoàn toàn phụ thuộc vào cấu trúc năng lượng của
các nguyên tử chất bán dẫn. Thông thường LED có điện thế phân cực thuận cao hơn
các loại đi ốt khác khoảng 1,5 đến 3V nhưng điện thế phân cực ngược ở LED lại
không cao.
Đèn LED có những ứng dụng rất phong phú và rộng rãi : làm bộ phận hiển
thị trong các thiết bị điện, điện tử, trang trí, làm đèn giao thông, các đèn LED phát
ra tia hồng ngoại được dùng trong các thiết bị điều khiển từ xa trong điện tử dân
dụng… thậm chí ngày nay người ta đã và đang nghiên cứu đèn LED phát ánh sáng
trắng để thay thế cho các thiết bị chiếu sáng thông thường như đèn sợi đốt, đèn
neon, đèn compact…Điều này là hoàn toàn có thể và có lẽ là sẽ thành hiện thực
trong một tương lai không xa. Đây chắc chắn sẽ là một bước tiến quan trọng trong
ngành công nghiệp năng lượng vì hiện tại đèn LED trắng có tuổi thọ tới 50.000 giờ
sử dụng, gấp 50 lần so với bóng đèn 60W. Điều này có nghĩa là chúng có thể thắp
sáng liên tục trong vòng gần 6 năm. Hơn thế nữa chúng dùng điện áp thấp nên
không gây cháy nổ mà tiết kiệm điện hơn nhiều so với bóng đèn khác. Một trong
những ứng dụng quan trọng và phổ biến hiện nay của đèn LED chính là trong lĩnh
vực quảng cáo : bảng quảng cáo bằng đèn LED.

1.1.2) Quảng cáo bằng led


Đèn LED thực sự là có cách đột phá mới trong công nghệ cao nói chung và
trong quảng cáo nói riêng. Đó là các bảng hiệu, bảng chỉ dẫn, panel quảng cáo… có
sử dụng đèn LED và mạch điện tử để tạo hiệu ứng ánh sáng. Qua tìm hiểu ta thấy
nhiều đặc điểm nổi bật của nó như độ bền của nó cao gấp mấy chục lần bóng đèn
thường, và lại rất ít hao điện, không gây cháy nổ, an toàn tuyệt đối, chống rung
động tốt, đặc biệt là nó vẫn sáng rõ vào ban ngày vì vậy có thể dụng cả những biển

14
quảng cáo trong nhà (indoor) và ngoài trời (outdoor) cho hiệu quả cao cũng như gây
sự chú ý đồng thời truyền đạt thông tin đến khách hàng và người đi đường.
Bảng điện tử có thông tin thay đổi được còn được gọi là bảng quang báo hay
màn hình điện tử LED, có nhiều màu sắc, nhiều cách hiển thị sinh động, dễ dàng
thu hút sự chú ý của mọi người. Do dễ dàng thay đổi thông tin trên bảng điện tử nên
đây được xem là phương tiện truyền đạt thông tin hiện đại, nhanh chóng.
Bảng LED quảng cáo được sử dụng cả indoor, outdoor và semi-outdoor :
 Bảng indoor sử dụng tốt trong nhà, không sử dụng ngoài trời được vì
không đủ độ sáng và không chịu được mưa nắng.
 Bảng outdoor có độ sáng cao, kết cấu chắc chắn, chịu được mưa nắng.
 Bảng semi-outdoor có độ sáng cao, sử dụng tốt ngoài trời nhưng chịu
mưa nắng kém nên bảng quảng cáo loại này thường được đặt ở dưới
mái hiên nhà.

Trong lĩnh vực quảng cáo, ứng dụng của đèn LED được thể hiện dưới nhiều
hình thức khác nhau như :

 Bảng thông tin điện tử chữ chạy

Bảng thông tin điện tử là sản phẩm của ngành công nghệ cao với nhiều ưu
điểm nổi bật đã trở thành một phần không thể thiếu trong nhiều lĩnh vực của cuộc
sống. Điểm nổi bật của bảng thông tin điện tử là khả năng thay đổi thông tin và
phương thức trao đổi thông tin. Với nhiều tính năng độc đáo, bảng thông tin điện tử
(bảng quang báo, bảng điện tử, bảng LED) luôn thu hút được đông đảo sự chú ý
quan sát của nhiều người. Do đó, nó là sản phẩm đắc dụng cho các chương trình
quảng cáo, các bản tin chứng khoán, tài chính…
Cũng vì tính tiện lợi mà bảng thông tin điện tử được ứng dụng rộng rãi ở
nhiều nơi với nhiều mục đích khác nhau như: khách sạn, nhà hàng, trung tâm
thương mại, trụ sở công ty, ngân hàng, sân bay, hiệu vàng, sàn giao dịch chứng
khoán, giao thông hay tại các cổng trào của các tỉnh và thành phố…

15
Được thiết kế rất khoa học nên bảng thông tin điện tử rất dễ dàng khi sử
dụng, có thể điều khiển bằng bàn phím chuyên dụng, bằng nút bấm, điều khiển từ
xa hay máy tính… Không những thế, nó còn rất tiện lợi trong sản xuất, lắp đặt.
Ngoài ra bảng thông tin điện tử còn có các thuộc tính ưu việt khác như : điện
áp thấp, tính ổn định cao, cường độ sáng mạnh, thay đổi nội dung nhanh, dễ dàng,
kỹ xảo hiển thị đa dạng.
 Biển hiệu, biển vẫy gây chú ý cho khách đi đường.

Là loại biển quảng cáo điện tử sử dụng đèn LED siêu sáng được lập trình
bằng vi điều khiển tạo nên các hiệu ứng hiển thị khác nhau gây ấn tượng mạnh mẽ
và sự chú ý đặc biệt đối với người đi đường.

 Bảng thông tin và hình ảnh đồ họa:

Là sản phẩm của ngành công nghệ cao với nhiều ưu điểm nổi bật đã trở
thành một phần quan trọng trong nhiều lĩnh vực cuộc sống. Bảng có khả năng thể
hiện đa dạng các hình bằng chữ, logo và các hình ảnh đồ họa. Có thể đặt màu sắc
khác nhau cho từng dòng chữ hoặc từng chữ, điều chỉnh được tốc độ kỹ xảo. Là
phương thức quảng cáo hình ảnh Logo, giới thiệu về sản phẩm một cách cô đọng
súc tích nhất.

 Các loại bảng tỷ giá: bảng giá vàng, bảng giá ngoại tệ, bảng tỷ giá
ngân hàng…

Là bảng thông tin điện tử thiết kế chuyên dụng cho từng ngành (đặc biệt là
ngân hàng), sản phẩm được sử dụng rộng rãi ở các sở giao dịch, phòng giao dich…,
là phương tiện tốt giúp cho việc trao đổi tỷ giá nhanh, thuận tiện. Bảng có nhiều
tính năng dễ sử dụng và thay đổi thông tin qua máy tính.

 Bảng quảng cáo màn hình Full Colour :

16
Sản phẩm màn hình Full Colour là dòng sản phẩm mới, ứng dụng những
công nghệ khoa học tiên tiến nhất của ngành LED hiện nay. Sản phẩm được ứng
dụng trong mọi lĩnh vực của xã hội như văn hóa, truyền thông, thể thao, du lịch.

 Màn hình Video Display:

Hiển thị nhiều màu sắc, sắc nét trung thực và sống động là sản phẩm chủ yếu
phục vụ cho lĩnh vực quảng bá thương hiệu, sản phẩm đa dạng về chủng loại, có thể
dùng indoor, outdoor hay semi-outdoor.
Sản phẩm có khả năng hiển thị được tất cả các dạng thông tin quảng cáo,
trình diễn các hình ảnh động, chiếu một đoạn phim video như một màn hình Ti Vi
lớn và còn hơn thế nữa có thể kết nối trực tuyến với mạng máy tính. Sản phẩm cũng
được thiết kế để lắp đặt cả trong nhà lẫn ngoài trời.

 Bảng thông tin điện tử dùng cho thị trường chứng khoán:

Khác với đặc trưng hiển thị LED quảng cáo bình thường, đây là bảng hiển thị
thông tin dữ liệu động, thông tin được cập nhật liên tục. Màn hình lớn có thể chia ra
thành nhiều vùng để hiển thị theo từng nhóm thông tin chứng khoán như: tên công
ty, các tiêu đề và các thông số đấu giá, ảnh logo… Thông tin hiển thị được chia
thành các kịch bản chạy song song với nhau trên cùng hoặc khác phân vùng hiển
thị. Thông tin chứng khoán được cập nhật một cách tự động lên bảng điện tử. Màu
sắc thông tin hiển thị trên bảng điện tử thay đổi theo từng mã chứng khoán và phụ
thuộc vào sự tăng giảm giá của mã chứng khoán đó. Điều này giúp cho mọi người
theo dõi thông tin chứng khoán một cách dễ dàng hơn.

Không chỉ có vậy ngày nay bảng LED quảng cáo còn được ứng dụng trong
nhiều ngành, lĩnh vực khác nữa như : bảng thông tin nghiệp vụ cho ngành du lịch,
bưu điện điện tử, ngân hàng điện tử, bảng kết quả xổ số kiến thiết, bảng tỷ số thi

17
đấu thể thao, bảng điện tử dùng cho tín hiệu giao thông… với kiểu dáng phong phú,
thiết kế hiện đại và hiệu ứng bắt mắt cho hiệu quả cao trong lĩnh vực quảng cáo.
Tuy nhiên, do hạn chế về nhiều mặt cũng như ảnh hưởng của suy thoái kinh
tế toàn cầu nên hiện nay ở Việt Nam xuất hiện không nhiều các bảng, biển quảng
cáo hiển thị video, nhưng các bảng quảng cáo hiển thị dạng text dùng để giới thiệu,
quảng bá thương hiệu hay để hiển thị thông tin về các loại hình dịch vụ, sản phẩm
(mức lãi xuất ở ngân hàng, thông tin tại sàn giao dịch chứng khoán, thông tin về
thời gian biểu tại sân bay, kết quả các trận bóng …) … thì vẫn đang phát triển mạnh
mẽ. Đặc điểm ưu việt của loại hình này là dễ dàng thay đổi, cập nhật nội dung cần
hiển thị bằng phần mềm.

1.3) Giới thiệu chung về hệ thống


Với mục đích tìm hiểu về cách thiết kế và xây dựng một bảng quảng cáo điện
tử bằng đèn LED đơn giản chúng em xây dựng một hệ thống quang báo với sơ đồ
khối như sau:

18
Giao tiếp máy tính

Điều khiển hiển


thị

Chốt dữ liệu hàng Chốt dữ liệu cột

Khuếch đại công Khuếch đại công


suất hàng suất cột

Led ma trận

Hình 1 - Sơ đồ khối hệ thống

Khối giao tiếp với máy tính : có chức năng trao đổi dữ liệu giữa máy tính và
vi điều khiển, truyền các dữ liệu như nội dung hiển thị, màu sắc hiển thị, hiệu ứng
hiển thị ...đến vi điều khiển, đồng thời nhận các dữ liệu đó tại vi điều khiển để có
thể điều khiển hiển thị như mong muốn. Do đó, khối này khi thực hiện gồm có một
phần mềm sử dụng trên máy tính có chức năng giao tiếp với người dùng để chọn
các thông số cần truyền tới vi điều khiển và một số thủ tục để nhận dữ liệu tại vi
điều khiển. Các dữ liệu này sẽ được khối điều khiển hiển thị xử lý để có thể điều
khiển ma trận LED hiển thị nội dung cũng như hiệu ứng mong muốn.

19
Khối điều khiển hiển thị : có chức năng xử lý các dữ liệu mà máy tính
truyền tới để tạo ra các dữ liệu về mức logic cần cấp cho các led trong từng cột
đồng thời điều khiển quá trình cấp nguồn cho led ma trận . Khối này được xây dựng
bằng các thủ tục xử lý dữ liệu trên vi điều khiển . Khi nhận được dữ liệu về chuỗi
ký tự cần hiển thị thì khối này sẽ tạo dữ liệu về mức logic cần cấp cho led ma trận.
Khi nhận được dữ liệu về màu sắc, hiệu ứng hiển thị thì khối này sẽ xác định thủ tục
gửi dữ liệu cho các khối chốt dữ liệu hàng và cột.

Khối chốt dữ liệu hàng : có chức năng chốt các giá trị logic cấp nguồn cho
các hàng của ma trận. Khối này gồm một chuỗi các bộ 74HC595 mắc nối tiếp. Dữ
liệu về mức logic của các hàng và tín hiệu báo chốt dữ liệu sẽ được khối điều khiển
hiển thị gửi đến. Các dữ liệu này sẽ được chốt lại tại đầu ra của khối cho đến khi dữ
liệu mới được yêu cầu chốt.

Khối chốt dữ liệu cột : có chức năng chốt các giá trị logic cấp nguồn cho các
cột của ma trận. Khối này được thực hiện bằng cách sử dụng IC 74HC138. Dữ liệu
về mức logic của các cột sẽ được khối điều khiển hiển thị gửi đến phù hợp với dữ
liệu của các hàng để có thể hiển thị đúng như mong muốn. Các dữ liệu này sẽ được
chốt lại tại đầu ra của khối cho dến khi dữ liệu mới được yêu cầu chốt.

Khối khuếch đại công suất hàng : có chức năng đảm bảo cấp đủ nguồn cho
các hàng của led ma trận, đồng thời hạn chế dòng chạy qua các chân của các IC
chốt dữ liệu hàng. Để đảm bảo chức năng này khối này gồm các IC ULN2803 mắc
nối tiếp với các IC 74HC595.
Khối khuếch đại công suất cột : có chức năng đảm bảo cấp đủ nguồn cho
các cột của led ma trận, đồng thời hạn chế dòng chạy qua các chân của các IC chốt
dữ liệu cột. Để đảm bảo chức năng này khối được xây dựng gồm các transistor
B562. Cực B của các transistor được điều khiển bởi IC 74HC138.

20
Chương 2 : Giới thiệu về vi điều khiển AVR Atmega16

2.1) Giới thiệu về vi điều khiển họ AVR


2.1.1) Một số đặc trưng
Đây là loại vi điều khiển 8 bit, xử lý nhanh, tiêu thụ năng lượng thấp.
AVR [6] có cấu trúc RISC với :
 131 lệnh, hầu hết các lệnh thực thi trong một chu kỳ xung nhịp.
 32 x 8 thanh ghi đa dụng
 Full static operation

21
 Tốc độ làm việc 16MPIS, với thạch anh 16 MHz.
 On_chip 2 cycle multipler.
Bộ nhớ :
 ISP Flash với khả năng 10.000 lần ghi xóa.
 EEROM.
 RAM.
Giao tiếp JTAG :
 Khả năng quét toàn diện theo chuẩn JTAG.
 Hỗ trợ khả năng Debug onchip
 Hỗ trợ lập trình Flash, EEROM, fuse…
 Lock bit qua giao tiếp JTAG
Ngoại vi :
 Timer/ counter 8 bit với các chế độ : so sánh và chia tần số.
 Timer/counter 16 bit với các chế độ : so sánh, chia tần số, capture,
PWM.
 Timer thời gian thực (Real time Clock) với bộ dao động riêng biệt.
 Các kênh PWM.
 Kênh biến đổi ADC 10 bit.
 Hỗ trợ giao tiếp I2C.
 Bộ giao tiếp nối tiếp lập trình được USART.
 Giao tiếp SPI.
 Watch_dog timer với bộ dao động on_chip riêng biệt.
Những thuộc tính đặc biệt :
 Power on reset và Brown-out detection.
 Chế độ hiệu chỉnh bộ sai số cho bộ dao động RC on chip
 Các chế độ ngắt ngoài và trong đa dạng.
 6 mode sleep : Idle, ADC noise reduction, tiết kiệm năng lượng,
power-down, standby, extended standby.
Các phần mềm lập trình cho AVR :

22
 AVRStudio, Code Vision. Các phần mềm này có hỗ trợ phần nạp và
Debug on chip.
 Ngoài ra có thể dùng chương trình nạp PonyProg2000, Winpic800 …

2.1.2) Một số đặc trưng


AVR có cấu trúc Havard 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, các Register File. Trong khi đó, program memory bus có độ rộng 16 bit
và chỉ phục vụ cho thanh ghi lệnh (instruction register).
Bộ nhớ chương trình (program memory) là bộ nhớ Flash lập trình được.
Trong các loại AVR cũ như AT90S1200 bộ nhớ chương trình chỉ gồm một phần là
Application Flash Section còn trong các loại AVR mới có thêm phần Boot Flash
Section. Chức năng chính của bộ nhớ chương trình là chứa các lệnh (instruction)
nên chúng ta không có nhiều cơ hội tác động nên bộ nhớ này khi lập trình cho chip.
Cũng chính vì vậy mà đối với người lập trình thì 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.

23
Hình 2 - Cấu trúc bộ nhớ 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. 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 bộ nhớ này được chia làm các phần :
 Tệp thanh ghi (Register file) : gồm 32 thanh ghi 8 bit có địa chỉ tuyệt
đối từ 0x0000 đến 0x001F. Các thanh ghi này được đặt tên là từ R0
đến R31. Chúng có đặc điểm :
• Đượ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
một xung Clock.
• Tệp thanh ghi được kết nối trực tiếp với bộ xử lý trung tâm,
CPU 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ả
 Các thanh ghi vào ra (thanh ghi I/O hay còn gọi là vùng
nhớ I/O) là cổng giao tiếp giữa CPU với thiết bị ngoại vi. Tất cả các

24
thanh ghi điều khiển, trạng thái … của thiết bị ngoại vi đều nằm ở
đây.
 RAM ngoại (External RAM) : các chip vi điều khiển
AVR cho phép người dùng có thể gắn thêm RAM 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.
 EEPROM (Electrical Erasable 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 cấp nguồn nuôi chip, rất thích
hợp cho các ứng dụng lưu trữ dữ liệu.

2.1.3) Một số đặc trưng

Hình 2 - Cấu trúc bên trong của AVR

25
Hoạt động :Các lệnh đượ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à một lệnh chứa trong Program memory được load vào thanh ghi
lệnh (instruction Register), thanh ghi lệnh tác động cũng như lựa chọn tệp thanh ghi
cũng như RAM cho ALU thực thi. Trong khi 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 bộ đếm chương trình – PC (Program
Counter).
AVR có ưu điểm là hầu hết các lệnh đều được thực thi trong một chu kỳ
xung nhịp, vì thế mà trong một số trường hợp dù nguồn clock của AVR nhỏ hơn
một số loại vi điều khiển khác (như PIC) nhưng thời gian thực thi vẫn nhanh hơn.

2.1.4) Một số họ vi diều khiển AVR


Vi điều khiển AVR rất phong phú và đa dạng, bao gồm nhiều họ khác nhau :
 Họ ATUC30xxxx (xxxx thể hiện dung lượng Flash của vi điều khiển,
ví dụ : ATUC30512 có 512 kB Flash).
 Dòng vi điều khiển MEGA AVR.
 Dòng Tiny AVR.
 Dòng LCD AVR
 Dòng USB AVR
 Dòng CAN AVR.

2.2) Sơ bộ về vi điều khiển Atmega16

Atmega16 [3] là bộ vi điều khiển CMOS 8 bit tiêu thụ điện năng thấp dựa
trên kiến trúc RISC (Reduced Intruction Set Computer). Vào ra Analog – digital và
ngược lại. Với công nghệ này cho phép các lệnh thực thi chỉ trong một chu kì xung
nhịp, vì thế tốc độ xử lý dữ liệu có thể đạt đến 1 triệu lệnh trên giây ở tần số 1 Mhz.

26
Vi điều khiển này cho phép người thiết kế có thể tối ưu hoá chế độ độ tiêu thụ năng
lượng mà vẫn đảm bảo tốc độ xử lí.

Sơ đồ khối

Hình 2 - Sơ đồ khối của Atmega16

Atmega16 có tập lệnh phong phú về số lượng với 32 thanh ghi làm việc đa
năng. Toàn bộ 32 thanh ghi đều được nối trực tiếp với ALU (Arithmetic Logic
Unit), cho phép truy cập 2 thanh ghi độc lập bằng một chu kì xung nhịp. Kiến trúc
đạt được có tốc độ xử lý nhanh gấp 10 lần vi điều khiển dạng CISC (Complex
Intruction Set Computer) thông thường.

27
Khi sử dụng vi điều khiển Atmega16, có rất nhiều phần mềm được dùng để
lập trình bằng nhiều ngôn ngữ khác nhau đó là: Trình dịch Assembly như AVR
studio của Atmel, Trình dịch C như win AVR, CodeVisionAVR C, ICCAVR. C -
CMPPILER của GNU… Trình dịch C đã được nhiều người dụng và đánh giá tương
đối mạnh, dễ tiếp cận đối với những người bắt đầu tìm hiểu AVR, đó là trình dịch
CodeVisionAVR C. Phần mềm này hỗ trợ nhiều ứng dụng và có nhiều hàm có sẵn
nên việc lập trình tốt hơn.

2.2.1) Đặc trưng


 Được chế tạo theo kiến trúc RISC hiệu suất cao mà điện năng tiêu thụ thấp
 Tập lệnh gồm 131 lệnh, hầu hết đều chỉ thực thi trong 1 chu kì xung nhịp.
 Bộ nhân hai chu kì.
 32 x 8 thanh ghi làm việc đa dụng.
 Hoạt động tĩnh
 16 MIPS với thông lượng 16MHz
 8KB Flash ROM lập trình được ngay trên hệ thống :
 Giao diện nối tiếp SPI có thể lập trình ngay trên hệ thống.
 Cho phép 1000 lần ghi/xóa.
 Bộ EEPROM 512 byte, cho phép 100.000 lần ghi/xóa
 16 Kbyte bộ nhớ chương trình in-System Self-programmable Flash.
 Chu kì ghi/xóa (Write/Erase) :10.000 Flash/ 100.000 EEPROM.
 Độ bền dữ liệu 20 năm ở 85°C và 100 năm ở 25°C
 Bộ nhớ SRAM 512 byte.
 Bộ biến đổi ADC 8 kênh, 10 bit.
 32 ngõ I/O lập trình được.
 Bộ truyền nối tiếp bất đồng bộ vạn năng UART.
 Vcc=2.7V đến 5.5V.
 Tốc độ làm việc: 8 MHz đối với Atmega16L, 16MHz đối với
Atmega16 tối đa .

28
 Tốc độ xử lí lệnh đến 8 MIPS ở 8 MHz nghĩa là 8 triệu lệnh trên
giây.
 Bộ định thời gian thực (RTC) với bộ dao động và chế độ đếm
tách biệt
 2 bộ Timer 8 bit và 1 bộ Timer 16 bit với chế độ so sánh và chia
tần số tách biệt và chế độ bắt mẫu.
 4 kênh điều chế độ rộng xung PWM.
 Có đến 13 interrupt ngoài và trong.
 Bộ so sánh Analog.
 Bộ lập trình Watch dog timer.
 6 chế độ ngủ : Idle, ADC Noise Reduction, Power-save, Power-
down, Standby và Extended Standby.
 Giao tiếp nối tiếp Master/Slave SPI.

Hình 2 - Sơ đồ chân Atmega16

 VCC: Điện áp nguồn nuôi.

29
 GND: Nối mass.
 PortA (PA7…PA0): PortA nhận vào tín hiệu Analog và chuyển
đổi qua tín hiệu Digital. Ngoài ra PortA có thể được tách ra làm vào ra 2
hướng 2 bit nếu bộ chuyển đổi A/D không được sử dụng. Khi các chân
PA0 đến PA7 là các lối vào và được đặt xuống chế độ thấp từ bên ngoài,
chúng sẽ là nguồn dòng nếu các điện trở nối lên nguồn dương được kích
hoạt. Các chân của Port A ở vào trạng thái có điện trở cao khi tín hiệu
Reset ở chế độ tích cực hoặc ngay cả khi không có tín hiệu xung đồng
hồ.
Port A cung cấp các đường địa chỉ/dữ liệu vào/ra hoạt động theo kiểu đa
hợp kênh khi dùng bộ nhớ SRAM ở bên ngoài.
 PortB,D : tương tự như PortA.
 PortC (PC7…PC0): tương tự như PortA. Nhưng nếu cho phép
giao diện JTAG, thì các chân PC5, PC3, PC2 sẽ hoạt động ngay cả khi
reset lại tín hiệu.
 Reset: Lối vào đặt lại. Bộ vi điều khiển sẽ được đặt lại khi chân
này ở chế độ thấp trong hơn 50ns, các xung ngắn hơn không tạo ra tín
hiệu đặt lại.
 XTAL1: Lối vào bộ khuếch đại đảo và lối vào mạch tạo xung
nhịp bên trong.
 XTAL2: Lối ra bộ khuếch đại đảo : XTAL1 và XTAL2 lần lượt
là lối vào và lối ra của một bộ khuếch đại đảo. Bộ khuếch đại này được
bố trí để làm bộ tạo dao động trên chip. Một bộ tinh thể thạch anh hoặc
một bộ cộng hưởng gốm có thể được sử dụng. Để điều khiển bộ vi điều
khiển từ một nguồn xung nhịp bên ngoài, chân XTAL2 để trống, còn
chân XTAL1 được nối với bộ dao động bên ngoài.
 AREF : Là chân chuyển đổi tín hiệu analog cho bộ chuyển đổi
A/D.
 AVCC : Là chân nguồn cho Port A và cho bộ chuyển đổi A/D.
Nó có thể tự kết nối với nguồn chính ngay cả khi ADC không được sử
dụng.

30
2.2.2) CPU
Kiến trúc AVR nói chung, các chức năng chính của CPU đảm bảo sự thực thi
chính xác process. CPU phải có khả năng truy xuất bộ nhớ, thực hiện tính toán, điều
khiển thiết bị ngoại vi và các kênh ngắt.
Trong thứ tự thực hiện song song, AVR sử dụng kiến trúc Harvard với bộ
nhớ tách rời giữa hai luồng process và dữ liệu. Các chỉ lệnh trong bộ nhớ process
được thực hiện với những mức pipeline đơn. Trong khi một lệnh dang thực thi, lệnh
tiếp theo sẽ được tìm nạp trước từ bộ nhớ process. Khái niệm này cho phép các lệnh
sẽ được thực hiện trong mọi chu kỳ xung. Bộ nhớ process là hệ thống bộ nhớ Flash
lập trình lại được. Truy xuất nhanh thanh ghi File chứa 32*8 bit thanh ghi làm việc
đa năng với một chu kỳ xung đơn truy xuất thời gian. Điều này cho phép bộ tính
toán ALU làm việc đơn chu kỳ.
6 trong 32 thanh ghi có thể sử dụng như 3 địa chỉ gián tiếp thanh ghi con trỏ
cho không gian địa chỉ dữ liệu. Nó cũng có thể được sử dụng như con trỏ của bộ
nhớ process Flash.
Một lệnh AVR có 16 bit đơn định dạng word.
Mỗi địa chỉ bộ nhớ process chứa 16 hoặc 32 lệnh.
Bộ nhớ process Flash được chia ra làm 2 khu vực, khu vực khởi động
process và khu vực ứng dụng process. Cả hai khu vực được thiết kế bảo vệ các bit
ghi và đọc/ghi.
Trong khi các ngắt và process con được gọi, địa chỉ trả về của Counter
process (PC) được lưu trữ trong Stack. Stack được định phần trong dữ liệu tổng
quát SRAM, vì vậy kích thước STACK được hạn chế bởi kích thước SRAM tổng
và cách sử dụng của nó. Tất cả các process sử dụng phải khởi tạo giá trị đầu cho
Stack Poiter trước khi process con hoặc ngắt được gọi. Stack Poiter được đọc/ghi
được sử dụng trong không gian I/O. Dữ liệu SRAM có thể dễ dàng được truy xuất
qua 5 cách đánh địa chỉ khác nhau hộ trợ trong kiến trúc AVR. Không gian bộ nhớ
trong kiến trúc AVR là tất cả những bản đồ bộ nhớ phổ biến tuyến tính. Một module
ngắt linh hoạt có những thanh ghi điều khiển trong không gian I/O với một ngắt

31
toàn cục cho phép ngắt trong thanh ghi trạng thái. Tất cả các ngắt đều có vector ngắt
riêng biệt trong bảng vector ngắt. Địa chỉ vector ngắt càng thấp quyền ưu tiên ngắt
càng cao.
Không gian bộ nhớ I/O chứa 64 địa chỉ cho các chức năng ngoại vi CPU như
thanh ghi điều khiển,SPI, và một số chức năng I/O khác.

Hình 2 - Sơ đồ khối cấu trúc ATmega16

2.2.2.1 ALU – Arithmetic Logic Unit :


Thực thi cao AVR ALU hoạt động trong sự kết nối trực tiếp với tất cả 32
thanh ghi hỗ trợ làm việc. Hoạt động trong ALU được chia thành 3 chức năng
chính: số học, logic và chức năng bit.

2.2.2.2 Thanh ghi trạng thái (Status Registers) :

32
Chứa thông tin về kết quả của các tính toán được thực thi gần nhất. Chú
ý Status Register được thay đổi sau tất cả các phép tính toán trong ALU.

Bit 7 6 5 4 3 2 1 0

I T H S V N Z C

Read/Write R/W R/W R/W R/W R/W R/W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

 Bit 7-I : cho phép ngắt toàn cục. Không cho phép người sử dụng
tự ý xóa. Chỉ bị xóa khi có ngắt mới xuất hiện và được chỉ dẫn bởi RETI
cho những ngắt kế tiếp. Có thể được đặt hoặc được xóa bởi SEI và CLI.
 Bit 6-T : bit lưu trữ. Có thể chép từ BST sang BLD và ngược lại.
 Bit 5-H : Cờ nhớ nửa H sử dụng để nhớ nửa hữu ích trong phép tính số
BCD.
 Bit 4-S : tín hiêu bit S = N ⊕ V
 Bit 3-D : 2 cờ tràn
 Bit 2-N : cờ phủ định.
 Bit 1-Z : cờ zero
 Bit 0-C : cờ nhớ.

2.2.2.3 Thanh ghi mục đích chung:


Thanh ghi file được tối ưu hóa cho AVR tăng cường lập tập tin. Trong mệnh
lệnh để đạt được sự thực hiện đòi hỏi và tính tối ưu hóa những sơ đồ vào ra đây
được hỗ trợ :
 Một toán hạng ngõ ra 8 bit và một kết quả ngõ vào 8 bit.
 Hai toán hạng ngõ ra 8 bit và một kết quả ngõ vào 8 bit.
 Hai toán hạng ngõ ra 8 bit và một kết quả ngõ vào 16 bit.

33
 Một toán hạng ngõ ra 16 bit và một kết quả ngõ vào 16 bit.

Hình 2 - Các thanh ghi hỗ trợ làm việc AVR CPU

2.2.2.4 Con trỏ ngăn xếp (Stack pointer):

Bit 15 14 13 12 11 10 9 8
SP15 SP14 SP13 SP12 SP11 SP10 SP9 SP8
SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0

Bit 7 6 5 4 3 2 1 0
Read/Write R/W R/W R /W R/W R/W R/W R/W R/W
R/W R/W R /W R/W R/W R/W R/W R/W
Khởi tạo 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Thanh ghi Stack Poiter luôn trỏ đến đỉnh của ngăn xếp.
Stack Poiter trỏ đến ngăn xếp dữ liệu SRAM lưu trữ những process con
và những ngắt cục bộ. Khoảng trống trong SRAM phải được định nghĩa bởi
process trước bất kỳ process con nào gọi nó thực thi hoặc ngắt nào được hoạt
động. Stack Poiter giảm đi 1 khi dữ liệu được đẩy lên trên Stack với lệnh
PUSH, và giảm đi 2 khi trả về địa chỉ được đẩy lên trên Stack với sự gọi
process con hoặc ngắt được gọi. Stack Poiter tăng lên 1 khi dữ liệu được đưa ra

34
khỏi Stack với lệnh POP, và tăng lên 2 khi dữ liệu được đưa ra khỏi Stack trả về
từ process con RET hoặc trả về từ ngắt RETI.
Stack Poiter AVR được bổ xung như 2 thanh ghi 8 bit trong không gian
I/O. Số lượng các bít được sử dụng là sự thi hành phụ thuộc. Chú ý không gian
dữ liệu trong bổ xung của kiến trúc AVR nhỏ nên chỉ sử dụng thanh ghi SPL,
trong trường hợp này không có thanh ghi SPH.

2.2.2.5 Reset và xử lý ngắt.


AVR cung cấp vài nguồn ngắt khác nhau. Các ngắt này có vector Reset riêng
biệt với vector process. Tất cả các ngắt ghi ở mức logic 1 cùng với ngăt toàn cục.
Trong thanh ghi trạng thái các bit cho phép ngắt phụ thuộc giá trị Counter process.
Các ngắt có thể tự động bị cấm khi khởi động khóa bit BLB02 hoặc BLB12.
Khi một ngắt xuất hiện, ngắt toàn cục cho phép I-bit xóa và tất cả các ngắt
còn lại bị cấm. Sử dụng phần mềm có thể ghi logic 1 cho I-bit cho phép ngắt. Tất cả
các ngắt được cho phép có thể ngắt thường trình. I-bit tự động được lập khi một
lệnh ngắt trở lại thực thi từ RETI.
Có hai kiểu ngắt cơ bản.
 Kiểu 1 : hoạt động bởi 1 sự kiện lập bởi cờ ngắt. Với mỗi ngắt Counter
process là một vector tới vector ngắt hiện tại trong thứ tự thực thi, phần cứng
sẽ xóa cờ ngắt. Các cờ ngắt có thể bị xóa bởi ghi logic 1 tới vị trí bit cờ để
xóa. Nếu điều kiện một ngắt xuất hiện trong khi cho phép ngắt bit bị xóa thì
cờ ngắt sẽ được lập và nhớ đến khi ngắt cho phép hoặc cờ ngắt bị xóa bởi
phần mềm. Tương tự, điều kiện để các ngắt xuất hiện trong khi bit
GIE(Global Interrupt Enable) bị xóa thì cờ nhớ sẽ lập và nhớ đến khi bit GIE
được lập.
 Kiểu 2 : các ngắt sẽ được hoạt động nếu điều kiện để ngắt có mặt. Những
ngắt này không cần có cờ ngắt. Nếu điều kiện ngắt không xuất hiện trước khi
ngắt cho phép ngắt sẽ không được hoạt động.

Khi AVR thoát khỏi 1 ngắt, nó sẽ luôn trả về process chính và thực thi hơn
một lệnh trước khi tạm dừng ngắt. Chú ý thanh ghi trạng thái không tự động lưu trữ

35
khi vào một thủ tục ngắt và cũng không tự phục hồi khi thoát ra khỏi thủ tục. Khi sử
dụng lệnh CLI để cấm các ngắt thì ngắt sẽ không trực tiếp bị cấm. Không có ngắt
được thực thi sau lệnh CLI ngay cả khi xuất hiện đồng thời với lệnh. Xem ví dụ
sau :
 Ghi bằng Assembly

 Ghi bằng C

Khi sử dụng lệnh SEI cho phép ngắt:


 Ghi bằng Assembly

 Ghi bằng C

2.2.2.6 Ngắt đáp ứng lại thời gian


Ngắt thực thi đáp ứng cho tất cả các ngắt cho phép của AVR là 4 chu kỳ
xung tối thiểu. Sau 4 chu kỳ xung vector process thêm địa chỉ cho ngắt đang hoạt
động trong process con thực thi. Trong khoảng thời gian này bộ nhớ process sẽ đẩy

36
lên trên Stack. Vector ngắt nhảy đến ngắt trong process con và lệnh ngắt này sẽ đưa
ra 3 chu kỳ xung. Nếu một ngắt xuất hiện trong khi thực thi nhiều chu trình lệnh,
thì lệnh sẽ được trước khi ngắt được thực hiện. Nếu một ngắt xuất hiện khi MCU ở
chế độ ngủ, ngắt thực thi yêu cầu thời gian tăng bởi 4 chu kỳ xung.
Trở về từ ngắt process con đưa rad 4 chu kỳ xung bộ đếm chương trình sẽ
được đưa ra từ Stack, Stack Poiter tăng thêm 2 và I-bit trong SREG được lập.

2.2.3) Bộ nhớ
Phần này mô tả các bộ nhớ khác nhau trong Atmega16. Kiến trúc AVR có 2
bộ nhớ chính : bộ nhớ dữ liệu và bộ nhớ process. Bổ xung thêm vào đặc tính AVR
một bộ nhớ EEPROM lưu trữ dữ liệu.

2.2.3.1 Hệ thống bộ nhớ lập trình lại Flash


Atmega16 chứa 16 K bytes On-Chip trong hệ thống bộ nhớ lập trình lại
Flash để lưu trữ process. Cho AVR 16 hoặc 32 bit thì bộ nhớ flash là 8K*16. Bộ
nhớ Flash có khả năng ghi/ xóa 1000 lần cho mỗi vòng. Atmega16 có Counter 13
bit cùng với 8K địa chỉ process.

Hình 2 - Sơ đồ bộ nhớ process

2.2.3.2 Bộ nhớ dữ liệu SRAM

37
Có tới 1120 địa chỉ ô nhớ cho bộ nhớ nhập xuất, thanh ghi file và SRAM
nội. 96 đường địa chỉ đầu tiên dành riêng cho thanh ghi file và bộ nhớ vào ra và còn
1024 đường địa chỉ còn lại cho SRAM nội.

Hình 2 - Sơ đồ bộ nhớ dữ liệu

Hình 2 - Những chu kỳ truy xuất SRAM

2.2.3.3 Bộ nhớ dữ liệu EEPROM

38
Atmega16 chứa 512 byte bộ nhớ dữ liệu EEPROM. Nó được tổ chức như
một không gian dữ liệu riêng biệt, mỗi byte đơn có thể đọc và ghi. EEPRAM có khả
năng thực hiện 100.000 chu kỳ ghi/xóa. Truy xuất giữa EEPRAM và CPU được mô
tả theo đặc tả thanh ghi địa chỉ, thanh ghi dữ liệu và thanh ghi điều khiển EEPROM.

Thanh ghi địa chỉ EEPROM :EEARH và EEARL

Bit 15 14 13 12 11 10 9 8
- - - - - - - EEAR8
EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0

Bit 7 6 5 4 3 2 1 0
Read/Write R R R R R R R R/W
R/W R/W R/W R/W R/W R/W R/W R/W
Khởi tạo 0 0 0 0 0 0 0 X
X X X X X X X X

 Bit 15…9 – Res : các bit đã đăng ký trước.


Các bit này sẽ luôn được đọc là 0.
 Bit 8…0 – EER8…0 : địa chỉ EEPROM.
Thanh ghi địa chỉ EEPROM – EEARH và EEARL mô tả địa chỉ EEPROM
trong 512 byte không gian EEPROM. Các byte dữ liệu EEPROM được thêm vào
tuyến tính giữa 0 và 511. Giá trị đầu của EEAR là không xác định. Một giá trị riêng
phải được ghi trước.

2.2.3.3.2 Thanh ghi dữ liệu EEPROM : EEDR


Bit 7 6 5 4 3 2 1 0

MSB LSB

Read/Write R/W R/W R/W R/W R/W R/W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

 Bit 7…0 – EEDR7…0 : EEPROM dữ liệu

39
EEPROM ghi hoạt đọng, thanh ghi EEDR chứa dữ liệu ghi tới EEPROM trong
địa chỉ đưa bởi thanh ghi EEAR. Cho hoạt động đọc EEPROM, EEDR chứa dữ liệu
đọc ngoài từ EEPROM tại địa chỉ đưa bởi EEAR.

2.2.3.3.3 Thanh ghi điều khiển EEPROM :EECR


Bit 7 6 5 4 3 2 1 0

- - - - EERIE EEMWE EEWE EERE

Read/Write R/W R/W R/W R/W R/W R/W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

 Bit 7…4 – Res : các bit đăng ký trước


Các bit này đã được đăng ký trước trong Atmega16 và luôn được đọc là 0.
 Bit 3 – EERIE : EEPROM sẵn sàng cho phép ngắt
Ghi EERIE lên 1 cho phép EEPROM sẵn sàng ngắt nếu I-bit trong SREG
được lập. Ghi EERIE về 0 sẽ cấm ngắt. Khi EEWE bị xóa EEPROM sẵn sàng phát
ra ngắt là một hằng số ngắt.
 Bit 2 – EEMWE : EEPROM chỉ cho phép ghi
Khi Bit EEMWE được lập, lập EEWE với 4 chu kỳ xung sẽ ghi dữ liệu tới
EEPROM tại địa chỉ được chọn. Nếu EEMWE = 0, lập EEWE sẽ không có ảnh
hưởng. Khi EEMWE được ghi lên 1 bởi phần mềm, phần cứng xóa bit về 0 sau 4
chu kỳ xung.
 Bit 1 – EEWE : EEPROM cho phép ghi
EEPROM cho phép ghi tín hiệu EEWE được ghi tín hiệu tra cứu tới
EEPROM. Khi địa chỉ và dữ liệu đưa lên chính xác, bit EEWE phải ghi lên 1. Bit
EEMWE phải ghi lên 1 trước khi logic 1 được ghi cho EEWE. Các bước cần làm
khi ghi EEPROM. (bước 3 và 4 có thể bỏ qua).
 Đợi đến khi EEWE trở về 0.
 Đợi đến khi SPMEN trong SPMCR trở về 0.
 Ghi địa chỉ mới EEPROM tới EEAR (tùy chọn).

40
 Ghi dữ liệu mới EEPROM tới EEAR (tùy chọn).
 Ghi logic 1 tới bit EEMWE trong khi ghi EEWE trong EECR về 0.
 Trong 4 chu kỳ xung đồng hồ sau khi lập EEMWE ghi logic 1 cho
EEWE.

 Bit 0 – EERE : EEPROM cho phép đọc


Tín hiệu cho phép đọc EERE đọc tín hiệu tra cứu tới EEPROM. Khi địa chỉ
đúng thì lập lên thanh ghi EEAR, bit EERE phải ghi ở logic 1 để khởi động
EEPROM đọc. Sự truy xuất EEPROM đọc cần 1 lệnh và yêu cầu dữ liệu có giá trị
trực tiếp. Khi EEPROM được đọc CPU bị dừng trong 4 chu kỳ trước khi lệnh tiếp
được thực thi. Người sử dụng cần phải kiểm tra bit EEWE trước thao tác đọc. Nếu
ghi hoạt động trong tiến trình thì không cái nào có thể đọc EEPROM, cũng không
thể thay đổi thanh ghi EEAR. Bộ dao động chuẩn được sử dụng để lấy thời gian
truy xuất EEPROM.

2.2.3.4 Bộ nhớ I/O :


Tất cả các Atmega16 I/O và các thiết bị ngoại vi trong không gian I/O. Vị trí
I/O được truy xuất bởi lệnh IN và OUT, sự chuyển dữ liệu giữa 32 thanh ghi hỗ trợ
làm việc và không gian I/O. Những thanh ghi I/O thuộc phạm vi địa chỉ 00$ - $1F
là bít truy xuất trực tiếp sử dụng các lệnh SBI và CBI. Trong các thanh ghi giá trị
các bit đơn được kiểm tra bởi các lệnh SBI và CBI.

41
Chương 3 : Nguyên tắc điều khiển led ma trận

3.1) Cấu trúc và nguyên lý cấp nguồn cho led ma trận

Led ma trận bao gồm các led đơn được xếp thành hàng và cột . Các led đơn
trong cùng một hàng thì được nối chung anot (catot) còn trong cùng một cột thì
được nối chung catot (anot). Do đó để các led có thể sáng ta phải cấp nguồn cho led
như sau : cấp mức cao (thấp) cho hàng và mức thấp (cao) cho cột.

Hình 3 - Led ma trận chung anot

Với cách sắp xếp như trên tại một thời điểm ta không thể hiển thị một kí tự
(với trên 2 hàng 2 cột) trên ma trận. Do đó để có thể hiển thị một kí tự trên led ma

42
trận thì ta phải lợi dụng hiện tượng lưu ảnh trên võng mạc. Ta phải để cho từng
hàng (cột) của kí tự lần lượt kiện thị trên led ma trận với tần số cao. Trước tiên ta
phải xác định mức logic cần cấp cho từng hàng (cột) của led ma trận để hiển thị ký
tự rồi lưu các giá trị logic này lại. Sau đó khi cần hiển thị ký tự thì ta lần lượt đưa
các giá trị này ra các chân cấp nguồn cho hàng (cột) đồng thời cấp nguồn cho cột
(hàng) tương ứng với nó.

3.2) Nguyên tắc tạo font chữ hiển thị

Để cụ thể hơn ta xét ví dụ hiển thị chữ R trên led ma trận 8x8 theo cách quét
lần lượt từng cột ma trận. Do quét theo từng cột nên ta sẽ phải xác định mức logic
cần cấp cho tất cả các led trong từng cột. Giả thiết các led cùng hàng mắc chung
anot, các led trong cùng một cột mắc chung catot. Khi đó nếu muốn một led nào đó
trong cột sáng thì ta phải cấp điện áp mức cao vào hàng tương ứng.

Bảng 3 - Tạo font chữ cho kí tự

H H H H
H H
H H
H H H H
Nhìn vào
H H
bảng trên ta thấy
muốn hiển thị chữ H H

R phải cấp nguồn H H


cho các led trong
từng cột như sau :
Cột 5: L , H , H , L , L , L , H , L

43
Cột 4: H , L , L , H , L , H , L , L
Cột 3: H , L , L , H , H , L , L , L
Cột 2: H , L , L , H , L , L , L , L
Cột 1: H , H , H , H , H , H , H , L
Các led trong các cột khác được cấp điện áp mức thấp .
Các giá trị này cần được lưu lại trong bộ nhớ của vi điều khiển để khi cần ta
có thể lấy ra. Ta có thể lưu các giá trị này thành từng byte trong bộ nhớ theo trật tự
từ hàng 1 tới hàng 8 hay ngược lại. Ví dụ cột 1 ta lưu theo thứ tự từ hàng một tới 8
thì lưu giá trị 0F8H còn nếu ngược lại thì là 7FH .
Việc mã hóa font phụ thuộc vào cách cấp nguồn cho ma trận led. Nếu ta cấp
nguồn cho từng cột của ma trận led sáng lần lượt thì font chữ phải lưu các giá trị
logic mã hóa cách cập nguồn cho tất cả các led trong cột đó. Giả sử ta mã hóa font 6
cột 8 hàng ( 5 cột mã hóa chữ 1 cột tạo khoảng cách 2 chữ kế tiếp) như đã nêu trong
nguyên tắc điều khiển led thì mỗi kí tự cần 6 byte dữ liệu để lưu.

3.3) Điều khiển hiển thị led ma trận

Để tiện cho việc truy xuất dữ liệu ta có thể khai báo 1 mảng trong bộ nhớ
Flash của Atmega16 lưu các dữ liệu này. Khi đó địa chỉ đầu của dữ liệu mã hóa 2
ký tự gần nhau thì cách nhau cách nhau 6. Vì vậy khi biết được vị trí của 1 kí tự
trong font thì ta có thể xác định địa chỉ của dữ liệu mã hóa kí tự đó. Trên cơ sở đó
ta có thể dễ dàng xuất dữ liệu của kí tự cần hiển thị ra .
Sau khi xác định được các mức logic cần cấp cho ma trận led thì ta có thể
tiến hành điều khiển quá trình cấp nguồn cho led ma trận để có được hình ảnh như ý
muốn. Việc cấp nguồn cho led ma trận phụ thuộc vào cách mã hóa dữ liệu (theo
từng hàng hay theo từng cột của ma trận). Nếu dữ liệu mã hóa là các hàng trong 1
cột (hàng) thì tại một thời điểm ta chỉ cấp nguồn cho một cột (hàng . Quá trình điều
khiển hiển thị led ma trận 8x8 theo từng cột (hàng) bao gồm các bước sau :
- B1: Lấy mẫu dữ liệu : lấy các dữ liệu về mức logic cần cấp cho các cột
(hàng) của ma trận
- B2: Bắt đầu với cột i=1.

44
- B3: Cấp nguồn cho cột i
- B4: Xuất dữ liệu tương ứng với cột đó ( đã được lấy mẫu từ trước) để cấp
nguồn cho các hàng của ma trận
- B5: i=i+1 ; quay lại bước 2 nếu i>8 ,nếu không thì quay lại bước 3

Bắt đầu

Lấy mẫu dữ liệu

i=1

Xuất dữ liệu của


cả cột i ra
74HC595

Chốt dữ liệu cột i

i=i+1

T F
i>8

Hình 3 - Lưu đồ thuật toán cấp nguồn cho ma trận led


45
Nếu chỉ điều khiển 1 số lượng led ma trận nhỏ thì ta có thể dùng trực tiếp các
chân của vi điều khiển để điều khiển việc cấp nguồn cho led ma trận. Nếu ma trận
lớn hơn thì ta phải dùng các bộ ghi dịch để cấp nguồn cho led ma trận.
Để hình ảnh trên led ma trận hiển thị rõ ràng không bị nháy ta cần phải điều
khiển tần số quét led ma trận. Có thể dùng các bộ định thời của vi điều khiển để
điều khiển thời điểm cấp nguồn cho led ma trận tạo tần số quét.

Tóm lại để điều khiển led ma trận ta đầu tiên ta cần phải xác định được
phương pháp cấp nguồn cho ma trận ( cấp nguồn theo từng cột hay từng hàng ). Sau
khi đã xác định được phương pháp cấp nguồn ta cần phải xây dựng font chữ cho
phù hợp với cách cấp nguồn. Từ đây ta có thể tiến hành điều khiển việc cấp nguồn
cho ma trận để dòng chữ trên ma trận hiển thị như mong muốn.

46
Chương 4: Điều khiển cấp nguồn cho led ma trận
Chương này sẽ trình bày về cách điều khiển cấp nguồn cho ma trận sử dụng
phương pháp cấp nguồn theo từng cột. Việc điều khiển cấp nguồn cho các cột được
thực hiện bằng cách sử dụng IC 74HC138. Các hàng của ma trận sẽ được cập nguồn
bằng cách sử dụng bộ ghi dịch 74HC595. Các dữ liệu mã hóa font được truyền nối
tiếp từ vi điều khiển tới bộ ghi dịch bằng cách sử dụng SPI .

4.1) Điều khiển cấp nguồn cho cột dùng 74HC138


4.1.1) Chức năng của 74HC138

Sơ đồ chân của 74HC138 [4] :

Hình 4 - Sơ đồ chân 74HC138

IC 74HC138 là bộ giả mã 3 đầu vào ( A0,A1,A2) 8 đầu ra phủ định (Y0 đến
Y7 ). Nó có 3 đầu vào cho phép : 2 đầu vào tích cực thấp ( E1 , E 2 ) và một đầu vào
tích cực mức cao (E3). Tất cả các đầu ra của 74HC138 sẽ ở mức cao trừ khi E1 , E 2
ở mức thấp và E3 ở mức cao. Khi các đầu vào E1 , E 2 ở mức thấp và E3 ở mức cao
thì đầu ra của 74HC138 sẽ được quyết định bởi đầu vào .

47
Bảng 4 - Chức nămg hoạt động của 74HC138

Đầu vào Đầu ra


E1 E2 E3 A0 A1 A2 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
H X X X X X H H H H H H H H
X H X X X X H H H H H H H H
X X X X X X H H H H H H H H
L L H L L L L H H H H H H H
L L H L L H H L H H H H H H
L L H L H L H H L H H H H H
L L H L H H H H H L H H H H
L L H H L L H H H H L H H H
L L H H L H H H H H H L H H
L L H H H L H H H H H H L H
L L H H H H H H H H H H H L

4.1.2) Sử dụng 74HC138 để cấp nguồn cho các cột ma trận

Theo nguyên tắc quét ma trận led thì tại mỗi thời điểm ta chỉ cấp nguồn cho
một cột của ma trận do đó có thể dung 74HC138 để cấp nguồn cho các cột của ma
trận . Các đầu vào ( A0,A1,A2) của 74HC138 sẽ được nối với các chân của vi điều
khiển, các đầu ra của 74HC138 được nối với các cột của ma trận led thông qua một
cổng phủ định ( hoặc các bộ đệm dòng cấp nguồn cho cột ), còn các chân E1 , E 2
được nối đất, E3 nối dương nguồn .Thông qua việc gửi tín hiệu từ vi điều khiển tới
các chân đầu vào của 74HC138 ta có thể chọn được cột cần cấp nguồn .

48
Hình 4 - Ghép nối 74HC138 với vi diều khiển dể cấp nguồn cho cột của ma trận

Khi mở rộng ma trận ta tăng thêm số lượng IC để cấp nguồn cho tất cả các
cột, các IC này có thể cùng nối chung hoặc riêng chân điều khiển. Hoặc chỉ sử dụng
một IC nhưng cấp nguồn đồng thời cho tất cả các ma trận, khi đó một chân của IC
sẽ được nối với các cột của các ma trận khác nhau .

49
4.2) Điều khiển cấp nguồn cho hàng dùng 74HC595

4.2.1) Chức năng của 74HC595

74HC595 [5] là bộ ghi dịch 8 bít gồm có :


1 đầu vào cho phép ( OE )
1 đầu vào chọn thanh ghi dịch ( MR )
1 đầu vào dữ liệu nối tiếp (DS)
1 đầu vào cấp xung cho thanh ghi dịch (SH_CP)
1 đầu vào cấp xung cho thanh ghi chứa (ST_CP)
8 đầu ra 3 trạng thái ( Q1 đến Q7 và Q7’)

Hình 4 - Sơ đồ chân 74HC595

50
Bảng 4 - Chức năng hoạt động của 74HC595

Đầu vào Đầu ra Chức năng


SH_CP ST_CP OE MR DS Q7’ Qn
MR mức thấp dữ liệu chỉ dịch
X X L L X L kđ trong thanh ghi dịch đầu ra
không đổi trạng thái
X ↑ L L X L L Xóa thanh ghi dich nạp dữ liệu
vào thanh ghi chứa
X X H L X L Z Xóa thanh ghi dịch đầu ra ở
trạng thái trở kháng cao
Dịch chuyển trạng thái cao vào
thanh ghi dịch, giá trị trước đó

↑ X L H H Q6’ kđ của bít thứ 6 trong thanh ghi


dịch được chuyển sang đầu ra
Q7’
Nội dụng của thanh ghi dịch
X ↑ L H X kđ Qn’ được chuyển sang thanh ghi
chứa và chuyển sang đầu ra
Dịch chuyển nội dung của
thanh ghi dịch đồng thời nội

↑ ↑ L H X Q6’ Qn’ dung của thanh ghi dịch cũ


được chuyển vào thanh ghi
chứa và các đầu ra song song

4.2.2) Sử dụng 74HC595để cấp nguồn cho các hàng của ma trận
Khi dùng 74HC595 để cấp nguồn cho ma trận led ta nối các đầu ra song song
của 74HC595 với các chân cấp nguồn cho hàng của ma trận. Đồng thời phải sử

51
dụng 3 chân của vi điều khiển để nối với các chân DS,SH_CP,ST_CP của
74HC595. Các bit dữ liệu mã hóa mức logic cần cấp cho các hàng của 1 cột ma trận
sẽ được truyền liên tiếp DS của 74HC595. Để đồng bộ bit thì vi điều khiển mỗi khi
xuất 1 bit tới chân DS sẽ phát một xung có sườn dương vào chân SH_CP. Sau khi
truyền xong hết dữ liệu, để các led trên cột sáng thì ta phải chuyển dữ liệu trong
thanh ghi dịch vào các đầu ra của 74HC595 bằng cách cấp 1 xung sườn dương vào
chân ST_TP. Chú ý để IC có thể hoạt động và đẩy dữ liệu ra các chân đầu ra thì
chân OE phải nối đất, chân MR nối dương nguồn.

Hình 4 - Ghép nối 74HC595 với vi điều khiển để cấp nguồn cho hàng của ma
trận

Khi mở rộng ma trận led ta ghép nhiều 74HC595 nối tiếp nhau: các chân
SH_CP được nối chung với 1 nguồn cấp xung, các chân ST_CP cũng được nối
chung với nhau, đầu ra Q7’ của IC phía trước được nối với đầu vào DS của IC tiếp
theo. Khi đó dữ liệu sẽ được dịch đồng bộ từ IC này sang IC khác và đầu ra của các
IC cũng được chốt đồng bộ.

52
Hình 4 - Ghép nối tiếp các IC 74HC595

53
4.3) Truyền dữ liệu cấp nguồn cho hàng sử dụng SPI

4.3.1) Atmega16 SPI


Để truyền dữ liệu từ vi điều khiển vào bộ ghi dịch ta có thể dùng một đoạn
chương trình phần mềm lập trình cho vi điều khiển truyền từng bit của dữ liệu. Tuy
nhiên Atmega16 có phần cứng hỗ trợ việc truyền dữ liệu nối tiếp với các thiết bị
ngoại vi (SPI).
a) Sơ đồ khối và các chế độ SPI [3] :

Hình 4 - Sơ đồ khối của SPI

Ta có thể thiết lập SPI ở 2 chế độ Master và Slave :

Ở chế độ Slave, chân Slave Select ( SS ) phải đặt là đầu vào .Khi chân này bị
kéo xuống mức thấp thì SPI sẽ hoạt động, chân MISO có thể đặt làm đầu ra, các
chân khác là đầu vào. Khi chân SS được kéo lên mức cao ở mức cao SPI ngừng
nhận dữ liệu từ bên ngoài vào. Chân SS có tác dụng đồng bộ byte, gói giúp cho bộ

54
đếm bit của slave đồng bộ với bộ phát xung của master. Khi SS bị kéo lên mức cao
thì SPI slave sẽ tái lập lại mức logic truyền và nhận, đồng thời xóa dữ liệu đã nhận
trong thanh ghi dịch.
Ở chế độ Master, ta có thể đặt SS làm đầu ra hay vào tùy ý :
Nếu SS được đặt làm đầu ra thì nó không làm ảnh hưởng tói SPI , nó chỉ có tác
dụng điều khiển mức logic cho chân SS của SPI slave.
Nếu SS được đặt làm đầu vào thì nó phải được giữ ở mức cao để đảm bảo các
hoạt động của SPI master. Nếu SPI bị kéo xuống mức thấp bởi thiết bị ngoại vi thì
nó sẽ hiểu đó là một Master khác nên sẽ đặt lại SPI ở chế độ Slave và bắt đầu truyền
dữ liệu. Để tránh xung đột trong quá trình này SPI tiến hành các thủ tục sau:
- Xóa bit MSTR trong thanh ghi SPCR để SPI ở chế độ Slave. Do đó các chân
MOSI và SCK trở thành đầu vào.
- Thiết lập mức cao cho cờ SPIF trong thanh ghi SPCR. Nếu ngắt SPI và ngắt
toàn cục được cho phép thì quá trình ngắt sẽ được thực hiện.

b) Các thanh ghi SPI:


* Thanh ghi diều khiển - SPCR :
Bit 7 6 5 4 3 2 1 0

SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0

Read/Write R/W R/W R/W R/W R/W R/W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

Bit 7 - SPIE : SPI Interupt Enable


Ngắt SPI sẽ được thực hiện nếu cờ SPIF trong SPSR được thiết lập và ngắt
toàn cục được cho phép.
Bit 6 - SPE : SPI Enable
Bit này phải được đặt ở mức cao để SPI có thể hoạt động
Bit 5 - DORD : Data Order
Khi DORD ở mức cao thì bit LSB được truyền trước
Khi DORD ở mức thấp thì bit MSB được truyền trước

55
Bit 4 - MSTR : Master/Slave Select
Bit có tác dụng chọn chế độ cho SPI : Master nếu ở mức cao, Slave nếu ở mức
thấp. Nếu chân SS được đặt làm đầu vào thì khi chân này bị kéo xuống mức thấp thì
MSTR sẽ bị xóa và SPIF được thiết lập mức cao. Do dó người dùng sẽ phải đặt
MSTR trở lại mức cao nếu muốn tiếp tục sử dụng chế độ Master.
Bit 3 – CPOL :Clock Polarity:
Khi bit này được ghi 1 thì SCK ở mức cao khi rỗi, ngược lại thì SCK ở mức
thấp khi rỗi.

Bảng 4 - Chức năng của bit CPOL

CPOL Leading Edge Trailing Edge


0 Rising Failing
1 Failing Rising

Bit 2 – CPHA : Clock Phase


Xác định việc lấy mẫu dữ liệu trên sườn trước hay sau của SCK :

Bảng 4 - Chức năng của bit CPHA

CPHA Leading Edge Trailing Edge


0 Sample Setup
1 Setup Sample

Bit1,0 – SPR1,SPR0 :SPI Clock Rate Select 1 and 0


Điều khiển tốc độ của SCK ở chế độ Master . Quan hệ giữa SCK
và tần số giao động (fosc) được thể hiện như sau:

Bảng 4 - Quan hệ giữa tần số SCK và tần số giao động

56
SPI2X SPR1 SPR0 Tần số SCK
0 0 0 fosc/4
0 0 1 fosc/16
0 1 0 fosc/64
0 1 1 fosc/128
1 0 0 fosc/2
1 0 1 fosc/8
1 1 0 fosc/32
1 1 1 fosc/64

* Thanh ghi trạng thái – SPSR :

Bit 7 6 5 4 3 2 1 0

SPIF WCOL - - - - - SPI2X

Read/Write R R R R R R R R/W
Khởi tạo 0 0 0 0 0 0 0 0

Bit 7 – SPIF: SPI Interrupt Flag


Sau khi kết thúc việc dữ liệu, cờ SPIF được thiết lập. Ngắt sẽ xảy ra nếu ngắt SPI
và ngắt toàn cục được cho phép.
Bit 6 – WCOL: Write COLision flag
Được thiết lập nếu SPDR được ghi dữ liệu khi đang truyền dữ liệu. Sẽ được xóa
sau khi thanh ghi trạng thái được kiểm tra.
Bit 5..1 : Không được dùng trong Atmega16
Bit 0: SPI2X: Double SPI Speed Bit
Sử dụng kèm với SPR1, SPR0 để xác định tần số của SCK

* Thanh ghi dữ liệu – SPDR :


Bit 7 6 5 4 3 2 1 0

MSB LSB
57
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Khởi tạo X X X X X X X X

Chứa dữ liệu cần truyền và nhận .

4.3.2) Thiết lập SPI truyền dữ liệu cho 74HC595


Để kết nối SPI giữa Atmega16 và 74HC595 ta cần nối chân SCK của vi điều
khiển với chân SH_CP của 74HC595, nối chân MOSI của vi điều khiển với chân
DS của 74HC595. Ngoài ra còn phải dùng 1 chân của vi điều khiển nối với chân
ST_CP của 74HC595 để chốt dữ liệu tại đầu ra của 74HC595.

Hình 4 - Ghép nối vi điều khiển với 74HC595 sử dụng SPI

Do việc giao tiếp giữa vi điều khiển và 74HC595 chỉ là quá trình truyền dữ
liệu từ vi điều khiển đến 74HC595 nên ta có thể thiết lập cho SPI ở chế độ master
với cách sắp xếp dữ liệu theo trật tự bit có trọng số cao thì mã hóa cho hàng ở trên
và các đầu ra của 74HC595 cũng được nối với các chân của ma trận led theo trật tự
trên thì ta đặt bit DORD=0 .
Các giá trị cần nạp cho thanh ghi :

58
SPCR=0x50
SPSR=0x00
Sau đó trong chương trình mỗi khi muốn gửi 1 byte nào đó ra ta có thể dùng
lệnh trong CodeVisionAVR :
spi(byte) ;
Lệnh này cho phép gửi 1 byte từ vi điều khiển qua chân MOSI tới thiết bị
ngoại vi.Sau đó nếu muốn chốt dữ liệu ta cần phải sử dụng 1 thủ tục để gửi 1 sườn
dương tới chân ST_CP của 74HC595 thông :
void latchdata( ) {
PORTB.3=0;
PORTB.3=1;
}

4.3) Kết luận

Khi cấp nguồn cho ma trận tùy theo kích thước của ma trận mà ta có thể sử
dụng nhiều phương pháp khác nhau. Với các ma trận đủ nhỏ ta có thể sử dụng các
chân của vi điều khiển để trực tiếp điều khiển việc cấp nguồn cho ma trận. Với ma
trận lớn thì cần phải dùng các IC hỗ trợ cho việc điều khiển cấp nguồn cho ma trận.
Khi cấp nguồn cho ma trận theo từng cột thì ta có thể sử dụng các IC có tác dụng
chọn kênh để cấp nguồn cho ma trận, tại mỗi thời điểm mỗi IC này chỉ cấp nguồn
cho 1 cột của ma trận . Đối với các hàng trong cột thì ta có thể dùng các bộ ghi dịch
để cấp nguồn. Khi cấp nguồn thì ta cần chú ý việc cấp phát dữ liệu của các hàng
phải tương ứng với cột được cấp nguồn.

59
Chương5: Tạo tần số quét cho ma trận
Để đảm bảo cho hình ảnh hiển thị rõ nét thì ta cần phải điều chỉnh tần số hiển
thị cho phù hợp . Tần số hiển thị càng cao thì hình ảnh càng rõ nét . Dùng bộ định
thời của vi điều khiển giúp ta có thể điều khiển tần số hiển thị của ma trận led. Mỗi
khi ngắt định thời được thực hiện thì ta sẽ cho một cột của ma trận sáng . Qua đó ta
có thể tính được tần số hiển thị của ma trận bằng 1/8 tần số ngắt. Chương sẽ giới
thiệu về một số chế độ của Timer1 và các thanh ghi dùng để thiết lập chế độ , sau đó
sẽ trình bày về cách thiết lập thanh ghi dùng cho việc điều khiển tần số quét led ma
trận.

5.1) Timer1 Atmega16

5.1.1) Một số chế độ hoạt động


Trước tiên ta cần chú ý các định nghĩa sau:
• BOTTOM : Counter tới BOTTOM khi nó có dạng 0x0000.
• MAX : Counter tới MAX khi nó có dạng 0xFFFF.
• TOP : khi Counter tới TOP khi giá trị của nó bằng giá trị cao
nhất trong hàng đếm. Giá trị TOP có thể được gán là 1 trong các giá
trị cố định khác sau : 0x00FF, 0x01FF, 0x03FF hoặc là giá trị lưu
trong OCR1A hoặc thanh ghi ICR1. Việc gán giá trị TOP phụ thuộc
vào chế độ hoạt động.

a) Chế độ thông thường :


Chế độ hoạt động đơn giản nhất của Timer là chế độ thường (WGM13:0 =
0). Trong chế độ này bộ đếm luôn đếm lên và không được xóa. Bộ đếm tràn khi
đếm qua giá trị max (MAX= 0xFFF) và trở lại BOTTOM (0x0000). Trong chế độ
này Timer/Counter Overflow Flag (TOV1) sẽ được thiết lập ngay khi TCNT1 trở về
0. Trong trường hợp này cờ TOV1 hoạt dộng như bit thứ 17 của bộ đếm nên nó
không tự xóa. Tuy nhiên khi kết hợp với ngắt tràn Timer cờ này có thể tự động xóa,
độ phân giải của Timer có thể tăng lên bởi phần mềm.

60
Khối bắt tín hiệu đầu vào khá dễ sử dụng ở chế độ thường nhưng cần phải
chú ý tới khoảng thời gian lớn nhất giữa các sự kiện ngoài, khoảng thời gian này
phải không vượt quá độ phân giải của bộ đếm. Nếu khoảng thời gian giữa các sự
kiện quá dài ta có thể dùng ngắt tràn hay tăng độ rộng xung đếm để có thể mở rộng
độ phân giải cho khối này .
b) Chế độ CTC ( clear timer on compare) :
Trong chế độ CTC (WGM13:0 = 4 hoặc 12), thanh ghi ICR1 hoặc OCR1A
được sử dụng tạo độ phân giải cho bộ đếm. Trong chế độ CTC bộ đếm bị xóa về 0
khi giá trị bộ đếm (TCTN1) trùng với giá trị của thanh ghi OCR1A (WGM13:0 = 4)
hoặc ICR1 (WGM13:0 = 12). Thanh ghi OCR1A hoặc ICR1 định nghĩa giá trị đỉnh
cho bộ đếm.

Hình 5 - Giản đồ thời gian chế độ CTC

Một ngắt có thể phát ra khi giá trị bộ đếm đạt tới giá trị TOP bởi cùng sử
dụng cờ OCF1A hoặc ICF1. Nếu ngắt được cho phép, thủ tục điều khiển ngắt có thể
được sử dụng để cập nhập lại giá trị TOP. Thay đổi TOP bằng giá trị gần với
BOTTOM khi bộ đếm đang chạy với độ rộng xung lớn phải thực hiện cẩn thận .
Nếu giá trị mới ghi cho OCR1A hoặc ICR1 thấp hơn so với giá trị của TCNT, bộ
đếm sẽ không bắt được thời điểm đạt giá trị TOP. Do đó nó sẽ đếm tới giá trị MAX
(0xFFF) rồi quay về 0x0000 trước khi có thể có thể gặp đượcgiá trị TOP. Để có thể
tạo sóng đầu ra trong chế độ CTC, đầu ra OC1A có thể lật mức logic của nó mỗi khi
bắt gặp giá trị top bằng cách thiết lập các bit chọn chế độ so sánh đầu ra COM1A1:0

61
= 01. Giá trị của chân OC1A sẽ không được cập nhật nếu ta không thiết lập nó là
đầu ra (DDR_OC1A=1). Sóng phát ra từ chân OCA1 sẽ có tần số cực đại của fOC1 A

= f clk _ I /O khi OCR1A được lập về 0x0000. Tần số của sóng được tính như sau:
Công thức 5 - Quan hệ giữa tần số đầu ra với tần số timer ở chế dộ CTC
f clk _ I / O
f OCnA =
2.N .(1 + OCRnA)
N thể hiện độ chia tần ,có thể là các giá trị sau : 1, 8, 64, 256, 1024

c) Chế độ fast PWM :


Fast Pulse Width Modulation hoặc chế độ fast PWM ( WGM13:0 =
5,6,7,14,15) có chức năng tạo ra nhiều dạng sóng tần số cao. Fast PWM khác với
chức năng PWM bởi nó chế độ hoạt động sườn đơn. Bộ đếm đếm từ BOTTOM tới
TOP sau đó lập tức quay về BOTTOM. Trong chế độ so sánh không đảo đầu ra thì
đầu ra OC1x được thiết lập khi TCNT1 và OCR1x bằng nhau, và xóa khi đạt giá trị
TOP. Trong chế độ so sánh đảo đầu ra thì chân OC1x được xóa khi ICNT1 và
OCR1x bằng nhau, và được thiết lập khi đạt giá trị TOP. Do chỉ dùng sườn đơn nên
tần số hoạt động của fast PWM cao gấp 2 lần so với các chế độ Phase correct và
Phase and Frequency corect PWM ( các chế độ này khi hoạt động dùng 2 sườn).
Tần số cao làm chế độ fast PWM phù hợp với điều chỉnh công suất, chỉnh lưu và
ứng dụng DAC. Độ phân giải cho fast PWM có thể cố định 8, 9 hoặc 10 bit, hoặc
định nghĩa bởi ICR1 hoặc OCR1A. Độ phân giải nhỏ nhất cho phép là 2 bit (ICR1,
OCR1A lập lên 0x0003), lớn nhất là 16 bit (ICR1 hoặc OCR1A khi được gán giá
trị MAX). Độ phân giải PWM trong các bit có thể tính theo hàm :

Công thức 5 - Độ phân giải PWM

log(TOP + 1)
RFPWM =
log(2)

62
Hình 5 - Giản đồ thời gian chế độ Fast PWM

Cờ tràn Timer/Counter (TOV1) được lập mỗi khi Counter tới giá trị TOP.
Ngoài ra chân OC1A hoặc ICF1 được thiết lập trong cùng một chu kỳ xung với thời
điểm TOV1 được thiết lập. Nếu ngắt được cho phép, thủ tục điều khiển ngắt có thể
được sử dụng để cập nhập lại TOP và các giá trị so sánh. Khi thay đổi các giá trị
TOP ta phải chắc chắn giá trị TOP mới lớn hơn hoặc bằng giá trị của tất cả các
thanh ghi so sánh nếu không sẽ không có sự gặp nhau giữa TCNT1 và OCR1x .
Thủ tục cập để nhập lại ICR1 khác với 0CR1A khi sử dụng để định nghĩa giá
trị TOP. Thanh ghi ICR1 không có 2 bộ đệm. Nếu ICR1 thay đổi tới 1 giá trị thấp
hơn TCNT1 khi bộ đếm đang chạy thì nó sẽ đếm tớ giá trị MAX (0xFFFF) và quay
lại giá trị 0x0000 . OCR1A có bộ đẹm kép nên có thể ghi lên nó bất kỳ lúc nào. Khi
OCR1A I/O được ghi, giá trị ghi sẽ được đưa vào trong thanh ghi đệm OCR1A.
Thanh ghi so sánh OCR1A sẽ cập nhập lại ghía trị trong thanh ghi đệm tại chu kỳ
sau khi TCNT1 đạt giá trị TOP.
Trong chế độ fast PWM, khối so sánh cho phép tạo ra 1 dạng sóng tại chân
OC1x. Thiết lập các bit COM1x1:0 tới 2 có thể tạo ra một dạng PWM không đảo và
một PWM đảo bằng cách thiết lập COM1x1:0 lên 3. Giá trị tại chân OC1x chỉ quan
sát được nếu chân này được thiết lập là đầu ra (DDR_OC1x). Dạng sóng PWM
được sinh ra khi thiết lập (xóa) chân OC1x tại thời điểm OCR1x = TCNT1 và xóa
(thiết lập) OC1x tại thời điểm bộ đếm bị xóa ( từ TOP về BOTTOM).
63
Tần số PWM tại đầu ra có thể được tính theo hàm:

Công thức 5 - Quan hệ giữa tần số đầu ra với tần số timer ở chế độ Fast PWM

log(TOP + 1)
fOCnxPWM =
log(2)

N thể hiện độ chia tần ,có thể là các giá trị sau : 1, 8, 64, 256, 1024
d) Chế độ Phase Correct PWM
Chế độ này hoạt động dựa trên hai sườn lên xuống.Bộ đếm sẽ đếm liên tục từ
giá trị BOTTOM đến giá trị MAX và sau đó từ giá trị MAX đến giá trị
BOTTOM.Trong chế độ so sánh không đảo chân so sánh (OCx) sẽ bị xóa khi giá trị
TCNTx bằng giá trị OCRx trong quá trình đếm lên và sẽ được thiết lập bằng 1 khi
giá trị so sánh xuất hiện trong quá trình đếm xuống.Chế độ so sánh đảo thì các giá
trị là ngược lại.Với hoạt động hai sườn xung này thì chế độ này không tạo ra được
tần số nhỏ như chế độ một sườn xung. Nhưng do tính cân đối của hai sườn xung thì
nó tốt hơn cho điều khiển động cơ .
Chế độ phase correct PWM hoạt động cố định là 8 bít.Trong chế độ này bộ
đếm sẽ tăng cho đến khi đạt giá trị MAX, khi đó nó sẽ đổi chiều đếm. Biểu đồ thời
gian sau đây mô tả hoạt động của hoạt động quá trình:

Hình 5 - Giản đồ thời gian chế độ Phase Corect PWM


64
Từ biểu đồ thời gian ta nhận thấy việc thay đổi tần số trong hoạt động của
phase correct PWM có thể thay thế bằng hai giá trị là MAX và BOTTOM. Nó linh
hoạt hơn so với chế độ Fast PWM.

5.1.2) Các thanh ghi


1.TCCR1A:

Bit 7 6 5 4 3 2 1 0

COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10

Read/Write R/W R/W R/W R/W W W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

Bit7,6 COM1A1,2 : chọn chế độ đầu ra cho kênh A


Bit5,4 COM1B1,2 : chọn chế độ đầu ra cho kênh B
Nếu cả 2 bit đều được ghi 0 thì các chân OC1A và OC1B coi như không
được kết nối với bộ dịnh thời và hoạt động như các chân bình thường khác của vi
điều khiển. Khi có ít nhất 1 trong 2 bit được ghi mức cao thì các chân này sẽ được
điều khiển bởi bô định thời tùy theo chế độ hoạt động được chọn:

Bảng 5 - Thiết lập chế độ đầu ra cho timer

COM1A1/ COM1A0/ Mô tả
COM1B1 COM1B0
0 0 Port hoạt động thông thường.Không kết nối
OC1A/OC1B.
0 1 Lật trạng thái OC1A/OC1B
1 0 Xóa OC1A/OC1B
1 1 Thiết lập OC1A/OC1B

65
Bit3,2 : cưỡng chế so sánh ở các chế độ không điều chế xung.
Bit1,0 : Được sử dụng kết hợp với các bít WGM12 và WGM13 để xác định chế độ
của bộ định thời :
Bảng 5 - Các chế độ điều chế xung

Chế WGM13 WGM12 WGM11 WGM10 Chế độ hoạt động của timer TOP Cập nhật Thiết lập

độ OCR1X cờ TOV1

0 0 0 0 0 Thường 0xFFFF Lập tức MAX

1 0 0 0 1 PWM, Phase Correct, 8-bit 0x00FF TOP BOTTOM

2 0 0 1 0 PWM, Phase Correct, 9-bit 0x01FF TOP BOTTOM

3 0 0 1 1 PWM, Phase Correct, 10-bit 0x03FF TOP BOTTOM

4 0 1 0 0 CTC OCR1A Lập tức MAX

5 0 1 0 1 Fast PWM, 8-bit 0x00FF TOP TOP

6 0 1 1 0 Fast PWM, 9-bit 0x01FF TOP TOP

7 0 1 1 1 Fast PWM, 10-bit 0x03FF TOP TOP

8 1 0 0 0 PWM, Phase and Frequency Correct ICR1 BOTTOM BOTTOM

9 1 0 0 1 PWM, Phase and Frequency Correct OCR1A BOTTOM BOTTOM

10 1 0 1 0 PWM, Phase Correct ICR1 TOP BOTTOM

11 1 0 1 1 PWM, Phase Correct OCR1A TOP BOTTOM

12 1 1 0 0 CTC ICR1 Lập tức MAX

13 1 1 0 1 Reserved - - -
14 1 1 1 0 Fast PWM ICR1 TOP TOP

15 1 1 1 1 Fast PWM OCR1A TOP TOP

2.TCCR1B:
Bit 7 6 5 4 3 2 1 0

ICNC11 ICES1 - WGM13 WGM12 CS12 CS11 CS10

Read/Write R/W R/W R R/W R/W R/W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

66
Bit 7 ICNC1: Khi bit này được ghi1 thì các tín hiệu vào từ chân ICP1 sẽ được lọc
nhiễu. Bộ lọc nhiễu cần 4 lần lấy mẫu liên tiếp có giá trị bằng nhau ở chân ICP1. Do
đó tín hiệu vào bị trễ 4 chu kỳ giao động so với khi không lọc nhiễu.

Bit 6 ICES1 : Bit này lựa chọn sườn kích hoạt sự kiện tại chân ICP1. Khi bit này
được ghi 0 thì sườn âm được sử dụng để kích hoạt Khi bit này được ghi 1 thì sườn
dương được sử dụng.

Bit 5 : không dùng trong Atmega16

Bit 4,3 WGM13,2 : Cùng với WGM11,0 để để xác định chế độ của bộ định thời

Bit 2,1,0 CS12,1,0 : Dùng để lựa chọn tần số cho Timer


Bảng 5 - Lựa chọn tần số cho bộ đếm

CS12 CS11 CS10 Mô tả


0 0 0 Timer không hoạt động
0 0 1 clk I/O /1 ( không chia tần )
0 1 0 clk I/O /8 ( từ bộ chia tần )
0 1 1 clk I/O /64 ( từ bộ chia tần )
1 0 0 clk I/O /256 ( từ bộ chia tần )
1 0 1 clk I/O /1024( từ bộ chia tần )
1 1 0 Nguồn ngoài từ chân T1 , sườn lên
1 1 1 Nguồn ngoài từ chân T1 , sườn xuống

3.TCNT1H/L:
Bit 7 6 5 4 3 2 1 0

TCNT1[15:8]
TCNT1[7:0]

Read/Write R/W R/W R/W R/W R/W R/W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

67
Lưu giá trị của bộ đếm. Có khả năng truy nhập trực tiếp để ghi và đọc thông
qua việc sử dụng thanh ghi tạm thời. Việc thay đổi thanh ghi này trong khi bộ đếm
đang hoạt động có thể bỏ qua một lần gặp nhau giữa TCNT1 và các thanh ghi
OCR1x .

4.OCR1AH/L:
Bit 7 6 5 4 3 2 1 0

OCR1A[15:8]
OCR1A[7:0]

Read/Write R/W R/W R/W R/W R/W R/W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

5.OCR1BH/L:
Bit 7 6 5 4 3 2 1 0

OCR1B[15:8]
OCR1B[7:0]

Read/Write R/W R/W R/W R/W R/W R/W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

Các thanh ghi OCR1x được liên tục so sánh với thanh ghi TCNT1 . Mỗi khi bằng
nhau có thể tạo ra 1 ngắt so sánh đầu ra hay để thay đổi dạng sóng tại các chân đầu
ra OC1x .

6.TIMSK:
Bit 7 6 5 4 3 2 1 0

OCIE2 TOIE2 TICE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0

68
Read/Write R/W R/W R R/W R/W R/W R/W R/W
Khởi tạo 0 0 0 0 0 0 0 0

Các bit 7,6,1,0 dùng cho các timer khác của Atmega16.
Bit 5 - TICIE1 : Khi bit này được thiết lập thành 1 và ngắt toàn cục (global
interrupt) được cho phép thì ngắt bộ đếm đầu vào Timer/couter1 (Timer/Counter1
Input Capture interrupt) được cho phép. Vector ngắt tương ứng sẽ được thực thi khi
cờ ICF1 trong thanh ghi TIFR được thiết lập.

Bit4 - OCIE1A : Khi bit này được thiết lập thành 1 và ngắt toàn cục (global
interrupt) được cho phép thì ngắt so sánh đầu ra 1A (Timer/Counter1 Output
Compare A Match Interrupt) được cho phép. Vector ngắt tương ứng sẽ được thực
hiện khi cờ OCF1A trong thanh ghi TIFR được thiết lập.

Bit3 - OCIE1B : Khi bit này được set thành 1 và ngắt toàn cục (global interrupt)
được cho phép thì ngắt so sánh đầu ra 1B (Timer/Counter1 Output Compare B
Match Interrupt) được cho phép. Vector ngắt tương ứng sẽ được thực thi khi cờ
OCF1B trong thanh ghi TIFR được thiết lập .

Bit2 – TOIE1 : Khi bit này đượcset thành 1 và ngắt toàn cục (global interrupt) được
cho phép thì ngắt cờ tràn bộ định thời 1 (Timer/Counter1 overflow interrupt) được
cho phép. Vector ngắt tương ứng sẽ được thực thi khi cờ TOV1 trong thanh ghi
TIFR được thiết lập .

7.TIFR:
Bit 7 6 5 4 3 2 1 0

OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOF0

Read/Write R/W R/W R R/W R/W R/W R/W R/W


Khởi tạo 0 0 0 0 0 0 0 0

69
Các bit 7,6,1,0 dùng cho các timer khác của Atmega16.

Bit5 - ICF1 : Cờ này được thiết lập khi xảy ra sự kiện tại ngõ vào (Input Capture)
của chân ICP1. Khi thanh ghi ICR1 (InputCapture Register) được thiết lập bởi các
bit WGMn3:0 để sử dụng như một giá trị đỉnh thìcờ ICF1 sẽ được thiết lập khi bộ
đếm đạt tới giá trị đỉnh. Cờ ICF1 sẽ tự động xóa khi ngắt tương ứng được thực thi,
hoặc có thể xóa hay thiết lập bằng cách ghi một giá trị logic vào vị trí của nó.

Bit4 - OCF1A : Cờ này được thiết lập ngay sau khi giá trị bộ đếm (TCNT1) bằng
với giá trị thanh ghi OCR1A (Output Compare Register A). Chú ý là một so sánh
cưỡng bức (FOC1A) sẽ không thiết lập cờ này. Cờ OCF1A sẽ tự động xóa khi ngắt
tương ứng được thực thi, hoặc có thể xóa hay thiết lập bằng cách ghi một giá trị
logic vào vị trí của nó.

Bit 3 - OCF1B : Cờ này được thiết lập ngay sau khi giá trị bộ đếm (TCNT1) bằng
với giá trị thanh ghi OCR1B (Output Compare Register B). Chú ý là một so sánh
cưỡng bức (FOC1B) sẽ không thiết lập cờ này. Cờ OCF1B sẽ tự động xóa khi ngắt
tương ứng được thực thi, hoặc có thể xóa hay thiết lập bằng cách ghi một giá trị
logic vào vị trí của nó.

Bit 2 - TOV1 : Việc thiết lập cờ này phụ thuộc vào thiết lập của các bit WGMn3:0,
trong chế độ bình thường và CTC cờ TOV1 được thiết lập khi bộ định thời tràn.

5.2) Tạo tần số quét ma trận


Để đảm bảo mắt người có thể cảm nhận được hình ảnh dễ dàng không bị
rung thì ta cần tạo tần số quét khoảng 60Hz .
Do ma trận led có 8 cột sáng luân phiên nên số lần cấp nguồn cho led là :
60 x 8= 480 lần/s .
Khi đó khoảng cách giữa 2 lần cấp nguồn liên tiếp khoảng :
1000:480= 2,083 ms

70
Tần số của thạch anh là 11.0592MHz do đó số chu kì dao động trong
khoảng thời gian trên là :
11.0592 x 2083= 23040lần
Đây cũng là số chu kì mà timer phải đếm để cấp nguồn cho led các cột của ma trận.
Để đơn giản trong việc điều khiển cấp nguồn cho led ma trận ta dùng ngắt
Timer1 chế độ CTC ngắt khi bộ đếm đạt giá trị TOP=OCR1A . Do không cần lấy
sóng đầu ra nên ta có thể gán 0x10 cho thanh ghi TIMSK , gán 0x00 cho thanh ghi
TCCR1A , gán 0x0M cho TCCR1B với M là một trong các giá trị sau :9,A,B,C,D.
Do đó khi dùng ngắt chế độ CTC thì ta cần nạp giá trị 23115 cho thanh ghi
OCR1A nếu không chia tần số dao động ( các bit CS12:0 của TCCR1B dược gán
001). Với các độ chia tần khác của Timer ta có thể nạp các giá trị sau:

Bảng 5 - Tạo tốc độ quét 60 Hz cho ma trận

CS12 CS11 CS10 OCR1A TCCR1B


0 0 1 23040 0x09
0 1 0 2880 0x0A
0 1 1 360 0x0B
1 0 0 90 0x0C
1 0 1 22 0x0D

Để thay đổi tốc độc quét cho ma trận ta có thể thay đổi các giá trị của các
thanh ghi OCR1A và TCCR1B ( các bit CS12,11,10 của TCCR1B) .

5.3) Kết luận


Tốc độ quét ma trận ảnh hưởng hình ảnh quan sát được trên ma trận. Do đó
việc tạo tốc độ quét hợp lý có vai trò quan trọng trong việc điều khiển hiển thị led
ma trận. Dùng bộ định thời là phương pháp đơn giản nhất để điều khiển tốc độ quét
một cách chính xác. Việc thiết lập các thông số cho bộ định thời một cách linh hoạt
sẽ giúp ta dễ dàng hơn trong việc điều khiển tốc độ quét cho ma trận.

71
Chương 6: Hiệu ứng hiển thị bảng led
Để tạo các hiệu ứng thì ta phải quét ma trận led sao cho hình ảnh hiển thị
trên ma trận đạt được như mong muốn. Do đó ta chỉ cần điều khiển việc đưa dữ
liệu vào các chân của ma trận một cách hơp lý là có thể tạo ra được hiệu ứng mong
muốn . Để thực hiện điều này ta có thể dùng 2 mảng dữ liệu, 1 mảng để lưu dữ liệu
của hình ảnh ( chưa có hiệu ứng ), 1 mảng lưu dữ liệu của hình ảnh tức thời để đưa
ra hiển thị. Mảng thứ 2 được xây dựng bằng cách xử lí lại dữ liệu của mảng thứ
nhất. Nguyên tắc chung cho việc điều khiển led ma trận tạo hiệu ứng là sau khi 1
hình ảnh được hiển thị thì ta lấy mẫu cho hình ảnh tiếp theo rồi cho hiển thị hình
ảnh đó ( dữ liệu mã hóa các hình ảnh này được lưu ở mảng thứ 2 ).

6.1) Bảng led hiển thị


Trước khi xây dựng các hiệu ứng hiển thị ta cần xác định xem bảng led cần
điều khiển có kích thước như thế nào và phải xác định được bảng led được xây
dựng như thế nào. Khi hiểu rõ cách xây dựng bảng led ta mới có thể điều khiển cấp
nguồn cho bảng led. Trong đồ án này chúng em xây dựng một bảng led gồm 6 ma
trận led 8x8 hai màu ( xanh, đỏ) anot chung được bố tí thành hai hàng mỗi hàng 3
ma trận :

72
Hình 6 - Bảng led hiển thị
Các ma trận được xoay sao cho các anot của led được nối chung theo từng
cột. Mỗi cột có 8 led 2 màu, các catot của led xanh được nối với đầu ra của IC
74HC595 thứ nhất thông qua bộ dệm dòng ULN2803, còn các catot của led đỏ được
nối với IC 74HC595 thứ hai. Hai IC 74HC595 được mắc nối tiếp nhau, đầu ra nối
tiếp Q7’ của IC thứ nhất được nối với đầu vào của IC thứ 2. Đầu ra Q7’ của IC thứ
2 sẽ được nối với giắc cắm để mở rộng sang các led ma trận tiếp theo. Với cách bố
trí như trên, đế của ma trận led mỗi ma trận led sẽ có 8 chân đầu vào cấp nguồn
( cho từng cột ), 2 chân đầu vào cấp nguồn cho các IC, 3 chân đầu vào nối với
74HC595 ( DS, SH_CP, ST_CP), và 5 chân đầu ra để nối với các ma trận led khác
gồm 2 chân nguồn và 3 chân nối với 74HC595.
Với cách tổ chức ma trận như trên phải cấp nguồn cho ma trận led theo từng
cột. Dữ liệu cấp nguồn cho các hàng khi gửi nối tiếp thông qua SPI cần phải gửi
theo thứ tự: dữ liệu cho ma trận led phía sau được gửi ra trước và sau khi đã gửi hết
dữ liệu cho tất cả các ma trận thì mới chốt dữ liệu tại đầu ra của các IC 74HC595.
Mỗi ma trận cần dữ liệu của 2 màu, IC chứa dữ liệu màu xanh ở phía trước nên ta sẽ
phải truyền dữ liệu cho màu đỏ trước rồi mới đến màu xanh.
Các phần tiếp theo của chương này sẽ tình bày về cách tạo các hiệu ứng hiển
thị cho bảng led gồm 3 ma trận led có cấu tạo như trên. Tuy nhiên ta có thể sử dụng
các thuật toán này khi mở rộng ma trận với kích thước lớn hơn.

73
6.2) Dịch trái, phải
Với cách tổ chức dữ liệu mã hóa kí tự theo từng cột thì việc điều khiển hiển
thị cho các ký tự dịch trái , phải trên led ma trận là khá đơn giản .
Giả sử ta muốn hình ảnh dịch sang trái thì ta chỉ việc đưa dữ liệu của cột bên
phải của hình ảnh trước ra để hiển thị cho cột hiện tại của hình ảnh sau (cột 1 của
hình ảnh mới là cột 2 của hình ảnh cũ … ) .
Cụ thể với ma trận 8 hàng 24 cột ta có thể làm như sau :
- Dùng một mảng để lưu dữ liệu của toàn bộ hình ảnh khi không dịch
chuyển. Mảng này cần có kích thước 24 bytes ( lưu dữ liệu của 24 cột ).
- Dùng một mảng khác để lưu dữ liệu của các hình ảnh tức thời , hình ảnh
này có kích thước bằng với hình ảnh trên (24 bytes).
- Tại thời điểm đầu tiên thì hình ảnh tức thời sẽ lưu giá trị 0 cho tất cả các
cột ( ma trận tắt ). Tại thời điểm thứ 2 ta gán giá trị của cột 1 của mảng thứ nhất và
cột 24 của mảng thứ 2 . Tại thời điểm tiếp theo ta gán giá trị của cột 1,2 của mảng
thứ nhất vào cột 23,24 của mảng thứ 2... Cứ như thế khi lần lượt hiển thị và lấy mẫu
lại hình ảnh ta sẽ thấy hình ảnh trên ma trận led dịch từ trái sang phải.

74
Hình 6 - Mô phỏng hiệu ứng dịch trái

75
Bắt đầu

Nạp giá trị cho M 1

Gán các phần tử


M2 =0
Gán i=0

Hiển thị ma trận


Gán j=0

M2[23-j]=M1[j]
j=j+1

F
i<j

i=i+1

T F
i>23

Hình 6 - Lưu đồ thuật toán hiệu ứng dịch trái

Khi mở rộng kích thước của ma trận hay số lượng các ký tự làm vượt quá
kích thước của ma trận thì ta vẫn có thể sử dụng phương pháp trên nhưng với giá trị
giới hạn không phải là 23 mà là số cột của ma trận hay số cột cần để hiển thị hết
toàn bộ các ký tự.
76
Ngoài ra ta cũng có thể xếp 2 mảng thành một, mảng ở sau, mảng 2 ở trước
rồi cứ mỗi lần hiển thị ta là phép gán dịch trái các dữ liệu trong mảng M[i]=M[i+1],
bắt đầu với i=0, gán M[2n-1]=0 với n là số cột hiển thị. Dữ liệu đưa ra hiển thị là n
giá trị đầu của mảng.
Hiệu ứng dịch phải cũng tương tự như dịch trái nhưng phải thay phép gán
trong vòng lặp j thành M2[j]=M1[n-j]. Ta cũng có thể gom 2 mang làm một, mảng
1 ở trước mảng 2 ở sau, cứ mỗi lần hiển thị ta gán M[i] = M[i-1] nhưng bắt đầu với
i = 2n-1và gán M[0]=0 ; dữ liệu đưa ra hiển thị là n giá trị sau của mảng.

77
6.3) Dịch lên xuống
Với cách tổ chức dữ liệu mã hóa kí tự theo từng cột thì việc điều khiển hiển
thị cho các ký tự dịch lên xuống có thể thực hiện bằng cách dịch bit các dữ liệu mã
hóa hình ảnh của từng cột .
Cụ thể với ma trận 8 hàng 24 cột cho hình ảnh dịch lên ta có thể làm như
sau:
- Dùng một mảng để lưu dữ liệu của toàn bộ hình ảnh khi không dịch
chuyển. Mảng này cần có kích thước 24 bytes ( lưu dữ liệu của 24 cột ).
- Dùng một mảng khác để lưu dữ liệu của các hình ảnh tức thời , hình ảnh
này có kích thước bằng với hình ảnh trên (24 bytes).
- Tại thời điểm đầu tiên thì hình ảnh tức thời sẽ lưu giá trị 0 cho tất cả các
cột ( ma trận tắt ). Tại thời điểm thứ 2 ta cần gán bit mã hóa hàng trên cùng của
mảng 1 ( MSB ) vào hàng dưới cùng của mảng 2 ( LSB ). Do đó ta cần phải dịch
phải các bit trong từng byte dữ liệu của mảng 1 đi 7 bit rồi gán vào mảng 2. Tại thời
điểm tiếp theo ta dịch phải 6 bit . Cứ như vậy hình ảnh sẽ dịch dần lên. Tuy nhiên
nếu chi dịch như vậy thì thình ảnh chỉ dịch đến khi ra giữa ma trận. Để hình có thể
tiếp tục dịch lên thì ta phải dịch trái dữ liệu đi từ 1 bit cho đến 7 bit . Sau khi dịch
trái hết thì lại gán 0 cho tất cả các bit của ma trận .

Hình 6 - Mô phỏng hiệu ứng dịch lên

78
Bắt đầu

Nạp giá trị cho M1


Gán các phần tử
M2 =0

i=0

Hiển thị
J=0

M2[j]=M1[j]>>(8-i)
J=J+1

F
J>23

i=i+1

F
i>7

Hiển thị
J=0

M2[j]=M1[j]<<(i-8)
J=J+1
F
J>23

i=i+1

T F
i>15

Hình 6 - Lưu đồ thuật toán hiệu ứng dịch lên

79
Khi mở rộng ma trận chu trình gán giá trị hiển thị sẽ phứa tạp hơn do kích
thước dữ liệu cần gán cho một cột của ma trận tăng lên. Khi đó ta có thể chia dữ
liệu đem ra hiển thị thành nhiều mảng với mỗi mảng đại diện cho 1 “ dòng ” của ma
trận. Phần tử đầu tiên của mỗi mảng sẽ chứa dữ liệu cho cột đầu tiên của mỗi dòng.
Cứ mỗi lần dịch ta có thể gán Mt[i] = ( Mt[i]<<j ) | ( Md[i]>>(8-j) ). Với Mt là
dòng trên, Md là dòng dưới .
Hiệu ứng dịch xuống cũng tương tự như dịch lên nhưng khác ở chiều của
phép dịch bit và số lần dịch bit ta có thể thay chiều của phép dịch và số bit dịch đổi
từ (8-i) thành i .

80
6.4) Hiển thị từng kí tự
Với cách tổ chức dữ liệu mã hóa kí tự theo từng cột thì việc điều khiển cho
các ký tự lần lượt hiện trên bảng led có thể thực hiện bằng cách lấy mẫu lần lượt
thêm từng ý tự một .
Cụ thể với ma trận 8 hàng 24 cột cho hiển thị tưng ký tự một ta có thể làm như sau :
- Dùng một mảng để lưu dữ liệu của toàn bộ hình ảnh khi không dịch
chuyển. Mảng này cần có kích thước 24 bytes ( lưu dữ liệu của 24 cột ).
- Dùng một mảng khác để lưu dữ liệu của các hình ảnh tức thời, hình ảnh này
có kích thước bằng với hình ảnh trên (24 bytes).
- Tại thời điểm đầu tiên thì mảng lưu hình ảnh tức thời được gán 0 để tắt tất
cả các led. Sau đó tại các thời điểm tiếp theo ta lần lượt gán từng 6 bytes của mảng
1 vào mảng 2 để đưa ra hiển thị ( do cứ 6 bytes thì mã hóa 1 ký tự).

Hình 6 - Mô phỏng hiệu ứng hiển thị từng chữ

81
Bắt đầu

Nạp giá trị cho M1

Gán các phần tử


M2 =0
i=0

Hiển thị
j=0

M2[i*6+j]=M1[i*6+j]
j=j+1

F
j>5

i=i+1

T F
i>3

Hình 6 - Lưu đồ thuật toán hiệu ứng hiển thị tưng ký tự

82
6.5) Kết luận
Việc sử dụng 2 mảng dữ liệu một mảng lưu toàn bộ khung hình, một mảng
lưu hình ảnh tức thời sẽ giúp việc tạo các hiệu ứng đơn giản hơn. Xử lý các dữ liệu
trên mảng thứ nhất rồi lưu vào mảng thứ 2 để đưa ra hiển thị sẽ cần một lượng bộ
nhớ lớn khi số lượng ký tự và kích thước của font chữ tăng. Do đó khi tạo các hiệu
ứng và điều khiển hiển thị cần phải chú ý đến kích thước bộ nhớ. Nếu cần có thể
dùng thêm các bộ nhớ ngoài hoặc chọn các vi điều khiển có bộ nhớ đủ lớn để có thể
tạo hiệu ứng cần thiết. Các bảng điện tử thông dụng thường chỉ hiển thị một nội
dung cố định nên ta có thể sử dụng bộ nhớ flash (có kích thước khá lớn ) để lưu giá
trị của mảng thứ nhất, thậm chí có thể lưu toàn bộ các khung cần hiển thị. Khi đó ta
chỉ cần điều khiển việc xuất dữ liệu theo địa chỉ để hiển thị.
Đối với phương pháp cấp nguồn theo từng cột thì việc tạo các hiệu ứng dịch
trái, dịch phải khá đơn giản và việc mở rộng ma trận không ảnh hưởng nhiều đến
việc gán dữ liệu nhưng với các hiệu ứng dịch lên xuống khá phức tạp khi mở rộng
ma trận. Tuy nhiên nếu chỉ sử dụng một hiệu ứng cho ma trận thì với hiệu ứng dịch
lên, xuống ta có thể chọn phương pháp cấp nguồn theo từng hàng. Khi đó cần phải
xây dựng font chữ theo tưng hàng và phải xắp xếp lại các ma trận led ( xoay 90 độ
so với khi cấp nguồn theo cột ).

83
Kết luận
Module điều khiển hiển thị đã hoàn thành , và đạt được những kết quả
sau:
- Có khả năng điều khiển hiển thị 2 chuỗi ký tự trên hai hàng ma trận,
có khả năng điều khiển hiển thị ma trận có đọ rộng lớn hơn.
- Có khả năng hiển thị các dòng ký tự với ba màu xanh, đỏ và cam.
- Có khả năng điều khiển hiển thị các ký tự với một số hiệu ứng cơ
bản. Thuật toán điều khiển hiển thị hiệu ứng có thể sử dụng khi mở rộng ma trận và
có thể làm cơ sở để tạo các hiệu ứng phức tạp hơn.
- Có khả năng thay đổi tần số quét ma trận .
Tuy nhiên module vẫn còn một số giới hạn :
- Có thể hiển thị các ký tự trên hai dòng nhưng lại độc lập với nhau.
Do đó khi gặp phải một số yêu cầu về việc hiển thị 2 dòng chữ có độ tương quan
nhất định thì cần phải thay đổi về việc điều khiển xuất dữ liệu.
- Tuy có thể thay đổi màu của dòng chữ hiển thị nhưng lại chưa điều
khiển được màu sắc của từng ký tự. Vấn đề này có thể dễ dàng khắc phục khi hiển
thị các ký tự tĩnh, nhưng khi cần điều khiển các ký tự động thì sẽ khó khăn trong
việc điều khiển màu sắc.
- Do quá trình điều khiển hiển thị cần có giai đoạn lấy mẫu lại dữ liệu
nên khi điều khiển hiển thị ma trận có kích thước lớn có thể gây ảnh hưởng đến việc
điều khiển tần số quét .

Trong đề tài có thể có một số vấn đề hợp lý hay chưa tối ưu về các thuật toán
điều khiển hiển thị và sử dụng bộ nhớ của vi điều khiển. Do đó em rất mong có sự
góp ý của các thầy cô và các bạn để đồ án có thể hoàn thiện hơn.

84
Tài liệu tham khảo

[1] Steven F. Barrett and Daniel J. Pack, Atmel AVR Microcontroller Primer:
Programming and Interfacing, Morgan & Claypool, 2008

[2] Joe Pardue, C Programming for Microcontrollers, Smiley Micros, 2005

[3] Atmega16 datasheet, www.alldatasheet.com, truy nhập cuối cùng ngày


26/5/2009

[4] 74HC595 datasheet, www.alldatasheet.com, truy nhập cuối cùng ngày


26/5/2009

[5] 74HC138 datasheet, www.alldatasheet.com, truy nhập cuối cùng ngày


26/5/2009

[6] http://www.atmel.com/products/AVR/, truy nhập cuối cùng ngày 26/5/2009

[7] http://www.dientuvietnam.net/forums/forumdisplay.php?f=55, truy nhập cuối


cùng ngày 26/5/2009

[8] http://www.dientuvietnam.net/forums/showthread.php?t=21785, truy nhập cuối


cùng ngày 26/5/2009

[9] http://www.dientuvietnam.net/forums/showthread.php?t=15613, truy nhập cuối


cùng ngày 26/5/2009

85
Phụ lục A: Sơ đồ ghép nối hệ thống điều khiển led ma trận

Hình A - Sơ đồ ghép nối hệ thống

86
SCK
220v

MOSI

OC0
10
COM
11 15 1 18
SH_CP Q0 1B 1C
14 1 2 17
DS Q1 2B 2C
2 3 16
Q2 3B 3C

TR1
12 3 4 15
ST_CP Q3 4B 4C
4 5 14
Q4 5B 5C

TRAN-2P5S
5 6 13
Q5 6B 6C
6 7 12

Khoi chon hang cho LED


Q6 7B 7C
10 7 8 11
KHỐI CẤP NGUỒN:

MR Q7 8B 8C
13 9
OE Q7'

U1

U4
10

ULN2803
COM
11 15 1 18

74HC595
SH_CP Q0 1B 1C
14 1 2 17
DS Q1 2B 2C
2 3 16
Q2 3B 3C
12 3 4 15
ST_CP Q3 4B 4C
4 5 14
Khoi cap nguon cho IC

Q4 5B 5C

KHỐI CHỐT DỮ LIỆU CÁC HÀNG


5 6 13
Q5 6B 6C
6 7 12
Q6 7B 7C
10 7 8 11
MR Q7 8B 8C
13 9
OE Q7'
33pF

U2

U5
ULN2803
10

74HC595
COM
11 15 1 18
1

SH_CP Q0 1B 1C
14 1 2 17
DS Q1 2B 2C
2 3 16
470uF

Q2 3B 3C
VI

12 3 4 15
ST_CP Q3 4B 4C
4 5 14
Q4 5B 5C
5 6 13
Q5 6B 6C 2
6 7 12 GND
Hình A - Khối cấp nguồn

Q6 7B 7C
7805

10 7 8 11
MR Q7 8B 8C
13 9
OE Q7'
VO

U3

Hình A - Khối chốt dữ liệu các hàng


U6
3

ULN2803

74HC595
33pF

87
KHỐI GIAO TIẾP VỚI MÁY TÍNH:
C3

1nF

5 4

P1
ERROR C2- C2+
6
VS-
2
VS+
9
RI
4 8 9
DTR R2IN R2OUT
8 7 10
CTS T2OUT T2IN
3 13 12
TXD R1IN R1OUT RXD
7 14 11
RTS T1OUT T1IN TXD
2
RXD
6
DSR C1- C1+
1
DCD
3 1
COMPIM
C6

1nF
Giao tiep may tinh

Hình A - Khối giao tiếp máy tính

KHỐI KHUẾCH ĐẠI DÒNG CHO CỘT:

C[0..7]
C1

C4
C0

C2

C3

C5

C6

C7
A1

A2

A3

A4

A6

A7

A8
A5

B1
A1

A4
A5
A3

A6
A7
A8
A2

Hình A - Khối khuếch đại dòng cho cột

88
KHỐI ĐIỀU KHIỂN TRUNG TÂM VÀ QUÉT CỘT:

C[0..7]
C2

C4
C0
C1

C3

C5

C7
C6
15
14
13
12
11
10
9
7
U8
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7

74HC138
E1
E2
E3
C
A
B
1
2
3

6
4
5

C2 U7
9 22
RESET PC0/SCL
23
PC1/SDA
33pF 13 24
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
C1 40
PC4/TDO
27
PA0/ADC0 PC5/TDI
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
33pF 37
PA3/ADC3
36 14
PA4/ADC4 PD0/RXD RXD
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0 TXD
33 17
PA7/ADC7 PD3/INT1
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3 21
PB2/INT2/AIN0 PD7/OC2
4
OC0 PB3/OC0/AIN1
5
PB4/SS
6
KHoi dieu khien trung tam va chon cot MOSI
7
PB5/MOSI
30
PB6/MISO AVCC
8 32
SCK PB7/SCK AREF
ATMEGA16

Hình A - Khối xử lý trung tâm và quét cột

89
Phụ lục B: Mã chương trình nạp cho vi điều khiển

#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#include <spi.h>

#define SCL PORTB.3

unsigned char flash FONT []={0,

62,65,65,65,62,0, //0 1
17,33,127,1,1,0, //1 2
35,69,73,73,49,0, //2 3
34,65,73,73,54,0, //3 4
12,20,36,79,4,0, //4 5
114,73,73,73,70,0, //5 6
62,73,73,73,38,0, //6 7
65,66,68,72,112,0, //7 8
54,73,73,73,54,0, //8 9
50,73,73,73,62,0, //9 10
63,68,68,68,63,0, //A 11
127,73,73,73,54,0, //B 12
62,65,65,65,34,0, //C 13
127,65,65,65,62,0, //D 14
127,73,73,73,65,0, //E 15
127,72,72,72,64,0, //F 16
62,65,73,73,46,0, //G 17
127,8,8,8,127,0, //H 18
65,65,127,65,65,0, //I 19
70,65,65,126,64,0, //J 20
127,8,20,34,65,0, //K 21
127,1,1,1,1,0, //L 22
127,32,24,32,127,0, //M 23
127,32,16,8,127,0, //N 24
62,65,65,65,62,0, //O 25
127,68,68,68,56,0, //P 26
62,65,69,66,61,0, //Q 27
127,68,68,74,49,0, //R 28
50,73,73,73,38,0, //S 29
64,64,127,64,64,0, //T 30
126,1,1,1,126,0, //U 31
124,2,1,2,124,0, //V 31
127,2,12,2,127,0, //W 33
65,34,28,34,65,0, //X 34

90
96,16,15,16,96,0, //Y 35
67,69,73,81,97,0, //Z 36
4,42,42,42,28,0, //a 37
126,18,18,18,12,0, //b 38
28,34,34,34,20,0, //c 39
12,18,18,20,126,0, //d 40
28,42,42,16,0,0, //e 41
4,62,72,64,32,0, //f 42
24,37,37,37,30,0, //g 43
126,16,16,16,14,0, //h 44
0,92,2,2,4,0, //i 45
4,2,2,92,0,0, //j 46
126,8,20,34,0,0, //k 47
124,2,2,2,0,0, //l 48
30,32,30,32,30,0, //m 49
62,8,16,62,0,0, //n 50
28,34,34,34,28,0, //o 51
31,36,36,36,24,0, //p 52
24,36,36,36,31,0, //q 53
0,30,32,32,24,0, //r 54
18,42,42,42,36,0, //s 55
0,32,124,34,4,0, //t 56
60,2,2,2,60,0, //u 57
56,4,2,4,56,0, //v 58
56,2,12,2,56,0, //w 59
34,20,8,20,34,0, //x 60
48,8,14,8,48,0, //y 61
34,38,42,50,34,0, //z 62
0,0,0,0,0,0, //
255};

unsigned char dong1[192],dong2[192];


unsigned char tocdo_quet=50,tocdo_chay=3,c,col=2,eff=1,sc=0,sp=0;
unsigned char tg,m=0,t=0,k=0,i,j,sokt=4,sokt1=4,sokt2=4;
unsigned char chuoi1[16]={8,8,8,8,8,8,8,8};
unsigned char chuoi2[16]={6,6,6,6,6,6,6,6};

void LatchData(){
SCL=0;
SCL=1;
}

91
void lm1() {
for (i=0;i<=sokt1-1;i++){
for (j=0;j<=5;j++) {
dong1[i*6+j]=~FONT[chuoi1[i]*6+j+1];
}
}
for (i=0;i<=sokt2-1;i++){
for (j=0;j<=5;j++) {
dong2[i*6+j]=~FONT[chuoi2[i]*6+j+1];
}
}
}

void lm2(){
for (i=0;i<=sokt1*6-1;i++){
dong1[i+sokt1*6]=dong1[i];
//dong1[i]=0;
dong1[i]=255;
}
for (i=0;i<=sokt2*6-1;i++){
dong2[i+sokt2*6]=dong2[i];
//dong2[i]=0;
dong2[i]=255;
}

void xulychuoi(){
for (i=0;i<sokt1;i++) {
if ((chuoi1[i]>47)&&(chuoi1[i]<58)) chuoi1[i]=chuoi1[i]-48;
else if ((chuoi1[i]>64)&&(chuoi1[i]<91)) chuoi1[i]=chuoi1[i]-55;
else if ((chuoi1[i]>96)&&(chuoi1[i]<123)) chuoi1[i]=chuoi1[i]-60;
else chuoi1[i]=62;
}
for (i=0;i<sokt2;i++) {
if ((chuoi2[i]>47)&&(chuoi2[i]<58)) chuoi2[i]=chuoi2[i]-48;
else if ((chuoi2[i]>64)&&(chuoi2[i]<91)) chuoi2[i]=chuoi2[i]-55;
else if ((chuoi2[i]>96)&&(chuoi2[i]<123)) chuoi2[i]=chuoi2[i]-60;
else chuoi2[i]=62;
}
}

void shiftleft(){
for (i=0;i<sokt1*12-1;i++){
dong1[i]=dong1[i+1];
}

92
//dong1[sokt1*12-1]=0;
dong1[sokt1*12-1]=255;
for (i=0;i<sokt2*12-1;i++){
dong2[i]=dong2[i+1];
}
//dong2[sokt2*12-1]=0;
dong2[sokt2*12-1]=255;
}

void shiftright(){
tg= dong1[sokt*12-1];
for (i=sokt1*12-1;i>0;i--){
dong1[i]=dong1[i-1];}
dong1[0]=tg;
tg= dong2[sokt*12-1];
for (i=sokt2*12-1;i>0;i--){
dong2[i]=dong2[i-1];}
dong2[0]=tg;
}

void UP(int k){


sokt=((sokt1>sokt2)?sokt1:sokt2);

if (k<8)
for (i=0;i<=sokt*6-1;i++){
dong1[i]=0xFF;
dong2[i]=(dong1[i+sokt*6]>>(8-k))|(0xFF<<k);
}
else if ((k>7)&&(k<16)) {
m=k-8 ;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]>>(8-m))|(0xFF<<m);
dong2[i]=(dong1[i+sokt*6]<<m)|(dong2[i+sokt*6]>>(8-m));
} }
else if ((k>15)&&(k<24)) {
m=k-16 ;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]<<m)|(dong2[i+sokt*6]>>(8-m));
dong2[i]=(dong2[i+sokt*6]<<m)|(0xFF>>(8-m));
} }
else {
m=k-24 ;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong2[i+sokt*6]<<m)|(0xFF>>(8-m));
dong2[i]=0xFF;

93
} }

/*
if ( k>=8) {
for (i=0;i<=sokt*6-1;i++){
m=k-8;
dong1[i]=(dong1[i+sokt*6]<<m)|(0xFF>>(8-m));
dong2[i]=(dong2[i+sokt*6]<<m)|(0xFF>>(8-m));
} }
if (k<8) {
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]>>(8-k))|(0x7F<<k);
dong2[i]=(dong2[i+sokt*6]>>(8-k))|(0x7F<<k);
} }
*/

void down(int k){


sokt=((sokt1>sokt2)?sokt1:sokt2);

if (k>23) {
m=k-24;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=0xFF;
dong2[i]=(dong1[i+sokt*6]>>m)|(0x7F<<m);
} }
if ((k>15)&&(k<=23)) {
m=k-16;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]>>m)|(0xFF<<(8-m));
dong2[i]=(dong1[i+sokt*6]<<(8-m))|(dong2[i+sokt*6]>>m);
} }
if ((k>7)&&(k<16)) {
m=k-8;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong1[i+sokt*6]<<(8-m))|(dong2[i+sokt*6]>>m);
dong2[i]=(dong2[i+sokt*6]<<m)|(0xFF<<(8-m));
} }
if (k<8){
m=8-k ;
for (i=0;i<=sokt*6-1;i++){
dong1[i]=(dong2[i+sokt*6]<<m)|(0xFF>>(8-m));
dong2[i]=0xFF;
} }
/*

94
if ( k>8) {
for (i=0;i<sokt*6;i++){
m=k-8;
dong2[i]=(dong2[i+sokt*6]>>m)|(0x7F<<(8-m));
dong1[i]=(dong1[i+sokt*6]>>m)|(0x7F<<(8-m));
} }
if (k<=8) {
for (i=0;i<sokt*6;i++){
dong2[i]=(dong2[i+sokt*6]<<(8-k))|(0xFF>>k);
dong1[i]=(dong1[i+sokt*6]<<(8-k))|(0xFF>>k);
} }

*/
}

void tungchu () {
for (i=0;i<k*6;i++){
dong1[i]=dong1[sokt*6+i];
dong2[i]=dong2[sokt*6+i];
}
}

void hienthi() {

switch (col){
// 2do1do
case 0 :
spi(0x00);
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);
spi(0x00);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
break;
// 2xanh1do
case 1 :
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);

95
spi(dong2[c]);
spi(0x00);
spi(0x00);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
break;
// 2cam1do
case 2 :
spi(dong2[c+16]);
spi(dong2[c+16]);
spi(dong2[c+8]);
spi(dong2[c+8]);
spi(dong2[c]);
spi(dong2[c]);
spi(0x00);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
break;
// 2do1xanh
case 3 :
spi(0x00);
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
spi(0x00);
break;
// 2xanh1xanh
case 4 :
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);

96
spi(0x00);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
spi(0x00);
break;
// 2cam1xanh
case 5 :
spi(dong2[c+16]);
spi(dong2[c+16]);
spi(dong2[c+8]);
spi(dong2[c+8]);
spi(dong2[c]);
spi(dong2[c]);
spi(dong1[c+16]);
spi(0x00);
spi(dong1[c+8]);
spi(0x00);
spi(dong1[c]);
spi(0x00);
break;
// 2do1cam
case 6 :
spi(0x00);
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);
spi(dong1[c+16]);
spi(dong1[c+16]);
spi(dong1[c+8]);
spi(dong1[c+8]);
spi(dong1[c]);
spi(dong1[c]);
// 2xanh1cam
case 7 :
spi(dong2[c+16]);
spi(0x00);
spi(dong2[c+8]);
spi(0x00);
spi(dong2[c]);
spi(0x00);
spi(dong1[c+16]);

97
spi(dong1[c+16]);
spi(dong1[c+8]);
spi(dong1[c+8]);
spi(dong1[c]);
spi(dong1[c]);
break;
// 2cam1cam
case 8 :
spi(dong2[c+16]);
spi(dong2[c+16]);
spi(dong2[c+8]);
spi(dong2[c+8]);
spi(dong2[c]);
spi(dong2[c]);
spi(dong1[c+16]);
spi(dong1[c+16]);
spi(dong1[c+8]);
spi(dong1[c+8]);
spi(dong1[c]);
spi(dong1[c]);
break;
default: break;
}
}
void hieuung() {

switch (eff){
// hienbt
case 0 :
lm1();
break;
// dichtrai
case 1 :
if (t==48){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
shiftleft();
}
if (k==sokt*12) {
lm1();
lm2();
k=0;

98
}
break;
// dichphai
case 2 :
if (t==48){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
shiftright();
}
if (k==sokt*12) {
lm1();
lm2();
k=0;
}
break;
// dichlen
case 3 :
if (t==48){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
UP(k);
}
if (k>=32) {
lm1();
lm2();
k=0;
/* if (t==sokt*8){
k++;
UP(k);
}
if (k==16) {
lm1();
lm2();
k=0;
}
*/
}
break;

99
// dichxuong
case 4 :
if (t==48){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
down(k);
}
if (k>=32) {
lm1();
lm2();
k=0;
}
break;
// tungchu
case 5 :
if (t==200){
t=0;
sp++;
}
if (sp==tocdo_chay){
sp=0;
k++ ;
tungchu();
}
if (k>sokt) {
lm1();
lm2();
k=0;
}
break;
default: break;

}
}

// Timer 1 output compare A interrupt service routine


interrupt [TIM1_COMPA] void timer1_compa_isr(void) {

hienthi();
LatchData();
PORTC=c+8;
PORTA=c+8;

100
c++;
t++;
if (c==8) c=0;
hieuung();

void main(void){
lm1();
lm2();
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: clk/256 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=tocdo_quet;
OCR1BH=0x00;
OCR1BL=0x00;
/*UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;*/

UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

DDRB=0xFF;
DDRC=0xFF;
DDRA=0xFF;

101
SCL=1;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: clk
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x00;
while (1){
unsigned char temp1,temp2,length;
int i;
temp1 = getchar();
if (temp1=='A')
{
TIMSK=0x00;
//Nhan chuoi ky tu hang 1
//tinh do dai chuoi
temp1 = getchar()-48;
temp2 = getchar()-48;
length = temp1*10 + temp2;
sokt1=length;
//Nhan chuoi ky tu
if (length >=1){
for( i=0;i<length;i++)
{
chuoi1[i] = getchar();
}
//Nhan chuoi ky tu hang 2
//tinh do dai chuoi
temp1 = getchar()-48;
temp2 = getchar()-48;
length = temp1*10 + temp2;
sokt2=length;
//Nhan chuoi ky tu
if (length >=1){
for( i=0;i<length;i++)
{
chuoi2[i] = getchar();
}
//Nhan mau
col = getchar() - 48;

102
//Nhan hieu ung
eff = getchar() - 48;
//Nhan Toc do quet
temp1 = getchar()-48;
temp2 = getchar()-48;
tocdo_quet = temp1*10 + temp2;
//Nhan toc do chay
temp1 = getchar()-48;
temp2 = getchar()-48;
tocdo_chay = temp1*10 + temp2;
xulychuoi();
lm1();
lm2();
t=0;
c=0;
TIMSK=0x10;
}
}
}
}
}

103

You might also like