TANDEM
22-06-2011, 04:45 PM
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 đỡ!
#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);
}
}
và đây là sơ đồ mạch.
#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);
}
}
và đây là sơ đồ mạch.