![]() |
|
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 |
|
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: May 2007
Bài gửi: 9
: |
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? |
![]() |
![]() |
![]() |
#2 |
Super Moderator
Tham gia ngày: Feb 2006
Bài gửi: 150
: |
Khi còn được cấp dao động và còn cho phép Timer 0 chạy thì nó sẽ đếm
|
![]() |
![]() |
![]() |
#3 |
Nhập môn đệ tử
Tham gia ngày: May 2007
Bài gửi: 9
: |
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 : Code:
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; } } thay đổi nội dung bởi: phamminhtuan, 10-12-2009 lúc 11:15 AM. Lý do: Định dạng code |
![]() |
![]() |
![]() |
#4 |
Super Moderator
Tham gia ngày: Feb 2006
Bài gửi: 150
: |
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 |
![]() |
![]() |
![]() |
#5 |
Nhập môn đệ tử
Tham gia ngày: May 2007
Bài gửi: 9
: |
cảm ơn bạn nhiều, mình hiểu rồi, mình sẽ đem delay ra ngoài ngắt !
|
![]() |
![]() |
![]() |
#6 |
Đệ tử 3 túi
Tham gia ngày: Oct 2006
Bài gửi: 46
: |
Ở 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
__________________
http://www.hieunghia.info Lướt web thoải mái với USB3G của Viettel http://www.hieunghia.info/tin-cong-n...3g-vietel.html ----------------------------------------------------------------------------------- Một chút giận,hai chút tham,lận đận cả đời ri cũng khổ. Trăm điều lành,ngàn điều nhịn,thong dong tấc dạ rứa mà vui |
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|