1 The Hoanh

LỜI CẢM ƠN
Để có được thời gian thực tập và làm việc hiểu quả đầu tiên cho em xin gửi lời cảm ơn chân thành đến Trường Đại Học Công Nghệ và Truyền Thông – Bộ môn Công Nghệ Kỹ Thuật Máy Tính đã tạo điều kiện tốt nhất cho em có thể hoàn thành tốt đợt thực tập của mình. Bên cạnh đó, em xin cảm ơn sự hướng dẫn tận tình của cô Lưu Thị Liễu đã giúp đỡ em hoàn thành tốt đợt thực tập này. Thiếu sự giúp đỡ của cô em không thể có được kết quả như ngày hôm nay. Trong quá trình thực tập, cũng như trong qúa trình làm báo cáo, em khó tránh khỏi sai sót. Rất mong các thấy cô trong bộ môn và cô giáo Lưu Thị Liễu bỏ qua và chỉ dẫn thêm cho em. Em xin chân thành cảm ơn.

2 The Hoanh

Lời Nói Đầu
Trong thời đại công nghiệp hóa – hiện đại hóa đất nước, cùng với sự phát triển vượt bậc về công nghệ là các ứng dụng của kỹ thuật vi điều khiển, với tốc độ phát triển nhanh chóng kỹ thuật vi điều khiển đã mang đến những thay đổi trong khoa học công nghệ cũng như trong đời sống hàng ngày, các sản phẩm của vi điều khiển ngày càng nhiều hơn và được ứng dụng rộng rãi hơn trong tất cả các lĩnh vực sinh hoạt hàng ngày. Biển quảng cáo điện tử chỉ là một ứng dụng rất nhỏ trong những ứng dụng của vi điều khiển và cũng đã góp phần không nhỏ đến đời sống sinh hoạt hàng ngày của con người cũng như trong lĩnh vực quảng cáo. Và biển quảng cáo điện tử đã trở thành một phần quan trọng trong lĩnh vực quảng cáo vì nó có thể thu hút được sự chú ý của mọi người, và độ bền hơn hẳn các biển quảng cáo thông thường khác. Đề tài “Ứng dụng AVR thiết kế biển quảng cáo cho cửa hàng BOOK NEW tại Hà Nội” là một phần nhỏ để phục vụ trong việc thiết kế biển quảng cáo. Thông qua đề tài này trước tiên em có thể thiết kế được biển quảng cáo cho cửa hang BOOK NEW, sau em có thể vận dụng những gì đã học để thiết kể biển quảng cáo điển tử với nhiều hình thức khác nhau và nhưng ứng dụng của vi điều khiển AVR vào thực tế một các đễ dàng và tiện lợi hơn Do trình độ và kinh nghiệm trong thực tế của em còn nhiều non kém, nên đề tài của em chắc chắn còn nhiều thiếu sót. Vì vậy em rất mong nhận được những ý kiến đóng góp quý bàu của các thầy cô và toàn thể các bạn. .

3 The Hoanh

CHƯƠNG 1: TỔNG QUAN
1.1 Giới thiệu hệ thống biển quảng cáo.
1.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. Các loại hình quảng cáo phổ biến hiện nay :  Truyền hình.  Internet.  Báo chí.  Phát thanh.  Quảng cáo trực tuyến.  Quảng cáo bằng sử dụng biển quảng cáo  ………

1.1.2 Quảng cáo sử dụng biển quảng cao bằng ma den led.

4 The Hoanh

- 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 đ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. Quảng cáo bằng đèn 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 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.

5 The Hoanh

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.

1.2 Khảo sát vấn đề
Hiện nay, những ứng dụng của phần cứng được sử dụng ngày càng nhiều và phổ biến, đi tới đâu chúng ta cũng có thể nhìn thấy những biển quảng cáo có sử dụng đèn led để hiển thị thời gian, giá cả,…vv, thậm chí hiện nay đã và đang xuất hiện những biển quảng cáo sử dụng các ma trận led với kích thước lớn hoặc sử dụng những tivi màn hình led vào việc quảng cáo. Đề tài em chọn xuất phát từ ý tưởng sử dụng vi điều khiển AVR vào điều khiển cho biển quảng cáo cửa hàng BOOK NEW. Với ý tưởng này, người dùng sẽ có thể thay thế các biển quảng cáo thông thường và sẽ không cần phải quan tâm đến vấn đề biển quảng cáo của mình bị mờ do vấn đề thời tiết, hoặc thời gian...Đây chỉ là một ứng dụng nhỏ trong rất nhiều ứng dụng liên quan đến vi điều khiển AVR.

1.3 Các vấn đề cần giải quyết
Các vấn đề cần giải quyết của đề tài”Tìm hiểu và ứng dụng vi điều khiển AVR vào điều khiển hiển thị chữ trên LED ma trận” như sau: Ghép nối vi điều khiển với các LED ma trận và các IC dịch 74HC154. Có khả năng mở rộng và phát triển vào trong thực tế. Có độ an toàn, độ bền cao. Hệ thống chạy ổn định.

1.4 Mục đích của đề tài
Sự cần thiết, quan trọng cũng như tính khả thi và lợi ích của mạch số cũng chính là lý do để tôi chọn và thực hiện đồ án “Tìm hiểu và ứng dụng vi điều khiển AVR thiết kể biển quản cáo cho cửa hàng BOOK NEW” nhằm ứng dụng kiến thức đã học vào thực tế.

6 The Hoanh

CHƯƠNG 2 VI ĐIỀU KHIỂN AVR (ATMEGA 8), MA TRẬN LED 8x8, IC 74HC154.
2.1 Giới thiệu vi điều khiển AVR
Vi điều khiển AVR là sản phẩm của công ty Atmel( Hoa kỳ), đây là một bộ xử lý có kiến trúc kiểu Harvard, nghĩa là đơn vị xử lý trung tâm có bộ nhớ chương trình và một bộ nhớ dữ liệu tách biệt. Bộ vi điều khiển AVR có nhiều khả năng để giảm năng lượng tiêu thụ. Đây là một trong những ưư điểm lớn của họ vi điều khiển này. So với các chip vi điều khiển 8 bits khác, AVR có nhiều đặc tính hơn hẳn, hơn cả trong tính ứng dụng (dễ sử dụng) và đặc biệt là về chức năng: • Gần như chúng ta không cần mắc thêm bất kỳ một linh kiện phụ nào khi sử dụng AVR, thậm chí không cần nguồn tạo xung clock cho chip (thường là khối thạch anh). • Thiết bị lập trình (mạch nạp) cho AVR rất đơn giản, có loại mạch chỉ cần vài con điện trở là có thể làm được. Một số chip còn hỗ trợ lập trình on-chip bằng bootloader không cần mạch nạp. • Bên cạnh lập trình bằng ASM, cấu trúc AVR được thiết kế tương thích với ngôn ngữ C. • Nguồn tài nguyên source code, tài liệu trên internet rất lớn. Họ vi điều khiển AVR gồm nhiều bộ điều khiển với các tài nguyên khác nhau về bộ phận ngoại vi, bộ nhớ chương trình và kiểu đóng vỏ. Sau đây là một số vi điều khiển họ AVR và đặc điểm của chúng:

7 The Hoanh

