Chào các bạn
trong bài đăng này mình sẽ hướng dẫn về timer của PIC16F877A. Các bạn chú ý đây
là 1 trong các modun của PIC16F877A và nó cũng rất quan trọng và được sử dụng rất
nhiều nên các bạn phải chú ý để nắm rõ về
nó.
1 Giới thiệu
về Timers
a. Timer được
sử dụng cho nhiều chức năng như :
- Định thì để tạo sự kiện
- Đếm sự kiện
-Tạo dạng
sóng….
b. PIC16F877A
có 3 Timers
- timer 0
- timer 1
- timer 2
c. So sánh
các timer
2. Đặc điểm
timer 0
3. Sơ đồ khối
timer 0
Các bạn tự lên mạng tìm cách tính thời gian để khởi tạo timer 0 nha ! Nếu không biết tính thì comment ở dưới mình chỉ cho !
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000
#include <xc.h>
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
unsigned int Count = 0;
void main(void) {
TRISCbits.TRISC0 = 0; //RC0 pin as output
//config timer0
TMR0 = 55;
OPTION_REGbits.PSA = 0;
OPTION_REGbits.PS2 = 0;
OPTION_REGbits.PS1 = 1;
OPTION_REGbits.PS0 = 0;
OPTION_REGbits.T0CS = 0;
while (1)
{
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
TMR0 = 55;
Count++;
if(Count == 125)
{
Count = 0;
PORTCbits.RC0 ^= 1; //toggle the LED
}
}
}
}
7 nhận xét
Write nhận xétChúng ta có công thức tính như sau : Tdelay = (256 - TMR0).Tclko.Kprescaler
ReplyTdelay là thời gian chúng ta cần delay ví dụ 200us, 256 là T0 có 8bit, Tclko là là nguồn clock tác động cái này xem datasheet thường thì nó = Fosc/4 Fosc là tần số thạch anh, Kprescaler xem ở hình trên như vậy sẽ tính ra được số cần cài cho TMR0 như vậy giờ có TMR0 rồi bạn tự suy ngược lại Tdelay. Còn Count = 125 là giống như 1 cái biến đếm thôi tại và TRM0 trên nhỏ nên thời gian delay nó nhanh nên ở đây mình dùng thêm biến đếm nữa !
cách tính thời gian để khởi tạo timer 0 như thế nào vậy anh
ReplyTdelay = (256 - TMR0).Tclko.Kprescaler
Replyvoid delay_ms(unsigned int t)
Reply{
while(t--)
{
TMR0=131;
INTCONbits.TMR0IF=0;
while(INTCONbits.TMR0IF==1);
}
};
Mình viết hàm delay này dùng timer 0, thạch anh 8 Mhz, chia tần 1: 16 sao chạy mô phỏng sai nhỉ
Thời gian chạy rất nhanh khi mình sử dụng delay_ms(1000);
Replymô phỏng của bạn chạy ko đúng, chạy delay 200us lặp 125 lần thì được khoảng 25ms thôi . sao chạy mô phỏng gì mà chậm thế
ReplyMình không nhớ là delay bao nhiêu MS nhưng bạn phải sữa lại thạch anh 4Mhz nha !
ReplyEmoticonEmoticon