robotpic
05-11-2010, 12:27 AM
e viêt chương trình sau có 2 lổi e chưa hiểu nguyên nhân:
đặt câu hỏi trước gởi code sau:
chương trình e dùng ngắt ngoài chân rc3 rc4 rc5 của pic 4331 để đọc encoder
câi 1: nếu encoder quay thì xung tang theo theo tốc đọ của encoder , nhưng mà e không quay encoder thì nó cũng tăng lên?
câu 2: còng if nếu e viết :
while(TRUE)
{
IF(XUNG>1000||xung1>1000||xung2>1000) RA0=0;
else IF(XUNG>1200||xung1>1200||xung2>1200) RA1=0;
else IF(XUNG>1300||xung1>1300||xung2>1300) RA2=0;
else IF(XUNG>1400||xung1>1400||xung2>1400) RA3=0;
else IF(XUNG>1500||xung1>1500||xung2>1500) RA4=0;
else IF(XUNG>1600||xung1>1600||xung2>1600) RA5=0;
else IF(XUNG>2000||xung1>2000||xung2>2000) CT_PWM_POWER();
else IF(XUNG>3000||xung1>3000||xung2>3000) CT_PWM_CCP ();
else IF(XUNG>3000||xung1>3000||xung2>3000)
{
RD0=0;
DELAY_MS(500);
RD1=0;
DELAY_MS(500);
RD2=0;
DELAY_MS(500);
RD3=0;
DELAY_MS(500);
RD4=0;
DELAY_MS(500);
}
}
thì nó khi encoder quay mấy vòng đi chăng nữa nó cũng chỉ dừng lệnh if đầu tiên tức chỉ có ra0 sáng.
còn khí e viết như thế nầy thì nhận hết ok:
while(TRUE)
{
IF(XUNG>1000||xung1>1000||xung2>1000) RA0=0;
IF(XUNG>1200||xung1>1200||xung2>1200) RA1=0;
IF(XUNG>1300||xung1>1300||xung2>1300) RA2=0;
IF(XUNG>1400||xung1>1400||xung2>1400) RA3=0;
IF(XUNG>1500||xung1>1500||xung2>1500) RA4=0;
IF(XUNG>1600||xung1>1600||xung2>1600) RA5=0;
IF(XUNG>2000||xung1>2000||xung2>2000) CT_PWM_POWER();
IF(XUNG>3000||xung1>3000||xung2>3000) CT_PWM_CCP ();
IF(XUNG>3000||xung1>3000||xung2>3000)
{
RD0=0;
DELAY_MS(500);
RD1=0;
DELAY_MS(500);
RD2=0;
DELAY_MS(500);
RD3=0;
DELAY_MS(500);
RD4=0;
DELAY_MS(500);
}
}
đây là toàn bộ code của e:
#include <18f4331.h>
#INCLUDE <def_4331.h>
#FUSES HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOCPD,NO DEBUG,NOFCMEN,NOCPB,STVREN,NOPWMPIN,HPOL_LOW
#FUSES MCLR,NOWINEN,NOIESO,NOWRTC,NOWRTB,NOWRTD,NOEBTR,NO WRT,NOEBTRB,EXCLKD0,T1STANDARD
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(d)
#use fast_io(c)
#use fast_io(e)
long XUNG,XUNG1,XUNG2;
#INT_EXT //RC3
VOID DEM_NGAT()
{
XUNG++;
return ;
}
#INT_EXT1 //RC4
VOID DEM_NGAT_1()
{
XUNG1++;
return ;
}
#INT_EXT2 //RC5
VOID DEM_NGAT_2()
{
XUNG2++;
return;
}
VOID CT_PWM_POWER()
{
SET_POWER_PWM0_DUTY(100);
SET_POWER_PWM2_DUTY(500);
SET_POWER_PWM4_DUTY(200);
SET_POWER_PWM6_DUTY(500);
}
VOID CT_PWM_CCP ()
{
SET_PWM2_DUTY(250);
SET_PWM1_DUTY(500);
}
void main()
{
trisa=0x00;
porta=0xff;
trisb=0x00;
portb=0x00;
trisc=0b00111000;
portC=0x0f;
trisd=0x00;
portd=0xff;
trise=0x00;
porte=0xff;
setup_power_pwm_pins( PWM_ODD_ON,PWM_ODD_ON,PWM_ODD_ON,PWM_ODD_ON);
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,1 24,0,1,0);
set_power_pwm_override(1, false, 0);
set_power_pwm_override(3, false, 0);
set_power_pwm_override(5, false, 0);
set_power_pwm_override(7, false, 0);
SETUP_CCP1(CCP_PWM);
SETUP_CCP2(CCP_PWM);
setup_timer_2(T2_DIV_BY_4,124,1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts( INT_EXT2);
ext_int_edge(0, L_TO_H );
ext_int_edge(1, L_TO_H );
ext_int_edge(2, L_TO_H );
xung=0;
xung1=0;
xung2=0;
while(TRUE)
{
IF(XUNG>1000||xung1>1000||xung2>1000) RA0=0;
IF(XUNG>1200||xung1>1200||xung2>1200) RA1=0;
IF(XUNG>1300||xung1>1300||xung2>1300) RA2=0;
IF(XUNG>1400||xung1>1400||xung2>1400) RA3=0;
IF(XUNG>1500||xung1>1500||xung2>1500) RA4=0;
IF(XUNG>1600||xung1>1600||xung2>1600) RA5=0;
IF(XUNG>2000||xung1>2000||xung2>2000) CT_PWM_POWER();
IF(XUNG>3000||xung1>3000||xung2>3000) CT_PWM_CCP ();
IF(XUNG>3000||xung1>3000||xung2>3000)
{
RD0=0;
DELAY_MS(500);
RD1=0;
DELAY_MS(500);
RD2=0;
DELAY_MS(500);
RD3=0;
DELAY_MS(500);
RD4=0;
DELAY_MS(500);
}
}
}
đặt câu hỏi trước gởi code sau:
chương trình e dùng ngắt ngoài chân rc3 rc4 rc5 của pic 4331 để đọc encoder
câi 1: nếu encoder quay thì xung tang theo theo tốc đọ của encoder , nhưng mà e không quay encoder thì nó cũng tăng lên?
câu 2: còng if nếu e viết :
while(TRUE)
{
IF(XUNG>1000||xung1>1000||xung2>1000) RA0=0;
else IF(XUNG>1200||xung1>1200||xung2>1200) RA1=0;
else IF(XUNG>1300||xung1>1300||xung2>1300) RA2=0;
else IF(XUNG>1400||xung1>1400||xung2>1400) RA3=0;
else IF(XUNG>1500||xung1>1500||xung2>1500) RA4=0;
else IF(XUNG>1600||xung1>1600||xung2>1600) RA5=0;
else IF(XUNG>2000||xung1>2000||xung2>2000) CT_PWM_POWER();
else IF(XUNG>3000||xung1>3000||xung2>3000) CT_PWM_CCP ();
else IF(XUNG>3000||xung1>3000||xung2>3000)
{
RD0=0;
DELAY_MS(500);
RD1=0;
DELAY_MS(500);
RD2=0;
DELAY_MS(500);
RD3=0;
DELAY_MS(500);
RD4=0;
DELAY_MS(500);
}
}
thì nó khi encoder quay mấy vòng đi chăng nữa nó cũng chỉ dừng lệnh if đầu tiên tức chỉ có ra0 sáng.
còn khí e viết như thế nầy thì nhận hết ok:
while(TRUE)
{
IF(XUNG>1000||xung1>1000||xung2>1000) RA0=0;
IF(XUNG>1200||xung1>1200||xung2>1200) RA1=0;
IF(XUNG>1300||xung1>1300||xung2>1300) RA2=0;
IF(XUNG>1400||xung1>1400||xung2>1400) RA3=0;
IF(XUNG>1500||xung1>1500||xung2>1500) RA4=0;
IF(XUNG>1600||xung1>1600||xung2>1600) RA5=0;
IF(XUNG>2000||xung1>2000||xung2>2000) CT_PWM_POWER();
IF(XUNG>3000||xung1>3000||xung2>3000) CT_PWM_CCP ();
IF(XUNG>3000||xung1>3000||xung2>3000)
{
RD0=0;
DELAY_MS(500);
RD1=0;
DELAY_MS(500);
RD2=0;
DELAY_MS(500);
RD3=0;
DELAY_MS(500);
RD4=0;
DELAY_MS(500);
}
}
đây là toàn bộ code của e:
#include <18f4331.h>
#INCLUDE <def_4331.h>
#FUSES HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOCPD,NO DEBUG,NOFCMEN,NOCPB,STVREN,NOPWMPIN,HPOL_LOW
#FUSES MCLR,NOWINEN,NOIESO,NOWRTC,NOWRTB,NOWRTD,NOEBTR,NO WRT,NOEBTRB,EXCLKD0,T1STANDARD
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(d)
#use fast_io(c)
#use fast_io(e)
long XUNG,XUNG1,XUNG2;
#INT_EXT //RC3
VOID DEM_NGAT()
{
XUNG++;
return ;
}
#INT_EXT1 //RC4
VOID DEM_NGAT_1()
{
XUNG1++;
return ;
}
#INT_EXT2 //RC5
VOID DEM_NGAT_2()
{
XUNG2++;
return;
}
VOID CT_PWM_POWER()
{
SET_POWER_PWM0_DUTY(100);
SET_POWER_PWM2_DUTY(500);
SET_POWER_PWM4_DUTY(200);
SET_POWER_PWM6_DUTY(500);
}
VOID CT_PWM_CCP ()
{
SET_PWM2_DUTY(250);
SET_PWM1_DUTY(500);
}
void main()
{
trisa=0x00;
porta=0xff;
trisb=0x00;
portb=0x00;
trisc=0b00111000;
portC=0x0f;
trisd=0x00;
portd=0xff;
trise=0x00;
porte=0xff;
setup_power_pwm_pins( PWM_ODD_ON,PWM_ODD_ON,PWM_ODD_ON,PWM_ODD_ON);
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,1 24,0,1,0);
set_power_pwm_override(1, false, 0);
set_power_pwm_override(3, false, 0);
set_power_pwm_override(5, false, 0);
set_power_pwm_override(7, false, 0);
SETUP_CCP1(CCP_PWM);
SETUP_CCP2(CCP_PWM);
setup_timer_2(T2_DIV_BY_4,124,1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts( INT_EXT2);
ext_int_edge(0, L_TO_H );
ext_int_edge(1, L_TO_H );
ext_int_edge(2, L_TO_H );
xung=0;
xung1=0;
xung2=0;
while(TRUE)
{
IF(XUNG>1000||xung1>1000||xung2>1000) RA0=0;
IF(XUNG>1200||xung1>1200||xung2>1200) RA1=0;
IF(XUNG>1300||xung1>1300||xung2>1300) RA2=0;
IF(XUNG>1400||xung1>1400||xung2>1400) RA3=0;
IF(XUNG>1500||xung1>1500||xung2>1500) RA4=0;
IF(XUNG>1600||xung1>1600||xung2>1600) RA5=0;
IF(XUNG>2000||xung1>2000||xung2>2000) CT_PWM_POWER();
IF(XUNG>3000||xung1>3000||xung2>3000) CT_PWM_CCP ();
IF(XUNG>3000||xung1>3000||xung2>3000)
{
RD0=0;
DELAY_MS(500);
RD1=0;
DELAY_MS(500);
RD2=0;
DELAY_MS(500);
RD3=0;
DELAY_MS(500);
RD4=0;
DELAY_MS(500);
}
}
}