PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 02-07-2007, 11:41 PM   #1
dvnccbmacbt
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 65
:
Cool Hỏi về timer0,1,2 của pic16f877A?

Em chưa hiểu về cơ chế hoạt động của timer2 trong con pic16f877A.
Có bác nào giải thích giúp em với. Em dùng CCS C. Cụ thể như thế này. Nạp một giá trị ban đầu ( period ) cho nó và giá trị ( postscale ). Qua trình làm việc nó xử lý với 2 giá trị này này như thế nào? Có phải nó cũng bắt đầu đếm từ period đến 255, tràn và tiếp tục đếm từ period đến 255 và tràn cho đến khi nào số lần tràn bằng số postscale thì ngắt. Khi ngắt thì ta cũng thiết lập lại giá trị timer2 trong hàm ngắt.? Em hiểu như vậy có đúng không, các bác chỉ bảo cho?

Cho em hỏi thêm : Chế độ đếm đồng bộ và không đồng bộ ở timer1 là như thế nào? Em không hiểu gì cả? Chế độ đếm của timer0 là đồng bộ hay không đồng bộ? Các bác giúp em với. Cảm ơn các bác nhiều!
dvnccbmacbt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-07-2007, 05:25 AM   #2
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Bạn xem chương trình đây thì rõ, lâu quá rồi, ko tìm thấy link cũ.
File Kèm Theo
File Type: rar PIC Timer Calculator.rar (445.8 KB, 2752 lần tải)
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-07-2007, 04:35 PM   #3
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Timer 2 có 2 thanh ghi là PR2 và TMR2.
Khi chức năng timer của Timer2 được kích hoạt thì thanh ghi TMR2 sẽ đếm từ 0 cho đến khi "khớp" với giá trị đặt trước trong thanh ghi PR2 thì tràn. Lúc này nếu cho phép ngắt timer2 thì sẽ xảy ra 1 ngắt.

Hoạt động của timer2 còn liên quan đến prescaler và postscaler. Để cho bạn hiểu 1 cách đơn giản nhất thì có thể nói prescaler và postscaler là 1 hệ số nhân. timer 2 sẽ ngắt sau 1 khoảng thời gian = PR2*prescaler*postscaler. Ví dụ: PR2 = 124 (dec); prescaler = 10 (dec); postscaler = 16 (dec) thì timer2 sẽ tràn sau 1 khoảng thời gian là 124*10*16 = 19840 us (micro second)
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-07-2007, 11:10 AM   #4
dvnccbmacbt
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 65
:
to Jerry: Cảm ơn bạn nhiều. cho mình hỏi thêm. Mình dùng CCS C. Câu lệnh set_timer2(value); có ý nghĩa gì? Giá trị value này được đưa và thanh ghi PR2 phải không?
Code:
 3.Timer2

Thanh ghi tác động:

Các lệnh:
Code:
setup_TIMER_2(mode, period, postscale);
set_TIMER2(value);        	// xác định giá trị ban đầu (8bit) cho Timer2
get_TIMER2();              	// trả về số nguyên  8bit
Với mode gồm (co the ket hop bang dau "|"): T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 period là số nguyên từ 0-255, xác định giá trị xung reset postscale là số nguyên 1-16, xác định reset bao nhiêu lần trước khi ngắt.
dvnccbmacbt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-07-2007, 04:50 PM   #5
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Lệnh set_TIMER2(value) chính là lệnh đặt giá trị cho PR2. Mình ít viết chương trình bằng C lắm. ASM thì mình thạo hơn. Cũng nhờ ASM nên mình hiểu khá kỹ về cấu trúc phần cứng của vi điều khiển PIC. Viết bằng C thì không hiểu nhiều về phần cứng đâu, tuy nhiên C có lợi thế khi xây dựng những project lớn
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-12-2008, 07:14 PM   #6
KHACTHO
Nhập môn đệ tử
 
Tham gia ngày: Nov 2008
Bài gửi: 5
:
cho em hoi ve cái set_timer0(6)có ý nghĩa như thê nao mong cac bac giúp đơ.em cam on nhieu nha
KHACTHO vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-12-2008, 02:18 PM   #7
tungtot_vl
Đệ tử 6 túi
 
tungtot_vl's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 154
:
pic

Trích:
Nguyên văn bởi KHACTHO View Post
cho em hoi ve cái set_timer0(6)có ý nghĩa như thê nao mong cac bac giúp đơ.em cam on nhieu nha
set_timer0(6) là thiết lập giá trị đếm ban đầu của timer. khi đó biến đếm bắt đầu đếm từ 6 cho đến 255 thì tràn và nhảy vào ngắt, sau khi ngắt xong lại quay về giá trị đếm ban đầu là 6 để đếm tiếp
tungtot_vl vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-12-2008, 11:35 AM   #8
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
Vậy là muốn sử dụng timer0 thì mình chỉ cần:
setup_TIMER_2(mode, period, postscale);
khi gặp câu lệnh:
set_TIMER2(value);
là timer 0 sẽ bắt đầu đếm phải không bạn?

Cho mình hỏi luôn là mình sử dụng thạch anh 4Mhz mà muốn tính số lần ngắt trên 1s thì mình phải tính như thế nào?(mục đích là mình muốn khi kích hoạt timer0 sau 1s thì mình sẽ làm việc khác đó mà!)
Mình có tham khảo trong mục help(mình sử dụng ccs c) thì với thạch anh 20Mhz thì số lần ngắt trên 1s là 76 nhưng mình không hiểu lắm về cách tính ra con số 76.Đại khái là:
20000000/(4*256*256) =76
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-12-2008, 12:31 PM   #9
thanhviet
Nhập môn đệ tử
 
Tham gia ngày: Dec 2008
Bài gửi: 1
:
cac bac nao giai thich dum cach chon TMOD trong 8051 dc ko , minh ko hieu o cho 20,02 ,10,01 ,13...vd:
MOV TMOD,#02( minh hieu la timer0 ,che do 2 roi) ,nhung con cai nay thi sao
MOV TMOD,#20(Cac so khac nh:10,01,13,
thanhviet vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-12-2008, 04:35 PM   #10
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
Hỏi ở đây thì hơi bị lộn tiệm rồi đó nha!
Nhưng đang rãnh nên khuyến mãi luôn.
vd:
20 có nghĩa là 00100000 binary đó bạn.
thì tương ứng thanh ghi Tmod sẽ có 8bit : 4 bit cao dành cho timer0 và 4 bit thấp dành cho timer1(có thể ngược lại ,mình không nhớ chính xác)
4 bit đó là:CT\ , GATE,M0,M1.
CT\:hình như là chọn chức năng timer hay là counter gì đó.
GATE:quên chức năng của bit này rồi(pác nào nhớ nhắc hộ)
M0,M1:chọn chế độ cho timer.(có 4 chế độ)

Tóm lại là từng bit 1 có chức năng cụ thể.Nếu bạn muốn hiểu rõ thêm thì hôm sau mình tìm được tài liệu sẽ trả lời đầy đủ hơn.
Tại tài liệu để đâu không nhớ tìm chưa ra nên có cái nhớ cái không. bạn thông cảm hì hì...
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-12-2008, 10:41 AM   #11
trungduc
Đệ tử 2 túi
 
Tham gia ngày: Oct 2008
Bài gửi: 44
:
Dùng timer0 làm counter ?

Xin chào mọi người !
Tôi đang tìm hiểu về timer, cụ thể là dùng timer0 làm counter ( bsf option_reg,t0cs ) thế nhưng quan sát LED thì nó cứ đếm từ 0 -> 255 mà chẳng quan tâm gì đến nút nhấn ở chân RA4 (16f877a). Anh em nào có đoạn code kiểu này cho mình tham khảo với. Mình chỉ biết ASM thôi.
Xin cảm ơn!
trungduc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-12-2008, 05:33 PM   #12
tungtot_vl
Đệ tử 6 túi
 
tungtot_vl's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 154
:
pic

Trích:
Nguyên văn bởi lequocbao View Post
Vậy là muốn sử dụng timer0 thì mình chỉ cần:
setup_TIMER_2(mode, period, postscale);
khi gặp câu lệnh:
set_TIMER2(value);
là timer 0 sẽ bắt đầu đếm phải không bạn?

