اطلاعیه

Collapse
No announcement yet.

ارتباط دو میکرو در کدویژن

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ارتباط دو میکرو در کدویژن

    سلام
    من یک میکرو atmega16 و دو سنسورlm35 دارم یک برنامه نوشتم که مقدار سنسور ها را باadc پورت A1و A0 خوانده ودر x وy می ریزه .
    و دو متغیر دیگه هم هست که آنها را در eepromذخیره کردم به نام های a وb .
    شرح کار طوری که اگه مقدارxاز a کمتر شد موتور 1 روشن اگر بیشتر شد موتور 1خاموش ، وهمین طور برای y وموتور 2 ،مقدار aوb را نیز توسط پایه های B0,B1,B2,B3 میکرو تنظیم می کنم کلیه اطلاعات روی ال سی دی هم نمایش داده میشه و یک حالت هشدار هم دارم که اگر دما از 85 بالا تر رفت یک آژیر هشدار می دهد.
    حالا من می خواستم کمکم کنید بتونم این data را در 50 متر فاصله روی یک میکرو دیگه ببرم و روی ال سی دی نمایش بدم و مقدار a,bرا هم در میکرو اولی تعقیر بدم آیا امکان داره؟ توی ecaسرچ کردم در مورد pic و بسکام بود اما من کدویژن کار کردم در ضمن تا حالا دو میکرو را به هم وصل نکردم و برنامه نویسی ضعیفی دارم میشه قسمت های اصلی برنامه را برام بذارید ممنون میشم

    #2
    پاسخ : ارتباط دو میکرو در کدویژن



    سلام کسی نیست ؟

    دیدگاه


      #3
      پاسخ : ارتباط دو میکرو در کدویژن

      ارتباط می خواین با سیم باشه یا بدون سیم ؟

      البته فعلا کاری به عملکرد هیچ کدوم از میکروها ندارم.

      ایا امنیت اطلاعات براتون مهمه ؟

      سرعت انتقال چطور؟
      چرا ناراحتی پاتریک!
      + امروز ی بچه دیدم سرچهارراه گل میفروخت
      - از دیدنش ناراحت شدی؟
      + نه
      پس چی ناراحتت کرده
      + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
      ------------------------------------------------------------------------------------------------------
      تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
      ------------------------------------------------------------------------------------------------------
      محصولات

      دیدگاه


        #4
        پاسخ : ارتباط دو میکرو در کدویژن

        چون فاصله زیاده احتمالا باید از rs485 استفاده کنید.

        دیدگاه


          #5
          پاسخ : ارتباط دو میکرو در کدویژن

          نوشته اصلی توسط سوران آراسته
          ارتباط می خواین با سیم باشه یا بدون سیم ؟

          البته فعلا کاری به عملکرد هیچ کدوم از میکروها ندارم.

          ایا امنیت اطلاعات براتون مهمه ؟

          سرعت انتقال چطور؟
          اگه بدون سیم باشه که عالیه ولی چون عجله دارم و سیم قابلیت اطمینانش بالا تره اگه سیم دار باشه ممنون میشم.
          امنیت هم مهم نیست
          سرعت تا 20 ثانیه جواب بده البته موقع تنظیم پارامتر ها امکان داره کسی در میکرو اولی تغییر ایجاد کنه برای همین سرعت بالا باشه بهتر .
          آیا با دو سیم امکان پذیره یا کمه؟
          ممنون

          دیدگاه


            #6
            پاسخ : ارتباط دو میکرو در کدویژن

            نوشته اصلی توسط sadeghmojtabaei
            چون فاصله زیاده احتمالا باید از rs485 استفاده کنید.
            rs485 چیه میشه توضیح بدید یا یه نمونه برنامه ساده ازش بزارین ؟

            دیدگاه


              #7
              پاسخ : ارتباط دو میکرو در کدویژن

              rs485 یه نوع ارتباط نیمه دوطرفه است. فریم اطلاعات و نحوه استفاده مثل همون usart میکرو است . ولی باید پایه های tx و rx را بدید به آی سی max485 و اون طرف خط دوباره با همین آی سی دیتا را تحویل می گیرید. برای مسافت های طولانی استفاده میشه.

              دیدگاه


                #8
                پاسخ : ارتباط دو میکرو در کدویژن

                خواهش می کنم یه برنامه ساده با کد ویژن برای من بزارید ممنون میشم

                دیدگاه


                  #9
                  پاسخ : ارتباط دو میکرو در کدویژن

                  همون برنامه usart هست. اونو می خواهید؟

                  دیدگاه


                    #10
                    پاسخ : ارتباط دو میکرو در کدویژن

                    نوشته اصلی توسط مجید باقری
                    خواهش می کنم یه برنامه ساده با کد ویژن برای من بزارید ممنون میشم
                    کار خاصی نداره و تفاوت زیادی بین 485 و ارتباطی مثل 232 به لحاظ برنامه نویسی نیست (فقط یک پایه درایو اضافه تر داره)

                    پایه RE, DE را به هم متصل کن و بده به یکی از IOها
                    در این مثال به B0 وصل شده

                    کد:
                    #include <mega16.h>
                    #include <delay.h>
                    
                    #define RS485RD(x) ((x) ? (PORTB|=0x01):(PORTB&=0xFE)) 
                    
                    #define RXB8 1
                    #define TXB8 0
                    #define UPE 2
                    #define DOR 3
                    #define FE 4
                    #define UDRE 5
                    #define RXC 7
                    #define FRAMING_ERROR (1<<FE)
                    #define PARITY_ERROR (1<<UPE)
                    #define DATA_OVERRUN (1<<DOR)
                    #define DATA_REGISTER_EMPTY (1<<UDRE)
                    #define RX_COMPLETE (1<<RXC)
                    
                    // USART Receiver buffer
                    #define RX_BUFFER_SIZE 8
                    char rx_buffer[RX_BUFFER_SIZE];
                    
                    #if RX_BUFFER_SIZE <= 256
                    unsigned char rx_wr_index,rx_rd_index,rx_counter;
                    #else
                    unsigned int rx_wr_index,rx_rd_index,rx_counter;
                    #endif
                    
                    // This flag is set on USART Receiver buffer overflow
                    bit rx_buffer_overflow;
                    
                    // USART Receiver interrupt service routine
                    interrupt [USART_RXC] void usart_rx_isr(void)
                    {
                    char status,data;
                    status=UCSRA;
                    data=UDR;
                    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                      {
                      rx_buffer[rx_wr_index++]=data;
                    #if RX_BUFFER_SIZE == 256
                      // special case for receiver buffer size=256
                      if (++rx_counter == 0)
                       {
                    #else
                      if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
                      if (++rx_counter == RX_BUFFER_SIZE)
                       {
                       rx_counter=0;
                    #endif
                       rx_buffer_overflow=1;
                       }
                      }
                    }
                    
                    #ifndef _DEBUG_TERMINAL_IO_
                    // Get a character from the USART Receiver buffer
                    #define _ALTERNATE_GETCHAR_
                    #pragma used+
                    char getchar(void)
                    {
                    char data;
                    while (rx_counter==0);
                    data=rx_buffer[rx_rd_index++];
                    #if RX_BUFFER_SIZE != 256
                    if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
                    #endif
                    #asm("cli")
                    --rx_counter;
                    #asm("sei")
                    return data;
                    }
                    #pragma used-
                    #endif
                    
                    // Standard Input/Output functions
                    #include <stdio.h>
                    
                    // Declare your global variables here
                    
                    
                    void Send_485(char data) 
                     {
                      RS485RD(1);  
                      delay_us(50);
                      putchar(data);
                      RS485RD(0);
                     }
                    
                    void main(void)
                    {
                    PORTB=0x00;
                    DDRB=0x01;
                    
                    
                    // USART initialization
                    // Communication Parameters: 8 Data, 1 Stop, No Parity
                    // USART Receiver: On
                    // USART Transmitter: On
                    // USART Mode: Asynchronous
                    // USART Baud Rate: 9600
                    UCSRA=0x00;
                    UCSRB=0x98;
                    UCSRC=0x86;
                    UBRRH=0x00;
                    UBRRL=0x47;
                    
                    #asm("sei")
                    
                    while (1)
                       {
                        Send_485(0xAB);
                        delay_ms(100);
                       }
                    }
                    ببین برنامه بالا وقفه دریافت داره و برای دریافت پایه RE در max485 باید صفر باشه

                    در این مثال هر 100 میلی ثانیه 0xAB ارسال میشه

                    یک نگاه اینجا بنداز : http://www.eca.ir/forum2/index.php?topic=82841.msg506097#msg506097

                    موفق باشید
                    امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                    دیدگاه


                      #11
                      پاسخ : ارتباط دو میکرو در کدویژن

                      با سلام ممنون از جوابتون
                      1 این برنامه USART یاrs 485
                      2در 485 فرمودید یک پایه اضافه میشه یعنی با سه رشته سیم انجام میشه
                      3آیا در میکرو دوم هم همین برنامه را باید وارد کنیم
                      4 در حلقه اخر برنامه به جای send بایدRecive تایپ کنیم تا اطلاعات را دریافت کنه
                      5در Send_485(0xAB); منظور همون متغیر های a,b
                      6اگر در خط های دیگر برنامه خواستیم دوباره چیزی را ارسال یا دریافت کنیم با دستور Send_485(0xAB); به جای A و B متغیر دیگری را بفرستیم
                      8دستور Recive_485(0xAB);درسته در میکرو دوم بکار ببریم
                      من خیلی پر رو ام ببخشید

                      دیدگاه


                        #12
                        پاسخ : ارتباط دو میکرو در کدویژن

                        نوشته اصلی توسط مجید باقری
                        با سلام ممنون از جوابتون
                        1 این برنامه USART یاrs 485
                        2در 485 فرمودید یک پایه اضافه میشه یعنی با سه رشته سیم انجام میشه
                        3آیا در میکرو دوم هم همین برنامه را باید وارد کنیم
                        4 در حلقه اخر برنامه به جای send بایدRecive تایپ کنیم تا اطلاعات را دریافت کنه
                        5در Send_485(0xAB); منظور همون متغیر های a,b
                        6اگر در خط های دیگر برنامه خواستیم دوباره چیزی را ارسال یا دریافت کنیم با دستور Send_485(0xAB); به جای A و B متغیر دیگری را بفرستیم
                        8دستور Recive_485(0xAB);درسته در میکرو دوم بکار ببریم
                        من خیلی پر رو ام ببخشید
                        1-ببین دوست عزیز USART ارتباط سریال هست حالا میتونی با بستر RS485 و یا RS232 ویا RS422 و... ارسال کنید
                        2-منظورم از 3تا پایه اینه که 3تا پایه از میکرو به max485 متصل میشه ولی خود ارتباط روی یک زوج سیم به هم تابیده شده صورت میگیره
                        3- قبلاً عرض کرده بودم تفاوتی در دریافت وارسال با دیگر بستر ها به لحاظ برنامه نویسی ندارد
                        4-برنامه برای دریافت از وقفه استفاده میکنه و درون بافر ذخیره میکنه
                        5- 0xAB یک مقدار ثابت هگز هست

                        تابع send_485 را من خودم توی همون برنامه نوشتم شما Recive_485 را از کجا آوردی
                        کد:
                        void Send_485(char data) 
                         {
                          RS485RD(1);  
                          delay_us(50);
                          putchar(data);
                          RS485RD(0);
                         }
                        پیشنهاد میکنم ابتدا شما در مورد ارتباط سریال و عملکرد رجیستر ها و اصول این ارتباط مطالعه بفرمایید و بعد سراغ RS485 بروید :agree:
                        در ضمن شما یک نگاه به اون صفحه ای که آدرسش را دادم بندازید :mrgreen:

                        موفق باشید
                        امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                        دیدگاه


                          #13
                          پاسخ : ارتباط دو میکرو در کدویژن

                          [

                          میشه یه مرج در مورد ارتباط سریال به من معرفی کنید ساده باشه و برای من مبتدی قابل درک

                          دیدگاه

                          لطفا صبر کنید...
                          X