tài liệu đầy đủ và có bài tập mô tả lập trình trên nền MPLAP, liên kết hitech c, c++, ccs,... mô phỏng trên proteus,. có mạch mô phỏng. gồm 5 chương hỗ trợ viết chương trình đơn giản, kèm file rack bên dưới
6/22/2018 CHƯƠNG MODUL ðỊNH THỜI (TIMER) GV: Vũ Thị Hồng Nga Khoa Công Nghệ Điện Tử TỔNG QUAN BỘ ĐỊNH THỜI - Bộ định thời dùng để định thời gian để kích hoạt kiện, Đếm số lượng kiện, tạo xung - PIC16F887 có định thời: Timer : định bit Timer : định 16 bit Timer : định bit 6/22/2018 TỔNG QUAN BỘ ĐỊNH THỜI TIMER TIMER TIMER Kích thước ghi bit (TMR0) 16 bit (TMR1H:TMR1L) 8-bit (TMR2) Nguồn xung (Bên trong) FOSC/4 FOSC/4 FOSC/4 Nguồn xung (Bên ngoài) Chân T0CKI Chân T1CKI dao động Timer (T1OSC) Khơng có Tỉ lệ xung clock khả dụng (ðộ phân giải) Prescaler bit (1:2 → 1:256) Prescaler bit (1:1, 1:2, 1:4, 1:8) Prescaler (1:1, 1:4, 1:8) Postscaler (1:1 → 1:16) Sự kiện ngắt vị trí cờ ngắt Có thể “đánh thức" PIC từ chế ñộ “ngủ” Khi bị tràn Khi bị tràn TMR2 với PR2 FFh → 00h FFFFh → 0000h (TMR2IF PIR2) (TMR0IF INTCON) (TMR1IF PIR1) Khơng Có Không Module Timer Là Timer/Counter bit Có thể đọc ghi Có chia trước bit lập trình phần mềm Có thể lựa chọn nguồn xung clock bên bên Cho phép lựa chọn tác động cạnh cho xung clock bên Xảy tượng ngắt tràn từ FFh 00h 6/22/2018 SƠ ĐỒ KHỐI TIMER DATA BUS Fosc/4 Clock ðồng T0CKI pin TMR0 Prescaler Watchdog Timer WDT out OPTION register RBPU INTEDG T0CS PSA T0SE PS2 PS1 PS0 Chọn nguồn xung clock cho Timer = T0CK1 (Bên ngoài) → Chế ñộ ðẾM XUNG = Fosc/4 (Bên trong) → Chế ñộ ðỊNH THỜI SƠ ĐỒ KHỐI TIMER DATA BUS Clock Fosc/4 ðồng T0CKI pin TMR0 Prescaler Watchdog Timer WDT out OPTION register RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 Chọn cạnh kích nguồn xung = Tăng TMR0 cạnh lên (L →H) = Tăng TMR0 cạnh xuống (H →L) 6/22/2018 SƠ ĐỒ KHỐI TIMER DATA BUS Clock Fosc/4 ðồng T0CKI pin TMR0 Prescaler Watchdog Timer WDT out OPTION register RBPU INTEDG T0CS PSA T0SE PS2 PS1 PS0 Chỉ ñịnh Prescaler = Prescaler dùng cho WDT = Prescaler dùng cho Timer SƠ ĐỒ KHỐI TIMER DATA BUS Clock Fosc/4 ðồng T0CKI pin Scaled clock TMR0 Prescaler Watchdog Timer PS2 PS1 PS0 WDT out OPTION register RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 Các bit chọn tỉ lệ cho Prescaler Tỉ lệ chia 0 1:2 0 1:4 1:8 1 1:16 0 1:32 1 1:64 1 1:128 1 1:256 6/22/2018 SƠ ĐỒ KHỐI TIMER DATA BUS Fosc/4 ðồng T0CKI pin Watchdog Timer TMR0 Prescaler WDT out Nếu nguồn xung clock cấp cho Timer lấy từ chân T0CKI đồng hóa với nguồn xung clock bên SƠ ĐỒ KHỐI TIMER DATA BUS Fosc/4 ðồng T0CKI pin Watchdog Timer TMR0 INTCON register Prescaler T0IF WDT out TMR0 đọc ghi T0IF INTCON đặt (T0IF = 1) Timer bị tràn (TMR0 = FFh → 00h) 10 6/22/2018 SƠ ĐỒ KHỐI TIMER 11 2.1 Dùng timer0 để định thời B1: Tính tốn giá trị cần đưa vào code: t delay = (256 − [TMR 0])x4x f OSC x Pr e tdelay: thời gian cần định thời (us) fOSC: tần số dao động thạch anh Pre:hệ số chia tần trước prescaler(Pre=1,2,4 ,256 [TMR0]: giá trị cần ghi vào ghi TMR0 ≤ [TMR0] ≤ 255 B2: Ghi vào ghi TMR0 giá trị tính tốn B3: Xóa cờ báo tràn( cờ ngắt) TMR0IF B4: Chọn chế độ hoạt động Timer (chọn chế độ Timer, gán prescaler ) B5: Xác định thời điểm Timer bị tràn cách: • Kiểm tra cờ TMR0IF( dùng thăm dò) • Xử lý ISR Timer (nếu dùng ngắt) 6/22/2018 2.2 Dùng timer để đếm kiện • BƯỚC 1: Xóa giá trị ghi TMR0 (hoặc đặt giá trị ban đầu đếm) • BƯỚC 2: Xóa cờ báo tràn (cờ ngắt) TMR0IF • BƯỚC 3: Chọn chế độ hoạt động Counter - Chế độ đếm kiện (Counter) - Kích hoạt vơ hiệu hóa ngắt (tùy chọn) - Gán Prescaler cho Timer chọn giá trị tỉ lệ Prescaler (tùy chọn) - Chọn loại cạnh kích nguồn xung đếm bên ngồi • BƯỚC 4: Đọc xử lý số xung đếm ghi TMR0 Dựa vào cờ báo tràn TMR0IF để xử lý trường hợp số xung đếm vượt 255 13 VÍ DỤ : Viết chương trình tạo trễ tdelay =100μs dùng Timer 0, fOSC = 4MHZ, chọn prescaler =2 Giải: Tính giá trị ghi ࢚ࡰࡱࡸࢅ = − ࢀࡹࡾ × × Ta có: tdelay = 100us, pre = 2, fosc = 4MHz × ࡼ࢘ࢋ ࢌࡻࡿ TMR0 = 206 14 6/22/2018 VÍ DỤ : Viết chương trình tạo trễ tdelay =100μs dùng Timer 0, fOSC = 4MHZ, chọn prescaler =2 Void DELAY100us(void) { TMR0 = 206; //Bước 1:giá trị cần ghi vào ghi TMR0 TMR0IF = 0; // Bước 2: Xóa cờ báo tràn T0CS = 0; // Chế độ định thời TMR0IE = 0;PEIE = 0;GIE = 0; //cấm ngắt PSA = 0; PS2 = 0; PS1 = 0; PS0 = 0; // chọn prescaler =2 While(TMR0IF==0); // Kiểm tra cờ TMR0IF } Ví dụ 2: lập trình led chớp tắt với f = 1Hz, dùng timer0 để tạo delay 6/22/2018 Ví dụ 2: lập trình led chớp tắt với f = 1Hz, dùng timer0 để tạo delay Giải: Led chớp tắt với f = 1Hz chọn Ton = Toff = 500ms = 500 000us - Tạo delay 100us (như VD1): Tính giá trị ghi ࢚ࡰࡱࡸࢅ = − ࢀࡹࡾ × × × ࡼ࢘ࢋ ࢌࡻࡿ Ta có: tdelay = 100us, pre = 2, fosc = 4MHz TMR0 = 206 - Cho lặp 5000 lần delay500ms = 100x5000 = 500 000us 17 #include #include CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON); #define _XTAL_FREQ 4000000 void delay100us(unsigned int n) { unsigned int i; for (i=1;i