Professional Documents
Culture Documents
Giaotrinhavr
Giaotrinhavr
Giaotrinhavr
Triết học Mác- Lênin (Trường Đại học Công nghiệp TP.HCM)
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
05 - 2014
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
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.
vi
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
ix
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
xii
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
Chương 1
GIỚI THIỆU VỀ
VI ĐIỀU KHIỂN
7432
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
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
<=>
Y
0 A=B
1 A<>B
Y
0 A<>B
1 A=B
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
(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)
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)
While(condition)
{
Thực hiện trong khi condition đúng
};
While(!condition)
{
Thực hiện khi condition sai
};
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
if(condition)
{
Nếu condition đúng thì thực hiện
};
if(condition)
{
Nếu condition đúng thì thực hiện
}else
{
Nếu condition sai thì thực hiện
};
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;
};
Lệnh gán
4
Bằng (=)
BEGIN
Đúng
ĐỌC EEPROM ĐỌC GIÁ TRỊ CỦA BIẾN ĐẾM TỪ EEPROM
LƯU VÀO EEPROM LƯU GIÁ TRỊ CỦA BIẾN ĐẾM VÀO EEPROM
BEGIN
Sai
KIỂM TRA BIẾN t = X HAY CHƯA
t ==
Đúng
END
Hình 1
Hình 2
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
Chương 2
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).
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).
PORTB 7 6 5 4 3 2 1 0
DDRB 0 0 1 0 0 1 1 1
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.
PORTA.0 PORTA.0
33 33
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
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.
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;
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
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ư:
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.
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.
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?
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.
Để 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:
Để xuất dữ liệu ra trên PORT (điều khiển PORT) ta thực hiện như sau:
Cách 1: if(PINA.5 == 1)
Cách 2: if(PINA.5)
Cách 1: if(PINC.2 == 0)
Cách 1: while(PINB.2 == 1)
Cách 2: while(PINB.2)
Cách 1: while(PIND.3 == 0)
Cách 2: while(!PIND.3)
Lưu ý:
Temp1 = PINA
Temp2 = PINC
Giải: if(PINC.4 == 1)
if(PINC.4)
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;
#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:
#include <mega16.h>
void main (void)
{
PORTA = 0x00; PORTA NGÕ RA
DDRA = 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;
};
}
}
PA.2
PB.0
PA.2
PB.0
a b c d e f g dp a b c d e f g dp
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
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
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
Để điều khiển Led ma trận ta sử dụng phương pháp quét như led 7 đoạn.
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
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
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.6: Viết chương trình led 7 đoạn sáng bằng phương pháp thông thường
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.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
Chương 3
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
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
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;
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;
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;
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
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).
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.
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.
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.
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 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.
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
Bài giải:
∗
Vậy số CKM để chạy trong 10 giây là: = 2 ∗ 10 CKM
.
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
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
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).
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:
0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
_ /
=
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.
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
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
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ươ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.
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).
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)
Để 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)
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ơ.
Chương 5
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.
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
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
0 1 Không sử dụng
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;
#include <mega16.h>
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
while (1)
{
// Place your code here
}
}
Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
Chương 6
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
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:
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
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.
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.
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
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
Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16
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
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 4 – 0: Các bit này không sử dụng trong hoạt động ADC
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
=
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
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 ℎ
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
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.
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 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).
Câu 14: Xác định các thanh ghi trong hoạt động ADC:
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
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.
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
Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16
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)
Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16
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
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
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.
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.
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.
Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16
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
UCPOL Truyền dữ liệu (ngõ ra, chân TxD) Nhận dữ liệu mẫu (ngõ vào, chân RxD)
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.
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.
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
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:
Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16
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à:
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.
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.
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
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ộ.
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
#include <mega16.h>
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
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
#include <stdio.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
MCUCR=0x00;
MCUCSR=0x00;
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
#include <mega16.h>
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
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
void main(void)
{
// Declare your local variables here
PORTA=0x00;
DDRA=0xff;
PORTB=0x00;
DDRB=0x00;
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();
}
}
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
Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16
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.
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
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.
Chương 8
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
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
Đâ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
/*****************************************************
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
#include <mega16.h>
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;
// 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);
}
}
Date : 28/01/2012
Company : TRƯỜNG CAO ĐẲNG CÔNG THƯƠNG TP.HCM
#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;
// 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;
}
}
Chương 9
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.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:
BEGIN
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
STOP
Hình 9.6 Lưu đồ giải thuật gởi dữ liệu từ Master đến Slaver
ầ ố ℎạ ℎ ℎ ( )
ầ ố =
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.
ầ ố ℎạ ℎ ℎ ( )
ầ ố =
16 + 2( )∗4
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.
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
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ẻ)
SPI - >3 - - x - 8
USART - 3 x - x x 5-9
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.
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:
Phụ luc 2 IC thời gian thực DS1307 Bài giảng vi điều khiển Atmega16
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)
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
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 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ế.
Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16
Để đ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.
Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16
/*****************************************************
This program was produced by the CodeWizardAVR V2.03.4 Standard
Date : 5/12/2010
#include <mega16.h>
#include <delay.h>
// SPI functions
#include <spi.h>
#define STR PORTB.3
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xff;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 1000.000 kHz
- 112/115- Biên soạn: Lâm Quang Chuyên
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;
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;
//====================
};
}