اطلاعیه

Collapse
No announcement yet.

خارج نشدن از حلقه for

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

    خارج نشدن از حلقه for

    درود
    من یه مشکلی دارم تو برنامم .
    مشکل اینه که برنامم از حلقه for که داره خارج نمیشه .

    ممنون میشم کمکم کنید . مشکل برام خیلی عجیب غربیه .

    کد:
    #include <tiny13a.h>
    #include <delay.h>
    int i;
    void main(void)
    {
    #pragma optsize-
    CLKPR=0x80;
    CLKPR=0x00;
    #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
    #endif
    PORTB=0x00;
    DDRB=0x04;
    TCCR0A=0x00;
    TCCR0B=0x00;
    TCNT0=0x00;
    OCR0A=0x00;
    OCR0B=0x00;
    GIMSK=0x00;
    MCUCR=0x00;
    TIMSK0=0x00;
    ACSR=0x80;
    ADCSRB=0x00;
    
    
    while (1)
          {
          for (i=1 ; i<=6 ; i=i+1);
          {
          if(PINB.0==1){
          PINB.2=1;
          delay_ms(1000);
          PINB.2=0;
          };
          };
                
          };
    }

    #2
    پاسخ : خارج نشدن از حلقه for

    نوشته اصلی توسط erfan-messi نمایش پست ها
    درود
    من یه مشکلی دارم تو برنامم .
    مشکل اینه که برنامم از حلقه for که داره خارج نمیشه .

    ممنون میشم کمکم کنید . مشکل برام خیلی عجیب غربیه .

    کد:
    #include <tiny13a.h>
    #include <delay.h>
    int i;
    void main(void)
    {
    #pragma optsize-
    CLKPR=0x80;
    CLKPR=0x00;
    #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
    #endif
    PORTB=0x00;
    DDRB=0x04;
    TCCR0A=0x00;
    TCCR0B=0x00;
    TCNT0=0x00;
    OCR0A=0x00;
    OCR0B=0x00;
    GIMSK=0x00;
    MCUCR=0x00;
    TIMSK0=0x00;
    ACSR=0x80;
    ADCSRB=0x00;
    
    
    while (1)
          {
          for (i=1 ; i<=6 ; i=i+1);
          {
          if(PINB.0==1){
          PINB.2=1;
          delay_ms(1000);
          PINB.2=0;
          };
          };
                
          };
    }
    سلام
    نباید هم خارج بشه! حلقه for خودش در یک حلقه while بی نهایت قرار گرفته که این باعث میشه بعد از خروج از for دوباره به for وارد بشه.
    قصدتون از این قطعه کد رو هرچی فکر کردم درک نکردم! مقدار دهی کردن رجیستر PIN کاری بیهوده است! چه قصدی از نوشتن این کد دارید؟

    دیدگاه


      #3
      پاسخ : خارج نشدن از حلقه for

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      نباید هم خارج بشه! حلقه for خودش در یک حلقه while بی نهایت قرار گرفته که این باعث میشه بعد از خروج از for دوباره به for وارد بشه.
      قصدتون از این قطعه کد رو هرچی فکر کردم درک نکردم! مقدار دهی کردن رجیستر PIN کاری بیهوده است! چه قصدی از نوشتن این کد دارید؟
      من فقط کدهای حلقه for و دستور if نوشتم .
      باقی کدها ماله ستاپ ویزارد نرم افزار کدویژن هست .

      منطق برنامم اینه :
      با زدن کلید 1 خروجی 5 ثانیه 1 بشه و خاموش بشه .
      با زدن کلید 2 خروجی با فواصل 1ثانیه 1ثانیه فعال بشه . 5بار خاموش روشن بشه .

      دیدگاه


        #4
        پاسخ : خارج نشدن از حلقه for

        نوشته اصلی توسط erfan-messi نمایش پست ها
        من فقط کدهای حلقه for و دستور if نوشتم .
        باقی کدها ماله ستاپ ویزارد نرم افزار کدویژن هست .

        منطق برنامم اینه :
        با زدن کلید 1 خروجی 5 ثانیه 1 بشه و خاموش بشه .
        با زدن کلید 2 خروجی با فواصل 1ثانیه 1ثانیه فعال بشه . 5بار خاموش روشن بشه .
        با این تفاسیر برنامه ای که نوشتید کاملا غلطه

        دیدگاه


          #5
          پاسخ : خارج نشدن از حلقه for

          نوشته اصلی توسط hossein.m98 نمایش پست ها
          با این تفاسیر برنامه ای که نوشتید کاملا غلطه
          میشه کمک کنید چجور بنویسم؟

          دیدگاه


            #6
            پاسخ : خارج نشدن از حلقه for

            نوشته اصلی توسط erfan-messi نمایش پست ها
            میشه کمک کنید چجور بنویسم؟
            این کد ها رو در برنامه جایگزین کنید:

            DDRA = 0x01;
            while (1)
            {
            if(PINB.0 == 1)
            {
            delay_ms(50);
            if(PINB.0 == 1)
            {
            PORTA.0 = 1;
            delay_ms(5000);
            PORTA.0 = 0;
            }
            }

            if(PINB.1 == 1)
            {
            delay_ms(50);
            if(PINB.1 == 1)
            {
            for (unsigned char i=0; i<5; i++)
            {
            PORTA.0 = 1;
            delay_ms(1000);
            PORTA.0 = 0;
            delay_ms(1000);
            }
            }
            }
            }

            من فرض کردم کلید اول روی PB0، کلید دوم روی PB1 و خروجی روی PA0 قرار داره. ابهامی اگر بود بازم بپرسید تا راهنمایی کنم.

            دیدگاه


              #7
              پاسخ : خارج نشدن از حلقه for

              نوشته اصلی توسط hossein.m98 نمایش پست ها
              این کد ها رو در برنامه جایگزین کنید:

              DDRA = 0x01;
              while (1)
              {
              if(PINB.0 == 1)
              {
              delay_ms(50);
              if(PINB.0 == 1)
              {
              PORTA.0 = 1;
              delay_ms(5000);
              PORTA.0 = 0;
              }
              }

              if(PINB.1 == 1)
              {
              delay_ms(50);
              if(PINB.1 == 1)
              {
              for (unsigned char i=0; i<5; i++)
              {
              PORTA.0 = 1;
              delay_ms(1000);
              PORTA.0 = 0;
              delay_ms(1000);
              }
              }
              }
              }

              من فرض کردم کلید اول روی PB0، کلید دوم روی PB1 و خروجی روی PA0 قرار داره. ابهامی اگر بود بازم بپرسید تا راهنمایی کنم.

              سپاسگذارم
              درسته فقط خروجی هم رو پورت b هست . چون میکرو (attiny13)فقط یه پورت داره.
              الان تست میکنم .

              دلیل: ادغام دو پست برای جلوگیری از اسپم

              خب تست کردم .
              2تا مشکل دارم :
              1 : کلید هام دایم کارن . وقتی کلید 1 میزنم 5ثانیه خروجی 1 میشه . و بعد 0 میشه . ولی دوباره بعد 5 ثانیه 1میشه و همینجور ادامه داره . من فقط میخوام 1 بار به مدت 5 ثانیه روشن بشه .
              2: بازم از حلقه خارج نمیشه .(البته دیگه از حلقه استفاده نمیکنم . روند برنامه عوض کردم.)
              جدیدترین ویرایش توسط erfan-messi; ۲۲:۰۵ ۱۳۹۷/۰۹/۲۲.

              دیدگاه


                #8
                پاسخ : خارج نشدن از حلقه for

                نوشته اصلی توسط erfan-messi نمایش پست ها
                سپاسگذارم
                درسته فقط خروجی هم رو پورت b هست . چون میکرو (attiny13)فقط یه پورت داره.
                الان تست میکنم .

                دلیل: ادغام دو پست برای جلوگیری از اسپم

                خب تست کردم .
                2تا مشکل دارم :
                1 : کلید هام دایم کارن .
                2: بازم از حلقه خارج نمیشه .
                ببینید من این کد رو با فرضی نوشتم که پین های ورودی به صورت خارجی پول داون شده باشن؛ یعنی با یک مقاومت مثل 10 کیلو اهم به زمین متصل شده باشن. در مورد پول آپ و پول داون با سرچ کردن میتونید اطلاعات لازم رو بدست بیارید؛ AVR ها به صورت داخلی امکان فعال کردن مقاومت پول آپ دارن که میتونید از اون هم استفاده کنید. ضمنا مقدار 50 که من در داخل تابع delay قرار دادم هم یک مقدار فرضیه و شما باید با آزمایش و خطا مقداری بدست بیارید که به درد کلیدهایی که استفاده میکنید بخوره.

                دیدگاه


                  #9
                  پاسخ : خارج نشدن از حلقه for

                  نوشته اصلی توسط hossein.m98 نمایش پست ها
                  ببینید من این کد رو با فرضی نوشتم که پین های ورودی به صورت خارجی پول داون شده باشن؛ یعنی با یک مقاومت مثل 10 کیلو اهم به زمین متصل شده باشن. در مورد پول آپ و پول داون با سرچ کردن میتونید اطلاعات لازم رو بدست بیارید؛ AVR ها به صورت داخلی امکان فعال کردن مقاومت پول آپ دارن که میتونید از اون هم استفاده کنید. ضمنا مقدار 50 که من در داخل تابع delay قرار دادم هم یک مقدار فرضیه و شما باید با آزمایش و خطا مقداری بدست بیارید که به درد کلیدهایی که استفاده میکنید بخوره.
                  بازم سپاسگذارم .
                  مشکل کلید :
                  من از کلید داِئم کار استفاده میکنم .
                  وقتی کلید 1 میزنم 5ثانیه خروجی 1 میشه . و بعد 0 میشه . ولی دوباره بعد 5 ثانیه 1میشه و همینجور ادامه داره . من فقط میخوام 1 بار به مدت 5 ثانیه روشن بشه .

                  دیدگاه


                    #10
                    پاسخ : خارج نشدن از حلقه for

                    نوشته اصلی توسط erfan-messi نمایش پست ها
                    بازم سپاسگذارم .
                    مشکل کلید :
                    من از کلید داِئم کار استفاده میکنم .
                    وقتی کلید 1 میزنم 5ثانیه خروجی 1 میشه . و بعد 0 میشه . ولی دوباره بعد 5 ثانیه 1میشه و همینجور ادامه داره . من فقط میخوام 1 بار به مدت 5 ثانیه روشن بشه .
                    آهان تازه فهمیدم چی میگید
                    خوب کد رو به صورت زیر اصلاح کنید:

                    DDRA = 0x01;
                    while (1)
                    {
                    if(PINB.0 == 1)
                    {
                    delay_ms(50);
                    if(PINB.0 == 1)
                    {
                    PORTA.0 = 1;
                    delay_ms(5000);
                    PORTA.0 = 0;
                    while (PINB.0 == 1);
                    }
                    }

                    if(PINB.1 == 1)
                    {
                    delay_ms(50);
                    if(PINB.1 == 1)
                    {
                    for (unsigned char i=0; i<5; i++)
                    {
                    PORTA.0 = 1;
                    delay_ms(1000);
                    PORTA.0 = 0;
                    delay_ms(1000);
                    }
                    while (PINB.1 == 1);
                    }
                    }
                    }

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

                    دیدگاه


                      #11
                      پاسخ : خارج نشدن از حلقه for

                      سپاسگذارم . ولی هنوز مشکلی هست . یه بار منطق کارمو میگم .

                      ما 2 تا کلید داِئم کار داریم . (کلید 1 - کلید 2)
                      یه خروجی

                      قسمت اول : وقتی کلید 1 فعال کردیم . خروجی به مدت 5 ثانیه 1 بشه و سپس 0 بشه . و دیگه تا وقتی که دوباره کلید فعال نشده خروجی 0 بمونه .

                      قسمت دوم : بعد از قسمت اول . کلید دومو فعال میکنیم و خروجی 1ثانیه یه بار روشن و خاموش بشه .

                      دیدگاه


                        #12
                        پاسخ : خارج نشدن از حلقه for

                        نوشته اصلی توسط erfan-messi نمایش پست ها
                        سپاسگذارم . ولی هنوز مشکلی هست . یه بار منطق کارمو میگم .

                        ما 2 تا کلید داِئم کار داریم . (کلید 1 - کلید 2)
                        یه خروجی

                        قسمت اول : وقتی کلید 1 فعال کردیم . خروجی به مدت 5 ثانیه 1 بشه و سپس 0 بشه . و دیگه تا وقتی که دوباره کلید فعال نشده خروجی 0 بمونه .

                        قسمت دوم : بعد از قسمت اول . کلید دومو فعال میکنیم و خروجی 1ثانیه یه بار روشن و خاموش بشه .
                        کمی بیشتر در مورد عملکرد توضیح بدید. منظورتون اینه که اگر یکی از کلیدها زده شد، عملکرد مربوطه انجام بشه و منتظر بمونه تا دوباره کلیدی فشار داده بشه یا اینکه کلید دوم مستلزم این باشه که کلید اول قبلش فعال شده باشه؟ دقیق توضیح بدید تا بشه راهنمایی کرد

                        دیدگاه


                          #13
                          پاسخ : خارج نشدن از حلقه for

                          نوشته اصلی توسط hossein.m98 نمایش پست ها
                          کمی بیشتر در مورد عملکرد توضیح بدید. منظورتون اینه که اگر یکی از کلیدها زده شد، عملکرد مربوطه انجام بشه و منتظر بمونه تا دوباره کلیدی فشار داده بشه یا اینکه کلید دوم مستلزم این باشه که کلید اول قبلش فعال شده باشه؟ دقیق توضیح بدید تا بشه راهنمایی کرد

                          لازم نیست ترتیبی داشته باشن .
                          ولی رونده کار دستگاه اینه که اول خروجی که یه موتور هست باید 5 ثانیه کار کنه بعد خاموش بشه .
                          سپس اپراتور که کلید دومو زد موتور به صورت 1ثانیه روشن 1ثانیه خاموش کارکنه . (در ضمن حلقه دیگه لازم نداره . چون الان چک کردم دیدم که تا وقتی کلید دوم فعاله باید به این صورت کار کنه خروجی )

                          دیدگاه


                            #14
                            پاسخ : خارج نشدن از حلقه for

                            نوشته اصلی توسط erfan-messi نمایش پست ها
                            لازم نیست ترتیبی داشته باشن .
                            ولی رونده کار دستگاه اینه که اول خروجی که یه موتور هست باید 5 ثانیه کار کنه بعد خاموش بشه .
                            سپس اپراتور که کلید دومو زد موتور به صورت 1ثانیه روشن 1ثانیه خاموش کارکنه . (در ضمن حلقه دیگه لازم نداره . چون الان چک کردم دیدم که تا وقتی کلید دوم فعاله باید به این صورت کار کنه خروجی )
                            امیدوارم کارتون با این راه بیوفته:

                            int main (void)
                            {
                            DDRB = (1<<2);
                            unsigned char check = 1;

                            #define OutPut PORTB.2
                            #define InPut_0 PINB.0
                            #define InPut_1 PINB.1

                            while (1)
                            {
                            if ((InPut_0) && (check))
                            {
                            delay_ms(50);
                            if (InPut_0)
                            {
                            OutPut = 1;
                            delay_ms(5000);
                            check = 0;
                            }
                            }
                            else if ((!InPut_0) && (!check))
                            {
                            delay_ms(50);
                            if (!InPut_0)
                            {
                            check = 1;
                            }
                            }

                            if (InPut_1)
                            {
                            delay_ms(50);
                            while (InPut_1)
                            {
                            OutPut = ~OutPut;
                            delay_ms(1000);
                            }
                            OutPut = 0;
                            }

                            }
                            }

                            شما میتونید پین کلید ها و خروجی رو خیلی راحت با تغییر دستورات مقابل define تغییر بدید.
                            منطق برنامه هم به این شکله که اگر کاربر کلید اول رو روشن کنه، خروجی 5 ثانیه روشن میشه؛ بعد از پنج ثانیه خروجی خاموش شده و تا کاربر کلید رو یکبار قطع و وصل نکنه، عملکرد مربوط به کلید اول دوباره اجرا نمیشه. کلید دوم هم تا وقتی وصله خروجی یک ثانیه به یک ثانیه روشن و خاموش میشه و تا این کلید قطع نشه، به کلید اول دسترسی نداریم.
                            ضمنا باز هم تاکید میکنم، مقاومت پول داون فراموش نشه. اگر بخوایید میتونید مقاومت پول آپ داخلی رو فعال کرد که در اون صورت باید سر دوم کلیدها رو به زمین وصل کرد و برنامه هم باید کمی تغییر داده بشه.

                            دیدگاه


                              #15
                              پاسخ : خارج نشدن از حلقه for

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

                              دیدگاه

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