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

أدوات الموضوع

rashad shubita
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2014
الدولة: Palestine
المشاركات: 81
نشاط [ rashad shubita ]
قوة السمعة:0
قديم 23-06-2016, 10:51 AM المشاركة 1   
ha مساعده في دائرة ارسال واستقبال RF433MHZ مع المتحكم pic Twitter FaceBook Google+



السلام عليكم :
انا اعمل دائرة ارسال واستقبال بستخدام RF 433MHZ بين متحكمين وجربت اكثر من كود وبأستخدام اكثر من طريقة مثل EUSART وقرأة انه Manchester Code ما ينفع برضوا وعملت برامج بطريقة عادية ما نفع كمان ممكن حد يدلني على طرييقة شغالة 100% ؟ وكمان مشكلة ال noise كيف اتخلص منها ؟ وشكراااااااا .
*المتحكم رقم PIC16LF1783 يشتغل على 3.3 فولت والكود بالمترجم MPLAB X IDE v3.26 و اذا في مشكلة بالمترجم بالنسة لك, عادي اذا بال MicroC ينفع انا احوله .


كود:
/**
  Generated Main Source File

  Company:
    Microchip Technology Inc.

  File Name:
    main.c

  Summary:
    This is the main file generated using MPLAB(c) Code Configurator

  Description:
    This header file provides implementations for driver APIs for all modules selected in the GUI.
    Generation Information :
        Product Revision  :  MPLAB(c) Code Configurator - 3.15.0
        Device            :  PIC16LF1783
        Driver Version    :  2.00
    The generated drivers are tested against the following:
        Compiler          :  XC8 1.35
        MPLAB             :  MPLAB X 3.20
*/



#include "mcc_generated_files/mcc.h"
#include <string.h>

#define relay_up       PORTBbits.RB7
#define relay_down     PORTBbits.RB6
#define led            PORTCbits.RC3
#define rf_rx          PORTCbits.RC4

/* function declaration */

unsigned int  retint,i,nothing;                        // general purpose integer
unsigned char ir_byte,count,bouton;
unsigned char ir_result;
unsigned int  temp_ir;
//********************************************
void ISR_interrupt()
{
     count++;
     INTCONbits.TMR0IF=0; // Timer0 Overflow Interrupt Flag bit
     TMR0=0;
}
//********************************************
unsigned int bit_start(){
      TMR0= 0; count=0;
      for(;!rf_rx;){}
      retint=2*(TMR0+(count*256));
      return retint;
}
//********************************************
unsigned int get_space(){
      TMR0= 0; count=0;
      for(;rf_rx;){}
      retint=2*(TMR0+(count*256));
      return retint;
}
//********************************************
unsigned char get_sony_byte(char nbits){
char n;

    ir_byte = 0;                                  // initialise
    while(rf_rx);
    for(n=0 ; n<nbits ; n++){
        temp_ir = bit_start();
        nothing = get_space();                    // expect ~510uS
        
          ir_byte >>= 1;                   // 650uS = 0, 1.2uS = 1
        if ((temp_ir > 1000)&&(temp_ir < 1500)) {
            ir_byte += 0x80;
        }
    }
    ir_byte >>= 8-nbits;
    return ir_byte;
}
//********************************************

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();
  
    
    for(i=0;i<5;i++)
    {
      led=1;
      __delay_ms(100);
      led=0;
      __delay_ms(100);
    }
    
    /*bit7: Weak Pull-Up disable & & bit5: Timer0 Clock Source from Internal instruction cycle clock (FOSC/4) & &
     bit3: Prescaler is assigned to the Timer0 module && bit(2&1&0): Prescaler Rate 1:2 */
    OPTION_REG=0b10000000;
    
    INTCONbits.GIE=1;     //Enables all active interrupts
    INTCONbits.TMR0IE=1;  //Timer0 Overflow Interrupt Enables
    TMR0 = 0;
while(1){
    ir_result = 0;                               // return 0, 0 if glitch
    while(rf_rx);                                // wait for IR to go low
    temp_ir = bit_start();
    if((temp_ir>2000)&&(temp_ir<3000)) {        // expect 2.4mS mark
        ir_result = get_sony_byte(7);           // 7 bit command
        __delay_ms(5);}                           // wait for repeat messages to clear
//**********************************************
            switch (ir_result){
                case 1: relay_up = 1;
                        __delay_ms(250);
                        break;        // button TV '0'
                case 3: relay_down = 1;
                        __delay_ms(250);
                        break;        // button TV '1'
            default:break;
            }
       relay_up=relay_down=0;     
            
    }

}


