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
70 trang |
Chia sẻ: Tiểu Khải Minh | Ngày: 21/02/2024 | Lượt xem: 105 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Vi điều khiển - Lâm Quang Chuyên, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
raction Trừ a = b – c;
2.3 * Multiplication Nhân a = b*c;
2.4
/ Division
Chia lấy
thương
a = b/c;
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;
Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16
- 10/115 - Biên soạn: Lâm Quang Chuyên
3.2 += Assign and Sum x += 5;
3.3
-=
Assign and
Subtract
x -= 5;
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.
Hình 1.11 Cấu trúc một chương trình trong Codevision
Chèn file #included
Đị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)
{
}
Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16
- 11/115 - Biên soạn: Lâm Quang Chuyên
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:
Hình 1.12 Lưu đồ giải thuật lệnh while
Hình 1.13 Lưu đồ giải thuật lệnh while not
Hình 1.14 Lưu đồ giải thuật lệnh do while
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);
Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16
- 12/115 - Biên soạn: Lâm Quang Chuyên
Hình 1.15 Lưu đồ giải thuật lệnh if
Hình 1.16 Lưu đồ giải thuật lệnh if else
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
Kí hiệu bắt đầu và kết thúc (begin, end)
2
Yêu cầu thực hiện
Cộng, trừ, nhân, chia, gán, dịch trái, phải
BEGIN
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;
};
Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16
- 13/115 - Biên soạn: Lâm Quang Chuyên
3
Gọi chương trình con
4
Lệnh gán
Bằng (=)
5
Lệnh nhiều lựa chọn
switch case
6
Lệnh kiểm tra đúng sai
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.
Hình 1.18 Lưu đồ giải thuật đếm sản phẩm
BEGIN
KT SP
TĂNG LÊN 1
LƯU VÀO EEPROM
=100
END
SENSOR SẼ KIỂM TRA SẢN PHẨM ĐI QUA, NẾU
KHÔNG CÓ SẼ KIỂM TRA TIẾP, NẾU CÓ VĐK SẼ
THỰC HIỆN LỆNH KẾ TIẾP
TĂNG BIẾN ĐẾM LÊN 1 ĐƠN VỊ
LƯU GIÁ TRỊ CỦA BIẾN ĐẾM VÀO EEPROM
KIỂM TRA ĐỦ 100 SẢN PHẨM CHƯA, NẾU CHƯA
QUAY LẠI KIỂM TRA SẢN PHẨM TIẾP, NẾU ĐỦ
KẾT THÚC CHƯƠNG TRÌNH
Đúng
Đúng
Sai
Sai
ĐỌC EEPROM ĐỌC GIÁ TRỊ CỦA BIẾN ĐẾM TỪ EEPROM
Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16
- 14/115 - Biên soạn: Lâm Quang Chuyên
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
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
BEGIN
t++
y = y + t
END
CHO CÁC BIẾN t, y BẰNG 0
KIỂM TRA BIẾN t = X HAY CHƯA
Đúng
Sai
t = 0
y = 0
TĂNG GIÁ TRỊ t LÊN 1 ĐƠN VỊ
BIẾN y = y + t
t ==
Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16
- 15/115 - Biên soạn: Lâm Quang Chuyên
Hình 3
2. Hãy cho biết nếu x = 5 thì các mệnh đề sau là đúng hay sai:
a. ((x19))
b. ((x2))
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 1 Giới thiệu Bài giảng vi điều khiển Atmega16
- 16/115 - Biên soạn: Lâm Quang Chuyên
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.
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-17/115- Biên soạn: Lâm Quang Chuyên
Chương 2
GIAO TIẾP VÀO RA
(I/O INPUT/OUTPUT)
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-18/115- Biên soạn: Lâm Quang Chuyên
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).
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:
7 6 5 4 3 2 1 0
in in out in in out out out
0 0 1 0 0 1 1 1DDRB
PORTB
KHAI BÁO HOẠT ĐỘNG VÀO RA TRÊN CỔNG B
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-19/115- Biên soạn: Lâm Quang Chuyên
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.
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.
Hình 2.2 Chân 33 có điện trở kéo lên
PORTA.0
Khi PORTA.0 = 1;
điện áp tại chân
này sẽ là 5 volt.
PORTA.0
Khi PORTA.0 = 0;
điện áp tại chân
này sẽ nối mass.
Hình 2.3 Chân 33 có được nối mass
33 33
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-20/115- Biên soạn: Lâm Quang Chuyên
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.
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;
Ví dụ 6: PORTD |= 0xAD có nghĩa là gì?
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
Cách 1:
PORTB.2 = 1;
PORTB.6 = 1;
Cách 2:
PORTB |= 0b01000100;
Cách 1:
PORTD.4 = 0;
PORTD.7 = 0;
Cách 2:
PORTD &= 0b10110111;
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.
DDRA = 0b01100111; ngõ vào 3,4,7; ngõ ra 0,1,2,5,6
PORTA.7 = 1;
PORTA.4 = 1;
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-21/115- Biên soạn: Lâm Quang Chuyên
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
Các chân này dùng trong giao tiếp SPI, ngoài ra còn dùng
đề nạp chương trình cho VĐK
PB6 MISO
PB5 MOSI
PB4 SS
PB3 OC0/AIN1
OC0 chân điều xung trong hoạt động timer/counter
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
PB2 INT2/AIN0
INT2: Chân ngắt ngoài 2
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
PB1 T1
Chân ngõ vào dùng đếm xung trong hoạt động
timer/counter1
PB0 XCK/T0
Chân ngõ vào dùng đếm xung trong hoạt động
timer/counter0
Bảng 2.2 Chức năng khác của PORTB
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-22/115- Biên soạn: Lâm Quang Chuyên
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
năng như hoạt động IO PC6 TOSC1
PC5 TDI
Khi giao tiếp theo mode JTAG chân này là ngõ vào nối tiếp được
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
PC4 TDO
Khi giao tiếp theo mode JTAG chân này là ngõ ra nối tiếp được
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,
chân SCL dùng làm xung clock để đồng bộ hóa tín hiệu. PC0 SCL
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
bộ 8 PD0 RxD
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?
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-23/115- Biên soạn: Lâm Quang Chuyên
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)
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-24/115- Biên soạn: Lâm Quang Chuyên
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
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;
switch (PINB){
case 0b11001001: TH1; break;
case 0b10101100: TH2; break;
case 0b10110101: TH3; break;
};
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-25/115- Biên soạn: Lâm Quang Chuyên
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:
#include
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;}
}
}
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-26/115- Biên soạn: Lâm Quang Chuyên
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:
Hình 2.4 Điều khiển led đơn trực tiếp
#include
void main (void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0x00;
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;
};
}
}
PORTA NGÕ RA
PORTB NGÕ VÀO
PORTC NGÕ RA
PORTD NGÕ RA
PA.2
PB.0
Led sáng: PORTA.2 = 1;
Led tắt: PORTA.2 = 0;
Led sáng: PORTB.0 = 0;
Led tắt: PORTB.0 = 1;
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-27/115- Biên soạn: Lâm Quang Chuyên
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
PA.2
PB.0
Led sáng: PORTA.2 = 1;
Led tắt: PORTA.2 = 0;
Led sáng: PORTB.0 = 0;
Led tắt: PORTB.0 = 1;
a b c d e f g dp
Hình 2.6 Anot chung
a b c d e f g dp
Hình 2.7 Katot chung
PA.0
PA.1
PA.2
PA.3
PA.4
PA.5
PA.6
PA.7
a
b
c
d
e
f
g
dp
PA.0
PA.1
PA.2
PA.3
PA.4
PA.5
PA.6
PA.7
dp
g
f
e
d
c
b
a
Hình 2.8 Kiểu mắc Anot chung với
LSB nối chân a
Hình 2.9 Kiểu mắc Anot chung với
MSB nối chân a
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-28/115- Biên soạn: Lâm Quang Chuyên
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
PA.0
PA.1
PA.2
PA.3
PA.4
PA.5
PA.6
PA.7
a
b
c
d
e
f
g
dp
PA.0
PA.1
PA.2
PA.3
PA.4
PA.5
PA.6
PA.7
dp
g
f
e
d
c
b
a
Hình 2.10 Kiểu mắc Katot chung với
LSB nối chân a
Hình 2.11 Kiểu mắc Katot chung với
MSB nối chân a
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-29/115- Biên soạn: Lâm Quang Chuyên
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
Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16
-30/115- Biên soạn: Lâm Quang Chuyên
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
Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16
-31/115- Biên soạn: Lâm Quang Chuyên
Chương 3
HOẠT ĐỘNG NGẮT
Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16
-32/115- Biên soạn: Lâm Quang Chuyên
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.
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
Begin
End
Chương trình chính
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.
Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16
-33/115- Biên soạn: Lâm Quang Chuyên
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
Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16
-34/115- Biên soạn: Lâm Quang Chuyên
Ứ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
#include
unsigned char index, donvi, chuc;
Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16
-35/115- Biên soạn: Lâm Quang Chuyên
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();
}
}
Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16
-36/115- Biên soạn: Lâm Quang Chuyên
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
#include
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;
Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16
-37/115- Biên soạn: Lâm Quang Chuyên
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
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 38/115- Biên soạn: Lâm Quang Chuyên
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
- 39/115- Biên soạn: Lâm Quang Chuyên
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.
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 40/115- Biên soạn: Lâm Quang Chuyên
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:
(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.
=
1
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 41/115- Biên soạn: Lâm Quang Chuyên
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).
Mode
WGM01
Bit 3
WGM00
Bit 6
Chế độ hoạt
động
Giá trị
cực đại
Thời điểm cập
nhật OCR0
Thời điểm cờ
tràn bậc lên 1
0 0 0 Normal 255 Ngay tức thời 255
1 0 1
PWM, Phase
correct
255 255 0
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
(2)
Thời gian để timer/counter tràn là 255 xung cho timer/counter0,2 (8bit) và 65535
xung cho timer/counter1 (16 bit)
1 xung = bộ chia * CKM
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 42/115- Biên soạn: Lâm Quang Chuyên
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
đầu
0 0 0 0 0 0 0 0
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
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 43/115- Biên soạn: Lâm Quang Chuyên
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
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 44/115- Biên soạn: Lâm Quang Chuyên
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
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
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 45/115- Biên soạn: Lâm Quang Chuyên
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)
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 46/115- Biên soạn: Lâm Quang Chuyên
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:
(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.
=
_ /
2. . (1 + 0)
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 47/115- Biên soạn: Lâm Quang Chuyên
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
1 0
OC0 = 0 khi TCNT0 = OC0 trong khi đếm lên
OC0 = 1 khi TCNT0 = OC0 trong khi đếm xuống
1 1
OC0 = 1 khi TCNT0 = OC0 trong khi đếm lên
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:
(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.
=
_ /
∗ 510
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 48/115- Biên soạn: Lâm Quang Chuyên
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
1 0
OC0 = 0 khi TCNT0 bằng OCR0, OC0 = 1 khi TCNT0 = 0
OC0 = 1 khi TCNT0 bằng OCR0, OC0 = 0 khi TCNT0 = 0
1 1
OC0 = 1 khi TCNT0 bằng OCR0, OC0 = 0 khi TCNT0 = 0
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:
(5)
Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024).
=
_ /
∗ 256
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 49/115- Biên soạn: Lâm Quang Chuyên
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)
Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16
- 50/115- Biên soạn: Lâm Quang Chuyên
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 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16
- 51/115- Biên soạn: Lâm Quang Chuyên
Chương 5
BỘ SO SÁNH TÍN HIỆU
TƯƠNG TỰ
(ANALOG COMPARATOR)
Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16
- 52/115- Biên soạn: Lâm Quang Chuyên
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
Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16
- 53/115- Biên soạn: Lâm Quang Chuyên
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
Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16
- 54/115- Biên soạn: Lâm Quang Chuyên
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
Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16
- 55/115- Biên soạn: Lâm Quang Chuyên
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
// 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;
Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16
- 56/115- Biên soạn: Lâm Quang Chuyên
// 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.
Các file đính kèm theo tài liệu này:
- giao_trinh_vi_dieu_khien_lam_quang_chuyen.pdf
- giao_trinh_vi_dieu_khienp2_753 (1)_2441628.pdf