قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 664
نشاط [ funky112233 ]
قوة السمعة:
قديم 15-02-2013, 12:37 AM المشاركة 9   
افتراضي



بسم الله الرحمن الرحيم

مافيش مانع ان شاء الله انتظر كود المستقبل

بالتوفيق ان شاء الله

اعلانات

lena jebril
:: مهندس ::
تاريخ التسجيل: Feb 2013
المشاركات: 9
نشاط [ lena jebril ]
قوة السمعة:
قديم 15-02-2013, 01:13 AM المشاركة 10   
افتراضي


السلام عليكم

كود المستقبل
// IR Receiver //
// PIC16F877A * 8MHz //
// November 2012 //
////////////////////////

char address_string[5]; // This string is used to display the address on LCD
char command_string[5]; // This string is used to display the command on LCD
unsigned int count = 0 , temp = 0;
unsigned short i = 0, rec_bit = 0, command = 0, address = 0, Data = 0, Duty_Cycle = 192;
void interrupt(){
count++;
TMR0 = 0;
INTCON.TMR0IF = 0;
}

unsigned int get_mark(){
TMR0 = 0;
count = 0;
while(!PORTB.F4);
return TMR0 + 256*count;
}

unsigned short get_Data(short n){
Data = 0;
for(i = 0;i<n;i++){
temp = get_mark();
if(temp<=700 && temp>=500) rec_bit = 0;
else if(temp<=1300 && temp>=1100) rec_bit = 1;
else{ i--;continue;}
Data += rec_bit << i;
}
return Data;
}
/************************************************** **********/
void main(){
TRISB = 0x10;
PORTB = 0x00;
TRISC = 0x00;
PORTC = 0x00;
TRISD = 0x00;
PORTD = 0x00;
OPTION_REG = 0x80;
INTCON = 0xA0;
LCD_Config(&PORTD,2,3,0,7,6,5,4);
LCD_CMD(LCD_CURSOR_OFF);
LCD_CMD(LCD_CLEAR);
LCD_Out(1,4,"Welcome ");
PWM_Init(500);
PWM_Start();
while(1){
PWM_Change_Duty(Duty_Cycle);
command = 0;
address = 0;
temp = get_mark();
if(temp>=2000 && temp<= 3000){
command = get_Data(7);
address = get_Data(5);
if(address==1){

switch(command){
case 0:
PORTB.F0 = ~PORTB.F0;
Duty_Cycle = 255;
break;
case 1:
PORTB.F1 = ~PORTB.F1;
Duty_Cycle = 223;
break;
case 2:
PORTB.F2 = ~PORTB.F2;
Duty_Cycle = 192;
break;
case 3:
PORTB.F3 = ~PORTB.F3;
Duty_Cycle = 128;
break;
default:
break;
}
delay_ms(10);
}
LCD_Out(1,1,"Address : ");
LCD_Out(2,1,"Command : ");
ShortToStr(address,address_string);
LCD_Out(1,11,address_string);
ShortToStr(command,command_string);
LCD_Out(2,11,command_string);
}
}
}

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 664
نشاط [ funky112233 ]
قوة السمعة:
قديم 15-02-2013, 01:51 AM المشاركة 11   
افتراضي


بسم الله الرحمن الرحيم

هذا مثال لزر واحد

كود:
case 0:
                          PORTB.F0 = ~PORTB.F0;
                          Duty_Cycle = 255;
                          delay_ms(20);PWM1_Start();delay_ms(10);PWM1_Stop();
                          break;
وهنا بعد ان يتم الاستلام بنجاح ويتم تنفيذ الاوامر
سيتم الانتظار لمدة 20 مللى ثانية
ثم يرسل نبضة لمدة 10 مللى ثانية ثم يتوقف ويكمل باقى البرنامج

والبرنامج كاملا

كود:
//  IR Receiver       //
//  PIC16F877A * 8MHz //
//    November 2012   //
////////////////////////

char  address_string[5]; // This string is used to display the address on LCD
char  command_string[5]; // This string is used to display the command on LCD
unsigned int count = 0 , temp = 0;
unsigned short i = 0, rec_bit = 0, command = 0, address = 0,  Data = 0, Duty_Cycle = 192;
void interrupt(){
count++;
TMR0 = 0;
INTCON.TMR0IF = 0;
}

unsigned int get_mark(){
TMR0 = 0;
count = 0;
while(!PORTB.F4);
return TMR0 + 256*count;
}