/**
 End of File
*/

__________________________________________________ _____________

كود:
/**
  Generated Main Source File

  Company:
    Microchip Technology Inc.

  File Name:
    main.c

  Summary:
    This is the main file generated using MPLAB(c) Code Configurator

  Description:
    This header file provides implementations for driver APIs for all modules selected in the GUI.
    Generation Information :
        Product Revision  :  MPLAB(c) Code Configurator - 3.15.0
        Device            :  PIC16LF1783
        Driver Version    :  2.00
    The generated drivers are tested against the following:
        Compiler          :  XC8 1.35
        MPLAB             :  MPLAB X 3.20
*/

#include "mcc_generated_files/mcc.h"

#define one_high           1200
#define one_low            600
#define zero_high          600
#define zero_low           600
#define start_pulse        2400
#define start_pulse_low    600
#define space_between_start_pulse   27500

volatile unsigned short i,x,y,dbit=0;

#define sw_up       PORTBbits.RB7
#define sw_down     PORTBbits.RB6
#define rf_tx       PORTCbits.RC4
#define led         PORTBbits.RB5

/* function declaration */
void send_start_pulse(void);
void send_1(void);
void send_0(void);

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();
    
    for(i=0;i<5;i++)
    {
      led=1;
      __delay_ms(100);
      led=0;
      __delay_ms(100);
    }

    
    while (1)
    {
        rf_tx=1;
        __delay_ms(50);
        rf_tx=0;
        __delay_ms(50);
        
        if(sw_up == 0)
        {            
            for(i=0;i<2;i++)
            {
              led =1;
              __delay_ms(55);
              led =0;
              __delay_ms(50);
            }
            
             for(y=0;y<2;y++)
                {
                    send_start_pulse();
                    send_1();
                    for(x=0;x<6;x++){send_0();}
                    send_1();
                    __delay_ms(20); 
                }
        }
        
        else if(sw_down == 0)
        {
           
            for(i=0;i<2;i++)
             {
              led=1;
              __delay_ms(55);
              led=0;
              __delay_ms(50);
             }
            
             for(y=0;y<2;y++)
                {
                    send_start_pulse();
                    send_1();
                    send_1();
                    for(x=0;x<5;x++){send_0();}
                    send_1();
                    __delay_ms(20); 
                }            
        }        
    }
}

void send_start_pulse()
{
    rf_tx=1; __delay_us(start_pulse);
    rf_tx=0; __delay_us(start_pulse_low);
}

void send_1()
{
    rf_tx=1; __delay_us(one_high);
    rf_tx=0; __delay_us(one_low);
}

void send_0()
{
    rf_tx=1; __delay_us(zero_high);
    rf_tx=0; __delay_us(zero_low);
}

واذا ممكن المساعده بتطوير الكود بكون متشكرا جدااا ^^

اعلانات

rashad shubita
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2014
الدولة: Palestine
المشاركات: 81
نشاط [ rashad shubita ]
قوة السمعة:0
قديم 25-06-2016, 09:25 AM المشاركة 2   
Unhappy


ولا اي مساعده ؟

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

ahmed idris
:: مهندس متميز ::
تاريخ التسجيل: Jul 2015
المشاركات: 453
نشاط [ ahmed idris ]
قوة السمعة:0
قديم 25-06-2016, 10:51 AM المشاركة 3   
افتراضي


السلام عليكم
أخي هل تأكدت من جانب الهارد للمشروع ؟ من توصيلات ومصدر التغذية الجيد وسلامة القطع وغير ذلك .
وهل الإعدادات (Configuration Bit) المناسبة للبيك وللمشروع مضبوطة في MPLAB X IDE ؟ مثل نوع المذبذب وخيار الريست وغير ذلك..
يمكن كذلك الدخول لهذا الموضوع :
http://www.qariya.info/vb/showthread.php?t=112367
وتجربة المثال المرافق له:
http://www.4shared.com/rar/AME3vEVn/RF_Remote.html?

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً rashad shubita ( شكر العضو على هذه المشاركة )

rashad shubita
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2014
الدولة: Palestine
المشاركات: 81
نشاط [ rashad shubita ]
قوة السمعة:0
قديم 26-06-2016, 10:10 AM المشاركة 4   
افتراضي


