السلام عليكم
بسم تعالى:
ملف مرفق في مشاركه السابقه تجدون مشروعين الاول لتحكم بمحركات الستيبر ومشروع اخر مرسل النبضات يعني بدون الحاجه للكمبيوتر
كود:
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;
sbit led_eeprom at RE0_bit;
sbit sw_reset_eeprom at RE1_bit;
sbit full_half_mode at RE2_bit;
bit kk1 , kk2 , kk3 , kk4 ;
char x,state1=0 , state2=0 , state3=0 , state4=0 ;
unsigned int time_stop1 , time_stop2 , time_stop3 , time_stop4 , time_reset_eprom;
short value1=0 , value2=0 , value3=0 , value4=0 ,puls1=0 , puls2=0 ,puls3=0 , puls4=0, flag_reset_eeprom=0 ;
char *motor_stepper;
void stepper_motor(char *motor_stepper,char no_motor );
//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 100 ms
//Place/Copy this part in declaration section
void InitTimer1(){
T1CON = 0x31;
TMR1IF_bit = 0;
TMR1H = 0x0B;
TMR1L = 0xDC;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
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 (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0x0B;
TMR1L = 0xDC;
//Enter your code here
time_stop1++;
time_stop2++;
time_stop3++;
time_stop4++;
if(flag_reset_eeprom==1)time_reset_eprom++;
}
}
void main()
{
adcon1=6;
cmcon=7;
trisc.f0=0; // output
trisc.f1=0; // output
trisc.f2=0;// output
trisc.f3=0; // output
trisc.f4=0; // output
portc &=0xE0;// off motor3 and off led,
TRISD=0xF0;
portd &=0xF0;// off motor 4
trisa.f0=0;// output
trisa.f1=0;// output
trisa.f2=0;// output
trisa.f3=0;// output
porta &=0xF0; // off motor 1
trisb=0xF0;
portb &=0xF0;// off motor2
TRISE0_bit=0;// output
TRISE1_bit=1;// input
TRISE2_bit=1;// input
led_eeprom=0; //off led_eeprom,
InitTimer1();
INTCON = 0xC8;
// read data from eeprom
if(EEPROM_Read(0)!=0xff)puls1=EEPROM_Read(0);
if(EEPROM_Read(1)!=0xff)puls2=EEPROM_Read(1);
if(EEPROM_Read(2)!=0xff)puls3=EEPROM_Read(2);
if(EEPROM_Read(3)!=0xff)puls4=EEPROM_Read(3);
for(x=0;x<4;x++ )if(EEPROM_Read(x)!= 0xFF)led_eeprom=1;
for(x=0;x<10;x++){
led=0;
delay_ms(250);
led=1;
delay_ms(250);
}
while(1)
{
if(sw_dir1==0)value1=1; // for direction motor1
else value1=-1;
if(sw_dir2==0)value2=1; // for direction motor2
else value2=-1;
if(sw_dir3==0)value3=1; // for direction motor3
else value3=-1;
if(sw_dir4==0)value4=1; // for direction motor4
else value4=-1;
if(sw_reset_eeprom==1)flag_reset_eeprom=1;// reset eeprom
else { time_reset_eprom=0; flag_reset_eeprom=0;}
if(flag_reset_eeprom ==1 && time_reset_eprom >100 ) // 10sec =10000ms/100=100
{
for(x=0;x<4;x++)
{
led_eeprom=1;// flashing led_eeprom to check the eeprom start reset
delay_ms(100);
EEPROM_Write(x,0xFF);
led_eeprom=0;
delay_ms(100);
}
}
if( kk1==1 ) // kk1 mean find puls for motor 1
{
kk1=0;
GIE_bit=0; // disable interrupt
time_stop1=0; // reset timer for off stepper motor
if(puls1%2 !=0 && puls1!=0 && state1==0 && full_half_mode==1)
{
if(value1== 1 )puls1--;
else if(value2== -1 )puls1++;
}
state1=1;
if(value1==1) // rotate to right
{
if(full_half_mode==0) {puls1++; if(puls1>=8)puls1=0;}
else if(full_half_mode==1){ puls1 +=2; if(puls1>=7)puls1=0;}
}
else if(value1==-1)// rotate to lift
{
if(full_half_mode==0) { puls1--; if(puls1<= -1)puls1=7;}
else if(full_half_mode==1){ puls1 -=2;if(puls1<= -1)puls1=6;}
}
EEPROM_Write(0,puls1);
led_eeprom=1;
GIE_bit=1;
}
if( kk2==1 )
{
kk2=0;
GIE_bit=0;
time_stop2=0;
if(puls2%2 !=0 && puls2!=0 && state2==0 && full_half_mode==1)
{
if(value2== 1 )puls2--;
else if(value2== -1 )puls2++;
}
state2=1;
if(value2==1) // rotate to right
{
if(full_half_mode==0) {puls2++; if(puls2>=8)puls2=0;}
else if(full_half_mode==1){ puls2 +=2; if(puls2>=7)puls2=0;}
}
else if(value2==-1)// rotate to lift
{
if(full_half_mode==0) { puls2--; if(puls2<= -1)puls2=7;}
else if(full_half_mode==1){ puls2 -=2;if(puls2<= -1)puls2=6;}
}
EEPROM_Write(1,puls2);
led_eeprom=1;
GIE_bit=1;
}
if( kk3==1 )
{
kk3=0;
GIE_bit=0;
time_stop3=0;
if(puls3%2 !=0 && puls3!=0 && state3==0 && full_half_mode==1)
{
if(value3== 1 )puls3--;
else if(value3== -1 )puls3++;
}
state3=1;
if(value3==1) // rotate to right
{
if(full_half_mode==0) {puls3++; if(puls3>=8)puls3=0;}
else if(full_half_mode==1){ puls3 +=2; if(puls3>=7)puls3=0;}
}
else if(value3==-1)// rotate to lift
{
if(full_half_mode==0) { puls3--; if(puls3<= -1)puls3=7;}
else if(full_half_mode==1){ puls3 -=2;if(puls3<= -1)puls3=6;}
}
EEPROM_Write(2,puls3);
led_eeprom=1;
GIE_bit=1;
}
if( kk4==1 )
{
kk4=0;
GIE_bit=0;
time_stop4=0;
if(puls4%2 !=0 && puls4!=0 && state4==0 && full_half_mode==1)
{
if(value4== 1 )puls4--;
else if(value4== -1 )puls4++;
}
state4=1;
if(value4==1) // rotate to right
{
if(full_half_mode==0) {puls4++; if(puls4>=8)puls4=0;}
else if(full_half_mode==1){ puls4 +=2; if(puls4>=7)puls4=0;}
}
else if(value4==-1)// rotate to lift
{
if(full_half_mode==0) { puls4--; if(puls4<= -1)puls4=7;}
else if(full_half_mode==1){ puls4 -=2;if(puls4<= -1)puls4=6;}
}
EEPROM_Write(3,puls4);
led_eeprom=1;
GIE_bit=1;
}
if( state1==1)
{
state1=0;
stepper_motor(&porta,1);
}
if( state2==1)
{
state2=0;
stepper_motor(&portb,2);
}
if( state3==1)
{
state3=0;
stepper_motor(&portc,3);
}
if( state4==1)
{
state4=0;
stepper_motor(&portd,4);
}
if(time_stop1> 10) // 1 sec = 1000ms ==> 1000/100=10
{
porta &=0xF0 ;// OFF motor1
}
if(time_stop2> 10 )
{
portb &=0xF0 ;// OFF motor2
}
if(time_stop3> 10 )
{
portc &=0xF0 ;// OFF motor3
}
if(time_stop4> 10 )
{
portd &=0xF0 ;// OFF motor4
}
}
}
//*******************************************//
void stepper_motor(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;//1001 0
case 1 :*motor_stepper |=1;break; // 0001 45
case 2 :*motor_stepper |=3;break; //0011 90
case 3 :*motor_stepper |=2;break; //0010 135
case 4 :*motor_stepper |=6;break; //0110 180
case 5 :*motor_stepper |=4;break; //0100 225
case 6 :*motor_stepper |=12;break;//1100 270
case 7 :*motor_stepper |=8;break;//1000 315
default:break;
}
}
============================================
تعريف مداخل أتجاهات والنبضات لاربع محركات
كود:
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;
======================================
تعريف مدخل ليد ايبروم في حاله وجود بيانات مخزونه في ايبروم وكذلك تعريف مدخل سويج ريسيت داتا موجوده في ايبروم
كود:
sbit led_eeprom at RE0_bit;
sbit sw_reset_eeprom at RE1_bit;
=====================================
تعريف مدخل أختيار نوع التحكم هل فول ستيب او هاف ستيب
كود:
sbit full_half_mode at RE2_bit;
======================================
تعريف بتات لمعرفه حاله pulse طبعا لها قيمتين فقط اما 1 او 0 لانها من نوع bit
كود:
bit kk1 , kk2 , kk3 , kk4 ;
==========================================
تعريف متغيرات لغرض تبين حاله اي محرك نريد تشغيله طبعا كل متغير يخص محرك
كود:
state1=0 , state2=0 , state3=0 , state4=0
==========================================
تعريف متغيرات من نوع int لغرض أحتساب الزمن من اخر نبضه تم أستلامها لغرض بعد هذا الزمن يتم أطفاء محرك وعدم بقاء فولتيه على احدى ملفات المحرك
لانه اخر نبضه سوف تبقى أحدى ملفات شغاله ولهذا يجب جعل البورت المخصص لتشغيل محرك =0
كود:
time_stop1 , time_stop2 , time_stop3 , time_stop4
===========================================
تعريف متغيرات لغرض تشغيل محرك وفق ترتيب الصحيح لتسلسل الخطوات
كود:
puls1=0 , puls2=0 ,puls3=0 , puls4=0
=========================================
تعريف المتغيرات لمعرفه حاله الاتجاه
كود:
value1=0 , value2=0 , value3=0 , value4=0
========================================
تعريف مؤشر لغرض أختيار اي بورت نريد وبتالي نضع كود واحد ومن ثم نضع مؤشر يشير الى بورت الي نريد اخراج نبضات عليه
كود:
char *motor_stepper;
=============================================
تعريف تايمر1 ليعمل انتربت كل 100ms
كود:
//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 100 ms
//Place/Copy this part in declaration section
void InitTimer1(){
T1CON = 0x31;
TMR1IF_bit = 0;
TMR1H = 0x0B;
TMR1L = 0xDC;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
=========================================
في داله الانتربت يوجد حالتين تسببان أنتربت
اولى عن طريق البورت وبتالي خصصت للنبضات فعندما يتغير حاله على بورت B من 0 الى 1 يحدث أنتربت طبعا في هذه الحاله ان بنات مخصصه لحدوث أنتربت هي فقط RB4 , RB5 , RB6, RB7
وبتالي لما يحدث انتربت عن طريق بورت B وفق البنات pins الي تبدء من 4 الى 7 يجب علينا أختبار اي بت أصبح =1 وفق هذا سنعرف اي محرك نريد تشغيله عن طريق جعل البت مقابل للمحرك=1
ملاحظه مهمه كل متغير امامه 1 فهو يخص محرك رقم 1 و 2 يخص محرك 2 و3 يخص محرك 3 و4 يخص محرك 4 لذا بالكود ستجدوني أكتفي بشرح عن محرك واحد والبقيه سيكون نفس مبدأ او الكود
كود:
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;
}
اما الانتربت الثاني يكون عن طريق تايمر1 وطبعا مهمه كل متغير أطفاء محرك مخصص له
كود:
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0x0B;
TMR1L = 0xDC;
//Enter your code here
time_stop1++;
time_stop2++;
time_stop3++;
time_stop4++;
if(flag_reset_eeprom==1)time_reset_eprom++;
}