اطلاعیه

Collapse
No announcement yet.

مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

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

    مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

    سلام به همه دوستان . :smile:
    من میخوام یک متغیر 64بیتی رو توی کدویژن و مگا8 بعد از اعمال چند عملیات منتطقی مثل & | و انجام چند شیفت به یک تابع بفرستم و با شیفت دادن به صورت 8 بیتی در پورت میکرو با تاخیر نمایش بدم .

    من از کد زیر واسه 1 کردن بعضی از بیت های متغیر مورد نظر استفاده میکنم :
    کد:
    unsigned long int _BV(int index){
       unsigned long int temp = byte ;               
      return  temp|( 1 << index );
    }
    byte یک متغییر unsigned long int هس و تابع نمایش به صورت زیر :

    کد:
     temp = 0b00000000;
          for(i=0 ; i < bytelenght/8 ; i++)
          {
            for(j=0 ; j < 8 ; j++)
            {  
              if( byte & 0x1 )
                temp = temp | (1 << 7-j); 
              byte = byte >> 1 ;
            } 
            PORTB = temp;  
            delay_ms(500); 
            temp = 0b00000000;
          }
    این کدها فقط تا 16 بیت رو نشون میدن من چطور میتونم 64 بیت رو شیفت بدم.
    این تابع بیت های 16 به بعد رو صفر خروجی میده...

    جتی سعی کردم از stdint.h ، unsigned long uint32_t استفاده کنم کدویژن ارور میده و long long رو هم ارور میده...
    میشه یکی راهنماییم کنه ؟
    ولی چیزی که جالبه اینه که اگه همه بیتهای byte در هنگام تعریف متغیر یک باشه خروجی به تعداد مورد نظر 8بیت یک میده ، ولی اگه در هنگام تعریف مقدار دهی نشه یا به صورت 0b000.... مقدار دهی بشه و با تابع BV_ بیت های مورد نظرو یک کنیم مثلا 0b001011110111... ا 16 بیت اول رو درست و بقیه بیت ها صفر نمایش میده...
    ممنون.

    #2
    پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

    استفاده از کامپایلر های
    Avr studio
    Winavr
    IAR
    و هرچیزی به جز code vision
    دلا خو کن به تنهایی که از تنها بلا خیزد

    دیدگاه


      #3
      پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

      سلام نوید جان.
      راه دیگه ای نیس ؟ چون من به کدویژن عادت کردم ... :sad: راه دگه ای نداره ؟
      پس چرا بک داده 16بیت به بالا ولی با مقدار 1 داشته باشم درست کار میکنه ؟ :cry: ولی اگه مقدار 0 و 1 با هم توی متغیر بیت های 16 بیت به بالا از بین میره...

      دیدگاه


        #4
        پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

        دوست من همش به خاطر تحریماته
        شما اگر Error رو دقیق بخونی میگه باید نسخه Professional استفاده کنی
        اگر نسخه Pro رو پیدا کنی مشکل حل میشه
        دلا خو کن به تنهایی که از تنها بلا خیزد

        دیدگاه


          #5
          پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش &#1

          آقا نوید من هم نسخه ادونس و پروفشنال رو دانلود کردم بازم میگه باید از نسخه .... استفاده کنی.یکی از این لینک : http://mihandownload.com/2011/03/%D8...onal-2011-.php

          سوال من اینجاس چرا وقتی متغیر با مقدار :
          byte = 0b111111111111111111111111 , bytelenght=24
          رو به این تابعی که نوشتم

          کد:
           temp = 0b00000000;
                for(i=0 ; i < bytelenght/8 ; i++)
                {
                  for(j=0 ; j < 8 ; j++)
                  {  
                    if( byte & 0x1 )
                      temp = temp | (1 << 7-j); 
                    byte = byte >> 1 ;
                  } 
                  PORTB = temp;  
                  delay_ms(500); 
                  temp = 0b00000000;
                }
          میفرستم خروجی درسته ؟ یعنی توی پورت میکروم 3 بار 8 بیت مثبت نشون میده ؟! یا حتی متغیری با طول بیشنر...

          وقتی این متغیر رو درست نشون میده حتما راحی هست که 0b100011101011001001100101 رو هم درست نشون بده دگ . غیر اینه ؟!


          دوستان دگ هیچ نظری ندارن ؟

          دیدگاه


            #6
            پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

            سلام دوست عزیز
            اگر عملیاتتون در حد & و OR کردنه که میتونید هشت تا متغیر هشت بیتی رو در نظر بگیرید
            من تو AVR Studio تا 32 بیت رفتم و حتی عملیات تقسیم رو هم روی 32 بیت انجام دادم & , | که برای شما کار رو خیلی ساده تر میکنه
            سایت زیر میتونه خیلی کمکتون کنه
            http://www.avr-asm-tutorial.net/avr_en/index.html

            Good Luck

            دیدگاه


              #7
              پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

              از دو دوست گلم ممنونم که سعی کردن کمکم کنن
              ولی کسی نیس بدونه من با همین کدویژن چطور میتونم 64 بیت رو روی پورتم نشون بدم ؟ با شیفت کردن... آخه نمینوم از avr studio استفاده کنم ! :cry: من میخوام با همین روال پیش برم...
              اساتید هیج نظری ندارن ؟ چرا 64 ییت با مقدار 1 یا 32،24و...بیت 1 باشه وقتی شیفت پیدا میکنه هیچ مشکلی پیش نمیاد و هیچ کدوم از بیتا از بین نمیرهووو؟! جتما یک دلیلی داره دگ .... :angry: :cry: :cry:
              یا حداقل یک الگوریتمی واسه دور زدن این مشکل نیس؟؟
              یکی به داد من برسه تلف شدم :cry:

              دیدگاه


                #8
                پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

                سلام دوست عزیز
                شما تو کدویژن هم به دستورات اسمبلی دسترسی دارید
                خوشبختانه AVR معماری RISC ش صدو سی و چند دستور داره اما PIC16,12 فقط 35 دستور داره
                بازم میگم بستگی داره متغیر هاتون از کجا اومده باشند و چه عملیاتی بخواهید روش انجام بدید
                شما هشت متغیر هشت بیتی ات رو توی کدویژن تعریف کن و عملیات بیتی(bit manipulation) رو تو کدویژن انجام بده
                شصت و چهار بیتت از کجا اومدند؟ کارت فقط ریختن بایت بایت روی یک پورته؟

                Good Luck

                دیدگاه


                  #9
                  پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

                  من اول تعداد بیتی که میخوام از طریق یکی از پورتام دریافت میکنم.بعد تعداد بیت لازم رو میسازم.وتا اینجا هیچ مشکلی ندارم ... حالا ممکنه 8 بیت لازم داشته باشم و خد اکثر 64 بیت .... خروجی تابع به شکل 0b00000.... هس.حالا من بسته به نیازم با استفاده از تابع _BV که در پست اول نوشتم بیتهای مورد نظرم رو 1 میکنم ، و این یک کردن با یک الگریتم خواص انجام میشه و نمیشه من 8تا 8تا بیتارو تیکه تیکه کنم...حالا بعد از یک کردن بیت های مورد نظر اون هارو به ترتیب به صورت 8تا 8تا روی پورت ها نمایش میدم....

                  من خودم امتحان کردم اگه توی ساخت بیت مرجع (همون که تعدادشو از یک وزودی میگزم) به جای 0b000 به صورت 0b111.... ساخته بشه و اونو به خروجی بدم با شیفت کردن هیچ بیتی از بین نمیره... اگه قراره شیفت کردن بعد از بیت 16ام بیت ها صفر بشه ،چرا تو این مورد نمیشه ؟


                  میشه یک مثال بزنی از اسمبلی ؟ یعنی من میونم با اسمبلی یک متغیر 64 بیتی بسازم و توی برنامم استفاده کنم؟
                  تعریف کردن 8 تا بیت 8 بیتی که کاری نداره موضوع اینه تعداد بیتهای من متغیر هس و بایت پشت هم باشه.

                  دیدگاه


                    #10
                    پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

                    از اساتید که خبری نشد مثل اینکه باید خودم دست به کار بشم ... :read:

                    دیدگاه


                      #11
                      پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

                      نوشته اصلی توسط par3eh
                      از اساتید که خبری نشد مثل اینکه باید خودم دست به کار بشم ... :read:
                      سلام دوست عزیز
                      من حوصلم نگرفت اینجا واست توضیح بدم تو کاغذ نوشتم عکس گرفتم لینکش پایینه
                      شما این کاغذه رو بخون ، برنامه ات رو با AVR Studio دیباگ کن ، ببین شیفت شما از طریق پرچم کری انجام میشه یا نه هشت بیت تو خودش میچرخه(یعنی بیت هفتم میاد جای بیت صفرم)
                      اگر بود که خیلی هم عالی ، اگر نبود بگو تا دوباره چاره کنیم
                      اگر هم کامپایلرت گیر نداد وسط برنامه سی ، یه #asm باز کن اسمبلی بنویس ،
                      این واسه چهار بایته ، کاغذ A3 نداشتم برای 8 بایت بکشم ، اما واضحه

                      Good Luck

                      http://s2.picofile.com/file/7657557632/Photo1048.jpg
                      http://s2.picofile.com/file/7657557739/2013_02_14_214229.jpg

                      دیدگاه


                        #12
                        پاسخ : مشکل استفاده از یک متغیر 64 بیتی و نمایش در پورت mega8

                        نوشته اصلی توسط scienceaddict
                        سلام دوست عزیز
                        من حوصلم نگرفت اینجا واست توضیح بدم تو کاغذ نوشتم عکس گرفتم لینکش پایینه
                        شما این کاغذه رو بخون ، برنامه ات رو با AVR Studio دیباگ کن ، ببین شیفت شما از طریق پرچم کری انجام میشه یا نه هشت بیت تو خودش میچرخه(یعنی بیت هفتم میاد جای بیت صفرم)
                        اگر بود که خیلی هم عالی ، اگر نبود بگو تا دوباره چاره کنیم
                        اگر هم کامپایلرت گیر نداد وسط برنامه سی ، یه #asm باز کن اسمبلی بنویس ،
                        این واسه چهار بایته ، کاغذ A3 نداشتم برای 8 بایت بکشم ، اما واضحه

                        Good Luck

                        http://s2.picofile.com/file/7657557632/Photo1048.jpg
                        http://s2.picofile.com/file/7657557739/2013_02_14_214229.jpg
                        دوست من از وقتی که گذاشتی واقعا ممنونم . خیلی ممنون . سعی میکنم با راهنماییت کارمو ادمه بدم.
                        دگ دیدم خبری نشد استراتژی کارمو عوض کردم از آرایه استفاده کردم ولی کدش به دلم نچسبید الان میرم سراغش ببینم میتونم با اسمبلی حلش کنم :smile:
                        اگه بشه که خیلی خوب میشه.
                        دمت گرم :smile:

                        دیدگاه

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