PDA

View Full Version : loi giao tiep 3 pic slave ,1 master


vitechpham
07-06-2009, 11:43 PM
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;
}
}
}

nguyentrivysv
29-10-2009, 12:29 AM
anh "vitechpham" oi! em củng đang làm đồ án về master_slave 1 khớp nó là 1 phần nhỏ trong đồ án của anh.anh có thể cho em liên hệ với anh để hỏi một vài vấn đề không?hoăc anh chỉ cho em viết chương trình vdk cho cơ cấu master_slave 1 khớp với.nghe thầy nói là dùng AT mega8.cảm ơn anh