اطلاعیه

Collapse
No announcement yet.

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

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

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

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

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

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

    دیدگاه


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

      سلام. زمان بیکاری به نظر من وجود نداره. هر 1 ثانیه یک بار gps هشت جمله مختلف رو که یکی از اونها gprmc هستش رو میفرسته و من فقط احتیاج به این جمله دارم پس از زمانی که این جمله تموم میشه تا وقتی که جمله بعدی gprmc بیاد تقریبا 1 ثانیه زمان داریم. تو این یک ثانیه اطلاعات توی اون حافظه 600 بایتی ذخیره نمیکنم. اگه ساختار nand flash اجازه میداد بلافاصله توی خود فلش ذخیره میکردم . پس این زمان مناسبیه که gprmc رو استخراج کنم و درون حافظه ذخیره کنم. پس زمانی برای نشخوار کردن نیست دیگه.
      همیشه این gps داره میفرسته. کد مربوط به روتین رو هم میزارم.

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

      دیدگاه


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





        // USART0 Transmitter buffer
        #define TX_BUFFER_SIZE0 200
        char tx_buffer0[TX_BUFFER_SIZE0];

        #if TX_BUFFER_SIZE0<256
        unsigned char tx_wr_index0,tx_rd_index0,tx_counter0;
        #else
        unsigned int tx_wr_index0,tx_rd_index0,tx_counter0;
        #endif

        // USART0 Transmitter interrupt service routine
        interrupt [USART0_TXC] void usart0_tx_isr(void)
        {
        if (tx_counter0)
        {
        --tx_counter0;
        UDR0=tx_buffer0[tx_rd_index0];
        if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
        };
        }

        #ifndef _DEBUG_TERMINAL_IO_
        // Write a character to the USART0 Transmitter buffer
        #define _ALTERNATE_PUTCHAR_
        #pragma used+
        void putchar(char c)
        {
        while (tx_counter0 == TX_BUFFER_SIZE0);
        #asm("cli&quot
        if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
        {
        tx_buffer0[tx_wr_index0]=c;
        if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
        ++tx_counter0;
        }
        else
        UDR0=c;
        #asm("sei&quot
        }
        #pragma used-
        #endif







        // USART1 Receiver buffer
        #define RX_BUFFER_SIZE1 1900//1800
        char rx_buffer1[RX_BUFFER_SIZE1];

        #if RX_BUFFER_SIZE1<256
        unsigned char rx_wr_index1,rx_rd_index1,rx_counter1;
        #else
        unsigned int rx_wr_index1,rx_rd_index1,rx_counter1;

        #endif

        unsigned int cnt;
        unsigned int GPRMC_START_INDEX;

        // This flag is set on USART1 Receiver buffer overflow
        //bit rx_buffer_overflow1;
        // #pragma savereg-
        // USART1 Receiver interrupt service routine
        interrupt [USART1_RXC] void usart1_rx_isr(void)
        {
        char status,data;

        status=UCSR1A;
        data=UDR1;
        if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
        {
        rx_buffer1[rx_wr_index1]=data;
        if (rx_buffer1[rx_wr_index1]=='$&#039
        {
        Q=0;
        SS++;

        GPRMC_START_INDEX=rx_wr_index1;
        cnt=GPRMC_START_INDEX;
        }
        if (++rx_wr_index1 == RX_BUFFER_SIZE1)
        rx_wr_index1=0;
        if(State==RUN)
        GetGPRMC2();
        };


        }

        void GetGPRMC2()
        {
        int rc;
        if( rx_buffer1[(GPRMC_START_INDEX+1)%RX_BUFFER_SIZE1]=='G' && rx_buffer1[(GPRMC_START_INDEX+2)%RX_BUFFER_SIZE1]=='P' && rx_buffer1[(GPRMC_START_INDEX+3)%RX_BUFFER_SIZE1]=='R' && rx_buffer1[(GPRMC_START_INDEX+4)%RX_BUFFER_SIZE1]=='M' && rx_buffer1[(GPRMC_START_INDEX+5)%RX_BUFFER_SIZE1]=='C' )// && rx_buffer1[(GPRMC_START_INDEX+6)%100]==',' )
        {

        hasRecAllGPRMC=false;

        if(rx_buffer1[(cnt+5)%RX_BUFFER_SIZE1]!='\n&#039
        {
        GPRMC[rx_GPRMC_cnt+5+Q]=rx_buffer1[(cnt+5)%RX_BUFFER_SIZE1];
        cnt++;
        }
        else
        {


        GPS_REC_LED__BLINK;
        if(Q>=10)
        {
        GPRMC[rx_GPRMC_cnt]='$';GPRMC[rx_GPRMC_cnt+1]='G';GPRMC[rx_GPRMC_cnt+2]='P';GPRMC[rx_GPRMC_cnt+3]='R';GPRMC[rx_GPRMC_cnt+4]='M'; //GPRMC[rx_GPRMC_cnt+5]='C';// GPRMC[rx_GPRMC_cnt+6]=',';
        rx_GPRMC_cnt +=(Q+5);
        GPRMC[rx_GPRMC_cnt]='\n';
        hasRecAllGPRMC=true;
        Gprmc_Len=Q+5;

        if(Error==true)
        { rx_GPRMC_cnt -=(Q+5); Gprmc_Len=0; }


        Error=false;
        }
        else
        Error=true;

        rx_GPRMC_cnt %=600;
        }
        Q++;
        }
        if(hasRecAllGPRMC==true)
        {
        Pars_GPRMC_Speed();
        if (rx_GPRMC_cnt>=500 ) //500
        {

        rc=K9_page_write(main_block,main_page,main_byte,rx _GPRMC_cnt,GPRMC);
        while (rc==NAND_IO_RC_FAIL || rc==NAND_IO_RC_TIMEOUT)
        {
        UpdateBadBlockTable(main_block);
        next_block=main_block;
        GetNextGoodBlock(&next_block);
        main_block=next_block;
        rc=K9_page_write(main_block,main_page,main_byte,rx _GPRMC_cnt,GPRMC);

        };
        main_byte+=(rx_GPRMC_cnt+0);
        rx_GPRMC_cnt=0;
        SetWriterBytePointer(main_byte);

        }

        if ( main_byte+rx_GPRMC_cnt>=1900 )
        {

        if (main_page<=62)
        {
        K9_page_write(main_block,main_page,main_byte,rx_GP RMC_cnt,GPRMC);

        main_page++;
        main_byte=0;
        SetWriterPagePointer(main_page);
        SetWriterBytePointer(main_byte);
        }
        else
        {
        K9_page_write(main_block,main_page,main_byte,rx_GP RMC_cnt,GPRMC);

        main_page=0;
        main_byte=0;

        SetWriterPagePointer(main_page);
        SetWriterBytePointer(main_byte);
        if (main_block <=2046)
        {

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

        SetWriterPagePointer(main_page);
        SetWriterBlockPointer(main_block);
        SetWriterBytePointer(main_byte);
        }
        else
        {
        main_byte=0;
        main_page=0;
        main_block=0;
        while(K9_check_bad_block(main_block)==1)// && main_block<2047)
        {
        UpdateBadBlockTable(main_block);
        main_block++;
        main_block =main_block %2048;
        };
        SetWriterBlockPointer(main_block);
        SetWriterBytePointer(main_byte);
        SetWriterPagePointer(main_page);
        }
        EraseBlock(main_block);
        }
        rx_GPRMC_cnt=0;
        }

        hasRecAllGPRMC=false;


        }



        }

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

        دیدگاه


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

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

          دیدگاه


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

            ولله بنظر میاد این کدتون با نشخوار کردن!!!! خیلی فرقی نداشته باشه. چون کی میاد وسط روال وقفه این قده کد اجرا کنه؟ بهتر نبود با یک ماشین وضعیت (که برای من شده یه جور اعتیاد!) فریم رو تشخیص میدادین و در ازای اون یک پیغام برای روال اصلی برنامه میفرستادین تا این پیغام اونجا پردازش بشه؟ یا حداقل قبل از اجرای GetGPRMC2 وقفه ها رو فعال کنین.

            پیشنهاد: میتونین کل کدتون رو بدین تا امشب که کله ام گرمه!!! یک نگاهی بهش بکنم و یک کد دیگه از روش بسازم و بهتون برسونم. شاید تونستم مشکلتون رو حل کنم یا لااقل خیلی کمش کنم.

            دیدگاه


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

              http://www.4shared.com/document/szsqzMOE/11_online.html
              "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
              در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

              دیدگاه


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

                سلام. اینطوری هم مشکلی نداره ها . میرسه همه اطلاعات رو ذخیره کنه. ولی اولش که از خط if(hasRecAllGPRMC==true) به بعد رو هم که داخل main گذاشته بودم رو هم کار میکرد بعد یه جاهایی که میخواست اطلاعات رو بفرسته نمیتونست به موقع به اون قسمت از کد برسه که مربوط به ذخیره اطلاعات توی فلش بود برسه . به خاطر همین GPRMC پر میشد و overflow میشد و اطلاعات از دست میپرید. بعد اومدم این کار رو کردم و ذخیره اطلاعات رو هم بردم تو تابع GETGPRMC2 . ولی بازم ذخیره میکرد.


                الان به این نتیجه رسیدم که دوباره اون کد مربوط به ذخیره اطلاعات رو بیارم توی main و ایندفعه برای فرستادن اطلاعات به بیرون از یک حلقه کوچکتر استفاده کنم یعنی هر بار توی حلقه نیاد 2کیلو بایت دیتا رو بفرسته . بجاش بیاد 72 بایت 72 بایت بفرسته که بتونه ذخیره هم بکنه.

                کد خیلی زیاده. ولی قسمتهای اصلی رو براتون میفرستم. ممنون از لطفتون
                یه سوال . من میخوام از getchar1 برای گرفتن gps استفاده کنم. ولی نمیزارم که برنامه معطل این تابع بشه یعنی میگم اگه بافر یه چیزی توش بود بیاد getchar1 رو صدا بزنه و اطلاعات بافر رو بخونه.
                بعد اون حلقه فرستادن رو هم کوچیکتر میکنم. مثل کدی که براتون میفرستم. میشه نظرتون رو راجع به این هم بدین
                ممنون
                "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
                در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

                دیدگاه


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

                  بزرگیش مهم نیست! من به چیزای بزرگ عادت دارم!! مثل اینه که بگین آش رشته ام مشکل داره. موادش؟ بگین آب و نخود و لوبیا و چند تا چیز دیگه!

                  دیدگاه


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

                    این کد بهتر شده
                    http://www.4shared.com/document/iACM9cUN/22_online.html
                    "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
                    در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

                    دیدگاه


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


                      سلام وقتتون بخیر و شادی .
                      میبخشین وقتتون رو میگیرم .
                      من با atmega 128 کار میکنم با نرم افزار بسکام . مشکل اینه که وقتی پورت سریال 1 رو کانفیگ میکنم به صورت سخت افزاری و در برنامه دستور print#1 رو مینویسم یایه ارسال داده در پورت سریال 0 به صروت خروجی فعال و یک میشود در حالی که من تمام پورت portE رو به صورت ورودی تعریف کردم .
                      به دلیل شرایط سخت افزاری مجبور شدم از پورت 1 سریال 128 استفاده کنم .دلیل اینکه پایه tx0 یک میشود و به صورت خروجی فعال میشود رو نمیدونم
                      ممنون میشم کمکم کنین تا دلیل این موضوع رو متوجه بشم که این دوتا پورت سریال که از هم مستقل هستند چرا همچین ناثیری پورت 1 در پورت 0 میذاره .
                      سعی کردم کوتاه باشه تا وقتتون رو زیاد نگیره .نیاز به توضیح بیشتر هست بفرمایید .
                      با تشکر فراوان منتظرم

                      دیدگاه

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