هذا كود تحت التجربه وهو كود عام لعدد من مصابيح
يتمم التحكم بها عن طريق ثلاثه أزرار و سفن سكمنت حيث يضغط على مفتاح choice_light وتختار رقم مصباح ومنها يتم التحكم بمصباح
هذه طريقه اختيار السويجات قابله للتغير وفق مايريده المبرمج
المهم في الامر كود التحكم في مصابيح
صراحه لاأعرف مدى أستقراريه الكود ولكن وفق مارأيته على البروتيس انه يعمل اي يرسل نبضات بشكل الجيد
كود:
#define Check_bit(var,pos) (var&(1<<pos))
bit oldstate1 ,oldstate2 ,oldstate3;
sbit sw_inc at RA3_bit;
sbit sw_inc_dir at TRISA3_bit;
sbit sw_dec at RA4_bit;
sbit sw_dec_dir at TRISA4_bit;
sbit sw_choice_light at RA5_bit;
sbit sw_choice_light_dir at TRISA5_bit;
sbit trigger1 at RB1_bit;
sbit trigger1_dir at TRISB1_bit;
sbit trigger2 at RB2_bit;
sbit trigger2_dir at TRISB2_bit;
sbit trigger3 at RB3_bit;
sbit trigger3_dir at TRISB3_bit;
sbit trigger4 at RB4_bit;
sbit trigger4_dir at TRISB4_bit;
sbit trigger5 at RB5_bit;
sbit trigger5_dir at TRISB5_bit;
sbit trigger6 at RB6_bit;
sbit trigger6_dir at TRISB6_bit;
sbit led_check at RB7_bit;
sbit led_check_dir at TRISB7_bit;
sbit ds at RA1_bit;
sbit sh_cp at RA0_bit ;
sbit st_cp at RA2_bit ;
sbit ds_dir at TRISA1_bit;
sbit sh_cp_dir at TRISA0_bit;
sbit st_cp_dir at TRISA2_bit;
char zero_crosing=0 ,x ,state=0, state_switch=1,light=0,y ,kk=0;
const char no_light=3;
unsigned int time=0 ;
char send_trigger[no_light];
unsigned int ratio_light[]={2000,1000,4000 };
const char segment[]={63,6,91,79,102,109,125,7,127,111}; //for CC
void check_min_max_value();
//Timer0
//Prescaler 1:128; TMR0 Preload = 100; Actual Interrupt Time : 19.968 ms
//Place/Copy this part in declaration section
void InitTimer0()
{
OPTION_REG = 0x86;
TMR0 = 100;
}
void interrupt()
{
if(INTCON.INTF)
{
INTCON.INTF=0;
tmr0=100;
zero_crosing=1;
kk=0;
}
if (TMR0IF_bit)
{
TMR0IF_bit = 0;
TMR0 = 100;
//Enter your code here
}
}
void main()
{
sw_dec_dir=1; // input
sw_inc_dir=1; // input
sw_choice_light_dir=1;
ds_dir=0;
sh_cp_dir=0;
st_cp_dir=0;
trisb=1;
trigger1=0;
trigger2=0;
trigger3=0;
trigger4=0;
trigger5=0;
trigger6=0;
led_check=0;//led off
oldstate1=0;
oldstate2=0;
oldstate3=0;
intcon=0xB0;
InitTimer0();
//for( x=0;x<6;x++) {led_check=~led_check; delay_ms(500); }
while(1)
{
if(zero_crosing)
{
led_check=1;
time=0;
if(state_switch==1 && kk==0)
{
check_min_max_value() ;
state_switch=0;
}
state=send_trigger[kk];
if(state==1)
{
kk++;
while(time<ratio_light[0]) time=128*(tmr0-100);
led_check=0;
trigger1=1;
delay_us(100);
trigger1=0;
}
else if(state==2)
{
kk++;
while(time<ratio_light[1]) time=128*(tmr0-100);
led_check=0;
trigger2=1;
delay_us(100);
trigger2=0;
}
else if(state==3)
{
kk++;
while(time<ratio_light[2]) time=128*(tmr0-100);
led_check=0;
trigger3=1;
delay_us(100);
trigger3=0;
}
if(kk==no_light)
{
zero_crosing=0;
kk=0;
}
}
//Button to decrease the voltage
if(sw_dec) oldstate1=1;
if(!sw_dec && oldstate1)
{
switch(light)
{
case 1: if(ratio_light[0]>500)ratio_light[0] -=250; break;
case 2: if(ratio_light[1]>500)ratio_light[1] -=250; break;
case 3: if(ratio_light[2]>500)ratio_light[2] -=250; break;
default : break;
}
state_switch=1;
oldstate1 = 0;
}
//Button to increase the voltage
if(sw_inc) oldstate2=1;
if(!sw_inc && oldstate2)
{
switch(light)
{
case 1: if(ratio_light[0]<8500)ratio_light[0] +=250; break;
case 2: if(ratio_light[1]<8500)ratio_light[1] +=250; break;
case 3: if(ratio_light[2]<8500)ratio_light[2] +=250; break;
default : break;
}
oldstate2 = 0;
state_switch=1;
}
if (sw_choice_light)oldstate3=1;
if(!sw_choice_light && oldstate3)
{
light++;
if(light==no_light+1){light=0;}
for (x=0;x<8;x++)
{
if(Check_bit(segment[light],7-x))DS=1;
else DS=0;
sh_cp = 0; sh_cp = 1;
}
st_cp=0; st_cp=1;
oldstate3=0;
}
}
}
//**************************************//
void check_min_max_value()
{
for(x=0;x<no_light;x++)ratio_light[x] +=(3*x);
for(y=0;y<no_light;y++)
{
send_trigger[y]=0;
// 6000,500,2000 ,4000 ,3000,1900
for(x=0;x<no_light;x++)
{
if(ratio_light[y]> ratio_light[x] && (x !=y))
{
send_trigger[y] +=1;
}
}
send_trigger[y] +=1;
}
}
ملاحظه فكره تكمن في هذا الكود
كود:
void check_min_max_value()
{
for(x=0;x<no_light;x++)ratio_light[x] +=(3*x);
for(y=0;y<no_light;y++)
{
send_trigger[y]=0;
for(x=0;x<no_light;x++)
{
if(ratio_light[y]> ratio_light[x] && (x !=y))
{
send_trigger[y] +=1;
}
}
send_trigger[y] +=1;
}
}
مثلا عندي هذه النسب التحويل
5000 2000 3000
لكي تعمل مصابيح بشكل صحيح لازم أبدء بمصباح اقل نسبه ثم أعلى منه ثم أعلى وهكذا
لهذا لو ترجع للكود التالي
كود:
state=send_trigger[kk];
if(state==1)
{
kk++;
while(time<ratio_light[0]) time=128*(tmr0-100);
led_check=0;
trigger1=1;
delay_us(100);
trigger1=0;
}
else if(state==2)
{
kk++;
while(time<ratio_light[1]) time=128*(tmr0-100);
led_check=0;
trigger2=1;
delay_us(100);
trigger2=0;
}
else if(state==3)
{
kk++;
while(time<ratio_light[2]) time=128*(tmr0-100);
led_check=0;
trigger3=1;
delay_us(100);
trigger3=0;
}
لتشاهد ان كل state تتحكم بمصباح معين مثلا state=1 يعني اريد التحكم بمصباح 1 واذا كانت state=2 يعني اريد التحكم بمصباح 2 وهكذا
اذن مهمه هي لازم ارسال نبضات للمصابيح وفق النسب الاضاءه
نرجع الى الارقام
5000 2000 3000
اولا راح اقارن 3000 مع 2000 هل 3000 اكبر من 2000 طبعا لا
ومن ثم يقارن 3000 مع 5000 طبعا 5000 اكبر اذن راح تزداد [send_trigger[y بمقدار 1
وفي النهايه نزيد مصفوفه send_trigger[y] بواحد لاننا لانريد البدء من الصفر لكون اقل قيمه لــ state=1
يعني 3000 وهي تعني 3ms ويكون ترتيب هذا مصباح يكون الثاني
ومن ثم نكرر العمليه لــ 2000 وعندها نحصل على ترتيب مصباح يكون الاول
ومن ثم نكرر العمليه لــ 5000 وعندها نحصل على ترتيب مصباح يكون الثالث
اي نرسل النبضه لــ 2000 بأعتباره الاول ومن ثم نرسل لــ 3000 بأعتباره الثاني ومن ثم نرسل النبضه لــ 5000 بأعتباره الثالث
ملاحظه مهمه هذا الكود
كود:
for(x=0;x<no_light;x++)ratio_light[x] +=(3*x);
هو لغرض الضمان عدم تساوي النسب من اجل عمل مقارنه بشكل صحيح
مثلا نسبه مصباح الاول 2000 والثاني 2000 هنا البرنامج لايعمل بشكل صحيح فقمت بهذه الخطوه وهي اضافه مثلا 3*x وطبعا هذه عشوائيه ولن تؤثر على نسبه مصباح ولكن تغير قيمه لغرض عمل البرنامج بشكل سليم
حيث تصبح 2000+3*0=2000 ,, 2000+3*1=2003 وهنا أصبحت 2000 لاتساوي 2003 اي نسبه مصباحين أصبحا غير متساوين
اما اذا لم أستخدم هذا الكود سوف تختفي النبضه لاحدى مصابيح ويرسل مايكرو نبضتين للمصباح اخر
تذكر الكود قابل للتغير وليس نهائي ولكن يحتاج الى التجربه قبل التحديث