unsigned short get_Data(short n){
         Data = 0;
         for(i = 0;i<n;i++){
          temp = get_mark();
          if(temp<=700 && temp>=500) rec_bit = 0;
          else if(temp<=1300 && temp>=1100) rec_bit = 1;
          else{ i--;continue;}
          Data += rec_bit << i;
          }
         return Data;
         }
/************************************************************/
void main(){
TRISB = 0x10;
PORTB = 0x00;
TRISC = 0x00;
PORTC = 0x00;
TRISD = 0x00;
PORTD = 0x00;
OPTION_REG = 0x80;
INTCON = 0xA0;
LCD_Config(&PORTD,2,3,0,7,6,5,4);
LCD_CMD(LCD_CURSOR_OFF);
LCD_CMD(LCD_CLEAR);
LCD_Out(1,4,"Welcome :)");
PWM1_Init(38000);PWM1_Change_Duty(50);PWM1_Stop();
PWM2_Init(500);PWM2_Start();
while(1){
PWM2_Change_Duty(Duty_Cycle);
command = 0;
address = 0;
temp = get_mark();
if(temp>=2000 && temp<= 3000){
          command = get_Data(7);
          address = get_Data(5);
          if(address==1){

          switch(command){
                          case 0:
                          PORTB.F0 = ~PORTB.F0;
                          Duty_Cycle = 255;
                          delay_ms(20);PWM1_Start();delay_ms(10);PWM1_Stop();
                          break;
                          
                          case 1:
                          PORTB.F1 = ~PORTB.F1;
                          Duty_Cycle = 223;
                          delay_ms(20);PWM1_Start();delay_ms(10);PWM1_Stop();
                          break;
                          
                          case 2:
                          PORTB.F2 = ~PORTB.F2;
                          Duty_Cycle = 192;
                          delay_ms(20);PWM1_Start();delay_ms(10);PWM1_Stop();
                          break;
                          
                          case 3:
                          PORTB.F3 = ~PORTB.F3;
                          Duty_Cycle = 128;
                          delay_ms(20);PWM1_Start();delay_ms(10);PWM1_Stop();
                          break;
                          
                          default:
                          break;
                          }
                  }
          LCD_Out(1,1,"Address : ");
          LCD_Out(2,1,"Command : ");
          ShortToStr(address,address_string);
          LCD_Out(1,11,address_string);
          ShortToStr(command,command_string);
          LCD_Out(2,11,command_string);
           }
      }
وتم تفعيل المخرج PWM رقم 1 لعملية التاكيد على الاستلام

وهناك ملاحظة على الدائرة وهى تغير طرف المستقبل بالنسبة للبك المرسل
من c1 الى c0 الطرف الاول من البورت c لان الكود الاول مبرمج هكذا

بالتوفيق ان شاء الله


lena jebril
:: مهندس ::
تاريخ التسجيل: Feb 2013
المشاركات: 9
نشاط [ lena jebril ]
قوة السمعة:
قديم 15-02-2013, 05:35 PM المشاركة 12   
افتراضي


السلام عليكم

واضح انك ضفت ack للكود بس انا من البداية مش هيك سؤالي
انا بسأل عن اضافة crc اي Cyclic redundancy check

unsigned short get_Data(short n){ Data = 0; for(i = 0;i<n;i++){ temp = get_mark(); if(temp<=700 && temp>=500) rec_bit = 0; else if(temp<=1300 && temp>=1100) rec_bit = 1; else{ i--;continue;} Data += rec_bit << i; }

في هذا الجزء بعد تخزين البيانات في data يجب فحص اذا كانت صحيحة ام لا
بتقدر ؟


الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 664
نشاط [ funky112233 ]
قوة السمعة:
قديم 15-02-2013, 06:37 PM المشاركة 13   
افتراضي


بسم الله الرحمن الرحيم

لا للاسف
ان شاء الله حد تانى يساعدك

بالتوفيق ان شاء الله


lena jebril
:: مهندس ::
تاريخ التسجيل: Feb 2013
المشاركات: 9
نشاط [ lena jebril ]
قوة السمعة:
قديم 15-02-2013, 06:52 PM المشاركة 14   
افتراضي


ان شاء الله ^_^ شكرا جزيلا


lena jebril
:: مهندس ::
تاريخ التسجيل: Feb 2013
المشاركات: 9
نشاط [ lena jebril ]
قوة السمعة:
قديم 21-02-2013, 08:32 PM المشاركة 15   
افتراضي


جزاكم الله خيرا



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 07:05 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)