Các thanh ghi liên quan

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

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 1

DDRB PORTB

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

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;

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

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?

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

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

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.

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

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

(126 trang)