تهيئه مداخل ومخارج وتفعيل الانتربت عن طريق uart وكذلك تهيئه uart و RS485
كود:
TRISA=0xFF;
load1_dir=0; load2_dir=0;load3_dir=0;load4_dir=0;load5_dir=0;
load1=0;load2=0;load3=0;load4=0;load5=0;
UART1_Init(9600); // initialize UART1 module
Delay_ms(100);
RS485Slave_Init(1); // Intialize MCU as slave, address 1
dat[4] = 0; // ensure that message received flag is 0
dat[5] = 0; // ensure that message received flag is 0
dat[6] = 0; // ensure that error flag is 0
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
طبعا يتم استقبال البيانات من ماستر او كارت الرئيسي عن طريق الانتربت وطبعا داتا تخزن في مصفوفه dat
كود:
void interrupt()
{
RS485Slave_Receive(dat);
}
==============================================
طبعا يتم التحكم بالاحمال عن طريق سويجات
كود:
if(sw_load1==0)
{
codeing=1;
delay_ms(250);
}
if(sw_load2==0)
{
codeing=2;
delay_ms(250);
}
if(sw_load3==0)
{
codeing=3;
delay_ms(250);
}
if(sw_load4==0)
{
codeing=4;
delay_ms(250);
}
if(sw_load5==0)
{
codeing=5;
delay_ms(250);
}
طبعا codeing هو ان لكل حمل له كود نحن نضعه فهذه أفضل طريقه لتحكم بالحمل من اكثر من طريقه مثلا عن طريق ريموت كنترول او اي طريقه فأذا وضعنا كود لكل حمل فعندها يصبح الكود عام
لاحظ الشرح ادناه
كود:
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 1: load1=~load1;send_data(1);break;
case 2: load2=~load2;send_data(2);break;
case 3: load3=~load3;send_data(3);break;
case 4: load4=~load4;send_data(4);break;
case 5: load5=~load5;send_data(5);break;
default: break;
}
codeing=0;
}
نلاحظ مايلي اذا كان codeing =0 معناها انه لم نضغط على سويج ام اذا كانت له قيمه غير 0 منعناه ضغطنا على سويج وهنا تأتي مهمه هذا الكود
كود:
if(codeing !=0)
{
state_load=codeing;
codeing=0;
}
اذن نخزن البياتات في متغير سميته state_load
وبعدها
كود:
switch(state_load)
{
case 1: load1=~load1;send_data(1);break;
case 2: load2=~load2;send_data(2);break;
case 3: load3=~load3;send_data(3);break;
case 4: load4=~load4;send_data(4);break;
case 5: load5=~load5;send_data(5);break;
default: break;
}
كود اعلاه واضح فهو يتحكم بالحمل اما تشغيل او أطفاء تلاحظون كل حمل له شفره
يعني 1 للحمل رقم 1 و2 للحمل رقم 2 وهكذا
اما اذا كان codeing =0 معناها لم يتم الضغط على سويج ولكن لربما تم ارسال البيانات من ماستر
كود:
{
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];
}
}
تلاحظون الكود بلون احمر يعني أخزن شفره في state_load طبعا لو ترجعون الى ماستر ستجدون ان الشفره ارسلت في [dat[2 وطبعا الشفره في هذا مشروع هي من 1 الى 5 لكونه عندنا فقط 5 أحمال
هذه داله ترسل البيانات لتحديث معلومات الى ماستر عند كل ضغطه سويج
كود:
dat[0]=1;
dat[1]=0;
dat[2]= data1;
RS485Slave_Send(dat,3);
delay_ms(20);