|
Tài trợ cho PIC Vietnam |
Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC |
|
Ðiều Chỉnh | Xếp Bài |
07-06-2009, 11:43 PM | #1 |
Đệ tử 1 túi
Tham gia ngày: Oct 2007
Bài gửi: 15
: |
loi giao tiep 3 pic slave ,1 master
minh dang lam luan van canh tay robot ,phan chuong trinh va mach da xong ,phan mo phong tren protues da chay ok nhung khi nap chip chay thu thi pic mater ko giao tiep duoc voi slave (sau khi nhan du lieu slave bat sang led) cham vao chan thach anh thi thinh thoang led slave sang ,day la chuong trinh cua minh viet bang ccs c cac bac cao thu xem gium
master #include <16f877a.h> #include <math.h> #use delay(clock=12000000) #FUSES hs,nowdt,noprotect,NOBROWNOUT,NOLVP,nodebug,put #use i2c(sda=pin_e0,scl=pin_e1,fast=400000) #use rs232(baud=9600,parity=e,xmit=pin_c6,rcv=pin_c7 ) #use fast_io(b) #use fast_io(a) #bit b1=0x06.1 #bit b3=0x06.3 #bit b5=0x06.5 #word b=0xa0a1 int8 g,s1,s0,n,h,p; int16 z; int16 k[4],i; void ghirom(int16 v[],int16 h) { int8 f; i2c_start(); i2c_write(0xa0); i2c_write(make8(h,1)); i2c_write(make8(h,0)); for(f=0;f<=3;f++) { i2c_write(make8(v[f],1)); delay_ms(10); i2c_write(make8(v[f],0)); delay_ms(10); } i2c_stop(); delay_ms(10); z=z+8; } void docrom (int16 v[], int16 h) { int8 f,t[2],j=0; for (f=0;f<=7;f++) { i2c_start(); i2c_write(0xa0); i2c_write(make8(h+f,1)); i2c_write(make8(h+f,0)); i2c_start(); i2c_write(0xa1); t[j]= i2c_read(0); i2c_stop(); j=j+1; if(j==2) { j=0; v[f-1]=make16(t[0],t[1]); } delay_ms(1); } z=z+8; } void gap(int8 v[]) { if (input(pin_d6)==1) v[3]=10; else v[3]=0; } void gapvat(v[]) { if (v[3]==10) { if (input(pin_d6)==1) { output_low(pin_d5); output_high(pin_d4); } while (input(pin_d6)==1) continue; delay_ms(1000); } else { if (input(pin_d6)==0) { output_low(pin_d4); output_high(pin_d5); } while (input(pin_d7)==1) continue; } output_high(pin_d5); output_high(pin_d4); } void kiemtra1() { int8 c=0; while(c<3) { c=input(pin_b4)+input(pin_b2)+input(pin_b6); continue; } } void kiemtra0() { int8 c=113; while(c>0) { c=input(pin_b4)+input(pin_b2)+input(pin_b6); continue; } } void doc() { int8 f; for (f=0;f<=2;f++) k[f]=0; for(f=0;f<=15;f++) { kiemtra1(); output_high(pin_b7); kiemtra0(); output_low(pin_b7); k[0]=k[0]+b5; k[0]<<=1; k[1]=k[1]+b3; k[1]<<=1; k[2]=k[2]+b1; k[2]<<=1; } } void loi() { switch (s0) { case 1: putc(n); break; case 2 : putc(make8(k[n-160],1)); break; case 0: putc(make8(k[n-160],0)); break; } } void demphat() { switch (s0) { case 0: putc(n); break; case 1 : putc(make8(k[n-160],1)); break; case 2 : putc(make8(k[n-160],0)); n=n+1; break; } } void main() { s1=0; n=160; s0=0; i=0; z=0; set_tris_b(0x7e); set_tris_a(0x30); set_tris_c(0x00); output_low(pin_a1); output_high(pin_b7); output_low(pin_c5); output_low(pin_d5); output_low(pin_d4); kiemtra0(); output_low(pin_b7); kiemtra1(); output_high(pin_b7); while (input(pin_a5)==0) { if(input(pin_a4)==0&& s1==0) { s1=160; output_high(pin_c5); i=i+1; doc(); gap(k); ghirom(k,z); } if(input(pin_a4)==1) { s1=0; output_low(pin_c5); } if (b>i || b<i) b=i; continue; } i=0; z=0; s1=160; g=0; while (true) { h=input(pin_b4)+input(pin_b2)+input(pin_b6); p= g+h; if (p==0) { output_low(pin_b7); g=160; s1=0; if (i<=b) { docrom(k,z); i=i+1; } else { z=0; i=1; docrom(k,z); } gapvat(k); } if(s1==0) { if(h>0) { output_high(pin_b7); loi(); } else { if(n>162) { g=0; n=160; s1=160; output_high(pin_a1); putc('x'); } else demphat(); if (s0<2) s0=s0+1; else s0=0; } } delay_ms(10); output_low(pin_b7); } } slave 1 #include <16f876a.h> #include <float.h> #include <math.h> #use delay(clock=12000000) #FUSES hs,NOPROTECT,nowdt,NOBROWNOUT,NOLVP,nodebug,put #use rs232(baud=9600,parity=e,xmit=pin_c6,rcv=pin_c7) #use fast_io(a) #use fast_io(b) #bit a4=0x05.4 #bit cl=0x18.0 #int_global #priority int_rda,int_ext int8 s[3],n,w,v,w1,v1,m,t; int16 g,k,r,a; float p,max=800,min=200; void data() { int8 b; v=0; if (cl==1) v=1; s[n]=getc(); for (b=0;b<=7;b++) v=v+bit_test(s[n],b); v=v%2; } void xuat() { int8 q=0; a=k; loop : while (input(pin_a2)==0) continue; a4=bit_test(a,15-q); output_low(pin_a3); while (input(pin_a2)==1) continue; output_high(pin_a3); q=q+1; if (q<=15) goto loop; } void pid() { p=0.1*(g-k)+5*(g-k+r)+0*(g-k-r); r=abs(g-k); if(abs(p)>max) p=max; If(abs(p)<min) p=min; } void xung() { if(g>k) w=(int8)(255-abs(255*p/max)); if(k>g) v=(int8)(255-abs(255*p/max)); } #int_ext void ngat() { if (input(pin_b2)==1) k=k+1; if(input(pin_b1)==1) k=k-1; if (g==k) { w=0; v=0; set_pwm1_duty(255); set_pwm2_duty(255); p=0; r=0; t=0; m=0; enable_interrupts(int_rda); output_low(pin_a3); } } void demthu() { int t1=0; output_high(pin_a3); data(); if (input(pin_a2)==0) t=t+1; if (t>3) t1=1; if (t==10) t1=2; if (v==0 && t<=3) { n=n+1; if (s[0]==160 && n==3) { output_high(pin_c4); g=make16(s[1],s[2]); n=0; } output_low(pin_a3); } if (t1==1) output_low(pin_a3); if(t==10) { m=160; t=0; v=0; output_high(pin_a3); disable_interrupts(int_rda); } } #int_rda void nhap() { demthu(); } void main() { int8 s1=0; t=0; n=0; w=0; v=0; v1=0; w1=0; r=0; k=0; g=0; p=0; m=0; set_tris_b(0x0f); set_tris_a(0x07); set_tris_c(0xc0); output_low(pin_c4); output_high(pin_a3); output_high(pin_c2); output_low(pin_c1); enable_interrupts(int_rda); enable_interrupts(global); while(input(pin_b3)==1) continue; setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(255); set_pwm2_duty(255); output_low(pin_a3); while (input(pin_a2)==1) continue; output_high(pin_a3); ext_int_edge(0,h_to_l); enable_interrupts(int_ext); while(input(pin_a1)==0) { if (input(pin_a0)==0&& s1==0) { s1=160; disable_interrupts(int_ext); xuat(); } if (input(pin_a0)==1) s1=0; enable_interrupts(int_ext); continue; } output_low(pin_a3); while (true) { delay_ms(1); if( m ==160) { if (g>k || g<k) pid(); xung(); if (w>w1 || w<w1) set_pwm1_duty(w); if (v>v1 || v<v1) set_pwm2_duty(v); w1=w; v1=v; } } } slave2 #include <16f876a.h> #include <float.h> #include <math.h> #use delay(clock=12000000) #FUSES hs,NOPROTECT,nowdt,NOBROWNOUT,NOLVP,nodebug,put #use rs232(baud=9600,parity=e,xmit=pin_c6,rcv=pin_c7) #use fast_io(a) #use fast_io(b) #bit a4=0x05.4 #bit cl=0x18.0 #int_global #priority int_rda,int_ext int8 s[3],n,w,v,w1,v1,m,t; int16 g,k,r,a; float p,max=800,min=200; void data() { int8 b; v=0; if (cl==1) v=1; s[n]=getc(); for (b=0;b<=7;b++) v=v+bit_test(s[n],b); v=v%2; } void xuat() { int8 q=0; a=k; loop : while (input(pin_a2)==0) continue; a4=bit_test(a,15-q); output_low(pin_a3); while (input(pin_a2)==1) continue; output_high(pin_a3); q=q+1; if (q<=15) goto loop; } void pid() { p=0.1*(g-k)+5*(g-k+r)+0*(g-k-r); r=abs(g-k); if(abs(p)>max) p=max; If(abs(p)<min) p=min; } void xung() { if(g>k) w=(int8)(255-abs(p*255/max)); if(k>g) v=(int8)(255-abs(p*255/max)); } #int_ext void ngat() { if (input(pin_b2)==1) k=k+1; if(input(pin_b1)==1) k=k-1; if (g==k) { w=0; v=0; set_pwm1_duty(255); set_pwm2_duty(255); p=0; r=0; t=0; m=0; enable_interrupts(int_rda); output_low(pin_a3); } } void demthu() { int8 t1=0; output_high(pin_a3); data(); if (input(pin_a2)==0) t=t+1; if (t>=4) t1=1; if (t1<=6) t1=2; if ( v==0 && t1==2) { n=n+1; if (s[0]==161 && n==3) { output_high(pin_c4); g=make16(s[1],s[2]); n=0; } output_low(pin_a3); } if (t1<2) output_low(pin_a3); if(t==10) { m=160; t=0; v=0; output_high(pin_a3); disable_interrupts(int_rda); } } #int_rda void nhap() { demthu(); } void main() { int8 s1=0; t=0; n=0; w=0; v=0; v1=0; w1=0; r=0; k=0; g=0; p=0; m=0; set_tris_b(0x0f); set_tris_a(0x07); set_tris_c(0xc0); output_low(pin_c4); output_high(pin_a3); output_high(pin_c2); output_low(pin_c1); enable_interrupts(int_rda); enable_interrupts(global); while(input(pin_b3)==1) continue; setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(255); set_pwm2_duty(255); output_low(pin_a3); while (input(pin_a2)==1) continue; output_high(pin_a3); ext_int_edge(0,h_to_l); enable_interrupts(int_ext); while(input(pin_a1)==0) { if (input(pin_a0)==0&& s1==0) { s1=160; disable_interrupts(int_ext); xuat(); } if (input(pin_a0)==1) s1=0; enable_interrupts(int_ext); continue; } output_low(pin_a3); while (true) { delay_ms(1); if( m==160) { if (g>k || g<k) pid(); xung(); if (w>w1 || w<w1) set_pwm1_duty(w); if (v>v1 || v<v1) set_pwm2_duty(v); w1=w; v1=v; } } } slave3 #include <16f876a.h> #include <float.h> #include <math.h> #use delay(clock=12000000) #FUSES hs,NOPROTECT,nowdt,NOBROWNOUT,NOLVP,nodebug,put #use rs232(baud=9600,parity=e,xmit=pin_c6,rcv=pin_c7) #use fast_io(a) #use fast_io(b) #bit a4=0x05.4 #bit cl=0x18.0 #int_global #priority int_rda,int_ext int8 s[3],n,w,v,w1,v1,m,t; int16 g,k,r,a; float p,max=800,min=200; void data() { int8 b; v=0; if (cl==1) v=1; s[n]=getc(); for (b=0;b<=7;b++) v=v+bit_test(s[n],b); v=v%2; } void xuat() { int8 q=0; a=k; loop : while (input(pin_a2)==0) continue; a4=bit_test(a,15-q); output_low(pin_a3); while (input(pin_a2)==1) continue; output_high(pin_a3); q=q+1; if (q<=15) goto loop; } void pid() { p=0.1*(g-k)+5*(g-k+r)+0*(g-k-r); r=abs(g-k); if(abs(p)>max) p=max; If(abs(p)<min) p=min; } void xung() { if(g>k) w=(int8)(255-abs(p*255/max)); if(k>g) v=(int8)(255-abs(p*255/max)); } #int_ext void ngat() { if (input(pin_b2)==1) k=k+1; if(input(pin_b1)==1) k=k-1; if (g==k) { w=0; v=0; set_pwm1_duty(255); set_pwm2_duty(255); p=0; r=0; t=0; m=0; enable_interrupts(int_rda); output_low(pin_a3); } } void demthu() { int8 t1=0; output_high(pin_a3); data(); if (input(pin_a2)==0) t=t+1; if (t>=7) t1=1; if (t<=9) t1=2; if (v==0 && t1==2) { n=n+1; if (s[0]==162 && n==3) { output_high(pin_c4); g=make16(s[1],s[2]); n=0; } output_low(pin_a3); } if (t1<2) output_low(pin_a3); if(t==10) { m=160; t=0; v=0; output_high(pin_a3); disable_interrupts(int_rda); } } #int_rda void nhap() { demthu(); } void main() { int8 s1=0; t=0; n=0; w=0; v=0; v1=0; w1=0; r=0; k=0; g=0; p=0; m=0; set_tris_b(0x0f); set_tris_a(0x07); set_tris_c(0xc0); output_low(pin_c4); output_high(pin_a3); output_high(pin_c2); output_low(pin_c1); enable_interrupts(int_rda); enable_interrupts(global); while(input(pin_b3)==1) continue; setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(255); set_pwm2_duty(255); output_low(pin_a3); while (input(pin_a2)==1) continue; output_high(pin_a3); ext_int_edge(0,h_to_l); enable_interrupts(int_ext); while(input(pin_a1)==0) { if (input(pin_a0)==0&& s1==0) { s1=160; disable_interrupts(int_ext); xuat(); } if (input(pin_a0)==1) s1=0; enable_interrupts(int_ext); continue; } output_low(pin_a3); while (true) { delay_ms(1); if( m ==160) { if (g>k || g<k) pid(); xung(); if (w>w1 || w<w1) set_pwm1_duty(w); if (v>v1 || v<v1) set_pwm2_duty(v); w1=w; v1=v; } } } thay đổi nội dung bởi: vitechpham, 08-06-2009 lúc 12:03 AM. |
Ðiều Chỉnh | |
Xếp Bài | |
|
|