ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





صفحه 1 از 2 12 آخرین
  1. #1
    تاریخ عضویت
    2012/07/15
    34
    0

    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. #2
    تاریخ عضویت
    2009/10/27
    تهران
    3,312
    1,075

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

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

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

    با سلام

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

    سپاسگزارم .
  4. #4
    تاریخ عضویت
    2009/10/27
    تهران
    3,312
    1,075

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

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

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت



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

    پاسخ : 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. #6
    تاریخ عضویت
    2009/10/27
    تهران
    3,312
    1,075

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

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

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

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

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

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

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

    متشکرم .
  8. #8
    تاریخ عضویت
    2012/07/15
    34
    0

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



    ببخشید توی ارسال قبلی به اشتباه نوشتم به ازای هر کانال ، برای 9 کانال صحیح است .
  9. #9
    تاریخ عضویت
    2012/07/15
    34
    0

    پاسخ : 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. #10
    تاریخ عضویت
    2012/07/15
    34
    0

    پاسخ : 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;
    }
    اگر جایی در این برنامه اشکالی میبینید لطفا راهنمایی بفرمایید .
    متشکرم .
صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 13

موضوعات مشابه

  1. پردازنده Cortex-M7 جدید ترین پردازنده ARM
    توسط IRT در انجمن پروسسورهای ARM
    پاسخ: 16
    آخرين نوشته: 2015/03/12, 20:15
  2. هنگ میکرو با دستور input bin یا input
    توسط gmaissam در انجمن میکروکنترلرهای AVR
    پاسخ: 13
    آخرين نوشته: 2014/12/23, 02:28
  3. پاسخ: 0
    آخرين نوشته: 2014/01/10, 01:45
  4. سوال در مورد استفاده از مد چند پردازنده در usart بیت MPCM
    توسط student51 در انجمن میکروکنترلرهای AVR
    پاسخ: 2
    آخرين نوشته: 2013/08/27, 11:49
  5. پاسخ: 9
    آخرين نوشته: 2011/11/18, 21:29

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •