1. KHẢO SÁT TIMER TIMER0 CỦA PIC 16F887
Bộ timer0/counter0 có những đặc điểm sau: Là timer/counter 8 bit.
Để sử dụng timer0 thì phải khảo sát chức năng của thanh ghi điều khiển timer là OPTION_REG.
Cấu hình thanh ghi và chức năng các bit như sau:
Bit 7 RBPU : bit điều khiển điện trở treo của portb.
Bit 6 INTEDG
Bit 5 T0CS: bit lựa chọn nguồn xung cho TMR0 - TMR0 Clock Source Select bit.
- Đây là code chương trình.
Bộ timer0/counter0 có những đặc điểm sau: Là timer/counter 8 bit.
- Có thể đọc và ghi giá trị đếm của timer/counter.
- Có bộ chia trước 8 bit cho phép lập trình lựa chọn hệ số chia bằng phần mềm.
- Cho phép lựa chọn nguồn xung clock bên trong hoặc bên ngoài.
- Phát sinh ngắt khi bị tràn từ FFH về 00H.
- Cho phép lựa chọn tác động xung CK cạnh lên hoặc cạnh xuống.
Để sử dụng timer0 thì phải khảo sát chức năng của thanh ghi điều khiển timer là OPTION_REG.
Cấu hình thanh ghi và chức năng các bit như sau:
Bit 7 RBPU : bit điều khiển điện trở treo của portb.
Bit 6 INTEDG
Bit 5 T0CS: bit lựa chọn nguồn xung cho TMR0 - TMR0 Clock Source Select bit.
- 1= sẽ đếm xung ngoại đưa đến chân T0CKI.
- 0= sẽ đếm xung clock nội bên trong.
- 0= tích cực cạnh lên ở chân T0CKI.
- 1= tích cực cạnh xuống ở chân T0CKI.
- 1= gán bộ chia cho WDT.
- 0= gán bộ chia Timer0.
Nếu bit T0CS bằng 1 thì chọn chế độ đếm xung ngoài Counter. Trong chế độ đếm xung ngoài thì xung đếm đưa đến chân RA4/T0CKI. Bit T0SE = 0 thì chọn cạnh lên, ngược lại thì chọn cạnh xuống.
Bộ chia trước không thể đọc/ghi có mối quan hệ với Timer0 và Watchdog Timer.
a. Ngắt của Timer0
Khi giá trị đếm trong thanh ghi TMR0 tràn từ FFh về 00h thì phát sinh ngắt, cờ báo ngắt
TMR0IF lên 1. Ngắt có thể ngăn bằng bit cho phép ngắt TMR0IE.
Trong chương trình con phục vụ ngắt Timer0 phải xóa cờ báo ngắt TMR0IF. Ngắt của TMR0
không thể kích CPU thoát khỏi chế độ ngủ vì bộ định thời sẽ ngừng khi CPU ở chế độ ngủ.
b. Timer0 đếm xung ngoại
Muốn đếm xung ngoại thì xung được đưa đến ngõ vào T0CKI, việc đồng bộ tín hiệu xung ngõ vào T0CKI với xung clock bên trong được thực hiện bằng cách lấy mẫu ngõ ra bộ chia ở những chu kì Q2 và Q4 của xung clock bên trong. Điều này rất cần thiết cho T0CKI ở trạng thái mức cao ít nhất 2 TOSC và ở trạng thái mức thấp ít nhất 2 TOSC
c. Bộ chia trước
Bộ chia trước có thể gán cho Timer0 hoặc gán cho Watchdog Timer. Các bit PSA và PS2:PS0 chọn đối tượng gán và tỉ lệ chia.
Khi được gán cho Timer0 thì tất cả các lệnh ghi cho thanh ghi TMR0 (ví dụ CLRF 1, MOVWF 1, BSF 1, …) sẽ xoá bộ chia trước.
Khi được gán cho WDT thì lệnh CLRWDT sẽ xoá bộ chia trước cùng với Watchdog Timer.
- Đây là ảnh mô phỏng protues.- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 8000000
#include <xc.h>
// CONFIG1
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
unsigned int Count = 0;
unsigned int dem = 0,nghin,tram,chuc,donvi;
const unsigned char maled[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
void display(void);
void main(void)
{
TMR0 = 55;
OPTION_REGbits.PSA = 0;
OPTION_REGbits.PS2 = 0;
OPTION_REGbits.PS1 = 1;
OPTION_REGbits.PS0 = 0;
OPTION_REGbits.T0CS = 0;
TRISC = 0;
PORTC = 0;
TRISDbits.TRISD0 = 0;
TRISDbits.TRISD1 = 0;
TRISDbits.TRISD2 = 0;
TRISDbits.TRISD3 = 0;
PORTD = 0;
while (1)
{
display();
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
TMR0 = 55;
Count++;
if(Count == 15)
{
Count = 0;
dem++;
if(dem==1000)
{
dem=0;
}
}
}
}
}
void display (void)
{
nghin = dem/1000;
tram = (dem - nghin*1000)/100;
chuc = (dem - nghin*1000 - tram*100)/10;
donvi = dem - nghin*1000 - tram*100 - chuc*10;
PORTC = maled[nghin];
RD0=0;
__delay_ms(5);
RD0=1;
PORTC = maled[tram];
RD1=0;
__delay_ms(5);
RD1=1;
PORTC = maled[chuc];
RD2=0;
__delay_ms(5);
RD2=1;
PORTC = maled[donvi];
RD3=0;
__delay_ms(5);
RD3=1;
}
#include <stdlib.h>
#define _XTAL_FREQ 8000000
#include <xc.h>
// CONFIG1
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
unsigned int Count = 0;
unsigned int dem = 0,nghin,tram,chuc,donvi;
const unsigned char maled[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
void display(void);
void main(void)
{
TMR0 = 55;
OPTION_REGbits.PSA = 0;
OPTION_REGbits.PS2 = 0;
OPTION_REGbits.PS1 = 1;
OPTION_REGbits.PS0 = 0;
OPTION_REGbits.T0CS = 0;
TRISC = 0;
PORTC = 0;
TRISDbits.TRISD0 = 0;
TRISDbits.TRISD1 = 0;
TRISDbits.TRISD2 = 0;
TRISDbits.TRISD3 = 0;
PORTD = 0;
while (1)
{
display();
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
TMR0 = 55;
Count++;
if(Count == 15)
{
Count = 0;
dem++;
if(dem==1000)
{
dem=0;
}
}
}
}
}
void display (void)
{
nghin = dem/1000;
tram = (dem - nghin*1000)/100;
chuc = (dem - nghin*1000 - tram*100)/10;
donvi = dem - nghin*1000 - tram*100 - chuc*10;
PORTC = maled[nghin];
RD0=0;
__delay_ms(5);
RD0=1;
PORTC = maled[tram];
RD1=0;
__delay_ms(5);
RD1=1;
PORTC = maled[chuc];
RD2=0;
__delay_ms(5);
RD2=1;
PORTC = maled[donvi];
RD3=0;
__delay_ms(5);
RD3=1;
}
EmoticonEmoticon