السلام عليكم
أخي هل تأكدت من جانب الهارد للمشروع ؟ من توصيلات ومصدر التغذية الجيد وسلامة القطع وغير ذلك .
وهل الإعدادات (Configuration Bit) المناسبة للبيك وللمشروع مضبوطة في MPLAB X IDE ؟ مثل نوع المذبذب وخيار الريست وغير ذلك..
يمكن كذلك الدخول لهذا الموضوع :
http://www.qariya.info/vb/showthread.php?t=112367
وتجربة المثال المرافق له:
http://www.4shared.com/rar/AME3vEVn/RF_Remote.html?
وعليكم السلام اخي الكريم .
نعم تأكدة مئات المرات من جانب الهارد للمشروع ومصدر التغذية ممتاز (DC POWER SUUPPLY PS-303D) والاعدادات سليمة كلها وقرأت كافة مواضيع القرية عن هاد الموضوع وجربت اكثر من كود ولم ينفع , عندي ملاحظه صغيرة وهي انه البيك يعمل على 3.3V والمستقبل يعمل على 5 فولت لكن هاد ما يشكل فرق صح ؟؟ عشان هيك انا رح اعمل المشروع اليوم على ATmega16L واجرب وكمان الكمبايلر يعطي رسائل غريبة لانه هو فعليا مش مجاني وفيه نقص ما اعرف عشان هيك رح اعمله على AVR , ورح ارفق اخر كود كتبيه وعم اطور فيه لانه مش كامل مع العلم انه انا حاطط على خرج المستقبل ترانزستر من نوع NPN مع pull-up على رجل المتحكم يعني الخرج للمستقبل بدل 1 يصبح 0 وهكذا .
رمضان كريم .

<a href=http://www.filedropper.com/code_1><img src=http://www.filedropper.com/download_button.png width=127 height=145 border=0/></a><br /><div style=font-size:9px;font-family:Arial, Helvetica, sans-serif;width:127px;font-color:#44a854;> <a href=http://www.filedropper.com >online backup</a></div>


ahmed idris
:: مهندس متميز ::
تاريخ التسجيل: Jul 2015
المشاركات: 453
نشاط [ ahmed idris ]
قوة السمعة:0
قديم 26-06-2016, 03:34 PM المشاركة 5   
افتراضي


جرب بدون ميكروكونترولر : فقط مذبذب بتردد 50 هرتز كمثال ،بالتايمر 555 توصله بالمرسل وتلاحظ الخرج على المستقبل هل يتغير..


rashad shubita
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2014
الدولة: Palestine
المشاركات: 81
نشاط [ rashad shubita ]
قوة السمعة:0
قديم 26-06-2016, 06:48 PM المشاركة 6   
افتراضي


جرب بدون ميكروكونترولر : فقط مذبذب بتردد 50 هرتز كمثال ،بالتايمر 555 توصله بالمرسل وتلاحظ الخرج على المستقبل هل يتغير..
نعم اخي يتغير حتى مع الميكروا لاني جربت مع led وكان يشتغل ويطفئ عادي لوجود اشارة من المرسل , ايش اعمل ؟


ahmed idris
:: مهندس متميز ::
تاريخ التسجيل: Jul 2015
المشاركات: 453
نشاط [ ahmed idris ]
قوة السمعة:0
قديم 26-06-2016, 07:32 PM المشاركة 7   
افتراضي


نعم اخي يتغير حتى مع الميكروا لاني جربت مع led وكان يشتغل ويطفئ عادي لوجود اشارة من المرسل , ايش اعمل ؟
أخي معناه القطع شغالة والمشكل في الكود
سبق لك سألت عن الاشارة على دخل المستقبل عندك 3 فولت هل هي كافية
أخي الجواب تعرفه من داتا شيت المستقبل ابحث فيه


rashad shubita
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2014
الدولة: Palestine
المشاركات: 81
نشاط [ rashad shubita ]
قوة السمعة:0
قديم 27-06-2016, 12:10 PM المشاركة 8   
ha


