اطلاعیه

Collapse
No announcement yet.

تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

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

    تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

    سلام. من با میکرو mega128 کار میکنم. usart1 رو به gps وصل کردم و با سرعت 9600 فقط ازش میخونم ( با وقفه) و روی یک حافظه ذخیره میکنم . بعد از مدت زمانی که یک مقدار اطلاعات ذخیره شد( حدود مثلا 500 ثانیه ) این اطلاعات رو از طریق usart0 به یک حافظه دیگه میریزم. (با سرعت 115200 ) .فرض کنید که این انتقال اطلاعات حدود 10 ثانیه زمان ببره . حالا من میخوام که اطلاعات اومده از gps نیز در این مدت زمان بازم ذخیره بشه و از بین نره. اما نمیدونم چرا مثلا نصف این زمان اطلاعات از بین میره!!! یعنی من نمیتونم 5 ثانیه اطلاعات رو ذخیره کنم. من فکر کنم تداخل وقفه ها مانع از دریافت اطلاعات میشه.
    اول برای ارسال اطلاعات ذخیره شده از دستور putchar استفاده میکنم بدون فعال کردن وقثه ارسال . بعدش اومدم وقفه ارسال رو هم فعال کردم ولی بازم مشکلم حل نشد ولی فکر کنم یه کم بهتر شد. اولویت وقفه اینجا مطرح نیست؟ آیا برنامه میتونه وسط فرستادن اطلاعات که با usart0 کار میکنه به محض رسیدن وقفه سریال gps که با usart1 کار میکنه به روتین مربوطه بره و اطلاعات رو ذخیره کنه؟

    راستی از کدویژن استفاده میکنم.

    ممنون
    "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
    در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

    #2
    پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

    کسی نبود کمک کنه؟
    "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
    در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

    دیدگاه


      #3
      پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

      "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
      در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

      دیدگاه


        #4
        پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

        وقفه ها در موقعی که با هم ارسال میشن و یا چیز دیگه اصلن مشکلی نداره
        اگه 32 تا وقفه رو هم دقیقن با هم اعمال کنی دقیقن به همگی رسیدگی میشه

        وقتی که توی مثلن مگا 128 2 تا وقفه سریال تعریف شده شما در یک زمان هم می تونی به هر دوتاش دیتا بفرستی
        ممکنه که توی برنامه ت توی زیر روال وقفه تایم طولانی داده باشی یا وقفه رو غیر فعال کرده باشی یا اصلن بیتهای بیشتری درخواست دذاده باشی یا از دستور ; برای وقفه استفاده نکرده باشی و ...
        تقصیر رو به میکرو ننداز
        مقصر برنامه نویسه
        فقط باید یادت باشه وقفه ها به هیچ عنوان الکی گم و گور نمیشن
        مگه اینکه اونقدر روال وقفه در و.قفه داشته باشی که حافظه پشته پر بشه






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

        دیدگاه


          #5
          پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

          سلام. ممنون از جوابتون
          برای ارسال اطلاعات روی USART0 از دستور PUTCHAR استفاده کردم. در ضمن وقفه فرستادن رو هم فعال کردم. وقتی وقفه فرستادن رو فعال میکنم خود کدویژن یک روتین مربوط به تابع putchar رو تو برنامه اضافه میکنه . موقع فرستادن از همین دستور استفاده میکنم. همین برای کار کردن با وقفه فرستادن کفایت میکنه؟ یعنی اونطوری که من دیدم این روتین میاد کاراکترهای پاس شده به خودش رو به بافر فرستادن اضافه میکنه و حالا نمیدونم که کار خاصی هم من باید انجام بدم یا اینکه با پر شدن بافر فرستادن ، خود وقفه فعال میشه و میفرسته؟

          یا از دستور ; برای وقفه استفاده نکرده باشی و
          کدوم دستور؟

          ممنون
          "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
          در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

          دیدگاه


            #6
            پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

            دستور هایی که نوشتم همش مربوط به بیسکام ه
            دستور ; در انتهای دستور دریافت استفاده میشه بعدش 1 عدد که ببینی چند تا بایت رو می خای بگیری



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

            دیدگاه


              #7
              پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

              سلام .
              1-چه جوری میتونیم بفهمیم که پشته دیتا پر شده یا نه؟
              2- وقتی که روتین مربوط به usart1 فعال میشه درون این روتین یک تابع رو صدا میزنم . حالا فرض کنیم اگه درون این تابع کارهایی که باید انجام بشه اونقدر طول میکشه تا دوباره یک بار دیگه وقفه دریافت سریال مجددا صدا زده بشه آیا اول به روتین وقفه رسیدگی میشه یا اینکه اول باید تابع تا آخر دستوراتش اجرا بشه بعدا بره سراغ وقفه جدید؟ راستی اینم بگم که usart1 به gps وصل شده و اطلاعات gps رو دریافت میکنه و جمله gprmc رو استخراج میکنه و در صورت رسیدن حجم اطلاعات دریافتی به 512 بایت درون یک حافظه nand flash ذخیره میکنه. همه این کارا توسط اون تابعی که گفتم انجام میشه. و به خوبی اطلاعات رو ذخیره میکنه ولی یک مشکل هستش

              وقتی که قراره این اطلاعات از طریق usart0 به بیرون ارسال بشه (اینو بگم که همچنان اطلاعات gps باید ذخیره بشه) از طریق وقفه ارسال usart0 و با تابع putchar اطلاعات خونده شده از فلش به بافر مربوط به ارسال usart0 قرار میگیره تا به بیرون ارسال بشه. این کار هم درست انجام میشه ولی نمیدونم چرا هراز چند گاهی به یک علت نامعلومی به جای اطلاعات gprmc که درون فلش ذخیره شده کاراکتر ؟ به یک تعدادی مثلا 100 تا 200 تا به بیرون ارسال میشه. نمیدونم شاید از پر شدن پشته باشه یا نمیدونم مشکل از کجاست؟
              لطفا راهنمایی کنید
              "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
              در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

              دیدگاه


                #8
                پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

                بنظرم تا حد زیادی حق با آقای باقرانی باشه. بنظر میاد که منطق برنامه تون با منطق مشکلتون همخوانی نداشته باشه. مثلا استفاده از وقفه ارسال اطلاعات سریال برای خطی با سرعت 115200 یعنی هر تقریبا 100 میکرو ثانیه یک وقفه. تازه بقیه وقفه ها هم هستن. و بخاطر این که معمولا از کدهای خوبی داخل وقفه استفاده نمیشه این میزان ممکنه خیلی کم باشه و کد تون رو در عمل با مشکل مواجه کنه.
                تازه غیر از اون همینجا مشکل رو خودتون قید کردین.
                بعد از مدت زمانی که یک مقدار اطلاعات ذخیره شد( حدود مثلا 500 ثانیه ) این اطلاعات رو از طریق usart0 به یک حافظه دیگه میریزم. (با سرعت 115200 ) .فرض کنید که این انتقال اطلاعات حدود 10 ثانیه زمان ببره
                با سرعت 9600 یعنی 870 بایت در ثانیه. و با این سرعت رم 4 کیلو بایتی شما در عرض چیزی کمتر از 5 ثانیه پر میشه. پس این قضیه 500 ثانیه یک صدم اون چیزیه که شما میخوایین. و این نشدنیه. یه کمی بشینین چیزایی رو که میخوایین و چیزایی رو که دارین مرتب کنین و یک منطق درست برای برنامه تون در بیارین. مشکلتون بابت اینه که نمیدونین واقعا چی میخوایین. و فکر میکنین یک وقفه میتونه براتون معجزه کنه.
                حجم اطلاعات دریافتی در عرض 10 ثانیه روی خط 9600 میشه نزدیک به 8700 بایت! (روی خط 9600 حساب کردم). و حجم رم میکروتون 4096 بایته. تازه به حجم پشته ها هم اصلا کاری ندارم.

                دیدگاه


                  #9
                  پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

                  سلام آقا رضای گرامی
                  10 ثانیه رو برای مثال گفتم.همه چی مشخص هستش . با سرعت 9600 اطلاعات به سمت usart1 میاد و من همه اون رو که ذخیره نمیکنم . صبر میکنم که جمله مربوط به gprmc بیاد و بعد اون رو تا رسیدن به علامت $ که شروع رشته بعدی باشه ذخیره میکنم و هر جمله gprmc در حالت valid بودن دیتا حدود 72 بایت هستش. و من یک بافر 1800 بایتی برای usart1 در نظر گرفتم و یک حافظه 600 بایتی برای ذخیره جمله های gprmc .

                  هر 8 ثانیه پس این حافظه 600 بایتی پر میشه و بعد از پر شدن، اونو داخل nand flash ذخیره میکنم . تمام این کارها به خوبی انجام میشه. حالا وقتی که تو یه حلقه بی نهایت تو یه قسمت برنامه این اطلاعات ذخیره شده رو میخوام از طریق usart0 به بیرون ارسال کنم (مثلا حجم 500 کیلو بایت باید به بیرون ارسال بشه) پس هم usart0و هم usart1 با هم باید کار کنن. یک بافر 200 بایتی هم برای ارسال usart0 در نظر گرفتم. میکرو شروع میکنه به فرستادن اطلاعات و در یعضی مواقع به جای اطلاعاتی که تو فلش ذخیره شده کاراکتر ؟ رو میفرسته. ولی اکثر مواقع توی این 500 کیلو بایت فقط 200 بایت ؟ فرستاده میشه . در ضمن باید بگم که در این مدت همه جملات gprmc با دقت 1 ثانیه درست ذخیره میشوند.

                  خیلی ممنون میشم که کمکم کنید.
                  "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
                  در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

                  دیدگاه


                    #10
                    پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

                    شما باید برای پورت اولی یک بافر تعریف کنی تا مشکلت حل بشه. بعد برنامه رو شرطی می نویسی که اگر داده ای به بافر شماره 1 وارد شد همون موقع به خروجی پورت دوم بره.
                    ...............................................

                    آسایش دو گیتی تفسیر این دو حرف است
                    Ctrl+C , Ctrl+V
                    .................................................. ....

                    دیدگاه


                      #11
                      پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

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

                      ممنون
                      "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
                      در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

                      دیدگاه


                        #12
                        پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

                        ببینم سورس برنامه رو میتونی بذاری؟ لااقل اون قسمتی که روی سریال دوم چیز میفرسته. اگه هم نمیشه بگین ببینم موقعی که داره روی سریال دوم چیزی میفرسته کار دیگه ای (غیر از دریافت اطلاعات از پورت اول) باید انحام بده یا نه؟

                        دیدگاه


                          #13
                          پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان


                          eeprom unsigned int BT_BlockReaderPointer[MaxDim] ={0xffff};
                          eeprom unsigned int BT_PageReaderPointer[MaxDim]={0xffff};

                          eeprom unsigned int BT_BlockReaderCnt=0,BT_PageReaderCnt=0

                          main section
                          {
                          .....
                          .....
                          .....
                          while(BT_DCD_PIN==0 )
                          {
                          if(( BT_BlockReader < main_block ) || ( BT_BlockReader == main_block && BT_PageReader < main_page ))
                          {

                          K9_page_read_SendBT(BT_BlockReader, BT_PageReader);



                          if (BT_PageReader<63)
                          {
                          BT_PageReader++;
                          BT_PageReaderPointer[BT_PageReaderCnt]=BT_PageReader;
                          for(r=0;r<700;r++); // delay_ms(1);
                          if(BT_PageReaderPointer[BT_PageReaderCnt]!=BT_PageReader)
                          {
                          BT_PageReaderCnt++;
                          BT_PageReaderPointer[BT_PageReaderCnt]=BT_PageReader;
                          }

                          }
                          else
                          {
                          BT_PageReader=0;
                          BT_PageReaderPointer[BT_PageReaderCnt]=0;
                          for(r=0;r<700;r++); // delay_ms(1);
                          if(BT_PageReaderPointer[BT_PageReaderCnt]!=0)
                          {
                          BT_PageReaderCnt++;
                          BT_PageReaderPointer[BT_PageReaderCnt]=0;
                          }

                          if(BT_BlockReader<2046)
                          {
                          BT_BlockReader++;

                          while(K9_check_bad_block(BT_BlockReader)==1)// && main_block<2047)
                          {
                          UpdateBadBlockTable(BT_BlockReader);
                          BT_BlockReader++;
                          BT_BlockReader =BT_BlockReader %2048;
                          };

                          BT_BlockReaderPointer[BT_BlockReaderCnt]=BT_BlockReader;
                          for(r=0;r<700;r++); //delay_ms(1);
                          if(BT_BlockReaderPointer[BT_BlockReaderCnt]!=BT_BlockReader)
                          {
                          BT_BlockReaderCnt++;
                          BT_BlockReaderPointer[BT_BlockReaderCnt]=BT_BlockReader;
                          }

                          }
                          else
                          {
                          BT_BlockReader=0;

                          while(K9_check_bad_block(BT_BlockReader)==1)
                          {
                          UpdateBadBlockTable(BT_BlockReader);
                          BT_BlockReader++;
                          BT_BlockReader =BT_BlockReader %2048;
                          };

                          BT_BlockReaderPointer[BT_BlockReaderCnt]=BT_BlockReader;
                          for(r=0;r<700;r++); //delay_ms(1);
                          if(BT_BlockReaderPointer[BT_BlockReaderCnt]!=BT_BlockReader)
                          {
                          BT_BlockReaderCnt++;
                          BT_BlockReaderPointer[BT_BlockReaderCnt]=BT_BlockReader;
                          }


                          }

                          }
                          }

                          else
                          {
                          putchar('X'putchar('X'putchar('X'
                          putchar(13);putchar(10);
                          SendDCToUD100();

                          }
                          };
                          ...
                          ...
                          ...

                          } //main section end

                          void K9_page_read_SendBT(unsigned int block,unsigned int page)
                          {
                          int strcnt=0;
                          unsigned int byte=0;
                          char ReadDt;

                          BT_SENDING_LED_ON;
                          cycle1=byte;
                          cycle2=((byte>>8)&0x0F);
                          cycle3=((page&0x3F)|(block<<6));
                          cycle4=(block>>2);
                          cycle5=((block>>10)&0x01);

                          K9_write_cmd(READ_C1);
                          K9_write_add(cycle1);
                          K9_write_add(cycle2);
                          K9_write_add(cycle3);
                          K9_write_add(cycle4);
                          K9_write_add(cycle5);
                          K9_write_cmd(READ_C2);


                          delay_ms(1);// 25us

                          ReadDt=0;


                          while(strcnt<2040) //read until reaches to 0xff
                          {

                          ReadDt=K9_read_data();

                          if(ReadDt !=0xff )
                          putchar(ReadDt) ;
                          else
                          break;
                          strcnt++;

                          }
                          BT_SENDING_LED_OFF;

                          }
                          "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
                          در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

                          دیدگاه


                            #14
                            پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

                            کد بالا برای فرستادن اطلاعات روی usart0 هستش.
                            تابع K9_page_read_SendBT برای خواندن اطلاعات از nand flash نوع سامسونگ هستش و نوشتن آن روی پورت سریال.
                            حلقه تا زمانی که BT_DCD_PIN برابر 0 باشد ادامه دارد.
                            یه اشاره ای بکنم به ساختار nand flash که از 2047 بلوک و هر بلوک 63 صفحه و هر صفحه حدود 2100 بایت داره. برای خواندن از فلش میاد بررسی میکنه که آیا آدرس بلوک و یا صفحه از آدرس خواندن جلوتر هستش یا نه . یعنی اگه اطلاعاتی نوشته شده بود فرستاده میشه در غیر اینصورت به بخش انتهایی میره و تابع SendDCToUD100 برای قطع ارتباط فرستاده میشه و هیچ دیتایی ارسال نمیشه.
                            اینم بگم که تابع K9_page_read_SendBT در هر بار صدا زدن تقریبا 2040 بایت رو که معادل یک صفحه توی nand flash میشه رو میفرسته و حالا باید متغیر مربوط به صفحه جاری زیاد بشه و اگه تعداد صفحه به 63 رسید متغیر مربوط به نگهداری صفحه رو صفر میکنه و به متغیر نگهدارنده بلوک یک واحد اضافه میکنه. حالا این متغیر ها درون eeprom ذخیره میشه . برای اینکه خونه های eeprom بعد از مدتی ممکنه خراب بشه از یک آرایه 30 خونه ای برای هر کدوم استفاده کردم و اگه بعد از نوشتن و صبر کردن برای حدود 1 میلی ثانیه مقدار نوشته شده در eeprom بامقدار آن در حافظه برابر نبود یعنی اون خونه eeprom خراب شده و باید در خونه بعدی مربوط به همان متغیر نوشته شود. همونطور که میبینید علاوه بر فرستادن دیتا روی خط سریال و گرفتن دیتا از gps کارهایی از این قبیل هم داره انجام میشه و اینکه بعد از هر بار نوشتن توی eeprom حدود 1 میلی ثانیه هم صبر میکنه. باز هم اگه نیاز به توضیح بیشتری بود بفرمایین.

                            ممنون

                            "در عجبم از مردمي که خود زير شلاق ظلم و ستم زندگي مي کنند و بر حسيني مي گريند که آزادنه زيست" شريعتي
                            در جهان روشنايي هايي وجوددارد كه در عميق ترين ظلمات نهانند.

                            دیدگاه


                              #15
                              پاسخ : تداخل در گرفتن و ارسال دیتا از دو پورت سریال میکرو mega128 به طور همزمان

                              روال وقفه اش رو هم میتونین بذارین؟

                              دیدگاه

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