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

   

الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 01-10-2014, 07:55 PM المشاركة 65   
sun



معلهيش أخي سعيد مشاريع الارسال والاستقبال دائما متعبة ..
جرب استخدام دوال برتوكول الأنفرا في الميكروسي كما أشار عليك أخونا الحبيب حسن هادي محمود .
البرتوكولات معدة لهدا الغرض وتراعي متطلبات الارسال والاسقبال من تكرار الموجات و ضبط dutty cycle المناسب و التوقيتات .
أرجو لك التوفيق ..

بارك الله فيك شكرا لك

اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 01-10-2014, 08:12 PM المشاركة 66   
افتراضي


السلام عليكم
تفضل أخي هذا كود ريوت كونترول بروتوكول سوني
http://up.top4top.net/downloadf-top4...d3d31-rar.html

مرسل
كود:
const char address_dvice=1;// address
void send_data(const char address , unsigned char codes);
void main()
 {
   CMCON=0x07;TRISA=255;TRISB=0;portb=0;
   PWM1_Init(38000);
  PWM1_Set_Duty(178); // 70%
   PWM1_Stop();

  while (1) {
            if (porta.f0==0)send_data(address_dvice,0);
            if (porta.f1==0)send_data(address_dvice,1);
            if (porta.f2==0)send_data(address_dvice,2);
            if (porta.f3==0)send_data(address_dvice,3);
           }

  }
//***************************************************************************//
void send_data(const char address , unsigned char codes)
{
 char bitnum =0;
 PWM1_Start();
 delay_us(2400);
 PWM1_Stop();
 delay_us(600);

 for(bitnum= 0; bitnum< 7; bitnum++) // send code
                  {

                   if( codes & (1 << bitnum))     // test bit <bitnum>
                       {
                         PWM1_Start();
                         delay_us(1200);
                         PWM1_Stop();
                         delay_us(600);
                       }
                  else{
                       PWM1_Start();
                       delay_us(600);
                       PWM1_Stop();
                       delay_us(600);
                     }
                  }

 for(bitnum= 0; bitnum< 5; bitnum++)// send address
                  {

                   if( address & (1 << bitnum))     // test bit <bitnum>
                       {
                         PWM1_Start();
                         delay_us(1200);
                         PWM1_Stop();
                         delay_us(600);
                       }
                  else{
                       PWM1_Start();
                       delay_us(600);
                       PWM1_Stop();
                       delay_us(600);
                     }
                  }

 delay_ms(250);
}

مستقبل
كود:
sbit ir_in at RA0_bit;                      // Infrared receiver input
sbit ir_in_direction at TRISA0_bit;         // Infrared receiver input
unsigned int retint;                        // general purpose integer
unsigned char ir_byte,COUNT,bouton;
unsigned char ir_result[3] ;
const char dvice_address=1;
unsigned char state_power=0;
//***************************************************************//
void interrupt()
{
     count++;
     intcon=0b10100000;
     TMR0=0;
}
//******************************************************************//
unsigned int get_mark(){
                        TMR0= 0; count=0;
                        for(;!ir_in;){}
                        retint=2*(TMR0+(count*256));
                        return retint;
                       }
