PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT 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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 22-03-2010, 03:37 PM   #1
hunter800
Nhập môn đệ tử
 
Tham gia ngày: Mar 2010
Bài gửi: 10
:
ngắt timer CCS

hix ai giải thích dùm mình chương trình ngắt này với!Mình thực sự rất cố gắng đọc nhưng chuă hiểu lắm!thanks

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;

while(true)
{
PORTB = a;
}
}
hunter800 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-03-2010, 06:00 PM   #2
trai_xq
Đệ tử 1 túi
 
Tham gia ngày: Feb 2010
Bài gửi: 15
:
Trích:
Nguyên văn bởi hunter800 View Post
hix ai giải thích dùm mình chương trình ngắt này với!Mình thực sự rất cố gắng đọc nhưng chuă hiểu lắm!thanks

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;

while(true)
{
PORTB = a;
}
}
+set_tris_b(0);//định nghĩa portb là đầu ra số(nêu như ở vòng lặp while bạn khai báo
output_b(a); thì câu lệnh set_tris_b(0); là không cần thiết.
+enable_interrupts(int_timer0);//mới bắt đầu chương trình, bạn cho timer0 làm việc(bắt đầu tính
+setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //chỉ lệ chia tần số
timer0 8bit, đêm từ 0-->255, và sau đó tràng đếm lại từ 0. Mỗi lần tràn như vậy là được bạn tính thời gian như sau:
-bạn dùng thạch anh 4M=4000000hz. như vậy mỗi lần tràn thì được thời gian là Ttimer0=255*4/(4.000.000) (s)=255micro s. Nhân 4 bởi vì một chu kì lệnh của VDk=4 chu kì xung của thạch anh. Mục đích của chúng ta là để tạo ra một giây, như thế thì phải làm sao?
+setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //lệnh này sẻ nâng giải tần của timer0 lên 2 lần nữa. nghĩa là khi có lện này ttimer0 sẻ được tính lại sau mổi lần tràn như sau:
Ttimer0=( 255*4/(4.000.000) )* 2(s) = 510micro s
+enable_interrupts(global);//cho ngắt toàn bộ(lệnh này không cần nếu như bạn chỉ có ngắt timer0)
+set_timer0(6);//đắt giá trị đầu cho timer0 là 6, nghĩa là timer bây giờ tăng từ 6 chư không phải là 0 nữa. Chổ này thôi tôi nghĩ có sự nhầm lẫn là set_timer0(5); là đùng hơn, vì sao phải làm vậy bạn biết không? tất ca cũng chỉ vì cho dễ tính và chẵn số thôi. Nếu đặt như vậy thì thời gian timer0 sẻ được tính lại như sau:
Ttimer0=( (255-5)*4/(4.000.000) )* 2(s) = 500micro s
+như vậy bạn phải cần mấy lần tràn mới được 1s? có phải là 2000 lần không
vì 2000*500=1000000micro s=1s ok!
+Đoạn chương trình này sẽ thể vấn đề đó:
#int_timer0
void interrupt_timer0()
{
set_timer0(5);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;//nếu đã được 2000 nghìn lần tràn(đã được 1s) thì cho tràn lại từ đầu
rotate_left(&a,1);//tương ưng với lệnh a=a<<1; nghĩ là dịc trái một bit, sau 1s
//bởi vì bạn đã cho a=0x01<=> a=0b00000001; trong chương trình main
}
}
//------------------
Sở dĩ tôi giúp bạn vì ngày xưa tôi cũng có gặp khó khăn này rồi.
trai_xq vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-02-2011, 09:18 PM   #3
v1t2m3
Nhập môn đệ tử
 
Tham gia ngày: Mar 2010
Bài gửi: 3
:
Thumbs up Thank!!!

Cảm ơn bác trai_xp, bác viết quá cặn kẽ, không thể nào không hiểu trừ phi không muốn hiểu.
v1t2m3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-11-2011, 08:20 AM   #4
nguyenminh545
Nhập môn đệ tử
 
Tham gia ngày: Oct 2010
Bài gửi: 1
:
cám ơn rất nhiều
nguyenminh545 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-12-2011, 02:25 PM   #5
madampi.12
Nhập môn đệ tử
 
Tham gia ngày: Dec 2011
Bài gửi: 1
:
[QUOTE=trai_xq;34303]+set_tris_b(0);//định nghĩa portb là đầu ra số(nêu như ở vòng lặp while bạn khai báo
output_b(a); thì câu lệnh set_tris_b(0); là không cần thiết.
+enable_interrupts(int_timer0);//mới bắt đầu chương trình, bạn cho timer0 làm việc(bắt đầu tính
+setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //chỉ lệ chia tần số
timer0 8bit, đêm từ 0-->255, và sau đó tràng đếm lại từ 0. Mỗi lần tràn như vậy là được bạn tính thời gian như sau:
-bạn dùng thạch anh 4M=4000000hz. như vậy mỗi lần tràn thì được thời gian là Ttimer0=255*4/(4.000.000) (s)=255micro s. Nhân 4 bởi vì một chu kì lệnh của VDk=4 chu kì xung của thạch anh. Mục đích của chúng ta là để tạo ra một giây, như thế thì phải làm sao?
+setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //lệnh này sẻ nâng giải tần của timer0 lên 2 lần nữa. nghĩa là khi có lện này ttimer0 sẻ được tính lại sau mổi lần tràn như sau:
Ttimer0=( 255*4/(4.000.000) )* 2(s) = 510micro s
+enable_interrupts(global);//cho ngắt toàn bộ(lệnh này không cần nếu như bạn chỉ có ngắt timer0)
+set_timer0(6);//đắt giá trị đầu cho timer0 là 6, nghĩa là timer bây giờ tăng từ 6 chư không phải là 0 nữa. Chổ này thôi tôi nghĩ có sự nhầm lẫn là set_timer0(5); là đùng hơn, vì sao phải làm vậy bạn biết không? tất ca cũng chỉ vì cho dễ tính và chẵn số thôi. Nếu đặt như vậy thì thời gian timer0 sẻ được tính lại như sau:
Ttimer0=( (255-5)*4/(4.000.000) )* 2(s) = 500micro s
+như vậy bạn phải cần mấy lần tràn mới được 1s? có phải là 2000 lần không
vì 2000*500=1000000micro s=1s ok!
+Đoạn chương trình này sẽ thể vấn đề đó:
#int_timer0
void interrupt_timer0()
{
set_timer0(5);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;//nếu đã được 2000 nghìn lần tràn(đã được 1s) thì cho tràn lại từ đầu
rotate_left(&a,1);//tương ưng với lệnh a=a<<1; nghĩ là dịc trái một bit, sau 1s
//bởi vì bạn đã cho a=0x01<=> a=0b00000001; trong chương trình main
}
}
//------------------
Sở dĩ tôi giúp bạn vì ngày xưa tôi cũng có gặp khó khăn này rồi.[
thank
madampi.12 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-03-2011, 10:49 PM   #6
babadada
Nhập môn đệ tử
 
Tham gia ngày: Jun 2010
Bài gửi: 4
:
may wa gặp bài này cuả bác em đã hiểu thưa bác ...thank bác
babadada vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-03-2011, 05:15 AM   #7
iVoVa
Nhập môn đệ tử
 
Tham gia ngày: Mar 2011
Bài gửi: 6
:
Theo mình để tính được giá trị cần nạp vào thanh ghi TMRO thì mình tính theo công thức này . T_out = ((4*Prescaler)*(256-TMR0)x Count)/4000000. ( Timer 16bit thì thay 256 = 65536 )
Mình nên cho Prescaler là 256 .
Cho Count là 1 trước. T_out là thời gian trễ mình cần tạo ( ví dụ T_out = 0.5s).
Thay vào để tính được TMR0.
Nếu TMR0 ko đủ để biểu diễn giá trị vừa tính ra ( vượt quá 8 bit ) thì ta xem mức độ lớn hơn như thế nào để tăng biến count lên cho phù hợp và tính lại từ đầu.
( Hiện nay các PIC18 timer 0 có thể sử dụng đến 16 bit hoặc 8 bit , trong CCS C Complier khi sử dụng hàm set_timer0(xxx) thì mình xem mã ASM thấy nó mặc định sử dụng là timer 16 bit.
iVoVa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-03-2011, 09:34 PM   #8
Delfy_Coltech
Đệ tử 4 túi
 
Delfy_Coltech's Avatar
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
:
Code:
 setup_timer1(TMR_INTERNAL | TMR_DIV_BY_8, 4096);
Thế còn dòng setup Timer1 thế này các bạn giải thích giùm?
Thanks!
__________________
Mechatronics Department
University of Engineering and Technology, VNUH.
Delfy_Coltech vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-03-2012, 04:57 PM   #9
kyanh911
Đệ tử 1 túi
 
Tham gia ngày: Jan 2010
Bài gửi: 11
:
còn vụ counter thì sao các bác? có bác nào xài chưa
kyanh911 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à 06:53 PM.


Đượ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