أخي معناه القطع شغالة والمشكل في الكود
سبق لك سألت عن الاشارة على دخل المستقبل عندك 3 فولت هل هي كافية
أخي الجواب تعرفه من داتا شيت المستقبل ابحث فيه
نعم كافية ولكن ابضا عدلت الكود وطورته وعملته على ATmega16 ولكن لم يعمل حتى في برنامج المحاكاة و وجدت ان المرسل شغال 100% لكن المشكلة في المستقبل ارجو المساعده ^^ مع العلم انه يتعرف على بيت البداية لكن اعتقد ان المشكلة في void get_message .

المرسل :
كود:
/*
 * RF_TX4.c
 *
 * Created: 26/06/2016 12:44:07 م
 * Author : rashad
 */ 

#define F_CPU 4000000UL    // Clock Speed
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define one_high              1200
#define one_low               600
#define zero_high             600
#define zero_low              600
#define start_pulse_high      2400
#define start_pulse_low       600
#define stop_pulse_high       4500
#define stop_pulse_low        600


volatile unsigned short i,x,dbit=0;
volatile short y;
volatile char message1[]="UPCC";
volatile char message2[]="DOWN";

#define sw_up       PC0
#define sw_down     PC1
#define rf_tx       PB0
#define led         PB1

#define led_off     PORTB &= ~(1<<led) 
#define led_on      PORTB |=  (1<<led)
#define rf_tx_off   PORTB &= ~(1<<rf_tx)
#define rf_tx_on    PORTB |=  (1<<rf_tx)




/* function declaration */
void send_start_pulse(void);
void send_stop_pulse(void);
void send_1(void);
void send_0(void);
void send_message(volatile char message[]);
void SYSTEM_Initialize(void);

int main(void)
{
    // initialize the device
    SYSTEM_Initialize();
    
    for(i=0;i<5;i++)
    {
      led_on;
      _delay_ms(100);
      led_off;
      _delay_ms(100);
    }

    
    while (1)
    {
        rf_tx_on;
        _delay_ms(50);
        rf_tx_off;
        _delay_ms(50);
		       
        if( ( PINC & (1<<sw_up) ) == 0)
        {            
            for(i=0;i<2;i++)
            {
              led_on;
              _delay_ms(50);
              led_off;
              _delay_ms(50);
            }
          send_message(message1);  

        }
        
        else if( ( PINC & (1<<sw_down) ) == 0)
        {
           
            for(i=0;i<2;i++)
             {
              led_on;
              _delay_ms(50);
              led_off;
              _delay_ms(50);
             }
            send_message(message2);
        
        }     
    }
}

void SYSTEM_Initialize(void)
{
	DDRC  &= ~(1<<PC0) & ~(1<<PC1);   // make PC0 & PC1 as input;
	PORTC |=  (1<<PC0) |  (1<<PC1);   // enable pull-up res
	DDRB  |=  (1<<PB0) |  (1<<PB1);   // make PB0 & PB1 as output
	PORTB &= ~(1<<PB0) & ~(1<<PB1);   // make PB0 & PB1 zero voltage
}

void send_start_pulse(void)
{
    rf_tx_on;  _delay_us(start_pulse_high);
    rf_tx_off; _delay_us(start_pulse_low);
}

void send_stop_pulse(void)
{
    rf_tx_on;  _delay_us(stop_pulse_high);
    rf_tx_off; _delay_us(stop_pulse_low);
}

void send_1(void)
{
    rf_tx_on;  _delay_us(one_high);
    rf_tx_off; _delay_us(one_low);
}

void send_0(void)
{
    rf_tx_on;  _delay_us(zero_high);
    rf_tx_off; _delay_us(zero_low);
}

void send_message(volatile char message[])
{
    send_start_pulse();
	
    for(i=0; message[i] != '\0'; i++)
    {   
        for(y=7;y>=0;y--)
        {
            if( ( message[i] & (1<<y) ) == 0  )  //send MSB first from message[i]
            {
                send_0();
            }
            else
            {
                send_1();
            }
                        
        }
      
    }
    send_stop_pulse();
    
    _delay_ms(20);
    
}
___________________________

المستقبل :
كود:
/*
 * RF_RX4.c
 *
 * Created: 26/06/2016 04:53:21 م
 * Author : rashad
 */ 

//**************************** define section ********************************//
#define relay_up       PC0
#define relay_down     PC1
#define led            PB1
#define rf_rx          PB0
#define led_off        PORTB &= ~(1<<led)
#define led_on         PORTB |=  (1<<led)
#define relay_up_on    PORTC |=  (1<<relay_up)
#define relay_up_off   PORTC &= ~(1<<relay_up)
#define relay_down_on  PORTC |=  (1<<relay_down)
#define relay_down_off PORTC &= ~(1<<relay_down)

