Led Ma trận

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

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

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

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

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

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

(126 trang)