|
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 |
05-11-2010, 12:26 AM | #1 |
Đệ tử 4 túi
Tham gia ngày: Jun 2010
Bài gửi: 79
: |
có code nhờ anh em xem giúp
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); } } } |
|
|