اطلاعیه

Collapse
No announcement yet.

مشکلش کجاست؟؟؟؟

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

    مشکلش کجاست؟؟؟؟

    سلام، آقا من میخوام یه قطار پالس با فرکانس 2kHz و دیوتی سیکل 25% بسازم. کد زیرو نوشتم، اما پالس خروجی با دیوتی سیکل 10% و تو فرکانس 500Hz کار میکنه. هرچی فکر کردم به نتیجه ای نرسیدم. اگه میتونید لطف کنید کمکم کنید، خیلی ضروریه. ممنون
    کد:
    [left]
    #include <mega32.h>
    #define xtal 8000000
    interrupt [TIM0_OVF] void timer0_ovf_isr(void) //فعال کردن وقفه سرریز برای دادن مقدار اولیه به TCNT0
    {
    TCNT0=0x00;
    }
    void main(void)
    {
    PORTB=0x00;
    DDRB=0x08; //انتخاب پایه OC0 به عنوان خروجی
    TCCR0=0x6b; //تقسیم فرکانسی 64
    TCNT0=0xc2; //مقداردهی اولیه به تایمر کانتر صفر برای ساخت فرکانس مورد نظر
    OCR0=0x17; //تنظیم دیوتی سیکل
    TIMSK=0x01; //فعال کردن وقفه سرریز تایمر صفر
    #asm("sei") // فعال کردن وقفه کلی
    while (1);
    }
    [/left]
    از لحاظ روابط کاملا درسته، اما نمیدونم چرا تو پروتئوس اینجوری میشه؟؟؟
    :angry: :angry: :angry: :angry:

    #2
    پاسخ : مشکلش کجاست؟؟؟؟

    :cry: :cry: :cry: :cry: :cry: :cry: :cry:
    کسی نبود؟؟؟؟

    دیدگاه


      #3
      پاسخ : مشکلش کجاست؟؟؟؟

      سلام
      ببین این کار راه های زیادی داره ولی ساده ترینش PWM هست
      طوری که تا overflow اندازه 500 میکرو ثانیه طول بکشه و تا compare match اندازه 125 میکرو ثانیه
      یکم توضیحش زیاده نمیدونم خودت تا چه حد بلدی ولی با کریستال 16 مگاهرتز و تقسیم فرکانسی 64، هر شمارش تایمر اندازه 4 میکرو ثانیه طول میکشه
      پس واسه 500 میکروثانیه باید 125تا بشماره و overflow کنه
      تایمر صفر 8 بیتیه و از صفر تا 255 میشماره و overflow میکنه
      پس اگه شمارشش از 130 شروع بشه، تا 255 که برسه 125تا شمرده
      پس مقدار TCNT0 باید روی 130 تنظیم بشه که مقدار hexش میشه 0x82
      ولی بعد از overflow این TCNT0 دوباره صفر میشه
      پس باید وقفه overflow رو روشن کنی که به محض overflow کردن دوباره TCNT0 رو 0x82 کنه
      از اون طرف برای دیوتی سایکل 25 درصد باید 125 میکروثانیه یک باشه
      با هر شمارش تایمر که 4 میکروثانیه طول میکشه تقریبا 32 تا شمارش باید کنه تا به 125 میکروثانیه برسه
      پس OCR0 باید روی 32 تنظیم بشه
      ولی چون شمارش از 130 شروع میشه باید OCR0 روی 162 تنظیم شه (32تا از اول شمارش بیشتر) که مقدار هگزش میشه 0xa2
      بعدش تامرتو جوری تنظیم میکنی که خروجی بده روی پایه OC0
      کدشم برات میذارم که خودت یه مقایسه بکنی
      مشکل کار تو این بود که توی وقفه به جای اینکه به TCNT0 مقدار بدی، اونو صفر میکنی در حالی که وقتی overflow انجام شه TCNT0 خودش صفر میشه

      کد:
      #include <mega32.h>
      
      
      interrupt [TIM0_OVF] void timer0_ovf_isr(void){
        TCNT0=0x82;
        }
      
      void main(void){
        PORTB=0x00;
        DDRB=0x08;
        TCCR0=0x6b;
        TCNT0=0x82;
        OCR0=0xa2;
        TIMSK=0x01;
        #asm("sei")
        while (1);
        }

      دیدگاه


        #4
        پاسخ : مشکلش کجاست؟؟؟؟

        سلام آقا امین
        دمت گرم که کمکم کردی، خدا خیرت بده. مشکلم حل شد. خیلی مردی بخدا
        کاش بتونم لطفت رو جران کنم. بازم ممنون
        :rolleyes: :rolleyes: :rolleyes: :rolleyes:
        یاعلی

        دیدگاه


          #5
          پاسخ : مشکلش کجاست؟؟؟؟

          نوشته اصلی توسط hamze_b
          سلام آقا امین
          دمت گرم که کمکم کردی، خدا خیرت بده. مشکلم حل شد. خیلی مردی بخدا
          کاش بتونم لطفت رو جران کنم. بازم ممنون
          :rolleyes: :rolleyes: :rolleyes: :rolleyes:
          یاعلی
          خواهش میکنم بازم اگه مشکلی بود بگو :agree:

          دیدگاه

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