اطلاعیه

Collapse
No announcement yet.

جابه جایی بیت به بیت خروجی یک پورت

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

    جابه جایی بیت به بیت خروجی یک پورت

    دوستان سلام. :read:

    میشه توی یه خروجی یه پورت بیت رو با بیت جابه جا کرد؟

    مثلا من روی پورتم یه عدد bcd دارم که قراره به یه ای سی دیکودر وصل شه بعد الان برای pcb مشکل دارم. خیلی پیچیده میشه.
    برای مثال من روی پورت A کد BCD دارم که قراره به دیکودر وصل شه

    در حالت عادی پایه های میکرو به ترتیب
    پایه میکرو>>پایه دیکودر
    40>>7
    39>>1
    38>>2
    37>>6
    وصل بشه :nerd:
    اما من اینجوری میخوام:
    40>>1
    39>>2
    38>>6
    37>>7
    برای اینکار باید دیتای پایه 40 با 39 عوض بشه دیگه، اما چطوری :redface: :redface: ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟


    یکی دو تا نیست 6 تاست :applause:

    راستی به زبان سی
    "زمان خط است نه دايره" چه ايده بدي بوده گرد ساختن ساعت. احساس ميکني هميشه فرصت تکرار است.
    ساعت دروغ ميگويد. دروغ. زمان بر گرد يک دايره نمي چرخد! زمان بر روي خطي مستقيم ميدود. و هيچگاه، هيچگاه، هيچگاه باز نميگردد.
    ساعت خوب، ساعت شني است! هر لحظه به تو يادآوري ميکند که دانه اي که افتاد ديگر باز نميگردد.
    پس بهتره يکم به ثانيه هايي که داريم فکر کنيم تا به راحتي از دستشون نديم....

    #2
    پاسخ : جابه جایی بیت به بیت خروجی یک پورت

    دوستان یه چیزی خودم نوشتم اما کار نمیکنه :rolleyes: :biggrin:

    کد:
        
    //1X0X >> 0X1X
    
    
    S=bin2bcd(s); 
        bit s0=0,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0,s7=0;
    
        s0=S;     
        s1=S>>1;
        s2=S>>2;
        s3=S>>3;
        PORTD.0=s0;
        PORTD.1=s3;
        PORTD.2=s2;
        PORTD.3=s1;
    اینجا فقط لازم بود دیتای پایه ی 3و1 عوض بشن.
    چطوری میتونم برای هر پایه ی پورت یه متغیر از نوع بیت بدم؟

    بخوام یه پایه رو وضعیتش رو عوض کنم درسته همین؟ :read:
    اصن درست شیفت دادم؟
    "زمان خط است نه دايره" چه ايده بدي بوده گرد ساختن ساعت. احساس ميکني هميشه فرصت تکرار است.
    ساعت دروغ ميگويد. دروغ. زمان بر گرد يک دايره نمي چرخد! زمان بر روي خطي مستقيم ميدود. و هيچگاه، هيچگاه، هيچگاه باز نميگردد.
    ساعت خوب، ساعت شني است! هر لحظه به تو يادآوري ميکند که دانه اي که افتاد ديگر باز نميگردد.
    پس بهتره يکم به ثانيه هايي که داريم فکر کنيم تا به راحتي از دستشون نديم....

    دیدگاه


      #3
      پاسخ : جابه جایی بیت به بیت خروجی یک پورت

      نوشته اصلی توسط mo2_star

      میشه توی یه خروجی یه پورت بیت رو با بیت جابه جا کرد؟

      مثلا من روی پورتم یه عدد bcd دارم که قراره به یه ای سی دیکودر وصل شه بعد الان برای pcb مشکل دارم. خیلی پیچیده میشه.
      برای مثال من روی پورت A کد BCD دارم که قراره به دیکودر وصل شه

      برای تبدیل کد بهتره از جدول استفاده کنید.به این ترتیب که دو آرایه تعریف می کنیم که در آرایه اولی مقدارهای اولیه و در آرایه دوم در ایندکس متناظر با آرایه اولی مقادیر تبدیل شده رو وارد می کنیم .هر زمان که خواستیم یک کد رو تبدیل کنیم اول باید ایندکس اونو در آرایه اول پیدا کنیم بعد عدد موجود در همون ایندکس رو از آرایه دوم استخراج کنیم.
      بهتره قسمت های 15 تا 19 آموزش AVR جناب کی نژاد رو ببینید.
      http://knowledgeplus.ir/electronics/AVR.aspx?lang=Fa
      توی همون صفحه نمونه کد هم هست.

      دیدگاه


        #4
        پاسخ : جابه جایی بیت به بیت خروجی یک پورت

        با سلام
        خب راحته، شما اول برنامت بیا و پایه هاتو define کن(مثلا
        کد:
        #define BCD_PIN_1 PORTA.40
        یا هر اسمی که راحتی
        طبیعتا این کار با توجه به رسم pcb و نحوه وصل ترک ها اتفاق می افته.
        بعد با دیفاینات کار کن تا دیگه لازم نباشه هر دفعه فکر کنی که کی، چی بود.فقط همون اول یه بار این کارو می کنی
        The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

        دیدگاه


          #5
          پاسخ : جابه جایی بیت به بیت خروجی یک پورت

          نوشته اصلی توسط "میلاد"
          برای تبدیل کد بهتره از جدول استفاده کنید.به این ترتیب که دو آرایه تعریف می کنیم که در آرایه اولی مقدارهای اولیه و در آرایه دوم در ایندکس متناظر با آرایه اولی مقادیر تبدیل شده رو وارد می کنیم .هر زمان که خواستیم یک کد رو تبدیل کنیم اول باید ایندکس اونو در آرایه اول پیدا کنیم بعد عدد موجود در همون ایندکس رو از آرایه دوم استخراج کنیم.
          بهتره قسمت های 15 تا 19 آموزش AVR جناب کی نژاد رو ببینید.
          http://knowledgeplus.ir/electronics/AVR.aspx?lang=Fa
          توی همون صفحه نمونه کد هم هست.
          خیلی ممنونم اما بصورت مالتی پلکس نبستم.
          نوشته اصلی توسط hessam2013
          با سلام
          خب راحته، شما اول برنامت بیا و پایه هاتو define کن(مثلا
          کد:
          #define BCD_PIN_1 PORTA.40
          یا هر اسمی که راحتی
          طبیعتا این کار با توجه به رسم pcb و نحوه وصل ترک ها اتفاق می افته.
          بعد با دیفاینات کار کن تا دیگه لازم نباشه هر دفعه فکر کنی که کی، چی بود.فقط همون اول یه بار این کارو می کنی
          الان به یه مشکلی برخوردم که اصلا حواسم نبود متغیری که ثانیه توش بصورت BCD ذخیره میشه از نوع کاراکتر هستش.
          فک کنم با ارایه بشه درستش کرد
          "زمان خط است نه دايره" چه ايده بدي بوده گرد ساختن ساعت. احساس ميکني هميشه فرصت تکرار است.
          ساعت دروغ ميگويد. دروغ. زمان بر گرد يک دايره نمي چرخد! زمان بر روي خطي مستقيم ميدود. و هيچگاه، هيچگاه، هيچگاه باز نميگردد.
          ساعت خوب، ساعت شني است! هر لحظه به تو يادآوري ميکند که دانه اي که افتاد ديگر باز نميگردد.
          پس بهتره يکم به ثانيه هايي که داريم فکر کنيم تا به راحتي از دستشون نديم....

          دیدگاه


            #6
            پاسخ : جابه جایی بیت به بیت خروجی یک پورت

            [code=c]
            char S;
            int NS[8];
            int Z[8];
            char M;
            char H;

            while (1)
            {
            rtc_get_time(&h,&m,&s);
            S=bin2bcd(s);
            M=bin2bcd(m);
            H=bin2bcd(h);
            NS[8]=S;
            Z[0]=NS[0];
            Z[1]=NS[1];
            Z[2]=NS[2];
            Z[3]=NS[3];
            Z[4]=NS[4];
            Z[5]=NS[5];
            Z[6]=NS[6];
            Z[7]=NS[7];
            PORTD=Z[8];
            PORTB=M;
            PORTA=S; [/code]

            الان نباید دوباره ثانیه رو توی پورت d نشون بده؟

            فقط اومدم ثانیه خروجی bcd رو توی NS به INT تبدیلش کردم

            بعد اومدم توی متغیر Z ریختمش دوباره که بشه جای بیت ها رو عوض کرد اما الان توی پورت خروجی همش صفر دارم.

            در ضمن 2 تا هشدار هم داره که برای این هاست:
            کد:
            PORTD=Z[8];
            NS[8]=S;
            Warning: array index is out of range
            "زمان خط است نه دايره" چه ايده بدي بوده گرد ساختن ساعت. احساس ميکني هميشه فرصت تکرار است.
            ساعت دروغ ميگويد. دروغ. زمان بر گرد يک دايره نمي چرخد! زمان بر روي خطي مستقيم ميدود. و هيچگاه، هيچگاه، هيچگاه باز نميگردد.
            ساعت خوب، ساعت شني است! هر لحظه به تو يادآوري ميکند که دانه اي که افتاد ديگر باز نميگردد.
            پس بهتره يکم به ثانيه هايي که داريم فکر کنيم تا به راحتي از دستشون نديم....

            دیدگاه


              #7
              پاسخ : جابه جایی بیت به بیت خروجی یک پورت

              در ارایه ادرس ها از صفر شروع میشن
              پس وقتی تعریف می کنین.
              کد:
              int a[8];
              ایندکش های مجاز از 0 تا 7 بیشتر نیست.
              The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

              دیدگاه


                #8
                پاسخ : جابه جایی بیت به بیت خروجی یک پورت

                روشی که گفتم یک روش کلی برای تبدیل کد هست و مختص کار با 7segment حالا چه به صورت مالتی پلکس و چه غیر مالتی پلکس نیست.

                دیدگاه


                  #9
                  پاسخ : جابه جایی بیت به بیت خروجی یک پورت

                  دوستان خیلی ممنون از کمک هاتون :smile:
                  الان اینو نوشتم درست شد خود ثانیه رو میفرسته رو پورت D

                  [code=c]
                  rtc_get_time(&h,&m,&s);
                  S=bin2bcd(s);
                  M=bin2bcd(m);
                  H=bin2bcd(h);
                  NS[7]=S;
                  Z[0]=NS[0]; //7
                  Z[1]=NS[1]; //1
                  Z[2]=NS[2]; //2
                  Z[3]=NS[3]; //6
                  Z[4]=NS[4];
                  Z[5]=NS[5];
                  Z[6]=NS[6];
                  Z[7]=NS[7];
                  PORTD=Z[7];
                  [/code]
                  حالا که سیم بندیش رو عوض میکنم و
                  توی برنامه تغییرات رو میدم دوباره پورت D همش صفر رو نشون میده :sad:

                  [code=c]
                  NS[7]=S;
                  Z[1]=NS[0]; //1
                  Z[2]=NS[1]; //2
                  Z[3]=NS[2]; //6
                  Z[0]=NS[3]; //7
                  Z[5]=NS[4];
                  Z[6]=NS[5];
                  Z[7]=NS[6];
                  Z[4]=NS[7];
                  PORTD=Z[7];
                  [/code]
                  "زمان خط است نه دايره" چه ايده بدي بوده گرد ساختن ساعت. احساس ميکني هميشه فرصت تکرار است.
                  ساعت دروغ ميگويد. دروغ. زمان بر گرد يک دايره نمي چرخد! زمان بر روي خطي مستقيم ميدود. و هيچگاه، هيچگاه، هيچگاه باز نميگردد.
                  ساعت خوب، ساعت شني است! هر لحظه به تو يادآوري ميکند که دانه اي که افتاد ديگر باز نميگردد.
                  پس بهتره يکم به ثانيه هايي که داريم فکر کنيم تا به راحتي از دستشون نديم....

                  دیدگاه


                    #10
                    پاسخ : جابه جایی بیت به بیت خروجی یک پورت

                    کد:
                    int NS[8];
                    یک آرایه 8 عنصری تعریف می کنه که هر کدوم از عناصرش یک متغیر integer هست که 16 بیته.به نظر میاد شما هر کدوم از عناصر رو یک بیت فرض کردید.

                    دیدگاه


                      #11
                      پاسخ : جابه جایی بیت به بیت خروجی یک پورت

                      نوشته اصلی توسط "میلاد"
                      کد:
                      int NS[8];
                      یک آرایه 8 عنصری تعریف می کنه که هر کدوم از عناصرش یک متغیر integer هست که 16 بیته.به نظر میاد شما هر کدوم از عناصر رو یک بیت فرض کردید.
                      اینو نمیدونستم ممنون.

                      ارایه از نوع بیت که نمیشه تعریف کرد پس چیکار کنم :cry:
                      "زمان خط است نه دايره" چه ايده بدي بوده گرد ساختن ساعت. احساس ميکني هميشه فرصت تکرار است.
                      ساعت دروغ ميگويد. دروغ. زمان بر گرد يک دايره نمي چرخد! زمان بر روي خطي مستقيم ميدود. و هيچگاه، هيچگاه، هيچگاه باز نميگردد.
                      ساعت خوب، ساعت شني است! هر لحظه به تو يادآوري ميکند که دانه اي که افتاد ديگر باز نميگردد.
                      پس بهتره يکم به ثانيه هايي که داريم فکر کنيم تا به راحتي از دستشون نديم....

                      دیدگاه


                        #12
                        پاسخ : جابه جایی بیت به بیت خروجی یک پورت

                        یک متغیر 8 بیتی تعریف کن و با شیفت و or اعدادو بهش بده مثل زیر) چون عملگر or فقط رو یک تاثیر گذاره پس لازم هر دفعه متغیر رو صفر کنی
                        در کد زیر متغیر بیت دوم a بر اساس اینکه متغیر از قبل تعریف شده b صفر یا یک باشه صفر یا یک میشه
                        کد:
                        char a;
                        a=0;
                        a |= (b[0]==0) ? 0<<2 : 1<<2
                        The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                        دیدگاه


                          #13
                          پاسخ : جابه جایی بیت به بیت خروجی یک پورت

                          نوشته اصلی توسط mo2_star
                          اینو نمیدونستم ممنون.

                          ارایه از نوع بیت که نمیشه تعریف کرد پس چیکار کنم :cry:
                          راه حل اصولیش استفاده از همون جدوله که گفتم.نمی دونم چرا شما اصرار دارید بیت جا به جا کنید.
                          در هر صورت برای دسترسی به بیت های یک متغیر توی c میشه از ترکیب struct و union استفاده کرد.به این صورت:
                          کد:
                          union
                          {
                          unsigned char Byte_BCD;
                          
                          struct Bit_BCD{
                          unsigned Bit0:1;
                          unsigned Bit1:1;
                          unsigned Bit2:1;
                          unsigned Bit3:1;
                          unsigned Bit4:1;
                          unsigned Bit5:1;
                          unsigned Bit6:1;
                          unsigned Bit7:1;
                          } sample_BCD;
                          };
                          من نمی دونم شما از چه کامپایلری استفاده می کنید و اینکه اون کامپایلر تا چه حد اجازه دسترسی بیتی به متغیر ها یا پورت ها رو میده.اما از اونجا که توی کامنت دومی از عبارت PORTD.0 استفاده کرده بودید حدس میزنم حداقل اجازه دسترسی بیتی به پورت ها رو دارید اگه اینجوری باشه می تونید متغیری که باید بیت هاش جابه جا بشه رو بریزید توی union بالا و بعد بیت هاش رو به هر شکلی که لازمه بریزید روی پورت اما مجبورید بیت به بیت به پورت مقدار بدید.فرضا اگه قراره توی متغیر a بیت 0با 2و 1 با 3 جاشون عوض بشه و بعد اونو بریزیم روی پورت D باید بعد از تعریف کد بالا اینجوری بنویسید:
                          کد:
                          Byte_BCD=a;
                          PORTD.0=sample_BCD.Bit2;
                          PORTD.1=sample_BCD.Bit3;
                          PORTD.2=sample_BCD.Bit0;
                          PORTD.3=sample_BCD.Bit1;
                          PORTD.4=sample_BCD.Bit4;
                          PORTD.5=sample_BCD.Bit5;
                          PORTD.6=sample_BCD.Bit6;
                          PORTD.7=sample_BCD.Bit7;

                          دیدگاه


                            #14
                            پاسخ : جابه جایی بیت به بیت خروجی یک پورت

                            نوشته اصلی توسط "میلاد"
                            راه حل اصولیش استفاده از همون جدوله که گفتم.نمی دونم چرا شما اصرار دارید بیت جا به جا کنید.
                            در هر صورت برای دسترسی به بیت های یک متغیر توی c میشه از ترکیب struct و union استفاده کرد
                            ســـــــــــــــــــــــــــلام

                            بلاخره موفق شدم :nice: :nice: :nerd: :nerd:


                            خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی خیلی ممنونم :job:

                            خیلی ایده باحالی بود این استفاده struct توی union خیلی حال کردم باهاش

                            یاد نداشتم، رفتم کتاب جعفر نژاد قمی فصل 7 رو خوندم فهمیدم

                            اینکه ادرس شروع متغیر ها توی union صفر هست خیلی باحاله :nerd: :nerd:
                            میشه هر نوع دیتایی رو به این روش به همدیگه تبدیل کرد.
                            اینم برنامم :nerd: بازم ممنونم
                            [code=c]
                            union S_Byte
                            {
                            unsigned char Byte_SEC_BCD;
                            struct Bit_SEC_BCD{
                            unsigned Bit0:1;
                            unsigned Bit1:1;
                            unsigned Bit2:1;
                            unsigned Bit3:1;
                            unsigned Bit4:1;
                            unsigned Bit5:1;
                            unsigned Bit6:1;
                            unsigned Bit7:1;
                            } SEC_BITS;
                            }SS_Byte;
                            [/code]

                            و قسمت دومش بعد از مرتب کردن بیت ها . :biggrin:

                            [code=c]
                            SS_Byte.Byte_SEC_BCD=S;
                            PORTD.0=SS_Byte.SEC_BITS.Bit1;
                            PORTD.1=SS_Byte.SEC_BITS.Bit2;
                            PORTD.2=SS_Byte.SEC_BITS.Bit3;
                            PORTD.3=SS_Byte.SEC_BITS.Bit0;
                            PORTD.4=SS_Byte.SEC_BITS.Bit5;
                            PORTD.5=SS_Byte.SEC_BITS.Bit6;
                            PORTD.6=SS_Byte.SEC_BITS.Bit7;
                            PORTD.7=SS_Byte.SEC_BITS.Bit4;
                            [/code]

                            حالا که فکر میکنم چقدر شیفت دادن مسخره بوده در مقابل این روش :rolleyes:
                            عاشق زبان سی ام با این کاراش :nice:
                            بازم ممنون :biggrin:
                            "زمان خط است نه دايره" چه ايده بدي بوده گرد ساختن ساعت. احساس ميکني هميشه فرصت تکرار است.
                            ساعت دروغ ميگويد. دروغ. زمان بر گرد يک دايره نمي چرخد! زمان بر روي خطي مستقيم ميدود. و هيچگاه، هيچگاه، هيچگاه باز نميگردد.
                            ساعت خوب، ساعت شني است! هر لحظه به تو يادآوري ميکند که دانه اي که افتاد ديگر باز نميگردد.
                            پس بهتره يکم به ثانيه هايي که داريم فکر کنيم تا به راحتي از دستشون نديم....

                            دیدگاه

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