//********************************************************************//
unsigned int get_space()
{
      TMR0= 0; count=0;
      for(;ir_in;){}
      retint=2*(TMR0+(count*256));
      return retint;
}
//******************************************************************//
unsigned char get_sony_byte(char nbits)
{
 char n;
 unsigned char ir_byte;
 unsigned int temp_ir;

 ir_byte = 0;                                  // initialise
 for(n=0 ; n<nbits ; n++){
                         temp_ir = get_space();                    // expect ~510uS
                         temp_ir = get_mark();
                         ir_byte >>= 1;                   // 650uS = 0, 1.2uS = 1
                         if ((temp_ir > 1000)&&(temp_ir < 1300))
                                                            {
                                                             ir_byte += 0x80;
                                                            }
                        }
ir_byte >>= 8-nbits;
return ir_byte;
}
//****************************************************//
void sony_read()
{
 unsigned int temp_ir;

    ir_result[0] = 0;                            // return 0, 0 if glitch
    ir_result[1] = 0;                            // return 0, 0 if glitch
    while(ir_in);                                // wait for IR to go low
    temp_ir = get_mark();
    if((temp_ir>2000)&&(temp_ir<3000)) 
                                       {     // expect 2.4mS mark
                                        ir_result[0] = get_sony_byte(7);          // 7 bit command
                                        ir_result[1] = get_sony_byte(5);         // 5 bit address
                                        Delay_ms(10);                           // wait for repeat messages to clear
                                       }
}
//******************************************************************//
void main()
{
    TRISA=0x0F;
    TRISB=0;
    PORTB=0;
    PORTA=0;
    cmcon=7;
    option_reg=0b10000000;
    intcon=0b10100000;
    TMR0 = 0;
    while(1){
             sony_read();
             if(ir_result[1]==dvice_address)
                                {                 // Sony address 01 is TV
                                 bouton = ir_result[0];
                                 switch (bouton){
                                                 case 0: Portb.F0 = ~Portb.F0;Delay_ms(150);break;        // button TV '0'
                                                 case 1: Portb.F1 = ~Portb.F1;Delay_ms(150);break;        // button TV '1'
                                                 case 2: Portb.F2 = ~Portb.F2;Delay_ms(150);break;        // button TV '2'
                                                 case 3: Portb.F3 = ~Portb.F3;Delay_ms(150);break;        // button TV '3'

                                                 default:break;
                                                }
                                }
            }
}

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

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 01-10-2014, 08:40 PM المشاركة 67   
افتراضي


السلام عليكم
كود ريموت كونترول بأستخدام بروتوكول NEC
http://up.top4top.net/downloadf-top4...a25b1-rar.html

المرسل

كود:
sbit led                at RA0_bit;
sbit led_dir            at trisA0_bit;

sbit sw1 at RB0_bit;
sbit sw2 at RB1_bit;
sbit sw3 at RB2_bit;
sbit sw4 at RB4_bit;
sbit sw5 at RB5_bit;
char x=0;
const char address=10;
void IR_Send(char IR_Address, char IR_COmmand);
// flashing***********************//
void flashing()
{
 for(x=0;x<10;x++)
     {
      led=1;
      delay_ms(50);
      led=0;
      delay_ms(50);
     }
}
// main *******************************//
void main()
{
 cmcon=7;

 led_dir=0;// output
 trisb=0xF7;

 PWM1_Init(38000);// frequncy 38KHZ
 PWM1_Set_Duty(178); // set duty 70%
 flashing();
 while(1)
  {
    if(sw1==1){IR_Send(address,0xAA); }
    if(sw2==1){IR_Send(address,0xBB); }
    if(sw3==1){IR_Send(address,0xCC); }
    if(sw4==1){IR_Send(address,0xDD); }
    if(sw5==1){IR_Send(address,0xFF); }
  }
}

