اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه نویسی Codevision برای مدار LED

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

    مشکل در برنامه نویسی Codevision برای مدار LED


    سلام خدمت دوستان عزیز
    برای پروژه کارگاه میکرو کنترلر باید یه مداری طراحی و پیاده سازی کنیم که با فشردن کلید برای بار اول فقط LED1 روشن
    بار دوم فقط LED2 روشن
    بار سوم هر 2 روشن
    و بار چهارم هردو LED خاموش !

    ( بار اولم بود برای همچین چیز هایی میخواستم کد بنویسم و متاسفانه استاد بسیار بی سوادی نصیب ما شده که حتی تعریف Event رو نمیدونه ! )

    کدی که نوشتم متاسفانه نمیدونم در کدوم قسمت اشتباه کردم که با فشردن کلید کل فرآیند پشت سر هم اجرا میشه
    و منتظر نمیمونه که کلید رو برای دفعات بعدی فشار بدیم !

    ممنون میشم اگه دوستان راهنمایی کنند.

    کد:
    #include <mega16.h>
    #include <delay.h>
    #define STAT PINC.0
    
    
    void main (void){
      int count =0;
      DDRA=0xff;
      DDRC=0x00;   
    
      
      while(1)
      {
        if(STAT == 1)
        {   
           switch (count%4)
           {
    
             case 0: if(STAT == 1)
               PORTA.0=1;
               PORTA.1=0;
               delay_ms(500);
               
               break;
             
             case 1: if(STAT == 1)
               PORTA.0=0;
               PORTA.1=1;
               delay_ms(500);
    
               break;
             
             case 2:   if(STAT == 1)
               PORTA.0=1;
               PORTA.1=1;
               delay_ms(500);
    
               break;
             
             case 3:   if(STAT == 1)
               PORTA.0=0;
               PORTA.1=0;
               delay_ms(500);
    
               break;   
           }
           count += 1; 
            delay_ms(500);
        }//else {break;}
      }
    }

    #2
    پاسخ : مشکل در برنامه نویسی Codevision برای مدار LED

    خوب می تونی این رو خیلی راحت تر بنویسی.
    یه شرط بزار که به ازای هر بار فشار دادن از 1 تا 4 بشماره و اگه از 4 بیشتر شد باز 1 بشه که برنامه با زدن چند باره ی کلید همچنان عمل کنه.
    سپس با استفاده از دستور switch بیا واسه ایم متغییر که از 1 تا 4 مقدار می گیره شرط عملکرد بزار
    اگر تفهیم نشد بگو تا برنامه شو بنویسم.
    چرا ناراحتی پاتریک!
    + امروز ی بچه دیدم سرچهارراه گل میفروخت
    - از دیدنش ناراحت شدی؟
    + نه
    پس چی ناراحتت کرده
    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
    ------------------------------------------------------------------------------------------------------
    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
    ------------------------------------------------------------------------------------------------------
    محصولات

    دیدگاه


      #3
      پاسخ : مشکل در برنامه نویسی Codevision برای مدار LED

      بسیار سپاسگزارم که پاسخ دادید
      کد نهایی به صورت زیر در اومد ولی باز هم متاسفانه کلیه مراحل بعد از فشردن کلید انجام میشه !
      کد:
      #include <mega16.h>
      #include <delay.h>
      #define STAT PINC.0
      
      
      void main (void){
        int count =0;
        DDRA=0xff;
        DDRC=0x00;   
      
        
        while(1)
        {
          if(STAT == 1)
          {   
        count++;
             switch (count)
             {
      
               case 1: 
                 PORTA.0=1;
                 PORTA.1=0;
                 delay_ms(500);
                 break;
               
               case 2: 
                 PORTA.0=0;
                 PORTA.1=1;
                 delay_ms(500);
      
                 break;
               
               case 3:  
                 PORTA.0=1;
                 PORTA.1=1;
                 delay_ms(500);
                 break;
               
               case 4:   
                 PORTA.0=0;
                 PORTA.1=0;
                 delay_ms(500);
             count = 0;
                 break;   
             }
          }
        }
      }

      دیدگاه


        #4
        پاسخ : مشکل در برنامه نویسی Codevision برای مدار LED

        توی حلقه while این طور بنوسید

        کد:
        if(STAT)
        {
        delay_ms(50);
        if(STAT)
        count++;
        }
        گفت که دیوانه نهی لایق این خانه نهی

        دیدگاه


          #5
          پاسخ : مشکل در برنامه نویسی Codevision برای مدار LED

          امیدوارم jtag رو غیرفعال کرده باشی و مقاومت pulldown هم گذاشته باشی!!!
          من ایرادات برنامه رو رفع کردم. برنامه زیر رو تست کن و نتیجه رو بگو.فقط من برنامه رو کامپایل نکردم امیدوارم پیغام خطا نده :icon_razz: :icon_razz: :icon_razz:
          کد:
          #include <mega16.h>
          #include <delay.h>
          #define STAT PINC.0
          bit x;
          
          void main (void){
            int count=0;
            DDRA=0xff;
            DDRC=0x00;   
          
            
            while(1)
            {
              if(STAT == 1 && x==0)
              {
          x=1;   
            count++;
          if (count>4) count=0;
          }
          if(STAT == 0 && x==1) x=0;
                 switch (count)
                 {
          
                   case 1: 
                     PORTA.0=1;
                     PORTA.1=0;
          	       delay_ms(500);
                     break;
                   
                   case 2: 
                     PORTA.0=0;
                     PORTA.1=1;
          		   delay_ms(500);
                     break;
                   
                   case 3:  
                     PORTA.0=1;
                     PORTA.1=1;
                     delay_ms(500);
                     break;
                   
                   case 4:   
                     PORTA.0=0;
                     PORTA.1=0;
                     delay_ms(500);
                     break;   
                 }
              }
            }
          چرا ناراحتی پاتریک!
          + امروز ی بچه دیدم سرچهارراه گل میفروخت
          - از دیدنش ناراحت شدی؟
          + نه
          پس چی ناراحتت کرده
          + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
          ------------------------------------------------------------------------------------------------------
          تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
          ------------------------------------------------------------------------------------------------------
          محصولات

          دیدگاه


            #6
            پاسخ : مشکل در برنامه نویسی Codevision برای مدار LED

            بسیار سپاسگزارم
            در صورتی که امکانش هست لطفا در مورد تغییراتی که اعمال کردید کمی توضیح بدید.

            دیدگاه


              #7
              پاسخ : مشکل در برنامه نویسی Codevision برای مدار LED

              ببینید وقتی می خواین از کلید استفاده کنید باید bounce اون رو هم در نظر بگیرید. برای رفع این مشکل یا باید از اینتراپت استفاده کنید که به صورت داخلی پین مورد نظر به لبه ها حساس میشه و یا خودتون توسط خطوط برنامه این بخش رو شبیه سازی کنید.
              شما فقط نوشته بودین اگر پین مورد نظر فشار داده شد مقدار متغیر رو یکی یکی اضافه کن ولی این رو در نظر نگرفتین که به محض دست زدن به کلید و برداشتن اون چندین پالس به میکرو اعمال میشه. من از طریق خطوط برنامه و توسط تعریف یک متغییر از جنس بیت این مشکل رو حل کردم یعنی وقتی شما دستتون رو کلید میره تا برداشتن اون و زدن مجدد عملی صورت نمی گیره و تعداد افزایش متغییر فقط یک واحد خواهد بود!!
              البته یه تغییر دیگه هم صورت گرفته که اگه نگاه کنید دستور switch در خارج شرط قرار داده شده.
              امیدوارم مطلب رو به درستی رسونده باشم
              بازم سوالی بود در خدمتم
              موفق باشید
              چرا ناراحتی پاتریک!
              + امروز ی بچه دیدم سرچهارراه گل میفروخت
              - از دیدنش ناراحت شدی؟
              + نه
              پس چی ناراحتت کرده
              + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
              ------------------------------------------------------------------------------------------------------
              تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
              ------------------------------------------------------------------------------------------------------
              محصولات

              دیدگاه


                #8
                پاسخ : مشکل در برنامه نویسی Codevision برای مدار LED

                مرسی که توضیح دادید

                دیدگاه


                  #9
                  پاسخ : مشکل در برنامه نویسی Codevision برای مدار LED

                  نوشته اصلی توسط Alir3za
                  سلام خدمت دوستان عزیز
                  برای پروژه کارگاه میکرو کنترلر باید یه مداری طراحی و پیاده سازی کنیم که با فشردن کلید برای بار اول فقط LED1 روشن
                  بار دوم فقط LED2 روشن
                  بار سوم هر 2 روشن
                  و بار چهارم هردو LED خاموش !

                  ( بار اولم بود برای همچین چیز هایی میخواستم کد بنویسم و متاسفانه استاد بسیار بی سوادی نصیب ما شده که حتی تعریف Event رو نمیدونه ! )

                  کدی که نوشتم متاسفانه نمیدونم در کدوم قسمت اشتباه کردم که با فشردن کلید کل فرآیند پشت سر هم اجرا میشه
                  و منتظر نمیمونه که کلید رو برای دفعات بعدی فشار بدیم !

                  ممنون میشم اگه دوستان راهنمایی کنند.

                  کد:
                  #include <mega16.h>
                  #include <delay.h>
                  #define STAT PINC.0
                  
                  
                  void main (void){
                    int count =0;
                    DDRA=0xff;
                    DDRC=0x00;   
                  
                    
                    while(1)
                    {
                      if(STAT == 1)
                      {   
                         switch (count%4)
                         {
                  
                           case 0: if(STAT == 1)
                             PORTA.0=1;
                             PORTA.1=0;
                             delay_ms(500);
                             
                             break;
                           
                           case 1: if(STAT == 1)
                             PORTA.0=0;
                             PORTA.1=1;
                             delay_ms(500);
                  
                             break;
                           
                           case 2:   if(STAT == 1)
                             PORTA.0=1;
                             PORTA.1=1;
                             delay_ms(500);
                  
                             break;
                           
                           case 3:   if(STAT == 1)
                             PORTA.0=0;
                             PORTA.1=0;
                             delay_ms(500);
                  
                             break;   
                         }
                         count += 1; 
                          delay_ms(500);
                      }//else {break;}
                    }
                  }
                  دوست من بهتره ضعف ها و کم کاری های خودمون با بی سوادی دیگران اشتباه نگیریم
                  همیشه هرجا گیر میکنیم خوب نیست بگیم استاد بیسوادی داریم ......

                  برنامه شما کاملا درسته و مشکلی نداره فقط منطق شما اشتباهه
                  شما تو برنامه نوشتین تا زمانی که کلید فشار داده شد شمارش کن
                  خوب اون حلقه چند هزار بار در ثانیه اجرا میشه و طبیعتا چند هزار بار در هر ثانیه عمل شمارش صورت میگیره
                  شما باید برنامه به این صورت اصلاح کنین که هنگامی که کلید فشار داده شد بعد از تاخیری وارد یه حلقه بشه که تازمانی که کلید فشار داده شده داخل همون حلقه بمونه
                  اینطوری مشکل شما رفع میشه
                  [glow=red,2,300]تاپیک های ایجاد شده[/glow]

                  دیدگاه

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