Cho mình hỏi luôn là mình sử dụng thạch anh 4Mhz mà muốn tính số lần ngắt trên 1s thì mình phải tính như thế nào?(mục đích là mình muốn khi kích hoạt timer0 sau 1s thì mình sẽ làm việc khác đó mà!)
Mình có tham khảo trong mục help(mình sử dụng ccs c) thì với thạch anh 20Mhz thì số lần ngắt trên 1s là 76 nhưng mình không hiểu lắm về cách tính ra con số 76.Đại khái là:
20000000/(4*256*256) =76
ngắt 1s
#include <16F877A.h>
#device 18F4680*=16 ADC=10
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(c)
#byte portc=0x07
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void timer0()
{
set_timer0(56); // T = 2*(256 - 56)*1us = 400us (nếu dùng thạch anh 20M thi thay 1us thành 0,2us)
++count;
if(count == 2500) // 2500*400us = 1000000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh dich led
void main()
{ set_tris_c(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);

a = 0x01;
while(true)
{
portc = a;
}
}
tungtot_vl vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-12-2008, 05:33 PM   #13
tungtot_vl
Đệ tử 6 túi
 
tungtot_vl's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 154
:
pic

tự tìm hiểu nhé

thay đổi nội dung bởi: tungtot_vl, 07-12-2008 lúc 05:36 PM. Lý do: sai
tungtot_vl vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-12-2008, 11:24 AM   #14
KHACTHO
Nhập môn đệ tử
 
Tham gia ngày: Nov 2008
Bài gửi: 5
:
Trích:
Nguyên văn bởi lequocbao View Post
Vậy là muốn sử dụng timer0 thì mình chỉ cần:
setup_TIMER_2(mode, period, postscale);
khi gặp câu lệnh:
set_TIMER2(value);
là timer 0 sẽ bắt đầu đếm phải không bạn?

Cho mình hỏi luôn là mình sử dụng thạch anh 4Mhz mà muốn tính số lần ngắt trên 1s thì mình phải tính như thế nào?(mục đích là mình muốn khi kích hoạt timer0 sau 1s thì mình sẽ làm việc khác đó mà!)
Mình có tham khảo trong mục help(mình sử dụng ccs c) thì với thạch anh 20Mhz thì số lần ngắt trên 1s là 76 nhưng mình không hiểu lắm về cách tính ra con số 76.Đại khái là:
20000000/(4*256*256) =76
ngắt 1s
#include <16F877A.h>
#device 18F4680*=16 ADC=10
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(c)
#byte portc=0x07
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void timer0()
{
set_timer0(56); // T = 2*(256 - 56)*1us = 400us (nếu dùng thạch anh 20M thi thay 1us thành 0,2us)
++count;
if(count == 2500) // 2500*400us = 1000000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh dich led
void main()
{ set_tris_c(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);

a = 0x01;
while(true)
{
portc = a;
}
}
tungtot_vl vẫn chưa có mặt trong diễn đàn
NHƯ VẬY CON SỐ 2 Ở (T=2*(256-56)*1US)Ơ ĐÂU RA VẬY
KHACTHO vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-12-2008, 07:04 PM   #15
gghh
Nhập môn đệ tử
 
Tham gia ngày: Jan 2008
Bài gửi: 4
:
Thumbs up hi

delay 1s dùng thạch anh 4Mhz
Code:
#INCLUDE<16F877A.H>
#INCLUDE<DEF_16F877A.H>
#USE DELAY(CLOCK=4000000)
#INT8  H;
#INT_TIMER1
VOID NGAT_TIMER1()
{
   SET_TIMER1(15536);
   H++;
   IF(H==20)  //20*50000us = 1000000us = 1s
   {
      lệnh;
      H=0;
   }
}
void main()
{
   SETUP_TIMER_1(T1_INTERNAL);
   ENABLE_INTERRUPTS(GLOBAL);
   ENABLE_INTERRUPTS(INT_TIMER1);
   SET_TIMER1(15536);       //T_dinhthoi = (65536-15536)*1us = 50000us
   while(1)
   {
    lệnh;
    }
}

thay đổi nội dung bởi: namqn, 09-12-2008 lúc 08:03 PM.
gghh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 11:23 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam