View Full Version : Xin hỏi về ngắt timer0 PIC6F877A!!! giúp e với !!!!
e được biết là khi timer0 tràn thi nhảy vào ngắt, nhưng khi nào thì nó đếm tiếp? khi thực hiện xong ngắt hay là khi vừa nhảy vào ngắt?
e mới học nên kô rõ lắm chỗ nay, xin các cao thủ chỉ giáo?
phamminhtuan
10-12-2009, 10:26 AM
e được biết là khi timer0 tràn thi nhảy vào ngắt, nhưng khi nào thì nó đếm tiếp? khi thực hiện xong ngắt hay là khi vừa nhảy vào ngắt?
e mới học nên kô rõ lắm chỗ nay, xin các cao thủ chỉ giáo?
Khi còn được cấp dao động và còn cho phép Timer 0 chạy thì nó sẽ đếm
E biết vậy nhưng ý e hỏi là khi nó đang thực hiện ngắt thì nó có đếm không hay là khi thực hiện xong ngắt và trở về chương trình chính nó mới đếm tiếp ?
ngắt của e nó thế này :
void timer0()
{
set_timer0(6); // T = 16*(256 - 6)*0.2us = 800us (ne^'u dùng tha.ch anh 4M thi thay 0.2us thành 1us)
++count;
set_adc_channel(0); // RA0/AN0(Pin2) is analog input channel
delay_us(10);
ap_adc=read_adc();
ap_dc=ap_dc+ap_adc;
set_adc_channel(1);
delay_us(10);
dong_adc=read_adc();
dong_dc=dong_dc+dong_adc;
power=(ap_adc-v_offset)*(dong_adc-i_offset);
value=power+ value;
if(count==625) //800*200=240000
{
count=0;
v_offset=ap_dc/625;
i_offset=dong_dc/625;
power_tb=(value/625)*1.13; //Ki=480
//Kv=639
//power_tb=(ap_adc*Kv*(5/1024))*(dong_adc*Ki*(5/1024))
power_sum=power_tb*0.5/(3600*1000); //power_tb*0.2/(3600*1000) __10 chu ky
temp=power_sum+temp;
if(temp>=0.001)
{
sum=sum+temp;
temp=temp-0.001;
RB7=1;
delay_ms(20);
RB7=0;
}
ap_dc=0;
dong_dc=0;
value=0;
}
}
phamminhtuan
10-12-2009, 11:18 AM
Có nghĩa là khi con PIC còn chạy thì vẫn còn dao động, cho dù CPU có làm việc gì đi chăng nữa, nếu Timer0 vẫn được cho phép thì nó vẫn cứ tiếp tục đếm.
Trả lời chính xác câu hỏi của bạn là "Trong ngắt Timer 0 vẫn đếm"
Tuy nhiên, dùng delay tới 20ms trong ngắt như chương trình của bạn thì cho dù Timer 0 có tràn tiếp 1 lần nữa nó vẫn không gây ra ngắt, vì khi vào Ngắt, GIE bị xóa che các ngắt khác
cảm ơn bạn nhiều, mình hiểu rồi, mình sẽ đem delay ra ngoài ngắt !
nghia_tdh21
10-12-2009, 02:46 PM
Ở trong chương trình phục vụ ngắt không nên đặt lời gọi một hàm hay thủ tục nào đó mà mình đã sử dụng trong chương trình. Tốt nhất là bạn nên đặt các biến dạng cờ hay tăng giảm giá trị nào đó thôi. Nếu mình dùng hàm hay thủ tục nào đó đã sử dụng chỗ khác vào trong trình phục vụ ngắt thì trình dịch sẽ thông báo reentrancy
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.