Bộ nhớ CT Số Bộ xử lý AT90S1200 AT90S2313 AT90S2323 AT90S2343 AT90S4433 AT90S8515 AT90S8535 ATTINY15L 20 20 8 10 8 40 40 8 4-6 4-6 4-6 4-6 8 4-6 4-6 2.7-5.5 12 10 10 10 8 8 8 1.6 1 2 2 2 4 8 8 1 Us Fmax (Kbyte

Bộ

Bộ

nhớdữ liệu flash 64 128 128 128 256 512 512 64

nhớdữ

Cổn g

A/D

32 128 128 128 128 512 512 …. 1Kbyte 1Kbyte

15 15 3 5 20 32 32 6 6kênh 6kênh

8 The Hoanh

Hình 1: Một số vi điều khiển và đặc điểm của chúng: AVR có rất nhiều dòng khác nhau bao gồm dòng Tiny AVR (như AT tiny 12, AT

tiny 22…) có kích thước bộ nhớ nhỏ, ít bộ phận ngoại vi, rồi đến dòng AVR ( chăng hạn AT90S8535, AT90S8515) có kích thước bộ nhớ vào loại trung bình và mạnh hơn là dòng Mega (như Atmega32, Atmega128,…) với bộ nhớ có kich thước vài Kbyte đến vài Kb cùng với các bộ ngoại vi đa dạng được tích hợp trên chíp, cũng có dòng tích hợp cả LCD trên chip (dòng LCD AVR). Tốc độ của dòng mega cũng cao hơn các dòng khác, Sự khác nhau cơ bản giữa các dòng chính là cấu trúc ngoại vi, còn nhân thì vẫn như nhau.

9 The Hoanh

2.2 Kiến trúc của vi điều khiển AVR:
2.2.1 Đặc điểm cơ bản của AVR:
Bộ nhớ flash được tích hợp ngay trên chíp có khả năng lập trình ngay trên hệ thống được sử dụng làm bộ nhớ chương trình. Điều này có nghĩa là ta không cần phải dùng đến các bộ nhớ EPROM hoặc ROM bên ngoài để chứa mã chương trình. Hơn nữa bộ nhớ chương trình có thể nạp được chương trình trong khi bộ vi xử lý vẫn ở nguyên trên bản mạch, không cần nhấc ra ngoài để nạp. Các thanh ghi làm việc đa năng 32-X-8 . Một tập hợp bao gồm rất nhiều thanh ghi có nghĩa là các biến có thể được lưư trữ bên trong CPU chứ không phải lưu trữ các biến trong bộ nhớ, vì việc truy nhập lên bộ nhớ thường tốn nhiều thời gian hơn. Như vậy chương trình sẽ chạy nhanh hơn. Bộ nhớ dữ liệu ngay trên chip loại EEPROM và RAM có trong hầu hết các thành viên của họ AVR. Đơn vị CPU có kiến trúc Harvard, còn các bộ nhớ EEPROM và RAM được nhìn nhận như là bộ nhớ dữ liệu và được dùng để cất giữ các hằng và biến. Hoạt động với xung giữ nhịp có tần số từ 0 đến 10MHz. Hầu hết các lệnh được thực hiện trong một chu kì đồng hồ làm cho tốc độ xử lý lớn hơn khoảng 10 lần so với 8051 ở cùng tần số của đồng hồ giữ nhịp.Có mạch đặt lại trạng thái mỗi khi cấp lại điện nguồn cho hệ thống.

10 The Hoanh

Có bộ định thời ngay trên chíp và lập trình được với mạch chia tần số tách biệt. Bộ định thời này được sử dụng cho các ứng dụng cần có sự phân định thời gian của các sự kiện. Có các nguồn ngắt bên trong và bên ngoài. Có bộ định thời watchdog ngay trên chip và lập trình được với bộ dao động độc lập. Bộ phận này được sử dụng để khôi phục lại trạng thái hoạt động của hệ thống trong trường hợp xảy ra lỗi treo khi chạy phần mềm, ngoài ra còn được sử dụng cho một vài ứng dụng khác. Có các chế độ hoạt động như: SLEEP và POWER DOWN( nghỉ hay giảm dòng tiêu thụ khi khồn cần thiết). Đặc điểm này cho phép tiết kiệm năng lượng khi bộ xử lý nhàn rỗi. Nhiều chíp có mạch dao động đồng hồ RC ngay trên chíp. Khi sử dụng bộ dao động RC trên chíp số lượng các linh kiện phụ trợ sẽ giảm đi.

Hệ thống chíp đa dạng từ cỡ nhỏ đến lớn thuận tiện cho từn ứng dụng riêng biệt. 2.2.2 Kiến trúc họ vi điều khiển AVR
Các bộ xử lý AVR có kiến trúc Harvard, nghĩa là có bộ nhớ dữ liệu bộ nhớ chương trình tách biệt nhau:

Bộ nhớ chương trình là loại bộ nhớ flash. Dung lượng của bộ nhớ thay đổi

khác nhau giữa các bộ xử lý trong cùng họ. Bộ nhớ này được truy nhập theo từng chu kì đồng hồ, và một lệnh được nạp vào thanh ghi lệnh. Thanh ghi lệnh nối với tệp thanh ghi bằng cách lựa chọn xem thanh ghi nào được ALU sử dụng để thực thi lệnh. • Lối ra của thanh ghi lệnh được giải mã bằng bộ giải mã lệnh để quyết định chọn tín hiệu điều khiển nào sẽ đựơc kích hoạt để hoàn thành lệnh hiện tại. Bộ nhớ chương trình, bên cạnh các lệnh lưu trữ cũng chứa các vectơ ngắt bắt đầu ở địa chỉ $0000.

11 The Hoanh

Kiến trúc Harvard Tổ chức bộ nhớ AVR:

Hình 2: Tổ chức bộ nhớ của AVR. • Bộ nhơ dữ liệu gồm 5 thành phần khác nhau: 1. Một tệp thanh ghi(register file) với 32 thanh ghi có độ rộng 8 bit. 2. 64 thanh ghi vào/ra mỗi thanh 8 bit. Các thanh ghi này thực chất là một phần của bộ nhớ SRAM trên chip và có thể được truy nhập hoặc như bộ nhớ SRAM với các địa chỉ giữa $20 và $5F hoặc như các thanh ghi I/O với các địa chỉ giữa $00 và $3F. Số lượng 64 thanh ghi này có thể thay đổi tuỳ theo từng loại chip trong họ AVR. 3. Bộ nhớ SRAM bên trong: bộ nhớ này được sử dụng cho ngăn xếp cũng như để lưu trữ các biến. Trong thời gian có ngắt và gọi đoạn chương trình, giá trị hiện tại của bộ

12 The Hoanh

đếm chương trình được lưu trữ trong ngăn xếp. Kích thước của ngăn xếp bị giới hạn bởi bộ nhớ SRAM trên chip. Vị trí của ngăn xếp được chỉ thị bởi con trỏ ngăn xếp. 4. Bộ nhớ SRAM bên ngoài: Đặc tính này chỉ có ở các bộ xử lý cỡ lớn trong họ vi điều khiển AVR. 5. EEPROM: bộ nhớ EEPROM có sẵn trên hầu hết các bộ vi điều khiển AVR và được truy nhập theo một bản đồ bộ nhớ tách biệt. Địa chỉ bắt đầu của bộ nhớ EEPROM luôn là $0000. Các bộ xử lý khác nhau có từ 64 byte đến 4 Kbyte bộ nhớ EEPROM. Bộ nhớ EEPROM có thể ghi vào được khoảg 100000 lần.

2.2.3 Tệp các thanh ghi
Tất cả các bộ điều khiển AVR đều có 32 thanh ghi đa năng. Một số trong các thanh ghi này còn có các chức năng riêng, bổ sung. Các thanh ghi được đặt tên từ R0 đến R31. Tệp thanh ghi được tách thành 2 phần, mỗi phần có 16 thanh ghi, đánh số từ R0 đến R15 và R16 đến R31. Tất cả các lệnh thao tác trên các thanh ghi đều có thể truy nhập trực tiếp và truy nhập trong chu trình đơn đến tất cả các thanh ghi. Nhưng có một ngoại lệ là các lệnh SBCI, SUBI, CPI, ANDI và ORI cũng như lệnh WI, các lệnh này chỉ tác động đến các thanh ghi R16 đến R31.

Hình 3: Tệp thanh ghi

13 The Hoanh

Các thanh ghi R0 và R26 đến R31 có các chức năng bổ sung. Thanh ghi R0 được sử dụng trong các lệnh nạp bộ nhớ chương trình LPM (Load Program Memory) , trong khi các thanh ghi R26 đến R31 được sử dụng làm các thanh ghi con trỏ như được minh hoạ trên hình 2. Các thanh ghi con trỏ nay được sử dụng trong nhiều lệnh gián tiếp dùng cho thanh ghi (register indirect instruction). 2.2.4 Khối logic số học: Khối số học lôgic(ALU) thực hiện các thao tác như thao tác bit; phép tính số học và lôgic trên nội dung của các thanh ghi đã được chỉ định. Các thao tác này được thực hiện trong một chu kỳ đôngf hồ đơn lẻ. Mỗi một thao tác ALU đều làm ảnh hưởng đến các cờ trong thanh ghi trạng thái(STATUS), tuỳ thuộc vào lệnh. 2.2.5 Bộ nhớ EEPROM Tất cả các bộ vi điều khiển AVR đều có một bộ nhớ EEPROM trên chip. Dung lượng bộ nhớ EEPROM thay đổi từ 64 byte trên bộ điều khiển AT90S1200, Tiny10/12 đến 4 Kbyte trên Mega103. Các thanh ghi dùng để truy nhập EEPROM gồm: thanh ghi địa chỉ EEPROM(EEAR), thanh ghi dữ liệu EEPROM(EEDR), và thanh ghi điều khiển EEPROM(EECR). Bộ nhớ EEPROM là một bộ nhớ không bị mất dữ liệu khi nguồn điện cung cấp bị ngắt. Dữ liệu trong nó có thể được ghi và xóa bằng điện và vì vậy việc ghi và đọc bộ nhớ này có thể làm trực tiếp. Bộ nhớ này được xem như một bộ nhớ dữ liệu nhưng chúng không được truy nhập như một bộ nhớ SRAM mà được truy nhập như một thiết bị ngoại vi. Thời gian truy cập để viết mất khoảng 2.5 đến 4 ms, và phụ thuộc vào nguồn điện cung cấp cho vi điều khiển (Vcc). Để điều khiển vào ra dữ liệu với EEPROM chúng ta có thể sử dụng 3 thanh ghi đó là:EEPROM address ,EEDR và EECR. Để ghi dữ liệu vào EEPROM ta làm các bước sau: - Bước 1: chờ đợi bit EEWE đã bị xóa chưa ?

14 The Hoanh

- Bước 2: Ghi dữ liệu mới vào thanh ghi dữ liệu (EEDR) - Bước 3: Set bit EEWE rồi đến bit EEMWE để bắt đầu ghi dữ liệu. Chý ý: Nếu như dang ghi dữ liệu ở EEPROM mà xuất hiện ngắt thì dữ liệu đó sẽ không được ghi một cách an toàn vào EEPOM. Để đọc dữ liệu vào EEPROM thì đơn giản hơn. - Bước 1: kiểm tra bit EEWE nếu như có quá trình ghi EEPROM thì chờ đợi. - Bước 2: Đưa địa chỉ cần đọc vào thanh ghi địa chỉ EEAR - Bước 3: Set bit EERE lên 1 bắt đầu quá trình đọc. - Bước 4: Chờ đợi đoc xong bằng cách kiểm tra bit EERE nếu đã được xóa thì có dữ liệu ở thanh ghi dữ liệu. Sau đó đọc dữ liệu.

2.2.6 Bộ nhớ SRAM
Bộ nhớ SRAM có trên hầu hết các bộ xử lý có giá thành cao trong họ AVR. Dung lượng của bộ nhớ SRAM thay đổi từ 128 byte đến 4 Kbyte. Bộ nhớ SRAM được truy nhập bằng cách sử dụng nhiều lệnh truy nhập dữ liệu trực tiếp hoặc gián tiếp. Bộ nhớ này cũng đựơc sử dụng cho ngăn xếp. Thời gian truy nhập bộ hớ SRAM bằng 2 chu kì đồng hồ. Trên các bộ điều khiển AVR cỡ lớn đều có khả năng kết nối với bộ nhớ SRAM ở bên ngoài. Để cho phép truy nhập bộ nhớ SRAM ngoài trên PORTA và PORTC của các bộ điều khiển cũng như tín hiệu ALE dùng cho việc phân kênh địa chỉ/dữ liệu, bit SRE(bit 7) trong thanh ghi MCUCR được đặt thành “1”.

15 The Hoanh

Bảng 4: Bản đồ bộ nhớ dữ liệu SRAM

2.2.7 Các cổng vào ra
Tất cả các bộ điều khiển AVR đều có một lượng lớn các cổng vào/ra nằm trong khoảng từ 3 bit trên AT90S2323 đến 48 bit trên Mega103. Tất cả các cổng lối ra của các bộ điều khiển AVR có thể chịu dòng điện đến 20 mA nên rất thích hợp đối với việc điều khiển trực tiếp các LED vì không cần đến mạch bổ sung. Các cổng vào ra đều có 3 địa chỉ vào ra đi kèm với chúng. Ba địa chỉ vào/ra được cần đến để đặt cấu hình cho các bit riêng biệt thành lối vào hoặc lối ra, địa chỉ khác cần đến để xuất ra dữ liệu tới các bit đó được đặt cấu hình thành lối ra, và địa chỉ thứ 3 được cần đến để đọc dữ liệu từ các chân đó được cấu hình thành lối vào.

16 The Hoanh

2.2.8 Truy nhập bộ nhớ và thực thi lệnh
Bộ xử lý AVR được điều khiển bởi đồng hồ hệ thống, đồng hồ này có thể ở bên ngoài hoặc, nếu có tồn tại và được phép, một đồng hồ RC bên trong có thể được sử dụng. Đồng hồ hệ thống này không qua bất kỳ bộ chia nào và được sử dụng trực tiếp cho tất cả các thao tác truy nhập bên trong bộ xử lý. Bộ xử lý có một đường ống hai tầng, và lệnh tìm nạp/giải mã (fetch/ decode) được thực hiện đồng thời với việc thực thi lệnh. Cứ mỗi lần lệnh được tìm nạp (fetch), nếu đây là một lệnh liên quan đến ALU, nó có thể được tực thi bởi khối ALU cho một chu trình đơn lẻ. Mặt khác, việc truy nhập bộ nhớ SRAM chiếm mất 2 chu kỳ. Nguyên nhân là việc truy nhập bộ nhớ SRAM sử dụng một thanh ghi con trỏ dùng cho địa chỉ bộ nhớ RAM. Thanh ghi con trỏ này chỉ là một trong các thanh ghi con trỏ (các cặp thanh ghi X, Y , hoặc Z) có trên chip. Chu trình đồng hồ thứ nhất được cần đến để truy nhập tệp thanh ghi và để thao tác trên thanh ghi con trỏ. Ở thời điểm kết thúc của chu kỳ đồng hồ thứ nhất, khối ALU thực hiện phép tính này, và sau đó địa chỉ này (hoặc đọc ra từ đó vào thanh ghi đích).

2.2.9 Ngắt trên AVR

Hình 5: Sơ đồ ngắt

17 The Hoanh

Interrupts, thường được gọi là ngắt, là một tín hiệu khẩn cấp gởi đến bộ xử lí, yêu cầu bộ xử lí tạm ngừng tức khắc các hoạt động hiện tại để “nhảy” đến một nơi khác thực hiện một nhiệm vụ khẩn cấp nào đó, nhiệm vụ này gọi là trình phục vụ ngắt – isr (interrupt service routine ). Sau khi kết thúc nhiệm vụ trong isr, bộ đếm chương trình sẽ được trả về giá trị trước đó để bộ xử lí quay về thực hiện tiếp các nhiệm vụ còn dang dở. Như vậy, ngắt có mức độ ưu tiên xử lí cao nhất, ngắt thường được dùng để xử lí các sự kiện bất ngờ nhưng không tốn quá nhiều thời gian. Các tín hiệu dẫn đến ngắt có thể xuất phát từ các thiết bị bên trong chip (ngắt báo bộ đếm timer/counter tràn, ngắt báo quá trình gởi dữ liệu bằng RS232 kết thúc…) hay do các tác nhân bên ngoài (ngắt báo có 1 button được nhấn, ngắt báo có 1 gói dữ liệu đã được nhận…). Ngắt là một cơ cấu điều khiển dòng lệnh, cơ cấu này đựơc thiết kế trên hầu hết các bộ điều khiển. Trong quá trình giao tiếp của hệ thống bộ xử lý với thế giới bên ngoài, nhiều sự việc xảy ra theo cách không đồng bộ, chắng hạn người dùng có thể nhấn một công tắc để thực hiện một công việc nào đó, trong khi một byte dữ liệu đã đi đến cổng nối tiếp. Điều này gây khó khăn cho hoạt động của bộ xử lý khi mà nó phải kiểm tra tất cả các thiết bị để giám sát sự di chuyển của dữ liệu. Ngược lại mọi việc sẽ tốt hơn nếu các thiết bị này có thể loan báo sự đến nơi của dữ liệu. Đây là tất cả những gì mà cơ chế ngắt phải thực hiện. Thiết bị ngoại vi sẽ ngắt việc thực thi của chương trình chính, và bộ xử lý tạm ngưng việc thực thi chương trình bình thường để thẩm tra nguồn ngát và để thực hiện những thao tác đáp ứng cần thiết. Sau khi hoàn thành những thao tác đáp ứng cầm thiết việc thực thi chương trình bị ngắt lại tiếp tục. Chương trình ngắt chỉ đơn giản giống hệt một cương trình con bình thường ngoại trừ một đặc điểm là việc thực thi của chương trình này không bị bộ xử lý chặn trước là sẽ xuất hiện ở một thời điểm cụ thể nào. Thứ tự các sự việc xuất hiện khi xảy ra ngắt: 1. Thiết bị ngoại vi ngắt bộ xử lý. 2. Thực hiện nốt lệnh hiện tại. 3. Địa chỉ lệnh tiếp theo được lưu trữ vào ngăn xếp.

18 The Hoanh

4. Địa chỉ của chương trình con phục vụ ngắt được nạp vào bộ đếm chương trình. 5. Bộ xử lý thực thi chương trình con phục vụ ngắt. 6. Trở lại chương trình bị ngắt bằng lệnh RETI. 7. Bộ xử lý nạp bộ đếm chương trình với giá trị được lưu trữ trên ngăn xếp và việc thực thi chương trình bình thường lại tiếp tục. Bởi vì ngắt có thể xuất hiện bất cứ lúc nào nên trạng thái bộ xử lý cần phải được lưu trữ sao cho việc thực thi chương trình bình thường có thể tiếp tục ngay sau khi đoạn chương trình ISR được hoàn tất. Trạng thái của bộ xử lý được chứa trong thanh ghi SREG. Thanh ghi ISR cần phải lưu trữ SREG trước khi thực thi bất kỳ một lệnh nào khác, và trước khi trở lại với việc điều khiển chương trình chính cần phải khôi phục lại thanh ghi SREG. Yêu cầu này có thể được thực hiện theo hai cách: hoặc là SREG được sao chép sang một thanh ghi khác ký hiệu là RI, thanhghi này cần phải không được phục vụ cho bất kỳ một mục đích nào khác và trước khi ISR thực thi lệnh RETI, RI được sao chép ngược trở lại SREG. Một cách khác để lưu trữ SREG là lưu nó trên ngăn xếp(bằng cách dùng lệnh PUSH SREG) và sau đó trước khi thực hiện lệnh RETI, giá trị SREG được sao chép ngược trở lại từ ngăn xếp(lệnh POP SREG). Phương pháp này chỉ có thể áp dụng cho những bộ xử lý có ngăn xếp tổ chức bằng phần mềm. Cũng có khả năng ngắt một ISR néu một ngắt khác xuất hiện và cờ ngắt toàn cục đã được đặt thành “1” bên trong ISR dùng cho ngắt 1(bằng cách sử dụng lệnh SEI). Trong trường hợp này, ngắt ISR1 bị ngắt và ISR khác, ISR2 thực thi. Việc thực thi ISR1 lại tiếp tục sau khi ISR2 kết thúc, và sau khi thực thi xong ISR1 chương trình chính lại tiếp tục. Bình thường sau khi một ngắt xuất hiện và đang đựoc phục vụ bởi thanh ghi ISR tương ứng, các ngắt toàn cục bị cấm(tương đương việc thực hiện lênh CLI), tuy nhiên vẫn có khả năng cho phép các ngắt trong khi một ISR đang thực thi bằng việc thực hiện lệnh SEI trong ISR.. Nếu như các ngắt khác xuất hiện trong khoảng thời gian khi một ISR đang hoạt động thì nó sẽ được thực hiện bằng việc ngắt đoạn chương trình ISR ban đầu.

19 The Hoanh

Tính ưu tiên của ngắt: đựoc quy định bởi cách gán các vectơ ngắt. Một vectơ ngắt ở địa chỉ thấp hơn trong bộ nhớ chương trình có mức ưu tiên cao hơn. Mức độ ưu tiên của ngắt dùng để quyết định xem ngắt nào được phục vụ trước nếu như có nhiều ngắt đang chờ xử lý ở cùng một thời điểm. Một điều rất đáng quan tâm khi sử dụng các ngắt là bộ vi xử lý có thể đáp ứng ngắt nhanh đến mức nào. Câu trả lời phụ thuộc rất nhiều vào kién trúc của bộ vi xử lý. Đối với các bộ điều khiển AVR, việc thực thi ngắt đáp ứng đối với tất cả các ngắt AVR đã được cho phép ít nhất là 4 chu kỳ đồng hồ. Bốn chu kỳ đồng hồ sau khi cờ ngắt đã được đặt, chương trình vectơ địa chỉ dùng cho đoạn chương trình xử lý ngắt hiện tại được thực thi. Trong khoảng thời gian 4chu kỳ máy bộ đếm chương trình(2 byte) được đẩy lên ngăn xếp, và con trỏ ngăn xếp thì giảm đi 2. Véctơ thường là một lệnh nhảy tương đối đến hương trình ngắt, và thao tác nhảy này chiếm 2 chu kỳ đồng hồ. Nếu như một ngắt xuất hiện trong khi đang thực thi một lệnh chiếm hiều chu kỳ, lệnh này được hoàn thành trước khi ngắt được phục vụ. Việc quay trở lại từ một chương trình xử lý ngắt chiếm 4 chu kỳ đồng hồ. Trong bốn chu kỳ đồng hồ này, bộ đếm chương trình (2 byte) được đẩy trở lại ngăn xếp, con trỏ ngăn xếp đựoc tăng thêm 2 và cờ I trong SREG đựơc đặt. Khi vi điều khiển AVR thoát ra khỏi một ngắt nó sẽ luôn trở về với chương trình chính và chấp hành lệnh kế tiếp trước khi có ngắt mới được xử lý.

2.2.10 Timer – Counter
Timer/Counter là các module độc lập với CPU. Chức năng chính của các bộ Timer/Counter, như tên gọi của chúng, là định thì (tạo ra một khoảng thời gian, đếm thời gian…) và đếm sự kiện. Trên các chip AVR, các bộ Timer/Counter còn có thêm chức năng tạo ra các xung điều rộng PWM (Pulse Width Modulation), ở một số dòng AVR, một số Timer/Counter còn được dùng như các bộ canh chỉnh thời gian (calibration) trong các ứng dụng thời gian thực. Các bộ Timer/Counter được chia theo độ rộng thanh ghi chứa giá trị định thời hay giá trị đếm của chúng, cụ thể trên chip Atmega8 có 2 bộ Timer 8 bit (Timer/Counter0 và Timer/Counter2) và 1 bộ 16 bit (Timer/Counter1). Chế độ hoạt động

20 The Hoanh

và phương pháp điều khiển của từng Timer/Counter cũng không hoàn toàn giống nhau, ví dụ ở chip Atmega8: - Timer/Counter0: Bộ định thời (timer/counter0) là một module định thời/đếm 8 bit, có các đặc điểm sau:  Bộ đếm một kênh  Xóa bộ định thời khi trong mode so sánh (tự động nạp)

PWM

 Tạo tần số  Bộ đếm sự kiện ngoài  Bộ chia tần 10 bit  Nguồn ngắt tràn bộ đếm và so sánh Sơ đồ cấu trúc của bộ định thời:

Hình 6: Sơ đồ cấu trúc bộ định thời

AVR Atmega8 có tích hợp bộ timer/counter. Ta bắt đầu phần này bằng sơ đồ khối sau:

21 The Hoanh

Hoạt động của bộ Timer/Couter

+ Mạch đếm lên làm thanh ghi TCNTn tăng 1 đơn vị mỗi khi có xung clkTn, khi đạt giá trị lớn nhất (8bit=255), cờ TOVn được set (logic 1) và bộ đếm tràn, giá trị bộ đến TCNTn trở về 00 và tiếp tục đếm. + Xung clkTn có thể được lựa chọn từ nhiều nguồn khác nhau. Khi chọn xung nội (system clock), Timer/Counter là một Timer. Khi chọn xung ngoài (thông qua chân Tn) Timer/Counter là Counter. Hoạt động này có thể diễn tả bằng giản đồ xung sau:

Hình 7: Giải đồ xung của bộ Timer/Couter Cũng giống như bộ timer/counter trong các vi điều khiển khác, chúng ta quan tâm đến 2 thanh ghi: Timer/Counter Control và Timer/Counter Value. Trong AVR, đó là thanh ghi TCCRn và TCNTn.

22 The Hoanh

Hình 8: Thanh ghi TCCRn và TCNTn Clock Select Bit Description

TCNT0 - Timer/C TCNT0 và OCR0 là các thanh ghi 8 bit. Các tín hiệu yêu cầu ngắt đều nằm trong thanh ghi TIFR. Các ngắt có thể được che bởi thanh ghi TIMSK. Bộ định thời có thể sử dụng xung clock nội thông qua bộ chia hoặc xung clock ngoài trên chân T0. Khối chọn xung clock điều khiển việc bộ định thời/bộ đếm sẽ dùng nguồn xung nào để tăng giá trị của nó. Ngõ ra của khối chọn xung clock được xem là xung clock của bộ định thời (clkT0). Thanh ghi OCR0 luôn được so sánh với giá trị của bộ định thời/bộ đếm. Kết quả so sánh có thể được sử dụng để tạo ra PWM hoặc biến đổi tần số ngõ ra tại chân OC0.

23 The Hoanh

- Timer/Counter1: sơ đồ khối và một số đặc điểm

Hình 9: Sơ đồ khối và một số đặc điểm Bộ định thời (timer/counter1) là một module định thời/đếm 16 bit, có các đặc điểm sau: • True 16-bit Design (i.e., allows 16-bit PWM) • 2 đơn vị ngõ vào so sánh độc lập(Two Independent Output Compare Units) • đôi thanh ghi so sánh ngõ ra đệm(Double Buffered Output Compare Registers) • 1 đơn vị chốt ngõ vào(One Input Capture Unit) • Bộ chống nhiễu lối vào(Input Capture Noise Canceler) • Xóa timer trong Compare Match (Clear Timer on Compare Match (Auto Reload)) • chống nhiễu sọc ngang(Glitch-free, Phase Correct Pulse Width Modulator (PWM) • Giá trị chu kỳ PWM • Bộ phát tần số chung • Bộ đếm sự kiện ngoài

24 The Hoanh

• 4 nguồn ngắt độc lập (TOV1, OCF1A, OCF1B, and ICF1) • Một số định nghĩa

BOTTOM Bộ đếm đạt tới BOTTOM khi co giá trị 0x0000 MAX Bộ đếm đạt tới MAXimum khi khi đạt giá trị 0xFFFF (decimal 65535). TOP Bộ đếm đạt tới TOP khi nó bằng với giá trị lớn nhất của chuỗi đếm. Giá trị này có thể được gán bởi các giá trị cố định : 0x00FF, 0x01FF, or 0x03FF,hoặc giá trị trong bộ nhớ của các thanh ghi OCR1A ,ICR1 . là bộ định thời, đếm đa năng 16 bit. Bộ Timer/Counter này có 5 chế độ hoạt động chính. Ngoài các chức năng thông thường, Timer/Counter1 còn được dùng để tạo ra xung điều rộng PWM dùng cho các mục đích điều khiển. Có thể tạo 2 tín hiệu PWM độc lập trên các chân OC1A (chân 15) và OC1B (chân 16) bằng Timer/Counter1. Các bộ Timer/Counter kiểu này được tích hợp thêm khá nhiều trong các chip AVR sau này, ví dụ Atmega128 có 2 bộ, Atmega2561 có 4 bộ… - Timer/Counter2: tuy là một module 8 bit như Timer/Counter0 nhưng Timer/Counter2 có đến 4 chế độ hoạt động như Timer/Counter1, ngoài ra nó nó còn được sử dụng như một module canh chỉnh thời gian cho các ứng dụng thời gian thực (chế độ asynchronous).

2.2.11 Các chế độ truy nhập địa chỉ AVR:
- Địa chỉ thanh ghi đơn trực tiếp: Ở chế độ này địa chỉ các thanh ghi được lấy trực tiếp từ vùng các thanh ghi (từ vùng 0 đến 31).

25 The Hoanh

Ví dụ:

COM Rd NEG Rd…

- Địa chỉ hai thanh ghi trực tiếp: Đây là chế độ mà trong một lệnh ALU truy nhập trực tiếp vào hai thanh ghi. Chế độ này hoàn toàn tương tự như chế độ trên. Ví dụ: ADD Rd, Rr … - Địa chỉ trực tiếp cổng vào ra: Trong đó địa chỉ toán hạng được chứa trong 6 bit cảu một từ lệnh là địa chỉ của thanh ghi nguồn hoặc đích. Ví dụ: Out DDRB, R16 In - Địa chỉ trực tiếp dữ liệu: R12, DDRB

- Địa chỉ của dữ liệt trong RAM được đưa trực tiếp vào lệnh Ví dụ: RDS R12,0x0fff STS 0x0fff,R11 - Địa chỉ dữ liệu gián tiếp cùng với dịch chuyển: Địa chỉ của toán hạng nguồn hoặc đích được trỏ bởi thanh ghi Y hoặc Z cộng thêm 1 chỉ số nào đó Ví dụ: LDD,Y + 10

- Địa chỉ gián tiếp dữ liệu:

26 The Hoanh

Đây là cách mà CPU nhập dữ liệu trong RAM thong qua thanh ghi X,Y,Z. Địa chỉ của dữ liệu được lưu trong thanh ghi này. Ví dụ: ST LD X,R11 R13,Y

- Địa chỉ dữ liệu gián tiếp cùng với tăng hoặc giảm con trỏ: Ví dụ: LD R17, X+ LD -Y,R14 … - Địa chỉ của hằng số trong bộ nhớ chương trình: Cách này chỉ sử dụng cho lệnh LPM: Đị chỉ cảu hằng số được lưu trong thanh ghi Z. Ví dụ: LDIR 30,0x07 ; dia chi truc tiep du lieu 0x07 LDI LPM - Địa chỉ bộ nhớ chương trình gián tiếp: Địa chỉ đoạn mã được trỏ bởi thanh ghi Z sử dung trong các lệnh IJMP, ICALL. Ví dụ: Label: LDI R29,high(label) LDI R28,low(label) R31,0xFF

ICALL

2.3 Vi điều khiển Atmega 8:
2.3.1 Sơ đồ vi điều khiển Atmega 8:

27 The Hoanh

Hình 10: Sơ đồ chân của Atmega 8.

28 The Hoanh

Hình 11: Sơ đồ khối của Atmega 8.

29 The Hoanh

ATMega 8 đónggóidạngPDIP28chân.Trongđócó23chânI/O. (in put/ out put) chia thành 3 Port: B,C,D; Mỗi một chân có thể đảmnhận nhiều vai trò. Cụ thể như sau: VCC (chân 7): Chân điện áp. GND (chân 8): Chần tiếp đất. Các cổng vào ra của Atmega 8 gồm có 3 PortB, PortC, PortD, • PortB( PB7…PB0) XTAL2/TOSC2 – Port B, Bit 7 XTAL2: Chân 2 dao động tạo clock. Sử dụng chân clock thạch anh,hoặc dao động thạch anh tần số thấp. Khi dùng chân làm dao động thì không thể làm chân nhập xuất được nữa. TOSC2: Chân 2 là dao dộng Timer. Nếu PB7 được dùng làm clock pin, DDB7, PORTB7 and PINB7 sẽ sẽ hiều là mức 0 XTAL1/TOSC1 – Port B, Bit 6 XTAL1: Chip clock Oscillator pin 1. TOSC1: Timer Oscillator pin 1. Nếu PB6 dùng làm chân clock, DDB6, PORTB6 and PINB6 sẽ hiều là mức 0.

30 The Hoanh

Hình 12: Chức năng PortB. SCK – Port B, Bit 5 SCK: Master Clock output, Slave Clock input pin for SPI channel. Khi SPI được kích hoạt là Slave, chân này được cấu hình là 1 chân ngõ vào bất chấp sự điều chỉnh từ DDB5. MISO – Port B, Bit 4 MISO: Master Data input, Slave Data output pin for SPI channel. Khi SPI được kích hoạt là Master, chân này được cấu hình là 1 chân ngõ vào bất chấp sự điều chỉnh từ DDB4. MOSI/OC2 – Port B, Bit 3 MOSI: SPI Master Data output, Slave Data input for SPI channel. Khi SPI được kích hoạt là Slave, chân này được cấu hình là 1 chân ngõ vào bất chấp sự điều chỉnh từ DDB3. Khi SPI được kích hoạt là Master, dữ liệu trực tiếp của chân này được điều khiển bởi DDB3. SS/OC1B – Port B, Bit 2 SS: Slave Select ngõ vào. Khi SPI được kích hoạt là Slave, chân này được cấu hình là 1 chân ngõ vào bất chấp sự điều chỉnh từ DDB2. OC1A – Port B, Bit 1

31 The Hoanh

OC1A, Output Compare Match output:Chân PB1 có thể xử lý như 1 ngõ ra bên ngoài Timer/Counter1 Compare Match A. ICP1 – Port B, Bit 0 ICP1 –chân giữ(chốt) ngõ vào : Chân PB0 có thể tác động làm 1 chân giữ cho Timer/Counter1. • PortC( PC6…PC0) RESET – Port C, Bit 6 RESET, Reset pin: Khi cầu chì RSTDISBL đã lập trình, chức năng của chân này là vào ra binh thường,và 1 phần sẽ phải dựa vào Power-on Reset và Brown-out Reset như là nguồn reset của nó. Nếu chân PC6 dùng là chân reset , DDC6, PORTC6 và PINC6 sẽ hiều là mức 0.

Hình 13: Chức năng PortC.

SCL/ADC5 – Port C, Bit 5 SCL, giao diện nối tiếp hai dây Xung nhịp: Khi bit TWEN trong TWCR set (one) để bật giao diện nối tiếp hai dây, pin PC5 bị ngắt từ port và trở thành chân Serial Clock I/O cho Two-wire Serial Interface. SDA/ADC4 – Port C, Bit 4

32 The Hoanh

SDA, Two-wire Serial Interface Data: When the TWEN bit in TWCR is set (one) to enable the Two-wire Serial Interface, pin PC4 is disconnected from the port and becomes the Serial Data I/O pin for the Two-wire Serial Interface. ADC3 – Port C, Bit 3 PC3 cũng có thể dùng là ADC input Channel 3. Chú ý là ADC input channel 3 dùng nguồn xoay chiều. ADC2 – Port C, Bit 2 PC2 cũng có thể dùng là ADC input Channel 2. Chú ý là ADC input channel 2 dùng nguồn xoay chiều. ADC1 – Port C, Bit 1 PC1 cũng có thể dùng là ADC input Channel 1. Chú ý là ADC input channel 1 dùng nguồn xoay chiều. ADC0 – Port C, Bit 0 PC0 cũng có thể dùng là ADC input Channel 0. Chú ý là ADC input channel 0 dùng nguồn xoay chiều • PortD (PD7-PD0)

Hình 14: Chức năng Port D. AIN1 – Port D, Bit 7 AIN1,bộ so sánh tương tự thụ động ngõ vào. Cấu hình chân của port là nhập vào với ngắt pull-up bên trong để tránh nhiễu từ port số với chức năng của bộ so sánh tương tự.

33 The Hoanh

AIN0 – Port D, Bit 6 AIN0,Bộ so sánh tương tự ngõ vao tích cực. Cấu hình chân của port là nhập vào với ngắt pull-up bên trong để tránh nhiễu từ port số với chức năng của bộ so sánh tương tự. T1 – Port D, Bit 5 T1, số lượng mã nguồn Timer/Counter1. XCK/T0 – Port D, Bit 4 XCK, USART xung nhịp ngoài. T0, số lượng mã nguồn Timer/Counter0. INT1 – Port D, Bit 3 INT1, Ngắt nguồn bên ngoài 1: Chân PD3 có thể làm chức năng như 1 nguồn ngắt ngoài. INT0 – Port D, Bit 2 INT0, Ngắt nguồn bên ngoài 0: Chân PD2 có thể làm chức năng như 1 nguồn ngắt ngoài. TXD – Port D, Bit 1 TXD, Truyền tải dữ liệu (chân dữ liệu ra của USART). Khi bộ truyền USART được kích hoạt ,chân này được cấu hình như là một ngõ ra bất kể giá trị của DDD1. RXD – Port D, Bit 0 RXD, Nhận dữ liệu (chân dữ liệu vào của USART). Khi bộ nhận USART được kích hoạt, chân này được cấu hình như là một ngõ vào bất kể giá trị của DDD0 Mô tả thanh ghi của port I/O The Port B Data Register – PORTB

The Port B Data Direction Register – DDRB

The Port B Input Pins Address – PINB

34 The Hoanh

The Port C Data Register – PORTC

The Port C Data Direction Register – DDRC

The Port C Input Pins Address – PINC

The Port D Data Register – PORTD

The Port D Data Direction Register – DDRD

The Port D Input Pins Address – PIND

Tóm lại: 1. Để đọc dữ liệu từ ngoài thì ta phải thực hiện các bước sau:

35 The Hoanh

 Đưa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORTx (hoặc bit n trong port) đó là đầu vào (xóa thanh ghi DDRx hoặc bit).  Sau đó kích hoạt điện trở pull-up bằng cách set thanh ghi PORTx ( bit).  Cuối cùng đọc dữ liệu từ địa chỉ PINxn (trong đó x: là cổng và n là bit). 2. Để đưa dữ liệu từ vi điều khiển ra các cổng cũng có các bước hoàn toàn tương tự. Ban đầu ta cũng phải định nghĩa đó là cổng ra bằng cách set bit tương ứng của cổng đó….và sau đó là ghi dữ liệu ra bit tương ứng của thanh ghi PORTx.

2.4 Giới thiệu về IC 74HC154
2.4.1 Giới thiều về IC 74HC154.
- IC 74HC154 là loại IC dùng để giải mã, giải đa hợp với các tính năng chính Giải đa hợp có 16 đường ngõ ra. Giả mã nhị phân 4 bít đầu vào thành 16 đường ngõ ra tương ứng. Hai ngõ vào cho phép khóa hoặc mở rộng chân của IC 74HC154.

2.4.2 Sơ đồ chân của IC 74HC154

36 The Hoanh

Hình 15: Sơ đồ chân của IC 74HC154.

Hình 16: Sơ đồ bên trong IC 74HC154

Chức năng các chân của IC 74HC154. Chân 24, 12 (VCC, GND) dùng để cấp nguồn cho IC hoạt động. Chân 18,19 (G1,G20 các ngõ vào cho phét IC hoạt động trong một thời điểm chỉ có 1 IC hoạt động, IC bị cấm hoạt động thì tất cả các ngõ ra đều ở mức logic cao.. Chân 23,22,21,20 (A,B,C,D) Các ngõ vào quy định trạn thái ngõ ra Chân 1-11, 13-15 (O0-O15) Các ngõ ra của IC.

37 The Hoanh

Tùy thuộc vào trạng thài của các đường địa chỉ mà ta có ngõ ra tương ứng, khi cả hai ngõ vào G1, G2 ở mức logic thấp thì IC hoạt động bình thường, tại một thời điểm chỉ có một ngõ ra ở mức logic thấp, tất cả các ngõ còn lại đểu ở mức cao.

2.4.3 Nguyên tắc hoạt động của IC 74HC154.

Hình 17: Bảng chứ năng của IC 74HC154. Dựa vào bảng trạng thái ta thấy: Chỉ cần chân G1,G2 ở trạng thái cấm (không cho phép IC hoạt động) thì tất cả ngõ ra của IC 74HC154 đều ở mức cao bất chấp trạng thái ở các chân địa chỉ (A,B,C,D), Chẳng hạn như khi chân G1 ở mưc logic cao thì tất cả các ngõ ra của IC đều ở mức logic cao bất chấp trạng thái của các chân cong lại như G2,A,B,C,D. Và khi chân G2 ở mức cao thì cũng tương tự như thế.

38 The Hoanh

Khi các đường địa chỉ vào từ 00h-07H thì mức logic thấp duy nhất ở ngõ ra sẽ di chuyển từ ngõ ra (00_07)

2.5 Ma trận led.
2.5.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 18: 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 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

39 The Hoanh

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

2.5.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. H H Hình 19: Tạo font chữ cho kí tự H H H H H H H H H H H H H H H H

Nhìn vào bảng trên ta thấy muốn hiển thị chữ R phải cấp nguồn cho các led trong từng cột như sau : Cột 5: L , H , H , L , L , L , H , L 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

40 The Hoanh

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.

2.5.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. B3: Cấp nguồn cho cột i

41 The Hoanh

-

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

Hình 20: Lưu đồ thuật toán cấp nguồn cho ma trận led 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

42 The Hoanh

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.

CHƯƠNG 3: THIẾT KẾ CHƯƠNG TRÌNH VÀ MÔ PHỎNG BẰNG PROTEUS
3.1 Sơ đồ khối và lưu đồ thuật toán

43 The Hoanh

Khối xử lý

Khối giải mã

Khối hiển Thị

Begin

Nguồi Nuôi
Khai báo biến, mảng ký tự

Hình 21: Sơ đồ khối Chưc năng, vai trò của tưng khối Định nghĩa
mảng ký tự

Khối xử lý: Đọc dữ liệu được lập trình sẵn cho vi điều khiển, xử lý dữ liều và đưa ra bên ngoài thông qua các chân trao đổi dữ liều.
Định nghĩa mảng quét vi điều khiển. Khối hiển Thị: Hiển thị thông tin nhận từ cột

Khối giải mã: Nhẫn dữ liều đầu vào từ vi điều khiển làm nhiệm vụ giải mã đưa ra ngoài.
Xử lý quét ký tự

Khôi nguồn: Cấp nguồn hoạt động cho hệ thống.

Đưa dữ liệu vào Atmega8

Đẩy dữ liệu ra LED ma trận

44 The Hoanh

Hình 22: Lưu đồ thuật toán:

45 The Hoanh

3.2 Sơ đồ ghép nối điều khiển biển quảng cáo.

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

46 The Hoanh

Hình 24: Khối hiển thị.

3.3 Code chương trình.
#include <mega8.h> #include <string.h> Unsigned char s[200]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0}; const char AA[]={248,36,34,36,248,0}; const char BB[]={254,146,146,146,108,0}; const char CC[]={124,130,130,130,68,0}; const char DD[]={254,130,130,130,124,0}; const char EE[]={254,146,146,146,146,0}; const char FF[]={254,18,18,18,18,0}; const char GG[]={124,130,146,146,116,0}; const char HH[]={254,16,16,16,254,0}; const char II[]={130,130,254,130,130,0};

47 The Hoanh

const char JJ[]={66,130,254,2,2,0}; const char KK[]={254,16,40,68,130,0}; const char LL[]={254,128,128,128,128,0}; const char MM[]={254,8,16,8,254,0}; const char NN[]={254,8,16,32,254,0}; const char OO[]={124,130,130,130,124,0}; const char PP[]={254,18,18,18,12,0}; const char QQ[]={124,130,162,66,188,0}; const char RR[]={254,18,50,82,140,0}; const char SS[]={76,146,146,146,100,0}; const char TT[]={2,2,254,2,2,0}; const char UU[]={126,128,128,128,126,0}; const char VV[]={62,64,128,64,62,0}; const char WW[]={254,32,16,32,254,0}; const char XX[]={198,40,16,40,198,0}; const char YY[]={6,8,240,8,6,0}; const char ZZ[]={194,162,146,138,134,0};

const char S0[]={124,130,130,130,124,0}; const char S1[]={136,132,254,128,128,0}; const char S2[]={242,146,146,146,158,0}; const char S3[]={146,146,146,146,254,0}; const char S4[]={30,16,16,16,254,0};

48 The Hoanh

const char S5[]={158,146,146,146,242,0}; const char S6[]={254,146,146,146,242,0}; const char S7[]={2,2,2,2,254,0}; const char S8[]={254,146,146,146,254,0}; const char S9[]={158,146,146,146,254,0};

unsigned char i,j; unsigned int n=1,k=0; char str[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,248,36,34,36,248,0,248,36,34,36,248,0,248,36,34,36,248,0,248,36,34,36,248,0,248,3 6,34,36,248,0}; unsigned char chu[]=" book new";

void chip(unsigned char t) //void select chip (select colunm) { if (t==1) { PORTC.0=0; PORTC.1=1; PORTC.2=1; } else if (t==2)

49 The Hoanh

{ PORTC.0=1; PORTC.1=0; PORTC.2=1; } else { PORTC=0xFF; } } void scan(void) { if (n==32) n=0; if (n<16) { chip(0); PORTD=n; chip(1); } else if (n<32) { chip(0); PORTD=(n-16);

50 The Hoanh

chip(2); } } void hienthi(void) { scan(); //PORTB=str[n+k]; PORTB=s[n+k]; } interrupt [TIM0_OVF] void timer0_ovf_isr(void) { TCNT0=0xDC; PORTB=0x00; n++; hienthi(); // Place your code here } // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer 1 value TCNT1H=0xF7; TCNT1L=0x03;

51 The Hoanh

for(i=0;i<strlen(chu)6;i++) { if (k<strlen(chu)*6) k++;

else k=0; } for (i=strlen(chu)6;i>0;i++) {if (k>0) k--; else k=strlen(chu)6; } // Place your code here } // Declare your global variables here

void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00;

52 The Hoanh

DDRB=0xFF; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out // State6=T State5=T State4=T State3=T State2=1 State1=1 State0=1 PORTC=0x07; DDRC=0x07; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTD=0x00; DDRD=0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 125.000 kHz TCCR0=0x03; TCNT0=0xDC; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 7.813 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon.

53 The Hoanh

// Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x05; TCNT1H=0xF7; TCNT1L=0x03; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;

// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00;

54 The Hoanh

TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x05; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00 // Global enable interrupts for (i=0;i<strlen(chu);i++) { switch (chu[i]) { case 'a': for (j=0;j<6;j++) s[i*6+j]=AA[j]; break; case 'b': for (j=0;j<6;j++) s[i*6+j]=BB[j]; break; case 'c': for (j=0;j<6;j++) s[i*6+j]=CC[j]; break; case 'd': for (j=0;j<6;j++) s[i*6+j]=DD[j]; break;

55 The Hoanh

case 'e': for (j=0;j<6;j++) s[i*6+j]=EE[j]; break; case 'f': for (j=0;j<6;j++) s[i*6+j]=FF[j]; break; case 'g': for (j=0;j<6;j++) s[i*6+j]=GG[j]; break; case 'h': for (j=0;j<6;j++) s[i*6+j]=HH[j]; break; case 'i': for (j=0;j<6;j++) s[i*6+j]=II[j]; break; case 'j': for (j=0;j<6;j++) s[i*6+j]=JJ[j]; break; case 'k': for (j=0;j<6;j++) s[i*6+j]=KK[j]; break; case 'l': for (j=0;j<6;j++) s[i*6+j]=LL[j]; break; case 'm': for (j=0;j<6;j++) s[i*6+j]=MM[j]; break; case 'n': for (j=0;j<6;j++) s[i*6+j]=NN[j]; break; case 'o': for (j=0;j<6;j++) s[i*6+j]=OO[j]; break; case 'p': for (j=0;j<6;j++) s[i*6+j]=PP[j]; break; case 'q': for (j=0;j<6;j++) s[i*6+j]=QQ[j]; break; case 'r': for (j=0;j<6;j++) s[i*6+j]=RR[j]; break; case 's': for (j=0;j<6;j++) s[i*6+j]=SS[j]; break; case 't': for (j=0;j<6;j++) s[i*6+j]=TT[j]; break; case 'u': for (j=0;j<6;j++) s[i*6+j]=UU[j]; break; case 'v': for (j=0;j<6;j++) s[i*6+j]=VV[j]; break; case 'w': for (j=0;j<6;j++) s[i*6+j]=WW[j]; break; case 'x': for (j=0;j<6;j++) s[i*6+j]=XX[j]; break; case 'y': for (j=0;j<6;j++) s[i*6+j]=YY[j]; break; case 'z': for (j=0;j<6;j++) s[i*6+j]=ZZ[j]; break;

56 The Hoanh

case '0': for (j=0;j<6;j++) s[i*6+j]=S0[j]; break; case '1': for (j=0;j<6;j++) s[i*6+j]=S1[j]; break; case '2': for (j=0;j<6;j++) s[i*6+j]=S2[j]; break; case '3': for (j=0;j<6;j++) s[i*6+j]=S3[j]; break; case '4': for (j=0;j<6;j++) s[i*6+j]=S4[j]; break; case '5': for (j=0;j<6;j++) s[i*6+j]=S5[j]; break; case '6': for (j=0;j<6;j++) s[i*6+j]=S6[j]; break; case '7': for (j=0;j<6;j++) s[i*6+j]=S7[j]; break; case '8': for (j=0;j<6;j++) s[i*6+j]=S8[j]; break; case '9': for (j=0;j<6;j++) s[i*6+j]=S9[j]; break; default: } } #asm("sei") break;

while (1) { // Place your code here

}; }

