اطلاعیه

Collapse
No announcement yet.

Input Capture با استفاده از ASF پردازنده Xmega128A1

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

    Input Capture با استفاده از ASF پردازنده Xmega128A1

    با سلام

    بنده سعی کردم در AVRStudio6.2 با استفاده از کتابخانه های ASF شرکت اتمل برای پردازنده xmega128a1 برنامه نویسی کنم ، ولی برای راه اندازی Input Capture که بتوان DutyCycle یک سیگنال ورودی PWM را اندازه گیری کند کتابخانه ای پیدا نکردم . قبل از این با بسکام کار میکردم و اطلاعات کافی در مورد برنامه نویسی در AVR Studio ندارم به همین خاطر ASF رو انتخاب کردم که یادگیری رو برام آسونتر کنه .

    میدونم در حال حاظر باید پایه شماره 1 پورت C رو که سیگنال ورودی از اون وارد میشه رو با استفاده از External Interrupt مانیتور کنم و هروقت وضعیت این پین 1 باشه ( Rising Edge ) یک تایمر رو راه اندازی کنم و هر وقت 0 ( Falling Edge ) شد تایمر رو متوقف کنم و زمان از تایمر اندازه گیری کنم . ولی چطور میتونم با استفاده از ASF اینتراپت خارجی رو راه اندازی کنم ؟
    ممنون میشم اگر راهنمایی بفرمایید .

    سپاسگزارم .

    #2
    پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

    عملیات capture که در عنوان پست خود ذکر کرده اید، با وقفه خارجی دو مسئله متفاوت است و برای پیاده سازی آن هم نیازی به استفاده از ASF نیست. در XMEGA دو مد frequency capture و pulse width capture وجود دارد که بسته به دقت مورد انتظار می توانید با استفاده هوشمندانه از آنها duty cycle را با دقت بسیار بالایی اندازه گیری کنید.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #3
      پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

      با سلام

      خیلی ممنونم از پاسختون ، میشه لطف کنید و نمونه برنامه ای قرار بدید که من یاد بگیرم ؟

      سپاسگزارم .

      دیدگاه


        #4
        پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

        کدی را قبلا در انجمن برای اتصال سنسور SMT160-30 قرار داده بودم که بر اساس تغییر duty cycle عمل می کند:

        http://www.eca.ir/forum2/index.php?t...0309#msg470309

        در این کد بر اساس روش Input capture و متوسط گیری عمل شده و توجه به محتوای آن احتمالا نیاز کار شما را برطرف خواهد کرد.
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #5
          پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

          با سلام

          خیلی ممنونم از نمونه برنامه ای که قرار دادید . این برنامه توی IAR نوشته شده و من از ATMEL AVR Studio6.2 استفاده میکنم . توی AVR Studio موقع کامپایل کردن برنامه خطاهایی بوجود میاد .
          کد:
          /*
           Written by Ozhan KD (www.knowledgeplus.ir)
           7segments show current temperature based on SMT160-30 sensor
                    
           Sensor output --- 560R --- PC2
                       |
                       |
                      1K 
                       |
                       |
                      GND
          
           temperature = Duty cycle - 0.32 
                  ----------------- 
                    0.0047    
          */
          
          #include "avr_compiler.h"
          #include "key_7seg_v3.h"
          #include "TC_driver.h"
          
          volatile unsigned int PULSE_LOW,PULSE_HIGH;
          void main()
          {
           unsigned char DIGITS[6]={0,0,blank_code,blank_code,blank_code,blank_code}; 
           signed long temp1,temp2=0;
           unsigned int temp,N=0;
           
           OSC_CTRL|=OSC_RC32MEN_bm;
           while(!(OSC_STATUS & OSC_RC32MRDY_bm));
           CCP=CCP_IOREG_gc;
           CLK_CTRL=CLK_SCLKSEL_RC32M_gc;
           init_7seg();
           init_TCD0(); 
           PORTC_PIN2CTRL=PORT_OPC_PULLDOWN_gc|PORT_ISC_BOTHEDGES_gc; 
           EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN2_gc; 
           TC0_ConfigInputCapture(&TCC0,TC_EVSEL_CH0_gc); 
           TC0_SetCCAIntLevel(&TCC0,TC_CCAINTLVL_MED_gc); 
           TC0_EnableCCChannels(&TCC0,TC0_CCAEN_bm);
           TC0_ConfigClockSource(&TCC0,TC_CLKSEL_DIV1_gc);
           PMIC_CTRL|=PMIC_MEDLVLEN_bm;
           sei();
           while(1)
           { 
           temp1=68000L*(signed long)PULSE_HIGH - 32000L*(signed long)PULSE_LOW; 
           temp1/=(47*(signed long)(PULSE_HIGH + PULSE_LOW));
           temp2+=temp1;
           if(++N==2048)
           {
            N=0;  
            if (temp2<0)
            {
            temp2=-temp2;
            DIGITS[4]=minus_code;
            } 
            else DIGITS[4]=blank_code;
            
            temp=(temp2>>11);
            temp2=0;
            for (unsigned char i=0;i<4;i++)
            { 
            DIGITS[i]=temp%10;
            temp/=10;
            }
            if(DIGITS[3]==0)
            {
            DIGITS[3]=blank_code;
            if(DIGITS[2]==0)DIGITS[2]=blank_code;
            } 
           show_7seg(DIGITS,2,0x00); 
           } 
           } 
          }
          
          ISR(TCC0_CCA_vect)
          {
           static bool first_time_f=true;
           static unsigned int old_timer_value;
           unsigned int t16;
           if(first_time_f)
           {
           old_timer_value=TC_GetCaptureA(&TCC0);
           first_time_f=false;
           }
           else 
           { 
           t16=TC_GetCaptureA(&TCC0);
           if(PORTC_IN&PIN2_bm)PULSE_LOW=t16-old_timer_value;
           else PULSE_HIGH=t16-old_timer_value;
           old_timer_value=t16; 
           } 
          }
          این کد برنامه شماست . تا اونجایی که بنده متوجه شدم ابتدا تایمر TCC0 رو در مد Input Capture کانفیگ کردید . بعد اولویت اینتراپت رو سطح متوسط تعریف کردید و بعد از اون Compare کانال A رو فعال میکنید و در نهایت تایمر رو با مشخص کردن کلاک سورس فعال میکنید .

          ولی بنده متوجه نشدم مقدار اندازه گیری شده Duty Cycle رو که احتمالا از طریق فانکشن TC_GetCaptureA(&TCC0) میخونید رو چطور باید بخونم چون من این فانکشن رو ندیدم جایی تعریف کرده باشید .

          ممنون میشم کدتون رو توضیح بدید . البته میدونم درخواست زیادیه و شما هم وقتتون محدوده از این بابت عذرخواهی میکنم .
          در صورت امکان بفرمایید آیا امکانش هست این برنامه رو با AVR Studio 6.2 بنویسم و کامپایل کنم ؟

          سپاسگزارم .

          دیدگاه


            #6
            پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

            TC_GetCaptureA یک ماکرو است که در کتابخانه TC_driver تعریف شده و با اضافه کردن کتابخانه به پروژه در برنامه شناخته می شود. در این پروژه بخشی که باید تغییر داده شود مربوط به کتابخانه key_7seg_v3 است که مربوط به صفحه کلید و سون سگمنت های برد آموزشی است و یک نسخه جدیدتر و منطبق با AtmelStudio در بخش های 25 تا 28 فیلم آموزش XMEGA توضیح داده شده است. به غیر از موارد کلی که در پست اول قرار داده اید، بصورت دقیق توضیح دهید که قصد انجام چه کاری را دارید و هدف نهایی از اندازه گیری duty cycle چیست؟
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #7
              پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

              با سلام و تشکر از پاسختون

              من میخوام یک فرستنده رادیو کنترل 9 کانال رو از طریق کابل ترینر به پایه 1 پورت C پردازنده Xmega متصل کنم و مقادیر Duty Cycle رو اندازه گیری کنم . این مقادیر در حقیقت مقادیر حرکت دادن استیکهای فرستنده هستند .

              وقتی از طریق کابل ترینر فرستنده رو به اسیلوسکوپ متصل میکنیم به ازای هر کانال ( در اینجا 9 کانال ) یک شکل موج مربعی به هم پیوسته ایجاد میشه که 9 لبه بالا رونده و 9 لبه پایین رونده داره .

              در اینجا باید مقادیر هر کانال رو بصورت مجزا اندازه گیری کنم . و بطور کل اصلا نیازی به سون سگمنت و صفحه کلید ندارم . فقط Input Capture و مقادیر اندازه گیری شده رو از طریق پورت سریال به کامپیوتر ارسال کنم .

              متشکرم .

              دیدگاه


                #8
                پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1



                ببخشید توی ارسال قبلی به اشتباه نوشتم به ازای هر کانال ، برای 9 کانال صحیح است .

                دیدگاه


                  #9
                  پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

                  کد:
                  /*
                   * Include header files for all drivers that have been imported from
                   * Atmel Software Framework (ASF).
                   */
                  #include <asf.h>
                  #include <string.h>
                  #include <stdio.h>
                  #include <stdlib.h>
                  //#include "avr_compiler.h"
                  #include "TC_driver.h"
                  #include "TC_driver.c"
                  
                  
                  uint32_t Duty;
                  
                  #define USART_SERIAL        &USARTD0
                  #define USART_SERIAL_BAUDRATE    38400
                  #define USART_SERIAL_CHAR_LENGTH  USART_CHSIZE_8BIT_gc
                  #define USART_SERIAL_PARITY     USART_PMODE_DISABLED_gc
                  #define USART_SERIAL_STOP_BIT    false
                  
                  volatile unsigned int PULSE_LOW,PULSE_HIGH;
                  
                  static usart_serial_options_t usart_options = {
                  	.baudrate = USART_SERIAL_BAUDRATE,
                  	.charlength = USART_SERIAL_CHAR_LENGTH,
                  	.paritytype = USART_SERIAL_PARITY,
                  	.stopbits = USART_SERIAL_STOP_BIT
                  };
                  
                  #define LED5 IOPORT_CREATE_PIN(PORTB, 0)
                  #define LED4 IOPORT_CREATE_PIN(PORTB, 1)
                  #define LED3 IOPORT_CREATE_PIN(PORTB, 2)
                  #define LED2 IOPORT_CREATE_PIN(PORTB, 3)
                  #define LED1 IOPORT_CREATE_PIN(PORTB, 4)
                  //
                  #define BUTTON1 IOPORT_CREATE_PIN(PORTK, 0)
                  #define BUTTON2 IOPORT_CREATE_PIN(PORTK, 1)
                  #define BUTTON3 IOPORT_CREATE_PIN(PORTK, 2)
                  #define BUTTON4 IOPORT_CREATE_PIN(PORTK, 3)
                  #define BUTTON5 IOPORT_CREATE_PIN(PORTK, 4)
                  //
                  
                  int main (void)
                  {
                  	PORTD.DIRSET = PIN3_bm;
                    sysclk_init();
                    usart_serial_init( USART_SERIAL, &usart_options );
                  	ioport_init();
                  	board_init();
                  	pmic_init();
                  	usart_serial_init(USART_SERIAL,&usart_options);
                  	delay_init(sysclk_get_main_hz);
                  	usart_tx_enable(USART_SERIAL);
                  
                  //	OSC_CTRL|=OSC_RC32MEN_bm;
                  //	while(!(OSC_STATUS & OSC_RC32MRDY_bm));
                  //	CCP=CCP_IOREG_gc;
                  //	CLK_CTRL=CLK_SCLKSEL_RC32M_gc;
                  	PORTC_PIN1CTRL=PORT_OPC_PULLDOWN_gc|PORT_ISC_BOTHEDGES_gc;
                  	EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN1_gc;
                  	TC0_ConfigInputCapture(&TCC0,TC_EVSEL_CH0_gc);
                  	TC0_SetCCAIntLevel(&TCC0,TC_CCAINTLVL_MED_gc);
                  	TC0_EnableCCChannels(&TCC0,TC0_CCAEN_bm);
                  	TC0_ConfigClockSource(&TCC0,TC_CLKSEL_DIV1_gc);
                  	PMIC_CTRL|=PMIC_MEDLVLEN_bm;
                  	sei();
                   
                  	while (true)
                  	{
                  		char Freq[33];
                  		Duty = TCC0.CCA;
                  		itoa(Duty,Freq,10);
                  		for (int i=0; i<sizeof(Freq);i++)
                  		{
                  			usart_putchar(USART_SERIAL,Freq[i]);
                  		}
                  		usart_putchar(USART_SERIAL,(char)10);
                  		usart_putchar(USART_SERIAL,(char)13);
                  	}
                  	
                  }
                  
                  
                  ISR(TCC0_CCA_vect)
                  {
                  	static bool first_time_f=true;
                  	static unsigned int old_timer_value;
                  	unsigned int t16;
                  	if(first_time_f)
                  	{
                  		old_timer_value=TC_GetCaptureA(&TCC0);
                  		first_time_f=false;
                  	}
                  	else
                  	{
                  		t16=TC_GetCaptureA(&TCC0);
                  		if(PORTC_IN&PIN1_bm)PULSE_LOW=t16-old_timer_value;
                  		else PULSE_HIGH=t16-old_timer_value;
                  		old_timer_value=t16;
                  	}
                  }
                  با سلام مجدد

                  در برنامه فوق از ASF برای راه اندازی ارتباط سریال با کامپیوتر استفاده کردم و تا اینجای کار به درستی کار میکنه . وقتی نمونه برنامه ای که شما قرار دادید رو بهش اضافه میکنم موقع کامپایل خطای :
                  کد:
                  Error	1	multiple definition of `__vector_16'
                  رو برای
                  کد:
                  ISR(TCC0_CCA_vect)
                  نمایش میده . در صورت امکان راهنمایی بفرمایید .

                  سپاسگزارم .

                  دیدگاه


                    #10
                    پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

                    با سلام مجدد

                    این برنامه بدون ASF راه اندازی شد و کار میکنه :

                    کد:
                    #include <avr/io.h>
                    #include <string.h>
                    #include <stdio.h>
                    #include <stdlib.h>
                    #include "avr_compiler.h"
                    #include "TC_driver.h"
                    #include "TC_driver.c"
                    
                    volatile unsigned int PULSE_LOW,PULSE_HIGH;
                    uint32_t Duty,Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9;
                    char *Header = "First AVR Studio Project";
                    
                    inline void usart_init(USART_t *usart_port_register,PORT_t *usart_port_pins,const int16_t bsel,const uint8_t bscale);
                    void usart_receive_byte(USART_t *usart_port_register);
                    void usart_putc(USART_t *usart_port_register,char c);
                    
                    int main(void)
                    {
                    OSC_CTRL|=OSC_RC32MEN_bm;
                    while(!(OSC_STATUS & OSC_RC32MRDY_bm));
                    CCP=CCP_IOREG_gc;
                    CLK_CTRL=CLK_SCLKSEL_RC32M_gc;
                    PORTC_PIN1CTRL=PORT_OPC_PULLDOWN_gc|PORT_ISC_BOTHEDGES_gc;
                    EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN1_gc;
                    TC0_ConfigInputCapture(&TCC0,TC_EVSEL_CH0_gc);
                    TC0_SetCCAIntLevel(&TCC0,TC_CCAINTLVL_MED_gc);
                    TC0_EnableCCChannels(&TCC0,TC0_CCAEN_bm);
                    TC0_ConfigClockSource(&TCC0,TC_CLKSEL_DIV1_gc);
                    PMIC_CTRL|=PMIC_MEDLVLEN_bm;
                    sei();
                    
                    //usart_init(&USARTD0,&PORTD,3317,12);  // This should be 9600 Baud  
                    usart_init(&USARTD0,&PORTD,3269,-6);  // This should be 38400 Baud
                    
                    //
                    for (int i=0; i<sizeof(Header);i++)
                    {
                    	usart_putc(&USARTD0,Header[i]);
                    }
                    usart_putc(&USARTD0,(char)10);
                    usart_putc(&USARTD0,(char)13);
                    Header = "Data : ";
                    	
                    while (true)
                    {
                    	char Freq[33];
                    	Duty = TCC0.CCA;
                    	itoa(Duty,Freq,10);
                    	for (int i=0; i<sizeof(Freq);i++)
                    	{
                    		usart_putc(&USARTD0,Freq[i]);
                    	}
                    	usart_putc(&USARTD0,(char)10);
                    	usart_putc(&USARTD0,(char)13);
                    }
                    
                    }
                    
                    
                    ISR(TCC0_CCA_vect)
                    {
                    	static bool first_time_f=true;
                    	static unsigned int old_timer_value;
                    	unsigned int t16;
                    	if(first_time_f)
                    	{
                    		old_timer_value=TC_GetCaptureA(&TCC0);
                    		first_time_f=false;
                    	}
                    	else
                    	{
                    		t16=TC_GetCaptureA(&TCC0);
                    		if(PORTC_IN&PIN1_bm)PULSE_LOW=t16-old_timer_value;
                    		else PULSE_HIGH=t16-old_timer_value;
                    		old_timer_value=t16;
                    	}
                    }
                    
                    inline void usart_init(USART_t *usart_port_register,PORT_t *usart_port_pins,const int16_t bsel,const uint8_t bscale)
                    {
                    	usart_port_pins->OUTSET = PIN3_bm; 
                    	usart_port_pins->DIRSET = PIN3_bm; 
                    	usart_port_pins->OUTCLR = PIN1_bm; 
                    	usart_port_pins->DIRSET = PIN1_bm; 
                    	usart_port_pins->DIRCLR = PIN2_bm; 
                    	usart_port_register->BAUDCTRLB = ((bscale << 4) | (bsel >> 8));
                    	usart_port_register->BAUDCTRLA = (uint8_t) bsel;
                    	usart_port_register->CTRLC = USART_CMODE_ASYNCHRONOUS_gc |
                    	USART_PMODE_DISABLED_gc | USART_CHSIZE_8BIT_gc;
                    	usart_port_register->CTRLB |= USART_RXEN_bm | USART_TXEN_bm;
                    }
                    
                    
                    void usart_receive_byte(USART_t *usart_port_register)
                    {
                    	uint8_t rx_byte = 0;
                    	
                    	rx_byte = usart_port_register->DATA;
                    	for (int i=0; i<sizeof(Header);i++)
                    	{
                    		usart_putc(&USARTD0,Header[i]);
                    	}
                    	usart_putc(&USARTD0,rx_byte);
                    	usart_putc(&USARTD0,(char)10);
                    	usart_putc(&USARTD0,(char)13);
                    	
                    }
                    
                    void usart_putc(USART_t *usart_port_register,char c)
                    {
                    	while (!(usart_port_register->STATUS & USART_DREIF_bm));
                    	usart_port_register->DATA = c;
                    }
                    اگر جایی در این برنامه اشکالی میبینید لطفا راهنمایی بفرمایید .
                    متشکرم .

                    دیدگاه


                      #11
                      پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

                      سلام

                      برنامه رو مجددا اصلاح کردم . فقط الان مقدار اندازه گیری شده در PULSE_HIGH رو یک عدد منفی نمایش میده که مقادیرش تقریبا پایداره و مقدار اندازه گیری شده PULSE_LOW رو یک عدد مثبت نمایش میده که مقادیرش به پایداری PULSE_HIGH نیست . در مقدار اندازه گیری شده PULSE_HIGH دو رقم آخر خیلی تغییر میکنند . آیا راهی هست که مقادیر رو خیلی پایدار تر اندازه گیری کنه ( دقتش بالاتر بره ) من توی یکی از فایلهای مربوط به Timer/Counter پردازنده XMEGA خوندم که میشه دو تا از تایمرها رو با هم مورد استفاده قرارداد و یک تایمر 32 بیتی ساخت ، آیا این کار میتونه توی ارتقاء دقت اندازه گیری مقادیر کمکی بکنه ؟

                      متشکرم .

                      کد:
                      #include <avr/io.h>
                      #include <string.h>
                      #include <stdio.h>
                      #include <stdlib.h>
                      #include "avr_compiler.h"
                      #include "TC_driver.h"
                      #include "TC_driver.c"
                      
                      volatile unsigned int PULSE_LOW,PULSE_HIGH;
                      uint32_t Duty,Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9;
                      char *Header = "First AVR Studio Project";
                      //
                      static bool first_time_f=true;
                      static unsigned int old_timer_value;
                      unsigned int t16;
                      
                      inline void usart_init(USART_t *usart_port_register,PORT_t *usart_port_pins,const int16_t bsel,const uint8_t bscale);
                      void usart_receive_byte(USART_t *usart_port_register);
                      void usart_putc(USART_t *usart_port_register,char c);
                      
                      int main(void)
                      {
                      OSC_CTRL|=OSC_RC32MEN_bm;
                      while(!(OSC_STATUS & OSC_RC32MRDY_bm));
                      CCP=CCP_IOREG_gc;
                      CLK_CTRL=CLK_SCLKSEL_RC32M_gc;
                      PORTC_PIN1CTRL=PORT_OPC_PULLDOWN_gc|PORT_ISC_BOTHEDGES_gc;
                      EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN1_gc;
                      TC0_ConfigInputCapture(&TCC0,TC_EVSEL_CH0_gc);
                      TC0_SetCCAIntLevel(&TCC0,TC_CCAINTLVL_MED_gc);
                      TC0_EnableCCChannels(&TCC0,TC0_CCAEN_bm);
                      TC0_ConfigClockSource(&TCC0,TC_CLKSEL_DIV1_gc);
                      PMIC_CTRL|=PMIC_MEDLVLEN_bm;
                      sei();
                      
                      //usart_init(&USARTD0,&PORTD,3317,12);  // This should be 9600 Baud  
                      usart_init(&USARTD0,&PORTD,3269,-6);  // This should be 38400 Baud
                      
                      
                      while (true)
                      {
                      	char Freq[33];
                      	Duty = PULSE_HIGH; //TCC0.CCA;
                      	itoa(Duty,Freq,10);
                      	for (int i=0; i<sizeof(Freq);i++)
                      	{
                      		usart_putc(&USARTD0,Freq[i]);
                      	}
                      	usart_putc(&USARTD0,(char)10);
                      	usart_putc(&USARTD0,(char)13);
                      }
                      }
                      
                      ISR(TCC0_CCA_vect)
                      {
                      	if(first_time_f)
                      	{
                      		old_timer_value=TC_GetCaptureA(&TCC0);
                      		first_time_f=false;
                      	}
                      	else
                      	{
                      		t16=TC_GetCaptureA(&TCC0);
                      		if(PORTC_IN&PIN1_bm)PULSE_LOW=t16-old_timer_value;
                      		else PULSE_HIGH=t16-old_timer_value;
                      		old_timer_value=t16;
                      	}
                      }
                      
                      inline void usart_init(USART_t *usart_port_register,PORT_t *usart_port_pins,const int16_t bsel,const uint8_t bscale)
                      {
                      	usart_port_pins->OUTSET = PIN3_bm; 
                      	usart_port_pins->DIRSET = PIN3_bm; 
                      	usart_port_pins->OUTCLR = PIN1_bm; 
                      	usart_port_pins->DIRSET = PIN1_bm; 
                      	usart_port_pins->DIRCLR = PIN2_bm; 
                      	usart_port_register->BAUDCTRLB = ((bscale << 4) | (bsel >> 8));
                      	usart_port_register->BAUDCTRLA = (uint8_t) bsel;
                      	usart_port_register->CTRLC = USART_CMODE_ASYNCHRONOUS_gc |
                      	USART_PMODE_DISABLED_gc | USART_CHSIZE_8BIT_gc;
                      	usart_port_register->CTRLB |= USART_RXEN_bm | USART_TXEN_bm;
                      }
                      
                      void usart_receive_byte(USART_t *usart_port_register)
                      {
                      	uint8_t rx_byte = 0;
                      	rx_byte = usart_port_register->DATA;
                      	for (int i=0; i<sizeof(Header);i++)
                      	{
                      		usart_putc(&USARTD0,Header[i]);
                      	}
                      	usart_putc(&USARTD0,rx_byte);
                      	usart_putc(&USARTD0,(char)10);
                      	usart_putc(&USARTD0,(char)13);
                      }
                      
                      void usart_putc(USART_t *usart_port_register,char c)
                      {
                      	while (!(usart_port_register->STATUS & USART_DREIF_bm));
                      	usart_port_register->DATA = c;
                      }

                      دیدگاه


                        #12
                        پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

                        تا جایی که از توضیحات شما متوجه می شوم، قصد دارید 18 عرض پالس متوالی (و یا 9 مقدار متناظر با Duty cycle هر مرحله) را ارسال کنید. اما در کدی که قرار داده اید، علاوه بر وجود متغیرهای زائد مانند Channel1 تا Channel9، چنین عملیاتی انجام نمی شود. با فرض ارسال بخش های High و Low بصورت مجزا، اولین موردی که باید رعایت کنید این است که ارسال باید هماهنگ و سنکرون با وقفه capture باشد و مقداری که ارسال می شود متناسب با عرض پالس اندازه گیری شده در هر مرحله باشد. در حالیکه در برنامه شما چنین موردی رعایت نشده و ارسال ها بصورت پشت سر هم و فقط برای بخش High انجام می شود.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


                          #13
                          پاسخ : Input Capture با استفاده از ASF پردازنده Xmega128A1

                          با سلام

                          متشکرم از پاسختون . بله اون برنامه فقط یک کانال رو که از گیرنده رادیو کنترل دریافت میشد رو اندازه گیری میکنه . روی اسیلوسکوپ وقفه بین کانالها رو اندازه گیری کردم برابر با 0.4 میلی ثانیه بود . امروز برنامه رو تغییر میدم و نتیجه رو ارسال میکنم .

                          در مورد دقت اندازه گیری آیا استفاده از تایمر 32 بیتی کمکی میکنه ؟

                          ممنونم از وقتی که گذاشتید .

                          دیدگاه

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