BỘ LAO ĐỘNG THƯƠNG BINH VÀ XÃ HỘI
TRƯỜNG CAO ĐẲNG KỸ NGHỆ II
KHOA ĐIỆN – ĐIỆN TỬ
ĐỀ CƯƠNG BÀI GIẢNG MODUL:
ĐIỀU KHIỂN HỆ THỐNG CĐTSDVĐK
GVBS: Bùi Ngọc An
TPHCM, tháng 03 năm 2018
2
MỤC LỤC
Chương 1. GIỚI THIỆU VỀ VI ĐIỀU KHIỂN PIC CỦA MICROCHIP
1. Giới thiệu về PIC ............................................................................... 4
2. Các loại PIC thông dụng .................................................................... 4
3. Ứng dụng của PIC ..........
136 trang |
Chia sẻ: huong20 | Ngày: 18/01/2022 | Lượt xem: 385 | Lượt tải: 0
Tóm tắt tài liệu Đề cương bài giảng modul: Điều khiển hệ thống CĐTSDVĐK, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
..................................................................... 5
Chương 2. KIẾN TRÚC PHẦN CỨNG CỦA PIC 18F4520
1. Sơ đồ khối .......................................................................................... 6
2. Sơ đồ chân .......................................................................................... 9
3. Tổ chức bộ nhớ ................................................................................... 9
4. Khối tạo dao động .............................................................................. 13
5. Hoạt động Reset ................................................................................. 15
6. Các Port vào / ra .................................................................................. 17
Chương 3. PHẦN MỀM MPLAB VÀ TRÌNH DỊCH MCC18
1. Cài đặt MPLAB .................................................................................. 29
2. Sử dụng MPLAB ................................................................................ 29
3. Trình dịch MCC18 .............................................................................. 40
Chương 4. HOẠT ĐỘNG VÀO RA
1. Lập Trình xuất ..................................................................................... 50
2. Lập Trình nhập .................................................................................... 50
3. Hoạt động xuất/nhập ........................................................................... 51
4. Bài tập ứng dụng ................................................................................. 52
Chương 5: HOẠT ĐỘNG ĐỊNH THỜI
1. Giới thiệu ........................................................................................... 53
2. Timer 0 ................................................................................................ 53
3. Timer 1 ................................................................................................ 60
4. Lập trình với timer ............................................................................. 64
Chương 6: LẬP TRÌNH VỚI LCD 1602
1. Khái niệm ............................................................................................ 69
2. Nguyên lý hoạt động ........................................................................... 70
3. Nguyên tắc hiển thị trên LCD ............................................................. 70
4. Ví dụ lập trình điều khiển hiển thị trên LCD ...................................... 71
Chương 7: HOẠT ĐỘNG NGẮT
1. Khái niệm ........................................................................................... 75
2. Tổ chức ngắt của PIC 18F4520 ......................................................... 75
3. Ngắt ngoài .......................................................................................... 77
4. Các thanh ghi liên quan ..................................................................... 77
5. Lập trình sử dụng ngắt ........................................................................ 85
3
Chương 8: MODULE CCP (CAPTURE / COMPARE / PWM)
1. Giới thiệu ............................................................................................ 91
2. Các thanh ghi liên quan ...................................................................... 93
3. Sử dụng các bộ PWM ......................................................................... 94
4. Lập trình điều chế độ rộng xung ......................................................... 96
Chương 9: BỘ CHUYỂN ĐỔI TƯƠNG TỰ - SỐ (ADC)
1. Giới thiệu ............................................................................................ 99
2. Các thanh ghi liên quan ..................................................................... 101
3. Điều khiển hoạt động chuyển đổi A/D .............................................. 104
4. Lập trình sử dụng ADC ...................................................................... 111
Chương 10: TRUYỀN THÔNG NỐI TIẾP VÀ GIAO TIẾP GIỮA 2 VI ĐIỀU
KHIỂN PIC
1. Giới thiệu ............................................................................................ 116
2. Các thanh ghi liên quan ..................................................................... 118
3. Tốc độ baud ........................................................................................ 121
4. Ngắt USART ...................................................................................... 128
5. Lập trình sử dụng USART ................................................................. 131
4
Chương 1
GIỚI THIỆU VỀ VI ĐIỀU KHIỂN PIC CỦA MICROCHIP
1. GIỚI THIỆU VỀ PIC
PIC là viết tắt của “Programable Intelligent Computer”, có thể tạm dịch là “máy
tính thông minh khảtrình” do hãng General Instrument đặt tên cho vi điều khiển
đầu tiên của họ. PIC1650 được thiết kế để dùng làm các thiết bị ngoại vi cho vi
điều khiển CP1600. Vi điều khiển này sau đó được nghiên cứu phát triển thêm và
từ đó hình thành nên dòng vi điều khiển PIC ngày nay.
Hình 1.1. Vi điều khiển PIC
2. CÁC LOẠI PIC THÔNG DỤNG
Các kí hiệu của vi điều khiển PIC:
PIC12xxxx: độ dài lệnh 12 bit.
PIC16xxxx: độ dài lệnh 14 bit.
PIC18xxxx: độ dài lệnh 16 bit.
C: PIC có bộ nhớ EPROM (chỉ có 16C84 là EEPROM)
F: PIC có bộ nhớ flash
LF: PIC có bộ nhớ flash hoạt động ở điện áp thấp
LV: như LF, đây là kí hiệu cũ
Bên cạnh đó một số vi điều khiển có kí hiệu xxFxxx là EEPROM, nếu có chữ A
ở cuối là flash (ví dụ PIC16F877 là EEPROM, còn PIC16F877A là flash).
Ngoài ra còn có thêm dòng vi điều khiển PIC mới là dsPIC.
5
Ở Việt Nam phổ biến nhất là họ vi điều khiển PIC do hãng Microchip sản xuất.
Cách lựa chọn một vi điều khiển PIC phù hợp: Trước hết cần chú ý đến sốchân
của vi điều khiển cần thiết cho ứng dụng. Có nhiều vi điều khiển PIC với số lượng
chân khác nhau, thậm chí có vi điều khiển chỉ có 8 chân, ngoài ra còn có vi điều
khiển 28, 40, 44, chân. Cần chọn vi điều khiển PIC có bộ nhớ flash để có thể
nạp xóa chương trình được nhiều lần hơn, tiếp theo cần chú ý đến các khối chức
năng được tích hợp sẵn trong vi điều khiển, các chuẩn giao tiếp bên trong và sau
cùng cần chú ý đến bộ nhớ chương trình mà vi điều khiển cho phép.
3. ỨNG DỤNG CỦA PIC
Ngày nay PIC được ứng dụng rất rộng rãi trong thực tế, từ những vật dụng đơn
giản cho đến những hệ thống điều khiển phức tạp trong công nghiệp.
Hình 1.2. Ứng dụng PIC
6
Chương 2
KIẾN TRÚC PHẦN CỨNG CỦA PIC 18F4520
1. SƠ ĐỒ KHỐI
Hình 2.1. Sơ đồ khối của PIC18F4520
Các khối chính trên PIC 18F4520 bao gồm:
Bộ xử lý trung tâm CPU (Central Processing Unit):
7
Tần số làm việc tối đa 40 MHz, sản xuất bằng công nghệ nanoWatt.
Thiết kế theo kiến trúc Havard, tập lệnh RISC.
Sử dụng kỹ thuật đường ống lệnh (Instruction Pipelining).
Đơn vị logic học (ALU: Arithmetic Logical Unit).
Thanh ghi làm việc (WREG: work register ).
Bộ nhân bằng phần cứng (8x8 Multiply), kết quả được chứa trong cặp thanh
ghi (PRODH, PRODL).
Thanh ghi đếm chương trình (PC: Program Counter) có 21 bit bao gồm
thanh ghi PCL(PC-Low) chứa các bit từ 7-0, thanh ghi PCH (PC-High)
chứa các bit từ 15-8, thanh ghi PCU (PC-upper) chứa các bit từ 20-16.
Thanh ghi con trỏ ngăn xếp STKPTR (Stack Pointer).
31 mức ngăn xếp (31 level stack).
Thanh ghi lựa chọn băng (BSR: Bank Select Register).
Thanh ghi con trỏ dữ liệu gián tiếp FSR (Indirect Data Memory Address
Pointer).
Bộ nhớ (Memory):
Bộ nhớ chương trình (Program Memory) bao gồm 32 Kbytes bộ nhớ ROM
(Read-only Memory) kiểu Flash.
Bộ nhớ dữ liệu (Data Memory) bao gồm 1536 byte SRAM (Static Random
Access Memory), 256 byte EEPROM.
Bộ phát xung hệ thống (Oscillator): Nguồn xung từ bên ngoài hoặc từ bộ
phát xung của hệ thống sẽ được đi qua bộ nhân hoặc chia tần số để lựa chọn
lấy tần số thích hợp để làm xung hệ thống.
Nguồn xung chính được đưa vào chip qua chân OSC1 và OSC2.
Nguồn xung phụ được đưa vào chip qua các chân T1OSI, T1OSO.
Bộ phát xung nội INTRC tần số 31kHz.
Bộ phát xung nội trên chíp tần số 8 MHz.
Watchdog Timer (WDT): là một bộ timer có chức năng đặc biệt, khi bị tràn sẽ
khởi động lại hệ thống. Thời gian khởi động lại hệ thống có thể lựa chọn được
từ 4ms đến 131,072s. WDT sẽ được khởi tạo ở đầu chương trình, trong thân
chương trình sẽ được “chèn” các lệnh reset WDT sao cho khi vi điều khiển
thực hiện các đúng tuần tự các lệnh, WDT chưa bị tràn. Mục đích chính của
việc sử dụng WDT là tránh cho vi điều khiển vô tình thực hiện phải một vòng
lặp chết (dead loop) mà không thoát ra được.
Bộ nạp chương trình: Bộ nạp chương trình nối tiếp trên chip (Single-Supply
In-Circuit Serial Programming) sẽ giúp nạp chương trình từ mạch nạp vào bộ
nhớ ROM qua các chân PGM, PGC và PGD.
8
Bộ Debugger (In-Circuit Debugger): Mạch Debugger trên chíp sẽ giúp người
lập trình kiểm soát lỗi chương trình bằng cách cho vi điều khiển hoạt động ở
chế độ chạy từng lệnh, nhóm lệnh hay toàn bộ chương trình.
Khối phát hiện tín hiệu reset: Mạch phát hiện tín hiệu reset có khả năng phát
hiện 03 nguồn reset:
Reset từ chân MCLR.
Reset khi bật nguồn (POR: Power-on Reset).
Reset khi nguồn yếu (BOR : Brown-out Reset).
Khối quản lý lỗi bộ phát xung (Fail-Safe Clock Monitor): Khối này được sự
dụng để quản lý an toàn bộ phát xung hệ thống.
Khối định thời khởi động bộ phát xung (Oscillator Start-up Timer): Khối này
sử dụng để tạo thời gian trễ chờ cho bộ phát xung ổn định.
Thiết bị ngoại vi (Peripheral): PIC18f4520 được tích hợp các thiết bị ngoại vi
sau:
Bộ phát hiện điện áp cao/thấp HLVD(High/low-Voltage Detect).
Bộ nhớ lưu dữ liệu khi tắt nguồn EEPROM.
04 bộ đếm, định thời 16 bit: Timer0, Timer1, Timer2 và Timer3.
01 bộ so sánh tín hiệu tương tự (Comparator).
02 bộ CCP1, CCP2 (Capture, Compare, PWM : Chụp, So sánh, xung Pwm);
01 bộ ECCP (Enhanced CCP).
01 cổng truyền thông nối tiếp đồng bộ (Master Synchronous Serial Port) có
thể hoạt động được ở chế độ SPI hoặc I2C.
01 cổng truyền thông nối tiếp đồng bộ/không đồng bộ tăng EUSART
(Enhanced Universal Synchronous Asynchronous Receiver Transmitter),
giúp vi điều khiển PIC có thể giao tiếp với nhau hoặc giao tiếp với cổng
COM của máy tính.
13 kênh biến đổi tương tự - số (ADC) độ phân giải 10 bit.
Khối giao tiếp vào/ra số: Vi điều khiển PIC18F4520 có 5 cổng vào/ra A, B, C,
D và E. Mỗi cổng có một thanh ghi đệm dữ liệu tương ứng là PORTA, PORTB,
PORTC, PORTD và PORTE, các thanh ghi này được định địa chỉ theo byte và
theo bit.
PORTA : RA7 - RA0.
PORTB : RB7 - RB0.
PORTC : RC7 - RC0.
PORTD : RD3 - RD0.
PORTE : RE3-RE0.
9
2. SƠ ĐỒ CHÂN
Sơ đồ chân dạng PDIP (Lead Plastic Dual In-Line Package).
Hình 2.2. Sơ đồ chân PIC 18F4520 dạng PDIP
3. TỔ CHỨC BỘ NHỚ
Bộ nhớ của vi điều khiển PIC 18F4520 bao gồm 3 loại:
Bộ nhớ chương trình (Program memory)
Bộ nhớ dữ liệu RAM (Data RAM)
Bộ nhớ dữ liệu EEPROM (Data EEPROM)
Bộ nhớ của PIC 18F4520 được thiết kế theo kiến trúc Havard, bộ nhớ chương
trình và bộ nhớ dữ liệu được thiết kế riêng đường Bus, cho phép CPU truy cập
cùng lúc tới bộ nhớ chương trình và bộ nhớ dữ liệu. Bộ nhớ dữ liệu EEPROM
được sử dụng để lưu trữ dữ liệu khi mất điện.
Bộ nhớ chương trình
Thanh ghi đếm chương trình PC (Program Counter) của PIC 18F4520 có 21 bit
nên có thể địa chỉ hóa 2 Mbyte bộ nhớ chương trình. Bộ nhớ Flash của PIC
18F4520 có dung lượng 32 Kbyte nên chứa được 16384 lệnh từ đơn (single-word
instructions), với dải địa chỉ từ 0000h đến 7FFFh. Nếu đọc ở vùng nhớ ngoài
32Kbyte của PIC 18F4520 và trong khoảng 2 Mbyte mà nó có thể quản lý thì giá
trị dữ liệu trả về sẽ là “0”. PIC 18F4520 có 31 mức ngăn xếp.
10
Vector Reset của PIC 18F4520 được đặt ở địa chỉ 0000h, khi reset nội dung của
thanh ghi đếm chương trình PC sẽ được xóa về 0. Các thanh ghi của PIC 18F4520
sẽ được tải lại các giá trị mặc định.
Hình 2.3. Sơ đồ tổ chức bộ nhớ chương trình và ngăn xếp
Vector ngắt ưu tiên cao (High-Priority Interrupt Vector) được đặt ở địa chỉ 0008h,
vector ngắt ưu tiên thấp (Low-Priority Interrupt Vector) được đặt ở địa chỉ 0018h.
Thanh ghi đếm chương trình PC 21 bit chứa trong 3 thanh ghi 8 bit riêng biệt, 8
bit thấp chứa trong thanh ghi PCL, 8 bit tiếp theo chứa trong thanh ghi PCH, 5 bit
cao chứa trong thanh thi PCU. Thanh ghi PCH và PCU không cho phép truy cập
trực tiếp mà phải truy cập thông qua hai thanh ghi PCLATH và PCLATU tương
ứng. PIC 18F4520 đươc thiết kế theo kỹ thuật đường ống lệnh (Instruction
Pipelining) nên việc thực hiện lệnh PC-2 và đọc mã lệnh PC được diễn ra cũng
một thời điểm.
11
Hình 2.4. Giản đồ xung đọc mã lệnh và thực hiện lệnh của PIC 18F4520
Bộ nhớ dữ liệu RAM
Hình 2.5. Sơ đồ tổ chức bộ nhớ dữ liệu RAM
Bộ nhớ dữ liệu RAM 1536 byte (SRAM) được chia thành 2 vùng chức năng riêng
biệt, vùng RAM đa dụng GPR (General Purpose Registers) sử dụng để chứa dữ
12
liệu, vùng các thanh ghi chức năng đặc biệt SFR (Special Function Registers)
chứa các thanh ghi chức năng điều khiển ngoại vi và CPU.
Bộ nhớ dữ liệu RAM được chia thành 16 Bank từ Bank 0 đến Bank15, vùng RAM
đa dụng nằm từ Bank 0 đến Bank 2, các thanh ghi SFR nằm ở Bank 15. Vùng địa
chỉ từ 300h đến EFFh không được sử dụng, đọc ở vùng này sẽ trả về giá tri 00h.
Bốn bit thấp của thanh ghi lựa chọn băng BSR (Bank Select Register) được sử
dụng để lựa chọn truy cập băng.
Hình 2.6. Phân bổ địa chỉ của các thanh ghi chức năng đặc biệt SFR
Bộ nhớ dữ liệu EEPROM
13
Bộ nhớ dữ liệu EEPROM của PIC 18F4520 là bộ nhớ mảng không bị mất dữ liệu
khi mất điện, độc lập với bộ nhớ chương trình và bộ nhớ dữ liệu RAM, được sử
dụng để lưu trữ dữ liệu lâu dài. Nó có thể ghi/đọc được 1.000.000 lần, dữ liệu có
thể lưu trữ trong bộ nhớ 100 năm.
4. KHỐI TẠO DAO ĐỘNG
PIC 18F4520 có thể hoạt động ở một trong 10 chế độ tạo dao động khác nhau.
Việc lựa chọn các chế độ tạo dao động nhờ các bit FOSC3:FOSC0 trong thanh
ghi CONFIG1H.
Hình 2.7. Sơ đồ khối bộ tạo dao động trên PIC 18F4520
Các chế độ tạo dao động:
LP (Low-Power Crystal) nguồn xung thạch anh ngoài, nguồn thấp
XT (Crystal/Resonator) thạch anh/bộ cộng hưởng bên ngoài
HS (High-Speed Crystal/Resonator) thạch anh/bộ cộng hưởng bên ngoài
tốc độ cao
HSPLL nhân 4 lần tần số HS bằng vòng khóa pha (Phase Locked Loop)
RC (External Resistor/Capacitor) tạo dao động bằng mạch RC bên ngoài,
phát xung FOSC/4 ra chân RA6.
RCIO tạo dao động bằng mạch RC ngoài, vào/ra trên chân RA6.
INTIO1 bộ tạo dao động nội, phát xung FOSC/4 ra chân RA6, vào/ra trên
chân RA7.
INTIO2 bộ tạo dao động nội, vào/ra trên chân RA6 và RA7.
EC bộ phát xung ngoài, phát xung FOSC/4 ra chân RA6.
14
ECIO bộ phát xung ngoài, vào/ra trên chân RA6.
Tạo dao động bằng thạch anh ngoài (Crystal/ Ceramic Resonator)
Trong chế độ tạo dao động LP, XT, HS, HSPLL sử dụng thạch anh (Crystal) chưa
có tụ điện hoặc mạch cộng hưởng thạch anh bọc gốm đã có tụ điện (Ceramic
Resonator). Ở các chế độ này bộ tạo dao động kết nối với vi điều khiển PIC
18F4520 qua hai chân OSC1 và OSC2 .
- Sơ đồ kết nối giữa vi điều khiển với bộ phát xung ngoài:
Hình 2.8. Sơ đồ kết nối với bộ dao động thạch anh/mạch cộng hưởng ngoài
- Lựa chọn giá trị tụ điện khi sử dụng mạch cộng hưởng thạch anh bọc gốm
Bảng 2.1. Lựa chọn giá trị tụ điện khi sử dụng Ceramic Resonator
- Lựa chọn giá trị tụ điện khi sử dụng thạch anh chưa có tụ điện (Crystal).
Bảng 2.2. Lựa chọn tụ điện khi sử dụng thạch anh (Crystal)
Nguồn xung ngoài (External Clock)
15
Chế độ EC và ECIO sử dụng nguồn xung ngoài làm xung hệ thống và được nối
qua cổng NOT trước khi đưa vào chân OSC1/CLKI.
- Chế độ nguồn xung ngoài EC (External Clock), nguồn xung được lấy từ bên
ngoài nối qua cổng NOT trước khi đưa vào OSC1/CLKI và chân OSC2/CLKO
phát ra tần số bằng ¼ tần số đầu vào.
Hình 2.9. Chế độ dao động EC
- Chế độ nguồn xung ngoài ECIO (External Clock Input Output), nguồn xung
được lấy từ bên ngoài nối qua cổng NOT trước khi đưa vào OSC1/CLKI và chân
OSC2/CLKO là chân vào/ra RA6.
Hình 2.10. Chế độ dao động ECIO
5. HOẠT ĐỘNG RESET
Vi điều khiển PIC 18F4520 có 8 nguồn Reset:
Reset do bật nguồn POR (Power-on Reset).
Reset từ chân MCLR, sử dụng trong quá trình hoạt động bình thường.
Reset từ chân MCLR, sử dụng trong chế độ quản lý nguồn.
Reset do Watchdog Timer (WDT).
Reset do sụt điện áp nguồn BOR (Brown-out Reset).
Reset bằng lệnh RESET.
Reset do đầy ngăn xếp (Stack Full Reset).
Reset do rỗng ngăn xếp (Stack Underflow Reset).
16
Hình 2.11. Mô tả các nguồn Reset của PIC 18F4520
a. Reset từ chân MCLR
Nguồn reset MCLR đươc nối từ mạch reset bên ngoài qua chân MCLR/RE3. Nếu
bit MCLRE trong thanh ghi CONFIG3H được đặt bằng 1 thì chân MCLR/RE3 là
chân reset, đặt MCLRE = “0” chân MCLRE là chân vào/ra của PORTE. Khi có
mức điện áp thấp được đặt lên chân MCLR hệ thống sẽ thực hiện reset.
Hình 2.12. Mạch reset ngoài MCLR
b. Reset do bật nguồn POR (Power-on Reset)
17
Khi nguồn được cấp vào chân VDD, khối reset POR sẽ phát hiện sườn dương trên
chân VDD sau đó phát tín hiệu reset vi điều khiển. Bit POR trong thanh ghi RCON
sẽ báo trạng thái của reset POR, POR = ‘1’ là không phát hiện tín hiệu reset, POR=
‘0’ là phát hiện tín hiệu reset POR
Giá trị linh kiện: R = 1KΩ.
Hình 2.13. Mạch reset do bật nguồn POR.
6. CÁC PORT VÀO/RA
Vi điều khiển PIC 18F4520 có 36 chân vào/ra được chia thành 5 cổng là PORTA,
PORTB, PORTC, PORTD có 8 chân và PORTE có 4 chân. Các chân vào/ra của
vi điều khiển PIC 18F4520 mang nhiều chức năng, nó có thể được thiết lập là
chân vào/ra dữ liệu hay là các chân chức năng đặc biệt của các bộ ngoại vi, sử
dụng các thanh ghi điều khiển của ngoại vi để lựa chọn chức năng cho các chân.
Mỗi cổng vào/ra của vi điều khiển PIC 18F4520 có 3 thanh ghi để điểu khiển hoạt
động:
Thanh ghi PORT là thanh ghi dữ liệu, được định địa chỉ theo byte và theo
bit, sử dụng để đệm đọc/ghi dữ liệu trên các cổng.
Thanh ghi LAT là thanh ghi chốt dữ liệu đầu ra (bằng ‘1’ đầu ra chốt mức
1, bằng ‘0’ đầu ra chốt mức 0).
Thanh ghi TRIS là thanh ghi lựa chọn hướng dữ liệu (bằng ‘0’ chiều ra,
bằng ‘1’ chiều vào).
6.1. Cấu trúc chung của một chân vào/ra
Hình 2.14 thể hiện cấu trúc chung của một chân vào/ra. Trong đó việc xác định
chân vào hay ra do các bit cụ thể quy định
18
Hình 2.14. Cấu trúc chung của một chân vào/ra.
6.2. Port A
PORT A gồm 8 bit tương ứng với 8 chân được ký hiệu từ RA0 đến RA7. Các
chân của PORTA có thể đọc/ghi theo từng bit hoặc cả byte.
a. Chức năng các chân của PORTA
Chân
Chức
năng
Thanh
ghi
TRIS
I/O
Kiểu
I/O
Mô tả
RA0/AN0 RA0 0 O DIG Chiều ra dữ liệu sử dụng bit LATA; không bị ảnh
hưởng bởi đầu vào tương tự.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTA.
AN0 1 I ANA Đầu vào kênh 0 của bộ biến đổi A/D hoặc chân đầu
vào C1- của bộ so sánh. Mặc đinh khi Reset POR.
RA1/AN1 RA1
0 O DIG
Chiều ra dữ liệu sử dụng bit LATA; không bị ảnh
hưởng bởi đầu vào tương tự.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTA.
AN1 1 I ANA
Đầu vào kênh 1 của bộ biến đổi A/D hoặc chân đầu
vào C2- của bộ so sánh. Mặc đinh khi Reset POR.
RA2/AN2/ VREF-
/CVREF
RA2 0 O DIG Chiều ra dữ liệu sử dụng bit LATA; Cấm chức
năng này khi đầu ra CVREF được cho phép.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTA. Chức
năng này sẽ bị cấm khi chức năng tương tự hoặc đầu
ra CVREF được cho phép.
AN2 1 I ANA
Đầu vào kênh 2 của bộ biến đổi A/D hoặc chân đầu
vào C2+ của bộ so sánh. Mặc đinh khi Reset POR.
VREF- 1 I ANA
A/D và đầu vào điện áp tham chiếu mức thấp bộ so
sánh.
CVREF x O ANA Đầu ra điện áp tham chiếu bộ so sánh.
19
RA3/AN3/VREF+ RA3 0 O DIG Chiều ra dữ liệu sử dụng bit LATA.
1 I TTL
Chiều vào dữ liệu sử dụng bit PORTA; Chức
năng này bị cấm khi đầu vào tương tự được cho phép.
AN3 1 I ANA Đầu vào kênh 3 của bộ biến đổi A/D hoặc hoặc chân
đầu vào C1+ của bộ so sánh. Mặc đinh khi Reset
POR.
VREF+ 1 I ANA
A/D và đầu vào điện áp tham chiếu mức cao bộ so
sánh.
RA4/T0CKI/C1OUT RA4 0 O DIG Chiều ra dữ liệu sử dụng bit LATA.
1 I ST
Chiều vào dữ liệu sử dụng bit PORTA; mặc định
khi reset POR.
T0CKI 1 I ST Cấp xung cho Timer0.
C1OUT 0 O DIG Đầu ra 1 bộ so sánh; ưu tiên hơn vào/ra dữ liệu.
RA5/AN4/SS/ RA5 0 O DIG Chiều ra dữ liệu sử dụng bit LATA; không ảnh
hưởng bởi đầu vào tương tự.
HLVDIN/C2OUT
1 I TTL
Chiều vào dữ liệu sử dụng bit PORTA; Chức
năng này bị cấm khi cho phép đầu vào tương tự.
AN4 1 I ANA
Đầu vào kênh 4 của bộ biến đổi A/D. mặc định khi
reset BOR.
SS 1 I TTL Đầu vào SS(lựa chọn t/b tớ) của Module MSSP.
HLVDIN 1 I ANA
Đầu vào của Module phát hiện điện áp cao/thấp
(High/Low-Voltage Detect).
C2OUT 0 O DIG
Đầu ra 2 bộ so sánh;được ưu tiên hơn chức năng
vào/ra dữ liệu.
OSC2/CLKO/RA6 RA6
0 O DIG
Chiều ra dữ liệu sử dụng bit LATA. Chức năng
này chỉ được cho phép ở các chế độ RCIO, INTIO2
and ECIO.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTA. Chế độ
này chỉ được cho phép ở các chế độ RCIO, INTIO2
và ECIO.
OSC2 x O ANA
Kết nối với bộ phát xung chính ( ở các chế độ XT, HS
và LP).
CLKO x O DIG Chân phát xung hệ thống(FOSC/4) ở RC, INTIO1 và
EC.
OSC1/CLKI/RA7 RA7
0 O DIG
Chiều ra dữ liệu sử dụng bit LATA. Chức năng
này bị cấm ở chế độ dao động ngoài.
1 I TTL
Chiều vào dữ liệu sử dụng bit PORTA. Chức
năng này bị cấm ở chế độ dao động ngoài.
OSC1 x I ANA Kêt nối với bộ dao động ngoài.
CLKI x I ANA Kết nối với nguồn xung bên ngoài.
Bảng 2.3. Chức năng các chân trên PORTA.
Chú thích:
DIG = Digital level output (đầu ra số); TTL = đệm đầu vào chuẩn TTL (Transistor-
Transistor Logic ); ST = đệm đầu vào sử dụng Schmitt Trigger; ANA = vào/ra tương
tự; x= không xác định; I=Input (vào); O=Output (ra).
Chú ý: Hai chân RA6 và RA7 còn phụ thuộc vào cấu hình bộ phát xung hệ thống.
20
b. Các thanh ghi liên quan đến PORT A
Các thanh ghi liên quan đến PORTA gồm 6 thanh ghi sau:
PORTA: Thanh ghi dữ liệu PORTA.
LATA: Thanh ghi chốt dữ liệu đầu ra của PORTA.
TRISA: Thanh ghi lựa chọn hướng dữ liệu của PORTA (bit tương ứng trên
thanh ghi đặt bằng ‘0’ thì chân tương ứng có chiều ra, bằng ‘1’ là chiều
vào).
ADCON1: Là thanh ghi điều khiển A/D, thiết lập các chân vào/ra là số hay
tương tự.
CMCON: Là thanh ghi điều khiển bộ so sánh.
CVRCON là thanh ghi điều khiển điện áp tham chiếu của bộ so sánh.
Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTA RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0
LATA LATA7 LATA6 Thanh ghi chốt dữ liệu PORTA
TRISA TRISA7 TRISA6 Thanh ghi hướng dữ liệu PORTA
ADCON1 — — VCFG1 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
CMCON C2OUT C1OUT C2INV C1INV CIS CM2 CM1 CM0
CVRCON CVREN CVROE CVRR CVRSS CVR3 CVR2 CVR1 CVR0
Bảng 2.4. Các thanh ghi liên quan đến PORTA.
6.3. Port B
PORTB gồm 8 bit, tương ứng với 8 chân được ký hiệu từ RB0 đến RB7. Các chân
của PORTB có thể đọc/ghi theo từng bit hoặc cả byte. Các chân PORTB
của PORTB còn được sử dụng làm nguồn ngắt ngoài.
a. Chức năng các chân của PORTB
Chân
Chức
năng
TRIS I/O
Kiểu
I/O
Mô tả
RB0/INT0/FLT0
/ AN12
RB0 0 O DIG Chiều ra dữ liệu sử dụng bit LATB; không bị ảnh
hưởng bởi đầu vào tương tự.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTB; Không nối
điện trở pull-up khi RBPU = ‘0’. Cấm chức năng này
khi cho phép đầu vào tương tự.
INT0 1 I ST Ngắt ngoài 0.
FLT0 1 I ST
Đầu vào báo sự cố PWM (Module ECCP1); Cho phép
bằng phần mềm.
AN12 1 I ANA Kênh 12 của bộ biến đổi A/D.
RB1/INT1/AN10 RB1 0 O DIG
Chiều ra dữ liệu sử dụng bit LATB; chức năng này
không bị bởi đầu vào tương tự.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTB; Ngắt kết nôi
trở pull-up khi RBPU = ‘0’. Cấm chức năng này khi
đầu vào tương tự được cho phép.
21
INT1 1 I ST Ngắt ngoài 1.
AN10 1 I ANA Kênh 10 của bộ biến đổi A/D.
RB2/INT2/AN8 RB2 0 O DIG
Chiều ra dữ liệu sử dụng bit LATB; không bị ảnh
hưởng bởi đầu vào tương tự.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTB; Ngắt kết nôi
trở pull-up khi RBPU = ‘0’. Cấm chức năng này khi
đầu vào tương tự được cho phép.
INT2 1 I ST Ngắt ngoài 2.
AN8 1 I ANA Kênh 8 của bộ biến đổi A/D.
RB3/AN9/CCP2 RB3 0 O DIG
Chiều ra dữ liệu sử dụng bit LATB; không bị ảnh
hưởng bởi đầu vào tương tự.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTB; Ngắt kết nôi
trở pull-up khi RBPU = ‘0’. Cấm chức năng này khi
đầu vào tương tự được cho phép.
AN9 1 I ANA Kênh 8 của bộ biến đổi A/D.
CCP2(2) 0 O DIG CCP2 của bộ so sánh và đầu ra của PWM.
1 I ST Đầu vào của bộ capture CCP2.
RB4/KBI0/AN1
1
RB4 0 O DIG
Chiều ra dữ liệu sử dụng bit LATB; không bị ảnh
hưởng bởi đầu vào tương tự.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTB; Ngắt kết nôi
trở pull-up khi RBPU = ‘0’. Cấm chức năng này khi
đầu vào tương tự được cho phép.
KBI0 1 I TTL Chân ngắt của ngắt thay đổi mức PORTB.
AN11 1 I ANA Kênh 11 của bộ biến đổi A/D.
RB5/KBI1/PGM RB5 0 O DIG Chiều ra dữ liệu sử dụng bit LATB.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTB; Ngắt kết nôi
trở pull-up khi RBPU = ‘0’.
KBI1 1 I TTL Chân ngắt của ngắt thay đổi mức PORTB.
PGM x I ST Tín hiệu nối mạch nạp nối tiếp (Single-Supply In-
Circuit Serial Programming™ mode entry (ICSP™)).
Cho phép bởi bit cấu hình LVP; Tất cả các chức năng
khác sẽ bị cấm.
RB6/KBI2/PGC RB6 0 O DIG Chiều ra dữ liệu sử dụng bit LATB.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTB; Ngắt kết nôi
trở pull-up khi RBPU = ‘0’.
KBI2 1 I TTL Chân ngắt của ngắt thay đổi mức PORTB.
PGC x I ST
Đầu vào xung từ (Serial execution (ICSP) clock) mạch
nạp tích hợp ICSP và mạch nạp ICD.
RB7/KBI3/PGD RB7 0 O DIG Chiều ra dữ liệu sử dụng bit LATB.
1 I TTL Chiều vào dữ liệu sử dụng bit PORTB; Ngắt kết nôi
trở pull-up khi RBPU = ‘0’.
KBI3 1 I TTL Chân ngắt của ngắt thay đổi mức PORTB.
PGD
x O DIG
Đầu ra dữ liệu nối tiếp từ (Serial execution data output)
cho ICSP và ICD.
x I ST
Đầu vào dữ liệu nối tiếp từ (Serial execution data
output) cho ICSP và ICD.
Bảng 2.5. Chức năng các chân của PORTB.
22
b. Các thanh ghi liên quan đến PORTB
Có 7 thanh ghi được sử dụng để điều khiển và chọn chức năng cho PORTB:
PORTB: Thanh ghi dữ liệu của PORTB.
LATB: Thanh ghi chốt dữ liệu của PORTB.
TRISB: Thanh ghi hướng dữ liệu của PORTB.
INTCON: Thanh điều khiển ngắt.
INTCON2: Thanh ghi điều khển ngắt 2.
INTCON3: Thanh điều khiển ngắt 3.
ADCON1: Thanh ghi điều khiển bộ biến đổi A/D. Thanh ghi này dùng
để chọn các chân AN0 đến AN12 là các chân vào/ra số hay tương tự.
Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
LATB Thanh ghi chốt dữ liệu PORTB
TRISB Thanh ghi hướng dữ liệu PORTB
INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
INTCON2 RBPU INTEDG0 INTEDG1 INTEDG2 — TMR0IP — RBIP
INTCON3 INT2IP INT1IP — INT2IE INT1IE — INT2IF INT1IF
ADCON1 — — VCFG1 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
Bảng 2.6. Các thanh ghi liên quan đến PORTB.
6.4. Port C
PORT C có độ rộng 8 bit, tương ứng với 8 chân được ký hiệu từ RC0 đến RC7.
Các chân của PORTC có hai chiều dữ liệu và người lập trình có thể đọc/ghi theo
từng bit hoặc cả byte.
a. Chức năng các chân của PORTC
Chân
Chức
năng
TRIS I/O
Kiểu
I/O
Mô tả
RC0/T1OSO/ RC0 0 O DIG Chiều ra dữ liệu sử dụng bit LATC.
T13CKI 1 I ST Chiều vào dữ liệu sử dụng bit PORTC.
T1OSO x O ANA Đầu ra bộ phát xung Timer1; Chức năng này được
cho phép khi cho phép bộ phát xung Timer1. Cấm vào
chức năng vào/ra số.
T13CKI 1 I ST
Cấp xung cho Timer1/Timer3 chế độ đếm sự kiện
(Counter).
RC1/T1OSI/CCP2 RC1 0 O DIG Chiều ra dữ liệu sử dụng bit LATC.
1 I ST Chiều vào dữ liệu sử dụng bit PORTC.
23
T1OSI x I ANA Đầu vào bộ dao động Timer1; Chức năng này được
phép khi cho phép bộ dao động Timer1. Cấm chức
năng vào/ra số.
CCP2
0 O DIG
CCP2 của bộ so sánh và đầu ra của PWM; Chức năng
này ưu tiên hơn vào/ra dữ liệu.
1 I ST Đầu vào capture(chụp) CCP2.
RC2/CCP1/P1A RC2 0 O DIG Chiều ra dữ liệu sử dụng bit LATC.
1 I ST Chiều vào dữ liệu sử dụng bit PORTC.
CCP1
0 O DIG
Chân ECCP1 của bộ so sánh hoặc đầu ra PWM; chức
năng này được ưu tiên hơn vào/ra dữ liệu.
1 I ST Đầu vào capture(chụp) ECCP1.
P1A(2) 0 O DIG Đầu ECCP1 của bộ PWM tăng cường, kênh A.
Chức năng này được ưu tiên hơn chức năng vào/ra dữ
liệu.
RC3/SCK/SCL RC3 0 O DIG Chiều ra dữ liệu sử dụng bit LATC.
1 I ST Chiều vào dữ liệu sử dụng bit PORTC.
SCK
0 O DIG
Chân phát xung(clock) của SPI (Module MSSP);
Chức năng này được ưu tiên hơn chức năng vào/ra dữ
liệu.
1 I ST Đầu vào xung (clock) SPI (Module MSSP).
SCL
0 O DIG
Chân phát xung(clock) của giao tiếp I2C™(Module
MSSP); Chức năng này được ưu tiên hơn chức năng
vào/ra dữ liệu.
1 I
I2C/SM
B
Đầu vào xung(clock) của giao tiếp I2C (Module
MSSP); Chuẩn tín hiệu đầu vào phụ thuộc vào cấu
hình Module MSSP.
RC4/SDI/SDA RC4 0 O DIG Chiều ra dữ liệu sử dụng bit LATC.
1 I ST Chiều vào dữ liệu sử dụng bit PORTC.
SDI 1 I ST
Chân đầu vào dữ liệu của giao tiếp SPI (Module
MSSP).
SDA
1 O DIG
Đầu ra dữ liệu của giao tiếp I2C (Module MSSP);
Chức năng này được ưu tiên hơn chức năng vào/ra dữ
liệu.
1 I
I2C/SM
B
Đầu ra dữ liệu của giao tiếp I2C (Module MSSP); Kểu
tín hiệu đầu ra phụ thuộc vào cấu hình cho Module.
RC5/SDO RC5 0 O DIG Chiều ra dữ liệu sử dụng bit LATC .
1 I ST Chiều vào dữ liệu sử dụng bit PORTC.
SDO 0 O DIG
Chân đầu ra dữ liệu của giao tiếp SPI (Module MSSP);
Chức năng này được ưu tiên hơn chức năng vào/ra dữ
liệu.
RC6/TX/CK RC6 0 O DIG Chiều ra dữ liệu sử dụng bit LATC.
1 I ST Chiều vào dữ liệu sử dụng bit PORTC .
TX 1 O DIG Chân truyền dữ liệu nối tiếp không đồng bộ của
Module EUSART; Chức năng này được ưu tiên hơn
chức năng vào/ra dữ liệ... Cho phép ghi U = Không sử dụng, đọc bằng ‘0’
-n = Reset - POR ‘1’ = Được thiết lập ‘0’ = Được xóa -x = Reset không xác định
Bit 7 TMR0ON: Bit điều khiển Bật/Tắt Timer.
1 = Cho phép Timer0
0 = Dừng Timer0
Bit 6 T08BIT: Bit lựa chọn 8-bit /16-bit của Timer0
54
1 = Timer0 được cấu hình là bộ đếm 8-bit
0 = Timer0 được cấu hình là bộ đếm 16-bit
Bit 5 T0CS: Bit lựa chọn nguồn xung cấp cho Timer0
1 = Nguồn xung từ chân T0CKI
0 = Nguồn xung hệ thống (CLKO)
Bit 4 T0SE: Bit lựa chọn sườn xung đếm cho Timer0
1 = Lựa chọn sườn âm trên chân T0CKI
0 = Lựa chọn sườn dương trên chân T0CKI
Bit 3 PSA: Bit thiết lập bộ chia tần đầu vào
1 = Xung cấp vào Timer0 không qua bộ chia tần.
0 = Xung cấp vào Timer0 qua bộ chia tần(Prescaler).
Bit 2 T0PS: Bit lựa chọn hệ số chia tần
111 = 1:256
110 = 1:128
101 = 1:64
100 = 1:32
011 = 1:16
010 = 1:8
001 = 1:4
000 = 1:2
- Thanh ghi chứa byte thấp của Timer0: TMR0L (8 bit, không định địa chỉ bit)
- Thanh ghi chứa byte cao của Timer0: TMR0H (8 bit, không định địa chỉ bit)
- Thanh ghi điều khiển ngắt : INTCON (xem phần ngắt và xử lý ngắt)
Các thanh ghi liên quan tới Timer0 :
Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
TMR0L Thanh ghi chứa giá trị đếm byte thấp của Timer0
TMR0H Thanh ghi chứa giá trị đếm byte cao của Timer0
INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
T0CON TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0
TRISA RA7(1) RA6(1) RA5 RA4 RA3 RA2 RA1 RA0
2.2. Chế độ hoạt động của Timer 0
Chế độ 8 bit
Ở chế độ 8 bit, giá trị của Timer0 chỉ chứa trong thanh ghi TMR0L, khi tràn (khi
có sự chuyển giá trị đếm từ 255 sang 0), cờ ngắt tràn TMR0IF được đặt bằng 1.
Nguồn xung cấp cho Timer0 có thể lấy từ 2 nguồn:
55
Khi bit T0CS=0, xung được lấy từ bộ dao động trên chíp, tần số của xung
bằng ¼ tần số của bộ dao động thạch anh được sử dụng (Fosc/4).
Khi bit T0CS=1, xung được lấy từ ngoài đưa vào qua chân T0CLKI
(T0CLKI pin), trong các ứng dụng đếm xung đưa từ ngoài vào.
Bit PSA trong thanh ghi T0CON quy định việc sử dụng bộ chia tần số:
Khi PSA = 1, giá trị của Timer 0 sẽ tăng lên 1 đơn vị sau mỗi chu kỳ lệnh
(tương đương 4 chu kỳ thạch anh) hoặc sau 1 chu kỳ xung ngoài đưa đến
chân T0CLKI.
Khi PSA = 0, xung từ 2 nguồn trên sẽ qua bộ chia tần số với 8 hệ số chia
từ 2 đến 256 tùy thuộc vào giá trị của các bit T0PS2, T0PS1, T0PS0 trong
thanh ghi T0CON.
Hình 5.1. Mô tả hoạt động Timer0 ở chế độ 8 bit
Bit T0SE dùng để chọn kiểu tác động của xung ngoài:
Khi T0SE=0, giá trị của TMR0L sẽ tăng 1 đơn vị sau mỗi sườn xung dương
đưa tới chân T0CLKI.
Khi T0SE=1, giá trị của TMR0L sẽ tăng 1 đơn vị sau mỗi sườn xung âm
đưa tới chân T0CLKI.
Khi sử dụng nguồn xung ngoài, nguồn xung này cần có một quá trình đồng bộ với
xung nội (thường mất 2 chu kỳ lệnh tương đương 8 chu kỳ thạch anh).
Chế độ 16 bit
Ở chế độ 16 bit, giá trị của Timer 0 được chứa trong thanh ghi TMR0L (byte thấp)
và TMR0H (byte cao), TMR0H đóng vai trò là bộ đệm của byte cao trong quá
trình ghi đọc. Khi tràn (khi có sự chuyển giá trị đếm từ 65535 sang 0), cờ ngắt
tràn TMR0IF được đặt bằng 1.
Việc lựa chọn nguồn xung, kiểu tác động của xung và bộ chia tần hoàn toàn giống
chế độ 8 bit (hình 4.2).
56
Khi ghi giá trị cho Timer 0, byte thấp được ghi vào TMR0L còn byte cao sẽ được
được ghi từ TMR0H ngay khi byte thấp được ghi. Khi đọc giá trị của Timer 0,
byte thấp được đọc từ TMR0L, byte cao sẽ xuất hiện trong TMR0H ngay khi đọc
byte thấp. Với thiết kế này byte thấp và byte cao của Timer được ghi/đọc đồng
thời.
Hình 5.2. Mô tả hoạt động Timer0 ở chế độ 16 bit
2.3. Ngắt Timer 0.
Ngắt Timer0 xảy ra khi Timer0 tràn. Ở chế độ đếm 8 bit sự kiện tràn xảy ra khi
có sự chuyển số đếm từ FFH sang 00H và FFFFH sang 0000H ở chế độ 16 bit.
Khi tràn cờ ngắt tương ứng của Timer0 (TMR0IF- bit 2 thanh ghi INTCON) được
thiết lập.
Ngắt Timer0 được cho phép ngắt bởi bit TMR0IE (bit 5 thanh ghi INTCON). Mức
ưu tiên ngắt Timer0 được đặt bởi bit TMR0IP (bit 2, thanh ghi INTCON2).
2.4. Ví dụ ứng dụng Timer 0.
Ví dụ 1: Sử dụng Timer0 ở chế độ timer 8 bit, tạo xung 1KHz, nguồn xung lấy từ
bộ dao động trên chíp, xung tạo trên chân RD0, tần số thạch anh sử dụng là 4Mhz.
(*): Tần số xung cấp cho timer: Fosc/4 = 1Mhz => chu kỳ = 1uS. Chu kỳ xung
sau bộ chia tần trước (Prescaler) = 1uS * 4 = 4 uS. Giá trị khởi tạo cho timer là
256-125 => sau 125 xung, timer tràn, tương đương khoảng thời gian: 125 * 4 uS
= 500 uS.
Cách 1: Sử dụng các thanh ghi.
#include
#include
#pragma config OSC = HS // xung he thong o che do HS
#pragma config WDT = OFF // tat che do watchdog
#pragma config MCLRE = ON // cho phep Reset tren chan MCLR
57
#define xung PORTDbits.RD0
void main()
{
//Khoi tao timer0
T0CONbits.T08BIT=1; //Timer 0 che do 8 bit
T0CONbits.PSA=0; //có su dung (Prescaler)
T0CONbits.T0PS2=0; //He so chia bang 4
T0CONbits.T0PS1=0;
T0CONbits.T0PS0=1;
T0CONbits.T0CS=0; //Su dung xung tu Fosc/4
ADCON1=0x0f;
TRISD = 0x00; // output
xung=1;
while(1)
{
xung=~xung;
TMR0L =(256 -125); //dem 125 xung
T0CONbits.TMR0ON = 1; // cho Timer hoat dong
while(!INTCONbits.TMR0IF); // chờ cờ tràn
T0CONbits.TMR0ON = 0; // dừng Timer
INTCONbits.TMR0IF=0; // xóa cờ tràn
}
}
Cách 2: Sử dụng các các hàm hỗ trợ có sẵn trong trình dịch.
#include
#include
#include
void main()
{
//Khoi tao timer0
OpenTimer0( TIMER_INT_OFF & //khong su dung ngat
T0_8BIT & //che do 8bit
T0_SOURCE_INT & //xung nội
T0_PS_1_4 ); //he so chia truoc = 4
ADCON1=0x0f;
TRISD = 0x00; // thiet lap dau ra cho portB
xung=1;
while(1)
{
xung=~xung;
WriteTimer0(256 -125);
T0CONbits.TMR0ON = 1; // cho Timer chạy
while(!INTCONbits.TMR0IF); // cho co tran
T0CONbits.TMR0ON = 0; // dung Timer
58
INTCONbits.TMR0IF=0; // xoa co tran
}
}
Ví dụ 2: Sử dụng Timer0 ở chế độ timer 16 bit, tạo xung 1Hz, nguồn xung lấy từ
bộ dao động trên chíp, xung tạo trên chân RB1, tần số thạch anh sử dụng là 4Mhz.
#include
#define xung PORTBbits.RB1
void main()
{
T0CON = 0b00000100; //16bit,he so chia = 32
TRISB = 0x00; //thiet lap chieu ra i/o PortB
ADCON1= 0x0f; //vao ra so
xung=1;
TMR0H=(65536-15625)/256;
while(1)
{
xung=~xung;
TMR0L=(65536-15625)%256;
T0CONbits.TMR0ON=1; //cho Timer0 chạy
while(!INTCONbits.TMR0IF); // chờ tràn
T0CONbits.TMR0ON=0; // dung Timer0
INTCONbits.TMR0IF=0; // xoa co tran
}
}
Ví dụ 3: Sử dụng Timer 0 ở chế độ đếm, đếm số lần nhấn Button (hình 5.3) và
hiển thị các giá trị đếm được dưới dạng số nhị phân trên 8 led đơn
#include
void main()
{
TRISD=0x00;
LATD=0;
ADCON1 = 0x0f; //vao ra so
//Khoi tạo chế do cho Timer1
T1CON = 0b00000110; //nguon xung ngoai T13CKI
//doc ghi 1 lan 16 bit/ chia 8
TMR1H = 0;
TMR1L = 0;
T1CONbits.TMR1ON = 1;
while(1)
{
PORTD=TMR1L;
}
59
}
Hình 5.3. Sơ đồ nguyên lý ví dụ 3
Ví dụ 4: Viết chương trình dùng ngắt Timer0 tạo xung 1KHz trên chân RD0.
#include
#define xung PORTDbits.RD0
void ngat_uu_tien_cao(void);
#pragma code uu_tien_cao=0x08
void ngat_cao(void)
{
ngat_uu_tien_cao();
}
#pragma code
#pragma interrupt ngat_uu_tien_cao
void ngat_uu_tien_cao(void)
{
T0CONbits.TMR0ON = 0; //dung timer
TMR0L = -125; //nap lai gia tri
T0CONbits.TMR0ON = 1; // cho phep Timer hoat dong
INTCONbits.TMR0IF=0; // xoa co tran
xung = ~xung;
}
void main()
{
T0CON = 0b01000001; // Timer0 8 bit, chia truoc 4
ADCON1=0x0f;
VCC
Button
U1
PIC18F4520
1
2
3
4
5
6
7
12
9
10
15
16
17
18
23
24
25
26
31
8
33
34
35
36
37
38
39
40
14
13
19
20
21
22
27
28
29
30
11
32
RE3/MCLR/VPP
RA0/AN0/C1IN-
RA1/AN1/C2IN-
RA2/AN2/C2IN+/VREF-/CVREF
RA3/AN3/C1IN+/VREF+
RA4/T0CKI/C1OUT
RA5/SS/AN4/HLVDIN/C2OUT
VSS/
RE1/WR/AN6
RE2/CS/AN7
RC0/T1OSO/T13CKI
RC1/T1OSI/CCP2B
RC2/CCP1/P1A
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
VSS
RE0/RD/AN5
RB0/AN12/FLT0/INT0
RB1/AN10/INT1
RB2/AN8/INT2
RB3/AN9/CCP2A
RB4/KBI0/AN11
RB5/KBI1/PGM
RB6/KBI2/PGC
RB7/KBI3/PGD
RA6/OSC2/CLKO
RA7/OSC1/CLKI
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5/P1B
RD6/PSP6/P1C
RD7/PSP7/P1D
VDD/
VDD
VCC
10K
60
TRISD = 0x00; // thiet lap dau ra cho portB
INTCON=0b11100100;
xung=1;
while(1);
}
3. TIMER 1
Timer1 là bộ Timer 16 bit. Ngoài chức năng đếm và định thời thông thường,
Timer1 còn có thể được dùng như một bộ phát xung thứ hai, cấp nguồn xung đồng
hồ cho toàn bộ hệ thống.
3.1. Các thanh ghi của Timer 1
- Thanh ghi điều khiển Timer1: T1CON
R/W-0 R-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
bit 7 bit 0
bit 7 RD16: Bit lựa chọn chế độ ghi/đọc Timer1
1 = Ghi/đọc 1 lần 16 bit.
0 = Ghi/đọc 2 lần mỗi lần 8 bit.
bit 6 T1RUN: Bit cho phép hệ thống lấy xung từ Timer1
1 = Hệ thống hoạt động bằng nguồn xung cấp từ Timer1
0 = Hệ thống hoạt động bằng nguồn xung khác
bit 5-4 T1CKPS1:T1CKPS0: Các bit đặt hệ số chia tần số
11 = Hệ số chia là 1:8
10 = Hệ số chia là 1:4
01 = Hệ số chia là 1:2
00 = Hệ số chia là 1:1
bit 3 T1OSCEN: Bit cho phép/cấm chức năng phát xung cho hệ thống
1 = Cho phép
0 = Cấm
bit 2 T1SYNC: Bit lựa chọn đồng bộ giữa xung ngoài cấp cho Timer1 và xung
trên chip.
Khi bit TMR1CS = 1:
1 = Không đồng bộ
0 = Đồng bộ xung ngoài với xung trên chip
Khi bit TMR1CS = 0: Bit T1SYNC không có giá trị.
bit 1 TMR1CS: Bit lựa chọn nguồn xung cấp cho Timer1
1 = Timer1 được cấp xung từ ngoài qua chân RC0/T1OSO/T13CKI
0 = Timer1 được cấp xung nội (tần số bằng FOSC/4)
61
bit 0 TMR1ON: Bit điều khiển hoạt động của Timer1
1 = Timer1 hoạt động
0 = Dừng Timer1
- Thanh ghi chứa giá tri đếm byte thấp của Timer1: TMR1L
- Thanh ghi chứa giá tri đếm byte cao của Timer1: TMR1H
Các thanh ghi liên quan đến Timer1:
Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
IPR1 PSPIP(1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP
TMR1L Thanh ghi chứa giá tri đếm byte thấp của Timer1
TMR1H Thanh ghi chứa giá tri đếm byte cao của Timer1
T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
3.2. Chế độ hoạt động của Timer 1
a. Chế độ phát xung cho toàn hệ thống.
Hình 5.4. Timer1 hoạt động như một bộ phát xung cho hệ thống
Thông thường PIC18F4520 dùng nguồn dao động từ bộ dao động thạch anh mắc
trên 2 chân OSC1 và OSC2. Tuy nhiên khi nguồn dao động này bị hỏng, bộ vi
điều khiển vẫn có thể hoạt động nhờ việc chuyển sang dùng nguồn dao động thứ
hai, khi đó bit T1RUN và bit T1OSCEN (thanh ghi T1CON ) phải được đặt bằng
1 để cho phép hệ thống dùng nguồn xung từ Timer 1 và cho phép mạch phát xung
trên Timer 1 hoạt động (hình 4.4)
b. Chế độ ghi/đọc 2 lần 8 bit
32Khz
SYSTEM
CLOCK
T1OSI
Pin
T1OSCEN
27pF
27pF
T1OSO
Pin
PIC18F4520
62
Hình 5.5. Timer1 hoạt động ở chế độ ghi/đọc 2 lần 8bit
Trong chế độ ghi/đọc 2 lần 8bit, giá trị của Timer1 được chứa trong 2 thanh ghi
TMR1H (byte cao) và TMR1L (byte thấp). Quá trình ghi đọc được chia làm 2 lần:
Ghi/đọc thanh ghi TMR1H và ghi/đọc thanh ghi TMR1L. Khi có sự chuyển số
đếm từ FFFFH sang 0 (tràn), cờ tràn của Timer1 (bit TMR1IF) được đặt bằng 1
và xảy ra ngắt Timer1 nếu nguồn ngắt này được cho phép.
Timer1 được điều khiển hoạt động/dừng bởi bit TMR1ON (hình 5.5).
Nguồn xung cấp cho Timer1 có thể lấy từ 1 trong 3 cách sau:
Lấy xung từ bộ dao động trên chíp, xung này có tần số bằng Fosc/4. Khi đó
bit TMR1CS phải được đặt bằng 0.
Lấy xung từ một nguồn xung bên ngoài đưa vào qua chân T13CKI. Khi đó
bit T1OSCEN phải được đặt bằng 0 và bit TMR1CS phải được đặt bằng 1.
Trong trường hợp này Timer1 thường được dùng như một bộ đếm (đếm số
xung đưa vào qua chân T13CKI).
Lấy xung từ mạch tạo dao động bao gồm bộ tạo dao động của Timer1 và
các linh kiện như hình 2.7. Khi đó bit T1OSCEN và bit TMR1CS phải được
đặt bằng 1.
Cả 3 nguồn xung này đếu được đưa qua bộ chia tần số với các hệ số chia là 1, 2,
4, 8 (tùy thuộc vào giá trị của các bit T1CKPS1, T1CKPS0).
Khi sử dụng xung từ ngoài cấp cho Timer1 thì có thể lựa chọn việc sử dụng bộ
đồng bộ để đồng bộ hóa nguồn xung này với xung của hệ thống bằng cách đặt bit
T1SYNC bằng 0 (=1 nếu không sử dụng bộ đồng bộ).
c. Chế độ ghi/đọc 1 lần 16 bit
Trong chế độ ghi/đọc 16 bit 1 lần, byte thấp của Timer1 vẫn là thanh ghi TMR1L,
thanh ghi TMR1H trở thành bộ đệm của byte cao. Khi đọc TMR1L, giá trị của
63
byte cao sẽ tự động chuyển vào TMR1H, khi ghi TMR1L, giá trị của TMR1H sẽ
tự động chuyển vào byte cao. Hai hoạt động ghi/đọc TMR1L và chuyển giá trị
giữa byte cao của Timer1 với TMR1H diễn ra ở cùng thời điểm.
Điều khiển sự hoạt động của Timer1 và các nguồn xung cấp cho Timer1 trong chế
độ này hoàn toàn giống chế độ ghi/đọc 2 lần 8 bit.
Hình 5.6. Timer1 hoạt động ở chế độ ghi/đọc 1 lần 16bit
3.3. Ngắt Timer 1.
Ngắt Timer1 được cho phép bởi bit TMR1IE (thanh ghi PIE1), được đặt mức ưu
tiên cao/thấp bởi bit TMR1IP (thanh ghi IPR1). Ngắt Timer1 xảy ra khi Timer1
tràn, khi đó cờ ngắt tràn TMR1IF (thanh ghi PIR1) được đặt bằng 1.
3.4. Ví dụ ứng dụng Timer 1.
Sử dụng Timer1 chế độ ghi/đọc 2 lần 8 bit tạo tần số 50Hz trên chân RE0
#include
#include
#include
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config MCLRE = ON
#define xung PORTEbits.RE0
void main()
{
TRISE=0x00;
ADCON1 = 0x0f; //vao ra so
64
//Khởi tạo chế độ cho Timer1
T1CON = 0b00110000; /nguon xung noi,doc ghi 2 lan
//8 bit, he so chia truoc = 8
xung = 0;
while(1)
{
xung=~xung;
TMR1H = (65536-1250)/256;
TMR1L = (65536-1250)%256;
T1CONbits.TMR1ON = 1;
while(!PIR1bits.TMR1IF); //50uS
PIR1bits.TMR1IF = 0;
T1CONbits.TMR1ON = 0;
}
}
4. LẬP TRÌNH VỚI TIMER
Ví dụ 1: Sử dụng Timer0 chế độ 8 bit tạo xung có tần số 1KHz, Ton = Toff trên
chân RA5, sử dụng bộ dao động ở chế độ HS.
Các bước thực hiện :
Bước 1: Viết chương trình:
Lựa chọn nguồn xung hệ thống từ thạch anh ngoài chế độ HS.
Đặt Timer0 ở chế độ 8bit (T08BIT = 1), hệ số chia tần là 4 và nguồn xung
từ thạch anh.
Căn cứ vào thạch anh 8MHhz, hệ số chia tần 4 và thời gian cần tạo trễ 500
uS để tính giá trị khởi tạo cho bộ đếm là -250 hoặc (256-250). Ở chế độ 8
bit thanh ghi chứa giá trị đếm là TMR0L.
Sau khi bộ đếm tràn cần xóa cờ tràn để có thể phát hiện được thời điểm tràn
ở các lần tràn sau.
Đảo mức tín hiệu trên chân RA5 sau 500 uS.
Dưới đây là chương trình tham khảo:
#include
#include
#include
#pragma config OSC = HS // xung he thong o che do HS
#pragma config WDT = OFF // tat watchdog timer
#pragma config MCLRE = ON // Reset tren chan MCLR
#define xung PORTAbits.RA5
void main()
{
T0CONbits.T08BIT=1; //Timer 0 che do 8 bit
65
T0CONbits.PSA=0; //su dung bo chia tan Prescaler)
T0CONbits.T0PS2=0; //He so chia bang 4
T0CONbits.T0PS1=0;
T0CONbits.T0PS0=1;
T0CONbits.T0CS=0; //Su dung xung tu Fosc/4
ADCON1=0x0f;
TRISA = 0x00;
xung=1;
while(1)
{
TMR0L = -250; // khoi tao timer
// (sau 250 xung = 250*2uS //
timer tran)
T0CONbits.TMR0ON = 1; // Timer hoat dong
while(!INTCONbits.TMR0IF); // cho co tran
T0CONbits.TMR0ON = 0; // dung Timer
INTCONbits.TMR0IF=0; // xoa co tran
xung=~xung;
}
}
Bước 2: Kiểm tra.
Sử dụng máy hiện sóng đo kiểm tra tín hiệu phát ra từ chân RA5 trên
Testpoint 2
Ví dụ 2: Sử dụng Timer0 chế độ 16 bit, tạo xung có tần số 1Hz (Ton = Toff) trên
chân RC2.
Gợi ý thực hiện:
Các bước thực hiện như ví dụ 1.
Một số điểm cần lưu ý:
Đặt Timer0 ở chế độ 16bit (T08BIT = 0), chọn hệ số chia tần là 32.
Ở chế độ 16 bit byte cao sẽ được nạp sẵn, khi khởi tạo lại không cần nạp
giá trị cho byte cao mà chỉ cần nạp cho byte thấp, byte cao sẽ tự động
được nạp lại cùng byte thấp.
Sử dụng LED để quan sát và máy hiện sóng để kiểm tra.
Dưới đây là chương trình tham khảo:
#include
#include
#include
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config MCLRE = ON
66
#define xung PORTCbits.RC2
void main(void)
{
T0CON = 0b00000100; // Time0 16bit,he so chia tan:32
PORTC = 0x00;
TRISC = 0x00;
TMR0H=(65536-31250)/256; //lấy byte cao
while(1)
{
TMR0L=(65536-31250)%256; //lấy byte thấp
T0CONbits.TMR0ON=1; // cho Timer0 chạy
while(!INTCONbits.TMR0IF); // cho co tran
T0CONbits.TMR0ON=0; // dung Timer0
INTCONbits.TMR0IF=0; // xoa co tran
xung=~xung;
}
}
Ví dụ 3: Sử dụng ngắt Timer0 tạo xung theo yêu cầu như ví dụ 2.
Gợi ý thực hiện:
Các bước thực hiện như ví dụ 1.
Một số điểm cần lưu ý:
Khởi tạo ngắt Timer0.
Mỗi lần xảy ra ngắt cần: xóa cờ ngắt; dừng Timer; khởi tạo lại TMR0L;
đảo mức logic trên RC2.
Dưới đây là chương trình tham khảo:
#include
#include
#include
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config MCLRE = ON
#define xung PORTCbits.RC2
void ngat_timer0(void);
void ngat_cao(void);
#pragma code abc =0x08
void ngat_cao(void)
{
_asm goto ngat_timer0 _endasm
}
#pragma code
#pragma interrupt ngat_timer0
67
void ngat_timer0(void)
{
T0CONbits.TMR0ON=0; // dung Timer0
INTCONbits.TMR0IF=0; // xoa co tran
TMR0L=(65536-31250)%256;
T0CONbits.TMR0ON=1; // cho Timer0 hoat dong
xung=~xung;
}
void main(void)
{
T0CON = 0b00000100;
PORTC = 0x00;
TRISC = 0x00;
INTCONbits.GIE=1;
INTCONbits.TMR0IE=1; //cho phep ngat timer0
INTCON2bits.TMR0IP=1; //muc uu tien cao
TMR0H=(65536-31250)/256;
INTCONbits.TMR0IF=1; //buoc ngat timer0
while(1);
}
Ví dụ 4: Cho mạch như hình hình 4.7. Liên tục đọc trạng thái của chân RB0 và
ghi giá trị đọc được ra RA4. Timer1 ở chế độ đếm sự kiện, đếm số lần nhấn nút
Key1 và hiển thị giá trị đếm được dưới dạng số nhị phân ra LED1÷LED4.
Hình 5.7. Sơ đồ mạch điện thực hiện yêu cầu ví dụ 4
68
Gợi ý thực hiện:
Chọn chiều ra cho các chân RA4, và RB4 đến RB7.
Chọn chiều vào cho các chân RB0 và RC0.
Chọn đầu vào/ra số cho tất cả các chân.
Timer1 khởi tạo ở chế độ đọc/ghi 1 lần 16 bit, nguồn xung ngoài từ chân
RC0/T1OSO.
Lặp lại liên tục các thao tác:
Đọc từ RB0 xuất ra RA4
Đọc giá trị từ bộ đếm, dịch trái 4 bit xuất ra PORB để hiện thi trên 4
LED.
Dưới đây là chương trình tham khảo:
#include
#include
#include
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config MCLRE = ON
void main()
{
TRISA=0x00;
PORTA=0x00;
TRISB=0x0f;
TRISC=0x01;
ADCON1 = 0x0f; //vao ra so
//Khoi che do cho Timer1:
//TMR1CS=1: chon nguon xung ngoai tu T1OSO/T13CKI
//T1CKPS1:T1CKPS0=00: He so chia bang 0
//T1SYNC=1: Khong dong bo
//RD16=0: ghi doc 2 lan
T1CON = 0b00000110;
TMR1H = 0;
TMR1L = 0;
T1CONbits.TMR1ON = 1;
while(1)
{
PORTAbits.RA4=PORTBbits.RB0;
PORTB=TMR1L<<4;
}
}
69
Chương 6
LẬP TRÌNH VỚI LCD 1602
1. KHÁI NIỆM
Màn hình tinh thể lỏng hay LCD (Liquid Crystal Display) là loại thiết bị hiển
thị cấu tạo bởi các tế bào (các điểm ảnh) chứa tinh thể lỏng có khả năng thay đổi
tính phân cực của ánh sáng và do đó thay đổi cường độ ánh sáng truyền qua khi
kết hợp với các kính lọc phân cực. Chúng có ưu điểm là phẳng, cho hình ảnh sáng,
chân thật và tiết kiệm năng lượng
Hình 6.1. Màn hình LCD 1602
LCD được sử dụng trong rất nhiều các ứng dụng vi điều khiển. Nó có khả năng
hiển thị kí tự đa dạng, trực quan (chữ, số và kí tự đồ họa), dễ dàng đưa vào mạch
ứng dụng theo nhiều giao thức giao tiếp khác nhau, tốn rất ít tài nguyên hệ thống
và giá thành rẻ
2. NGUYÊN LÝ HOẠT ĐỘNG
LCD hoạt động dựa trên nguyên tắc ánh sáng nền (Back Light). Nó bao gồm một lớp
chất lỏng nằm giữa 2 lớp kính phân cực ánh sáng. Bình thường, khi không có điện áp,
các tinh thể này được xếp thẳng hàng giữa hai lớp cho phép ánh sáng truyền qua theo
hình xoắn ốc. Hai bộ lọc phân cực, 2 bộ lọc màu và 2 bộ cân chỉnh sẽ xác định cường
độ ánh sáng đi qua và màu nào được tạo ra trên một pixel.
Khi có điện áp cấp vào, lớp canh chỉnh sẽ tạo một vùng điện tích, canh chỉnh lại các
tinh thể lỏng đó. Nó không cho phép ánh sáng đi qua để hiện thị lên hình ảnh tại vị trí
điểm ảnh đó. Các điểm ảnh trong màn hình LCD là một transistor cực nhỏ ở 1 trong 2
chế độ: cho phép ánh sáng đi qua hoặc không.
3. NGUYÊN TẮC HIỂN THỊ TRÊN LCD
LCD có rất nhiều dạng phân biệt theo kích thước từ vài kí tự đến hàng chục kí tự, từ 1
hàng đến vài chục hàng. Ví dụ LCD 16×2 có nghĩa là có 2 hàng, mỗi hàng có 16 kí tự.
LCD 20×4 có nghĩa là có 4 hàng, mỗi hàng có 20 kí tự.
70
LCD có nhiều loại và số chân của chúng cũng khác nhau nhưng có 2 loại phổ biến là
loại 14 chân và loại 16 chân, sự khác nhau là các chân nguồn cung cấp, còn các chân
điều khiển thì không thay đổi, khi sử dụng loại LCD nào thì phải tra datasheet của chúng
để biết rõ các chân. Sơ đồ chân của LCD như bảng sau:
Chân Tên Vào/Ra Chức năng
1 Vss Power Nguồn
2 Vdd Power Mass
3 Vo Analog Điều chỉnh tương phản
4 RS Input Chọn thanh ghi
= 0: điều khiển
= 1: dữ liệu
5 RW Input = 0: Ghi
= 1: Đọc
6 E Input Cho phép
7 D0 I / O Dữ liệu (LSB)
8 D1 I / O Dữ liệu
9 D2 I / O Dữ liệu
10 D3 I / O Dữ liệu
11 D4 I / O Dữ liệu
12 D5 I / O Dữ liệu
13 D6 I / O Dữ liệu
14 D7 I / O Dữ liệu (MSB)
Các mô-đun LCD hiển thị ký tự được thiết kế dựa trên bộ điều khiển HD44780 của
Hitachi. Điều khiển hiển thị các ký tự trên LCD thực chất là gửi các mã lệnh tới bộ điều
khiển HD44780
Các lệnh thông dụng
1. Lệnh xoá màn hình “Clear Display”: khi thực hiện lệnh này thì LCD sẽ bị xoá và
bộ đếm địa chỉ được xoá về 0.
Mã lệnh: 0 0 0 0 0 0 0 1
2. Lệnh di chuyển con trỏ về đầu màn hình “Cursor Home”: khi thực hiện lệnh này
thì bộ đếm địa chỉ được xoá về 0, phần hiển thị trở về vị trí gốc đã bị dịch trước
đó. Nội dung bộ nhớ RAM hiển thị DDRAM không bị thay đổi.
Mã lệnh: 0 0 0 0 0 0 1 0
71
3. Lệnh thiết lập lối vào “Entry mode set”: lệnh này dùng để thiết lập lối vào cho
các kí tự hiển thị, bit ID = 1 thì con trỏ tự động tăng lên 1 mỗi khi có 1 byte dữ
liệu ghi vào bộ hiển thị, khi ID = 0 thì con trỏ sẽ không tăng: dữ liệu mới sẽ ghi
đè lên dữ liệu cũ. Bit S = 1 thì cho phép dịch chuyển dữ liệu mỗi khi nhận 1 byte
hiển thị.
Mã lệnh: 0 0 0 0 0 1 ID S
4. Lệnh điều khiển con trỏ hiển thị “Display Control”: lệnh này dùng để điều khiển
con trỏ (chohiển thị thì bit D = 1, tắt hiển thị thì bit D = 0), tắt mở con trỏ (mở
con trỏ thì bit C = 1, tắt con trỏ thì bit C = 0), và nhấp nháy con trỏ (cho nhấp
nháy thì bit B = 1, tắt thì bit B = 0).
Mã lệnh: 0 0 0 0 1 D C B
5. Lệnh di chuyển con trỏ hiển thị
Mã lệnh: 80H con trỏ về dòng 1 cột 1
Mã lệnh: 81H con trỏ về dòng 1 cột 2
.
Mã lệnh: C0H con trỏ về dòng 2 cột 1
Mã lệnh: C1H con trỏ về dòng 2 cột 2
.
Mã lệnh: 94H con trỏ về dòng 3 cột 1
Mã lệnh: 95H con trỏ về dòng 3 cột 2
.
Mã lệnh: D4H con trỏ về dòng 4 cột 1
Mã lệnh: D5H con trỏ về dòng 4 cột 2
.
4. VÍ DỤ LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ LCD
Ví dụ 1: Cho sơ đồ mạch điện như hình 6.2. Viết chương trình hiển các ký tự AA
trên dòng thứ nhất, các ký tự aa trên dòng thứ hai của LCD
Gợi ý thực hiện :
- Chọn chiều ra số cho PORD, RE0, RE1, RE2.
- Dựa vào bảng mã lệnh xây dựng hàm ghi 1 byte điều khiển vào LCD
“Lcd_Write_Command” và hàm ghi 1 byte dữ liệu vào LCD
“Lcd_Write_Data”.
- Xây dựng hàm “Lcd_configure” để cấu hình ban đầu cho LCD.
- Sử dụng hàm ghi 1 byte dữ liệu gửi mã ASCII từ vi điều khiển lên LCD để
hiển thị các ký tự theo yêu cầu của đầu bài.
72
Hình 6.2. Sơ đồ mạch điện điều khiển hiển thị trên LCD
Dưới đây là chương trình tham khảo:
#include
#include
#include
#pragma config OSC = HS
#pragma config MCLRE = ON
#pragma config WDT = OFF
#define LCD_DATA PORTD
#define LCD_RS PORTEbits.RE0
#define LCD_RW PORTEbits.RE1
#define LCD_EN PORTEbits.RE2
void Lcd_configure(void);//KHOI TAO LCD
void Lcd_Write_Command(char command);//GHI LENH
void Lcd_Write_Data(char data);//GHI DATA
void Lcd_configure (void)
{
Lcd_Write_Command(0x03);
Lcd_Write_Command(0x38);
Lcd_Write_Command(0x06);
Lcd_Write_Command(0x0c);
Lcd_Write_Command(0x01);
}
void Lcd_Write_Command (char command)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = command;
LCD_EN = 0;
MCLR/VPP
1
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA3/AN3/VREF+
5
RA4/T0CKI
6
RA5/AN4/SS/LVDIN
7
RE0/RD/AN5
8
RE1/WR/AN6
9
RE2/CS/AN7
1 0
V
D
D
1
1
VSS
1
2
OSC1/CLKI
1 3
OSC2/CLKO/RA6
1 4
RC0/T1OSO/T1CKI
1 5
RC1/T1OSI/CCP2
1 6
RC2/CCP1
1 7
RC3/SCK/SCL
1 8
RD0/PSP0
1 9
RD1/PSP1
2 0
RD2/PSP2
2 1
RD3/PSP3
2 2
RC4/SDI/SDA
2 3
RC5/SDO
2 4
RC6/TX/CK
2 5
RC7/RX/DT
2 6
RD4/PSP4
2 7
RD5/PSP5
2 8
RD6/PSP6
2 9
RD7/PSP7
3 0
VSS
3
1
V
D
D
3
2
RB0/INT0
3 3
RB1/INT1
3 4
RB2/INT2
3 5
RB3/CCP2
3 6
R B 4
3 7
RB5/PGM
3 8
RB6/PGC
3 9
RB7/PGD
4 0
U 1
PIC18F4520
+ 5 V
G N D
K
1 6
A
1 5
D
7
1
4
D
6
1
3
D
5
1
2
VSS
1
V D D
2
V E E
3
R
S
4
R
W
5
E
N
6
D
0
7
D
1
8
D
2
9
D
3
1
0
D
4
1
1
L C D
G N D
2
1
3
1 0 K
V R 3
+ 5 V
G N D
+ 5 V
4.7R/2W
R 1
1 2
Y 1
4 M
2 2 P
C 1
2 2 P
C 2
G N D
RESET1
PIC1
73
Delay1KTCYx(10);//5mS
}
void Lcd_Write_Data (char data)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = data;
LCD_EN = 0;
Delay1KTCYx(10);//5mS
}
void main()
{
TRISD=0x00;
TRISE=0X00;
ADCON1=0X0f;
Lcd_configure();
while(1)
{
Lcd_Write_Command(0X80); // dau dong 1
Lcd_Write_Data(0x41); // hien thi AA
Lcd_Write_Data('A');
Lcd_Write_Command(0XC0); // dau dong 2
Lcd_Write_Data(0x61); // hien thi aa
Lcd_Write_Data('a');
}
}
Ví dụ 2: Viết chương trình hiển thị một chuỗi ký tự “KHOA DIEN TU” ở giữa
dòng thứ nhất.
Gợi ý thực hiện :
- Các bước thực hiện như ví dụ 1.
- Một số điểm cần lưu ý:
+ Sử dụng hàm sprintf
+ Sử dụng hàm Lcd_Write_String hiển thị một chuỗi ký tự bất kỳ trên
LCD.
Dưới đây là một số điểm cần lưu ý trong chương trình:
#include
char message[32];
void Lcd_Write_Data(char data);//GHI DATA
void Lcd_Write_String (char *str);
74
void Lcd_Write_String (char *str)
{
while(*str)
{
Lcd_Write_Data(*str);
str++;
}
}
void main()
{
while(1)
{
Lcd_Write_Command(0X83);
sprintf(&message[0],"KHOA DIEN TU");
Lcd_Write_String(&message[0]);
}
}
75
Chương 7
HOẠT ĐỘNG NGẮT
1. KHÁI NIỆM
Trong thực tế người ta rất muốn tận dụng khả năng của CPU để làm thêm được
nhiều công việc khác nữa, chỉ khi nào có cần trao đổi dữ liệu thì mới yêu cầu CPU
tạm dừng công việc hiện tại để phục vụ việc trao đổi dữ liệu. Sau khi hoàn thành
việc trao đổi dữ liệu thì CPU lại phải quay về để làm tiếp công việc hiện đang bị
gián đoạn. Cách làm việc theo kiểu này gọi là ngắt CPU (gián đoạn hoạt động của
CPU). Một hệ thống sử dụng ngắt có thể đáp ứng rất nhanh các yêu cầu trao đổi
dữ liệu trong khi vẫn có thể làm được các công việc khác.
2. TỔ CHỨC NGẮT CỦA PIC 18F4520
Vi điều kiển PIC18F4520 có hai vector ưu tiên ngắt: Vector ưu tiên ngắt cao (địa
chỉ 0008H) và vector ưu tiên ngắt thấp (địa chỉ 0018H). Các nguồn ngắt đều có
thể đặt mức ưu tiên cao hoặc thấp (trừ ngắt INT0 - ngắt ngoài 0).
Khi xảy ra đồng thời cả hai ngắt ưu tiên cao và ngắt ưu tiên thấp thì ngắt ưu tiên
cao được thực hiện trước, ngắt ưu tiên thấp thực hiện sau. Khi đang thực hiện
chương trình con phục vụ ngắt của ngắt ưu tiên thấp mà có ngắt ưu tiên cao xảy
ra thì chương trình con phục vụ ngắt thấp được tạm dừng để thưc hiện chương
trình con phục vụ ngắt cao, khi chương trình phục vụ ngắt ưu tiên cao thực thi
xong, CPU sẽ quay lại thực hiện tiếp chương trình con phục vụ ngắt thấp.
Các nguồn ngắt của PIC18F4520:
Ngắt ngoài trên các chân RB0/INT0, RB1/INT1 và RB2/INT2.
Ngắt do các bộ timer bao gồm: Timer0, Timer1. Timer2, Timer3.
Ngắt do PORTB.
Ngắt từ bộ biến đổi A/D.
Ngắt từ PORT nối tiếp EUSART gồm ngắt truyền và ngắt nhận.
Ngắt từ module MSSP.
Ngắt Capture, Compare từ CCP1 và CCP2.
Ngắt do hỏng bộ phát xung hệ thống.
Ngắt từ module so sánh tương tự.
Ngắt từ hoạt động ghi vào bộ nhớ dữ liệu EEPROM/Flash.
Ngắt do sự xung đột bus.
Ngắt do phát hiện được mức điện áp cao/thấp.
Ngắt từ port song song tớ (Parallel Slave Port).
76
Hình 7.1. Logic ngắt của PIC 18F4520
Để sử dụng một nguồn ngắt nào đó, ta phải quan tâm đến các bit sau:
Bit cờ ngắt (Flag Bit): Khi xảy ra ngắt từ một nguồn ngắt nào thì bit cờ ngắt
tương ứng được đặt (set) bằng 1. Kiểm tra (đọc) cờ ngắt sẽ biết được ngắt
xảy ra từ đâu, sau đó xóa cờ ngắt để thực hiện lần ngắt tiếp theo (các bit cờ
không được xóa bằng phần cứng).
Bit cho phép ngắt (Interrupt Enable Bit): Để cho phép một nguồn ngắt nào
đó, ta phải đặt bit cho phép ngắt tương ứng bằng 1, ngược lại, để cấm một
nguồn ngắt thì sẽ đặt bit cho phép ngắt của nguồn ngắt đó bằng 0. Mỗi
nguồn ngắt có một bit cho phép tương ứng, ngoài ra tất cả các nguồn ngắt
còn được cho phép/cấm bởi bit cho phép ngắt toàn cục (GIE - Global
Interrupt Enable); các nguồn ngắt ngoại vi được cho phép/cấm bởi bit cho
phép ngắt ngoại vi (PEIE - Peripheral Interrupt Enable).
Bit ưu tiên ngắt (Interrupt priority bit): Bit này cho phép đặt một nguồn
ngắt nào đó ở mức ưu tiên cao hoặc thấp.
77
Bit lựa chọn cách tác động ngắt. Với các nguồn ngắt ngoài INT0, INT1 và
INT2 có 02 cách tác động ngắt: Tác động bằng sườn dương (Rising Edge)
hoặc sườn âm (Falling Edge).
3. NGẮT NGOÀI
Ngắt ngoài INT0, INT1 và INT2 được tích cực bằng sườn xung bên ngoài đặt lên
các chân ...1000 + 0x30);
114
Lcd_Write_Data((AD%1000)/100 + 0x30);
Lcd_Write_Data(((AD%1000)%100)/10+ 0x30);
Lcd_Write_Data(((AD%1000)%100)%10+ 0x30);
}
}
Ví dụ 2: Viết chương trình biến đổi điện áp từ chân AN0. Hiển thị giá trị số trên
dòng thứ nhất, giá trị điện áp trên dòng thứ hai của LCD (hình 2.19).
Hình 9.8. Thông tin cần hiển thị theo yêu cầu của ví dụ 2
Gợi ý thực hiện:
Các bước thực hiện tương tự như ví dụ 1
Một số lưu ý:
Viết thêm hàm Lcd_Write_String() để hiển thị chuỗi.
Sử dụng lệnh sprintf để chuyển đổi một số tự nhiên (từ 0 đến 9) sang mã
ASCII của chính số đó.
Dưới đây là một số điểm cần lưu ý trong chương trình:
#include
char message[32];
unsigned int AD;
void Lcd_Write_String (char *str);
void ADC0(void);
void main()
{
float AD1;
unsigned int AD2;
TRISD=0x00;
TRISE=0X00;
TRISA=0X01;
ADCON1=0X0E;
Lcd_configure();
while(1)
{
ADC0();
115
AD1=(float)(AD*5)/1023; //đoi sang die nap (volt)
AD2=(unsigned int)(AD1*1000);//doi sang mV
Lcd_Write_Command(0X80);//dau dong 1
//doi mot so sang ma ascii cua chinh so do va hien thi
tren 2 dong
sprintf(&message[0],"ADC0 = %4d \nVolt = %d.%d V ",AD,AD2/1000,
AD2%1000);
Lcd_Write_String(&message[0]);
}
}
116
Chương 10
TRUYỀN THÔNG NỐI TIẾP
VÀ GIAO TIẾP GIỮA 2 VI ĐIỀU KHIỂN PIC
1. GIỚI THIỆU
Truyền tin nối tiếp là phương thức truyền tin trong đó các bit mang thông tin được
truyền kế tiếp nhau trên một đường dẫn vật lý. Tại một thời điểm phía bên truyền
cũng như bên nhận chỉ có thể truyền/nhận được 1 bit.
Ưu điểm: Truyền được ở khoảng cách xa, tiết kiệm đường truyền dẫn, truyền tin
nối tiếp có ưu thế hơn so với truyền tin song song.
Nhược điểm: Tốc độ truyền chậm hơn, phức tạp hơn do các thiết bị thường phải
có các khối chuyển đổi nối tiếp sang song song, song song sang nối tiếp.
Có 3 phương thức truyền tin nối tiếp:
Phương thức đồng bộ: Các byte chứa các bit thông tin được truyền liên tiếp
trên đường truyền và chỉ được ngăn cách nhau bằng bit đồng bộ khung
(Syn). Hình 10.1.a.
Phương thức không đồng bộ: Các byte chứa các bit thông tin được chứa
trong một khung. Một khung được bắt đầu bằng 1 bit Start, tiếp theo là các
bit mang thông tin, kế tiếp là bit kiểm tra chẵn lẻ và kết thúc là bit Stop.
Khoảng các giữa các khung là các bit dừng bất kỳ, Khi đó đường truyền
được đẩy lên mức cao (Hình 10.1.b).
Phương thức lai: Đây là phương thức kết hợp của 2 phương thức trên, trong
đó các bit trong 1 khung được truyền theo phương thức không đồng bộ còn
các byte được truyền theo phương thức đồng bộ.
Hình 10.1. Các phương thức truyền tin nối tiếp
a, Phương thức truyền tin đồng bộ
b, Phương thức truyền tin không đồng bộ
117
Module EUSART trên PIC18F4520
Module truyền nhận đồng bộ/không đồng bộ nối tiếp (Enhanced Universal
Synchronous Asynchronous Receiver Transmitter - EUSART) là một bộ vào/ra
dữ liệu nối tiếp theo giao thức truyền tin nối tiếp USART.
Module EUSART có thể được cấu hình thành một hệ thống truyền/nhận nối tiếp
không đồng bộ song công và có thể truyền thông với các ngoại vi khác như các
thiết bị đầu cuối, máy tính cá nhân (Personal Computers). EUSART cũng có thể
được cấu hình thành bộ truyền/nhận nối tiếp bán song công (haft-duplex), hệ
thống đồng bộ có thể giao tiếp được với các thiết bị ngoại vi như là bộ biến đổi
A/D hoặc D/A tích hợp, EEPROMs nối tiếp, v.v
EUSART trên PIC còn thực hiện một số tính năng nâng cao như: Tự động phát
hiện tốc độ truyền và hiệu chuẩn, tự động đánh thức để tiếp nhận tín hiệu đồng bộ
thoát (Sync Break) và truyền 12 ký tự thoát (Break character). Những cải tiến trên
giúp cho vi điều khiển PIC18F4520 có thể phù hợp cho việc sử dụng trong hệ
thống bus liên kết mạng cục bộ (LIN bus).
Module EUSART có thể hoạt động ở các chế độ:
Không đồng bộ (song công) với:
o Tự động đánh thức bởi ký tự tiếp nhận (Auto-wake-up on character
reception).
o Tự động hiệu chỉnh tốc độ baud.
o Truyền 12 bit ký tự thoát.
Đồng bộ chủ (bán song công), cho phép lựa chọn sự phân cực xung clock.
Đồng bộ tớ (bán song công), cho phép lựa chọn sự phân cực xung clock.
Các chân của Module EUSART là các chân đa chức năng trên PORTC. Để lựa
chọn cấu hình các chân RC6/TX/CK và RC7/RX/DT là chân của Module
EUSART cần phải thiết lập các bit sau:
Bit SPEN (RCSTA) phải được thiết lập (=1).
Bit TRISC phải được thiết lập (=1).
Bit TRISC phải được thiết lập (=1).
Hoạt động của Module EUSART được điều khiển thông qua ba thanh ghi:
Thanh ghi trạng thái truyền và điều khiển (TXSTA).
Thanh ghi trạng thái nhận và điều khiển (RCSTA).
Thanh ghi điều khiển tốc độ baud (BAUDCON).
118
2. CÁC THANH GHI LIÊN QUAN
- Thanh ghi trạng thái truyền và điều khiển - TXSTA
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R-1 R/W-0
CSRC TX9 TXEN(1) SYNC SENDB BRGH TRMT TX9D
bit 7 bit 0
bit 7 CSRC: bit lựa chọn nguồn xung
Chế độ không đồng bộ: Không hỗ trợ.
Chế độ đồng bộ:
1 = Chế độ chủ (xung được tạo trên chip từ BRG)
0 = Chế độ tớ (nguồn xung từ bên ngoài)
bit 6 TX9: Bit cho phép truyền 9 bit
1 = Lựa chọn chế độ truyền 9 bit
0 = Lựa chọn chế độ truyền 8 bit
bit 5 TXEN: Bit cho phép truyền
1 = Cho phép truyền
0 = Không cho phép truyền
bit 4 SYNC: Bit lựa chọn chế độ EUSART
1 = Chế độ đồng bộ
0 = Chế độ không đồng bộ
bit 3 SENDB: Bit gửi ký tự kết thúc (Break Character)
Chế độ không đồng bộ:
1 = Gửi đồng bộ kết thúc (được xóa bằng phần cứng lúc hoàn thành)
0 = Hoàn thành truyền đồng bộ kết thúc
Chế độ đồng bộ: Không hỗ trợ.
bit 2 BRGH: Bit lựa chọn baud tốc độ cao
Chế độ không đồng bộ:
1 = Tốc độ cao
0 = Tốc độ thấp
Chế độ đồng bộ: Không được sử dụng.
bit 1 TRMT: Bit báo trạng thái thanh ghi dịch truyền dữ liệu
1 = TSR rỗng
0 = TSR đầy
bit 0 TX9D: Bit truyền dữ liệu thứ 9
Có thể sử dụng chứa địa chỉ/dữ liệu hoặc bit chẵn lẻ.
- Thanh ghi điều khiển và trạng thái nhận - RCSTA
119
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R-0 R-0 R-x
SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
bit 7 bit 0
bit 7 SPEN: Bit cho phép PORT nối tiếp
1 = Cho phép PORT nối tiếp (các chân RX/DT và TX/CK sẽ được cấu hình
là các chân của PORT nối tiếp)
0 = Không cho phép
bit 6 RX9: Bit cho phép PORT nối tiếp nhận 9 bit
1 = Lựa chọn nhận 9 bit
0 = Lựa chọn nhận 8 bit
bit 5 SREN: Bit cho phép nhận đơn
Chế độ không đồng bộ: Không sử dụng.
Chế độ đồng bộ – Chủ:
1 = Cho phép nhận đơn
0 = Không cho phép nhận
Bit này sẽ được xóa sau khi quá trình nhận hoàn thành.
Chế độ đồng bộ – Tớ:Không sử dụng.
bit 4 CREN: Bit cho phép nhận liên lục
Chế độ không đồng bộ:
1 = Cho phép nhận liên tục
0 = Không cho phép nhận liên tục
Chế độ đồng bộ:
1 =Cho phép nhân liên tục, CREN sẽ bị xóa khi SREN(bit cho phép
nhận đơn) được thiết lập
0 = Không cho phép nhận liên tục
bit 3 ADDEN: Bit cho phép phát hiện địa chỉ
Chế độ đồng bộ 9-Bit (RX9 = 1):
1 = Cho phép phát hiện địa chỉ, cho phép ngắt và tải dữ liệu từ bộ
đệm nhận khi RSR được thiết lập (=1).
0 = Không cho phép phát hiện địa chỉ, tất cả các byte được nhận và
bit thứ 9 có thể được sử dụng như là bit kiểm tra chẵn lẻ.
Chế độ không đồng bộ 8-Bit (RX9 = 0): Không được sử dụng.
bit 2 FERR: Bit báo lỗi khung truyền/nhận
1 = Khung bị lỗi (có thể được xóa khi đọc thanh ghi RCREG và nhận byte
hợp lệ kế tiếp).
0 = Không xảy ra lỗi khung
bit 1 OERR: Bit lỗi do tràn
1 = Lỗi tràn (có thể được xóa bằng khi xóa bit CREN)
0 = Không xảy ra lỗi tràn
120
bit 0 RX9D: Bit nhận dữ liệu thứ 9
Có thể chứa bit địa chỉ/dữ liệu hoặc bit chẵn lẻ và được tính toán và xử lý
theo chương trình của người sử dụng.
- Thanh ghi điều khiển tốc độ baud (BAUDCON)
R/W-0 R-1 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R/W-0
ABDOVF RCIDL RXDTP TXCKP BRG16 — WUE ABDEN
bit 7 bit 0
bit 7 ABDOVF: Bit trạng thái tự động điều chỉnh tốc độ baud
1 = Tốc độ baud từ BRG đã được điều chỉnh ở chế độ phát hiện tốc độ baud
tự động (bit này phải được xóa bằng phần mềm).
0 = Không phát hiện điều chỉnh tốc độ ở BRG
bit 6 RCIDL: Bit trạng thái nghỉ (Idle) của hoạt động nhận
1 = Hoạt động nhận ở trạng thái nghỉ (Idle)
0 = Hoạt động nhận ở trạnh thái hoạt động (Active)
bit 5 RXDTP: Bit lưa chọn phân cực Dữ liệu/Nhận
Chế độ không đồng bộ:
1 = Nhận dữ liệu (RX) được đảo ngược (tích cực thấp)
0 = Nhận dữ liệu (RX) không được đảo ngược (tích cực cao)
Chế độ đồng bộ:
1 = Dữ liệu (DT) được đảo ngược (tích cực thấp)
0 = Dữ liệu (DT) không được đảo ngược (tích cực cao)
bit 4 TXCKP: Bit lựa chọn phân cực xung clock và dữ liệu
Chế độ không đồng bộ:
1 = Trạng thái nghỉ (Idle) của hoạt động truyền (TX) được thiết lập
ở mức thấp
0 = Trạng thái nghỉ (Idle) của hoạt động truyền (TX) được thiết lập
ở mức cao
Chế độ đồng bộ:
1 = Trạng thái nghỉ (Idle) của hoạt động phát xung clock (CK) được
thiết lập ở mức cao.
0 = Trạng thái nghỉ (Idle) của hoạt động phát xung clock (CK) được
thiết lập ở mức thấp.
bit 3 BRG16: Bit cho phép thanh ghi tốc độ baud 16-Bit
1 = Bộ phát tốc độ baud 16-bit, gồm hai thanh ghi SPBRGH và SPBRG
0 = Bộ phát tốc độ baud 8-bit, chỉ sử dụng thanh ghi SPBRG, bỏ qua thanh
ghi SPBRGH.
bit 2 Không được sử dụng: Đọc sẽ được ‘0’
bit 1 WUE: Bit cho phep đánh thức (Wake-up)
121
Chế độ không đồng bộ:
1 = EUSART tiếp tục lấy mẫu trên chân RX – ngắt sẽ phát sinh ở
sườn âm; bit này sẽ được xóa bằng phần cứng sau khi có sườn dương.
0 = Chân RX không được giám sát hoặc phát hiện sườn
Chế độ đồng bộ: Không sử dụng ở chế độ này.
bit 0 ABDEN: Bit cho phép phát hiện tốc độ baud tự động
Chế độ không đồng bộ:
1 = Cho phép đo tốc độ baud ở ký tự tiếp theo. Bit này được xóa bằng
phần cứng lúc hoàn thành.
0 = Không cho phép hoạt động đo tốc độ baud hoặc hoàn thanh.
Chế độ đồng bộ: Không sử dụng ở chế độ này.
3. TỐC ĐỘ BAUD
Tốc độ baud hay còn được gọi là tốc độ truyền thông, là số bit được truyền đi trên
một giây (bps – bit per second).
Bộ tạo tốc độ baud BRG (Baud Rate Generator) có thể hoạt động ở chế độ 8 bit
hoặc 16 bit, hỗ trợ cả chế độ đồng bộ và không đồng bộ của EUSART. Ở chế độ
mặc định, BGR hoạt động ở chế độ 8 bit. Chế độ BGR 16 bit được lựa chọn khi
bit BAUDCON được thiết lập.
Hai thanh ghi SPBRGH:SPBRG được sử dụng để điều khiển chu kỳ xung tốc độ
baud. Trong chế độ không đồng bộ, cả hai bit BRGH(TXSTA) và
BRG16(BAUDCON) đều được sử dụng để điều khiển tốc độ baud. Trong chế
độ đồng bộ, bit BRGH không được sử dụng.
- Lựa chọn chế độ và công công thức tính tốc độ baud:
Cấu hình các bit
Chế độ BRG/EUSART Công thức tốc độ baud
SYNC BRG16 BRGH
0 0 0 8-Bit/Không đồng bộ FOSC/[64 (n + 1)]
0 0 1 8-Bit/Không đồng bộ
FOSC/[16 (n + 1)]
0 1 0 16-Bit/Không đồng bộ
0 1 1 16-Bit/Không đồng bộ
FOSC/[4 (n + 1)] 1 0 x 8-Bit/Đồng bộ
1 1 x 16-Bit/Đồng bộ
Ghi chú:
x = Giá trị bất kỳ n = Giá trị của cặp thanh ghi SPBRGH:SPBRG
Bảng 10.1. Chế độ, công thức tính tốc độ baud
Tính sai số tốc độ baud
122
Truyền thông nối tiếp USART thường sử dụng các tốc độ baud chẵn như: 300,
600, 1200, 2400, 4800, 9600, 19200 v.v. Trên thực tế vi điều khiển PIC18F4520
thường sử dụng các loại thạch anh 40MHz, 20MHz, 16MHz, 10Mhz, 8MHz,
4MHz v.v. Vì vậy, chúng ta rất khó có thể chọn được giá trị nạp vào thanh ghi
điều chỉnh tốc độ baud SPBRG để tạo được tốc độ baud mong muốn.
Công thức tính sai số:
𝑆𝑎𝑖 𝑠ố =
𝑡ố𝑐 độ 𝑡í𝑛ℎ 𝑡𝑜á𝑛 𝑡ℎự𝑐 𝑡ế – 𝑡ố𝑐 độ 𝑚𝑜𝑛𝑔 𝑚𝑢ố𝑛
𝑡ố𝑐 độ 𝑚𝑜𝑛𝑔 𝑚𝑢ố𝑛
(%)
Ví dụ: Với tần số thạch anh FOSC = 16MHz, tốc độ truyền thông mong muốn là
9600, chế độ không đồng bộ, 8 bit BRG:
Tốc độ mong muốn = FOSC/(64([SPBRGH:SPBRG]+1))
Giá trị cần nạp vào cặp thanh ghi SPBRGH:SPBRG:
X = ((FOSC/ tốc độ mong muốn)/64) – 1
= ((16000000/9600)/64) – 1
= 25.042
Giá trị nạp vào cặp thanh ghi SPBRGH:SPBRG phải là số nguyên nên làm
tròn là 25.
Tốc độ tính toán thực tế = 16000000/(64 (25 + 1))
= 9615
Sai số = (9615 – 9600)/9600 = 0.16%
- Các thanh ghi liên quan đến bộ điều chỉnh tốc độ baud (BRG):
Tên Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
TXSTA CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D
RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
BAUDCON ABDOVF RCIDL RXDTP TXCKP BRG16 — WUE ABDEN
SPBRGH EUSART Thanh ghi tạo tốc độ baud byte cao
SPBRG EUSART Thanh ghi tạo tốc độ baud byte cao
Ghi chú: — Không được sử dụng, đọc sẽ được ‘0’. Các ô tô màu không được sử dụng ở BRG.
Bảng 10.2. Tổng hợp các thanh ghi liên quan đến bộ điều chỉnh tốc độ baud (BRG)
CÁC CHẾ ĐỘ KHÔNG ĐỒNG BỘ
123
Chế độ không đồng bộ được lựa chọn khi bit SYNC (TXSTA) bị xóa (=0).
Trong chế độ này, bộ EUSART sử dụng tiêu chuẩn Non-Return-to-Zero (NRZ).
Tiêu chuẩn NRZ biểu diễn bit 1 bằng mức điện áp cao, còn bit 0 bằng mức điện
áp thấp và không sử dụng mức điện áp trung tính. Định dạng khung truyền NRZ
trong chế độ này bao gồm một bit Start (bit khởi đầu khung truyền), kế tiếp là 8
hoặc 9 bit dữ liệu và kết thúc khung truyền là 1 bit Stop (bit kết thúc khung truyền).
Định dạng dữ liệu phổ biến nhất là 8 bit.
Bộ EUSART truyền/nhận bit dữ liệu có trọng số thấp (LSb) trước. Hoạt động
truyền và nhận của EUSART là độc lập nhau nhưng sử dụng chung định dạng
khung truyền và tốc độ baud. Kiểm tra chẵn lẻ không được hỗ trợ bằng phần cứng
nhưng có thể được thực hiện bằng phần mềm và lưu trữ trong bit thứ 9.
Khi hoạt động ở chế độ không đồng bộ, EUSART thực hiện một số tính năng quan
trọng sau:
Tạo tốc độ baud (BRG).
Mạch lấy mẫu.
Truyền không đồng bộ.
Nhận không đồng bộ.
Tự động đánh thức(Auto-Wake-up) bằng ký tự đồng bộ khung (Sync Break
Character).
Truyền 12 bit ký tự ngắt khung (12-bit Break Character).
Hoạt động truyền của EUSART ở chế độ không đồng bộ
Thanh ghi TSR (Transmit (Serial) Shift Register) được sử dụng để dịch lần lượt
các bit dữ liệu nối tiếp từ bit trọng số thấp nhấp LSb đến bit có trọng số cao MSb
ra chân TX. Thanh ghi TSR không cho phép đọc/ghi bằng phần mềm. Thanh ghi
TXREG được sử dụng để đệm dữ liệu cho thanh ghi TSR. Dữ liệu cần truyền
được nạp vào thanh ghi TXREG, sau đó dữ liệu sẽ được nạp tự động từ TXREG
sang TSR. Thanh ghi TSR chưa được nạp dữ liệu khi bit Dừng (Stop) trước đó
chưa được truyền đi. Ngay sau khi bit Dừng được truyền đi thì dữ liệu sẽ được
nạp vào TRS (nếu có dữ liệu trong TXREG).
Ngay sau khi dữ liệu được nạp từ TXREG sang TSR (trong một chu kỳ máy),
thanh ghi TXREG sẽ rỗng và cờ ngắt truyền TXIF (PIR1) sẽ được thiết lập
(=1).
Bit TXIF được sử dụng để biết trạng thái của thanh ghi TXREG, còn bit TRMT
(TXSTA) được sử dụng để biết trạng thái của thanh ghi TSR. Bit TRMT chỉ
được phép đọc, nó thiết lập khi TSR rỗng. Hoạt động ngắt không được gắn liền
với bit này, nó chỉ sử dụng để báo trạng thái rỗng của thanh ghi TSR.
124
Các bước để truyền dữ liệu ở chế độ không đồng bộ:
Bước 1. Khởi tạo giá trị cho cặp thanh ghi SPBRGH:SPBRG, thiết lập hoặc
xóa bit BRGH và BRG16 để đạt được tốc độ truyền mong muốn (theo bảng
chế độ và công thức tính tốc độ baud).
Bước 2. Xóa bit SYNC (TXSTA) để cho phép chế độ không đồng bộ
và thiết lập bit SPEN (RCSTA) để cho phép PORT nối tiếp.
Bước 3. Nếu muốn sử dụng ngắt thì cần phải thiết lập bit TXIE.
Bước 4. Để thiết lập khung truyền là 9 - bit cần thiết lập bit TX9
(TXSTA). Khi đó bit - 9 sẽ có thể được sử dụng để chứa địa chỉ / dữ
liệu hoặc bit kiểm tra chẵn lẻ.
Bước 5. Cho phép truyền dữ liệu bằng bit TXEN.
Bước 6. Nếu khung truyền 9 bit được lựa chọn, bit thứ 9 cần được nạp vào
TX9D.
Bước 7. Nạp dữ liệu cần truyền vào thanh ghi TXREG (quá trình truyền dữ
liệu sẽ được bắt đầu).
Bước 8. Nếu sử dụng ngắt, cần chắc chắn rằng bit GIE và PEIE của thanh
ghi INTCON (INTCON) đã được thiết lập.
Sơ đồ khối hoạt động truyền của EUSART ở chế độ không đồng bộ:
Hình 10.2. Sơ đồ khối truyền dữ liệu của EUSART ở chế độ không đồng bộ
Giản đồ thời gian của hoạt động truyền không đồng bộ:
125
Hình 10.3. Sơ đồ khối hoạt động truyền không đồng bộ
Giản đồ thời gian của hoạt động truyền không đồng bộ (truyền liên tiếp các byte):
Hình 10.4. Sơ đồ khối hoạt động truyền không đồng bộ (truyền liên tiếp các byte)
Các thanh ghi liên quan đến hoạt động truyền không đồng bộ:
Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
IPR1 PSPIP(1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP
RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
TXREG Thanh ghi truyền dữ liệu của EUSART
TXSTA CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D
BAUDCON ABDOVF RCIDL RXDTP TXCKP BRG16 — WUE ABDEN
SPBRGH Thanh ghi tạo tốc độ baud byte cao của EUSART
SPBRG Thanh ghi tạo tốc độ baud thấp cao của EUSART
Bảng 10.3 Các thanh ghi liên quan đến hoạt động truyền không đồng bộ
Hoạt động nhận của EUSART ở chế độ không đồng bộ
126
Sơ đồ khối của hoạt động nhận ở chế độ bất động bộ được thể hiện ở hình 2.14
dưới. Dữ liệu được nhận về qua chân RX và khối phục hồi dữ liệu. Chế độ này
thường được sử trong hệ thống truyền thông RS-232.
Hình 10.5. Sơ đồ khối nhận dữ liệu của EUSART ở chế độ không đồng bộ
Các bước để truyền dữ liệu ở chế độ không đồng bộ:
Bước 1. Khởi tạo giá trị cho cặp thanh ghi SPBRGH:SPBRG, thiết lập hoặc
xóa bit BRGH và BRG16 để đạt được tốc độ truyền mong muốn (theo bảng
chế độ và công thức tính tốc độ baud).
Bước 2. Xóa bit SYNC (TXSTA) để cho phép chế độ không đồng bộ và
thiết lập bit SPEN (RCSTA) để cho phép PORT nối tiếp.
Bước 3. Nếu sử dụng ngắt thì cần phải thiết lập bit RCIE.
Bước 4. Để cho phép nhận bit thứ 9 cần phải thiết lập bit RX9(RCSTA).
Bước 5. Thiết lập bit CREN để cho phép hoạt động nhận.
Bước 6. Bit cờ ngắt RCIF sẽ được thiết lập khi hoạt động nhận hoàn thành,
ngắt sẽ xảy ra khi bit cho phép ngắt RCIE đã được thiết lập trước đó.
Bước 7. Đọc bit RX9D (RCSTA) để có được bit thứ 9 (nếu khung truyền
9 bit được cho phép), căn cứ vào bit thứ 9 để phát hiện lỗi khung truyền.
Bước 8. Đọc 8 bit dữ liệu nhận về trong thanh ghi RCREG.
Bước 9. Nếu phát hiện dữ liệu nhận bị lỗi, xóa lỗi bằng cách xóa bit cho phép
nhận CREN.
Bước 10. Nếu sử dụng ngắt, cần chắc chắn rằng bit GIE và PEIE của thanh ghi
INTCON (INTCON) đã được thiết lập.
Hoạt động dò tìm địa chỉ ở chế độ nhận 9 bit
127
Chế độ này thường được sử dụng trong hệ thống truyền thông RS-485.
Các bước để nhận không đồng bộ và cho phép tự động phát hiện địa chỉ:
Bước 1. Khởi tạo giá trị cho cặp thanh ghi SPBRGH:SPBRG, thiết lập hoặc
xóa bit BRGH và BRG16 để đạt được tốc độ truyền mong muốn (theo bảng
chế độ và công thức tính tốc độ baud).
Bước 2. Xóa bit SYNC (TXSTA) để cho phép chế độ không đồng bộ và
thiết lập bit SPEN (RCSTA) để cho phép PORT nối tiếp.
Bước 3. Nếu sử dụng ngắt thì cần phải thiết lập bit RCIE và lựa chọn mức ưu
tiên ngắt bằng bit RCIP.
Bước 4. Thiết lập bit RX9 để cho phép hoạt động nhận 9 bit.
Bước 5. Thiết lập bit ADDEN để cho phép phát hiện địa chỉ.
Bước 6. Cho phép hoạt động nhận bằng bit CREN.
Bước 7. Bit cờ ngắt RCIF sẽ được thiết lập khi hoạt động nhận hoàn thành.
Ngắt sẽ xảy ra khi bit RCIE và GIE đã được thiết lập trước đó.
Bước 8. Đọc thanh ghi RCSTA để xác đinh lỗi có xảy ra ở hoạt động nhận,
cũng như đọc bit dữ liệu thứ 9 (nếu có).
Bước 9. Đọc thanh ghi RCREG để phát hiện thiết bị có địa chỉ phù hợp.
Bước 10. Nếu phát hiện lỗi xảy ra thì cần phải xóa bit CREN.
Bước 11. Nếu thiết bị phù hợp địa chỉ được phát hiện, cần xóa bit ADDEN để
nhận dữ liệu vào bộ đệm nhận và ngắt CPU.
Giản đồ thời gian của hoạt động nhận không đồng bộ:
Hình 10.6. Giản đồ thời gian của hoạt động nhận không đồng bộ
Các thanh ghi liên quan đến chế độ nhận không đồng bộ:
128
Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
IPR1 PSPIP(1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP
RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
RCREG Thanh ghi nhận dữ liệu của EUSART.
TXSTA CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D
BAUDCON ABDOVF RCIDL RXDTP
TXCK
P
BRG16 — WUE ABDEN
SPBRGH Thanh ghi tạo tốc độ baud byte cao của EUSART.
SPBRG Thanh ghi tạo tốc độ baud byte thấp của EUSART.
Bảng 10.4. Các thanh ghi liên quan đến hoạt động nhận không đồng bộ
4. NGẮT USART
Ngắt từ bộ USART xảy ra khi kết thúc quá trình truyền một ký tự (ngắt truyền)
hoặc kết thúc quá trình nhận một ký tự (ngắt nhận).
Để đặt ngắt từ bộ USART, ta cần chú ý thêm các bit sau:
Bit cho phép ngắt nhận RCIE (thanh ghi PIE1); bit ưu tiên ngắt nhận RCIP
(thanh ghi IPR1).
Bit cho phép ngắt truyền TXIE (thanh ghi PIE1); bit ưu tiên ngắt nhận TXIP
(thanh ghi IPR1).
Khi xảy ra ngắt, cờ ngắt tương ứng sẽ được thiết lập: Với ngắt truyền là bit TXIF
(thanh ghi PIR1); Với ngắt nhận là bit RCIF (thanh ghi PIR1). Các cờ ngắt này
cần xóa bằng phần mềm.
Một số hàm thông dụng trong thư viện usart.h
Bảng 8.5. liệt kê các hàm trong thư viện usart.h
Hàm Mô tả
BusyUSART Hàm báo bận của hoạt động truyền nối tiếp.
CloseUSART Cấm USART.
OpenUSART Cấu hình PORT nối tiếp.
putsUSART Truyền một mảng ra PORT USART.
ReadUSART Đọc 1 byte từ PORT USART.
WriteUSART Truyền 1 byte ra PORT USART.
Bảng 10.5. Các hàm của thư viện usart.h
• Hàm : BusyUSART
129
Chức năng: Hàm báo bận của hoạt động truyền nối tiếp
Nguyên mẫu: char BusyUSART( void );
Chú thích: Sử dụng để báo trạng thái truyền của PORT nối tiếp
Giá trị trả về: Bằng 0 nếu nếu hoạt động truyền đang ở trạng thái nghỉ
Bằng 1 nếu đang truyền.
Ví dụ: while (BusyUSART());
• Hàm : OpenUSART
Chức năng: Cấu hình cho PORT nối tiếp
Nguyên mẫu: void OpenUSART( unsigned char config,
unsigned int spbrg);
Các đối số: “config”: dùng thiết lập các thông số sau cho USART (các
thông số có thể được thiết lập đồng thời bằng toán tử “&”):
Thông số 1:
USART_TX_INT_ON: cho phép ngắt truyền
USART_TX_INT_OFF: cấm ngắt truyền
Thông số 2:
USART_RX_INT_ON: cho phép ngắt nhận
USART_RX_INT_OFF: cấm ngắt nhận
Thông số 3:
USART_ASYNCH_MODE: Chọn chế độ cận đồng bộ
(Asynchronous Mode)
USART_SYNCH_MODE: Chọn chế độ đồng bộ
(Synchronous Mode)
Thông số 4:
USART_EIGHT_BIT: Chọn chế độ truyền/nhận 8 bit (8-bit
transmit/receive)
USART_NINE_BIT: Chọn chế độ truyền/nhận 9 bit (9-bit
transmit/receive)
Thông số 5:
USART_SYNC_SLAVE: Chọn chế độ tớ (Synchronous
Slave mode)
USART_SYNC_MASTER: Chọn chế độ chủ (Synchronous
Master mode)
Thông số 6:
USART_SINGLE_RX: Chọn chế độ nhận từng byte (Single
reception)
USART_CONT_RX: Chọn chế độ nhận liên tục các byte
(Continuous reception)
130
Thông số 7:
USART_BRGH_HIGH: Chọn tốc độ baud cao (High baud
rate)
USART_BRGH_LOW: Chọn tốc độ baud thấp (Low baud
rate)
“spbrg”: dùng để đặt tốc độ baud, được tính như sau:
o Với chế độ cận đồng bộ, tốc độ baud cao (Asynchronous mode,
high speed):
Tốc độ baud=Fosc/ (16 * (spbrg+ 1))
o Với chế độ cận đồng bộ, tốc độ baud thấp (Asynchronous mode,
low speed):
Tốc độ baud=Fosc/ (64 * (spbrg+ 1))
o Với chế độ đồng bộ (Synchronous mode):
Tốc độ baud=Fosc/ (4 * (spbrg+ 1))
Chú thích : Sử dụng để đặt các thông số của USART.
Ví dụ:
OpenUSART( USART_TX_INT_OFF & //khong su dung ngat truyen
USART_RX_INT_OFF & //khong su dung ngat nhan
USART_ASYNCH_MODE & //che do can dong bo
USART_EIGHT_BIT & //truyen/nhan 8bit
USART_CONT_RX & //cho phep nhan lien tiep
USART_BRGH_HIGH, //toc do baud:
51 ); //8000000/(16*(51+1))=9615
• Hàm : CloseUSART
Chức năng : Đóng (cấm) USART
Nguyên mẫu : void CloseUSART( void );
Chú thích : Hàm được gọi khi không sử dụng USART
Ví dụ: CloseUSART();
• Hàm : WriteUSART
Chức năng : Ghi một byte vào bộ đệm truyền của USART
Nguyên mẫu : void WriteUSART( char data);
Chú thích : Hàm được sử dụng để truyền đi một byte
Ví dụ: WriteUSART( 0x41); //truyền ký tự A
• Hàm : ReadUSART
Chức năng : Nhận một byte từ bộ đệm nhận của USART
Nguyên mẫu : char ReadUSART( void );
Chú thích : Hàm được sử dụng để nhận một byte
Ví dụ: char x;
131
x= ReadUSART();
• Hàm : putsUSART
Chức năng : Nhận một byte từ bộ đệm nhận của USART
Nguyên mẫu : char ReadUSART( void );
Chú thích : Hàm được sử dụng để nhận một byte
Ví dụ: char x;
x= ReadUSART();
5. LẬP TRÌNH SỬ DỤNG USART
Ví dụ 1: Cho mạch điện như hình 2.16. Viết chương trình cấu hình cho cổng nối
tiếp với tốc độ baud 9600, 8 bit dữ liệu. Liên tục truyền lên máy tính chuỗi ký tự
“ABC”.
Hình 10.7. Sơ đồ mạch điện giao tiếp vi điều khiển-máy tính
Gợi ý thực hiện:
Bước 1: Viết chương trình trên vi điều khiển.
Khai báo thư viện cổng nối tiếp usart.h
Sử dụng hàm OpenUSART() để khởi tạo cho cổng nối tiếp, tốc độ truyền
nhận 9600, 8 bit dữ liệu, không sử dụng ngắt.
Sử dụng hàm WriteUSART() để truyền 1 byte ra cổng nối tiếp. Đổi các ký
tự muốn hiển thị ra mã ASCII để truyền lên máy tính.
Sử dụng hàm BusyUSART() để kiểm tra cờ bận (hàm BusyUSART() trả
về 1 tương ứng cổng nối tiếp đang bận và ngược lại).
132
Dưới đây là chương trình tham khảo:
#include
#include
#include
#include
#pragma config OSC = HS
#pragma config MCLRE = ON
#pragma config WDT = OFF
void main()
{
TRISC=0X80; // dat chan RC7/RX chieu vao
//Thiet lam cac thong so cho USART
OpenUSART( USART_TX_INT_OFF & //khong su dung ngat truyen
USART_RX_INT_OFF & //khong su dung ngat nhan
USART_ASYNCH_MODE & //che do can dong bo
USART_EIGHT_BIT & //truyen/nhan 8bit
USART_CONT_RX & //cho phep nhan lien tiep
USART_BRGH_HIGH, //toc do baud:
51 ); //8000000/(16*(51+1))=9615
PIR1bits.TXIF=1; //dat co de truyen byte dau tien
while(1)
{
while (BusyUSART());
WriteUSART(0x41);
while (BusyUSART());
WriteUSART(0x42);
while (BusyUSART());
WriteUSART(0x43);
}
}
Bước 2:
Kết nối USART với cổng Com (hoặc cổng com ảo) của máy tính
Mở Hyper Teminal và thiết lập các thông số của của cổng Com giống như
đã thiết lập với USART.
Ví dụ 2: Viết chương trình cấu hình USART với tốc độ 9600, 8 bit dữ liệu. Truyền
lên máy tính và hiển thị chuỗi ký tự sau trên Hyper Terminal:
“DU AN DAO TAO JICA”
“VI DIEU KHIEN PIC”
Gợi ý thực hiện:
133
Các bước thực hiện như ví dụ 1.
Một số lưu ý:
Sử dụng hàm sprintf() để đổi các ký tự muốn hiển thị thành mã ascii.
Sử dụng hàm truyền chuỗi ký tự putsUSART() để truyền các ký tự trong
mảng qua USART.
Dưới đây là một số điểm trong chương trình:
#include
void main()
{
char M[100];
while(1)
{
sprintf(&M[0], " DU AN DAO TAO JICA \n");
putsUSART(&M[0]);
WriteUSART(0x0d); //ve dau dong
sprintf(&M[0], " VI DIEU KHIEN PIC \n");
putsUSART(&M[0]);
WriteUSART(0x0d);
}
}
Ví dụ 3: Sử dụng phần mềm mô phỏng Proteus vẽ mạch điện như hình 8.8. Viết
chương trình điều khiển theo yêu cầu:
(1) Liên tục đọc trạng thái của PS, nếu nhấn, gửi ký tự “0”, nếu nhả gửi ký tự “1”
qua USART.
(2) Sử dụng ngắt USART để nhận các ký tự “0” hoặc “1”. Nếu nhận được “1”,
điều khiển LED D1 sáng; Nếu nhận được “0”, điều khiển LED D1 tắt.
(3) Sử dụng các bit trong các thanh ghi liên quan để thiết lập các thông số cho
USART.
Gợi ý thực hiện:
Vẽ mạch mô phỏng, sử dụng công cụ “VIRTUAL TERMINAL” để quan
sát các ký tự được truyền/nhận qua USART.
Thiết lập các thông số cho USART theo trình tự sau:
(1) Ghi giá trị n vào thanh cặp thanh ghi SPBRGH: SPBRG để có được tốc độ
baud cần đặt. n= ((FOSC / Tốc độ baud cần đặt) / 64) – 1 nếu
BRGH(TXSTA) = 0; n = ((FOSC/Tốc độ baud cần đặt)/16) – 1 nếu
BRGH(TXSTA) = 1.
134
Thiết lập/xóa các bit BRGH (TXSTA) và BRG16 (BAUDCON) để có
được tốc độ baud theo yêu cầu.
(2) Chọn chế độ đồng bộ/dị bộ bằng cách thiết lập/xóa bit SYNC; Cho phép
USART bằng cách thiết lập bit SPEN.
(3) Thiết lập bit RCIE nếu cho phép ngắt nhận, bit TXIE nếu cho phép ngắt truyền
(4) Chọn chế độ truyền nhận 8 bit bằng cách xóa bit TX9.
(5) Cho phép truyền/nhận bằng cách thiết lập bit TXEN; Cho phép nhận liên tiếp
các ký tự bằng cách thiết lập bit CREN.
(6) Thiết lập các bit IPEN, GIEH, RCIP để đặt ngắt nhận USART ở vector cao.
Hình 10.8. Mạch điện mô phỏng ví dụ 3
Dưới đây là chương trình tham khảo:
#include
#include
#include
#include
#pragma config OSC = HS
#pragma config MCLRE = ON
#pragma config WDT = OFF
void high_isr();
void putchar(char x);
void interrupt_at_high_vector();
#pragma code high_vector = 0x08
void interrupt_at_high_vector()
{
if(PIR1bits.RCIF) high_isr();
135
}
#pragma code
#pragma interrupt high_isr
void high_isr()
{
if (RCREG==0x30) PORTBbits.RB7=0;
else PORTBbits.RB7=1;
PIR1bits.RCIF=0;
}
void putchar(char x)
{
while (!PIR1bits.TXIF);
PIR1bits.TXIF=0;
TXREG=x;
}
void main()
{
TRISC=0b10000000; // dat chan RC7 chieu vao
TRISB=0x04;
PORTB&=0x00;
PORTC&=0x00;
ADCON1=0x0F;
//1
SPBRG=51; // toc do baud: 9615
SPBRGH=0;
TXSTAbits.BRGH=1; //USART toc do cao
BAUDCONbits.BRG16=0; //Thanh ghi toc do baud: 8bit
TXSTAbits.SYNC=0; //Asynchronous mode
RCSTAbits.SPEN=1; //Serial port enabled
PIE1bits.RCIE=1; // ngat nhan
TXSTAbits.TX9=0; //truyen nhan 8bit
RCSTAbits.CREN=1; //Nhan lien tiep
TXSTAbits.TXEN=1; //Cho phep truyen/nhan
RCONbits.IPEN=1;
INTCONbits.GIE_GIEH=1;
IPR1bits.RCIP=1;
while(1)
{
if(PORTBbits.RB2) putchar(0x31);
if(!PORTBbits.RB2) putchar(0x30);
}
}
136
TÀI LIỆU THAM KHẢO
1. Cape Wiki, Tutorial – PIC Programming Basic,Microchip, 2002
2. Darrel Johansen, MPLAB SIM, Microchip Technology, 2006
3. Darrel Johansen, MPLAB C18, Microchip Technology Inc, 2006
Các file đính kèm theo tài liệu này:
- de_cuong_bai_giang_modul_dieu_khien_he_thong_cdtsdvdk.pdf