اطلاعیه

Collapse
No announcement yet.

مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

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

    مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

    سلام. من تو کدویژن متغیر unsigned long int تعریف میکنم ولی بازم سرریز اتفاق میوفته در صورتی که مقدار من یه عدد 6 رقمی هست که از کیپد گرفته میشه. یعنی نهایتا مقدار 999999
    خیلی سرچ کردم، bit variables رو روی 64 گذاشتم ولی بازم تاثیر نداشت.
    من میخوام این مقدار 0 تا 999999 رو که از کیپد گرفته میشه، داخل یه رجیستر 28 بیتی بریزم. خوده برنامه Warning میده که نیاز به تعریف متغیر از نوع long هست ولی من long تعریف کردم ولی بازم میگه امکان سرریز وجود داره.
    ممنون

    #2
    پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

    نوشته اصلی توسط amirna3r
    سلام. من تو کدویژن متغیر unsigned long int تعریف میکنم ولی بازم سرریز اتفاق میوفته در صورتی که مقدار من یه عدد 6 رقمی هست که از کیپد گرفته میشه. یعنی نهایتا مقدار 999999
    خیلی سرچ کردم، bit variables رو روی 64 گذاشتم ولی بازم تاثیر نداشت.
    من میخوام این مقدار 0 تا 999999 رو که از کیپد گرفته میشه، داخل یه رجیستر 28 بیتی بریزم. خوده برنامه Warning میده که نیاز به تعریف متغیر از نوع long هست ولی من long تعریف کردم ولی بازم میگه امکان سرریز وجود داره.
    ممنون
    سلام
    کدتون رو بگذارید
    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
    معرفی نرم افزار Codewizard PWM
    با من بیشتر آشنا شوید

    دیدگاه


      #3
      پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

      frq=(key*100000);
      frq+=(key*10000);
      frq+=(key*1000);
      frq+=(key*100);
      frq+=(key*10);
      +frq=(key);
      این کدی که گذاشتم کامل نیست. هر دفعه میاد مقدار key رو میخونه، به ترتیب از بالا به پایین، یعنی دفعه اول key رو میخونه بعد ضرب در 100000 بعد میریزه تو frq
      به همین ترتیب تا اخر...
      تو تست برنامه دقیقا تا مقدار 9999 جواب گرفتم، به محض اینکه 10000 میشه دیگه سرریز میشه!
      فقط نیاز به یه متغیر 32 بیتی دارم همین! برنامه مشکلی نداره :sad:

      دیدگاه


        #4
        پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

        نوشته اصلی توسط amirna3r
        frq=(key*100000);
        frq+=(key*10000);
        frq+=(key*1000);
        frq+=(key*100);
        frq+=(key*10);
        +frq=(key);
        این کدی که گذاشتم کامل نیست. هر دفعه میاد مقدار key رو میخونه، به ترتیب از بالا به پایین، یعنی دفعه اول key رو میخونه بعد ضرب در 100000 بعد میریزه تو frq
        به همین ترتیب تا اخر...
        تو تست برنامه دقیقا تا مقدار 9999 جواب گرفتم، به محض اینکه 10000 میشه دیگه سرریز میشه!
        فقط نیاز به یه متغیر 32 بیتی دارم همین! برنامه مشکلی نداره :sad:
        به صورت نمادین رفتار کن ...
        به جای اینکه بنویسی 10000 بنویس 1e4
        این رو تست کن ببین جواب میگیری ؟
        [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
        معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
        معرفی نرم افزار Codewizard PWM
        با من بیشتر آشنا شوید

        دیدگاه


          #5
          پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

          این کارو کردم warning سرریز رفع شد ولی مشکل هنوز پابرجاست! حتی مقدار دهی رجیستر دیگه درست انجام نمیشه!

          دیدگاه


            #6
            پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

            نوشته اصلی توسط amirna3r
            این کارو کردم warning سرریز رفع شد ولی مشکل هنوز پابرجاست! حتی مقدار دهی رجیستر دیگه درست انجام نمیشه!
            میشه کدتون رو کامل بگذارید ؟؟ وسط دو کروشه کدتون رو بگذارید ...
            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
            معرفی نرم افزار Codewizard PWM
            با من بیشتر آشنا شوید

            دیدگاه


              #7
              پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

              کد:
              lcd_clear(); 
                 lcd_putsf("Frequency: "); 
                 lcd_gotoxy(0,1);
                 lcd_putsf("Hz");
                 
                 keypad(); 
                 frq=(key*1e5);
                 frq_dis=key;
                 itoa(frq_dis,dis);
                 lcd_gotoxy(10,0);
                 lcd_puts(dis); 
                 
                 keypad(); 
                 frq+=(key*1e4);
                 frq_dis=key;
                 itoa(frq_dis,dis);
                 lcd_gotoxy(11,0);
                 lcd_puts(dis);
                 
                 keypad();
                 frq=(key*1e3);
                 frq_dis=key;
                 itoa(frq_dis,dis);
                 lcd_gotoxy(12,0);
                 lcd_puts(dis);
              
                  keypad();
                 frq+=(key*1e2);
                 frq_dis=key;
                 itoa(frq_dis,dis);
                 lcd_gotoxy(13,0);
                 lcd_puts(dis);
              
                 keypad();
                 frq+=(key*1e1);
                 frq_dis=key;
                 itoa(frq_dis,dis); 
                 lcd_gotoxy(14,0);  
                 lcd_puts(dis);
              
                 keypad();
                 frq+=(key); 
                 frq_dis=key;
                 itoa(frq_dis,dis);  
                 lcd_gotoxy(15,0);
                 lcd_puts(dis);
              در نهایت مقدار frq در 26 ضرب میشه

              دیدگاه


                #8
                پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

                نوشته اصلی توسط amirna3r
                کد:
                lcd_clear(); 
                   lcd_putsf("Frequency: "); 
                   lcd_gotoxy(0,1);
                   lcd_putsf("Hz");
                   
                   keypad(); 
                   frq=(key*1e5);
                   frq_dis=key;
                   itoa(frq_dis,dis);
                   lcd_gotoxy(10,0);
                   lcd_puts(dis); 
                   
                   keypad(); 
                   frq+=(key*1e4);
                   frq_dis=key;
                   itoa(frq_dis,dis);
                   lcd_gotoxy(11,0);
                   lcd_puts(dis);
                   
                   keypad();
                   frq=(key*1e3);
                   frq_dis=key;
                   itoa(frq_dis,dis);
                   lcd_gotoxy(12,0);
                   lcd_puts(dis);
                
                    keypad();
                   frq+=(key*1e2);
                   frq_dis=key;
                   itoa(frq_dis,dis);
                   lcd_gotoxy(13,0);
                   lcd_puts(dis);
                
                   keypad();
                   frq+=(key*1e1);
                   frq_dis=key;
                   itoa(frq_dis,dis); 
                   lcd_gotoxy(14,0);  
                   lcd_puts(dis);
                
                   keypad();
                   frq+=(key); 
                   frq_dis=key;
                   itoa(frq_dis,dis);  
                   lcd_gotoxy(15,0);
                   lcd_puts(dis);
                در نهایت مقدار frq در 26 ضرب میشه
                وای وای وای ....
                چقدر اشکال داره ...
                چرا الگوریتم برنامه رو به این شکل نوشتید ؟
                میخواین چیکار کنید ؟؟ بگید تا کامل راهنماییتون کنم ...
                در حقیقت میخواین یه عددی رو از کیپد بگیرید و روی LCD نمایش بدید ... درسته ؟
                [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                معرفی نرم افزار Codewizard PWM
                با من بیشتر آشنا شوید

                دیدگاه


                  #9
                  پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

                  هم روی lcd نمایش بدم و هم داخل یه متغیر بریزم که در نهایت توسط spi برای یه ایسی بفرستم.
                  ولی در اون حدی که شما فرمودین فکر نکنم مشکل داشته باشه! :biggrin:
                  هر بخش رو به یه دلیلی اینجوری نوشتم!!! قراره یه فانکشن درست کنم که فرکانس و دامنه رو به صورت دیجیتال تغییر بدم.
                  ممنون

                  دیدگاه


                    #10
                    پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

                    نوشته اصلی توسط amirna3r
                    هم روی lcd نمایش بدم و هم داخل یه متغیر بریزم که در نهایت توسط spi برای یه ایسی بفرستم.
                    ولی در اون حدی که شما فرمودین فکر نکنم مشکل داشته باشه! :biggrin:
                    هر بخش رو به یه دلیلی اینجوری نوشتم!!! قراره یه فانکشن درست کنم که فرکانس و دامنه رو به صورت دیجیتال تغییر بدم.
                    ممنون
                    این قالب کلی شما هست و باید این کد رو خودتون پیش ببرید
                    [code=c]#include <stdlib.h>
                    #define enter 15
                    #define delete 14
                    unsigned char k , Max_digit = 0;
                    long int digit=0;
                    char _char[15];

                    void main(void)
                    {
                    /*
                    .......
                    .......
                    .......
                    .......
                    enter code and Setting
                    .......
                    .......
                    .......
                    .......
                    */
                    while(1)
                    {
                    k=key();

                    if(k < 10 && Max_digit < 9)// 0 to 9 and 9digit
                    {
                    digit *= 10;
                    digit += k;
                    Max_digit ++ ;
                    ltoa(digit,_char);
                    lcd_clear();
                    lcd_puts(_char);
                    while(key()<10);
                    }
                    else if(k == delete)
                    {
                    digit = 0;
                    Max_digit = 0;
                    lcd_clear();
                    while(key()<delete);
                    }
                    else if(k == enter)
                    {
                    //Enter code for setup fryquency
                    while(key()<enter);
                    }

                    }
                    }[/code]

                    خیلی از چیزهاش رو نگذاشتم خودتون دیگه باید بفهمید که چیکار باید بکنید ...
                    سوالی بود در خدمتم
                    موفق باشید
                    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                    معرفی نرم افزار Codewizard PWM
                    با من بیشتر آشنا شوید

                    دیدگاه


                      #11
                      پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

                      خیلی ممنون که وقت گذاشتین. دست شما درد نکنه.
                      برنامه کلی من فقط این قسمت نیست. خیلی بیشتر از این حرفاست.
                      مشکل تو تعریف متغیر هست دوست عزیز. چرا یه متغیر از نوع long رو که تعریف میکنم مقدارش 32 بیتی نیست؟!
                      برنامه من درست عمل میکنه! بنا به محدودیت هایی که وجود داره و نوع درخواست برنامه رو به این شکل نوشتم.
                      دلیل اینکه متغیر 32 بیتی ایجاد نمیشه چیه؟

                      دیدگاه


                        #12
                        پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

                        نوشته اصلی توسط amirna3r
                        خیلی ممنون که وقت گذاشتین. دست شما درد نکنه.
                        خواهش میکنم ...

                        نوشته اصلی توسط amirna3r
                        برنامه کلی من فقط این قسمت نیست. خیلی بیشتر از این حرفاست.
                        خودم میدونم ... قلب برنامه شما همینه که گذاشتم ... بقیه برنامه فکر نکنم که زیاد سخت باشه ...

                        نوشته اصلی توسط amirna3r
                        مشکل تو تعریف متغیر هست دوست عزیز. چرا یه متغیر از نوع long رو که تعریف میکنم مقدارش 32 بیتی نیست؟!
                        شما از کجا متوجه میشید که 32 بیتی نیست ؟؟ این 32 بیتی هست ولی با علامت ...
                        حالا اگر میخواین که اون متغیر بدون علامت باشه که باید اون رو بریزید توی یه متغیر دیگه unsigned long int ...

                        نوشته اصلی توسط amirna3r
                        برنامه من درست عمل میکنه! بنا به محدودیت هایی که وجود داره و نوع درخواست برنامه رو به این شکل نوشتم.
                        محدودیت شما اینه که نمی توانید یک متغیر 32 بیتی بسازید ؟؟

                        نوشته اصلی توسط amirna3r
                        دلیل اینکه متغیر 32 بیتی ایجاد نمیشه چیه؟
                        مگه میشه ؟؟
                        من ایجاد کردم شد ... میکروی شما چی هست ؟؟

                        یه سوال
                        بالاترین عددی که میخواستین چه قدره ؟ من تا 9 رقم در نظر گرفتم ... کافیه ؟؟

                        یه درخواست هم دارم ...
                        کل برنامه رو بگذارید اینجا

                        موفق باشید
                        [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                        معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                        معرفی نرم افزار Codewizard PWM
                        با من بیشتر آشنا شوید

                        دیدگاه


                          #13
                          پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

                          وقتی کامپایل میکنم، میگه ممکن overflow اتفاق بیفته و نیاز به متغیر long هست.
                          در صورتی که من unsigned long int در نظر گرفتم.
                          الان یه تست کردم فهمیدم مشکل کجاست! نمیدونم چرا تو همون کدی قرار دادم، وقتی مقدار یه عدد رو در 10000 ضرب میکنم میگه سرریز اتفاق میوفته ولی وقتی در 100000 (که بیشتره) ضرب میکنم هیچی نمیگه! عدد 32 بیتی هستش! من اشتباه کردم!
                          من unsigned long int تعریف کردم!
                          برنامه رو براتون اپلود کردم!
                          http://upir.ir/aban93/final.zip
                          ممنون

                          اضافه شده در تاریخ :
                          اومدم به جای اینکه مقدار جدید رو با مقدار قبلی جمع کنم، or کردم! هنوز warning پابرجاست ولی تو برنامه جواب گرفتم!
                          ولی در عمل بهتر داره جواب میده! فقط مشکل من با علامت این متغیر هست!
                          وقتی unsigned تعریف میکنیم دیگه علامت نداره! کار خاصی باید انجام بدیم تا بدون علامت باشه؟!

                          دیدگاه


                            #14
                            پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

                            نوشته اصلی توسط amirna3r
                            وقتی کامپایل میکنم، میگه ممکن overflow اتفاق بیفته و نیاز به متغیر long هست.
                            در صورتی که من unsigned long int در نظر گرفتم.
                            الان یه تست کردم فهمیدم مشکل کجاست! نمیدونم چرا تو همون کدی قرار دادم، وقتی مقدار یه عدد رو در 10000 ضرب میکنم میگه سرریز اتفاق میوفته ولی وقتی در 100000 (که بیشتره) ضرب میکنم هیچی نمیگه! عدد 32 بیتی هستش! من اشتباه کردم!
                            من unsigned long int تعریف کردم!
                            برنامه رو براتون اپلود کردم!
                            http://upir.ir/aban93/final.zip
                            ممنون

                            اضافه شده در تاریخ :
                            اومدم به جای اینکه مقدار جدید رو با مقدار قبلی جمع کنم، or کردم! هنوز warning پابرجاست ولی تو برنامه جواب گرفتم!
                            ولی در عمل بهتر داره جواب میده! فقط مشکل من با علامت این متغیر هست!
                            وقتی unsigned تعریف میکنیم دیگه علامت نداره! کار خاصی باید انجام بدیم تا بدون علامت باشه؟!
                            باید بهم زمان بدید تا تحلیلش کنم ...
                            برنامه رو خودتون نوشتید ؟؟
                            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                            معرفی نرم افزار Codewizard PWM
                            با من بیشتر آشنا شوید

                            دیدگاه


                              #15
                              پاسخ : مشکل برای ایجاد متغیر 32 بیتی - مشکل سرریز یک متغیر

                              سلام. من یه متغیر 32 بیتی تعریف کردم(unsigned long int a)
                              بعد این عدد رو در 100000 ضرب میکنم، مشکلی نیست ولی اگر ضرب در 10000 کنم warning زیر رو بهم میده!
                              overflow is possible in 16 bit multiplication, casting to 'long' may be required
                              دستور رو هم به شکل روبرو نوشتم:
                              کد:
                              a+=key*10000;
                              یه عدد بین 0 تا 9 رو در 10000 ضرب میکنه! اگه این عدد رو در 10 یا 100 یا 1000 هم ضرب کنم باز هم همین warning رو دارم! ولی وقتی در 100000 ضرب میکنم مشکلی نیست!
                              من کد رو به شکل زیر هم نوشتم دیگه Warning ندارم ولی overflow اتفاق میوفته!
                              کد:
                              a+=key*10000ul;
                              ممنون

                              دیدگاه

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