Các từ khóa trong chương trình Codevision

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

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

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

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

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

Hình 3

2. Hãy cho biết nếu x = 5 thì các mệnh đề sau là đúng hay sai: a. ((x<7)||(x>19))

b. ((x<4)&(x>2))

3. Hãy xây dựng cổng logic theo công thức sau:

4. Khi biến x = 0xA5, và y = 70 sau khi thực hiện các lệnh sau thì x hoặc z có giá trị là bao nhiêu: 1. x |= 0x06; 2. x >> 3; 3. x &= 0x06; 4. x = y<<2; 5. x = y^0x5C; 6. z = x^0x5C; 7. x += 4; 8. z = ~x; 9. z = x % y; 10.z = x && y; 11.z = x^y; 12.z = x&y; 13.x |= y; 14.z = x%0b1100; 5. Chân 34 là chân nào của VĐK, PORTB.4 là chân số mấy? 6. Chân T0, T1 của VĐK là chân số mấy?

7. Chân ADC4 là chân số mấy?

8. Hãy cho biết ý nghĩa của các từ khóa static, goto, float, const. 9. Chân PD7 là chân số mấy, chân số 3 của VDK tên gì?

10. Hãy cho biết atmega16 khác atmeg16L như thế nào?

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

GIAO TIẾP VÀO RA (I/O INPUT/OUTPUT)

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

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

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

(126 trang)