You are on page 1of 3

#include <16F877A.

h>
#include <def_877a.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP,
NOCPD, NOWRT
#use delay(clock=20000000)
int8 i,j,x,a;

void taotre1s(x ) // -> cu phap co van --> sua lai la: void taotre1s(int8 x)
{
TMR0IF = 0; // tat co ngat cua timer0
for (i=0;i<x;i++)
{

set_timer0(8 );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
while (TMR0IF==0) // Kiem tra co ngat cua timer0, neu tran thi TMR0IF = 1
{
//TMR0IF=0; // Tinh toan:
} // thoi gian de tang i len 1: ti = (255-8+1)*4/20MHz * 256 = 12697.6 (us)
TMR0IF=0; // thoi gian sau x lan: 12697.6*x (us)
} // --> x = 79 -> t = 1003110.4 (us)

void main()
{
set_tris_d(0x00);
a=0;
while (1)
{
taotre1s(79);
output_high(PIN_D0);
taotre1s(79);
output_low(PIN_D0);
}
http://phamdungcnkt.fileave.com/TIMER.pdfhttp://phamdungcnkt.fileave.com/TIMER.p
df








TIMER0
Admin on Fri Jun 12, 2009 8:36 am

[size=12][size=18]Sao ko tải dc chương trinh của A. Tú thế. Mọi người ai bị ko?


Đọc cái của Đạt cá 1 số cái vẫn chưa hiểu như:
- int8 i,j,x,a; ( int này có phải là ngắt (interrupt) ko)
- Cách tính thời gian: Thoi gian de tang i len 1: ti = (255-8+1)
*4/20MHz * 256 = 12697.6 (us)
Mọi nhười có thể giai thích giúp minh ko
////////////////////////////////////////////////////////////////////////////
Anh kết hợp đọc tài liệu trong lần đầu tiên anh Tú gửi lên ấy.

- Thứ nhất phần int8 i,j,x,a; là phần khai báo biến trong ngôn ngữ lập trình C, đối với CCS thì
int8 tương đương với int, đây là kiểu biến 1 byte, nếu không dấu thì sẽ có giá trị từ 0 -> 255,
có dấu thì -128 -> 127. Còn 1 số kiểu biến nữa ví dụ float, int1, long .... anh xem trong lập
trình C cơ bản và lập trình CCS thì sẽ rõ cái này.

Thứ 2: anh kiếm trong 1 cuốn khoảng 150 trang mà anh Tú đã gửi lần trc nói về cấu tạo của
PIC16F877A đọc qua phần timer0.

Sơ lược là thế này, trong timer 0 chúng ta có thể chỉ định giá trị bắt đầu đếm của timer0 từ 1
giá trị bất kì đến 255, trong CCS thì làm cách đó bằng việc sử dụng câu lệnh set_timer0(x)
với x là giá trị bắt đầu đếm của timer0 ( ở đây x = 8 ) ta sẽ thấy số giá trị mà timer0 đếm
được là 255-8+1 nó giống như bài toán trồng cây vậy, tính số cây trồng được khi biết số
khoảng, hoặc tương tự như câu lệnh for(i = 0; i<8; i++) chú ý là i++ mới có 8 giá trị. Từ đó ta
biết được timer0 đã đếm được bao nhiêu giá trị từ giá trị cho trước đến lúc tràn. >>> xong
đoạn 255 - 8 +1.
Tiếp đó, thời gian để giá trị trong thanh ghi của timer0 tăng lên 1 được tính bằng cách
4*1/fosc, giá trị 4 có được là do khi tần số từ thạch anh vào bộ đếm của timer0 mặc định bị
chia 4 ( dễ thấy f = 1/T ). Trong bài toán này fosc là tần số thạch anh và bằng 20MHz. Giá trị
256 là do bộ chia tần prescaler, đây là bộ chia tần 8 bit ( ta có thể set được giá trị này tương
ứng là 1,2,4,8,.. 256 <=> 2^0, 2^1 ... 2^8 ) >>> thời gian để giá trị thanh ghi timer0 TMR0
tăng lên 1 đơn vị là [ 4/fosc * Prescaler ] >>> xong phần sau.

>>> kết luận có thể tính được thời gian sau 1 lần timer0 tràn như trên. Khi timer0 tràn sẽ bật
cờ ngắt TMR0IF, đầu tiên anh tú tắt cờ ngắt này bằng câu lệnh TMR0IF = 0, sau đó kiểm tra
xem timer0 tràn hay chưa, nếu nó tràn thì lại gán nó = 0. >>> đó là cách để tính thời gian sau
1 chu kì đếm của timer0. Phần còn lại chắc OK nhỉ ^^[/size][/size]
Admin
Admin

Tổng số bài gửi: 18


Join date: 11/06/2009

You might also like