Kiểm tra toàn PORT

Một phần của tài liệu Giáo trình vi điều khiển (Trang 38)

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; };

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 <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;} } }

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 <mega16.h>

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;

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

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

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

Chương 3

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.

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.

Ứng dụng của ngắt ngoài dùng đếm sản phẩm, đo độ rộng xung, giải mã encoder… 3.2.2 NGẮT TIMER

Ngắt do bộ timer bên trong vi điều khiển thực hiện, các tác nhân ngắt timer bao gồm: ngắt tràn và ngắt bằng, ngắt khi đọc giá trị thanh ghi TCNTn (capture)

Ngắt tràn: Khi giá trị lưu trữ vượt quá giá trị của thanh ghi TCNTn

Ngắt bằng: Khi giá trị thanh ghi OCRn bằng với giá trị đặt của thanh ghi TCNTn, các mode ảnh hưởng đến hoạt động ngắt tràn: mode độ Normal, mode Fast PWM, mode PWM phase correct.

Ứng dụng của ngắt timer dùng để điều khiển đồng hồ, đo độ rộng xung, hiển thị quét led…

3.2.3 NGẮT ADC, SPI, TWI, AC

Hoạt động ngắt ADC, SPI, TWI (I2C), AC xảy ra khi các hoạt động này hoàn thành 3.2.4 BÀI TẬP VÍ DỤ

Ví dụ 1: Sử dụng ngắt ngoài để đếm sản phẩm

Hình 3.3 Sơ đồ nguyên lý mạch đếm sản phẩm sử dụng ngắt ngoài Chương trình được viết như sau:

Sử dụng ngắt INT0, tác động cạnh xuống. #include <mega16.h>

#include <delay.h>

unsigned char 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(); }

Ví dụ 2: Sử dụng ngắt timer để hiển thị số đếm từ 00 đến 99 và lặp lại Sơ đồ nguyên lý tương tự như hình 3.3

Chương trình được viết như sau:

Sử dụng ngắt tràn timer/counter0, bộ chia 1024, mode Normal #include <mega16.h>

#include <delay.h>

unsigned char index, donvi, chuc; unsigned char flash MaledAnot[10] =

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // Timer 0 overflow interrupt service routine

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

TCNT0=0x00; OCR0=0x00;

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

Chương 4

HOẠT ĐỘNG

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.

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

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 cực đại Giá trị Thời điểm cập nhật OCR0 tràn bậc lên 1 Thời điểm cờ

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

Một phần của tài liệu Giáo trình vi điều khiển (Trang 38)

Tải bản đầy đủ (PDF)

(126 trang)