شرح الكود room1
حيث هنا أعطينا عنوان 1 لغرفه1
كود:
RS485Slave_Init(1); // Intialize MCU as slave, address 1
ثم هيئنه منكامله 74hc595 واخبرناها لديه ايسي واحد فقط
ثم عملنا لها تصفير للمتكامله 74hc595
كود:
for(x=0;x<8;x++)ic_74hc595(x+1,0,&load);// reset output;
فعلنا انتربت عن طريق البروتوكول uart
كود:
RCIE_bit = 1; // enable interrupt on UART1 receive
TXIE_bit = 0; // disable interrupt on UART1 transmit
PEIE_bit = 1; // enable peripheral interrupts
GIE_bit = 1; // enable all interrupts
ثم نقرأ من ايبروم حيث خزنا فيها حاله الحمل
كود داله
كود:
void load_from_eeprom()
{
if(eeprom_read(0)==100)for(x=0;x<8;x++) state_flag[x]=EEPROM_Read(x+1);
if(state_flag[0]==1)all_load |=1;
else all_load &=0xFE;
if(state_flag[1]==1)all_load |=2;
else all_load &=0xFD;
if(state_flag[2]==1)all_load |=4;
else all_load &=0xFB;
if(state_flag[3]==1)all_load |=8;
else all_load &=0xF7;
if(state_flag[4]==1)all_load |=16;
else all_load &=0xEF;
if(state_flag[5]==1)all_load |=32;
else all_load &=0xDF;
if(state_flag[6]==1)all_load |=64;
else all_load &=0xBF;
if(state_flag[7]==1)all_load |=128;
else all_load &=0x7F;
}
بالبدايه نفحص العنوان 0 من ذاكره ايبروم فأذا كان==100 معناه توجد بيانات تمت خزنها
اما منغير all_load فهو يسجل حاله حمل هل هو ON او OFF
على سبيل مثال حمل رقم 4
اذا كان علم [state_flag[3 يساوي 1 اذن اجعل بت رقم 4 من متغير all_load يساوي =1 اما اذا كان [state_flag[3 يساوي 0 اذن اجعل بت رقم 4 من متغير all_load يساوي 0
لكي يساوي 1 اكتب all_load |=8 اي اعمل OR مع 0b00001000
لكي يساوي 0 اكتب all_load &=0xF7 اي اعمل & مع 0b11110111
وهكذا للبقيه
اما هذا الكود فهو يخص السويجات
كود:
if(sw_load1==0) old_state[0]=1;
if(sw_load2==0) old_state[1]=1;
if(sw_load3==0) old_state[2]=1;
if(sw_load4==0) old_state[3]=1;
if(sw_load5==0) old_state[4]=1;
if(sw_load6==0) old_state[5]=1;
if(sw_load7==0) old_state[6]=1;
if(sw_load8==0) old_state[7]=1;
كود:
if(sw_load1 && old_state[0]==1 )
{
old_state[0]=0;
if(state_flag[0]==0)codeing=11;
else codeing=10;
}
if(sw_load2 && old_state[1]==1)
{
old_state[1]=0;
if(state_flag[1]==0)codeing=21;
else codeing=20;
}
if(sw_load3 && old_state[2]==1)
{
old_state[2]=0;
if(state_flag[2]==0)codeing=31;
else codeing=30;
}
if(sw_load4 && old_state[3]==1)
{
old_state[3]=0;
if(state_flag[3]==0)codeing=41;
else codeing=40;
}
if(sw_load5 && old_state[4]==1)
{
old_state[4]=0;
if(state_flag[4]==0)codeing=51;
else codeing=50;
}
if(sw_load6 && old_state[5]==1)
{
old_state[5]=0;
if(state_flag[5]==0)codeing=61;
else codeing=60;
}
if(sw_load7 && old_state[6]==1)
{
old_state[6]=0;
if(state_flag[6]==0)codeing=71;
else codeing=70;
}
if(sw_load8 && old_state[7]==1)
{
old_state[7]=0;
if(state_flag[7]==0)codeing=81;
else codeing=80;
}
if(sw_All_load_on==0)
{
codeing=251;
delay_ms(250);
}
if(sw_All_load_off==0)
{
codeing=250;
delay_ms(250);
}
فمثلا اضغط على سويج sw_load1 فان flag الذي اسمه old_state[1]=1 وبتالي مهما كنت ضاغط على سويج لن ينفذ الامر الا بعد ازاله يدك عنه
حيث
كود:
if(sw_load1 && old_state[0]==1 )
{
old_state[0]=0;
if(state_flag[0]==0)codeing=11;
else codeing=10;
}
لكل حمل له كود معين فالسهوله قلت هكذا 11 او 10
الرقم على اليمين هو رقم حمل والرقم على اليسار هو حاله الحمل مثلا
11 يعني اعطي امر تشغيل للحمل رقم 1 و 10 قم بأطفاء حمل رقم 1
مثلا 81 يعني شغل حمل رقم 8 و 80 اطفئ حمل رقم 8
وهكذا
اما كود التالي فهو يستقبل نفس الشفرات موجوده في سويجات وهذه شفرات يستقبلها من ماستر الرئيسي
كود:
void interrupt()
{
RS485Slave_Receive(dat);
}
اما
فهو يتفحص هل هناك امر من سويجات او من ماستر
كود:
void check_load()
{
char state_load=0;
if(codeing !=0)
{
state_load=codeing;
codeing=0;
}
else
{
if (dat[5]) { // if an error detected, signal it by
dat[5] = 0;
}
if (dat[4]) { // upon completed valid message receive
dat[4] = 0; // data[4] is set to 0xFF
state_load=dat[2];
}
}
switch(state_load)
{
case 11: state_flag[0]=1;all_load |=1;send_data(1,1);break;
case 10: state_flag[0]=0;all_load &=0xFE;send_data(1,0);break;
case 21: state_flag[1]=1;all_load |=2;send_data(2,1);break;
case 20: state_flag[1]=0;all_load &=0xFD;send_data(2,0);break;
case 31: state_flag[2]=1;all_load |=4;send_data(3,1);break;
case 30: state_flag[2]=0;all_load &=0xFB;send_data(3,0);break;
case 41: state_flag[3]=1;all_load |=8;send_data(4,1);break;
case 40: state_flag[3]=0;all_load &=0xF7;send_data(4,0);break;
case 51: state_flag[4]=1;all_load |=16;send_data(5,1);break;
case 50: state_flag[4]=0;all_load &=0xEF;send_data(5,0);break;
case 61: state_flag[5]=1;all_load |=32;send_data(6,1);break;
case 60: state_flag[5]=0;all_load &=0xDF;send_data(6,0);break;
case 71: state_flag[6]=1;all_load |=64;send_data(7,1);break;
case 70: state_flag[6]=0;all_load &=0xBF;send_data(7,0);break;
case 81: state_flag[7]=1;all_load |=128;send_data(8,1);break;
case 80: state_flag[7]=0;all_load &=0x7F;send_data(8,0);break;
case 251:all_load=0xFF;for(x=0;x<8;x++)state_flag[x]=1 ;for(x=0;x<8;x++)ic_74hc595(x+1,1,&load); send_data(255,0);break;
case 250:all_load=0;for(x=0;x<8;x++)state_flag[x]=0; for(x=0;x<8;x++)ic_74hc595(x+1,0,&load);send_data(255,0);break;
default: break;
}
codeing=0;
}
هنا تلاحظ هذا الكود لقراءه الكود من سويجات في حاله الضغط عليها
كود:
if(codeing !=0)
{
state_load=codeing;
codeing=0;
}
متغير codeing هو فقط لتميز بين اذا اشاره جاءت من سويجات او ماستر عبر بروتوكول RS485
اما لقراءه الشفره من RS485
كود:
if (dat[4]) { // upon completed valid message receive
dat[4] = 0; // data[4] is set to 0xFF
state_load=dat[2];
}
اما كود switch هو لتنفيذ الامر وحسب الشفره
مثلا تشغيل حمل 1
كود:
case 11: state_flag[0]=1;all_load |=1;send_data(1,1);break;
هنا جعلنا state_flag[0]=1 وجعلنا متغير all_load |=1 للدلاله على ان حمل أشتغل ومن ثم نستدعي الداله send_data