![]() |
|
![]() |
#1 |
Đệ tử 2 túi
|
![]() Mò mẫm mãi cũng ra bài đo tốc độ,đưa xung encoder lên tính vận tốc.Lúc đầu thì encoder hỏng,sau thì tính sai 1 chỗ trong vòng ngắt.hihi.Mới học Pic nên còn gà wá...Em post bài đã làm được lên share cho bác nào cũng mới nghiên cứu PIC như em,gặp phải bài toán này hi vọng các bác sẽ ko bị mất time nữa.
Compiler: CCSC 4.065 PIC:16F877A Encoder:100xung/vòng Code: Code:
#include <16f877a.h> #include <def_877a.h> #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=8000000) #include <lcd.c> float vantoc,soxung; int8 a,b,c,d,a1; int16 sovong,i; #int_TIMER1 void TIMER1_isr(void) { soxung=get_timer0(); //Lay so xung Timer0 dem set_timer1(55535); // Trong 1ms if(tmr1if==1) { intcon=0; //stop ngat a1=1; } } void main() { trisa=255; //Cho RA4 di vao trisb=0; trisc=0; trisd=0; lcd_init(); lcd_gotoxy(1,1); lcd_putc("Beginning...."); delay_ms(1000); lcd_putc('\f'); setup_timer_2(T2_DIV_BY_16,255,1); setup_ccp1(CCP_PWM); rd7=0; //Mo role,quay theo 1 chieu for(i=0;i<1024;i++) //0 la quay nhanh,1024 quay cham-->Do mach thiet ke. { set_pwm1_duty(i); // Toc do giam dan delay_ms(1); set_timer0(0); set_timer1(55535); setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1); //Che do counter setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); delay_ms(50); if(a1==1) { //while (1) //{ vantoc=((float)(60*soxung)/(0.01*100)); //Tinh van toc a=vantoc/1000; //Tach so.. b=(int)(vantoc-1000*a)/100; c=(int)(vantoc-1000*a-100*b)/10; d=(int)vantoc%10; lcd_gotoxy(1,1); //Hien thi lcd_putc(a+48); lcd_gotoxy(2,1); lcd_putc(b+48); lcd_gotoxy(3,1); lcd_putc(c+48); lcd_gotoxy(4,1); lcd_putc(d+48); lcd_gotoxy(6,1); lcd_putc("vong/ph"); lcd_gotoxy(3,2); lcd_putc("toc do dc"); delay_ms(5); //Vong for0->1024 nen delay it. tmr0if=0;tmr1if=0; //Xoa tran } } }
__________________
Best Regard. thay đổi nội dung bởi: popeye_ts22, 05-09-2008 lúc 01:52 AM. Lý do: Edit chỉn chu.Hihi. |
![]() |
![]() |
![]() |
|
|