Giaotrinhavr

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 127

lOMoARcPSD|13723430

Giáo Trình Vi Điều Khiển ATmega 16 - Lâm Quang Chuyên

Triết học Mác- Lênin (Trường Đại học Công nghiệp TP.HCM)

Scan to open on Studocu

Studocu is not sponsored or endorsed by any college or university


Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)
lOMoARcPSD|13723430

BỘ CÔNG THƯƠNG
TRƯỜNG CAO ĐẲNG CÔNG THƯƠNG TP. HỒ CHÍ MINH
KHOA ĐIỆN – ĐIỆN TỬ

GIÁO TRÌNH

VI ĐIỀU KHIỂN

TÁC GIẢ: LÂM QUANG CHUYÊN

05 - 2014

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

MỤC LỤC
Mục lục ----------------------------------------------------------------------------------------- i
Lời mở đầu ------------------------------------------------------------------------------------- v
Danh mục hình -------------------------------------------------------------------------------- vi
Danh mục bảng -------------------------------------------------------------------------------- x
Bảng viết tắt ----------------------------------------------------------------------------------- xi
Thuật ngữ -------------------------------------------------------------------------------------- xii
CHƯƠNG 1. GIỚI THIỆU VỀ VI ĐIỀU KHIỂN
1.1 Ôn tập các cổng logic và hệ thống đếm ------------------------------------------ 2
1.1.1 Các cổng logic ----------------------------------------------------------------------- 2
1.1.2 Các ký hiệu logic khác ------------------------------------------------------------- 3
1.1.3 Các hệ thống số ---------------------------------------------------------------------- 3
1.1.4 Chuyển đổi giữa các hệ thống số-------------------------------------------------- 4
1.1.4.1 Đổi ra nhị phân ---------------------------------------------------------------------- 4
1.1.4.2 Đổi ra bát phân ---------------------------------------------------------------------- 4
1.1.4.3 Đổi ra thập phân --------------------------------------------------------------------- 4
1.14.4 Đổi ra thập lục phân ---------------------------------------------------------------- 5
1.1.5 Bài tập ví dụ ------------------------------------------------------------------------- 5
1.2 Khái niệm về vi điều khiển -------------------------------------------------------- 6
1.2.1 Khái niệm ---------------------------------------------------------------------------- 6
1.2.1.1 Vi xử lý ------------------------------------------------------------------------------- 6
1.2.1.2 Vi điều khiển------------------------------------------------------------------------- 6
1.2.2 Chức năng của vi điều khiển atmega16 ------------------------------------------ 6
1.2.2.1 Sơ đồ chân của atmega16 ---------------------------------------------------------- 6
1.2.2.2 Chức năng của atmega16----------------------------------------------------------- 7
1.2.3 Bài tập ví dụ ------------------------------------------------------------------------- 8
1.3 Ngôn ngữ lập trình C trong phần mềm Codevision ---------------------------- 8
1.3.1 Một số lưu ý khi viết chương trình Codevision --------------------------------- 8
1.3.2 Các loại biến và khai báo ---------------------------------------------------------- 8
1.3.2.1 Khai báo biến ------------------------------------------------------------------------ 8

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

1.3.2.2 Định nghĩa hằng số ----------------------------------------------------------------- 8


1.3.2.3 Các loại biến ------------------------------------------------------------------------- 8
1.3.3 Các hàm logic------------------------------------------------------------------------ 9
1.3.4 Cấu trúc của một chương trình trên Codevision -------------------------------- 10
1.3.5 Các từ khóa trong chương trình Codevision ------------------------------------- 11
1.3.6 Câu lệnh và lưu đồ giải thuật ------------------------------------------------------ 11
1.3.7 Cấu trúc lưu đồ giải thuật ---------------------------------------------------------- 12
1.3.7.1 Các kí hiệu --------------------------------------------------------------------------- 12
1.3.7.2 Bài tập ví dụ ------------------------------------------------------------------------- 13
1.4 Câu hỏi ôn tập hết chương --------------------------------------------------------- 14
CHƯƠNG 2. HOẠT ĐỘNG I/O
2.1 Giới thiệu ----------------------------------------------------------------------------- 18
2.2 Các thanh ghi liên quan ------------------------------------------------------------ 18
2.2.1 Thanh ghi DDRxn------------------------------------------------------------------- 18
2.2.2 Thanh ghi PORTxn ----------------------------------------------------------------- 18
2.2.3 Thanh ghi PINxn -------------------------------------------------------------------- 18
2.2.4 Bài tập ví dụ ------------------------------------------------------------------------- 19
2.3 Các chức năng khác của các PORT----------------------------------------------- 21
2.3.1 Chức năng khác trên PORTA ----------------------------------------------------- 21
2.3.2 Chức năng khác trên PORTB------------------------------------------------------ 21
2.3.3 Chức năng khác trên PORTC------------------------------------------------------ 22
2.3.4 Chức năng khác trên PORTD ----------------------------------------------------- 22
2.3.5 Bài tập ví dụ ------------------------------------------------------------------------- 22
2.4 Xuất nhập dữ liệu trên các PORT ------------------------------------------------- 23
2.4.1 Xuất dữ liệu trên các chân của PORT -------------------------------------------- 23
2.4.2 Xuất dữ liệu ra PORT -------------------------------------------------------------- 23
2.4.3 Kiểm tra các chân trên PORT ----------------------------------------------------- 23
2.4.4 Đọc dữ liệu từ PORT --------------------------------------------------------------- 24
2.4.5 Kiểm tra toàn PORT ---------------------------------------------------------------- 24
2.4.6 Bài tập ví dụ ------------------------------------------------------------------------- 24
2.5 Led đơn và led 7 đoạn -------------------------------------------------------------- 26
2.5.1 Led đơn ------------------------------------------------------------------------------- 26
ii

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

2.5.2 Led 7 đoạn --------------------------------------------------------------------------- 27


2.5.3 Led Ma trận -------------------------------------------------------------------------- 28
2.5.4 Bài tập ví dụ ------------------------------------------------------------------------- 28
2.6 Câu hỏi ôn tập hết chương --------------------------------------------------------- 29
CHƯƠNG 3 HOẠT ĐỘNG NGẮT TRONG ATMEGA16
3.1 Giới thiệu hoạt động ngắt ---------------------------------------------------------- 32
3.2 Các loại ngắt ------------------------------------------------------------------------- 32
3.2.1 Ngắt ngoài ---------------------------------------------------------------------------- 33
3.2.2 Ngắt timer ---------------------------------------------------------------------------- 34
3.2.3 Ngắt ADC, SPI, TWI, AC --------------------------------------------------------- 34
3.2.4 Bài tập ví dụ ------------------------------------------------------------------------- 34
3.3 Câu hỏi ôn tập hết chương --------------------------------------------------------- 37
CHƯƠNG 4 HOẠT ĐỘNG TIMER – COUNTER
4.1 Giới thiệu ----------------------------------------------------------------------------- 39
4.2 Các thanh ghi liên quan ------------------------------------------------------------ 40
4.2.1 Thanh ghi TCCRn------------------------------------------------------------------- 40
4.2.2 Thanh ghi TCNTn------------------------------------------------------------------- 42
4.2.3 Thanh ghi OCRn -------------------------------------------------------------------- 42
4.2.4 Thanh ghi TIMSK------------------------------------------------------------------- 42
4.2.5 Thanh ghi TIFR --------------------------------------------------------------------- 42
4.3 Các chế độ hoạt động của TIMER/COUNTER --------------------------------- 43
4.3.1 Chế độ normal ----------------------------------------------------------------------- 43
4.3.2 Chế độ CTC -------------------------------------------------------------------------- 45
4.3.3 Chế độ PWM, Phase correct ------------------------------------------------------- 46
4.3.4 Chế độ Fast PWM ------------------------------------------------------------------- 47
4.3.5 Bài tập ví dụ ------------------------------------------------------------------------- 48
4.4 Câu hỏi ôn tập hết chương --------------------------------------------------------- 49
CHƯƠNG 5 HOẠT ĐỘNG AC
5.1 Giới thiệu ----------------------------------------------------------------------------- 52
5.2 Các thanh ghi liên quan ------------------------------------------------------------ 52
5.2.1 Thanh ghi SFIOR ------------------------------------------------------------------- 53
5.2.2 Thanh ghi ADCSRA ---------------------------------------------------------------- 53
iii

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

5.2.3 Thanh ghi ACSR -------------------------------------------------------------------- 54


5.2.4 Bài tập ví dụ ------------------------------------------------------------------------- 55
5.3 Câu hỏi ôn tập hết chương --------------------------------------------------------- 56
CHƯƠNG 6 HOẠT ĐỘNG ADC
6.1 Giới thiệu ----------------------------------------------------------------------------- 58
6.1.1 Giới thiệu ----------------------------------------------------------------------------- 58
6.1.2 Bài tập ví dụ ------------------------------------------------------------------------- 59
6.2 Các thanh ghi liên quan ------------------------------------------------------------ 60
6.2.1 Thanh ghi ADMUX----------------------------------------------------------------- 60
6.2.2 Thanh ghi ADCSRA ---------------------------------------------------------------- 63
6.2.3 Thanh ghi SFIOR ------------------------------------------------------------------- 65
6.3 Bài tập ví dụ ------------------------------------------------------------------------- 66
6.4 Câu hỏi ôn tập hết chương --------------------------------------------------------- 68
CHƯƠNG 7 HOẠT ĐỘNG USART
7.1 Giới thiệu ----------------------------------------------------------------------------- 72
7.1.1 Hoạt động đồng bộ ------------------------------------------------------------------ 72
7.1.2 Hoạt động bất đồng bộ ------------------------------------------------------------- 72
7.1.3 Đặc tính giao tiếp USART --------------------------------------------------------- 73
7.2 Các thanh ghi liên quan ------------------------------------------------------------ 73
7.2.1 Thanh ghi UDR---------------------------------------------------------------------- 73
7.2.2 Thanh ghi UCSRA ------------------------------------------------------------------ 73
7.2.3 Thanh ghi UCSRB ------------------------------------------------------------------ 74
7.2.4 Thanh ghi UCSRC ------------------------------------------------------------------ 75
7.2.5 Thanh ghi UBRRL và UBRRH --------------------------------------------------- 77
7.3 Các bước thực hiện cài đặc -------------------------------------------------------- 79
7.3.1 Quá trình nhận dữ liệu -------------------------------------------------------------- 80
7.3.2 Quá trình truyền dữ liệu ------------------------------------------------------------ 80
7.3.3 Các thời điểm xảy ra ngắt USART ----------------------------------------------- 81
7.4 Bài tập ví dụ ------------------------------------------------------------------------- 81
7.5 Câu hỏi ôn tập hết chương --------------------------------------------------------- 87
CHƯƠNG 8 HOẠT ĐỘNG SPI
8.1 Giới thiệu ----------------------------------------------------------------------------- 89
iv

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

8.1.1 Giới thiệu chung --------------------------------------------------------------------- 89


8.1.2 Chức năng các chân trong hoạt động SPI ---------------------------------------- 89
8.1.2.1 Chân SCK ---------------------------------------------------------------------------- 89
8.1.2.2 Chân SS------------------------------------------------------------------------------- 90
8.1.2.3 Chân MOSI -------------------------------------------------------------------------- 90
8.1.2.4 Chân MISO -------------------------------------------------------------------------- 90
8.2 Các thanh ghi liên quan ------------------------------------------------------------ 90
8.2.1 Thanh ghi SPCR--------------------------------------------------------------------- 90
8.2.2 Thanh ghi SPSR --------------------------------------------------------------------- 91
8.2.3 Thanh ghi SPDR -------------------------------------------------------------------- 92
8.3 Các chế độ hoạt động --------------------------------------------------------------- 92
8.4 Bài tập ví dụ ------------------------------------------------------------------------- 93
8.5 Câu hỏi ôn tập hết chương --------------------------------------------------------- 96
CHƯƠNG 9 HOẠT ĐỘNG I2C
9.1 Giới thiệu ----------------------------------------------------------------------------- 98
9.1.1 Đặc tính ------------------------------------------------------------------------------- 98
9.1.2 Thuật ngữ----------------------------------------------------------------------------- 98
9.2 Nguyên lý hoạt động ---------------------------------------------------------------- 99
9.3 Cách thanh ghi liên quan ---------------------------------------------------------- 101
9.3.1 Thanh ghi TWBR ------------------------------------------------------------------ 101
9.3.2 Thanh ghi TWCR ------------------------------------------------------------------ 101
9.3.3 Thanh ghi TWSR------------------------------------------------------------------- 102
9.3.4 Thanh ghi TWDR ------------------------------------------------------------------ 102
9.3.5 Thanh ghi TWAR ------------------------------------------------------------------ 103
9.4 Bài tập ví dụ ------------------------------------------------------------------------ 103
9.5 Câu hỏi ôn tập hết chương -------------------------------------------------------- 104
Phụ lục 1 Các chuẩn giao tiếp ------------------------------------------------------------- 106
Phụ lục 2 IC thời gian thực DS1307------------------------------------------------------ 107
Phụ lục 3 Điều khiển nhiều led ma trận -------------------------------------------------- 108
Tài liệu tham khảo --------------------------------------------------------------------------- 114

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

LỜI MỞ ĐẦU
Hiện nay có rất nhiều tài liệu, giáo trình viết về họ vi xử lý, vi điều khiển, tuy
nhiên giáo trình về vi điều khiển cho họ AVR cụ thể là Atmega16 hiện nay chưa
có Trường hay nhà xuất bản viết về tài liệu này.

Nội dung của tài liệu này trình bày cấu trúc bên trong của atmega16, cách thiết
lập bộ nhớ, thanh ghi cho từng module: timer/counter, ADC, I2C…, qua đó sinh
viên có thể dễ dàng đọc các tài liệu kỹ thuật khác.

Nội dung chương trình được trình bày khá đầy đủ với các bài tập kèm theo
mỗi chương giúp sinh viên có thể tự học tự nghiên cứu tài liệu ở nhà, các bài tập
thể hiện hầu hết các chức năng của vi điều khiển, đòi hỏi sinh viên phải hiểu được
lý thuyết mới có thể làm được các bài tập này.

Sau khi học xong giáo trình này sinh viên có thể viết chương trình điều khiển
bằng ngôn ngữ C, cài đặc được các thông số cho từng module, và dễ dàng đọc
được các tài liệu kỹ thuật khác…

Đây là lần đầu tiên tác giả viết giáo trình phục vụ giảng dạy, nên không thể
tránh những sai sót, rất mong nhận được sự đóng góp của quí Thầy Cô và đồng
nghiệp.

Xin chân thành cảm ơn.

vi

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

DANH MỤC HÌNH