/*******************************************************************************
* Function IR_Send(char IR_Address, char IR_COmmand)
* ------------------------------------------------------------------------------
* Overview: Functions sends address and command via IR NEC protocol
* Input:  Address - address of the device
*         Command - command for device
* Output: Nothing
*******************************************************************************/
void IR_Send(char IR_Address, char IR_COmmand)
{
     char ir_byte[4];
     char bitnum;
     char bytenum;

     ir_byte[3] = ~IR_COmmand;
     ir_byte[2] =  IR_COmmand;
     ir_byte[1] = ~IR_Address;
     ir_byte[0] =  IR_Address;

    // Delay_ms(100);                                  // precaution to be certain of some dead time before message start
     PWM1_Start();                                   // mark
     led=1;
     Delay_ms(9);                                 // 9mS mark start bit
     PWM1_Stop();                                    // space
     led=0;
     Delay_us(4500);                                 // 4.5mS space ends start bit
     for(bytenum = 0; bytenum < 4; bytenum++)        // 4 bytes to send
           {
             for(bitnum = 0; bitnum < 8; bitnum++)    // 8 bits LSB first
                  {
                   PWM1_Start();                           // mark
                   led=1;
                   Delay_us(560);                          // 560uS mark for '0' or '1'
                   PWM1_Stop();                            // space
                   led=0;
                   if(ir_byte[bytenum] & (1 << bitnum))     // test bit <bitnum>
                       {
                         Delay_us(1680);                     // 1.68mS space for a '1'
                       }
                  else{
                       Delay_us(560);                      // 560uS space for a '0'
                     }
                  }
           }
     PWM1_Start();                                   // mark
     led=1;
     Delay_us(560);                                  // stop bit of '1'
     PWM1_Stop();                                    // space
     led=0;
     Delay_us(1680);                                 // stop bit of 1
     Delay_ms(200);                                  // precaution to be certain of some dead time after message ends

}
============================================
المستقبل
كود:
sbit ir_in        at RA0_bit;
sbit ir_in_dir    at TRISA0_bit;
sbit led1        at RB0_bit;
sbit led2        at RB1_bit;
sbit led3        at RB2_bit;
sbit led4        at RB3_bit;

const char address_advice=10;
unsigned char IR_Received_byte[4];

unsigned char IR_state=0 , IR_Timer_Count = 0 , IR_Received_Flag;
unsigned char IR_Bit_Count = 0 , IR_Byte_Count=0 ;
unsigned int retint,count=0;

//Timer0

void InitTimer0()
{
 option_reg=0b10000000;
 intcon=0b10100000;
 tmr0=0;
}

//*********************************************//
void Interrupt()
{
  if (TMR0IF_bit){
     TMR0IF_bit         = 0;
    TMR0                 = 0;
    count++;
  }
}

unsigned int get_space()
{
      TMR0= 0; count=0;
      for(;!ir_in;);
      retint=2*(TMR0+(count*256));
      return retint;
}
//*/********************************************************//
 unsigned int get_mark(){
                        count=0;
                        TMR0= 0;
                        while(ir_in);
                        retint=2*(TMR0+(count*256));
                        return retint;
                       }
//*************************************************************//
unsigned int get_mark1(){
                        count=0;
                        TMR0= 0;
                        while(!ir_in);
                        retint=2*(TMR0+(count*256));
                        return retint;
                       }
//////////////////////////************************************///////////////
unsigned char get_remote_byte()
{
 char remote;
 unsigned char ir_byte;
 unsigned int temp_ir;

 ir_byte = 0;                                  // initialise

 for(remote=0 ; remote<8 ; remote++)
                        {
                          temp_ir = get_space();
                          if ((temp_ir > 430)&&(temp_ir < 600))
                                                            {
                                                              temp_ir = get_mark();
                                                              ir_byte >>= 1;                   // 650uS = 0, 1680uS = 1
                                                              if ((temp_ir > 700)&&(temp_ir < 1900))
                                                                             {
                                                                               ir_byte += 0x80;
                                                                              }
                                                             }
                           else break;
                        }


return ir_byte;
}

//*****************************************************************************************//
unsigned char remote_read(const char device_address)
{
  unsigned int temp_ir;
  ir_in_dir =1;
  IR_Received_byte[0]=0;
  IR_Received_byte[1]=0;
  IR_Received_byte[2]=0;
  IR_Received_byte[3]=0;
  while(ir_in);// wait for IR to go low
  temp_ir = get_mark1();
  if((temp_ir>7000)&&(temp_ir<11000))
                                    {   // expect 4.5mS mark
                                        temp_ir = get_mark();                        // wait for repeat messages to clear
                                        if((temp_ir>3700)&&(temp_ir<5300))
                                                          {
                                                            IR_Received_byte[0] = get_remote_byte();          // 7 bit command
                                                            IR_Received_byte[1] = get_remote_byte();         // 5 bit address
                                                            IR_Received_byte[2] = get_remote_byte();          // 7 bit command
                                                            IR_Received_byte[3] = get_remote_byte();         // 5 bit address
                                                            temp_ir = get_space();
                                                            if ((temp_ir > 430)&&(temp_ir < 600))
                                                                      {
                                                                       IR_Received_Flag =1;
                                                                      }


                                                           }
                                      }

}

