اطلاعیه

Collapse
No announcement yet.

capture

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

    capture

    می خواهم با واحد کپچر تایمر یک در مگا 16 فرکانس متر بسازم./************************************************** ***
    This program was produced by the
    CodeWizardAVR V1.24.6 Standard
    Automatic Program Generator
    © Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    e-mailffice@hpinfotech.com

    Project :
    Version :
    Date : 7/14/2008
    Author : ali
    Company : ali
    Comments:


    Chip type : ATmega16
    Program type : Application
    Clock frequency : 8.000000 MHz
    Memory model : Small
    External SRAM size : 0
    Data Stack size : 256
    ************************************************** ***/

    #include <mega16.h>

    // Alphanumeric LCD Module functions
    #asm
    .equ __lcd_port=0x1B ;PORTA
    #endasm
    #include <lcd.h>
    #include<stdio.h>
    #include<delay.h>
    #include<math.h>
    #include<stdlib.h>
    volatile unsigned int st,so,T1,n,y=0;
    float f;
    long int T;


    unsigned char lcd[30],str[30];


    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    n=n++;

    }


    interrupt [TIM1_CAPT] void timer1_capt_isr(void)
    { if(y==0){
    y=1;
    T1=ICR1L+ICR1H*256;
    TCCR1B=0X01;
    ICR1L=0X00;
    ICR1H=0X00;


    if(T1>=st){T=(n*65536)+(T1 - st);
    }
    if(T1<st){
    T=(((n-1)*65536)+(T1 - st));}



    st=T1;

    }

    else{y=0;
    so=ICR1L+ICR1H*256;
    TCCR1B=0X41;
    ICR1L=0X00;
    ICR1H=0X00;

    }
    }




    void main(void)
    {

    PORTA=0x00;
    DDRA=0x00;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x00;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;


    TCCR1A=0x00;
    TCCR1B=0xC1;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;


    TIMSK=0x24;


    lcd_init(16);

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

    while (1)
    {T=abs(T);

    f=(float)1.0/T;
    f=f*100000;
    ftoa(f,8,str);

    sprintf(lcd,"%6d",str);
    lcd_clear();
    lcd_puts(lcd);
    delay_ms(10);

    };
    } اینهم برنامه است اما درست جواب نمی دهد. لطفا راهنماییم کنید؟

    #2
    پاسخ : capture

    سلام .
    شما مشکلتون حل شد ؟
    منم مشکل مشابهی دارم . وقتی رجیستر ICR1H رو میخونم در هر حالتی صفر هستش . ولی ICR1L مشکلی نداره .

    دیدگاه


      #3
      پاسخ : capture

      منذرت میخوام میون بحثتون.......

      چرا به جای استفاده از capture از واحد کانتر میکرو برای ساخت فرکانس متر استفاده نمیکنید
      البته فقط سوال پرسیدما!!!!!

      برای اینکار کافیه دو تا از تایمرهای میکرو رو به کار بگیرین یکی شو به صورت کانتر ودیگری رو به صورت تایمر
      با تایمر تاخیر یک ثانیه تولید میکنید و در زیر روال وقفش مقدار کانتر ( رجیستر TCNT) رو میخونید.


      اما به هر حال

      دلیل اینکه مقدار رجیستری که میخونید صفره اینکه رجیستر ICR به صورت TEMP هست.

      میکروکنترلر برای اطمینان از اینکه هر دو بایت بالا وپایین به طور هم زمان در در اختیار cpu قرار میگیره یه رجیستر موقت (TEMP) رو به کار میگیره.

      بحث طولانی داره بنابراین من فقط نحوی خوندن این نوع رجیسترهای دو بایتی رو میگم:

      در حالتی که میخوایم دیتایی توی این رجیستر بنویسیم ابتدا باید دیتا رو تو رجیستر ICRH بریزیم و بعد در ICRL

      در حالتی که میخوایم دیتایی رو از این رجیستر بخونیم ابتدا باید ICRL بخونیم وبعد ICRH


      برای استفاده از capture حتما واحد حذف نویز رو فعال کنید.چون تو عمل مشاهده شده فرمان ناخواسته ی تسخیر داده میشه.
      [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
      [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

      دیدگاه


        #4
        پاسخ : capture

        نوشته اصلی توسط حمیدجان

        چرا به جای استفاده از capture از واحد کانتر میکرو برای ساخت فرکانس متر استفاده نمیکنید
        به دو دلیل :
        1- فرض کنید دقت مورد نظر شما صدم هرتز هست . اگر با تایمر توی یک ثانیه تعداد سیکل رو بشماریم دقت اندازه گیریمون یک هست یعنی :
        مثلا فرکانس 400.25 هرتز رو 400 هرتز میخونید .
        2- برای سنجش یک پالس با اندازه گیری توی 1 ثانیه ، یک ثانیه زمان لازمه اما با اندازه گیری دوره تناوب فقط یک دوره تناوب زمان لازم داریم.که خیلی خیلی سریعتر میشه .

        دیدگاه


          #5
          پاسخ : capture

          فدات شم حالا کی گفت حتما باید یک ثانیه صبر کنید تو جایی که میخواین سریع فرکانس رو بدست بیارین میتونید تاخیر رو کمتر کنید در عوض هر مقداری که بدست اوردین به نسبت در عددی ضرب کنید.

          گذشته از اون بعد از گذشت یک ثانیه وقفه ای رخ میده که میتونید در اون مقدار کانتر رو بخونید یعنی طی این یک ثانیه cpu هیچ گونه درگیری و دخالتی نداره.

          من تا حال نشنیدم بگن فرکانس بر حسب هرتز ممیز هم داره (400.25).

          کسانی که با میکرو کار کردن میدونن واحد capture خیلی حساس به نویزه مخصوصا وقتی میخوایم فرکانس متر درست کنیم.
          باید حتما تنظیمات امنیتی رو لحاظ کنیم.
          [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
          [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

          دیدگاه


            #6
            پاسخ : capture

            نوشته اصلی توسط حمیدجان

            من تا حال نشنیدم بگن فرکانس بر حسب هرتز ممیز هم داره (400.25).

            کسانی که با میکرو کار کردن میدونن واحد capture خیلی حساس به نویزه مخصوصا وقتی میخوایم فرکانس متر درست کنیم.
            باید حتما تنظیمات امنیتی رو لحاظ کنیم.
            ایشالا اولین فرصت عملی مدارو میبندم . نتیجش رو اینجا منعکس می کنم .
            منظور منم از فرکانس 400.25 اینه که دقت خیلی برامون مهمه . یعنی دوره تناوب رو باید خیلی دقیق اندازه بگیریم .
            از طرفی اگر به خاطر نویز بخواییم از واحد capture استفاده نکنیم که نمیشه .
            خروجی خیلی از ماژول ها و سنسور ها PWM هست و باید duty cycle پالس خروجی به دقت اندازه گیری بشه . اونجا که دیگه نمیشه از کانتر استفاده کرد.

            دیدگاه

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