Đề cương bài giảng modul: Điều khiển hệ thống CĐTSDVĐK

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

pdf136 trang | Chia sẻ: huong20 | Ngày: 18/01/2022 | Lượt xem: 385 | Lượt tải: 0download
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:

  • pdfde_cuong_bai_giang_modul_dieu_khien_he_thong_cdtsdvdk.pdf