|
شكراً جزيلاً أخي حسن لسرعة ردك.
بالنسبة للكود أنا جربت الكود الثاني ولم يعمل بصراحة ولاأعرف لماذا.
أنا أريد كود لثلاث محركات فالألة يوجد بها ثلاث محاور وكل محول يقوده محرك لذلك أنا أريد نفس الفكرة التي أرسلت صورتها ولكن مضاعفة ثلاث مرات.
وأيضاً أخي أنا أريد أنهُ عندما تصلها نبضة أن تعمل فوراً ولاتنتظر ولا حتى 1ميلي ثانية وعند إنتهاء النبضات تنتظر 3ثواني وبعدها تفصل المخرج.
النبضات التي ستتلقاها البيك هيَ سالبة وليست موجبة.
أتمنى أن تكون الأن الفكرة قد إكتملت لديك,جرب الكود اللذي أرسلته قبل عدت رسائل وهذا اللذي أريده بالضبط والكود عمل ولكن أريد أن ينتظر 3ثانية قبل فصل المخرج.
|
تفضل هذا لثلاث محركات
كود:
sbit motor1 at RA0_bit;
sbit motor1_dir at TRISA0_bit;
sbit motor2 at RA1_bit;
sbit motor2_dir at TRISA1_bit;
sbit motor3 at RA2_bit;
sbit motor3_dir at TRISA2_bit;
unsigned int time1_stop , time2_stop,time3_stop;
unsigned char flag1_run, flag2_run=0 ,flag3_run=0 ;
#define OFF 1
#define ON 0
//Timer1
//Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms
//Place/Copy this part in declaration section
void InitTimer1(){
T1CON = 0x11;
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void Interrupt()
{
if(RBIF_bit==1 )
{
RBIF_bit=0;
if(RB4_bit==1)
{
motor1=ON; // Run motor
time1_stop=0;// reset time
flag1_run=1;
}
if(RB5_bit==1)
{
motor2=ON; // Run motor
time2_stop=0;// reset time
flag2_run=1;
}
if(RB6_bit==1)
{
motor3=ON; // Run motor
time3_stop=0;// reset time
flag3_run=1;
}
}
if (TMR1IF_bit)
{
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
//Enter your code here
if(flag1_run==1) time1_stop++;
if(flag2_run==1) time2_stop++;
if(flag3_run==1) time3_stop++;
}
}
void main()
{
cmcon=7;
InitTimer1();
TRISB4_bit=1;
TRISB5_bit=1;
TRISB6_bit=1;
motor1_dir=0;
motor2_dir=0;
motor3_dir=0;
motor1=OFF;
motor2=OFF;
motor3=OFF;
RBIE_bit=1;//Enables the RB port change Interrupt
RBIF_bit=0;//When at least one of the RB<7:4> pins changes state (must be cleared in software)
while(1)
{
if(flag1_run==1 && time1_stop>=60)// mean time>=3000ms=3s
{
flag1_run=0;
time1_stop=0;
motor1=OFF;
}
if(flag2_run==1 && time2_stop>=60)// mean time>=3000ms=3s
{
flag2_run=0;
time2_stop=0;
motor2=OFF;
}
if(flag3_run==1 && time3_stop>=60)// mean time>=3000ms=3s
{
flag3_run=0;
time3_stop=0;
motor3=OFF;
}
}
}
ملاحظات //
1- يتم ربط نبضات على RB4 وهذا بدوره يشغل محرك 1 مربوط على RA0
2- يتم ربط نبضات على RB5 وهذا بدوره يشغل محرك 2 مربوط على RA1
3- يتم ربط نبضات على RB6 وهذا بدوره يشغل محرك 3 مربوط على RA2
4- يتم ربط مقاومه 10k مع RB4 و RB5 و RB6 من نوع pull down
5- اذا كانت نوع نبضه مرسله من كومبيوتر هي من 0 الى 1 فهنا يحتاج البيك الى دائره NOT لانه الانتربت يعتمد على 1 يعني لما تصل 1 الى RB4 او RB5 او RB6 يحدث الانتربت
ممكن صوره النبضات الى ترسل للبيك لوضع دائره مقترحه
طبعا هي تعمل ولكن ربما سوف تخسر نبضه واحده