Hình 1.1 Cổng NOT ------------------------------------------------------------------------- 2
Hình 1.2 Cổng OR --------------------------------------------------------------------------- 2
Hình 1.3 Cổng AND ------------------------------------------------------------------------- 2
Hình 1.4 Cổng NOR ------------------------------------------------------------------------- 2
Hình 1.5 Cổng NAND----------------------------------------------------------------------- 2
Hình 1.6 Cổng XOR ------------------------------------------------------------------------- 2
Hình 1.7 Bộ khóa kênh ---------------------------------------------------------------------- 3
Hình 1.8 Bộ chọn kênh ---------------------------------------------------------------------- 3
Hình 1.9 Sơ đồ linh kiện đâm xuyên ------------------------------------------------------ 6
Hình 1.10 Sơ đồ linh kiện dán-------------------------------------------------------------- 6
Hình 1.11 Cấu trúc một chương trình trong Codevision ------------------------------- 10
Hình 1.12 Lưu đồ giải thuật lệnh while --------------------------------------------------- 11
Hình 1.13 Lưu đồ giải thuật lệnh while not ---------------------------------------------- 11
Hình 1.14 Lưu đồ giải thuật lệnh do while ----------------------------------------------- 11
Hình 1.15 Lưu đồ giải thuật lệnh if -------------------------------------------------------- 12
Hình 1.16 Lưu đồ giải thuật lệnh if… else ----------------------------------------------- 12
Hình 1.17 Lưu đồ giải thuật lệnh switch… case ----------------------------------------- 12
Hình 1.18 Lưu đồ giải thuật đếm sản phẩm ---------------------------------------------- 13
Hình 1.19 Lưu đồ cộng từ 1 đến x --------------------------------------------------------- 14
Hình 2.1 Khai báo vào ra của PORTB ---------------------------------------------------- 18
Hình 2.2 Chân 33 có điện trở kéo lên ----------------------------------------------------- 19
Hình 2.3 Chân 33 có được nối mass ------------------------------------------------------- 19
Hình 2.4 Điều khiển led đơn trực tiếp ----------------------------------------------------- 26
Hình 2.5 Điều khiển led đơn có nguồn cung cấp --------------------------------------- ` 27
Hình 2.6 Anot chung ------------------------------------------------------------------------ 27
Hình 2.7 Katot chung ------------------------------------------------------------------------ 27
Hình 2.8 Kiểu mắc Anot chung với LSB nối chân a ------------------------------------ 27
Hình 2.9 Kiểu mắc Anot chung với MSB nối chân a ----------------------------------- 27
Hình 2.10 Kiểu mắc Katot chung với LSB nối chân a ---------------------------------- 28
Hình 2.11 Kiểu mắc Katot chung với MSB nối chân a --------------------------------- 28
vii

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Hình 2.12 Sơ đồ chân Led ma trận 8x8x2 (8 hàng, 8 cột, 2 màu) --------------------- 28
Hình 3.1 Chương trình chính, chương trình con và chương trình ngắt --------------- 32
Hình 3.2 Dạng xung trên nút nhấn --------------------------------------------------------- 33
Hình 3.3 Sơ đồ nguyên lý mạch đếm sản phẩm sử dụng ngắt ngoài ------------------ 34
Hình 4.1 Sơ đồ khối của bộ timer/ Counter ---------------------------------------------- 39
Hình 4.2 Thanh ghi TCCR0 ---------------------------------------------------------------- 40
Hình 4.3 Bộ chia và bộ chọn kênh cho hoạt động timer/counter ---------------------- 41
Hình 4.4 Thanh ghi TIMSK ---------------------------------------------------------------- 41
Hình 4.5 Thanh ghi TIFR ------------------------------------------------------------------- 42
Hình 4.6 Giản đồ thời gian trong hoạt động NORMAL -------------------------------- 43
Hình 4.7 Sơ đồ nguyên lý của mạch định thời ------------------------------------------- 43
Hình 4.8 Giản đồ thời gian trong hoạt động CTC --------------------------------------- 45
Hình 4.9 Giản đồ thời gian trong hoạt động PWM – PHASE CORRECT----------- 46
Hình 4.10 Giản đồ thời gian cho hoạt động FAST PWM ------------------------------ 48
Hình 4.11 Dạng xung cho tần số 5Khz---------------------------------------------------- 49
Hình 5.1 Sơ đồ khối hoạt động của bộ so sánh ------------------------------------------ 52
Hình 5.2 Thanh ghi SFIOR ----------------------------------------------------------------- 53
Hình 5.3 Thanh ghi ADCSRA ------------------------------------------------------------- 53
Hình 5.4 Thanh ghi ACSR ------------------------------------------------------------------ 54
Hình 5.5 Bài tập ví dụ 1 --------------------------------------------------------------------- 55
Hình 6.1 Tín hiệu tương tự và tín hiệu số ------------------------------------------------ 59
Hình 6.2 Thanh ghi ADMUX -------------------------------------------------------------- 60
Hình 6.3 Thanh ghi dữ liệu ADC khi ADLAR = 0-------------------------------------- 60
Hình 6.4 Thanh ghi dữ liệu ADC khi ADLAR = 1-------------------------------------- 60
Hình 6.5 Thanh ghi ADCSRA ------------------------------------------------------------- 62
Hình 6.6 Bộ chia trong hoạt động ADC -------------------------------------------------- 63
Hình 6.7 Giản đồ thời gian cho lần biến đổi ADC đầu tiên ---------------------------- 63
Hình 6.8 Giản đồ thời gian cho lần biến đổi ADC thứ 2 ------------------------------- 63
Hình 6.9 Thanh ghi SFIOR ----------------------------------------------------------------- 64
Hình 6.10 Các tác nhân kích hoạt ADC--------------------------------------------------- 64
Hình 7.1 Khung dữ liệu giao tiếp nối tiếp ------------------------------------------------ 72
Hình 7.2 Thanh ghi UDR ------------------------------------------------------------------- 73

viii

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Hình 7.3 Thanh ghi UCSRA --------------------------------------------------------------- 73


Hình 7.4 Thanh ghi UCSRB ---------------------------------------------------------------- 74
Hình 7.5 Thanh ghi UCSRC ---------------------------------------------------------------- 75
Hình 7.6 Dữ liệu sẽ được thay đổi tại cạnh lên và lấy mẫu tại cạnh xuống. --------- 77
Hình 7.7 Dữ liệu sẽ được thay đổi tại cạnh xuống và lấy mẫu tại cạnh lên. --------- 77
Hình 7.8 Thanh ghi UBRRL và UBRRH ------------------------------------------------- 77
Hình 7.9 Mạch giao tiếp giữa 2 vi điểu khiển theo kiểu nói tiếp ---------------------- 86
Hình 7.10 Bài tập ví dụ giao tiếp nối tiếp------------------------------------------------- 87
Hình 8.1 Sơ đồ giao tiếp giữa Master và Slave ------------------------------------------ 89
Hình 8.2 Thanh ghi SPCR ------------------------------------------------------------------ 90
Hình 8.3 Thanh ghi SPSR ------------------------------------------------------------------ 91
Hình 8.4 Thanh ghi SPDR ------------------------------------------------------------------ 92
Hình 8.5 Thời điểm lấy mẫu khi bit CPHA = 0 ------------------------------------------ 92
Hình 8.6 Thời điểm lấy mẫu khi bit CPHA = 1 ------------------------------------------ 93
Hình 9.1 Hình vẽ giao tiếp theo nghi thức I2C ------------------------------------------ 98
Hình 9.2 Định dạng truyền dữ liệu theo nghi thức I2C --------------------------------- 99
Hình 9.3 Định dạng Stop bit và Start bit-------------------------------------------------- 99
Hình 9.4 Chuyển đổi dữ liệu tại mức thấp của chân SCL ------------------------------ 99
Hình 9.5 Dạng sóng trên chân SDA và SCL --------------------------------------------- 99
Hình 9.6 Lưu đồ giải thuật gởi dữ liệu từ Master đến Slaver -------------------------- 100
Hình 9.7 Thanh ghi tạo tần số TWBR ---------------------------------------------------- 101
Hình 9.8 Thanh ghi điều khiển TWCR --------------------------------------------------- 101
Hình 9.9 Thanh ghi trạng thái TWSR ----------------------------------------------------- 102
Hình 9.10 Thanh ghi dữ liệu TWDR ------------------------------------------------------ 103
Hình 9.11 Thanh ghi địa chỉ TWAR ------------------------------------------------------ 103
Hình 9.12 Sơ đồ giao tiếp I2C giữa các thiết bị ----------------------------------------- 104
Hình 10.1 Sơ đồ chân DS1307 ------------------------------------------------------------- 107
Hình 10.2 Thanh ghi điều khiển Control Register -------------------------------------- 107
Hình 10.3 Sơ đồ nguyên lý kết nối DS1307 với LCD4x20 ---------------------------- 108
Hình 10.4 Sơ đồ chân IC NC6B595 ------------------------------------------------------- 109
Hình 10.5 Sơ đồ nguyên lý hoạt động IC NC6B595 ------------------------------------ 110
Hình 10.6 Sơ đồ nguyên lý điều khiển 8 led ma trận ----------------------------------- 111

ix

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

DANH MỤC BẢNG


Bảng 1.1 Biến đổi giữa các hệ số với nhau ----------------------------------------------- 3
Bảng 1.2 Các biến trong Codevision ------------------------------------------------------ 9
Bảng 1.3 Các hàm logic --------------------------------------------------------------------- 10
Bảng 1.4 Các từ khóa trong codevision --------------------------------------------------- 11
Bảng 1.5 Các kí hiệu dùng cho lưu đồ giải thuật ---------------------------------------- 13
Bảng 2.1 Chức năng khác của PORTA --------------------------------------------------- 21
Bảng 2.2 Chức năng khác của PORTA --------------------------------------------------- 21
Bảng 2.3 Chức năng khác của PORTC --------------------------------------------------- 22
Bảng 2.4 Chức năng khác của PORTD --------------------------------------------------- 22
Bảng 2.5 Các phương pháp xuất dữ liệu (điều khiển) ra các chân -------------------- 23
Bảng 2.6 Các phương pháp xuất dữ liệu (điều khiển) trên các PORT ---------------- 23
Bảng 3.1 Các nguồn ngắt của atmega16 -------------------------------------------------- 33
Bảng 4.1 Các mode làm việc của bộ timer/counter0 ------------------------------------ 41
Bảng 4.2 Chọn nguồn xung cho bộ timer/counter --------------------------------------- 42
Bảng 4.3 Ngõ ra OC0 trong hoạt động CTC --------------------------------------------- 46
Bảng 4.4 Ngõ ra OC0 trong hoạt động PWM – PHASE CORRECT----------------- 47
Bảng 4.5 Ngõ ra oc0 trong hoạt động FAST PWM ------------------------------------- 48
Bảng 5.1 Chọn chân điện áp ngõ vào ----------------------------------------------------- 53
Bảng 5.2 Cài đặt ngắt trong hoạt động AC ----------------------------------------------- 54
Bảng 6.1 Chọn điện áp tham chiếu -------------------------------------------------------- 60
Bảng 6.2 Các chân ngõ vào và độ lợi ----------------------------------------------------- 61
Bảng 6.3 Chọn tần suất lấy mẫu ----------------------------------------------------------- 62
Bảng 6.4 Các nguồn kích hoạt ADC ------------------------------------------------------ 64
Bảng 7.1 Chế độ làm việc giao tiếp nối tiếp --------------------------------------------- 75
Bảng 7.2 Cài đặc bit Parity ----------------------------------------------------------------- 76
Bảng 7.3 Cài đặc Stop bit ------------------------------------------------------------------- 76
Bảng 7.4 Cài đặc số bit dữ liệu ------------------------------------------------------------- 76
Bảng 7.5 Cài đặc bit UCPOL--------------------------------------------------------------- 76
Bảng 7.6 Chọn tốc độ baud ở các tần số từ 1Mhz đến 2Mhz -------------------------- 78
Bảng 7.7 Chọn tốc độ baud ở các tần số từ 3Mhz đến 7Mhz -------------------------- 78
x

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Bảng 7.8 Chọn tốc độ baud ở các tần số từ 8Mhz đến 14Mhz------------------------- 79
Bảng 7.9 Chọn tốc độ baud ở các tần số 16Mhz đến 20Mhz -------------------------- 79
Bảng 8.1 Mối quan hệ giữa chân sck và tần số dao động ------------------------------ 91
Bảng 8.2 Các thời điểm lấy mẫu nhận dữ liệu ------------------------------------------- 92
Bảng 10.1 Bảng so sánh các chuẩn giao tiếp --------------------------------------------- 106

xi

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

BẢNG VIẾT TẮT


Stt Chữ viết tắt Chữ đầy đủ Ý nghĩa
1 ADC Analog to Digiatal Convert Biến đổi tín hiệu tương tự
sang tín hiệu số
2 VĐK Vi điều khiển
3 RTC Real-time clock Đồng hồ thời gian thực
4 PWM Pulse Width Modulation Điều chế độ rộng xung

xii

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

THUẬT NGỮ
1. ADC: Analog to Digital Convert
2. Asynchronous: Bất đồng bộ
3. Even: Chẵn
4. Frame Format: Khung dữ liệu số bit được truyền trong 1 lần (5,6,7,8 hoặc 9 bit)
5. Full Duplex: Truyền dữ liệu dạng song công 2 chiều
6. I/O: Input, Output: Vào ra
7. Master: có nhiệm vụ khởi tạo và kết thúc hoạt động truyền dữ liệu, đồng thời nó
cũng tạo xung clock trên chân SCL trong hoạt động I2C
8. Odd: Lẻ
9. Parity: Kiểm tra chẵn lẻ
10. Receiver: Nhận dữ liệu từ đường truyền bus
11. Start bit: Bit khởi đầu
12. Stop bit: Bit kết thúc
13. Synchronous: Đồng bộ
14. Slave: truyền và nhận dữ liệu theo yêu cầu của Master.
15. Toggle: Đảo trạng thái
16. Transmiter: xuất dữ liệu ra đường truyền bus
17. USART: Giao tiếp nối tiếp đồng bộ và bất đồng bộ

xiii

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16

Chương 1

GIỚI THIỆU VỀ
VI ĐIỀU KHIỂN

- 1/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


1.1. ÔN TẬP CÁC CỔNG LOGIC VÀ HỆ THỐNG ĐẾM
1.1.1. Các cổng logic

NOT (inverter) OR (any high = high, else low)


Input = 1 Output = 0 Input 1 Input 2 Output
Input = 0 Output = 1 0 0 0
0 1 1
7404 1 0 1
1 1 1
Hình 1.1 Cổng NOT

7432

Hình 1.2 Cổng OR

AND (all high = high, else low) NOR (any high = low, else high)
Input 1 Input 2 Output Input 1 Input 2 Output
0 0 0 0 0 1
0 1 0 0 1 0
1 0 0 1 0 0
1 1 1 1 1 0

IC 7408 7402

Hình 1.3 Cổng AND Hình 1.4 Cổng NOR

NAND (all high = low, else high) XOR (different = high, same = low)
Input 1 Input 2 Output Input 1 Input 2 Output
0 0 1 0 0 0
0 1 1 0 1 1
1 0 1 1 0 1
1 1 0 1 1 0

IC 7400 7486

Hình 1.5 Cổng NAND Hình 1.6 Cổng XOR

- 2/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


1.1.2. Các kí hiệu logic khác

<=>
Y
0 A=B
1 A<>B
Y
0 A<>B
1 A=B

Hình 1.7 Bộ khóa kênh

Bộ chọn
WDP0 WDP1 WDP2 Y
0 0 0 OSC/16
0 0 1 OSC/32
0 1 0 OSC/64
0 1 1 OSC/128
1 0 0 OSC/256
1 0 1 OSC/512
1 1 0 OSC/1024
1 1 1 OSC/2048

Hình 1.8 Bộ chọn kênh


1.1.3. Các hệ thống số
Stt Nhị phân Bát phân Thập phân Thập lục phân
1 0000 00 0 0
2 0001 01 1 1
3 0010 02 2 2
4 0011 03 3 3
5 0100 04 4 4
6 0101 05 5 5
7 0110 06 6 6
8 0111 07 7 7
9 1000 10 8 8
10 1001 11 9 9
11 1010 12 10 A
12 1011 13 11 B
13 1100 14 12 C
14 1101 15 13 D
15 1110 16 14 E
16 1111 17 15 F
Bảng 1.1 Biến đổi giữa các hệ số với nhau

- 3/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


1.1.4. Chuyển đổi giữa các hệ thống số:
1.1.4.1 Đổi ra nhị phân
1.1.4.1.1 Từ bát phân: Tra bảng biến đổi theo 3 số
(25347)8 = (10.101.011.100.111)2
1.1.4.1.2 Từ thập phân: Chi cho 2 lấy số dư bắt đầu từ dưới lên trên
(2011)10 = (11111011011)2
2011 : 2 = 1005 dư 1
1005 : 2 = 502 dư 1
502 : 2 = 251 dư 0
251 : 2 = 125 dư 1
125 : 2 = 62 dư 1
62 : 2 = 31 dư 0
31 : 2 = 15 dư 1
15 :2=7 dư 1
7 :2=3 dư 1
3 :2=1 dư 1
1 :2=0 dư 1
1.1.4.1.3 Từ thập lục phân: Tra bảng biến đổi theo 4 số
(1A3C)16 = (1-1010-0011-1100)2
1.1.4.2 Đổi ra bát phân
1.1.4.2.1 Từ nhị phân: Tra bảng 3 số nhị phân thành 1 số bát phân
(10110101011)2 = (2653)8
1.1.4.2.2 Từ thập phân: Chia cho 8 lấy số dư từ dưới lên trên
(2011)10 = (3733)8
2011 : 8 = 251 dư 3
251 : 8 = 31 dư 3
31 :8=3 dư 7
3 :8=0 dư 3
1.1.4.2.3 Từ thập lục phân: Tra bảng 4 số nhị phân thành 1 số thập lục phân
(AB4C)16 = (1010-1011-0100-1100)2 = (1-010-101-101-110-100)2 = (125564)2
1.1.4.3 Đổi ra thập phân
1.1.4.3.1 Từ nhị phân: lấy số mũ theo cơ số 2

- 4/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


(11010010)2 = 1*27+1*26+1*24+1*21 = (210)10
1.1.4.3.2 Từ bát phân: Lấy số mũ theo cơ số 8
(2745)8 = 2*83+7*82*4*81*5*80 = (1509)10
1.1.4.3.3 Từ thập lục phân: Lấy số mũ theo cơ số 16
(12ABC)16 = 1*164 + 2*163 + 10*162 + 11*161 + 12*160
1.1..4.4 Đổi ra thập lục phân
1.1.4.4.1 Từ nhị phân: Biến đổi theo 4 số nhị phân thành 1 số thập lục phân
(10.1101.1011.0110)2 = 2DB6
1.1.4.4.2 Từ bát phân: Biến đồi sang nhị phân sau đó chuyển sang thập lục phân
(2745)8 = (10.111.100.101)2 = (101.1110.0101)2 = 5E5
1.1.4.4.3 Từ thập phân: Chia cho 16 lấy số dư, lấy từ dưới lên trên
(52014)10 = (CB2E)16
52014 : 16 = 3250 dư 14
3250 : 16 = 203 dư 2
203 : 16 = 12 dư 11
12 : 16 = 0 dư 12
1.1.5 Bài tập ví dụ:
Ví dụ 1.1: Xác định ngõ ra cho 2 mạch tổ hợp logic sau:

(a)

(b)
Ví dụ 1.2: Hãy vẽ mạch tổ hợp theo công thức sau:
1. Y = A + B + A^B
2. Y = (A||B) & (A^B)
3. Y = (A&B) + (A||B)

- 5/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


1.2. KHÁI NIỆM VỀ VI ĐIỀU KHIỂN
1.2.1. Khái niệm
1.2.1.1 Vi xử lý (Micro-processor):
Nhiệm vụ của vi xử lý bao gồm nhận dữ liệu (input), xử lý (process) dữ liệu và
xuất (output) ra thiết bị ngoài, trong bộ vi xử lý bao gồm các thanh ghi dùng lưu trữ các
giá trị tạm thời và bộ tính toán (cộng, trừ, nhân, chia, so sánh, nhảy, dịch dữ liệu...), bộ
vi xử lý cần giao tiếp với ROM, RAM mới có thể hoạt động được.
1.2.1.2 Vi điều khiển (Micro-controller):
Vi điều khiển bao gồm vi xử lý + RAM + Flash memory + EEPROM… đây là bộ
xử lý hoàn chỉnh không cần giao tiếp với bộ nhớ ngoài vẫn có thể hoạt động được, vi
điều khiển hoạt động mạnh, yếu tùy thuộc vào dung lượng bộ nhớ, tốc độ xử lý, khả
năng tính toán, số lượng bit cho một thanh ghi, cụ thể atmega16 sử dụng thanh ghi 8 bit.
1.2.2 Chức năng vi điều khiển atmega16
1.2.2.1 Sơ đồ chân của Atmega16:

Hình 1.9 Sơ đồ linh kiện đâm xuyên Hình 1.10 Sơ đồ linh kiện dán
Atmega16 dạng DIP có 40 chân, bao gồm:
 32 chân cho 4 port (PORTA, PORTB, PORTC) mỗi port 8 chân
 2 chân nguồn: VCC (10), GND (11)
 2 chân dao động (12,13)
 1 chân reset mức thấp (9)
 1 chân GND cho tín hiệu Analog (31)

- 6/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


 1 chân AVCC tín hiệu tham chiếu cho biến đổi ADC khi chọn điện áp tham
chiếu là 5v.
 1 chân AREF tín hiệu tham chiếu cho biến đổi ADC khi chọn điện áp tham chiếu
dưới 5v.
 Điện áp hoạt động 2.7V – 5.5V cho Atmega16L
 Điện áp hoạt động 4.5V – 5.5V cho Atmega16
 Bộ nhớ RAM: 1kb
 Bộ nhớ chương trình Flash memory: 16kb viết/xóa 10.000 lần
 Bộ nhớ EEPROM: 512byte: viết/xóa 100.000 lần
 Bộ khóa chương trình
 Tần số hoạt động từ 0-8Mhz cho Atmega16L
 Tần số hoạt động từ 0-16Mhz cho Atmega16
 Atmega16 có 131 câu lệnh rút gọn
1.2.2.2 Chức năng của atmega16
 Chức năng I/O: input – output: Atmega có 32 chân (4 port) có thể thực hiện chức
năng I/O, trước khi thực hiện chức năng này cần phải thiết lập trước các chân này
vào hay ra.
 Ngắt: atmega16 có tổng cộng 21 ngắt phục vụ cho các hoạt động khác nhau của
atmega16.
 Timer/Counter: Dùng định thời, điều chỉnh độ rộng xung dùng điều khiển động
cơ, tạo tần số, đếm sự kiện 8bit hoặc 16bit…
 USART: Hoạt động giao tiếp nối tiếp 2 dây đây là hoạt động được sử dụng rất
rộng rãi hiện nay dùng để chuyển đổi giữa giao tiếp nối tiếp qua cổng USB
 I2C: Hoạt động giao tiếp nối tiếp dùng đề trao đổi dữ liệu giữa các IC với nhau
rất được sử dụng phổ biến hiện nay, trên 1 đường truyền có thể sử dụng nhiều
thiết bị, nghi thức giao tiếp này có thể truy xuất đến từng ô nhớ của thiết bị hay
của IC.
 SPI: Là giao tiếp giữa các chip Slaves được điều khiển bởi, đây là một cách truyền
song công (full duplex) nghĩa là tại cùng một thời điểm quá trình truyền và nhận
có thể xảy ra đồng thời.
 ADC: Biến đổi tín hiệu tương tự sang 10 bit tín hiệu số, tốc độ biến đổi có thể
lên đến 130us.
- 7/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


1.2.3 Bài tập ví dụ:
Ví dụ 1: Hãy cho biết chân 16 của vi điều khiển tên gì?
Ví dụ 2: Hãy cho biết vi điều khiển atmega16 có bao nhiêu bộ nhớ, bộ nhớ nào có
chu kì đọc viết nhiều nhất, bộ nhớ nào truy xuất dữ liệu nhanh nhất.
Ví dụ 3: Hãy cho biết chân nào của atmega16 dùng để giao tiếp nối tiếp, chân nào
dùng để giao tiếp SPI, I2C.

1.3 NGÔN NGỮ LẬP TRÌNH C TRONG PHẦN MỀM CODEVISION


1.3.1. Một số lưu ý khi viết chương trình trong Codevision
 Phân biệt chữ HOA, chữ thường.
 Sau mỗi câu lệnh phải có dấu chấm phẩy ;
 Tên các port và thanh ghi phải là chữ HOA
 Bắt đầu tập lệnh là dấu {, kết thúc tập lệnh là dấu }.
 Biểu diễn số Hex: 0xf3, 0x7B (không phân biệt chữ hoa chữ thường)
 Biểu diễn số thập phân: 108, 255
 Biểu diễn số nhị phân: 0b11010010 (không phân biệt chữ hoa chữ thường)
1.3.2. Các loại biến và khai báo
1.3.2.1 Khai báo biến
char temp1, temp2;
unsigned char temp3, temp4;
1.3.2.2 Định nghĩa các hằng số
#define const 100
#define true 1
#define false 0
1.3.2.3 Các loại biến
Số Số Dãy số
Stt Loại
byte bit Số nhỏ nhất Số lớn nhất
1 bit - 1 0 1
2 Char 1 8 -128 127
3 Signed char 1 8 -128 127
4 Unsigned char 1 8 0 255
5 Int 2 16 -32.768 32.767
6 Signed int 2 16 -32.768 32.767

- 8/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


7 Unsigned int 2 16 0 65.535
8 Long 4 32 -2.147.483.648 2.147.483.649
9 Signed long 4 32 -2.147.483.648 2.147.483.649
10 Unsigned long 4 32 0 4.294.967.295
11 float 4 32 1.2E-38 3.4E38

Bảng 1.2 Các biến trong Codevision

1.3.3. Các hàm logic:


Các bảng bên dưới qui định các kí hiệu cho các hoạt động logic, các phép toán giữa
các bít với nhau, sinh viên cần phải đọc kỹ và hiểu đúng các kí hiệu để viết chương trình
không bị sai về ngữ nghĩa.
Toán
Stt Description Mô tả Ví dụ
tử
1.0 Hoạt động kiểm tra
1.1 == Equal to Bằng if(x==5)
1.2 != Not equal to Không bằng if(x!=5)
1.3 < Less than Nhỏ hơn if(x<5)
1.4 > Greater than Lớn hơn if(x>5)
1.5 Greater than or Nhỏ hơn hoặc
<= if(x<=5)
equal to bằng
1.6 Less than or Lớn hơn hoặc
>= if(x>=5)
equal to bằng
2.0 Hoạt động đại số
2.1 + Addition Cộng a = b + c;
2.2 - Subtraction Trừ a = b – c;
2.3 * Multiplication Nhân a = b*c;
2.4 Chia lấy
/ Division a = b/c;
thương
2.5 % Modulus Chia lấy số dư a = b%c;
2.6 ++ Increment Tăng 1 đơn vị a++;
2.7 -- Decrement Giảm 1 đơn vị b--;
3.0 Hoạt động gán
3.1 = Assignment x = 5;

- 9/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


3.2 += Assign and Sum x += 5;
3.3 Assign and
-= x -= 5;
Subtract
4.0 Hoạt động kiểm tra logic
4.1 && Logic AND if((x>5)&&(x<10))
4.2 || Logic OR if((x==5)||(x==6))
5.0 Hoạt động xử lý các bit
5.1 & AND AND a = b&0x0f
5.2 | OR OR a = b|0x80
5.3 ^ Exclusive OR EXOR a = b^167
5.4 << Shift left Dịch trái a = b<<4
5.5 >> Shift right Dịch phải a = b>>3
5.6 ~ Complement Đảo a = ~b

Bảng 1.3 Các hàm logic

1.3.4. Cấu trúc của một chương trình trên Codevision


Hình vẽ bên dưới trình bày cấu trúc hoàn chỉnh 1 chương trình được viết bằng ngôn
ngữ Codevision, trong chương trình có thể có nhiều chèn file, định nghĩa biến, khai báo
biến, chương trình con nhưng chỉ có duy nhất 1 chương trình chính, việc viết chương
trình con phải theo nguyên tắc, chương trình nào gọi chương trình kia thì phải viết sau
chương trình đó, tuy nhiên trật tự trên cũng có thể thay đổi, sinh viết có thể tham khảo
một số chương trình viết mẫu trong phần thực hành để biết rõ thêm.

Chèn file #included <atmega16.h>


Định nghĩa biến #defined const 100
Khai báo biến unsigned char temp1, temp2;
Chương trình con void submain()
{
}
Chương trình chính void main (void)
{
}

Hình 1.11 Cấu trúc một chương trình trong Codevision


- 10/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


1.3.5. Các từ khóa trong chương trình Codevision
Bảng bên dưới là liệt kê tất cả các từ khóa được sử dụng trong quá trình lập trình trên
Codevision, tuy nhiên có một số từ khóa cũng rất ít sử dụng khi viết các chương trình
đơn giản.

asm Default For Short Union

Auto Do Goto Signed Unsigned

Break Double If Sizeof Void

Case Else Int Static Volatite

Char Enum Long Struct while


Const Extern Register Switch

continue float return Typedef

Bảng 1.4 Các từ khóa trong codevision


1.3.6. Câu lệnh và lưu đồ giải thuật:

While(condition)
{
Thực hiện trong khi condition đúng
};

Hình 1.12 Lưu đồ giải thuật lệnh while

While(!condition)
{
Thực hiện khi condition sai
};

Hình 1.13 Lưu đồ giải thuật lệnh while not

do
{
Thực hiện khi condition còn đúng
}while(condition);
While(condition);
Hình 1.14 Lưu đồ giải thuật lệnh do while
- 11/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16

if(condition)
{
Nếu condition đúng thì thực hiện
};

Hình 1.15 Lưu đồ giải thuật lệnh if

if(condition)
{
Nếu condition đúng thì thực hiện
}else
{
Nếu condition sai thì thực hiện
};

Hình 1.16 Lưu đồ giải thuật lệnh if… else

switch(bien)
{
Case bien: thực hiện; break;
Case bien: thực hiện; break;
Case bien: thực hiện; break;
Default: thực hiện; break;
};

Hình 1.17 Lưu đồ giải thuật lệnh switch… case


1.3.7. Cấu trúc lưu đồ giải thuật
1.3.7.1. Các kí hiệu
Bên dưới là bảng kí hiệu dùng để viết lưu đồ giải thuật cho 1 chương trình, việc sử
dụng lưu đồ giải thuật giúp việc viết chương trình ít bị lỗi khi viết các chương trình dài,
lớn. Việc vẽ lưu đồ giải thuật trước khi viết chương trình đòi hỏi phải thực hiện nhiều
để hình thành được kỹ năng này.
Stt Kí hiệu Mô tả

1 BEGIN Kí hiệu bắt đầu và kết thúc (begin, end)

Yêu cầu thực hiện


2
Cộng, trừ, nhân, chia, gán, dịch trái, phải…

- 12/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16

3 Gọi chương trình con

Lệnh gán
4
Bằng (=)

Lệnh nhiều lựa chọn


5
switch … case

Lệnh kiểm tra đúng sai


6
if … then

Bảng 1.5 Các kí hiệu dùng cho lưu đồ giải thuật


1.3.7.2. Bài tập ví dụ:
Ví dụ 1: Viết chương trình đếm sản phẩm, khi mất điện thì số sản phẩm đã đếm được
sẽ không bị mất.

BEGIN

SENSOR SẼ KIỂM TRA SẢN PHẨM ĐI QUA, NẾU


Sai KHÔNG CÓ SẼ KIỂM TRA TIẾP, NẾU CÓ VĐK SẼ
KT SP THỰC HIỆN LỆNH KẾ TIẾP

Đúng
ĐỌC EEPROM ĐỌC GIÁ TRỊ CỦA BIẾN ĐẾM TỪ EEPROM

TĂNG LÊN 1 TĂNG BIẾN ĐẾM LÊN 1 ĐƠN VỊ

LƯU VÀO EEPROM LƯU GIÁ TRỊ CỦA BIẾN ĐẾM VÀO EEPROM

Sai KIỂM TRA ĐỦ 100 SẢN PHẨM CHƯA, NẾU CHƯA


=100 QUAY LẠI KIỂM TRA SẢN PHẨM TIẾP, NẾU ĐỦ
KẾT THÚC CHƯƠNG TRÌNH
Đúng
END

Hình 1.18 Lưu đồ giải thuật đếm sản phẩm

- 13/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


Qua ví dụ trên, sau khi viết xong chương trình bằng ngôn ngữ C, toàn bộ chương
trình trên sẽ được được biên dịch để kiểm tra lỗi, và sau đó chuyển thành file hex,
một phần mềm nạp sẽ nạp file hex vào trong bộ nhớ chương trình Flash Memory của
vi điều khiển cụ thể là atmega16, biến counter sẽ được lưu trong bộ nhớ RAM, khi
mất điện nội dung trong biến counter = 0; nhưng giá trị của biến đếm counter đã
được lưu trong EEPROM có địa chỉ là 0x00 không bị mất dữ liệu.
Ví dụ 2: Viết chương trình cộng số nguyên dương từ 1 đến x

BEGIN

t = 0 CHO CÁC BIẾN t, y BẰNG 0


y = 0

t++ TĂNG GIÁ TRỊ t LÊN 1 ĐƠN VỊ


y = y + t BIẾN y = y + t

Sai
KIỂM TRA BIẾN t = X HAY CHƯA
t ==
Đúng
END

Hình 1.19 Lưu đồ cộng từ 1 đến x


1.4. CÂU HỎI ÔN TẬP HẾT CHƯƠNG:
1. Hãy xác định ngõ ra cho các mạch logic sau đây:

Hình 1

Hình 2

- 14/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16

Hình 3
2. Hãy cho biết nếu x = 5 thì các mệnh đề sau là đúng hay sai:
a. ((x<7)||(x>19))
b. ((x<4)&(x>2))
3. Hãy xây dựng cổng logic theo công thức sau:

4. Khi biến x = 0xA5, và y = 70 sau khi thực hiện các lệnh sau thì x hoặc z có giá
trị là bao nhiêu:
1. x |= 0x06; 2. x >> 3;
3. x &= 0x06; 4. x = y<<2;
5. x = y^0x5C; 6. z = x^0x5C;
7. x += 4; 8. z = ~x;
9. z = x % y; 10. z = x && y;
11. z = x^y; 12. z = x&y;
13. x |= y; 14. z = x%0b1100;
5. Chân 34 là chân nào của VĐK, PORTB.4 là chân số mấy?
6. Chân T0, T1 của VĐK là chân số mấy?
7. Chân ADC4 là chân số mấy?
8. Hãy cho biết ý nghĩa của các từ khóa static, goto, float, const.
9. Chân PD7 là chân số mấy, chân số 3 của VDK tên gì?
10. Hãy cho biết atmega16 khác atmeg16L như thế nào?
11. Hãy viết lưu đồ giải thuật tìm USCLL và BSCNN của 2 số nguyên dương

- 15/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16


12. Hãy viết chương trình cộng từ 1 đến n (n là số nguyên dương) bằng lệnh for,
while, if
13. Hãy cho biết chân Reset của Atmega16 là chân số mấy, tác động ở mức nào, giải
thích và vẽ sơ đồ nguyên lý của chân Reset.
14. Hãy trình bày các phát biểu sau
a. Nếu x > 9 thì y = 18 ngược lại y = 0;
b. Hãy thực hiện lệnh x +=3 10 lần;
c. Hãy thực hiện lệnh y = 2*t trong khi y nhỏ hơn 100
d. Trong trường hợp
1. X = 3 thì y = 2
2. X = 4 thì y = 8
3. X = 5 thì y = 6
4. X = 6 thì y = 12
5. X = 7 thì y = 1
6. Nếu không bằng với các giá trị trên thì y = 0
15. Giá trị nhỏ nhất và lớn nhất được chứa trong thanh ghi 8 và 16 bit là bao nhiêu?
16. Viết lưu đồ giải thuật sắp xếp chuỗi số theo thứ tự tăng dần.

- 16/115 - Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16

Chương 2

GIAO TIẾP VÀO RA


(I/O INPUT/OUTPUT)

-17/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16


2.1. GIỚI THIỆU

Trong chương này sẽ trình bày về khai báo hoạt động vào ra dùng để điều khiển
hay kiểm tra trạng thái của thiết bị bên ngoài, điều khiển led đơn, led 7 đoạn… kiểm tra
nút nhấn đơn, nút nhấn ma trận.

Vi điều khiển atmega16 có 32 chân vào ra bao gồm 4 port (PORTA, PORTB,
PORTC, PORTD) cho phép vi điều khiển xuất hoặc nhận dữ liệu, xuất dữ liệu được gọi
là điều khiển, nhận dữ liệu được gọi là kiểm tra, các chân này phải được xác định là vào
hay ra trước trao đổi dữ liệu, việc xác định vào ra phụ thuộc vào 3 thanh ghi sau:
DDRx.n, PORTx.n, PINx.n (x tên của port như A, B, C, D; n tên của chân như 0,1 …
7).

2.2. CÁC THANH GHI LIÊN QUAN

2.2.1. Thanh ghi DDRxn:

Có chức năng chọn hướng vào ra của vi điều khiển, khi DDRxn = 1 chân này có
chức năng là ngõ ra (xuất dữ liệu), khi DDRxn = 0 chân này có chức năng là ngõ vào
(nhận dữ liệu).

KHAI BÁO HOẠT ĐỘNG VÀO RA TRÊN CỔNG B

PORTB 7 6 5 4 3 2 1 0

DDRB 0 0 1 0 0 1 1 1

in in out in in out out out

Hình 2.1 Khai báo vào ra của PORTB

2.2.2. Thanh ghi PORTxn:

 Khi chân này đang là ngõ vào và PORTxn = 1 thì chân này có điện trở kéo lên,
khi không sử dụng điện trở kéo lên thì PORTxn = 0.

 Khi chân này đang là ngõ ra và PORTxn = 1 thì chân này xuất ra mức logic cao,
khi PORTxn = 0 thì xuất ra mức logic thấp.

2.2.3. Thanh ghi PINxn:

-18/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16


Có chức khi nó là ngõ vào (nhận dữ liệu), khi PINxn = 1 thì tín hiệu vào trên chân
đó sẽ là mức cao, khi PINxn = 0 thì tín hiệu vào là mức thấp.

PORTA.0 PORTA.0
33 33

Khi PORTA.0 = 1; Khi PORTA.0 = 0;


điện áp tại chân điện áp tại chân
này sẽ là 5 volt. này sẽ nối mass.

Hình 2.2 Chân 33 có điện trở kéo lên Hình 2.3 Chân 33 có được nối mass

2.2.4 Bài tập ví dụ:

Ví dụ 1: Hãy khai báo chân 2, 3, 5 là ngõ vào, các chân còn lại của PORT này là ngõ
ra.

Giải: Chân 2, 3, 5 là các chân PB1, PB2 và PB4 trên PORTB và có mức logic tương
ứng trên thanh ghi DDRB sẽ là 0, chương trình được viết như sau:

DDRB = 0b10010111;

Ví dụ 2: Hãy khai báo PORTC là ngõ vào, các chân 22, 24, 25 có điện trở kéo lên, và
hãy cho biết các chân này có điện áp là bao nhiêu volt.

Giải: Khai báo PORTC là ngõ vào ta viết như sau: DDRC = 0b00000000;

Các chân 22, 24, 25 là các chân PC0, PC2, PC3 có điện trở kéo lên nên thanh
ghi PORTC trên các bit tương ứng sẽ có mức logic 1, chương trình được viết
như sau: PORTC = 0b10110000;

Ví dụ 3: Viết chương trình để bit 2 và bit 6 của PORTC bằng 1 các bit còn lại giữ
nguyên trạng thái ban đầu.

-19/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16

Cách 1:
PORTB.2 = 1;
PORTB.6 = 1;
Cách 2:
PORTB |= 0b01000100;

Ví dụ 4: Viết chương trình để bit thứ 3 và thứ 6 của PORTD = 0, các bit còn lại giữ
nguyên trạng thái ban đầu.

Cách 1:
PORTD.4 = 0;
PORTD.7 = 0;
Cách 2:
PORTD &= 0b10110111;

Ví dụ 5: Viết chương trình để bit 1,4 của PORTC = 0, và bit thứ 3,5 của PORTC = 1;

Cách 1:
PORTC.1 = 0;
PORTC.4 = 0;
PORTC.3 = 1;
PORTC.5 = 1;
Cách 2:
PORTC &= 0b11101101;
PORTC |= 0b00101000;

Ví dụ 6: PORTD |= 0xAD có nghĩa là gì?

PORTD |= 0b10101101;
Bit thứ 1,4,6 của PORTD bằng 1, các bit khác giữ nguyên trạng thái ban đầu.

Ví dụ 7: VCT khai báo PORTA có các bit thứ 3,4,7 là ngõ vào các ngõ còn lại là ngõ ra.
Trong đó bit thứ 4,7 có điện trở kéo lên

DDRA = 0b01100111; ngõ vào 3,4,7; ngõ ra 0,1,2,5,6


PORTA.7 = 1;
PORTA.4 = 1;

-20/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16


2.3. CÁC CHỨC NĂNG KHÁC CỦA CÁC PORT

Ngoài chức năng I/O một số chân còn có các chức năng khác như:

2.3.1. Chức năng khác của PORTA

PortA còn là ngõ vào của tín hiệu ADC (biến đổi tín hiệu tương tự sang số), 8 chân
của PORTA tương đương với 8 kênh biến đổi ADC từ ADC0 đến ADC7, điện áp biến
đổi từ 0 – 5v tùy thuộc vào điện áp tham chiếu (xem thêm phần biến đổi ADC).

Lưu ý: Tại mỗi thời điểm VĐK chỉ biến đổi 1 tín hiệu ADC.

Stt Tên chân Chức năng khác


1 ADC7 ADC7 (ngõ vào ADC kênh 7)
2 ADC6 ADC6 (ngõ vào ADC kênh 6)
3 ADC5 ADC5 (ngõ vào ADC kênh 5)
4 ADC4 ADC4 (ngõ vào ADC kênh 4)
5 ADC3 ADC3 (ngõ vào ADC kênh 3)
6 ADC2 ADC2 (ngõ vào ADC kênh 2)
7 ADC1 ADC1 (ngõ vào ADC kênh 1)
8 ADC0 ADC0 (ngõ vào ADC kênh 0)
Bảng 2.1 Chức năng khác của PORTA

2.3.2 Chức năng khác trên PORTB

Tên Chức năng Mô tả


PB7 SCK
PB6 MISO Các chân này dùng trong giao tiếp SPI, ngoài ra còn dùng
PB5 MOSI đề nạp chương trình cho VĐK
PB4 SS
OC0 chân điều xung trong hoạt động timer/counter
PB3 OC0/AIN1 AIN1 kết hợp với AIN0 dùng để kích hoạt hoạt động ADC,
hoạt dùng so sánh điện áp trong hoạt động AC
INT2: Chân ngắt ngoài 2
PB2 INT2/AIN0 AIN0 kết hợp với AIN1 dùng để kích hoạt hoạt động ADC,
hoạt dùng so sánh điện áp trong hoạt động AC
Chân ngõ vào dùng đếm xung trong hoạt động
PB1 T1
timer/counter1
Chân ngõ vào dùng đếm xung trong hoạt động
PB0 XCK/T0
timer/counter0
Bảng 2.2 Chức năng khác của PORTB

-21/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16


2.3.3 Chức năng khác trên PORTC:

Tên Chức năng Mô tả

PC7 TOSC2 Khi bit AS2 trong thanh ghi ASSR được bậc lên 1, bộ dao động
sẽ được nối với chân này, lúc này chân PC7,6 không có chức
PC6 TOSC1 năng như hoạt động IO

Khi giao tiếp theo mode JTAG chân này là ngõ vào nối tiếp được
PC5 TDI dịch chuyển vào thanh ghi lệnh hoặc thanh ghi điều khiển. lúc
này chân PC5 không có chức năng như hoạt động IO

Khi giao tiếp theo mode JTAG chân này là ngõ ra nối tiếp được
PC4 TDO dịch chuyển ra từ thanh ghi lệnh hoặc thanh ghi điều khiển. lúc
này chân PC4 không có chức năng như hoạt động IO

PC3 TMS
Hai chân này dùng trong hoạt động JTAG
PC2 TCK

PC1 SDA Dùng trong giao tiếp I2C, chân SDA dùng để trao đổi dữ liệu,
PC0 SCL chân SCL dùng làm xung clock để đồng bộ hóa tín hiệu.

Bảng 2.3 Chức năng khác của PORTC

2.3.4 Chức năng khác trên PORTD:

Stt Tên Chức năng Chức năng khác


1 PD7 OC2 Dùng điều xung trong hoạt động PWM của timer 2
2 PD6 ICP1 Dùng để chụp hình dữ liệu timer/counter1
3 PD5 OC1A Dùng điều xung trong hoạt động timer/couter1 kênh A
4 PD4 OC1B Dùng điều xung trong hoạt động timer/couter1 kênh B
5 PD3 INT1 Ngắt ngoài 1
6 PD2 INT0 Ngắt ngoài 0
7 PD1 TxD Dùng truyền nhận dữ liệu nối tiếp đồng bộ và không đồng
8 PD0 RxD bộ

Bảng 2.4 Chức năng khác của PORTD

2.3.5 Bài tập ví dụ

Ví dụ 1: Hãy cho biết chân có chức năng giao tiếp nối tiếp đồng bộ và bất đồng bộ trên
chân nào của Port nào?

-22/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16


Giải: Chân RxD, TxD trên chân 14, 15 tương ứng thuộc PORTD của vi điều khiển.

Ví dụ 2: Vi điều khiển atmega16 có mấy ngắt ngoài, kể tên các chân đó.

Giải: Vi điều khiển atmega16 có 3 ngắt ngoài: INT0, INT1, INT2 tương ứng trên
các chân 16, 17, 3.

2.4. XUẤT NHẬP DỮ LIỆU TRÊN CÁC PORT

2.4.1 Xuất dữ liệu trên các chân của PORT

Để xuất mức điện áp ra các chân (điều khiển ngõ ra) ta thực hiện theo bảng sau:

Stt Mô tả Cách 1 Cách 2


1 Xuất mức 1 ra PORTB.0 PORTB.0 = 1; PORTB |= 0x01;
2 Xuất mức 0 ra PORTC.3 PORTC.3 = 0; PORTC &= 0xfb;
Bảng 2.5 Các phương pháp xuất dữ liệu (điều khiển) ra các chân

2.4.2 Xuất dữ liệu ra PORT

Để xuất dữ liệu ra trên PORT (điều khiển PORT) ta thực hiện như sau:

Stt Mô tả Cách 1 Cách 2


1 Xuất dữ liệu 197 ra PORTD PORTD = 197; PORTD = 0xC5;
2 Xuất dữ liệu 207 ra PORTA PORTA = 207; PORTA = 0b11001111;
3 Xuất dữ liệu trung gian ra PORTB =
PORTB biendem;
Bảng 2.6 Các phương pháp xuất dữ liệu (điều khiển) trên các PORT

2.4.3 Kiểm tra các chân trên PORT

 Kiểm tra chân PINA.5 có bằng 1 hay không:

Cách 1: if(PINA.5 == 1)

Cách 2: if(PINA.5)

Cách 3: if((PINA &= 0x20) == 0x20)

 Kiểm tra chân PINC.2 có bằng 0 hay không:

Cách 1: if(PINC.2 == 0)

Cách 2: if(((PINC &= 0x04) ==0)

-23/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16


 Hãy thực hiện công việc trong khi PINB.2 bằng 1

Cách 1: while(PINB.2 == 1)

Cách 2: while(PINB.2)

 Hãy thực hiện công việc trong khi PIND.3 bằng 0

Cách 1: while(PIND.3 == 0)

Cách 2: while(!PIND.3)

Lưu ý:

 PIN dùng để nhận/ kiểm tra dữ liệu.

 PORT dùng để xuất dữ liệu, điều khiển.

2.4.4 Đọc dữ liệu từ PORT

Temp1 = PINA

Temp2 = PINC

2.4.5 Kiểm tra toàn PORT


switch (PINB){
case 0b11001001: TH1; break;
case 0b10101100: TH2; break;
case 0b10110101: TH3; break;
};

2.4.6 Bài tập ví dụ


Ví dụ 1: Hãy viết thêm 2 cách khác nhau thể hiện câu lệnh sau:

if((PINC &= 0x10) == 0x10)

Giải: if(PINC.4 == 1)

if(PINC.4)

Ví dụ 2: Hãy giải thích lệnh DDRD = 214 có nghĩa là gì?

Giải: 214 = 0b11010110; có nghĩa là khai báo các chân 22, 25, 27 là ngõ vào các
chân còn lại của Port này là ngõ ra.

Ví dụ 3: Viết chương trình khi chân 1 (PINB.0) = 1, thì PORTA = 0x00; khi PINB =
0 thì PORTA = 0xff;

-24/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16

#include <mega16.h>
void main (void)
{
PORTA = 0x00;
DDRA = 0xFF;

PORTB = 0x00;
DDRB = 0x00;

PORTC = 0x00;
DDRC = 0xFF;

PORTD = 0x00;
DDRC = 0xFF;

while (1)
{
If (PINB.0 == 0)
{PORTA = 0x00;}
else
{PORTA = 0xff;}
}
}

Ví dụ 4: Viết chương trình kiểm tra mức logic trên chân 1, 2 và 3 (PINB.0, PINB.1,
PINB.2) của vi điều khiển và xuất ra trên PORTA và PORTC theo yêu cầu
sau:

NGÕ VÀO NGÕ RA


Stt PINB.0 PINB.1 PINB.2 PORTA PORTC
1 0 0 0 0x00 0x00
2 0 0 1 0x00 0x03
3 0 1 0 0x00 0x06
4 0 1 1 0x00 0xc0
5 1 0 0 0x01 0x80
6 1 0 1 0x03 0xa4
7 1 1 0 0x06 0x7D
8 1 1 1 0xC0 0xb3
Giải: Dựa vào yêu cầu của đề bài, ta nhận thấy rằng các chân PINB.0.1.2 được cài
đặc là ngõ vào, và các chân trên PORTA và PORTC sẽ là ngõ ra, chương trình
được viết như sau:

-25/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16

#include <mega16.h>
void main (void)
{
PORTA = 0x00; PORTA NGÕ RA
DDRA = 0xFF;

PORTB = 0x00; PORTB NGÕ VÀO


DDRB = 0x00;

PORTC = 0x00; PORTC NGÕ RA


DDRC = 0xFF;

PORTD = 0x00; PORTD NGÕ RA


DDRC = 0xFF;

while (1)
{
// Place your code here
switch (PINB & 0b00000111) {
case 0x00: PORTA = 0x00; break;
case 0x01: PORTA = 0x03; break;
case 0x02: PORTA = 0x06; break;
case 0x03: PORTA = 0x0C; break;
case 0x04: PORTA = 0x18; break;
case 0x05: PORTA = 0x30; break;
case 0x06: PORTA = 0x60; break;
case 0x07: PORTA = 0xC0; break;
};
}
}

2.5 LED ĐƠN VÀ LED 7 ĐOẠN


2.5.1 Led đơn
Để điều khiển led đơn sáng ta chỉ cần xuất tín hiệu ra như hình vẽ sau:

PA.2

PB.0

Led sáng: PORTA.2 = 1; Led sáng: PORTB.0 = 0;


Led tắt: PORTA.2 = 0; Led tắt: PORTB.0 = 1;

Hình 2.4 Điều khiển led đơn trực tiếp

-26/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16

PA.2

PB.0

Led sáng: PORTA.2 = 1; Led sáng: PORTB.0 = 0;


Led tắt: PORTA.2 = 0; Led tắt: PORTB.0 = 1;

Hình 2.5 Điều khiển led đơn có nguồn cung cấp


2.5.2 Led 7 đoạn
Có 2 loại led 7 đoạn: Anot chung và Katot chung, để điều khiển led 7 đoạn được dễ
dàng ta cần phải tìm ra mã led 7 đoạn, có 4 loại bảng mã led 7 đoạn đó là:
1. Mã led 7 đoạn Anot chung với MSB nối chân a
2. Mã led 7 đoạn Anot chung với LSB nối chân a
3. Mã led 7 đoạn Katot chung với MSB nối chân a
4. Mã led 7 đoạn Katot chung với LSB nối chân a

a b c d e f g dp a b c d e f g dp

Hình 2.6 Anot chung Hình 2.7 Katot chung

PA.0 a PA.0 dp
PA.1 b PA.1 g
PA.2 c PA.2 f
PA.3 d PA.3 e
PA.4 e PA.4 d
PA.5 f PA.5 c
PA.6 g PA.6 b
PA.7 dp PA.7 a

Hình 2.8 Kiểu mắc Anot chung với Hình 2.9 Kiểu mắc Anot chung với
LSB nối chân a MSB nối chân a

-27/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16

PA.0 dp
PA.0 a
PA.1 g
PA.1 b
PA.2 f
PA.2 c
PA.3 e
PA.3 d
PA.4 d
PA.4 e
PA.5 c
PA.5 f
PA.6 b
PA.6 g a
dp PA.7
PA.7

Hình 2.10 Kiểu mắc Katot chung với Hình 2.11 Kiểu mắc Katot chung với
LSB nối chân a MSB nối chân a

2.5.3 Led ma trận


Hiện nay trên thị trường có rất nhiều loại led ma trận:

 Số điểm led trên ma trận : Ma trận 5x7 (5 hàng 7 cột), Ma trận 8x8.
 Kích thước : Ma trận loại nhỏ, vừa, lớn
 Màu: Ma trận 1, màu 2 màu.

Trong phần trình bày này ta sẽ khảo sát ma trận 8x8x2 : 8 hàng, 8 cột và 2 màu

Hình 2.12 Sơ đồ chân Led ma trận 8x8x2 (8 hàng, 8 cột, 2 màu)

Để điều khiển Led ma trận ta sử dụng phương pháp quét như led 7 đoạn.

2.5.4 Bài tập ví dụ


Ví dụ 1: Tìm mã led 7 đoạn Anot chung với MSB nối chân a

Giải: Với kiểu mắc như hình 2.8 led sáng khi mức 0 và tắt khi mức 1

-28/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16

Stt Mã số a b c d e f g dp Dạng số Hex

1 Mã số 0 0 0 0 0 0 0 1 1 0x03
2 Mã số 1 1 0 0 1 1 1 1 1 0x9f
3 Mã số 2 0 0 1 0 0 1 0 1 0x25
4 Mã số 3 0 0 0 0 1 1 0 1 0x0d
5 Mã số 4 1 0 0 1 1 0 0 1 0x99
6 Mã số 5 0 1 0 0 1 0 0 1 0x49
7 Mã số 6 0 1 0 0 0 0 0 1 0x41
8 Mã số 7 0 0 0 1 1 1 1 1 0x1f
9 Mã số 8 0 0 0 0 0 0 0 1 0x01
10 Mã số 9 0 0 0 0 1 0 0 1 0x09
Ví dụ 2: Tìm mã led 7 đoạn Katot chung với LSB nối chân a

Giải: Với kiểu mắc như hình 2.10 led sáng khi mức 1 và tắt khi mức 0

Stt Mã số a b c d e f g dp Dạng số Hex

1 Mã số 0 1 1 1 1 1 1 0 0 0xfc
2 Mã số 1 0 1 1 0 0 0 0 0 0x60
3 Mã số 2 1 1 0 1 1 0 1 0 0xda
4 Mã số 3 1 1 1 1 0 0 1 0 0xf2
5 Mã số 4 0 1 1 0 0 1 1 0 0x66
6 Mã số 5 1 0 1 1 0 1 1 0 0xb6
7 Mã số 6 1 0 1 1 1 1 1 0 0xbe
8 Mã số 7 1 1 1 0 0 0 0 0 0xe0
9 Mã số 8 1 1 1 1 1 1 1 0 0xfe
10 Mã số 9 1 1 1 1 0 1 1 0 0xf6
2.6 CÂU HỎI ÔN TẬP HẾT CHƯƠNG
2.1 Hãy viết chương trình tạo khóa số (8 bit) trên PORTD với mã số là 0xE7 và 1 nút
xác nhận trên chân PORTA.3, khi nhấn đúng mã thì chân trên chân PORTA.2 = 1, ngược
lại thì bằng 0, nếu quá 3 lần bấm sai thì chuông báo trên chân PORTA.6 (đổ chuông khi
PORTA.6 = 1).

2.2: Ví dụ 2: VCT khi nhấn nút trên chân 3, thì PORTA = 0x00; nhấn tiếp thì PORTA
= 0xff (nút nhấn trên chân 1 là thường mở).

2.3: VCT 1 led sáng xoay vòng trên PORT C.

2.4: Viết chương trình giải mã phím ma trận (4x4)

2.5: Viết chương trình led sáng dồn 8 led

2.6: Viết chương trình led 7 đoạn sáng bằng phương pháp thông thường

-29/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16


2.7: Viết chương trình 3 led 7 đoạn sáng bằng phương pháp quét

2.8 Viết chương trình led sáng từ 0 đến 9 rồi lặp lại theo mã led

2.9 Viết chương trình led sáng từ 0 đến 9 rồi lặp lại theo biến mãn

2.10 Viết chương trình led sáng từ 0 đến 9 rồi lặp lại theo biến mãn và biến đếm

2.11 Viết chương trình led sáng từ 0 đến F theo theo mã led

2.12 Viết chương trình led sáng từ 0 đến F rồi lặp lại theo biến mãn

2.13 Viết chương trình led sáng từ 0 đến F rồi lặp lại theo biến mãn và biến đếm

2.14 Tìm mã led 7 đoạn anot chung theo MSB trước

2.15 Tìm mã led 7 đoạn anot chung theo LSB trước

2.16 Tìm mã led 7 đoạn Kanot chung theo MSB trước

2.17 Tìm mã led 7 đoạn Kanot chung theo LSB trước

2.18 Viết chương trình 2 led 7 đoạn sáng từ 00 đến 99 theo phương pháp quét led

-30/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16

Chương 3

HOẠT ĐỘNG NGẮT

-31/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16


3.1. GIỚI THIỆU VỀ HOẠT ĐỘNG NGẮT
Ngắt là hoạt động xảy ra ở bất kì thời điểm nào của chương trình khi chương trình
chính đang hoạt động, hoạt động ngắt xảy ra khi bắt đầu 1 sự kiện hoặc kết thúc một sự
kiện nào đó, ví dụ: ngắt ngoài, ngắt timer/counter, ADC… hoạt động ngắt thường được
sử dụng để thu thập dữ liệu, hoạt động ngắt xảy ra khi cờ ngắt được bật lên 1.
Ví dụ về ứng dụng của ngắt: Khi viết chương trình đếm sản phẩm, phần cứng của
chúng ta bao gồm 2 phần: Phần cảm biến phát hiện sản phẩm, phần xử lý hiển thị số
lượng sản phẩm lên màn hình. Đối với 1 chương trình thông thường thì bộ xử lý luôn
luôn thực hiện 2 chương trình: Kiểm tra có sản phẩm hay không và hiển thị kết quả.
Nhưng nếu ta sử dụng chương trình ngắt thì bộ xử lý chỉ cần thực hiện chương trình
hiển thị và không cần quan tâm đến chương trình kiểm tra sản phẩm, khi có 1 sản phẩm
đi qua thì cảm biến sẽ nhận được và đưa tín hiệu về bộ xử lý, lúc này bộ xử lý mới nhảy
tới chương trình kiểm tra xử lý dữ liệu và sau khi thực hiện xong thì bộ xử lý sẽ quay về
chương trình chính của mình là hiển thị, và công việc sẽ lập lại như thế nếu có sản phẩm
đi qua.

Begin

Chương trình
chính sẽ nhảy
tới chương
trình ngắt tại
bất kì thời
điểm nào
không biết
trước khi có
sự kiện ngắt
xảy ra.
Chương trình chính sẽ nhảy
tới chương trình con tại
thời điểm được lập trình
trước bởi người lập trình.
End

Chương trình chính

Hình 3.1 Chương trình chính, chương trình con và chương trình ngắt
3.2. CÁC LOẠI NGẮT
Atmega16 có tổng cộng 21 ngắt như bảng bên dưới

-32/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16


Stt Nguồn ngắt Sự kiện ngắt
1 Reset Reset khi khởi động
2 INT0 Ngắt ngoài 0
3 INT1 Ngắt ngoài 1
4 TIMER2 COMP Ngắt khi so sánh bằng Timer/Counter2 xảy ra
5 TIMER2 OVF Ngắt khi xuất hiện cờ tràn Timer/Counter2.
6 TIMER1 CAPT Ngắt khi đọc giá trị thanh ghi TCNT1
7 TIMER1 COMPA Ngắt khi so sánh bằng Timer1A
8 TIMER1 COMPB Ngắt khi so sánh bằng Timer1B
9 TIMER1 OVF Ngắt khi xuất hiệnS cờ tràn Timer/Counter1
10 TIMER0 OVF Ngắt khi xuất hiện cờ tràn Timer/Counter0
11 SPI, STC Ngắt khi hoạt động SPI hoàn tất
12 USART, RXC Ngắt khi nhận dữ liệu hoàn tất
13 USART, UDRE Ngắt khi thanh ghi dữ liệu UDRE được gởi đi
14 USART, TXC Ngắt khi truyền dữ liệu hoàn tất
15 ADC Ngắt khi biến đổi ADC hoàn thành
16 EE_RDY Ngắt khi bộ nhớ EEPROM sẵn sàng lưu dữ liệu
17 ANA_COMP Ngắt khi hoạt động so sánh hoàn tất
18 TWI Ngắt khi giao tiếp TWI (I2C)
19 INT2 Ngắt ngoài INT2
20 TIMER0 COMP Ngắt khi so sánh bằng của Timer/Couter0
21 SPM_RDY Ngắt khi bộ nhớ chương trình sẵn sàng
Bảng 3.1 Các nguồn ngắt của atmega16
3.2.1 NGẮT NGOÀI
Ngắt ngoài là ngắt do tác nhân từ bên ngoài tác động, các tác nhân ngắt ngoài bao
gồm: ngắt cạnh lên, cạnh xuống, mức thấp, cạnh lên xuống, vi điều khiển atmega16 có
3 ngắt ngoài trên chân INT0, INT1, INT2 lần lượt trên các chân 16, 17, 3.

Hình 3.2 Dạng xung trên nút nhấn

-33/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16


Ứng dụng của ngắt ngoài dùng đếm sản phẩm, đo độ rộng xung, giải mã encoder…
3.2.2 NGẮT TIMER
Ngắt do bộ timer bên trong vi điều khiển thực hiện, các tác nhân ngắt timer bao
gồm: ngắt tràn và ngắt bằng, ngắt khi đọc giá trị thanh ghi TCNTn (capture)
Ngắt tràn: Khi giá trị lưu trữ vượt quá giá trị của thanh ghi TCNTn
Ngắt bằng: Khi giá trị thanh ghi OCRn bằng với giá trị đặt của thanh ghi TCNTn,
các mode ảnh hưởng đến hoạt động ngắt tràn: mode độ Normal, mode Fast PWM, mode
PWM phase correct.
Ứng dụng của ngắt timer dùng để điều khiển đồng hồ, đo độ rộng xung, hiển thị
quét led…
3.2.3 NGẮT ADC, SPI, TWI, AC
Hoạt động ngắt ADC, SPI, TWI (I2C), AC xảy ra khi các hoạt động này hoàn thành
3.2.4 BÀI TẬP VÍ DỤ
Ví dụ 1: Sử dụng ngắt ngoài để đếm sản phẩm

Hình 3.3 Sơ đồ nguyên lý mạch đếm sản phẩm sử dụng ngắt ngoài
Chương trình được viết như sau:
Sử dụng ngắt INT0, tác động cạnh xuống.
#include <mega16.h>
#include <delay.h>
unsigned char index, donvi, chuc;

-34/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16


unsigned char flash MaledAnot[10] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

// External Interrupt 0 service routine


interrupt [EXT_INT0] void ext_int0_isr(void)
{
index++;
if(index>99) index = 0;
}
void hienthi()
{
PORTB = 0xfe;
PORTA = MaledAnot[donvi];
delay_ms(2);

PORTB = 0xfd;
PORTA = MaledAnot[chuc];
delay_ms(2);
}
void giaima()
{
donvi = index%10;
chuc = index/10;
}
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
// External Interrupt(s) initialization
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;

// Global enable interrupts


#asm("sei")
while (1)
{
// Place your code here
giaima();
hienthi();
}
}

-35/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16


Ví dụ 2: Sử dụng ngắt timer để hiển thị số đếm từ 00 đến 99 và lặp lại
Sơ đồ nguyên lý tương tự như hình 3.3
Chương trình được viết như sau:
Sử dụng ngắt tràn timer/counter0, bộ chia 1024, mode Normal
#include <mega16.h>
#include <delay.h>
unsigned char index, donvi, chuc;
unsigned char flash MaledAnot[10] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

// Timer 0 overflow interrupt service routine


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
index++;
if(index>99) index = 0;
}
void hienthi()
{
PORTB = 0xfe;
PORTA = MaledAnot[donvi];
delay_ms(2);

PORTB = 0xfd;
PORTA = MaledAnot[chuc];
delay_ms(2);
}
void giaima()
{
donvi = index%10;
chuc = index/10;
}
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 0,977 kHz
// Mode: Normal top=0xFF
TCCR0=0x05;
TCNT0=0x00;
OCR0=0x00;

-36/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16


TIMSK=0x01;
ACSR=0x80;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
giaima();
hienthi();
}
}

3.3. CÂU HỎI ÔN TẬP HẾT CHƯƠNG


1. Viết chương trình đếm lên và đếm xuống sử dụng 2 ngắt của vi điều khiển?
2. Viết chương trình đếm tự động từ 00 đến 99, khi nhấn nút trên chân 16 thì vi điều
khiển dừng đếm, khi nhấn tiếp thì vi điều khiển chạy tiếp tục
3. Viết chương trình hiển thị số ngẫu nhiên từ 00 đến 99
4. Viết chương trình đo thời gian nhấn và nhã phím

-37/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16

Chương 4

HOẠT ĐỘNG
TIMER/COUNTER

- 38/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
4.1 GIỚI THIỆU:

Bộ timer/counter hoạt động dựa trên nguyên tắc sau: bộ timer/counter (bộ đếm) nhận
xung clock và đếm số lượng xung này, vi điều khiển nhận biết được số lượng xung này
có bằng với giá trị cho trước hay không hoặc đã đạt tới giá trị TOP (0xFF) hoặc
BOTTOM (0x00), dựa vào sự nhận biết này mà ta có các cách cư xử khác nhau cho phù
hợp với từng ứng dụng của mình.
Ứng dụng của bộ timer/counter: Dùng đếm sự kiện, định thời, tạo tần số, hoặc được
sử dụng trong ứng dụng điều chế độ rộng xung PWM (điều khiển tốc độ động cơ, mạch
ổn áp…)
Atmega16 có 3 bộ timer/counter: 2 bộ 8 bit (timer0, timer2) và 1 bộ 16 bit (timer1).

Hình 4.1 Sơ đồ khối của bộ timer/ Counter

Qua hình vẽ trên ta nhận thấy khối Control Logic nhận tín hiệu xung clock (clkTn)
từ chân Tn hoặc từ bộ chia (prescaler), việc lựa chọn này tùy thuộc vào thanh ghi TCCR.
Nếu clkTn là Tn thì bộ timer/counter sẽ thành bộ counter (đếm sự kiện), vi điều khiển
sẽ nhận tín hiệu từ chân T0 (chân 1), T1 (chân 2).
Nếu clkTn là prescaler thì bộ timer/counter sẽ thành bộ timer (định thời), tùy theo
việc cài đặt bộ chia mà tín hiệu clkTn có các tần số khác nhau.

- 39/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
Khối Control Logic xuất tín hiệu qua thanh ghi TCNTn bao gồm tín hiệu đếm
(count), tín hiệu clear (xóa thanh ghi TCNTn về 0), và tín hiệu đếm lên/xuống
(direction), nếu giá trị trong bộ counter và OCRn bằng nhau thì nó sẽ báo trên chân OCn,
hoặc phát sinh ra tín hiệu ngắt.
Tần số tín hiệu phát ra bên trong của vi điều khiển cấp cho bộ chia (prescaler) được
gọi là chu kì máy (CKM) và được tính như sau:

1
=
(4.1)
Với fosc là tần số thạch anh được gắn vào chân 12 và 13 của vi điều khiển
Các mode hoạt động của bộ timer/counter, có 4 chế độ làm việc tùy thuộc vào thanh
ghi TCCR đó là:
 Chế độ bình thường (normal), thường được sử dụng trong hoạt động tạo hàm
delay, ngắt timer định kỳ.
 Chế độ điều xung, 2 chu kỳ đếm lên và xuống (PWM, phase correct) dùng để
điều khiển tốc độ động cơ, DAC.
 Chế độ xóa bộ counter (CTC, Clear Timer on Compare Match Mode) dùng để
tạo tần số.
 Chế độ điều xung 1 chu kỳ đếm lên (Fast PWM) dùng để điều khiển tốc độ động
cơ, DAC.
4.2 CÁC THANH GHI LIÊN QUAN (TCCR, TCNT, OCR, TIMSK, TIFR)
4.2.1 THANH GHI TCCRn
Thanh ghi điều khiển TCCR dùng để xác định các Mode làm việc của bộ
timer/counter, kiểu hoạt động ngõ ra chân OCn và bộ chia của bộ phát xung.

Hình 4.2 Thanh ghi TCCR0


Bit7 – FOC0: bit này chỉ có tác dụng trong hoạt động không sử dụng điều xung PWM,
và bit này nên được viết 0 khi sử dụng trong hoạt động PWM. Khi bit này được viết lên
mức 1 một hoạt động so sánh bằng sẽ xảy ra theo cài đặc của 2 bit COM00 và COM01.

- 40/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
Hoạt động này không phát sinh ra ngắt và không xóa giá trị thanh ghi OCR0 trong hoạt
động CTC. Hoạt động này thích hợp trong việc tạo tần số với duty cycle thay đổi.
Bit6 – WGM00: bit này kết hợp với bit 3 sẽ qui định các chế độ hoạt động của bộ timer
(Normal, CTC, Fast PWM, phase correct PWM).

WGM01 WGM00 Chế độ hoạt Giá trị Thời điểm cập Thời điểm cờ
Mode
Bit 3 Bit 6 động cực đại nhật OCR0 tràn bậc lên 1
0 0 0 Normal 255 Ngay tức thời 255
PWM, Phase
1 0 1 255 255 0
correct
2 1 0 CTC OCR0 Ngay tức thời OCR0
3 1 1 Fast PWM 255 255 255
Bảng 4.1 Các mode làm việc của bộ timer/counter0
Bit5 – COM01: Bit này kết hợp với bit 4 để điều khiển chân OC0, lưu ý phải khai báo
chân OC0 là ngõ ra trước khi sử dụng, tùy thuộc vào các mode hoạt động khác nhau mà
ta có bảng kết nối chân OC0 khác nhau.
Bit4 – COM00: xem bit 5
Bit3 – WGM01: xem bit 6
Bit2.1.0 – CS02.01.00: 3 bit này dùng để xác định nguồn tạo xung đưa vào bộ counter.

Hình 4.3 Bộ chia và bộ chọn kênh cho hoạt động timer/counter

1 xung = bộ chia * CKM


(2)
Thời gian để timer/counter tràn là 255 xung cho timer/counter0,2 (8bit) và 65535
xung cho timer/counter1 (16 bit)

- 41/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16

Stt CS02 CS01 CS00 Description (mô tả)


1 0 0 0 Timer/counter không hoạt động
2 0 0 1 clkI/O (không chia tần số, bộ chia = 1)
3 0 1 0 clkI/O/8 (bộ chia = 8)
4 0 1 1 clkI/O/64 (bộ chia = 64)
5 1 0 0 clkI/O/256 (bộ chia = 256)
6 1 0 1 clkI/O/1024 (bộ chia = 1024)
7 1 1 0 Nhận xung ngoài từ chân T0, tác động cạnh xuống
8 1 1 1 Nhận xung ngoài từ chân T0, tác động cạnh lên
Bảng 4.2 Chọn nguồn xung cho bộ timer/counter
Chú ý: Dựa vào hình vẽ 4.3 và bảng 4.2 trên ta nhận thấy rằng khi sử dụng bộ
timer/counter là bộ đếm thì bộ chia luôn bằng 1.
Xem bài tập ví dụ 1.
4.2.2 Thanh ghi TCNT: Lưu giá trị đang đếm ta cũng có thể gọi đây là bộ counter.
4.2.3 Thanh ghi OCR: Lưu trữ giá trị mong muốn (giá trị đặt)
4.2.4 Thanh ghi TIMSK
Bit 7 6 5 4 3 2 1 0
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban
0 0 0 0 0 0 0 0
đầu
Hình 4.4 Thanh ghi TIMSK
Bit7 – 2: không sử dụng
Bit1 – OCIE0: bit này kết hợp với bit I trong thanh ghi trạng thái (status register) để
cho phép hoạt động ngắt khi giá trị trong thanh ghi TCNT0 và OCR0 bằng nhau.
Bit0 – TOIE0: bit này kết hợp với bit I trong thanh ghi trạng thái (status register) để
cho phép hoạt động ngắt khi hiện tượng tràn xảy ra.
4.2.5 Thanh ghi TIFR
Bit 7 6 5 4 3 2 1 0
OCF2 TOV2 ICF1 OCIF1A OCIF1B TOV1 OCF0 TOV0
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban đầu 0 0 0 0 0 0 0 0
Hình 4.5 Thanh ghi TIFR

Bit7 – 2: không sử dụng


- 42/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
Bit1 – OCF0: (Cờ ngắt OCF0) cờ ngắt xảy ra khi bộ counter bằng với giá trị cài đặc
trong OCR0, cờ này sẽ được tự động xóa bởi phần cứng khi sử dụng ngắt và xóa bởi
phần mềm khi viết logic cao vào cờ này.
Bit0 – TOV0: (cờ tràn TOV0) cờ tràn sẽ ở mức cao khi bộ counter tràn (từ MAX về
BOTTOM) và được tự động xóa bởi phẩn cứng khi sử dụng ngắt và xóa bởi phần mềm
khi viết logic cao vào cờ này.
4.3 CÁC CHẾ ĐỘ HOẠT ĐỘNG CỦA TIMER/COUNTER
4.3.1 CHẾ ĐỘ BÌNH THƯỜNG (NORMAL)
Đây là chế độ hoạt động đơn giản nhất, bộ counter sẽ đếm từ BOTTOM (0x00) tới
MAX (0xFF) và lặp lại từ BOTTOM. Cờ tràn TOV0 sẽ tự động bật lên 1 khi bộ counter
đếm từ 255 về 0, muốn xóa cờ tràn này ta phải viết logic 1 vào nó, khi sử dụng ngắt thì
cờ tràn sẽ tự động xóa về 0, thời gian đếm phụ thuộc vào bộ chia (prescaler) được cài
đặt bởi thanh ghi TCCR0, có thể bằng 1, 8, 64, 256 hoặc 1024.

Hình 4.6 Giản đồ thời gian trong hoạt động NORMAL


Bài tập ví dụ: Viết chương trình định thời thời gian là 10 giây, tần số thạch anh là 2Mhz.

Hình 4.7 Sơ đồ nguyên lý của mạch định thời

- 43/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
Bài giải:

Chu kì máy: = = = 0.5


.


Vậy số CKM để chạy trong 10 giây là: = 2 ∗ 10 CKM
.

Vậy ta phải chọn bộ chia là 1024 để có được số xung tối thiểu,



Số xung tối thiểu = = 19531.

Vậy ta cần 19531 xung để có được bộ định thời 10 giây.


Nếu sử dụng bộ định thời 8 bit (timer0/timer2) thì ta có: = 76

Vậy cờ tràn TOV0 sẽ có 76 lần bật lên 1.


Vậy ta chọn biến đếm là unsigned char.
Chương trình được viết như sau
#include <mega16.h>

unsigned char index;


bit key;

// Timer 0 overflow interrupt service routine


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
index++;
PORTD++;
if(index == 76)
{
PORTC.0 = 1;
PORTD = 0;
index = 0;
key = 1;
}
}

void main(void)
{
PORTA=0x00;
DDRA=0x00; //PORTA là ngõ vào

PORTB=0x00;
DDRB=0x00; //PORTB là ngõ vào

PORTC=0x00;
DDRC=0xFF; //PORTC là ngõ ra

PORTD=0x00;
DDRD=0xff; //PORTD là ngõ ra

TIMSK=0x01; //Cho phép ngắt tràn

- 44/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
ACSR=0x80; //Không sử dụng mode so sánh

// Global enable interrupts


#asm("sei")

while (1)
{
// Place your code here
TCCR0 = 0;
while(PINA.0);
TCCR0 = 0x05; //chế độ là normal, bộ chia 1024
PORTC.0 = 0;
while(!PINA.0); //chờ nhã phím
}
}

4.3.2. Chế độ CTC: (xóa khi so sánh bằng) bộ timer/counter sẽ đếm lên, khi giá trị trong
thanh ghi counter (TCNT0) bằng với thanh ghi OCR0 (đã cài đặc trước) thì bộ counter
sẽ bị xóa về 0 và tiếp tục đếm lên, cờ ngắt OCF0 nếu có sẽ xảy ra khi bộ counter đạt giá
trị Max (bằng với OCR0).

Hình 4.8 Giản đồ thời gian trong hoạt động CTC

Tín hiệu OC0 sẽ không được xuất ra trên chân OC0 (PB3) nếu ta không cài đặt chức
năng Ouput cho chân này (xem thanh ghi DDRB), các trạng thái của OC0 trong mode
này được mô tả trong bảng sau:

COM01 COM00 Description (Mô tả)

0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O

0 1 Chân OC0 đảo trạng thái khi TCNT0 = OCR0 (toggle)

- 45/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16

1 0 Chân OC0 = 0 khi bằng

1 1 Chân OC1 = 1 khi bằng


Bảng 4.3 Ngõ ra OC0 trong hoạt động CTC
Tần số trên chân OC0 được tính bởi công thức sau:

_ /
=
2. . (1 + 0)
(3)
Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024).
Xem bài tập ví dụ 2
4.3.3 Chế độ PWM PHASE CORRECT
Chu kỳ hoạt động của bộ counter là hoạt động kép nghĩa là bộ counter sẽ đếm từ
BOTTOM (0x00) đến MAX (0xFF) sau đó đếm từ MAX về BOTTOM và quá trình này
lặp lại bất chấp bộ counter lớn hơn, nhỏ hơn hay bằng với OCR0.
Đối với hoạt động ngõ ra không đảo: khi bộ counter (thanh ghi TCNT0) bằng với
thanh ghi OCR0 thì OC0 sẽ được xóa về 0, nếu bộ counter đang đếm lên, khi bộ counter
đếm xuống thì OC0 sẽ bằng 1.
Đối với hoạt động đảo thì OC0 sẽ hoạt động ngược lại.

Hình 4.9 Giản đồ thời gian trong hoạt động PWM – PHASE CORRECT

Tín hiệu OC0 sẽ không được xuất ra trên chân OC0 (PB3) nếu ta không cài đặt chức
năng ouput cho chân này (xem thanh ghi DDRB), các trạng thái của OC0 trong mode
này được mô tả trong bảng 4.1.

- 46/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16

COM01 COM00 Description (Mô tả)

0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O

0 1 Không sử dụng
OC0 = 0 khi TCNT0 = OC0 trong khi đếm lên
1 0
OC0 = 1 khi TCNT0 = OC0 trong khi đếm xuống
OC0 = 1 khi TCNT0 = OC0 trong khi đếm lên
1 1
OC0 = 0 khi TCNT0 = OC0 trong khi đếm xuống
Bảng 4.4 Ngõ ra OC0 trong hoạt động PWM – PHASE CORRECT

Tần số trên chân OC0 được tính bởi công thức sau:

_ /
=
∗ 510
(4)
Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024).
Bài tập ví dụ: cho biết thanh ghi OCR0 = 145 và thanh ghi TCCR0 = 0x01100010

4.3.4 Chế độ Fast PWM

Chu kỳ hoạt động của bộ counter sẽ là hoạt động đơn, nghĩa là bộ counter sẽ đếm
từ BOTTOM đến MAX sau đó reset về BOTTOM và đếm lên tiếp, quá trình này lặp lại
bất chấp bộ counter lớn hơn, nhỏ hơn hay bằng với OCR0.

Ở chế độ không đảo OC0 sẽ bị xóa về 0 khi bộ counter trùng với OCR0, và bằng 1
khi bộ counter bằng BOTTOM.

Ở chế độ đảo thì ngược lại.

- 47/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16

Hình 4.10 Giản đồ thời gian cho hoạt động FAST PWM

Tín hiệu OC0 sẽ không được xuất ra trên chân OC0 (PB3) nếu ta không cài đặt chức
năng ouput cho chân này (xem thanh ghi DDRB), các trạng thái của OC0 trong mode
này được mô tả trong table 40.

COM01 COM00 Mô tả (Description)


0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O
0 1 Không sử dụng
OC0 = 0 khi TCNT0 bằng OCR0, OC0 = 1 khi TCNT0 = 0
1 0
OC0 = 1 khi TCNT0 bằng OCR0, OC0 = 0 khi TCNT0 = 0
OC0 = 1 khi TCNT0 bằng OCR0, OC0 = 0 khi TCNT0 = 0
1 1
OC0 = 0 khi TCNT0 bằng OCR0, OC0 = 1 khi TCNT0 = 0

Bảng 4.5 Ngõ ra oc0 trong hoạt động FAST PWM

Tần số trên chân OC0 được tính bởi công thức sau:

_ /
=
∗ 256
(5)
Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024).

- 48/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
4.4 Bài tập ví dụ

Ví dụ 1: Trong chế độ Normal, tần số thạch anh là 1 Mhz, sử dụng bộ chia là 64, hỏi
trong 1 giây timer tràn bao nhiêu lần.

Giải: Dựa vào hình vẽ 4.3 ta nhận thấy rằng, 1 xung ngõ ra của bộ chia bằng 64 chu
kì máy (CKM).
Ta có 1CKM = 1/fosc = 1 (us)
1 xung = 64 CKM = 64us
Thời gian tràn là 255 xung = 255.64 = 16.320 us
Vậy số lần tràn trong 1 giây là: 61 lần

Ví dụ 2: Viết chương trình tạo tần số 5Khz trên chân PB.3, thạch anh 4Mhz

Giải: Vì yêu cầu mạch thiết kế tần số nên ta chọn mode CTC, OC0 ngõ ra dạng
toggle.
Mode CTC: WGM01 = 1; WGM00 = 0 (xem bảng 4.1)
Ngõ ra dạng toggle: COM00 = 1; COM01 = 0. (xem bảng 4.3)

Hình 4.11 Dạng xung cho tần số 5Khz


Chu kì máy = = 1

Để thực hiện 100us ta phải mất 100CKM < 255 nên ta chọn bộ chia = 1
Vậy
Thanh ghi TCCR0 = 0b00011001 = 0x19;
Thanh ghi OCR0 = 100;

Ví dụ 3: Hãy xác định thanh ghi TCCR2, biết rằng vi điều khiển sử dụng bộ chia 64,
chế độ hoạt động Fast PWM, ngõ ra OC2 = 0 khi bằng.
Giải: Sử dụng bộ chia 64 nên: CS02, CS01, CS00: 011 (xem bảng 4.2)
Chế độ hoạt động Fast PWM: WGM01,00 = 11 (xem bảng 4.1)
Ngõ ra OC2 = 0 khi bằng: COM00,01 = 01 (xem bảng 4.5)

- 49/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
4.4 CÂU HỎI ÔN TẬP HẾT CHƯƠNG
Câu 1: Hãy nêu các thời điểm xảy ra hoạt động ngắt (ngắt bằng và ngắt tràn) trong
hoạt động Timer/Counter.
Câu 2: Vi điều khiển có bao nhiêu chân điều xung, kể tên các chân đó.
Câu 3: Khi sử dụng đếm sự kiện tín hiệu vào phải ở chân nào?
Câu 4: Hãy cho biết sự khác nhau và giống nhau giữa 2 mode Fast PWM và Phase
correct PWM.
Câu 5: Hãy viết chương trình tạo tần số 20 Khz trên chân OC0 (PB3) với duty cycle
là 50%, tần số thạch anh là 2Mhz.
Câu 6: Viết chương trình tạo bộ định thời chính xác 10 giây, tần số thạch anh là 1Mhz
(gợi ý: sử dụng chế độ CTC)
Câu 7: Hãy viết chương trình tạo tần số 8 Khz trên chân OC0 (PB3) với duty cycle là
75%.
Câu 8: Hãy viết chương trình đếm sản phẩm trên chân T0 sử dụng chức năng
timer/counter (tác động cạnh lên), khi đếm đến 100 sản phẩm thì sẽ xuất tín
hiệu trên chân PORTD.7 = 1 trong khoảng 5 giây, sau đó lặp lại từ đầu.
Câu 9: Hãy viết chương trình điều khiển động cơ từ tốc độ thấp nhất đến cao nhất, từ
cao nhất đến thấp nhất rồi lặp lại.
Câu 10: Hãy viết chương trình đo tốc độ động cơ.

- 50/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16

Chương 5

BỘ SO SÁNH TÍN HIỆU


TƯƠNG TỰ
(ANALOG COMPARATOR)

- 51/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16


5.1 GIỚI THIỆU
Là bộ so sánh mức điện áp trên chân AIN0 với mức điện áp trên chân AIN1, khi
điện áp trên chân AIN0 lớn hơn chân AIN1 thì bit ngõ ra ACO (Analog Comparator
Ouput) trong thanh ghi ACSR bằng 1. Kết quả so sánh này cũng có thể kích hoạt chức
năng đọc giá trị đếm của counter trong bộ timer/counter1, và nó cũng có thể kích hoạt
hoạt động ngắt.
5.2 CÁC THANH GHI LIÊN QUAN
 Thanh ghi SFIOR kết hợp với thanh ghi ADCSRA dùng để chọn chân thay thế
cho chân AIN1
 Thanh ghi ACSR : Thanh ghi điều khiển hoạt động so sánh

Hình 5.1 Sơ đồ khối hoạt động của bộ so sánh

- 52/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16


V.2.1 THANH GHI SFIOR

Bit 7 6 5 4 3 2 1 0
ADTS2 ADTS1 ADTS0 ADHSM ACME PUD PSR2 PSR10
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban đầu 0 0 0 0 0 0 0 0
Hình 5.2 Thanh ghi SFIOR
Bit ACME Analog Comparator Multiplexer Enable, cho phép chọn ngõ vào thay
cho chân AIN1, dựa vào sơ đồ trên ta nhận thấy rằng khi bit ADEN = 0 (ADC bị ngưng
hoạt động) và bit ACME = 1, thì việc chọn ngõ vào thay cho chân AIN1 phụ thuộc vào
3 bit MUX2..0 của thanh ghi ADMUX.

5.2.2 Thanh ghi ADCSRA

Bit 7 6 5 4 3 2 1 0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban đầu 0 0 0 0 0 0 0 0
Hình 5.3 Thanh ghi ADCSRA
Bit ADEN kết hợp với bit ACME để chọn các chân thay thế cho AIN1

ACME ADEN MUX2.0 Ngõ vào chân có điện áp âm


0 x xxx AIN1
1 1 xxx AIN1
1 0 000 ADC0
1 0 001 ADC1
1 0 010 ADC2
1 0 011 ADC3
1 0 100 ADC4
1 0 101 ADC5
1 0 110 ADC6
1 0 111 ADC7
Bảng 5.1 Chọn chân điện áp ngõ vào

- 53/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16


5.2.3 Thanh ghi ACSR

Bit 7 6 5 4 3 2 1 0
ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0
Read/ Write RW RW R RW RW RW RW RW
Giá trị ban đầu 0 0 N/A 0 0 0 0 0
Hình 5.4 Thanh ghi ACSR
 Bit 7 – ACD Analog Comparator Disable: khi bit này bằng 1 thì bộ so sánh không
hoạt động, khi bit này bằng 0 thì được phép hoạt động. Bit này được bật lên 1 ở bất
kỳ thời điểm nào điều này giúp cho vi điều khiển tiết kiệm được điện áp tiêu thụ
trong hoạt động Idle.
 Bit 6 – ACBG Analog Comparator Bandgap Select: Khi bit này bằng 1 điện áp tham
chiếu (1.15v – 1.35v) sẽ được kết nối với chân dương của bộ so sánh, khi bằng 0 thì
chân AIN0 được kết nối với bộ so sánh.
 Bit 5 – ACO Analog Comparator Ouput: ngõ ra của bộ so sánh.
 Bit 4 – ACI Analog Comparator Interrupt Flag: cờ ngắt của bộ so sánh phụ thuộc
vào 2 bit ACIS1 và ACIS0. Cờ ngắt trong hoạt động so sánh được thực hiện khi bit
ACIE và bit I trong thanh ghi SREG được cài đặc lên 1. Ở chế độ ngắt cờ này tự
động xóa về 0, ngược lại cờ này được xóa khi viết mức logic 1 vào nó.
 Bit 3 – ACIE Analog Comparator Interrupt Enable: Bit này cho phép ngắt khi = 1.
 Bit 2 – ACIC Analog Comparator Input Capture Enable: khi bit này = 1 nó cho phép
đọc giá trị trong counter của bộ timer/counter1.
 Bit 1,0 – ACIS1, ACIS0: Analog Comparator Interrupt Mode Select

ACIS1 ACIS0 Các dạng ngắt

0 0 Ngắt khi có sự thay đổi ngõ ra

0 1 Không sử dụng

1 0 Ngắt xảy ra tại cạnh xuống

1 1 Ngắt xảy ra tại cạnh lên

Bảng 5.2 Cài đặt ngắt trong hoạt động AC

- 54/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16


5.2.4 Bài tập ví dụ

Viết chương trình khi điện áp trên chân PB2 lớn hơn chân PB3 thì PORD.0 = 1, ngược
lại thì =0;

Hình 5.5 Bài tập ví dụ 1


Chương trình mô phỏng
/*****************************************************
Project : Hoạt động AC
Date : 15/02/2014
Author : LÂM QUANG CHUYÊN
*****************************************************/

#include <mega16.h>

// Analog Comparator interrupt service routine


interrupt [ANA_COMP] void ana_comp_isr(void)
{
PORTD.0 = ~PORTD.0;
}

void main(void)
{
PORTA=0x00;
DDRA=0xFF;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0xFF;

- 55/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16


// Analog Comparator initialization
// Analog Comparator: On
// Interrupt on Output Toggle
ACSR=0x08;
SFIOR=0x00;

// Global enable interrupts


#asm("sei")

while (1)
{
// Place your code here

}
}

5.3 CÂU HỎI ÔN TẬP HẾT CHƯƠNG


1. Hãy phân tích hình vẽ 5.1
2. Hãy cài đặc chương trình để có ngõ AIN1 là chân ADC5
3. Hãy viết chương trình khi điện áp chân PB.2 lớn hơn điện áp trên chân PA.2 thì đèn
trên chân PD.0 sáng, ngược lại đèn tắt.

- 56/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16

Chương 6

BỘ BIẾN ĐỔI TƯƠNG TỰ


SANG SỐ
(ANALOG TO DIGITAL CONVERTER)

-57/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
6.1 GIỚI THIỆU
6.1.1 Giới thiệu
Bộ biến đổi ADC là biến đổi tín hiệu từ tương tự sang tín hiệu số, tùy thuộc vào độ
phân giải (số bit được biến đổi) và tốc độ biến đổi và độ sai số mà ta có chất lượng biến
đổi khác nhau, và cũng tùy vào từng ứng dụng cụ thể mà ta có thể chọn các bộ biến đổi
ADC cho phù hợp với công việc của mình.
Việc biến đổi tín hiệu từ tương tự sang số có rất nhiều ứng dụng trên thực tế: Đo
lường nhiệt độ, độ ẩm, cân điện tử, biến đổi tín hiệu âm thanh để lưu trữ sang dạng số…
Đối với vi điều khiển atmega16 ta có các thông số sau:
 Là bộ biến đổi tín hiệu tương tự (0 – VCC) sang tín hiệu số với giá trị tương
ứng, độ phân giải tối đa 10 bit ~ 1023 bước.
 Độ chính xác ± 2LSB
 Các chân biến đổi ADC từ PA.0 đến PA.7 và tại mỗi thời điểm chỉ có 1 chân
được biến đổi.
 Mối quan hệ giữa điện áp ngõ vào (điện áp cần biến đổi), điện áp tham chiếu và
độ phân giải:

Vin b
a .2 (6.1)
Vref
Trong đó:
o a: Giá trị số sau khi biến đổi (thay đổi từ 0 đến 1023)
o Vin: Điện áp ngõ vào (0 – 5VDC)
o Vref: Điện áp tham chiếu (0 – 5VDC)
o b: số bit biên đổi (độ phân giải) đối với atmega b = 10

-58/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
Việc chọn điện áp tham chiếu phụ thuộc vào độ phân giải và số bit của thiết bị và
được tính như sau:

Vref  dpg.2b (6.2)

Với: dpg: độ phân giải của thiết bị, cảm biến

Hình 6.1 Tín hiệu tương tự và tín hiệu số

6.1.2 Bài tập ví dụ


Ví dụ 1: Một bộ biến đổi ADC có điện áp ngõ vào là 1,35 volt, độ phân giải là 5mv, số
bit biến đổi là 10 bit, hỏi giá trị ngõ ra và điện áp tham chiếu là bao nhiêu?
Giải: Dựa vào công thức 6.2 ta có điện áp tham chiếu là:
Vref = dpg.2b = 0.005.210 = 5.12 (volt)
Giá trị ngõ ra theo công thức 6.1 là:

Vin b 1.35
a .2  *1024  270
Vref 5.12
Ví dụ 2: Sau khi biến đổi ADC, ngõ ra nhận được là: 0x253, hỏi điện áp tham chiếu và
giá trị điện áp ngõ vào là bao nhiêu, biết số bit sử dụng là 8 bit, độ phân giải
10mVolt.
Giải: Điện áp tham chiếu theo công thức 6.2 là:
Vref = dpg.2b = 0.01.28 = 2.56 (volt)
Điện áp ngõ vào theo công thức 6.1 là:
a.Vref 595 * 2.56
Vin  b
  1.49 volt
2 1024
-59/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
6.2 CÁC THANH GHI LIÊN QUAN
6.2.1 Thanh ghi ADMUX
Bit 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban đầu 0 0 0 0 0 0 0 0
Hình 6.2 Thanh ghi ADMUX

 Bit 7 – 6: REFS0.1 chọn điện áp tham chiếu xem bảng bên trên.

Stt REFS1 REFS0 Nguồn điện áp tham chiếu


0 0 0 AREF, không sử dụng điện áp tham chiếu nội
1 0 1 AVCC với tụ được đặt tại chân AREF
2 1 0 Không sử dụng
3 1 1 Điện áp tham chiếu nội 2.56V với tụ ngoài tại chân
AREF
BẢNG 6.1 Chọn điện áp tham chiếu

 Bit 5: ADLAR (ADC Left Adjust Result): bit này dùng để chọn byte cao, byte
thấp của dữ liệu, khi ADLAR = 0, ADCL lưu bit0..7, ADCH lưu bit8.9. Khi
ADLAR = 1 thì ngược lại.

Hình 6.3 Thanh ghi dữ liệu ADC khi ADLAR = 0

Hình 6.4 Thanh ghi dữ liệu ADC khi ADLAR = 1

-60/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
 Bit 4:0 MUX4:0 Dùng chọn kênh ngõ vào và độ lợi của biến đổi ADC

Single Positive Negative


MUX4..0 Ended Input Differential Differential Gain
Input Input
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
00100 ADC4
KHÔNG SỬ DỤNG
00101 ADC5
00110 ADC6
00111 ADC7
01000 ADC0 ADC0 10x
01001 ADC1 ADC0 10x
01010 ADC0 ADC0 200x
01011 ADC1 ADC0 200x
01100 ADC2 ADC2 10x
01101 ADC3 ADC2 10x
01110 ADC2 ADC2 200x
01111 ADC3 ADC2 200x
10000 ADC0 ADC1 1x
10001 KHÔNG ADC1 ADC1 1x
10010 ADC2 ADC1 1x
SỬ
10011 ADC3 ADC1 1x
10100 DỤNG ADC4 ADC1 1x
10101 ADC5 ADC1 1x
10110 ADC6 ADC1 1x
10111 ADC7 ADC1 1x
11000 ADC0 ADC2 1x
11001 ADC1 ADC2 1x
11010 ADC2 ADC2 1x
11011 ADC3 ADC2 1x
11100 ADC4 ADC2 1x
11101 ADC5 ADC2 1x
11110 1.22V (VBG)
KHÔNG SỬ DỤNG
11111 0V (GND)
Bảng 6.2 Các chân ngõ vào và độ lợi

-61/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
6.2.2 Thanh ghi ADCSRA
Bit 7 6 5 4 3 2 1 0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban đầu 0 0 0 0 0 0 0 0
Hình 6.5 Thanh ghi ADCSRA
 Bit 7 (ADEN): Bit này bằng 1 sẽ cho phép hoạt động ADC, bằng không sẽ
không cho phép hoạt động. Nếu bit này được viết vào giá trị không trong
lúc đang biến đổi ADC thì hoạt động ADC này sẽ bị hủy bỏ.
 Bit 6(ADSC): Bắt đầu hoạt động ADC, khi bit này bằng 1 nó sẽ bắt đầu
biến đổi ADC, và sẽ trở về mức logic không sau khi biến đổi xong, viết
logic 0 vào bit này không có giá trị.
 Bit 5(ADATE): Khi bit này bằng 1 nó sẽ cho phép nguồn kích hoạt ADC
 Bit 4(ADIF): Cờ ngắt trong hoạt động ADC, khi sử dụng ngắt cờ này sẽ bật
lên 1 khi biến đổi ADC hoàn tất, trong hoạt động ngắt cờ này sẽ tự động
được xóa về không, khi không sử dụng ngắt muốn xóa cờ này phải ghi mức
logic 1 vào.
 Bit 3(ADIE): Cho phép ngắt trong hoạt động ADC, khi bit này bằng 1 thì
cho phép hoạt động ADC, khi hoạt động ADC hoàn thành sự kiện ngắt sẽ
được kích hoạt.
 Bit 2 – 0 (ADPS2..0): Chọn bộ chia (thời gian biến đổi ADC) trong hoạt
động ADC

Stt ADPS2 ADPS1 ADPS0 Hệ số chia


1 0 0 0 2
2 0 0 1 2
3 0 1 0 4
4 0 1 1 8
5 1 0 0 16
6 1 0 1 32
7 1 1 0 64
8 1 1 1 128
BẢNG 6.3 Chọn tần suất lấy mẫu
-62/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16

Hình 6.6 Bộ chia trong hoạt động ADC

Hình 6.7 Giản đồ thời gian cho lần biến đổi ADC đầu tiên

Hình 6.8 Giản đồ thời gian cho lần biến đổi ADC thứ 2

-63/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
6.2.3 Thanh ghi SFIOR
Bit 7 6 5 4 3 2 1 0
ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban
0 0 0 0 0 0 0 0
đầu
Hình 6.9 Thanh ghi SFIOR

 Bit 7 – 5 (ADTS2..0) Các nguồn kích hoạt ADC

Stt ADTS2 ADTS1 ADTS0 Nguồn kích hoạt


1 0 0 0 Biến đổi ADC liên tục
2 0 0 1 So sánh điện áp giữa 2 chân AIN0 và AIN1
3 0 1 0 Tác động bởi chân ngắt ngoài của vi điều khiển
4 0 1 1 Khi OCR0 = TCNT0
5 1 0 0 Khi Timer/Counter0 tràn
6 1 0 1 Khi OCR1B = TCNT1
7 1 1 0 Khi Timer/Counter1 tràn
8 1 1 1 Khi đọc giá trị thanh ghi TCNT1
Bảng 6.4 Các nguồn kích hoạt ADC

Hình 6.10 Các tác nhân kích hoạt ADC

 Bit 4 – 0: Các bit này không sử dụng trong hoạt động ADC

-64/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
6.3 BÀI TẬP VÍ DỤ

Ví dụ 1: Cho thanh ghi ADMUX có giá trị là 0xED, điện áp trên chân ADC3 là 300mV,
ADC2 = 500mV, hỏi giá trị ADCH, ADCL là bao nhiêu?

Giải: Ta có gán các bit vào thanh ghi ADMUX như hình vẽ sau

Bit 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
Read/ Write RW RW RW RW RW RW RW RW
Giá trị 1 1 1 0 1 1 0 1
Bit 7 – 6: REFS1=1; REFS0=1 dựa vào bảng 6.2, ta thấy điện áp tham chiếu là điện áp
nội có giá trị là 2.56 volt.
Bit 5: ADLAR = 1 nên giá trị lưu trong thanh ghi ADCH và ADCL là:
ADCH = bit9..2 ADCL = bit1.0
Bit 4 – 0: MUX = 01101 dựa vào bảng 6.3 trang ta nhận thấy độ lợi là GIAN = 10

( − ). . 512
=

Như vậy giá trị trên thanh ghi ADCR sẽ là

ADC = 512*10*(300-500)/2560= -400 = 1024 – 400 = 0x270 = 0b1001110000

Vậy ADCH = 0b10011100 = 0x9C và ADCL = 0b00--.----.=0x00

Ví dụ 2: Viết chương trình khi nhấn nút SW trên chân 16 (INT0 – PB2) thì vi điều khiển
sẽ biến đổi tín hiệu ADC từ chân PA5 sau đó hiển thị kết quả trên PORTD cho
byte cao (bit9.8) và PORTC cho byte thấp (bit7..0)
Giải: Các bước thực hiện:
 Xác định tác nhân kích hoạt ADC.
 Xác định điện áp tham chiếu.
 Xác định dữ liệu được lưu trong thanh ghi ADCL, ADCH.
 Xác định tần suất lấy mẫu.
 Xác định chân cần biến đổi ADC.
 Xác định xem có ngắt hay không.
Tác nhân kích hoạt ADC:
Ngắt ngoài 0 INT0 vậy ADTS2.0 = 010 và ADATE = 1
Điện áp tham chiếu:
-65/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
Ta chọn Vref = 2.56v (internal reference) nên REFS1.0 = 11
Xác định dữ liệu trong thanh ghi
Vì PORTB = bit9.8 và PORTC = bit7.00 nên bit ADLAR = 0
Tần suất lấy mẫu:
Trong đề bài không đề cập đến tần suất biến đổi ADC nên ta chọn tùy ý, ở đây ta
chọn là thời gian nhanh nhất là fadc = fck / 2, vậy ADPS2.0 = 000
Chân cần biến đổi ADC:
PA5 nên MUX4..0: 00101
Xác định ngắt:
Có sử dụng ngắt nến ADIE = 1
Dựa vào phân tích trên ta có các thanh ghi có nội dung như sau: ADMUX, ADCH,
ADCL, ADCSRA, SFIOR.
ADMUX = 0b1100.0101
ADSRA = 0b1011.1000 bit ADSC = 1 được điều khiển bởi ngắt ngoài 0 để kích hoạt
biến đổi ADC.
SFIOR = 0b0101.0000
Ví dụ 3: Tính thời gian biến đổi ADC cho lần đầu và lần thứ 2, biết tần số thạch anh là
4 Mhz, sử dụng bộ chia 32.
Giải: Tính tần số CK
= =4 ℎ

Sử dụng bộ chia 32 nên = = 125 ℎ


Lần biến đổi ADC đầu tiên mất 25 ADCCLK nên thời gian biến đổi là:
= 25 ∗ = 200

Lần biến đổi ADC đầu tiên mất 25 ADCCLK nên thời gian biến đổi là:
= 12.5 ∗ = 100

6.4 CÂU HỎI ÔN TẬP HẾT CHƯƠNG

Câu 1: Atmega có mấy chân biến đổi được ADC, các chân nhận tín hiệu biến đổi ADC
trên Port nào, số chân?

Câu 2: Atmega16 có mấy nguồn điện áp tham chiếu, hãy nêu sự khác nhau giữa việc
chọn điện áp tham chiếu.

-66/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
Câu 3: Hãy nêu ý nghĩa của bộ prescaler trong hoạt động ADC.

Câu 4: Tần suất lấy mẫu lớn nhất và nhỏ nhất hoạt động ADC là bao nhiêu biết fclk =
2Mhz.

Câu 5: Hoạt động ngắt xảy ra ở thời điểm nào trong hoạt động ADC.

Câu 6: Độ phân giải là gì, hãy cho ví vụ minh họa.

Câu 7: Bit nào cho phép và không cho phép hoạt động ADC.

Câu 8: Bit nào nhận biết hoạt động ADC đã hoàn tất, hoặc đang thực hiện.

Câu 9: Hãy trình bài một ứng dụng trên thực tế có liên quan đến hoạt động ADC.

Câu 10: Khi điện áp ngõ vào cần biến đổi là 1,36v, điện áp tham chiếu là 2.56v, độ
phân giải 8 bit, hỏi giá trị sau khi biến đổi bằng bao nhiêu?

Câu 11: Khi giá trị sau khi biến đổi có giá trị là 672, điện áp tham chiếu là 4,5v, độ
phân giải 10 bit, hỏi giá trị điện áp ngõ vào là bao nhiêu?

Câu 12: Sau khi biến đổi ADC giá trị thu được là: 0x2d5, hỏi ADCH, ADCL có giá bị
là bao nhiêu, khi ADLAR = 0 và = 1.

Câu 13: Điện áp tham chiếu trên chân AREF = 3v, Điện áp trên chân 36 là 2v.

a. Hỏi giá trị lưu trong thanh ghi ADCH và ADCL là bao nhiêu (xét 2 trường
hợp ADLAR = 0 và = 1).

b. Giá trị thanh ghi ADMUX bằng bao nhiêu?

Câu 14: Xác định các thanh ghi trong hoạt động ADC:

a. Nguồn kích hoạt ADC (INT0).


b. Điện áp tham chiếu (3v).
c. 8 bit cao, 2 bit thấp.
d. Tần suất lấy mẫu (chia 64)
e. Chân cần biến đổi ADC.6.
f. Không sử dụng ngắt.

Câu 15: Xác định các thanh ghi trong hoạt động ADC:

a. Nguồn kích hoạt ADC (Khi điện áp chân 3 lớn hơn chân 4).
b. Điện áp tham chiếu (5v).
-67/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
c. 2 bit cao, 8 bit thấp.
d. Tần suất lấy mẫu (chia 32)
e. Chân cần biến đổi 35.
f. Không sử dụng ngắt.
g. Nếu giá trị trên thanh ghi ADCH = 0x03 và ADCL = 0b11001101 thì điện
áp trên chân 35 là bao nhiêu?

Câu 16: Viết chương trình khi nhấn nút SW trên chân 16 (INT0 – PB2) thì vi điều khiển
sẽ biến đổi tín hiệu ADC từ chân PA5 hiển thị kết quả trên PORTD cho byte
cao (bit9.8) và PORTC cho byte thấp (bit7..0). Điện áp tham chiếu VREF. Bộ
prescaler = 16.

Câu 17: Viết chương trình khi điện áp trên chân 3 lớn hơn chân 4 thì biến đổi ADC tín
hiệu giữa 2 chân 39, 40 (39 điện áp dương, 40 điện áp âm) độ lợi 200x, điện
áp tham chiếu AVCC, hiển thị kết quả trên PORTD cho byte cao (bit9..2) và
PORTC cho byte thấp (bit1.0). Bộ prescaler = 128.

Câu 18: Viết chương trình điều khiển tốc độ động cơ thông qua biến trở trên chân
PORTA.0, khi biến trở có giá trị nhỏ nhất thì động cơ quay thấp nhất (ngừng
quay), khi biến trở có giá trị cao nhất thì động cơ quay nhanh nhất.

Câu 18: Viết chương trình điều khiển tốc độ động cơ thông qua biến trở trên chân
PORTA.0, khi biến trở có giá trị nhỏ nhất thì động cơ quay thấp nhất (ngừng
quay), khi biến trở có giá trị cao nhất thì động cơ quay nhanh nhất.
Câu 19: Tính thời gian biến đổi ADC biết tần số thạch anh là 5Mhz, biết thanh ghi
ADCSRA = 0bxxxx.x101.
Câu 20: Hãy cho biết thời gian biến đổi nhanh nhất và chậm nhất của hoạt động ADC
biết tần số thạch anh là 8 Mhz.

-68/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

Chương 7

TRUYỀN NHẬN DỮ LIỆU


ĐỒNG BỘ
VÀ BẤT ĐỒNG BỘ
(THE UNIVERSAL SYNCHRONOUS AND ASYNCHRONOUS SERIAL
RECEIVER AND TRANSMITTER USART)

-71/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

7.1 GIỚI THIỆU


Đây là bộ truyền nhận dữ liệu nối tiếp đồng bộ và không đồng bộ, biên độ thay đổi
từ -12v đến 12v thích hợp trong môi trường công nghiệp, có nhiều tín hiệu nhiễu, việc
truyền nhận dữ liệu được thực hiện trên 2 chân của vi điều khiển RxD và TxD.
7.1.1 Hoạt động đồng bộ
Dữ liệu truyền đi sẽ được đồng bộ với xung clock, là hoạt động có sự phối hợp giữa
chân XCK và RxD/TxD, trong hoạt động đồng bộ không đòi hỏi phải có cài đặt thông
số (bắt tay) giữa 2 thiết bị, thời điểm nhận và thay đổi dữ liệu phụ thuộc vào bit UCPOL
của thanh ghi UCSRC.

7.1.2 Hoạt động bất đồng bộ

Là hoạt động chỉ phụ thuộc vào chân RxD/ TxD kết hợp với thời gian (tốc độ baud)
mà không phụ thuộc vào chân CLK, một khung dữ liệu của hoạt động bất đồng bộ bao
gồm: xung start bit, số bit dữ liệu (5,6,7,8,9 tùy mục đích sử dụng), 1 hoặc 2 stop bit,
trong hoạt động bất đồng bộ đòi hỏi phải cài đặc thông số giữa 2 thiết bị phải giống
nhau, cụ thể các thông số sau:
Số lượng stop bit (1,2)
Tốc độ baud (1200, 2400, 9600,…)
Kiểm tra chẵn lẻ (parity bit)
Số bit được truyền đi trong 1 khung (5, 6, 7, 8, 9)

Hình 7.1 Khung dữ liệu giao tiếp nối tiếp

-72/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

7.1.3 Đặc tính giao tiếp USART


 Hoạt động truyền nhận song công
 Đồng bộ và không đồng bộ
 Tốc độ truyền nhanh
 Hỗ trợ các khung 5,6,7,8 hoặc 9 bit dữ liệu, 1 hoặc 2 stop bit (bất đồng bộ)
 Giao tiếp nhiều vi điều khiển theo nghi thức Master, Slaver
7.2 CÁC THANH GHI LIÊN QUAN

UDR (read), UDR (write), UCSRA, UCSRB, UCSRC, UBRRH, UBRRL.

7.2.1 Thanh ghi UDR

Là thanh ghi đệm dùng để truyền UDR (write) và nhận UDR (read) dữ liệu nó có
cùng địa chỉ, việc viết dữ liệu vào thanh ghi đệm chỉ thực hiện được khi cờ UDRE trong
thanh ghi UCSRA bằng 1.

Bit 7 6 5 4 3 2 1 0
RXB[7:0]
TXB[7:0]
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban đầu 0 0 0 0 0 0 0 0
Hình 7.2 Thanh ghi UDR

7.2.2 Thanh ghi UCSRA

Bit 7 6 5 4 3 2 1 0
RXC TXC UDRE FE DOR PE U2X MPCM
Read/ Write R RW R R R R RW RW
Giá trị ban đầu 0 0 0 0 0 0 0 0
Hình 7.3 Thanh ghi UCSRA

Bit 7 – RXC USART (USART Receive Complele) khi RXC = 1 thì dữ liệu trong thanh
ghi UDR (read) chưa đọc, và khi RXC = 1 thì dữ liệu trong thanh ghi này đã được đọc,
khi đó thanh ghi UDR (read) được xem là thanh ghi trống.

Bit 6 – TXC (USART Transmit Complete) dùng thông báo cho hoạt động truyền dữ liệu
đã hoàn tất, khi TXC = 1 thì toàn bộ dữ liệu trong thanh ghi dịch (shift register) đã được
dịch chuyển ra ngoài và không còn dữ liệu trong thanh ghi UDR (write). Bit này tự động
xóa về 0 khi thực thi hoạt động ngắt, hoặc ghi giá trị 1 vào bit này, bit này có thể kích
hoạt hoạt động ngắt.
-73/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

Bit 5 – UDRE (USART Data Register Empty) bit này dùng để báo cho biết thanh ghi
UDR (write) có sẵn sàng nhận dữ liệu mới hay không. Nếu bit này = 1 thì bộ đệm trống,
thanh ghi UDR (write) sẵn sàng nhận dữ liệu. Bit này có thể kích hoạt hoạt động ngắt
khi thanh ghi đệm trống. Bit này = 1 sau hoạt động reset.

Bit 4 – FE (Frame Error) khi FE = 1 sẽ thông báo lỗi trong hoạt động nhận dữ liệu, bit
này phải được viết = 0 khi trong thanh ghi UCSRA.

Bit 3 – DOR (Data OverRun) DOR = 1 nếu xảy ra quá trình tràn dữ liệu, bit này phải
được viết = 0 khi trong thanh ghi UCSRA.

Bit 2 – PE (Parity Error) PE = 1 khi có lỗi về Parity xảy ra, bit này phải được viết = 0
khi trong thanh ghi UCSRA.

Bit 1 – U2X (Double the USART Transmittion Speed) bit này chỉ có tác dụng trong hoạt
động bất đồng bộ, và bit này được viết = 0 trong hoạt động đồng bộ. Khi bit này bằng 1
sẽ giảm tốc độ baud xuống ½.

Bit 0 – MPCM (Multi-processor Communication Mode) bit này cho phép hoạt động đa
vi điều khiển, khi bit này = 1 tất cả các dữ liệu khi nhận không chứa đựng thông tin về
địa chỉ sẽ bị bỏ qua (không nhận), xem phần giao tiếp đa vi điều khiển.

7.2.3 Thanh ghi UCSRB

Bit 7 6 5 4 3 2 1 0
RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban đầu 0 0 0 0 0 0 0 0
Hình 7.4 Thanh ghi UCSRB

Bit 7 – RXCIE (RX Complete Interrupt Enable) bit này = 1 cho phép ngắt trên cờ ngắt
RXC. Khi muốn thực hiện hoạt động ngắt khi nhận dữ liệu thì ta cần phải cài đặt như
sau (theo thứ tự ưu tiên): bit I trong thanh ghi SREG, bit RXCIE trong thanh ghi UCSRB.
Hoạt động xảy ra khi bit RXC = 1.

Bit 6 – TXCIE (TX Complete Interrupt Enable) bit này = 1 cho phép ngắt trên cờ ngắt
TXC. Hoạt động ngắt xảy ra khi bit RXC = 1. Khi muốn thực hiện hoạt động ngắt khi
truyền dữ liệu thì ta cần phải cài đặt như sau (theo thứ tự ưu tiên): bit I trong thanh ghi
SREG, bit TXCIE trong thanh ghi UCSRB.

-74/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

Bit 5 – UDRIE (USART Data Register Empty Interrupt Enable) bit này = 1 cho phép
ngắt trên cờ UDRE. Hoạt động xảy ra khi bit UDRE = 1. Khi muốn thực hiện hoạt động
ngắt khi truyền dữ liệu thì ta cần phải cài đặt như sau (theo thứ tự ưu tiên): bit I trong
thanh ghi SREG, bit UDRIE trong thanh ghi UCSRB.

Bit 4 – RXEN (Receiver Enable) bit này = 1 sẽ cho phép nhận dữ liệu.

Bit 3 – TXEN (Transmitter Enable) bit này = 1 sẽ cho phép truyền dữ liệu.

Bit 2 – UCSZ2 (Character size) bit này kết hợp với 2 bit UCSZ1.0 để xác độ dài dữ liệu
để nhận và truyền dữ liệu.

Bit 1 – RXB8 (Receive Data Bit 8) đây chính là bit thứ 9 trong hoạt động nhận 9 bit dữ
liệu, bit này phải đọc được trước khi đọc 8 bit thấp trong thanh ghi UDR (read).

Bit 0 – TXB8 (Transmitte Data Bit 8) đây là bit thứ 9 trong hoạt động truyền dữ liệu,
bit này phải được ghi trước ghi ghi 8 bit thấp trong thanh ghi UDR (write).

7.2.4 Thanh ghi UCSRC (USART Control and Status Register C).

Bit 7 6 5 4 3 2 1 0
URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban đầu 1 0 0 0 0 1 1 0
Hình 7.5 Thanh ghi UCSRC

Bit 7 – URSEL (Register Select) dùng để chọn thanh ghi UBRRH hoặc thanh ghi
UCSRC, khi bit này bằng 0 thì thanh ghi UBRRH được chọn, khi bit này bằng 1 thì
thanh ghi UCSRC được chọn.

Bit 6 – UMSEL (USART Mode Select) dùng để chọn hoạt động đồng bộ/ không đồng
bộ.

UMSEL Chế độ
0 Asynchronous Operation (hoạt động bất đồng bộ)
1 Asynchronous Operation (hoạt động đồng bộ)
Bảng 7.1 Chế độ làm việc giao tiếp nối tiếp

Bit 5.4 – UPM1.0 (Parity Mode) 2 bit này dùng để xác định hoạt động parity trong quá
trình nhận và truyền dữ liệu.

-75/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

UPM1 UPM0 Parity Mode


0 0 (Disabled) Không sử dụng
0 1 (Reserved) Không sử dụng
1 0 Cho phép kiểm tra chẵn (even parity)
1 1 Cho phép kiểm tra lẽ (odd parity)
Bảng 7.2 Cài đặc bit Parity
Bit 3 – USBS (Stop Bit Select) dùng để chọn số stop bit trong hoạt động truyền dữ liệu,
trong hoạt động nhận sẽ bỏ qua hoạt động này.

USBS Stop Bit(s)

0 1 bit

1 2 bit
Bảng 7.3 Cài đặc bit USBS
Bit 2.1 – UCSZ1.0 chọn kích thước dữ liệu

Stt UCSZ2 UCSZ1 UCSZ0 Kích thước bit


1 0 0 0 5 bit
2 0 0 1 6 bit
3 0 1 0 7 bit
4 0 1 1 8 bit
5 1 0 0 Không sử dụng
6 1 0 1 Không sử dụng
7 1 1 0 Không sử dụng
8 1 1 1 9 bit
Bảng 7.4 Cài đặc số bit dữ liệu
Bit 0 – UCPOL (Clock Polarity) bit này chỉ được sử dụng trong hoạt động đồng bộ, bit
này phải được viết = 0 trong hoạt đồng bất đồng bộ.

UCPOL Truyền dữ liệu (ngõ ra, chân TxD) Nhận dữ liệu mẫu (ngõ vào, chân RxD)

0 Cạnh lên xung XCK Cạnh xuống xung XCK

1 Cạnh xuống xung XCK Cạnh lên xung XCK


Bảng 7.5 Cài đặc bit UCPOL

-76/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

Hình 7.6 Dữ liệu sẽ được thay đổi tại cạnh lên và lấy mẫu tại cạnh xuống

Hình 7.7 Dữ liệu sẽ được thay đổi tại cạnh xuống và lấy mẫu tại cạnh lên.

7.2.5 Thanh ghi UBRRL và UBRRH

Hình 7.8 Thanh ghi UBRRL và UBRRH

Thanh ghi UBRRH có cùng địa chỉ với thanh ghi UCSRC

Bit 7 – URSEL (Register Select) dùng để chọn thanh ghi UBRRH hoặc thanh ghi
UCSRC, khi bit này bằng 0 thì thanh ghi UBRRH được chọn, khi bit này bằng 1 thì
thanh ghi UCSRC được chọn.

Tất cả các bit còn lại được sử dụng để chọn tốc độ baud trong hoạt động truyền/ nhận
dữ liệu, việc lựa chọn tốc độ baud phải đồng bộ với nhau và sai số trên 0.5% sẽ cho kết
quả truyền không chính xác.

-77/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

Bảng 7.6 Chọn tốc độ baud ở các tần số từ 1Mhz đến 2Mhz

Bảng 7.7 Chọn tốc độ baud ở các tần số từ 3Mhz đến 7Mhz

-78/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

Bảng 7.8 Chọn tốc độ baud ở các tần số từ 8Mhz đến 14Mhz

Bảng 7.9 Chọn tốc độ baud ở các tần số 16Mhz đến 20Mhz
7.3 CÁC BƯỚC THỰC HIỆN CÀI ĐẶC
Khi truyền/ nhận dữ liệu nối tiếp bất đồng bộ ta phải thực hiện các công việc sau:

1. Cài đặc tốc độ baud


2. Cài đặc số stop bit (1 hoặc 2)
-79/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

3. Số bit truyền nhận dữ liệu


4. Có kiểm tra chẵn lẻ hay không
5. Xác định vi điều khiền nhận/ truyền hoặc vừa nhận vừa truyền dữ liệu.
6. Xác định xem có ngắt hay không

7.3.1 Quá trình nhận dữ liệu

1. Kiểm tra cờ RX trong thanh ghi UCSRA (mục đích là để nhận biết VĐK đã nhận
được dữ liệu hay chưa):

 Nếu = 0 thì dữ liệu trong thanh ghi UDR (read) là trống (đã được đọc hay
chưa nhận được dữ liệu kế tiếp), vì thế VĐK sẽ chờ cho đến khi bit này = 1.

 Nếu = 1 thì dữ liệu trong thanh ghi UDR (read) đã có dữ liệu (có nghĩa là
VĐK đã hoàn tất thủ tục nhận dữ liệu), lúc này ta có thể đọc dữ liệu từ thanh
ghi UDR, sau khi đọc xong, bit này sẽ tự động = 0.

2. Kiểm tra quá trình nhận dữ liệu có lỗi hay không, có 3 vấn đề cần kiểm tra đó là:

 Parity Error (PE bit – 2 trong thanh ghi UCSRA).

 Data OverRun (DOR bit – 3 trong thanh ghi UCSRA).

 Frame Error (FE bit – 4 trong thanh ghi UCSRA).

3. Sau đó, VĐK sẽ nhận dữ liệu từ thanh ghi UDR (read). Kết thúc quá trình nhận
dữ liệu.

7.3.2 Quá trình truyền dữ liệu:

1. Kiểm tra bit UDRE xem thanh ghi UDR (write) đã sẵn sàng nhận dữ liệu hay
chưa.

 Nếu UDRE = 1 thì thanh ghi UDR (write) đang trống (đã truyền dữ liệu) và
sẵn sàng nhận dữ liệu để truyền đi.

 Nếu UDRE = 0 thì thanh ghi UDR (write) đang bận truyền dữ liệu và không
nhận dữ liệu mới.

2. Viết dữ liệu vào thanh ghi UDR.

-80/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

7.3.3 Các thời điểm xảy ra ngắt trong hoạt động USART

 Khi hoạt động nhận hoàn thành bit cho phép ngắt RXCIE
 Khi hoạt động truyền hoàn thành, bit cho phép ngắt TXCIE
 Khi thanh ghi dữ liệu UDR trống, bit cho phép ngắt UDRIE

7.4 BÀI TẬP VÍ DỤ

1. Bit nào, trong thanh ghi nào qui định việc cài đặt hoạt động đồng bộ và bất đồng bộ.

2. Hãy cho biết thời điểm xảy ra hoạt động ngắt.

3. Bit nào cho biết trạng thái truyền/ nhận dữ liệu đã hoàn thành.

4. Tốc độ baud có ảnh hưởng tới quá trình đồng bộ, bất đồng bộ hay ảnh hưởng cả hai.

5. Thanh ghi nào nhận dữ liệu và thanh ghi nào truyền dữ liệu

6. Khi cài đặc giao tiếp nối tiếp không đồng bộ giữa 2 thiết bị phải cùng các thông số
nào?

7. Khi truyền dữ liệu đồng bộ với IC 74HC74 thì ta phải chọn bit UCPOL bằng bao
nhiêu, tại sao?
Giao tiếp giữa 2 vi điều khiển theo nghi thức giao tiếp nối tiếp
CHƯƠNG TRÌNH TRUYỀN DỮ LIỆU

/*****************************************************
This program was produced by the CodeWizardAVR V2.05.0 Professional

Date : 11/25/2011
Author : LÂM QUANG CHUYÊN

Chip type : ATmega16


Program type : Application
AVR Core Clock frequency: 1.000000 MHz
*****************************************************/

#include <mega16.h>

#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2

-81/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)


#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// Write a character to the USART Transmitter


#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while ((UCSRA & DATA_REGISTER_EMPTY)==0);
UDR=c;
}
#pragma used-
#endif

#include <stdio.h>

// Declare your global variables here

void main(void)
{
PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

MCUCR=0x00;
MCUCSR=0x00;

-82/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 2 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 19200
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x8E;
UBRRH=0x00;
UBRRL=0x02;

ACSR=0x80;
SFIOR=0x00;

ADCSRA=0x00;

SPCR=0x00;

TWCR=0x00;

while (1)
{
// Place your code here
while(PINB.7);
putchar(PINA);
}
}
CHƯƠNG TRÌNH TRUYỀN DỮ LIỆU

/*****************************************************
This program was produced by the CodeWizardAVR V2.05.0 Professional

Date : 11/25/2011
Author : NeVaDa

Chip type : ATmega16


Program type : Application
AVR Core Clock frequency: 1.000000 MHz
*****************************************************/

#include <mega16.h>

#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

-83/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)


#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// Get a character from the USART Receiver


#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char status,data;
while (1)
{
while (((status=UCSRA) & RX_COMPLETE)==0);
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR |
DATA_OVERRUN))==0)
return data;
}
}
#pragma used-
#endif

// Standard Input/Output functions


#include <stdio.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

PORTA=0x00;
DDRA=0xff;

PORTB=0x00;
DDRB=0x00;

-84/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 2 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 19200
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x8E;
UBRRH=0x00;
UBRRL=0x02;

ACSR=0x80;
SFIOR=0x00;

ADCSRA=0x00;

SPCR=0x00;

TWCR=0x00;

while (1)
{
// Place your code here
PORTA = getchar();
}
}

-85/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

Hình 7.9 Mạch giao tiếp giữa 2 vi điểu khiển theo kiểu nói tiếp
-86/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16

7.5 CÂU HỎI ÔN TẬP HẾT CHƯƠNG

1. Hãy cài đặc tốc độ baud là 9600, 8bit, no parity, 2 stop bit, fosc = 1Mhz.

2. Hãy cài đặc tốc độ baud là 19200, 5bit, parity chẵn, 1 stop bit, fosc = 3.6864 Mhz.

3. Tốc độ baud 250k, 9 bit, parity lẻ, 1 stop bit, fosc = 4 Mhz.

4. Hãy cho biết chức năng của từng thanh ghi liên quan trong hoạt động USART.

5. Viết chương trình truyền dữ liệu từ PORTB của VĐK1 sang PORTA của VĐK2, với
nghi thức truyền như sau: tốc độ baud 4800, 8 bit, 2 stop bit, parity chẵn, fosc = 1 Mhz.

6. Hãy cho so sánh giữa 2 bit TXC và UDRE.

7. Hãy cho biết tốc độ truyền chậm nhất và nhanh nhất của VĐK.

8. Vẽ dạng sóng ngõ ra trên 2 chân RxD và TxD trong chế độ đồng bộ, khi truyền dữ
liệu có nội dung sau: 101100011

9. Viết chương trình truyền và nhận dữ liệu từ 2 VĐK như sau:

Hình 7.10 Bài tập ví dụ giao tiếp nối tiếp

Khi nhấn nút SW1 thì VĐK1 sẽ truyền dữ liệu từ PORTB sang PORTC của VDK2.

Khi nhấn nút SW2 thì VĐK2 sẽ truyền dữ liệu từ PORTB sang PORTC của VDK1.

-87/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16

Chương 8

GIAO TIẾP THIẾT BỊ


NGOẠI VI THEO NGHI
THỨC SPI
(SPI SERIAL PERIPHERAL INTERFACE)

- 88/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16


8.1 GIỚI THIỆU
8.1.1 Giới thiệu chung
Hoạt động SPI dùng để trao đổi dữ liệu đồng bộ theo dạng nối tiếp giữa AVR với
thiết bị ngoại vi hoặc giữa các AVR với nhau. Một số đặc tính của việc truyền nối tiếp
như sau:
 Truyền đồng bộ song công 4 dây (SCK, MOSI, MISO, SS)
 Hoạt động theo dạng Master và Slaver
 Truyền dữ liệu bit thấp (LSB) trước, hoặc bit cao (MSB) trước
 7 tốc độ truyền dữ liệu khác nhau
 Phát sinh ngắt khi quá trình truyền dữ liệu hoàn tất
 Tăng gấp đôi tốc độ truyền dữ liệu
 Master và Slaver có thể hoán đổi chức năng với nhau

SS3
MOSI SLAVER 3
MISO
SS3 SCK
SS2
SS1 SS2
MOSI MOSI SLAVER 2
MISO MISO
SCK SCK

SS1
SLAVER 1
MASTER MOSI
MISO
SCK

Hình 8.1 Sơ đồ giao tiếp giữa Master và Sl ave


8.1.2 Chức năng các chân trong hoạt động SPI
8.1.2.1 Chân SCK
Chân này tạo xung clock để tạo xung nhịp truyền dữ liệu giữa Master và Slaver,
xung nhịp được tạo ra bởi Master.

- 89/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16


8.1.2.2 Chân SS (Slaver select)
Khi sử dụng SPI ở vị trí Slave thì chân SS phải được khai báo là ngõ vào, khi chân
SS ở mức thấp thì thiết bị ở trạng thái hoạt động (sẵn sàng nhận dữ liệu), khi chân SS ở
mức cao thì tất cả các thiết bị ngưng hoạt động, khi chân SS ở mức thấp thì các chân
SPI sẽ bị reset ngay lập tức.
Khi sử dụng SPI ở vị trí là Master thì người sử dụng có thể điều khiển hướng của
chân SS, khi chân này được khai báo là ngõ ra và sẽ điều khiển chân SS của Slave.
Khi chân này được khai báo là ngõ vào nó phải được kéo lên mức cao để đảm bảo
hoạt động cho Master, nếu chân này bị kéo xuống mức thấp bởi tác nhân bên ngoài trong
khi chân SS được khai báo là ngõ vào thì nó sẽ hiểu là đã bị Master khác đã chiếm đường
truyền trên bus, để tránh điều này hệ thống SPI phải thực hiện một số thủ tục sau:
1. Bit MSTR trong thanh ghi SPCR phải được xóa và nó trở thành Slave lúc này
chân MOSI và SCK phải là ngõ vào.
2. Cờ trong thanh ghi SPIR trong thanh ghi SPSR được bật lên 1, và nếu hoạt động
ngắt được cho phép
8.1.2.3 Chân MOSI (Master Input / Slave Output) nếu là Master thì đây là đường
Input còn nếu là chip Slave thì MISO lại là Output. MISO của Master và các Slaves
được nối trực tiếp với nhau.
8.1.2.4 Chân MISO (MOSI – Master Output / Slave Input) nếu là Master thì đây là
đường Output còn nếu là chip Slave thì MOSI là Input. MOSI của Master và các Slaves
được nối trực tiếp với nhau.
8.2 CÁC THANH GHI LIÊN QUAN: SPCR, SPSR, SPDR
8.2.1 Thanh ghi SPCR

Bit 7 6 5 4 3 2 1 0
SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban đầu 0 0 0 0 0 0 0 0

Hình 8.2 Thanh ghi SPCR


Bit 7 – SPIE (SPI Interrupt Enable): Cho phép ngắt nếu bit SPIF trong thanh ghi SPSR
= 1, và bit I cho phép ngắt toàn cục trong thanh ghi SREG =1.
Bit 6 – SPE (SPI Enable): Cho phép hoạt động SPI khi bit này = 1.

- 90/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16


Bit 5 – DORD (Data Order): Xác định thứ tự truyền dữ liệu, nếu DORD = 1, thì dữ liệu
sẽ được truyền byte thấp trước, khi DORD = 0 thì ngược lại.
Bit 4 – MSTR (Master/Slaver Select): khi MSTR = 1 thì VĐK hoạt động như là Master,
khi MSTR = 0 thi VĐK là Slave. Ngoài ra khi VĐK là Master thì khi chân SS là ngõ
vào và được kéo xuống thấp thì bit MSTR sẽ bằng 0 (trở thành Slave) và bit SPIR trong
thanh ghi SPSR lên 1. Nếu muốn VĐK là Master thì phải ghi bit MSTR lên 1.
Bit 3.2 – CPOL, CPHA (Clock parity, Clock phase) dùng để xác định các chế độ làm
việc của SPI.
Bit 1.0 – SPR1.0 (Clock Rate Select 1 và 0) dùng để chọn tốc độ truyền dữ liệu.
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
Bảng 8.1 Mối quan hệ giữa chân sck và tần số dao động
8.2.2 Thanh ghi SPSR
Bit 7 6 5 4 3 2 1 0
SPIF WCOL - - - - - SPI2X SPSR
Read/ Write R R R R R R R RW
Giá trị ban
0 0 0 0 0 0 0 0
đầu
Hình 8.3 Thanh ghi SPSR
Bit 7 – SPIF (SPI Interrupt Flag): Cờ ngắt trong hoạt động SPI, khi hoàn tất việc trao
đổi dữ liệu thì bit SPIF sẽ bằng 1, thông báo hoạt động ngắt bắt đầu. Ngoài ra bit SPIF
cũng lên 1 khi chân SS trong mode Master được kéo xuống thấp.
Bit 6 – WCOL (Write COLlision Flag): Bit WCOL =1 khi thanh ghi dữ liệu SPI (SPDR)
đang nhận dữ liệu.

- 91/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16


8.2.3 Thanh ghi SPDR
Bit 7 6 5 4 3 2 1 0
MSB LSB SPDR
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban Không xác
x x x x x x x x
đầu định
Hình 8.4 Thanh ghi SPDR

Đây là thanh ghi truyền nhận dữ liệu, viết dữ liệu vào thanh ghi này dùng truyền dữ
liệu, đọc dữ liệu khi ở chế độ nhận.
8.3 CÁC CHẾ ĐỘ LÀM VIỆC CỦA SPI
Thời điểm lấy Thời điểm đỗi Giá trị ban Chế độ
mẫu dữ liệu đầu SPI
CPOL = 0, CPHA = 0 Cạnh lên Cạnh xuống Mức thấp 0
CPOL = 0, CPHA = 1 Cạnh xuống Cạnh lên Mức thấp 1
CPOL = 1, CPHA = 0 Cạnh xuống Cạnh lên Mức cao 2
CPOL = 1, CPHA = 1 Cạnh lên Cạnh xuống Mức cao 3
Bảng 8.2 Các thời điểm lấy mẫu nhận dữ liệu

Hình 8.5 Thời điểm lấy mẫu khi bit CPHA = 0

- 92/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16

Hình 8.6 Thời điểm lấy mẫu khi bit CPHA = 1


8.4 BÀI TẬP VÍ DỤ
Viết chương trình giao tiếp giữa 1 Master và 2 Slaver, theo yêu cầu sau:
Khi nhấn nút 1 thì Master sẽ gởi dữ liệu từ PORTA đến Slaver 1, nút 2 thì Master gởi
dữ liệu từ PORTA đến Slaver 2.

Phân tích: Các bước thực hiện


Chọn Master và Slaver
Chọn tốc độ truyền dữ liệu
Xác định ngắt/ không ngắt
Xác định kiểu truyền dữ liệu (LSB trước hay MSB trước)
Chọn mode hoạt động 0,1,2,3
Chương trình cho Master:

/*****************************************************
This program was produced by the CodeWizardAVR V2.05.0 Advanced

Date : 28/01/2012
Company : TRƯỜNG CAO ĐẲNG CÔNG THƯƠNG TP.HCM

Chip type : ATmega16


Program type : Application
AVR Core Clock frequency: 1,000000 MHz
*****************************************************/

#include <mega16.h>

- 93/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16


// SPI functions
#include <spi.h>

// Declare your global variables here

void main(void)
{
// Port A initialization
PORTA=0xff;
DDRA=0x00;

// Port B initialization
PORTB=0x07;
DDRB=0xB0;

// Port C initialization
PORTC=0x00;
DDRC=0x00;

// Port D initialization
PORTD=0x00;
DDRD=0x00;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 250,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: LSB First
SPCR=0x70;
SPSR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
{
// Place your code here
while(PINB.2);
spi(PINA);
}
}

- 94/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16


Chương trình cho Slave
/*****************************************************
This program was produced by the CodeWizardAVR V2.05.0

Date : 28/01/2012
Company : TRƯỜNG CAO ĐẲNG CÔNG THƯƠNG TP.HCM

Chip type : ATmega16


AVR Core Clock frequency: 1,000000 MHz
*****************************************************/

#include <mega16.h>
// SPI functions
#include <spi.h>

void main(void)
{
PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x40;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0xFF;

// Analog Comparator initialization


ACSR=0x80;
SFIOR=0x00;

// SPI initialization
// SPI Type: Slave
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: LSB First
SPCR=0x60;
SPSR=0x00;

while (1)
{
// Place your code here
PORTD = SPDR;
SPSR.7 = 1;
}
}

- 95/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16


8.5 CÂU HỎI ÔN TẬP HẾT CHƯƠNG
Câu 1: Chân SS là ngõ vào hay ngõ ra đối với Master và Slaver
Câu 2: Chân SS của Slaver phải luôn ở mức cao hay mức thấp
Câu 3: Hãy cài đặc vi điều khiển ở chế độ Master, tần số xung SCK = 62,500Khz, mức
logic của chân SCK ban đầu bằng 1, thời điểm lấy mẫu cạnh lên của xung clock,
truyền LSB trước, biết tần số thạch anh là 4Mhz.

- 96/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16

Chương 9

GIAO TIẾP THIẾT BỊ


THEO NGHI THỨC I2C
(TWO WIRE SERIAL INTERFACE)

- 97/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16


9.1. GIỚI THIỆU:
Là hoạt động truyền dữ liệu dạng nối tiếp có định địa chỉ, hỗ trợ cả Master và Slave,
hoạt động I2C sử dụng 2 chân giao tiếp SDA và SCL, hoạt động I2C có thể truy cập tới
từng ô nhớ của thiết bị.

Hình 9.1 Hình vẽ giao tiếp theo nghi thức I2C


9.1.1 Đặc tính
 Đơn giản, dễ giao tiếp và sử dụng chỉ với 2 dây
 Tốc độ truyền 400Khz
 Hổ trợ cho cả 2 hoạt động Master và Slave có thể hoán đổi vị trí cho nhau.
 Có thể hoạt động như bộ truyền/ nhận dữ liệu
 Có thể phân chia đến 128 địa chỉ khác nhau cho Slave
 Hổ trợ nhiều Master kiểm soát đường truyền
 2 chân giao tiếp SDA (PC1,23) và SCL (PC0,22)
9.1.2 Thuật ngữ:
 SDA: Serial Data dữ liệu đường nối tiếp
 SCL: Serial Clock xung đồng bộ clock

- 98/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16


9.2 NGUYÊN LÝ HOẠT ĐỘNG GIAO TIẾP I2C
Hoạt động I2C bắt đầu bằng 1 start bit và kết thúc bằng 1 Stop bit, gói dữ liệu là 8
bit và xen giữa là bit ACK,
Định dạng gói địa chỉ

Hình 9.2 Định dạng truyền dữ liệu theo nghi thức I2C
Để bắt đầu bằng 1 start bit chân SDA sẽ từ mức cao xuống mức thấp, trong khi Stop
bit chân SDA sẽ từ mức thấp chuyển lên mức cao trong cả 2 trường hợp này chân SCL
đều ở mức cao,

Hình 9.3 Định dạng Stop bit và Start bit


Việc chuyển đổi dữ liệu giữa các bit được thực hiện tại mức thấp của chân SCL,

Hình 9.4 Chuyển đổi dữ liệu tại mức thấp của chân SCL
Ví dụ dạng sóng gởi dữ liệu từ Master đến Slaver theo dữ liệu 10011010 như sau:

Hình 9.5 Dạng sóng trên chân SDA và SCL

- 99/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16

BEGIN

Khởi động SDA từ mức cao chuyển sang mức thấp


START bit trong khi SCL luôn ở mức cao
Khi Master
nhận được
NACK, thì Gởi 7 bit địa Master gởi địa chỉ (7 bit) tới Slave trên
Master sẽ chỉ tới Slave chân SDA
gởi lại Start
bit hoặc
Stop bit để Gởi 1 bit Master gởi yêu cầu Read/ Write tới Slave
kết thúc quá Read/ Write Read = 1, Write = 0.
trình gởi

Kiểm tra Khi ACK = 0, thì Slave đã nhận được địa


ACK chỉ, ACK = 1 thì Slave không nhận địa chỉ

Gởi/ Nhận 8 Master gởi dữ liệu (8 bit) tới Slave hoặc nhận
bit dữ liệu dữ liệu từ Slave

Master kiểm tra bit ACK, nếu ACK thì Slave


Kiểm tra nhận được dữ liệu, nếu NACK thì Slave
ACK không nhận được dữ liệu

Master có thể gởi/ nhận


tiếp dữ liệu tới/ từ Slave
hoặc gởi Stop bit tới
Slave để kết thúc quá
trình gởi/ nhận dữ liệu

STOP

Hình 9.6 Lưu đồ giải thuật gởi dữ liệu từ Master đến Slaver

- 100/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16


9.3 CÁC THANH GHI LIÊN QUAN
9.3.1 Thanh ghi TWBR (TWI bit rate register) dùng để chọn tần số phát xung clock
trên chân SCL.
Bit 7 6 5 4 3 2 1 0
TWB7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0
Read/ Write RW RW RW RW RW RW RW RW
Giá trị ban
0 0 0 0 0 0 0 0
đầu
Hình 9.7 Thanh ghi tạo tần số TWBR
9.3.2 Thanh ghi TWCR (TWI Control Register): Dùng để điều khiển hoạt động TWI
Bit 7 6 5 4 3 2 1 0
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE
Read/ Write RW RW RW RW R RW R RW
Giá trị ban
đầu
0 0 0 0 0 0 0 0
Hình 9.8 Thanh ghi điều khiển TWCR
Bit7 – TWINT: (cờ ngắt TWI) bit này bằng 1 khi hoạt động TWI hoàn tất, nếu bit I trong
thanh ghi (SREG) và bit TWIE trong thanh ghi (TWCR) được cài đặc là 1, vi điều khiển
sẽ nhảy tới vector ngắt TWI. Chân SCL sẽ duy trì mức thấp khi cờ TWINT được bậc
lên 1. Cờ TWINT sẽ được xóa khi viết mức logic 1 lên bit này, và tự động xóa khi sử
dụng hoạt động ngắt.
Bit6 – TWEA: (TWI Enable Acknowledge bit, bit cho phép bắt tay) bit này điều khiển
việc phát xung ACK. Nếu bit TWEA được viết lên 1, thì xung ACK sẽ được phát lên
đường bus khi nó thỏa mãn các điều kiện sau:
 Cấu hình bên Slave đã xác định được địa chỉ
 Hoạt động nhiều Slave được nhận khi bit TWGCE trong thanh ghi TWAR được
viết logic 1.
 1 byte dữ liệu đã được nhận trong ở Master hoặc Slave.
Khi bit này được viết mức logic 0, thì cấu hình tạm thời không kết nối với đường bus
TWI, khi bit này bằng 1 thì nó sẽ kết nối với bus TWI.
Bit5 – TWSTA: (TWI Start Condition Bit, bit kiểm tra điều kiện Master) khi 1 vi điều
khiển nào đó muốn trở thành Master thì nó sẽ viết mức logic 1 lên bit này (TWSTA),
phần cứng sẽ kiểm tra xem đường truyền trên bus có rãnh hay không và sẽ phát sinh
xung Start trên đường bus, tuy nhiên nếu đường bus bận thì TWI sẽ chờ bit Stop và sẽ

- 101/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16


phát lại xung Start để giành quyền Master, bit TWSTA phải được xóa bởi phần mềm
khi xung Start được truyền đi.
Bit4 – TWSTO: (TWI Stop Condition Bit, bit kết thúc vai tò Master) đối với Master bit
này được viết logic 1 sẽ phát điều kiện Stop trên đường bus. Khi điều kiện Stop được
thực hiện trên đường Bus xong thì bit TWSTO sẽ được xóa tự động. Còn đối với Slave,
bit này = 1 dùng để khắc phục lỗi, và sẽ không phát sinh điều kiện Stop trên đường Bus.
Bit3 – TWWC: (TWI Write Collision Flag, cờ báo lỗi khi viết dữ liệu) cờ này sẽ có
logic 1 khi viết dữ liệu vào thanh ghi dữ liệu (TWDR) trong khi TWINT ở mức logic 0.
Cờ này sẽ về 0 khi viết dữ liệu vào thanh ghi TWDR khi bit TWINT ở mức 1.
Bit2 – TWEN: (TWI Enable bit, bit cho phép TWI) bit này được viết logic 1 sẽ cho phép
hoạt động TWI, khi bit này có mức logic 0 sẽ không cho phép hoạt động TWI.
Bit1 – Res: (Bit dự trữ)
Bit0 – TWIE: (TWI Interrupt Enable, cho phép ngắt TWI) khi bit này bằng 1 và bit I
trong thanh ghi SREG bằng 1 thì sẽ cho phép hoạt động ngắt TWI.
9.3.3 Thanh ghi TWSR (TWI Status Register) Thanh ghi trạng thái TWI
Bit 7 6 5 4 3 2 1 0
TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0
Read/ Write R R R R R R RW RW
Giá trị ban
1 1 1 1 1 0 0 0
đầu
Hình 9.9 Thanh ghi trạng thái TWSR
Bit7..3 – TWS7: (TWI Status) bit này kết hợp với các bit
Bit2 – Res (bit dự trữ) bit này luôn được viết là logic 0.

ầ ố ℎạ ℎ ℎ ( )
ầ ố =
16 + 2( )∗4
(9.1)
Bit1.0 – TWPS (TWI Prescaler Bit) 2 bit này dùng để xác định tốc độ truyền dữ liệu
trong TWI.
 TWBR : Giá trị trong thanh ghi TWBR
 TWPS : Giá trị 2 bit cuối trong thanh ghi TWSR
9.3.4 Thanh ghi TWDR (TWI Data Register) Trong hoạt động truyền byte này chứa
dữ liệu kế tiếp để truyền và trong hoạt động nhận thanh ghi chứa byte vừa mới được
nhận.

- 102/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16


Bit 7 6 5 4 3 2 1 0
TWD7 TWD6 TWD5 TWD4 TWD3 TWD2 TWD1 TWD0
Read/ RW RW RW RW RW RW RW RW
Write
Giá trị ban
1 1 1 1 1 1 1 1
đầu
Hình 9.10 Thanh ghi dữ liệu TWDR
9.3.5 Thanh ghi TWAR (TWI Address Register)
Bit 7 6 5 4 3 2 1 0
TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE
Read/ RW RW RW RW RW RW RW RW
Write
Giá trị ban
1 1 1 1 1 1 1 0
đầu
Hình 9.11 Thanh ghi địa chỉ TWAR
Thanh ghi này dùng để xác định địa chỉ của vi điều khiển trong vai trò là Slave, bit
cuối cùng TWGCE dùng trong hoạt động đa Master.

9.4 BÀI TẬP VÍ DỤ


Câu 1: Cài đặt tần số hoạt động là 125Khz theo nghi thức I2C với tần số thạch anh là 4
Mhz.

Giải: Dựa vào công thức (9.1) ta có:

ầ ố ℎạ ℎ ℎ ( )
ầ ố =
16 + 2( )∗4

 Để tần số là 125 khz thì mẫu số sẽ có giá trị bằng 32


 Vậy ta chọn TWBR = 1, TWPS = 2.

Câu 2: Vẽ sơ đồ mạch giao tiếp giữa atmega16 với DS1307, IC nhớ 24C32 và cảm biến
nhiệt độ, độ ẩm STH10.

- 103/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16


U1
1 40
2 PB.0 PA.0 39
3 PB.1 PA.1 38
4 PB.2 INT2 PA.2 37
5 PB.3 OC0 PA.3 36
6 PB.4 PA.4 35
7 PB.5 PA.5 34
8 PB.6 PA.6 33
9 PB.7 PA.7 32
10 RESET AVREF 31
11 VCC GND 30
12 GND AVCC 29
13 XTAL2 PC.7 28
14 XTAL1 PC.6 27
15 PD.0 RxD PC.5 26
16 PD.1 TxD PC.4 25
17 PD.2 INT0 PC.3 24
18 PD.3 INT1 PC.2 23
19 PD.4 SDA PC.1 22
20 PD.5 SCL PC.0 21
PD.6 OC2 PD.7
Atmega16

VCC5 VCC5 VCC5 VCC5

U3
U2
4

8
Y1 1 5 1 5
X1 SDA A0 SDA
VCC

VCC

VCC
2 2 6 2 6
DATA X2 SCL A1 SCL
3 ZTA 3
SCK 3 A2 7
GND

GND

GND
VBAT 7 WP
SQW
BT1
U4 SHT10 DS1307 24AA32A
1

4
BATTERY

Hình 9.12 Sơ đồ giao tiếp I2C giữa các thiết bị

9.5 CÂU HỎI ÔN TẬP HẾT CHƯƠNG


Câu 1: Trong quá trình hoạt động, thiết bị Slaver có thể trở thành Master được hay
không, nếu được hãy nêu nghi thức giải quyết.
Câu 2: Khi giao tiếp theo nghi thức I2C thì số thiết bị cho Slaver là bao nhiêu?
Câu 3: Hãy cho biết tần số tối đa giao tiếp theo nghi thức I2C là bao nhiêu?
Câu 4: Hãy cài đặc tần số SCL là 50Khz, tần số thạch anh là 8 Mhz
Câu 5: Hãy cho biết chức năng của bit ACK
Câu 6: Hãy trình bày giống nhau và khác nhau giữa các nghi thức giao tiếp I2C, USART,
SPI.

- 104/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Phụ luc 1 Các chuẩn giao tiếp Bài giảng vi điều khiển Atmega16

PHỤ LỤC 1
(Các chuẩn giao tiếp và bit chẵn lẻ)

Các chuẩn giao tiếp

Master Số Tiếp Tốc Độ Đồng Bất Khung


Salver lượng Star, cận độ tối dài bộ đồng dữ liệu
stop
Hoán dây từng đa giao bộ
bit
đổi địa chỉ tiếp
I2C x 2 x x x - 8

SPI - >3 - - x - 8

USART - 3 x - x x 5-9

Bảng 10.1 So sánh các chuẩn giao tiếp


Kiểm tra chẵn lẻ (parity): là kiểm tra số lượng bit 1 và bit 0 trong một gói dữ liệu,
có 2 dạng kiểm tra: kiểm tra chẵn (Even) và kiểm tra lẻ (Odd).

 Kiểm tra chẵn: Nếu số lượng bit 1 trong 1 khung dữ liệu là chẵn thì bit
parity (P) sẽ là 0, ngược lại sẽ là 1.
o Ví dụ 1: Khi gói dữ liệu 8 bit (10101101) được gởi đi thì bit P sẽ là
1, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 101011011.
o Ví dụ 2: Khi gói dữ liệu 8 bit (11000101) được gởi đi thì bit P sẽ là
0, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 110001010.
 Kiểm tra lẻ: Nếu số lượng bit 0 trong 1 khung dữ liệu là chẵn thì bit parity
(P) sẽ là 1, ngược lại sẽ là 0.
o Ví dụ 1: Khi gói dữ liệu 8 bit (10101101) được gởi đi thì bit P sẽ là
0, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 101011010.
o Ví dụ 2: Khi gói dữ liệu 8 bit (11000101) được gởi đi thì bit P sẽ là
1, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 110001011.

- 106/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Phụ luc 2 IC thời gian thực DS1307 Bài giảng vi điều khiển Atmega16

PHỤ LỤC 2
(IC thời gian thực DS1307)

DS1307: là IC thời gian thực giao tiếp dữ liệu theo nghi thức I2C, chip này có 7
thanh ghi chứa thời gian đó là: giây, phút, giờ, thứ, ngày, tháng, năm. Ngoài ra nó còn
56 byte Ram dùng để chứa dữ liệu, sơ đồ chân của DS1307 như sau:

Hình 10.1 Sơ đồ chân IC DS1307


Với:
 Chân (1,2) X1, X2: Chân tạo dao động nối với thạch anh có tần số
32.768Khz,
 Chân 3 (Vbat): Nối nguồn Pin nuôi 3,3 volt giữ cho DS chạy đúng thời gian
khi không có nguồn nuôi DS1307.
 Chân 4 GND: Nguồn Mass cho cả DS và nguồn nuôi 3,3v
 Chân 5 SDA: Chân truyền nhận dữ liệu
 Chân 6 SCL: Chân tạo xung clock để giao tiếp dữ liệu
 Chân 7 SQW: Tạo tần số dao động xung vuông 1Hz, 4.096Khz, 8.192Khz,
32.768Khz
 Chân 8 Vcc: Chân nguồn cung cấp cho DS, khi nguồn cung cấp này mất thì
DS vẫn hoạt động chức năng thời gian nhờ vào nguồn nuôi 3,3 volt.
Thanh ghi trong bộ nhớ DS1307:
Thanh ghi điều khiển

Hình 10.2 Thanh ghi điều khiển Control Register


Bit 7: (Out) Nếu bit SQWE = 0 thì:
 Bit OUT = 0, chân 7 (SQW/OUT) sẽ có mức logic 0
- 107/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Phụ luc 2 IC thời gian thực DS1307 Bài giảng vi điều khiển Atmega16

 Bit OUT = 1, chân 7 (SQW/OUT) sẽ có mức logic 1


Bit 4: (SQWE) Nếu bit SQWE = 1, thì nó cho phép xuất xung vuông trên chân số 7
(SQW/OUT), tần số xung vuông phụ thuộc vào chân RS1, RS0.
Bit 1-0: Dùng chọn tần số dao động trên chân 7 (SQWE/OUT)

Bảng 10. Chọn tần số ngõ ra trên chân SQW

Hình 10.3 Sơ đồ nguyên lý kết nối DS1307 với LCD4x20

- 108/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16

PHỤ LỤC 3
(Điều khiển nhiều led ma trận)

10.1. GIỚI THIỆU VỀ IC THANH GHI DỊCH

10.1.1 Giới thiệu chung

IC NC6B595 là thanh ghi dịch 8 bit vào nối tiếp ra song song và được lưu dữ liệu
trong flip – flop D, dữ liệu đưa ra được tác động bởi cạnh lên của xung clock, ngõ ra ở
mức thấp và cực C để hở, transistor loại TTL, chịu được áp 15 volt và dòng 200 mA, IC
được cấu tạo gồm 3 tầng,

Tầng 1: Chuyển dữ liệu từ nối tiếp ra song song nhờ vào 8 flip – flop D như hình vẽ
10.2, nhờ vào chân CLK.

Tầng 2: Lưu 8 bit dữ liệu vào 8 flip – flop D nhờ vào chân STR như hình 10.2

Tầng 3: Xuất dữ liệu ra bên ngoài nhờ vào chân OE.

10.1.2 Chức năng các chân và nguyên lý hoạt động

Sơ đồ chân của IC như sau:

Hình 10.4 Sơ đồ chân IC NC6B595

Chân Vcc: Nguồn cung cấp 7 volt

Chân Sin: tín hiệu ngõ vào dạng nối tiếp

- 109/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16

Chân Q0-Q7 tín hiệu ngõ ra dạng song song

Chân R Dùng reset thanh ghi dịch, tác động mức thấp

Chân OE (Output Enable) chân này có mức logic thấp sẽ cho dữ liệu xuất ra ngoài, khi
mức logic cao nó sẽ không cho phép xuất dữ liệu ra bên ngoài.

Chân STR (Store) chân này có tác dụng như chân clock dùng chốt dữ liệu ra bên ngoài
sau khi đã dịch xong 8 bit dữ liệu.

Chân CLK (clock) tạo xung nhịp dịch dữ liệu nối tiếp từ chân Sin vào các flip – flop D,
tác động cạnh lên.

Chân Sout: Ngõ ra dạng nối tiếp cho IC dịch kế tiếp, được nối với chân Sin của IC kế.

Chân NC (No Connection) không sử dụng

Hình 10.5 Sơ đồ nguyên lý hoạt động IC NC6B595

- 110/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16

10.2 ĐIỂU KHIỂN NHIỀU LED MA TRẬN

Để điều khiển nhiều led ma trận ta phải sử dụng thanh ghi dịch, mỗi led ma trận sẽ
được kết nối với 1 IC ghi dịch như hình vẽ 10.3, chương trình điều khiển xem phần
phụ lục.

Hình 10.6 Sơ đồ nguyên lý điều khiển 8 led ma trận

- 111/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16

Chương trình trên CodeVision

/*****************************************************
This program was produced by the CodeWizardAVR V2.03.4 Standard
Date : 5/12/2010

Chip type : ATmega16


Clock frequency : 4.000000 MHz
*****************************************************/

#include <mega16.h>
#include <delay.h>
// SPI functions
#include <spi.h>
#define STR PORTB.3

// Declare your global variables here


unsigned char i,j;
unsigned char flash
addr[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char flash Ma[8][8]={
0b01000001,0b01111101,0b00000111,0b00011100,0b10001011,0b11100011,0b11100111,0b0000
0000,
0b01000001,0b01000001,0b00001000,0b10100010,0b11011010,0b00000000,0b10001000,0b1000
0000,
0b01000001,0b01000001,0b00001000,0b00100010,0b10101010,0b00000000,0b10001000,0b1000
0000,
0b01000001,0b01111101,0b00001000,0b00100010,0b10001011,0b11100000,0b10001000,0b1000
0000,
0b01001001,0b01000001,0b00001000,0b00100010,0b10001010,0b00000000,0b10001000,0b1000
0000,
0b01010101,0b01000001,0b00001000,0b10100010,0b10001010,0b00000000,0b10001000,0b1000
0000,
0b00100010,0b01111101,0b11100111,0b00011100,0b10001011,0b11100000,0b10000111,0b0000
0000,
0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b0000
0000
};
void main(void)
{

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0xff;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0xff;

// Analog Comparator Input Capture by Timer/Counter 1: Off


ACSR=0x80;
SFIOR=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 1000.000 kHz
- 112/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: LSB First
SPCR=0x70;
SPSR=0x00;

while (1)
{
// Place your code here
//====================1
j = 0;
i = 8;
while(i--)
{
spi(Ma[j][i]);
}
STR = 0;
STR = 1;
PORTD = addr[j];
delay_us(100);
PORTD = 0xff;
//====================2
j = 1;
i = 8;
while(i--)
{
spi(Ma[j][i]);
}
STR = 0;
STR = 1;
PORTD = addr[j];
delay_us(100);
PORTD = 0xff;
//====================3
j = 2;
i = 8;
while(i--)
{
spi(Ma[j][i]);
}
STR = 0;
STR = 1;
PORTD = addr[j];
delay_us(100);
PORTD = 0xff;
//====================4
j = 3;
i = 8;
while(i--)
{
spi(Ma[j][i]);
}
STR = 0;
STR = 1;
PORTD = addr[j];
delay_us(100);
PORTD = 0xff;

- 113/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16
//====================5
j = 4;
i = 8;
while(i--)
{
spi(Ma[j][i]);
}
STR = 0;
STR = 1;
PORTD = addr[j];
delay_us(100);
PORTD = 0xff;
//====================6
j = 5;
i = 8;
while(i--)
{
spi(Ma[j][i]);
}
STR = 0;
STR = 1;
PORTD = addr[j];
delay_us(100);
PORTD = 0xff;
//====================7
j = 6;
i = 8;
while(i--)
{
spi(Ma[j][i]);
}
STR = 0;
STR = 1;
PORTD = addr[j];
delay_us(100);
PORTD = 0xff;
//====================8
j = 7;
i = 8;
while(i--)
{
spi(Ma[j][i]);
}
STR = 0;
STR = 1;
PORTD = addr[j];
delay_us(100);
PORTD = 0xff;
//====================
};
}

- 114/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)


lOMoARcPSD|13723430

Tài liệu tham khảo Bài giảng vi điều khiển Atmega16

TÀI LIỆU THAM KHẢO


1. Họ vi điều khiển 8051 – Tống Văn On, Hoàng Đức Hải – NXB Lao Động XH
2. Vi điều khiển với lập trình C – Ngô Diên Tập, NXB Khoa học Kỹ thuật
3. Đo lường điều khiển bằng máy tính – Ngô Diên Tập, NXB Khoa học Kỹ thuật
4. Đo lường điều khiển bằng máy tính – Nguyễn Đức Thành, ĐH Bách Khoa TP.
HCM
5. Hướng dẫn lập trình Vi điều khiển PIC – Lê Duy Phi
6. The 8051 Microcontroller - Kenneth J. Ayala
7. http://www.hocavr.com
8. http://www.hpinfotech.ro/html/download.htm
9. http://www.atmel.com

- 115/115- Biên soạn: Lâm Quang Chuyên

Downloaded by Thành Ki?n (kienthanhphama1@gmail.com)

You might also like