اطلاعیه

Collapse
No announcement yet.

مشکل با مد CTC

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

    مشکل با مد CTC

    سلام
    من می خوام با mega16 و کریستال 16MHz یه قطار پالس با فرکانس متغیر از 122Hz تا 8Mhz تولید کنم. روش کار به این صورت هست که فرکانس رو به برنامه میدم و برنامه زمان نصف پالس رو محاسبه می کنه. بر اساس این زمان، مقدار OCR1AH و OCR1AL رو تنظیم می کنه و در مد CTC با مقدار حد اکثر OCR1A تایمر شروع به شمارش می کنه و با رسیدن مقدار OCR پایه OC1A تغییر وضعیت ( toggle ) میده. برنامه رو تو avr studio تست کردم و درست کار می کنه. اما در عمل و توی پروتیوس ، تایمر OCR1AH رو نادیده می گیره و مقدار شمارش رو فقط با OCR1AL مقایسه می کنه. در نتیجه فرکانس های پایین تولید نمیشن. من که نتونستم دلیلی براش پیدا کنم. کسی می دونه دلیل نادیده گرفته شدن OCR1AH چیه؟

    اینم برنامه


    #include <mega16.h>

    #define FRE 150
    #define N 1000

    // Declare your global variables here
    unsigned long int n;
    void pulse(unsigned long int f,unsigned long int n_2);


    // Timer 1 output compare A interrupt service routine
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    n--;
    if(n==0)
    {
    TCCR1B=0x00;
    PORTA.0=1;
    }
    }

    void main(void)
    {

    PORTD=0x00;
    DDRD=0x20;
    PORTA=0x00;
    DDRA=0x01;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 16000.000 kHz
    // Mode: CTC top=OCR1A
    // OC1A output: Toggle
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: On
    // Compare B Match Interrupt: Off
    TCCR1A=0x40;
    // TCCR1B=0x09;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;


    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x10;


    // Global enable interrupts
    #asm("sei&quot

    pulse(FRE,N);

    while (1);
    }

    void pulse(unsigned long int f,unsigned long int n_2)
    {
    double t=0;
    unsigned int c=0;
    n=2*n_2;
    t=1000000000/(2*f); // half time
    c=t/62.5;
    OCR1AL=c;
    OCR1AH=(c>>8);
    TCCR1B=0x09;
    PORTA.0=0;
    }

    #2
    پاسخ : مشکل با مد CTC

    کسی نمی دونه ایراد از کجاست؟
    عجله دارم :sad:

    دیدگاه


      #3
      پاسخ : مشکل با مد CTC

      خودم تا اینجا فهمیدم که رجیستر OCR1AH اصلاً مقدار دهی نمیشه. البته تو avr studio مقدار می گیره ولی در عمل و تو پروتیوس این اتفاق نمیفته. چرا؟؟؟؟؟

      دیدگاه


        #4
        پاسخ : مشکل با مد CTC

        ممنون از لطف دوستان!
        ایراد رو پیدا کردم. OCR1A رو باید یکجا مقدار دهی می کردم

        دیدگاه

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