|
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 |
22-06-2011, 04:45 PM | #1 |
Đệ tử 2 túi
Tham gia ngày: Aug 2008
Bài gửi: 40
: |
Cấu hình dao động cho Pic18F4550
Chào các bác! Nhờ các bác xem giúp em chương trình sau. Khi em sử dụng delay_ms() và ngắt timer3 thì thời gian hoạt động là không chính xác: delay_ms(1000) mà phải tới gần 1 phút sau thì mới có hiệu lực, cả ngắt timer3 cũng vậy. Nhưng nếu em thay #use delay(clock=1000000) thì lệnh delay_ms(1000) hoạt động chính xác còn ngắt timer3 vẫn không chính xác. Rất mong các bác giúp đỡ!
Code:
#include <18F4550.H> #include <DEF_18F4550.H> #FUSES NOWDT //No Watch Dog Timer #FUSES HSPLL, PLL5, CPUDIV1 #fuses ECPLL //Su dung PLL va RA6 lam pin ra #FUSES NOPROTECT //Code not protected from reading #FUSES NOBROWNOUT //No brownout reset #FUSES NOPUT //No power Up Timer #FUSES NODEBUG //No Debug mode for ICD #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOWRT //Program memory not write protected #FUSES MCLR //Master clear reset #FUSES CCP2C1 //Su dung rc1 lam cong OUT PWM #use delay(clock=48000000) //Thach anh gan tren board la 20MHz #define dctrai rc6 #define dcphai rc7 //Ham ngat TIMER3(dung cho xu ly Encoder)*********************************************** #int_TIMER3 void TIMER3_ProcesEncoder(void) { set_timer3(50536); n++; if(n==100) //100*0.01(s)=1(s). Sau 1(s) thi tien hanh lay mau 1 lan { porta=0b00000000; n=0; } clear_interrupt(int_TIMER3); } void main(void) { setup_adc_ports(NO_ANALOGS); //tat ca porta la digital set_tris_c(0b00110001); set_tris_a(0b00010000); enable_interrupts(int_TIMER3); enable_interrupts(Global); setup_timer_3(T3_INTERNAL|T3_DIV_BY_8); //thiet lap timer3 o che do xung noi va sau 8 lan tran thi duoc MCU coi la 1 su kien -> xay ra ngat timer3 set_timer3(50536); //100(Hz) = 48.000.000/[4*(65536-n)*8] //n = 65536-[480.000/(4*8)] = 50536 //T = 1/f = 1/100 = 0.01(s) -> Sau 0.01(s) thì xay ra ngat timer3 portc=0b00000000; porta=0b00001111; while(true) { dcphai=1; dctrai=0; delay_ms(1000); dctrai=1; dcphai=0; delay_ms(1000); } } thay đổi nội dung bởi: TANDEM, 22-06-2011 lúc 10:15 PM. |
|
|