اطلاعیه

Collapse
No announcement yet.

کاربرد وقفه در ارتباط سریال؟

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

    کاربرد وقفه در ارتباط سریال؟

    سلام به همگی ...
    یه سوال درباره وقفه usert دارم .اصولا از این وقفه برای چا کاری استفاده میکنیم . مثلا وقتی وقفه RX یه میکرو فعال بشه هر موقه data اومد میریزع تو baffer خودش بعد نشون میده؟ یا نه؟
    یا یجور دیگه بگم من میخوام دوتا میکرو رو از طریق ارتباط usert به هم وصل کنم حالا میخوام یه data ایی رو بدم به میکرو اولی میکرو اولی data رو چک کنه اگه درست بود جواب بده ... (اینو به عنوان مثال عرض کردم...) ایا تو این مثال لازم از وقفه استفاده کرد ؟
    میشه یه توضیح کلی بدین اگه با مثال باشه بهتر میفهمم
    پیشاپیش از تمامی دوستان ممنونم
    یا علی... :bye
    ذکات علم یاد دادنه ....

    #2
    پاسخ : کاربرد وقفه در ارتباط سریال؟

    آقا ببین این وقفه برای زمانی هست که شما میخواهید برنامه یتان ساده باشد یعنی دیگر نمی خواهید برای دریافت سریال منتظر بمانید بلکه می خواهید میکرو کار خود را بکند و هر وقت اطلاعات سریال آمد میکرو برنامه عادی را رها کند و به زیر برنامه وقفه دریافت سریال برود و دستورات مربوط به آن را انجام دهد.
    با این کار شما دیگر نیازی به چک کردن سریال ندارید من خودم هر وقت بخواهم با سریال کار کنم از این قابلیت که هم توی 8051 هست و هم توی avr هست استفاده می کنم و واقعا از کارکرد خوب آن هم راضی هستم.
    همانطور که مایل نیستم بنده کسی باشم، حاضر نیستم آقای کسی باشم. کسانی که مخالف آزادی دیگرانند، خود لیاقت آزادی را ندارند.((آبراهام لینکن))

    قدرت شگفت انگیز نیروهای خلاق و استعدادهای نهفته آدمی هنگامی آشکار می شود که نیازی حیاتی، تواناییهای او را به فعالیت وادارد و کشش آرزویی، سراپای وجودش را به جنب و جوش درآورد.((آبراهام لینکن))

    [img width=343 height=100]http://www.elecdesigner.com/uploads/PRO-DESIGNER-GROUP.jpg[/img]

    دیدگاه


      #3
      پاسخ : کاربرد وقفه در ارتباط سریال؟

      اقا ممنون از پاسختون...
      قضیشو فهمیدم چیه ولی نمیدونم جرا نمیشه باهاش کار کنم تو code vizard وقتی وقفه رو فعال میکنم یه سری کد درست میکنه که نمیدونم چی به چیه راستش من برنامه همینجوری نوشتم تا کاربردشو بفهمم
      برنامه به این شکله که میکرو اول 4 تا عدد رو میفرسته به میکرو 2وم بعد میکرو دوم میره به وقفه rx اونجا اعدادو چک میکنه اگه درست بود رو lcd مینویسه مجید و در مقابل میکرو دوم هم 4 تا عدد به عنوان رمز برای میکرو اول میفرسته اونم اگه درست بود مثلا portb.0=1 میشه ولی نمیدونم چرا اجرا نمیشه میشه یه نیگاه بکنید...
      http://persiandrive.net/162932

      ذکات علم یاد دادنه ....

      دیدگاه


        #4
        پاسخ : کاربرد وقفه در ارتباط سریال؟

        یه نفر کاربرد وقفه رو به من بگه؟ :cry2:
        من میخوام با کامپیوتر از طریق رابط سریال بتونم 2تا میکرو رو کنترل کنم در واقع میشه گفت چک کنم یعنی هر کدومشون یه ادرس داشته باشن و مثلا هر کدومشون تو یه جایی باشن ودما رو اندازه بگیرند حالا میخوام بدونم ایا اینجا باید از وقفه rx استفاده کرد ؟ کلا چه موقه هایی از وقفه استفتده میشه
        یه نفر لطف کنه یه توضیح بده تا دوزاری ما بیوفته :mrgreen:
        یا علی....
        ذکات علم یاد دادنه ....

        دیدگاه


          #5
          پاسخ : کاربرد وقفه در ارتباط سریال؟

          مجید عزیز
          اول اینکه چرا واسه دوتا سنسور یه میکرو نگذاشتی تا کار راحتتر بشه؟

          حالا میرسیم به وقفه ی سریال. مثلا 2 بایت از کامپیوتر میفرستی واسه ی میکرو. میکرو هم الان داره کلید می خونه. بایت اول میاد و پورت سریال باید خونده بشه. کجایی پس؟ لطفا منو بخونید من پر شدم . الان بایت دوم از کامپیوتر میاد و من دیگه جا ندارما. پس کجایید؟ یکی نیست به داد من برسه. اگه بایت دوم بیاد من نمی تونم بگیرمش. پس کوشید؟
          اما امان از یک فریاد رس.
          میکرو مشغول خوندن کلیدهاست و اصلا نمی شنوه پورت سریال بیچاره شکمش پره و یکی باید خالیش کنه. تازه بعد از خوندن کلید هم می خواد بره سنسور دما رو بخونه.
          تازه بدتر از اون، بعدش می خواد بره روی LCDآ‌ بنویسه و رو LCDآ‌ نوشتن یعنی کلی زمان.

          بله دوست خوبم. اینجوری میشه که دیتاهای شما از کامپیوتر میاد اما میکرو اصلا نمی فهمه. کسی که اینجا به میکرو میگه یه بایت اومد وقفه است.

          البته اگه دیتا فقط یک بایت باشه ممکنه وقفه نیاز نباشه و شما هر وقت خوندی خوندی. اما همین یک بایت اگه حیاتی باشه و نیاز به سریع خوندن داشته باشه، وقفه تنها چاره ی کاره.

          خود من وقتی از LCDآ‌ استفاده می کنم چشم بسته وقفه ی پورت سریال رو فعال می کنم چون می دونم میکرو توی LCDآ‌ خیلی کنده و دیر به پورت جواب میده.

          با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

          دیدگاه


            #6
            پاسخ : کاربرد وقفه در ارتباط سریال؟

            اول سلام احمد اقای گل :icon_razz:
            دوم ممنون از توضیحات جامع و کاملتون...

            اول اینکه چرا واسه دوتا سنسور یه میکرو نگذاشتی تا کار راحتتر بشه؟
            اخه قراره یه سنسور تو موتور خونه باشه ویکیشم تو طبقه بالا در ضمن من می خوام برای هر میکرو یه ادرس بزارم تا هر وقت با pc صداش کردم جواب بده... تا با هم قاطی نشه حالا اگه دوتا سنسورو باهم استفاده کنم تو یه میکرو چطوری pc تشخیص بده که دمای کدوم سنسورو میخونه؟
            یه نکته ایی هم که هست من بیشتر برای کاربرد وقفه می خوام این ازمایشو انجام بدم یعنی بتونم با ادرس دهی برا هر میکرو اونو فراخونی بکنم


            فکر کنم شما با bascam کار میکنید :redface:
            من تو code vizard وقتی وقف rx رو فعال میکنم یه مش کد تولید میشه یه چیزایشا میفهمم ولی بعضیاشو نه برا همین نمیدونم روتین وقفه رو کجا وبه چه شکل بنویسم ..
            دوستانی که با C کار میکنند کمک کنند :cry2:

            ببینید برنامه اینجوریه که ..
            #include <mega16.h>
            #include <delay.h>

            ///////////////////
            int a=26;
            bit senddata=0;
            /////////////////
            #define RXB8 1
            #define TXB8 0
            #define UPE 2
            #define OVR 3
            #define FE 4
            #define UDRE 5
            #define RXC 7

            #define FRAMING_ERROR (1<<FE)
            #define PARITY_ERROR (1<<UPE)
            #define DATA_OVERRUN (1<<OVR)
            #define DATA_REGISTER_EMPTY (1<<UDRE)
            #define RX_COMPLETE (1<<RXC)

            // USART Receiver buffer
            #define RX_BUFFER_SIZE 16
            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 ببینید اینجا اینتراپت rx فعال میشه ...
            interrupt [USART_RXC] void usart_rx_isr(void)
            {
            char status,data;
            status=UCSRA;
            data=UDR;
            if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
            {

            if (data=='#&#039 من دستورای شرطی رو اینجا نوشتم .. {
            rx_buffer[0]=data;
            rx_wr_index=1;
            }
            else if (rx_wr_index==1 && data=='0&#039
            {
            rx_buffer[rx_wr_index]=data;
            rx_wr_index=2;
            } به نظر شما جای دستورام درسته ؟
            else if (rx_wr_index==2 && data=='0&#039
            {
            rx_buffer[rx_wr_index]=data;
            rx_wr_index=3;
            }

            else if (rx_wr_index==3 && data=='\r&#039
            {
            rx_buffer[rx_wr_index]=data;
            senddata=1;
            } تا اینجا .....
            rx_buffer[rx_wr_index]=data;
            if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
            if (++rx_counter == RX_BUFFER_SIZE)
            {
            rx_counter=0;
            rx_buffer_overflow=1;
            };
            }; ولی دستورای بعدیشو نفهمیدم :cry2:
            }

            #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_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
            #asm("cli&quot
            --rx_counter;
            #asm("sei&quot
            return data;
            }
            #pragma used-
            #endif

            // Standard Input/Output functions
            #include <stdio.h>

            // Declare your global variables here

            void main(void)
            بعدشم برنامه اصلیه........


            ذکات علم یاد دادنه ....

            دیدگاه


              #7
              پاسخ : کاربرد وقفه در ارتباط سریال؟

              اتفاقا من با Cآ‌ کار می کنم و اصلا بیسیک بلد نیستم.

              آزمایش خوبیه هر چند در عمل باید از RS485آ‌ استفاده کنی. یعنی یه مشکل بزرگت اینه که RS232آ‌ نمی تونه همزمان به دو پورت وصل بشه. بعدا یه سری روش برای خوندن دو سنسور در مکانهی مختلف بهت میگم. ولی اسم سنسور دماتو بگو.

              حالا بریم سراغ برنامه
              منم زیاد از اون چه کد ویژن تولید می کرد خوشم نمیومد و تغییرش دادم.

              این یه برنامه است مال PLCآ‌ هایی که تولید می کنم. قسمت پورت سریالش اینتراپتیه و خیلی بدردت می خوره:

              http://rapidshare.com/files/228032613/plc7.c.html



              با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

              دیدگاه


                #8
                پاسخ : کاربرد وقفه در ارتباط سریال؟

                اقا ممنم برنامتونو دیدم منکه گیج شدم ولی از اینتراپتا یه چیزای دست گیرم شد
                ممنون
                سنسوری که می خوام استفاده کنم LM35
                در ضمن نمیشه از پایه های خالیه RS232 استفاده کرد؟ (7-8-9-10)
                ذکات علم یاد دادنه ....

                دیدگاه


                  #9
                  پاسخ : کاربرد وقفه در ارتباط سریال؟

                  متاسفانه این پایه های خالی قابلیت ارسال دیتا را ندارند و برای کنترل مودمهای اکسترنال کاربرد دارند.

                  البته در یک صورت می تونی که کامپیوترت مثل مال من دو تا پورت RS232 داشته باشه :nice:

                  LM35آ‌ولتاژ میده .
                  پیشنهاد من اینه (البته ساده ترینش) بجای LM35 از سنسور دیگه ای استفاده کنی که امکان طولانی کردن سیمش باشه.

                  مثلا AD590آ‌ هم دقت بیشتری داره، هم فلزیه و گرما رو زودتر آشکار می کنه و هم اینکه خروجی جریان میده که میشه سیمشو طولانی کرد. تازه 2 سیمه هم کار میکنه.

                  سنسور دیگه smt160 هست که خروجی پالس میده و طولانی کردن سیمش با یک اشمیت تریگر جبران میشه و بجای ADC میکرو می تونی با تایمر میکرو بخونیش.

                  کلی سنسور جالب دیگه داریم که از LM35 صنعتی تر و جالبتره و باعث میشه یه میکرو جواب کارتو بده

                  با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                  دیدگاه


                    #10
                    پاسخ : کاربرد وقفه در ارتباط سریال؟

                    کامپیوتر من 1 پورت بیشتر نداره :redface: پس باید از RS 485 استفاده کنم
                    من فقط با mt160 و LM35 کار کردم اون بقیه رو کار نکردم .
                    اینکه میفرمائید LM35 خروجی ولتاژ میده یعنی تو مسیرهای طولانی افت ولتاژ پیدا میکنه؟ مگه RS485 برای این کار استفاده نمیکنیم (درضمن فکر کنم از بقیشون ارزونتر باشه )
                    فعلا بحث من درباره این اینتراپتای usert حالا بعد یه سنسور خوب براش پیدا میکنم . یه نکته که یادم اومد اینکه من تو اون برنامه ایی که گذاشتم تو اینتراپت rx شرط گذاشتم که اگر از طرف PC ادرس درست اومد (ادرس همون میکرو) میکرو اخرین دما رو به همراه ادرس خودش بفرسته که البته اینا رو اضافه نکردم ولی نمیدونم تو برنامه سریال هر چی میفرستم میکرو قبوا میکنه و پاسخ میده یعنی مثلا من #و2و4 بعدشم Enter رو میزنم میکرو جواب میده در حالی که ادرس خودش #00/r هست
                    اصلا اینگار شرطا رو نمیبینه یا من هنوز وارد نشدم ...... :nerd:

                    ذکات علم یاد دادنه ....

                    دیدگاه


                      #11
                      پاسخ : کاربرد وقفه در ارتباط سریال؟

                      سلام
                      مشکلم با اینتراپتا ظاهرا حل شد ولی بازم یه جای کار میلنگه ...
                      نمیدونم چطوری 2 تا میکرو رو به 1 پورت سریال کامپیوتر وصل کنم با RS232 که فقط میشه یه میکرو رو چک کرد اون یکیو چیکارش کنم؟
                      هر کاری کردم نشد حتی rx tx هر دو میکرو رو به هم وصل کردم و دادم تو RS232 بازم نشد
                      به نظر شما باید چکار کرد :sad:
                      ذکات علم یاد دادنه ....

                      دیدگاه


                        #12
                        پاسخ : کاربرد وقفه در ارتباط سریال؟

                        RX دوتا میکرو رو میشه به هم وصل کرد چون ورودیه. اما اگه میخوای TX دو میکرو رو به هم وصل کنی شرط داره. نباید هردو همزمان خروجی باشن.
                        پس باید اول برنامه هر دو TXآ‌ رو ورودی تعریف کنی. هر میکرو که آدرسش اومد TXآ‌ خودشو خروجی میکنه و میفرسته. بعد دوباره ورودیش میکنه که با دیگری اتصالی نکینه.
                        با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                        دیدگاه


                          #13
                          پاسخ : کاربرد وقفه در ارتباط سریال؟

                          منظورتون اینکه باید ریجیستر TX رو ورودی تعریف کنم ؟
                          میشه بگین چجوری ؟
                          البته ببخشیدا :redface:
                          ذکات علم یاد دادنه ....

                          دیدگاه


                            #14
                            پاسخ : کاربرد وقفه در ارتباط سریال؟

                            برای ورودی کردن پای TX

                            DDRD=DDRD & 253

                            برای خروجی کردن پای TX

                            DDRD=DDRD | 2
                            با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                            دیدگاه


                              #15
                              پاسخ : کاربرد وقفه در ارتباط سریال؟

                              نمیدونم چرا جواب نمیده فرمایشه شما رو هم اجرا کردم ولی نشد :cry2:
                              به نظر شما نباید ریجیستر UCSRB=0X98 رو تغیر بدم چون که در حالت پیش فرض این ریجیستر هم فرستنده هست هم گیرنده
                              (بیتهای 3=TXEN و 4=RXEN )
                              ذکات علم یاد دادنه ....

                              دیدگاه

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