السلام عليكم
هذا الكود لاربع محركات
كود:
sbit sw_dir1 at RD4_bit;
sbit sw_dir1_dir at TRISD4_bit;
sbit sw_puls1 at RB4_bit;
sbit sw_puls1_dir at TRISB4_bit;
sbit sw_dir2 at RD5_bit;
sbit sw_dir2_dir at TRISD5_bit;
sbit sw_puls2 at RB5_bit;
sbit sw_puls2_dir at TRISB5_bit;
sbit sw_dir3 at RD6_bit;
sbit sw_dir3_dir at TRISD6_bit;
sbit sw_puls3 at RB6_bit;
sbit sw_puls3_dir at TRISB6_bit;
sbit sw_dir4 at RD7_bit;
sbit sw_dir4_dir at TRISD7_bit;
sbit sw_puls4 at RB7_bit;
sbit sw_puls4_dir at TRISB7_bit;
sbit led at RC4_bit;
bit kk1 , kk2 , kk3 , kk4 ;
char x,state1=0 , state2=0 , state3=0 , state4=0 ,puls1=0 , puls2=0 ,puls3=0 , puls4=0 , negative1=0 , negative2=0 ,negative3=0 , negative4=0;
unsigned int time_stop1 , time_stop2 , time_stop3 , time_stop4;
short value1=0 , value2=0 , value3=0 , value4=0;
char *motor_stepper;
void stepper_motor_lift(char *motor_stepper,char no_motor );
void stepper_motor_right(char *motor_stepper,char no_motor);
//Timer0
//Prescaler 1:256; TMR0 Preload = 61; Actual Interrupt Time : 24.96 ms
//Place/Copy this part in declaration section
void InitTimer0()
{
TMR0 = 61;
}
void interrupt()
{
if(RBIF_bit==1)
{
RBIF_bit=0;
if(sw_puls1==1)kk1=1;
if(sw_puls2==1)kk2=1;
if(sw_puls3==1)kk3=1;
if(sw_puls4==1)kk4=1;
}
if (TMR0IF_bit)
{
TMR0IF_bit = 0;
TMR0 = 61;
//Enter your code here
time_stop1++;
time_stop2++;
time_stop3++;
time_stop4++;
}
}
void main()
{
adcon1=6;
trisc.f0=0;
trisc.f1=0;
trisc.f2=0;
trisc.f3=0;
trisc.f4=0;
portc &=0xE0;// off motor3 and off led,
TRISD=0xF0;
portd &=0xF0;// off motor 4
trisa.f0=0;
trisa.f1=0;
trisa.f2=0;
trisa.f3=0;
porta &=0xF0; // off motor 1
trisb=0xF0;
portb &=0xF0;// off motor2
InitTimer0();
OPTION_REG = 0x87;
INTCON = 0xA8;
if(EEPROM_Read(0)!=0xff)puls1=EEPROM_Read(0);
if(EEPROM_Read(1)!=0xff)negative1=EEPROM_Read(1);
if(EEPROM_Read(2)!=0xff)puls2=EEPROM_Read(2);
if(EEPROM_Read(3)!=0xff)negative2=EEPROM_Read(3);
if(EEPROM_Read(4)!=0xff)puls3=EEPROM_Read(4);
if(EEPROM_Read(5)!=0xff)negative3=EEPROM_Read(5);
if(EEPROM_Read(6)!=0xff)puls4=EEPROM_Read(6);
if(EEPROM_Read(7)!=0xff)negative4=EEPROM_Read(7);
delay_ms(100);
for(x=0;x<10;x++){led=1;delay_ms(250); led=0;delay_ms(250);}
led=1;
while(1)
{
if(sw_dir1==1)value1=-1;
else value1=1;
if(sw_dir2==1)value2=-1;
else value2=1;
if(sw_dir3==1)value3=-1;
else value3=1;
if(sw_dir4==1)value4=-1;
else value4=1;
if( kk1==1 )
{
kk1=0;
GIE_bit=0;
time_stop1=0;
if(value1==1)
{
if(puls1>0 && negative1==2){puls1--;state1=2;}
else {puls1++;state1=1; negative1=1;}
}
else if(value1==-1)
{
if(puls1>0 && negative1==1){puls1--;state1=1;}
else {puls1++;state1=2; negative1=2;}
}
if(puls1>=8)puls1=0;
EEPROM_Write(0,puls1);
EEPROM_Write(1,negative1);
GIE_bit=1;
}
if( kk2==1 )
{
kk2=0;
GIE_bit=0;
time_stop2=0;
if(value2==1)
{
if(puls2>0 && negative2==2){puls2--;state2=2;}
else {puls2++;state2=1; negative2=1;}
}
else if(value2==-1)
{
if(puls2>0 && negative2==1){puls2--;state2=1;}
else {puls2++;state2=2; negative2=2;}
}
if(puls2>=8)puls2=0;
EEPROM_Write(2,puls2);
EEPROM_Write(3,negative2);
GIE_bit=1;
}
if( kk3==1 )
{
kk3=0;
GIE_bit=0;
time_stop3=0;
if(value3==1)
{
if(puls3>0 && negative3==2){puls3--;state3=2;}
else {puls3++;state3=1; negative3=1;}
}
else if(value3==-1)
{
if(puls3>0 && negative3==1){puls3--;state3=1;}
else {puls3++;state3=2; negative3=2;}
}
if(puls3>=8)puls3=0;
EEPROM_Write(4,puls3);
EEPROM_Write(5,negative3);
GIE_bit=1;
}
if( kk4==1 )
{
kk4=0;
GIE_bit=0;
time_stop4=0;
if(value4==1)
{
if(puls4>0 && negative4==2){puls4--;state4=2;}
else {puls4++;state4=1; negative4=1;}
}
else if(value4==-1)
{
if(puls4>0 && negative4==1){puls4--;state4=1;}
else {puls4++;state4=2; negative4=2;}
}
if(puls4>=8)puls4=0;
EEPROM_Write(6,puls4);
EEPROM_Write(7,negative4);
GIE_bit=1;
}
if( state1==1)
{
state1=0;
stepper_motor_lift(&porta,1);
}
else if( state1==2)
{
state1=0;
stepper_motor_right(&porta,1);
}
if( state2==1)
{
state2=0;
stepper_motor_lift(&portb,2);
}
else if( state2==2)
{
state2=0;
stepper_motor_right(&portb,2);
}
if( state3==1)
{
state3=0;
stepper_motor_lift(&portc,3);
}
else if( state3==2)
{
state3=0;
stepper_motor_right(&portc,3);
}
if( state4==1)
{
state4=0;
stepper_motor_lift(&portd,4);
}
else if( state4==2)
{
state4=0;
stepper_motor_right(&portd,4);
}
if(time_stop1> 20 )
{
porta &=0xF0 ;// OFF motor
}
if(time_stop2> 20 )
{
portb &=0xF0 ;// OFF motor
}
if(time_stop3> 20 )
{
portc &=0xF0 ;// OFF motor
}
if(time_stop4> 20 )
{
portd &=0xF0 ;// OFF motor
}
}
}
//*******************************************//
void stepper_motor_lift(char *motor_stepper,char no_motor )
{
char pluses1=0;
*motor_stepper &=0xF0;
if(no_motor==1)pluses1=puls1;
else if(no_motor==2)pluses1=puls2;
else if(no_motor==3)pluses1=puls3;
else if(no_motor==4)pluses1=puls4;
switch(pluses1)
{
case 0 :*motor_stepper |=9; break;
case 1 :*motor_stepper |=1;break; //-45
case 2 :*motor_stepper |=3;break; //-90
case 3 :*motor_stepper |=2;break; //-135
case 4 :*motor_stepper |=6;break; //-180
case 5 :*motor_stepper |=4;break; //-225
case 6 :*motor_stepper |=12;break;//-270
case 7 :*motor_stepper |=8;break;//-315
default:break;
}
}
//*********************************************//
void stepper_motor_right(char *motor_stepper,char no_motor)
{
char Pulses2=0;
*motor_stepper &=0xF0;
if(no_motor==1)Pulses2=puls1;
else if(no_motor==2)Pulses2=puls2;
else if(no_motor==3)Pulses2=puls3;
else if(no_motor==4)Pulses2=puls4;
switch(Pulses2)
{
case 0:*motor_stepper |=9;break; //0
case 1:*motor_stepper |=8;break; //45
case 2:*motor_stepper |=12;break; //90
case 3:*motor_stepper |=4;break; //135
case 4:*motor_stepper |=6;break; //180
case 5:*motor_stepper |=2;break; //225
case 6:*motor_stepper |=3;break; //270
case 7:*motor_stepper |=1;break;//315
default:break;
}
}
http://up.top4top.net/downloadf-top4...4f711-rar.html
حيث عند أنقطاع التيار الكهربائي فأن موقع المحركات سيتم أحتفاظ بها اي اذا كان محرك بقى واقف على زاويه 135 درجه فعند أنقطاع التيار الكهربائي وعودته من جديد فأن برنامج سيبقى محافظ على اخر خطوه وصل بها المحرك
تحياتي