57 The Hoanh

KẾT LUẬN

58 The Hoanh

Đề tài làm biển quảng cáo tuy không phài là một đề tài mới và cũng không phải là một đề tài lớn nhứng khá thông dụng và tiện ích trong cuộc sống hàng ngày của chúng ta. Thông qua đề tài lần này em đã học được rất nhiều kiến thức bổ ích, và cũng đã rút ra được rất nhiều kinh nghiệm có giá trị. Kết quả đạt được: Tìm hiểu được cơ bản vi điều khiển AVR Atmega8, IC 74HC154, ma trận LED8x8. Thực hiện mô phỏng được biển quảng cáo cho cửa hang BOOK NEW Áp dụng ngôn ngữ lập trình C để viết chương trình điều khiển cho hệ thống. Hạn chế: Biển quảng cáo còn đơn giản, chưa được đẹp mắt, chưa có sản phẩm thất ứng dụng trong cuộc sống. Hướng phát triển: từ đề tài lần này có đã tạo cho em được những kiến thức cơ bản về thiết kế biển quảng cáo từ đó có thể áp dụng tạo ra được nhưng biển quảng cáo đa dạng phức tạp hơn. Và cũng là tiền đề để em có thể tạo ra được những sản phẩm thật sạu này ứng dụng nhiều hơn trong thực tế.

Tài liệu tham khảo
1. Nguyễn Trung Đồng – Bùi Thị Mai Hoa Kỹ thuật vi xử lý, Nhà xuất bản khoa học

và kỹ thuật. 2. Datasheet của chip AVR Atmega8, IC 74HC154 3. …… Website: 1. www.hocavr.com 2. www.dientuvietnam.net 3.www.tailieu.vn 4. www.google.com 5….

59 The Hoanh

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN

Sign up to vote on this title
UsefulNot useful