اطلاعیه

Collapse
No announcement yet.

مشکل با تا بع delay در کدویژن

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

    مشکل با تا بع delay در کدویژن

    با سلام
    من تو کدویژن از delay_ms() استفاده کردم ولی تقریبا 2.5 برابر بیشتر تایم میگیره .
    فرکانسم 1 مگا هست. همه چیزش درسته . فیوزبیتا و تنظیماتش . چون برنامم درست کار میکنه . ولی صرفا مشکلم تو دیلی هست . هیدر فایلشم اینکلود کردم .
    البته اینو بگم که دیلی رو تو یه حلقه ی for نوشتم . ولی فک نکنم تا اون اندازه خطا بده
    به نظر شما اشکال از کتابخونشه
    یا ؟

    #2
    پاسخ : مشکل با تا بع delay در کدویژن

    سلام

    به احتمال 99 درصد مشکل از همون حلقه for هست. اگر امکان داره کد برنامه را بگذار تا بشه نظر داد
    شیطان که رانده گشت یک خطا بیشتر نکرد
    خود را برای سجده آدم رضا نکرد
    شیطان هزار مرتبه بهتر ز بی نماز
    او سجده را بر آدم و این بر خدا نکرد

    دیدگاه


      #3
      پاسخ : مشکل با تا بع delay در کدویژن

      نوشته اصلی توسط kaja2012
      سلام

      به احتمال 99 درصد مشکل از همون حلقه for هست. اگر امکان داره کد برنامه را بگذار تا بشه نظر داد
      #include<mega8.h>
      #include<delay.h>
      #include<stdio.h>

      //must to define every variable float that will been divided
      unsigned long int temp,edge,l,h;

      unsigned long int w,r,k;


      //subroutines must been defined befor main


      void main(void)
      {

      edge=63350;
      k=1;
      #asm("sei&quot
      DDRD.0=1 ;
      DDRD.2=0 ;



      ADCSRA=0b10000000;
      ADMUX=0b11000001;


      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: 1000.000 kHz
      // Mode: Normal top=FFFFh
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge

      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;





      // External Interrupt(s) initialization
      // INT0: On
      // INT0 Mode: Falling Edge
      // INT1: Off
      GICR|=0x40;
      MCUCR=0x02;
      GIFR=0x40;


      // Watchdog Timer initialization
      // Watchdog Timer Prescaler: OSC/2048k
      WDTCR=0x1F;
      WDTCR=0x0F;



      edge=64100;
      for(h=0;h<=66;h++)
      {
      #asm("WDR&quot
      delay_ms(900);
      }

      حلقه ی تاخیرم همین آخریه

      دیدگاه


        #4
        پاسخ : مشکل با تا بع delay در کدویژن

        سلام
        دوستمون درست میگن

        من یه بار میخواستم delay درس کنم، حساب کردم،(شمارندمم unsigned int بود) برای یه حلقه ی خالی هر افزایش شمارنده 78 سیکل کلاک طول میکشه!!! :eek:

        راستی یه روشی برا ایجاد delay توی اسمبلی بود به شدت دقیق :nice: کسی اونو یادش نیس؟
        پشت به کنکور ، رو به سربازی...

        دیدگاه


          #5
          پاسخ : مشکل با تا بع delay در کدویژن

          البته تو برنامم یه دونه وقفه دارم که در ثانیه 50 بار اجرا می شه تو هر کدوم 10 تا 15 میلی ثانیه تاخیر داره . مشکل از اون نباشه .
          من کتابخونشو نتونستم پیدا کنم ببینم چجوری نوشتن .

          دیدگاه


            #6
            پاسخ : مشکل با تا بع delay در کدویژن

            اونا رو که نمیتونی ببینی :NO:

            چرا خوب اونم هست چون برنامه اصلی(main) تا پایان ساب روتین وقفه متوقف میشه! توش که delay نذاشتی؟!
            ولی چرا فرکانس کلاکو زیاد نمیکنی؟
            پشت به کنکور ، رو به سربازی...

            دیدگاه


              #7
              پاسخ : مشکل با تا بع delay در کدویژن

              آره .آفرین .مشکل از وقفه بود. تابع delay تو وقفه متوقف میشه .
              لامذهبم هر چی توقف در وقفه بیشتر میشه delay به صورت تصاعدی بیشتر میشه . تا حالا متوجه نشده بودم
              حالا من چیکار کنم .باید از timer0 استفاده کنم نه .
              دوستان ایده های دیگری دارن ؟

              کلاکو نمی تونم زیاد کنم .چون همه چی به هم میریزه . مدار در حد میکروثانیه کار میکنه .

              دیدگاه


                #8
                پاسخ : مشکل با تا بع delay در کدویژن

                من معمولا تو این موارد از تایمر استفاده میکنم که شما میگی نمیتونی (ولی اگه بتونی که خیلی خوب میشه ) وگرنه که باید برنامتو تغییر بدی

                روتین وقفتو بذار ببنیم چیه...

                پشت به کنکور ، رو به سربازی...

                دیدگاه


                  #9
                  پاسخ : مشکل با تا بع delay در کدویژن

                  سلام
                  خوبی
                  تو بسکام هم همین طوره ، تابع waitms در وقفه تایمر ها برای تولید پالس هام کار نمیکرد
                  فقط میتونی یه حلقه بذاری مثال زیر رو نگاه کن
                  dim a as word
                  isr_ovf1:
                  do
                  a=a+1
                  loop untile a=3500
                  .......
                  return
                  با هاش تاخیر ایجاد کنی خیلی با دقت هست
                  امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                  دیدگاه


                    #10
                    پاسخ : مشکل با تا بع delay در کدویژن

                    راستی شما با کدویژن کار میکنی
                    ببین اگه میخوای تو وقفه از دیلی استفاده کنی باید خودت یه تابع کوچیک با تایمر1 درست کنی وتو وقفه بکار ببری ، یه مدتی پیش داشتیم با یکی از برو بچه فروم های خارجی که رفیقمون هست رو میکرو های pic کار میکردیم همچین مشکلی داشتیم که حل شد البته برای pic هست ولی تبدیل میکنم به avr و به کدویژن اگه میخوای وگرنه که مشکلت حل شده که هیچی، بازم خواستی بگو برات میفرستم

                    امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                    دیدگاه


                      #11
                      پاسخ : مشکل با تا بع delay در کدویژن

                      interrupt [EXT_INT0] void ext_int0_isr(void)
                      {
                      #asm("WDR&quot
                      #asm("cli"
                      TCNT1=edge;
                      TCCR1A=0x00;
                      TCCR1B=0x02;


                      while((TIFR&0x04)==0);
                      TIFR|=0x04;

                      TCCR1B=0x00;
                      TCCR1A=0x00;

                      PORTD.0=1;
                      #asm("NOP"
                      #asm("NOP"
                      PORTD.0=0;
                      t=t+1;
                      #asm("sei"

                      }

                      سابروتین وقفه اینه .

                      این وقفه هر ثانیه 50 بار اجرا میشه . یعنی با فرکانس شهری کار میکنه

                      دیدگاه


                        #12
                        پاسخ : مشکل با تا بع delay در کدویژن

                        نوشته اصلی توسط mahdi8866
                        راستی شما با کدویژن کار میکنی
                        ببین اگه میخوای تو وقفه از دیلی استفاده کنی باید خودت یه تابع کوچیک با تایمر1 درست کنی وتو وقفه بکار ببری ، یه مدتی پیش داشتیم با یکی از برو بچه فروم های خارجی که رفیقمون هست رو میکرو های pic کار میکردیم همچین مشکلی داشتیم که حل شد البته برای pic هست ولی تبدیل میکنم به avr و به کدویژن اگه میخوای وگرنه که مشکلت حل شده که هیچی، بازم خواستی بگو برات میفرستم
                        مشکل من اینه که تاخیر داخل سابروتین وقفه نیستش . داخل برنامست .
                        مشکل دیگمم اینه که سابروتین وقفه باید تمام و کمال انجام بشه . حتی اولش وقفه رو غیر فعال کردم .
                        تنها چارم اینه که از تایمر استفاده کنم . ولی اون موقع باید وقفه تایمرو داخل سابروتین فعال کنم که ممکنه مشکل پیش بیاره .
                        ولی من یه متغیر t گذاشتم داخل سابروتین . میتونین بالا ببینینش . و از اونجایی که وقفه هر 20 میلی ثانیه اجرا میشه ، یعنی با فرکانس 50 هرتز، زمانو از اونجا حساب میکنم .
                        حالا تو این برنامه چون من وقفه ی منظم دارم که هر 20 میلی ثانیه اجرا میشه ، تا حدی مشکلمو حل کرد .
                        ولی موندم که در چنین مواقعی باید چی کار کرد . یه میکرو جواب نمیده

                        دیدگاه


                          #13
                          پاسخ : مشکل با تا بع delay در کدویژن

                          بازم سلام

                          روتین وقفت که چیز خاصی نداره فقط من یه تکشو نمیفمم
                          کد:
                          while((TIFR&0x04)==0);
                          TIFR|=0x04;
                          ینی میخای پرچم اور فالوی تایمر 1 (tov1) رو high کنی؟ چرا؟ oo:

                          برنامتم که تیکه تیکه میذاری، هیچی نمی فمیم ازش باقی روتین main کجاس؟

                          آقا یه کاری کن، اگه اون delay 900 میلی خیلی نیاز به دقت نداره که احتمالا داره ، با آزمون و خطا کمش کن ببین کجا میشه همون 900 میلی ثانیه که میخوای

                          حالا برنامه چی هس؟ماهواره ی نوید و امید ؟ بگو می خوای چیکار کنی شاید یه نفر راه ساده تر بلد باشه :bye
                          پشت به کنکور ، رو به سربازی...

                          دیدگاه


                            #14
                            پاسخ : مشکل با تا بع delay در کدویژن

                            سلام این یه برنامه کوچیک با اسمبلی برای delay هست که با 8 مگاهرتز داخلی تنظیم شده میتونی تو کدویژن ازش استفاده کنی
                            delay400ms:
                            rcall delay200ms
                            delay200ms:
                            rcall delay40ms
                            rcall delay80ms
                            delay80ms:
                            rcall delay40ms
                            delay40ms:
                            rcall delay5ms
                            rcall delay5ms
                            rcall delay5ms
                            rcall delay5ms
                            delay20ms:
                            rcall delay5ms
                            rcall delay5ms
                            rcall delay5ms
                            delay5ms:
                            push r16
                            ldi r16, 20
                            delay5ms_loop:
                            rcall delay250us
                            dec r16
                            brne delay5ms_loop
                            pop r16
                            ret
                            delay250us:
                            push r16
                            ldi r16, 199
                            delay250us_loop:
                            nop
                            nop
                            nop
                            nop
                            nop
                            nop
                            nop
                            dec r16
                            brne delay250us_loop
                            pop r16
                            ret
                            امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                            دیدگاه


                              #15
                              پاسخ : مشکل با تا بع delay در کدویژن

                              while((TIFR&0x04)==0);
                              TIFR|=0x04
                              منتظر میمونه که تایمر اورفلو بشه . بعد اونو یک میکنه واسه دفعه بعدی
                              برنامم کنترل کننده ی دماست . می خوام انشالله سال بعد ماهی یه سیصد چهارصد تا جوجه دربیارم .
                              بالاخره باید از تکنولوژیمون استفاده کنیم دیگه . :nice:

                              همه چی تو این سابروتین انجام میشه . داخل برنامم از A2D دما رو می خونمو edge رو از یک تا 1000 متناسب با دما تغییر میدم .بعدش به تایمر استارت میکنم وقتی اورفلو شد تریستورو آتیش میزنه . بعد جوجه های توی تخما کیف میکننو واسم کف میزنن :applause:

                              این تاخیر همه چیرو به هم میزنه . فکر کن . داخل مثلا یه دیلی 900 میلی ثانیه ای هر 20 میلی ثانیه یه بار دیلی قطع بشه و تقریبا 11 تا 19 میلی ثانیه منتظر بمونه . این 11 تا 19 همون زمان آتیش زدن تریستوره . حالا اونم متغیره . یعنی تقریبم نمی شه زد

                              دیدگاه

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