|
Tài trợ cho PIC Vietnam |
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 |
|
Ðiều Chỉnh | Xếp Bài |
02-07-2007, 11:41 PM | #1 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 65
: |
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! |
03-07-2007, 05:25 AM | #2 |
Đệ tử 9 túi
|
Bạn xem chương trình đây thì rõ, lâu quá rồi, ko tìm thấy link cũ.
__________________
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 |
04-07-2007, 04:35 PM | #3 |
Đệ tử 5 túi
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) |
05-07-2007, 11:10 AM | #4 |
Đệ 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: |
07-07-2007, 04:50 PM | #5 |
Đệ tử 5 túi
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
|
04-12-2008, 07:14 PM | #6 |
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
|
05-12-2008, 02:18 PM | #7 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
pic
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
|
06-12-2008, 11:35 AM | #8 |
Đệ tử 6 túi
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 |
06-12-2008, 12:31 PM | #9 |
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, |
06-12-2008, 04:35 PM | #10 |
Đệ tử 6 túi
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ì... |
07-12-2008, 10:41 AM | #11 |
Đệ 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! |
07-12-2008, 05:33 PM | #12 | |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
pic
Trích:
#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; } } |
|
07-12-2008, 05:33 PM | #13 |
Đệ tử 6 túi
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 |
09-12-2008, 11:24 AM | #14 |
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 |
09-12-2008, 07:04 PM | #15 |
Nhập môn đệ tử
Tham gia ngày: Jan 2008
Bài gửi: 4
: |
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. |
|
|