#define F_CPU          4000000UL    // Clock Speed

//**************************** include section *******************************//
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>

//************************** function declaration ****************************//
unsigned int bit_start(void);
void get_message(void);
uint16_t read_byte(void);
void SYSTEM_Initialize(void);

//****************************************************************************//
unsigned int  retint,i;                        
unsigned char ir_byte,count;
unsigned char ir_result;
unsigned int  temp_ir;
char message[11];
uint16_t retbyte;

//************************ main program section ******************************//
int main(void)
{
    // initialize the device
    SYSTEM_Initialize();
     
    for(i=0;i<5;i++)
    {
      led_on;
      _delay_ms(100);
      led_off;
      _delay_ms(100);
    }
  
while(1)
{
    ir_result = 0;                              // return 0, 0 if glitch
    while( ( PINB&(1<<rf_rx) ) != 0 );          // wait for IR to go low
    temp_ir = bit_start();                      
    if((temp_ir>2000)&&(temp_ir<3000)){        // expect 2.4mS mark
		                                led_on; 
                                        get_message();                 
                                        _delay_ms(5);
										led_off;
                                       } 
									   
								                        
    if(strcmp(message,"UPCC") == 0)
    {
        relay_up_on;
        _delay_ms(300);
    }
    if(strcmp(message,"DOWN") == 0)
    {
        relay_down_on;
        _delay_ms(300);        
    }      
     
       relay_up_off; 
	   relay_down_off;    
            
    }

}

//************************** interrupt section *******************************//
ISR(TIMER0_OVF_vect)
{
	if ( ( TIFR&(1<<TOV0) )  == 1)  //to check if overflow happeend
	{
		count++;
		TCNT0=0;
	}
	
}

void SYSTEM_Initialize(void)
{
	DDRC  |=  (1<<PC0) |  (1<<PC1);   // make PC0 & PC1 as ouput;
	PORTC &= ~(1<<PC0) & ~(1<<PC1);   // make PC0 & PC1 zero voltage
	DDRB  |=  (1<<PB1);               // make PB1 as output
	PORTB &= ~(1<<PB1);               // make PB1 zero voltage
    DDRB  &= ~(1<<PB0);               // make PB1 as input	
	PORTB |=  (1<<PB0);               // enable pull-up on PB0 
	TCCR0 |=  (1<<CS01);              // set clkI/O/8 (From prescaler)   
	TIMSK |= (1 << TOIE0);            // enable timer0 overflow
	TCNT0  = 0;                       // give timer the initial value
	sei();                            // enable all interrupt	
}

//********************************************
unsigned int bit_start(void){
      TCNT0= 0; count=0;
	  TCCR0 |=  (1<<CS01);                   //start timer count 
      while( ( PINB&(1<<rf_rx) ) == 0 );     // wait for IR to go high    
	  TCCR0  &= ~(1 << CS01);                //stop timer count
      retint=2*(TCNT0+(count*256));
      return retint;
}
//********************************************
void get_message(void){
 

    while( ( PINB&(1<<rf_rx) ) != 0 );                  // wait for IR to go low(due to the end of start bit is high 600us)
    for(i=0 ; i < 11 ; i++){                            // max character  10 and one for end bit
        retbyte = read_byte();
        if(retbyte != 600)
        {
         message[i]=(char)retbyte;  
		 relay_up_on;
        }
        else      //end bit 
        {
          break;
        }
        relay_up_off;
    }
      message[i]='\0';
        
}
//********************************************
uint16_t read_byte(void){
  
    ir_byte=0;
 for(i=0;i<8;i++)
    {
     temp_ir = bit_start();     // 600uS = 0, 1.2mS = 1
     if((temp_ir > 1000)&&(temp_ir < 1500)) 
        {
            ir_byte |=   (1<<(7-i));
        }
     else if(temp_ir > 4000)
     {   
         while( ( PINB&(1<<rf_rx) ) != 0 );          // wait for IR to go low
         return 600;
     }
     while( ( PINB&(1<<rf_rx) ) != 0 );              // wait for IR to go low
    }
  return ir_byte;   
}
-----------------------------------------------------
رابط المشروع كامل:
http://www.filedropper.com/atmelembedded

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025