|
الاستاذ/حسن جزاك اللة خيرا ولو ممكن شرح لكود الاستقبال
|
السلام عليكم
كود:
// Manchester module connections
sbit MANRXPIN at RB0_bit;
sbit MANRXPIN_Direction at TRISB0_bit;
// End Manchester module connections
// define all leds
sbit led1 at RC0_bit;
sbit led2 at RC1_bit;
sbit led3 at RC2_bit;
sbit led4 at RC3_bit;
sbit led5 at RC4_bit;
sbit led6 at RC5_bit;
sbit led7 at RC6_bit;
sbit led8 at RC7_bit;
sbit led_ok at RD0_bit;
sbit led_ok_dir at trisd0_bit;
#define on 1
#define off 0
const char divce_address=10;
char error, ErrorCount, temp , kk[2], cont=0 , data_recived=0;
void main()
{
adcon1=6;
trisc=0;
led_ok_dir=0;
trisa=0;
portc=0;
portd=0;
porta=0;
ErrorCount = 0;
Man_Receive_Init(); // Initialize Receiver
while (1) { // Wait for the "start" byte
temp = Man_Receive(&error); // Attempt byte receive
if (temp == 0) // "Start" byte, see Transmitter example
break; // We got the starting sequence
if (error) // Exit so we do not loop forever
break;
}
while (1) { // Endless loop
temp = Man_Receive(&error); // Attempt byte receive
if (error) { // If error occured
ErrorCount++; // Update error counter
if (ErrorCount > 20) { // In case of multiple errors
temp = Man_Synchro(); // Try to synchronize again
ErrorCount = 0; // Reset error counter
}
}
if(temp==0)led_ok=1;
if(data_recived==0)
{
switch(cont) {
case 0:if(temp==divce_address)cont=1;
else cont=0;
break;
case 1:if(temp== ~divce_address)cont=2;
else cont=0;
break;
case 2:kk[0]=temp;
cont=3;
break;
case 3:kk[1]=temp;
if(kk[0]== ~kk[1]) data_recived=1;
cont=0;
break;
}
}
if(data_recived==1)
{
data_recived=0;
switch(kk[0])
{
case 1:led1=on;break;
case 11:led1=off;break;
case 2:led2=on;break;
case 21:led2=off;break;
case 3:led3=on;break;
case 31:led3=off;break;
case 4:led4=on;break;
case 41:led4=off;break;
case 5:led5=on;break;
case 51:led5=off;break;
case 6:led6=on;break;
case 61:led6=off;break;
case 7:led7=on;break;
case 71:led7=off;break;
case 8:led8=on;break;
case 81:led8=off;break;
}
kk[0]=0;
}
}
}
============================================
تعريف طرف الاستقبال لمانشيستر كود
كود:
// Manchester module connections
sbit MANRXPIN at RB0_bit;
sbit MANRXPIN_Direction at TRISB0_bit;
=================================================
تعريف ليدات
كود:
// define all leds
sbit led1 at RC0_bit;
sbit led2 at RC1_bit;
sbit led3 at RC2_bit;
sbit led4 at RC3_bit;
sbit led5 at RC4_bit;
sbit led6 at RC5_bit;
sbit led7 at RC6_bit;
sbit led8 at RC7_bit;
sbit led_ok at RD0_bit;
sbit led_ok_dir at trisd0_bit;
يعني مثلا led1 هو نفسه RC0_bit اي بدلا من كتابه RC0_bit اكتب مكانه led1 وهذه طريقه لها فوائد منها
1- استطيع تغير led1 على اي رجل اريده مثلا كان led1 مربوط على RC1 واردت أغيره الى RC5 فأنه يتم كتابه كتالي
sbit led1 at RC5_bit
================================================
تعريف ON , OFF
كود:
#define on 1
#define off 0
وبتالي بدلا من اكتب 0 اكتب OFF و كذلك بدلا من كتابه 1 اكتب ON
هذا فقط لجعل كود مفهوم أكثر
==========================================
الالغاء خاصيه انلوك وجعل جميع الاطراف ديجيتل
=======================================
أجعل جميع البورتان مخارج
كود:
trisc=0;
led_ok_dir=0;
trisa=0;
portc=0;
portd=0;
porta=0;
=======================================
تعريف استقبال اشاره بأستخدام مانشيستركود
=========================================
هذا الكود لضمان التهيئه استقبال اشاره ولكن يمكن حذفه
كود:
while (1) { // Wait for the "start" byte
temp = Man_Receive(&error); // Attempt byte receive
if (temp == 0) // "Start" byte, see Transmitter example
break; // We got the starting sequence
if (error) // Exit so we do not loop forever
break;
}
============================================
الان ندخل في لوب مستمر ونقرا البيانات بأستمرار
كود:
temp = Man_Receive(&error); // Attempt byte receive
هذا الكود مهم في حاله حصول error في قراءه يتم عمل مزامنه من جديد عند تكرار أخطاء
كود:
if (error) { // If error occured
ErrorCount++; // Update error counter
if (ErrorCount > 20) { // In case of multiple errors
temp = Man_Synchro(); // Try to synchronize again
ErrorCount = 0; // Reset error counter
}
}
================================
كود:
if(temp==0)led_ok=1;
طبعا هذا الكود لو ترجع قليلا الى كود الارسال لتجد انه اول مايشتغل مرسل يرسل كود 0 فأذا أستقبله دائره الاستقبال سيضيئ ليد لدلاله على ان مرسل ومستقبل يعملان بشكل صحيح (( طبعا يجب تشغيل مرسل ومستقبل في ان واحد ))
=======================================
كود:
if(data_recived==0)
{
switch(cont) {
case 0:if(temp==divce_address)cont=1;
else cont=0;
break;
case 1:if(temp== ~divce_address)cont=2;
else cont=0;
break;
case 2:kk[0]=temp;
cont=3;
break;
case 3:kk[1]=temp;
if(kk[0]== ~kk[1]) data_recived=1;
cont=0;
break;
}
}
data_recived=0 تعني لم يتم أستكمال استقبال البيانات او لم يتم أستلامها اصلا
(switch(cont فيه اربع حالات طبعا لو ترجع الى كود الارسال لتجد اننا ارسلنا شفره متكونه من 4 بايتات وبتالي لابد من قراءتها بشكل صحيح ولكن كيف يتم ذلك
كود:
case 0:if(temp==divce_address)cont=1;
else cont=0;
break;
هذا الكود يعني انه اذا كان بيانات التي تم قراءها هو نفسه عنوان divce_address اذن انتقل الى رقم 1 واذا كان لا قم بتصفير عمليه الى حين قراءه بايت الاول من شفره لنفترض انه تم قراءه بايت الاول اذن نتقل الى case1
كود:
case 1:if(temp== ~divce_address)cont=2;
else cont=0;
break;
هنا اذا تم قراءه بايت الثاني من كود نتقل الى case2 واذا لم تكن قراءه هو نفس بايت الثاني نصفر عمليه ونعتبر شفره خاطئه ونعيد عمليه من جديد
ولنفترض انه تم قراءه البايت الثاني من شفره نتقل الى case2
كود:
case 2:kk[0]=temp;
cont=3;
break;
هنا بعدما قرأنا بايت الاول والثاني بنجاح هنا نقرأ البيانات ونخزنها في [kk[0
ونتقل مباشره الى case3
كود:
case 3:kk[1]=temp;
if(kk[0]== ~kk[1]) data_recived=1;
cont=0;
break;
هنا سنقرأ البايت الرابع ونعمل له نفي فأذا كان يساوي بايت الثالث معناه الكود صحيح ونجعل (flag (data_recived=1
===============================================
هنا سوف يتم تشغيل او اطفاء ليدات حسب كود مخزون في [kk[0
كود:
if(data_recived==1)
{
data_recived=0;
switch(kk[0])
{
case 1:led1=on;break;
case 11:led1=off;break;
case 2:led2=on;break;
case 21:led2=off;break;
case 3:led3=on;break;
case 31:led3=off;break;
case 4:led4=on;break;
case 41:led4=off;break;
case 5:led5=on;break;
case 51:led5=off;break;
case 6:led6=on;break;
case 61:led6=off;break;
case 7:led7=on;break;
case 71:led7=off;break;
case 8:led8=on;break;
case 81:led8=off;break;
}
kk[0]=0;
}