//**** main********************************************
void main()
{
 cmcon=7;// OFF comparator

  ir_in_dir =1;
  trisb=0;
  portb=0;

 InitTimer0();
  while(1)
        {
         remote_read(address_advice);
         if (IR_Received_Flag == 1)
                           {
                              GIE_bit=0;
                               if ((IR_Received_byte[0] == ~IR_Received_byte[1]) && (IR_Received_byte[2] == ~IR_Received_byte[3]))
                                                                 {
                                                                  if (IR_Received_byte[0] == address_advice) // correct address
                                                                                            {
                                                                                             switch (IR_Received_byte[2])// data store in IR_Received_byte[2]
                                                                                                    {
                                                                                                      case 0xAA :{ led1=~led1;delay_ms(150); break;}
                                                                                                      case 0xBB :{ led2=~led2;delay_ms(150) ;break;}
                                                                                                      case 0xCC :{ led3=~led3;delay_ms(150); break;}
                                                                                                      case 0xDD :{ led4=~led4;delay_ms(150);break;}
                                                                                                      case 0xFF :{ portb=~portb;delay_ms(150);break;}
                                                                                                      default : break;
                                                                                                     }
                                                                                            }
                                                                    IR_Received_Flag = 0;
                                                                  }

                             GIE_bit=1;

                          }
                          

                               
         }
}


الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 01-10-2014, 09:50 PM المشاركة 68   
افتراضي


بارك الله فيك مهندس حسن شكرا على الاهتمام سادرس الكود ان شاء الله احاول قدر الامكان فهم السبب كما يقال اذا عرف السبب بطل العجب ^_^


الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 05-10-2014, 10:02 PM المشاركة 69   
افتراضي


السلام عليكم كل عام وانتم بخير



يبدوا ان المشكلة فى الدائرة مع انى راجعتها من قبل الكود سليم هل يجب وضع مقاومة على خرج المستقبل ام يكون الربط مباشر الى المايكرو ؟؟ وهل هناك فلاتر يجب وضعه على المرسل والمستقبل لتفادى الضجيج او النويز ؟؟


الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 05-10-2014, 11:44 PM المشاركة 70   
افتراضي


المشكلة كانت فى الارسال ووجدت الحل والحمد لله المشكلة كانت فى ضعف الارسال كان المستقبل يستقبل الاشارة من بعد بعض سنتمترات لوزاد عن هذا المدى لايستجيب

اخذت مرحلة الارسال من ريمونت قديم عندى طبقتها وكانت النتائج مذهلة من بعد اكثر من 6 امتار يستجيب الدائرة سارسم لكم الدائرة بعد قليل ان شاء الله


الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 06-10-2014, 12:10 AM المشاركة 71   
Thumbs up


الدائرة يربط الى خرج المايكرو لارسال الاشارة

المقاومة 1 اوم
المكثف 47uf/ 10v

يربط قاعدة الترانزستور ربط مباشر الى خرج المايكرو اى لا نستخدم اية مقاومة





التعديل الأخير تم بواسطة : سعيد قادر بتاريخ 06-10-2014 الساعة 12:41 AM

الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 06-10-2014, 12:26 AM المشاركة 72   
افتراضي


الدائرة على برنامج سيركت وزر


تـــــــــــــــــــحميل


التعديل الأخير تم بواسطة : سعيد قادر بتاريخ 06-10-2014 الساعة 12:42 AM


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