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 Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 30-01-2013, 08:46 PM   #1
bnthang
Đệ tử 3 túi
 
Tham gia ngày: Apr 2010
Bài gửi: 58
:
Trích:
Nguyên văn bởi qloi View Post
Code:
#include <16f88.h>
#fuses intrc,nomclr,nowdt
#use delay(clock=4000000)
#bit dout = 5.0

int a,i=0;

#int_timer0
void pwm()
{ 
   set_timer0(245);
   if(i<a) {R=0;}
   else R=1;
   i++;
   if(i==100) i=0;  
}

void main()
{
   set_tris_a(0);
   enable_interrupts(global);
   enable_interrupts(int_timer0);
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);
   set_timer0(245);
   while(1)
   {
        a=10;
        delay_ms(2000);
        a=100;
        delay_ms(2000);
   }
chương trình chỉ đơn giản là điều biến xung. vấn đề năm ở chổ t không hiểu tại sao với tính toán như trên: t(tràn) = (4/4000000)*2*10 = 20us ; và khi hoàn thành hết 100% khoảng xung trong hàm ngắt là: 20us*100=2ms ~ 500Hz nhưng khi mô phỏng và chạy trên mạch thật đều bị chung 1 vấn đề là F đầu ra khoảng 7-8Hz thôi(có khi dừng hẳn không có xung ở đầu ra). khi t bỏ hàm set_timer(245) tở đầu hàm ngắt thì coi như t(tràn)=(4/4000000)*2*256*100=0.05s ~ 20Hz và xung out xấp xỉ đúng như tính toán. Sau đó t đổi lại hệ số presc=8 và vẫn giữ hàm set_timer0(245) như lúc đầu thì mạch xuất xung hoàn toàn đúng t(tràn) = (4/4000000)*8*10*100=8ms ~100Hz.khi bị lỗi như trường hợp đầu thì t theo dõi thấy trong vòng lặp while ban đầu cho a=10,và hàm delay_ms(2000) không còn đúng nữa (trở nên rất dài khoảng vài phút hoặc không thay chạy nữa y như vdk bị treo khi gặp delay vậy). các bác cho mình hỏi vì sao trên lý thuyết tính toán vậy mà lại không chạy đúng trong khi thay đổi hệ số prescaler cao lên thì đúng. có thể là ngắt xảy ra quá nhanh nó đáp ứng không kịp chăng?
Nếu bạn muốn điều rộng xung thì tốt nhất nên dùng modul pwm trong pic, nếu dùng timer thì bạn phải tính tới thời gian thực hiện các dòng lệnh,if else,....các dòng lệnh này cũng mất thời gian, để xác định chính xác thời gian bạn cần xem file asm được dịch từ file .c hoặc dùng oscilloscope để đo xung out.
__________________
Mừng năm mới, khuyến mãi đặc biệt giảm giá 20% tất cả các kit từ ngày 01/01/2013 đến ngày 30/03/2013 -> số lượng có hạn nhé.
DT: 0983.548.514.
www.picdevelopmenttool.webs.com
www.smart-house.webs.com
www.robot3t.com
bnthang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-01-2013, 02:44 PM   #2
qloi
Đệ tử 3 túi
 
Tham gia ngày: Sep 2010
Bài gửi: 55
:
Trích:
Nguyên văn bởi bnthang View Post
Nếu bạn muốn điều rộng xung thì tốt nhất nên dùng modul pwm trong pic, nếu dùng timer thì bạn phải tính tới thời gian thực hiện các dòng lệnh,if else,....các dòng lệnh này cũng mất thời gian, để xác định chính xác thời gian bạn cần xem file asm được dịch từ file .c hoặc dùng oscilloscope để đo xung out.
tất nhiên là t có tính đến thời gian thực thi trể do thực hiện các lệnh, như trong hàm ngắt trên thì thực hiện không quá 20us trong khi chu kỳ xuất xung tính toán vào khoảng 2ms , quá nhỏ so với 2ms này cho nên tần số ra sai có thể chấp nhận trong khoảng vài chục hz là chuyện thường nhưng ở đây là sai chỉ có vài hz nên không thể do những lệnh đó được bạn àh.rỏ ràng mình thấy lỗi ở chổ gọi hàm set_timer0(245); là không có tác dụng vì khi ngắt xảy ra thì ở hàm phục vụ ngắt thanh ghi timer0 phải được set về giá trị khởi tạo là 245 là nó không làm nên mới dẫn tới sai số rất lớn nhưng mình k hiểu vì sao nó lại không thực thi được hàm này ở bộ chia 2???
__________________
heart.touching.2010@gmail.com!
qloi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bà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à 01:04 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