اطلاعیه

Collapse
No announcement yet.

مشکل در رجیستر های تایمر0 (fast pwm)

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

    مشکل در رجیستر های تایمر0 (fast pwm)

    سلام دوستان
    یه برنامه نوشتم که خود به خود مقدار دیوتی سایکلو زیاد کنه ولی خروجی هیچی ندارم :cry2:
    مشکل از کجاست
    کد:
     
    
    <include <mega16.h#
    <include <delay.h#
    
    char a ;
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    }
    
    
    
    void main(void)
    {
    
    PORTA=0x00;
    DDRA=0x00;
    
     
    PORTB=0x00;
    DDRB=0x00;
    
     
    PORTC=0x00;
    DDRC=0x00;
    
    PORTD=0x00;
    DDRD=0x00;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 62.500 kHz
    // Mode: Fast PWM top=0xFF
    // OC0 output: Non-Inverted PWM
    TCCR0=0x6C;
    TCNT0=0x00;
    OCR0=0x00;
    
    
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    
    MCUCR=0x00;
    MCUCSR=0x00;
    
    
    TIMSK=0x01;
    
    
    UCSRB=0x00;
    
    
    ACSR=0x80;
    SFIOR=0x00;
    
    
    ADCSRA=0x00;
    
    
    SPCR=0x00;
    
    
    TWCR=0x00;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       {
        
       } (++for (TCNT0=131;a=0;a  
    
         }(++for (OCR0=12.5;TCNT0=131;OCR0
         ;(delay_ms(1 
         ;if(OCR0>125) break
         }  
    
    
        
        } (++for (OCR0=6.25;TCNT0=193.5;OCR0
        ;(delay_ms(1 
         ;if(OCR0<62.5)break 
        {  
    
         ; {
    دوستان ببخشید دیگه تو اینجا کدا یخورده بهم ریخته من تا اینجاشو فقط مرتب کرد.


    کد:
      
           for (TCNT0=193.5;a=1;a--) { 
    
            for (OCR0=62.5;OCR0>6.25&&TCNT0=193.5;OCR0--){
                delay_ms(1); 
            if (OCR0>6.25)break;     
             }
    
           TCNT0=131;
           
             for (OCR0=125;TCNT0=131;OCR0--){
            delay_ms(1);
            if (OCR0>12.5)break;     
    
            }  
    
    
          ;  { 
         
        
           
           
    
    
    
     {
    زندگي يه محيط برنامه نويسيه که خودمون برنامشو مينويسيم
    و هر لحظه امکان فشار روي کليک run هست
    پس ريسک نکنين خط به خط برنامتون رو چک بکنيد چون شايد ديگه فرصت دباگ کردن برنامه رو نداشته باشيد.
    الهم اغفر لنا ذنوبنا

    #2
    پاسخ : مشکل در رجیستر های تایمر0 (fast pwm)

    با سلام
    راستش من تا حالا اینطوری از for استفاده نکردم(منظورم آرگومان هاش هست) . اما چند تا مورد رو دیدم گفتم بگم :
    1. تو حلقه for اول شرط حلقه (با فرض صفر بودن a)فقط بار اول برقرار هست .
    2. یه چیزی رو باید بدونید تا زبان سی انواع داده قابل تبدیل به هم هستند الان وقتی شما میایید ی مقدار اعشاری رو به ocr0 منتسب میکنید چون ocr0 از نوع بایت صحیح هست و نه اعشاری تنها قسمت صحیح اون اعداد به رجیستر منتسب میشن .
    3. کلا به نظرم مشکل کارتون تو آرگومان های حلقه های for هست.چون زیاد با هم سنخیت ندارند.

    دیدگاه


      #3
      پاسخ : مشکل در رجیستر های تایمر0 (fast pwm)

      نوشته اصلی توسط mojtaba_led
      با سلام
      راستش من تا حالا اینطوری از for استفاده نکردم(منظورم آرگومان هاش هست) . اما چند تا مورد رو دیدم گفتم بگم :
      1. تو حلقه for اول شرط حلقه (با فرض صفر بودن a)فقط بار اول برقرار هست .
      2. یه چیزی رو باید بدونید تا زبان سی انواع داده قابل تبدیل به هم هستند الان وقتی شما میایید ی مقدار اعشاری رو به ocr0 منتسب میکنید چون ocr0 از نوع بایت صحیح هست و نه اعشاری تنها قسمت صحیح اون اعداد به رجیستر منتسب میشن .
      3. کلا به نظرم مشکل کارتون تو آرگومان های حلقه های for هست.چون زیاد با هم سنخیت ندارند.
      سلام مجتبی جان :bye
      ولی اگه تو ارگومان اشتباهی باشه کدویژن ارور میده وکامپایل نمیکنه درسته؟؟؟
      زندگي يه محيط برنامه نويسيه که خودمون برنامشو مينويسيم
      و هر لحظه امکان فشار روي کليک run هست
      پس ريسک نکنين خط به خط برنامتون رو چک بکنيد چون شايد ديگه فرصت دباگ کردن برنامه رو نداشته باشيد.
      الهم اغفر لنا ذنوبنا

      دیدگاه


        #4
        پاسخ : مشکل در رجیستر های تایمر0 (fast pwm)

        منم چند تایی مشکل دیدم
        اول این که این for فقط یه دفعه اجرا می شه
        چون متغیر a سریع 1 می شه
        (++for (TCNT0=131;a=0;a
        حالا اصلا مشکلات رو ول کن
        بگو ببینم می خوای چی کار کنی فامیلللللللللللللللللللللللللللللللللللللللللل :applause:

        دیدگاه


          #5
          پاسخ : مشکل در رجیستر های تایمر0 (fast pwm)

          فامیل جان گوش کن




          } (++for1 (TCNT0=131;a=0;a



          }(++for2 (OCR0=12.5;TCNT0=131;OCR0
          ;(delay_ms(1
          { ;if(OCR0>125) break



          } (++for3 (OCR0=6.25;TCNT0=193.5;OCR0
          ;(delay_ms(1
          { ;if(OCR0<62.5) break


          ; {






          قبول داری وارد دستور FOR1 میشه خب اینو که مطمئنا قبول داری چون شرط حلقه برقراره
          خب ما هم یه بار بیشتر بهش نیاز نداریم
          اون دستورات قسمت دومی که نوشتم در انتها a=0 ولی موضوع اینه که خروجی نداریم

          زندگي يه محيط برنامه نويسيه که خودمون برنامشو مينويسيم
          و هر لحظه امکان فشار روي کليک run هست
          پس ريسک نکنين خط به خط برنامتون رو چک بکنيد چون شايد ديگه فرصت دباگ کردن برنامه رو نداشته باشيد.
          الهم اغفر لنا ذنوبنا

          دیدگاه


            #6
            پاسخ : مشکل در رجیستر های تایمر0 (fast pwm)

            ولی اگه تو ارگومان اشتباهی باشه کدویژن ارور میده وکامپایل نمیکنه درسته؟؟؟
            درسته اما اگه چیزی که براش تعریف نشده باشه در غیر اینصورت هر متغیری رو شما میتونید تو آرگومان استفاده کنید. همیشه همه چیز از دید کامپایلر بررسی نمیشه شما به عنوان یه برنامه نویس باید این موارد رو پیشبینی کنید.

            دیدگاه


              #7
              پاسخ : مشکل در رجیستر های تایمر0 (fast pwm)

              نوشته اصلی توسط mojtaba_led
              درسته اما اگه چیزی که براش تعریف نشده باشه در غیر اینصورت هر متغیری رو شما میتونید تو آرگومان استفاده کنید. همیشه همه چیز از دید کامپایلر بررسی نمیشه شما به عنوان یه برنامه نویس باید این موارد رو پیشبینی کنید.
              مجتبی جان من همین الان امتحان کردم
              حلقه ها مشکلی نداشتن :NO:
              جدیدن خروجی هم میده ولی مشکل اصلی روی رجیستر ocr و tcnt هسته
              خروجی رو با اسیلسکوپ دیدم دائم یک بود
              نمیدونم چرا فرکانس ثابته؟؟؟
              یعنی مشکل از کجا میتونه باشه؟ :angry:
              زندگي يه محيط برنامه نويسيه که خودمون برنامشو مينويسيم
              و هر لحظه امکان فشار روي کليک run هست
              پس ريسک نکنين خط به خط برنامتون رو چک بکنيد چون شايد ديگه فرصت دباگ کردن برنامه رو نداشته باشيد.
              الهم اغفر لنا ذنوبنا

              دیدگاه


                #8
                پاسخ : مشکل در رجیستر های تایمر0 (fast pwm)

                جناب مجاهد عزیز
                راستش من از برنامه تون چیزی سر در نیاوردم اما تا اونجا که فهمیدم شما میخوایید مقدار دیوتی سایکل به صورت خودکار از یه مقدار میینیمم به یه مقدار ماکزیمم افزایش پیدا کنه از این جهت من پیشنهادی که دارم اینکه ، آقا اول یه برنامه ساده بنویسید که تو اون دیوتی سایکل PWM ثابت باشه و مثلا بیاید یه جدول از مثلا 10 تا دیوتی سایکل مختلف درست کنید و بعد بوسیله یدونه پوش باتون مقدار دیوتی سایکل رو با منتسب کردن مقادیر اون جدول به رجیستر OCR ، مقدار دیوتی سایکل رو تغییر بدید بعد اگه تو عمل جواب گرفتید ، حالا بیایید تو برنامه یه حلقه FOR بزارید که در هر بار با یه تاخیر مثلا یک ثانیه ای (یا هر اندازه دلخواه) مقدار دیوتی سایکل رو به ترتیب از مقادیر داخل جدول استخراج کنه و یا ... .

                دیدگاه


                  #9
                  پاسخ : مشکل در رجیستر های تایمر0 (fast pwm)

                  مشکل اساسیم با تایمره (تایمر0)
                  یه سوال ؟
                  مگه تو مد fast PWM نمیشه دیوتی سایکلو زیاد کرد و فرکانس و ثابت نگه داشت؟
                  فرمول فرکانسش که اینه :(TCNT0م-256)FOCO = fclk-I/O ÷N
                  و برای (D.C =OCR0/(256-TCNT0
                  با افزایش ocr0 زمان وظیفه افزایش پیدا میکنه خوب یعنی میشه دیگه درسته ؟
                  پس چرا تو پرتیوس جواب نمیده مشکل از کجاست؟ (تو پرتیوس زمان وظیفه ثابت میمونه و مقدارش خیلی کمه در صورتی که من اونو تا 70 در صد هم زیاد میکنم ولی ..)
                  زندگي يه محيط برنامه نويسيه که خودمون برنامشو مينويسيم
                  و هر لحظه امکان فشار روي کليک run هست
                  پس ريسک نکنين خط به خط برنامتون رو چک بکنيد چون شايد ديگه فرصت دباگ کردن برنامه رو نداشته باشيد.
                  الهم اغفر لنا ذنوبنا

                  دیدگاه

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