اطلاعیه

Collapse
No announcement yet.

نمونه کدهایی برای XMEGA

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پاسخ : نمونه کدهایی برای XMEGA

    نوشته اصلی توسط soleares
    سلام خدمت استاد کی نژاد،من در سایت شما مشغول بررسی نمونه کد شما برای ایجاد ملودی بودم،و چند سوال برام پیش اومد:
    آیا در آرایه ی notes خانه های زوج آرایه نمایانگر فرکانس نت(که یکی از خانه های آرایه ی TCC1_values است) و خانه های فرد بیانگر طول زمان اجرای همان نت است؟... در واقع منظورم این است که الگوریتم برنامه را درست متوجه شدم؟
    سوال 2: دلیل اینکه تولید موج رو در نت si1 قطع میکنید چی هست؟
    با تشکر.
    برداشت شما از عملکرد برنامه تقریبا درست است. به این ترتیب که عناصر آرایه با اندیس زوج (با فرض شمارش از صفر) نشان دهنده اندیس یا index آرایه TCC1_values هستند که در این آرایه هم مقدار مناسب برای قرار گرفتن در تایمر به منظور ایجاد فرکانس مورد نظر، تعیین می شود. در عناصر با اندیس فرد هم طول نت تعیین می شود. در مورد si1 هم احتمالا منظور شما sil است که دلیل وجود آن لزوم ایجاد سکوت در برخی بخش های تولید ملودی است. به این معنی که در بعضی از زمان ها لازم است هیچ صدایی بخش نشود و به این منظور در جدول از عبارت sil استفاده شده است.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      پاسخ : نمونه کدهایی برای XMEGA

      با سلام

      مثالی طرح شد که در آن واحدهایی چون ADC - DMA - TIMER درگیر شوند. بدین صورت که خروجی ADCA CH0 از طریق واحد DMA CH0 به رجیستر TCC0_CCA منتقل شود و شکل موج PWM 1 را روی پایه C0 ایجاد کند و همزمان خروجی ADCB CH0 از طریق واحد DMA CH1 به رجیسترهای TCD0_CCA منتقل شود و شکل موج PWM 2 را روی پایه D0 ایجاد کند .

      برای اینکه شکل موج PWM در بازه صفر تا ماکزیمم باشد و از آنجاییکه فقط در مد Signed Mode است که خروجی ADC ، مقدار 0 را نیز پوشش میدهد لذا هر دو ADC را در مد Signed Mode Differential Input قرار می دهیم.

      پایه Negative Input واحدهای ADC را به زمین متصل و پایه Positive Input را به هر کدام از ورودی ها (پتانسیومتر) متصل میکنیم تا توسط اختلاف گیری ، مقادیر 0 تا 2047 حاصل شود.

      در محدوده 0 ، خروجی ADC (بدلیل نویز پذیری) ممکن است مقداری منفی شود و این مقدار منفی، تولید PWM را با مشکل مواجه میکند ، لذا Compare Result واحدهای ADC را نیز فعال میکنیم و آن را بروی Below Threshold تنظیم میکنیم که اگر احیانا در اختلاف گیری پایه های NEG و POS ، عدد منفی حاصل شد تابع ISR واحد ADC مربوطه اجرا شود و PWM در وضیعت صفر یا MIN قرار گیرد ولی اگر مقدار اختلاف عددی مثبت بود ، که هیچ Interrupt ایجاد نشود و برنامه روال عادی خود را انجام دهد.

      پی نوشت:

      1 . برای درک بهتر و نحوه بکار گیری رجیسترها ،برنامه بدون استفاده از درایورهای اتمل نوشته شد بنحوی که اجرای برنامه هیچگونه بار پردازشی روی CPU ندارد.
      2 . برنامه در محیط Avr Studio 5.1 کامپایل پروگرام و تست شد.
      [hr]

      */

      XMEGA64A3__ADC_DMA_PWM.c*
      Author: Chavosh*

      /*

      <include <avr/io.h#
      <include <avr/interrupt.h#

      (int main(void
      }

      ;SREG = 0X80
      ;(PMIC_CTRL = PMIC_MEDLVLEN_bm|!(PMIC_IVSEL_bm

      ;CCP = CCP_IOREG_gc
      ;OSC_CTRL = OSC_RC32MEN_bm
      ;((while(!(OSC_STATUS & OSC_RC32MRDY_bm
      ;CLK_CTRL = 0x01

      ;PORTC_DIR = PIN0_bm
      ;TCC0_PER=2047
      ;TCC0_CTRLB=TC_WGMODE_SS_gc|TC0_CCAEN_bm
      ;TCC0_CTRLA=TC_CLKSEL_DIV2_gc

      ;PORTD_DIR = PIN0_bm
      ;TCD0_PER=2047
      ;TCD0_CTRLB=TC_WGMODE_SS_gc|TC0_CCAEN_bm
      ;TCD0_CTRLA=TC_CLKSEL_DIV2_gc

      ;ADCA_CTRLB = ADC_RESOLUTION_12BIT_gc|ADC_CONMODE_bm|ADC_FREERUN _bm
      ;ADCA_EVCTRL=ADC_SWEEP_0_gc
      ;ADCA_REFCTRL= ADC_REFSEL_VCC_gc|ADC_BANDGAP_bm
      ;ADCA_PRESCALER = ADC_PRESCALER_DIV16_gc
      ;ADCA_CH0_MUXCTRL = ADC_CH_MUXPOS_PIN1_gc|ADC_CH_MUXNEG_PIN2_gc
      ;ADCA_CH0_INTCTRL=ADC_CH_INTMODE_BELOW_gc|ADC_CH_I NTLVL_MED_gc
      ;ADCA_CMP=0
      ;ADCA_CTRLA= ADC_ENABLE_bm|ADC_DMASEL_CH01_gc
      ;ADCA_CH0_CTRL = ADC_CH_START_bm|ADC_CH_INPUTMODE_DIFF_gc


      ;ADCB_CTRLB = ADC_RESOLUTION_12BIT_gc|ADC_CONMODE_bm|ADC_FREERUN _bm
      ;ADCB_EVCTRL=ADC_SWEEP_0_gc
      ;ADCB_REFCTRL = ADC_REFSEL_VCC_gc|ADC_BANDGAP_bm
      ;ADCB_PRESCALER = ADC_PRESCALER_DIV16_gc
      ;ADCB_CH0_MUXCTRL = ADC_CH_MUXPOS_PIN1_gc|ADC_CH_MUXNEG_PIN2_gc
      ;ADCB_CH0_INTCTRL=ADC_CH_INTMODE_BELOW_gc|ADC_CH_I NTLVL_MED_gc
      ;ADCB_CMP=0
      ;ADCB_CTRLA= ADC_ENABLE_bm|ADC_DMASEL_CH01_gc
      ;ADCB_CH0_CTRL= ADC_CH_START_bm|ADC_CH_INPUTMODE_DIFF_gc

      ;DMA_CTRL=DMA_ENABLE_bm
      ;DMA_CH0_ADDRCTRL=DMA_CH_SRCRELOAD_BURST_gc|DMA_CH _SRCDIR_INC_gc|DMA_CH_DESTRELOAD_BURST_gc|DMA_CH_D ESTDIR_INC_gc
      ;DMA_CH0_TRIGSRC=DMA_CH_TRIGSRC_TCC0_CCA_gc
      ;DMA_CH0_TRFCNT = 0
      ;DMA_CH0_SRCADDR0 =(((uint16_t)(&ADCA_CH0_RES))>>0*8)& 0xFF
      ;DMA_CH0_SRCADDR1 =(((uint16_t)(&ADCA_CH0_RES))>>1*8)& 0xFF
      ;DMA_CH0_DESTADDR0 =(((uint16_t)(&TCC0_CCA))>>0*8)&0xFF
      ;DMA_CH0_DESTADDR1 =(((uint16_t)(&TCC0_CCA))>>1*8)&0xFF
      ;DMA_CH0_CTRLA=DMA_CH_SINGLE_bm|DMA_CH_REPEAT_bm|D MA_CH_BURSTLEN_2BYTE_gc|DMA_CH_ENABLE_bm

      ;DMA_CH1_ADDRCTRL=DMA_CH_SRCRELOAD_BURST_gc|DMA_CH _SRCDIR_INC_gc|DMA_CH_DESTRELOAD_BURST_gc|DMA_CH_D ESTDIR_INC_gc
      ;DMA_CH1_TRIGSRC=DMA_CH_TRIGSRC_TCD0_CCA_gc
      ;DMA_CH1_TRFCNT = 0
      ;DMA_CH1_SRCADDR0 =(((uint16_t)(&ADCB_CH0_RES))>>0*8)& 0xFF
      ;DMA_CH1_SRCADDR1 =(((uint16_t)(&ADCB_CH0_RES))>>1*8)& 0xFF
      ;DMA_CH1_DESTADDR0 =(((uint16_t)(&TCD0_CCA))>>0*8)&0xFF
      ;DMA_CH1_DESTADDR1 =(((uint16_t)(&TCD0_CCA))>>1*8)&0xFF
      ;DMA_CH1_CTRLA=DMA_CH_SINGLE_bm|DMA_CH_REPEAT_bm|D MA_CH_BURSTLEN_2BYTE_gc|DMA_CH_ENABLE_bm

      (while(1
      }
      {
      {


      (ISR(ADCA_CH0_vect
      }
      ;TCC0_CCA=0
      {

      (ISR(ADCB_CH0_vect
      }
      ;TCD0_CCA=0
      {

      دیدگاه


        پاسخ : نمونه کدهایی برای XMEGA

        با سلام

        در این نمونه کد واحدهایی چون TIMER , EVENT , ADC , DAC , DMA بکار گرفته شده است.
        مثال به گونه ای طرح شده که خروجی واحد ADCA CH0 درون SRAM داخلی میکرو بافر شود و از داخل SRAM به واحد DACB CH0 انتقال یابد.

        برای نوشتن کد ابتدا توسط TCC0 یک EVENT با پریود 1msec ایجاد میشود. واحد ADCA را از حالت FREE RUN خارج میکنیم و ADCA CH0 را طوری تنظیم میکنیم که به ازای EVENT CH0 ، فقط کانال مورد نظر SWEEP شده و یک نمونه ایجاد شود و زمانیکه نمونه آماده ی انتقال گردید EVENT CH1 ایجاد شود.

        واحد DMA CH0 وظیفه ی انتقال این دیتا به SRAM را خواهد داشت. بطوریکه با ایجاد هر EVENT CH1 ، واحد DMA CH0 شروع به نوشتن نمونه ها از آدرس 0x2000 تا 0X23E8 حافظه SRAM میکند.این عملیات با توجه به تنظیم REPEAT در واحدهای DMA , دوباره مقادیر جدید را از آدرس 0x2000 تا 0X23E8 متناوبا REWRITE میکند.

        در ادامه واحد DMA CH1 را طوری تنظیم میکنیم که زمانی انتقال مقادیر SRAM به DACB CH0 را آغاز کند که SRAM تا مقدار دلخواهی(در اینجا 0x2384) که توسط دستور
        ;((while(!(DMA_CH0_TRFCNT==100 از قبل پر شده باشد. هر دو واحد DMA را با EVENT CH1 تریگ میکنیم تا به ازای ایجاد یک نمونه , یک خانه از SRAM پر و خالی شود.

        پی نوشت:
        کد در محیط AVR STUDIO 5.1 کامپایل و تست شد. مقدار ورودی ADCA CH0 با اختلاف زمانی دلخواه (در اینجا 450=2/ 900=100-1000 ) ،متناوبا در خروجی DACB CH0 تولید میشود.

        [hr]

        */
        XMEGA64A3__ADC_DMA_DAC.c*
        Author: Chavosh*
        /*

        <include <avr/io.h#
        (int main(void
        }

        ;CCP = CCP_IOREG_gc
        ;OSC.CTRL = OSC_RC32MEN_bm
        ;((while(!(OSC_STATUS & OSC_RC32MRDY_bm
        ;CLK_CTRL = 0x01

        ;TCC0_CTRLA=TC_CLKSEL_DIV8_gc
        ;TCC0_PER=3999

        ;ADCA_EVCTRL = ADC_SWEEP_0_gc |ADC_EVSEL_0123_gc |ADC_EVACT_SWEEP_gc
        ;ADCA_CTRLB = ( ADCA_CTRLB & ~( ADC_CONMODE_bm | ADC_FREERUN_bm ))|ADC_RESOLUTION_12BIT_gc
        ;ADCA_REFCTRL = ADC_REFSEL_AREFA_gc
        ;ADCA_PRESCALER = ADC_PRESCALER_DIV16_gc
        ;ADCA_CH0_MUXCTRL = ADC_CH_MUXPOS_PIN1_gc
        ;ADCA_CTRLA=ADC_DMASEL_CH01_gc|ADC_ENABLE_bm
        ;ADCA_CH0_CTRL = ADC_CH_START_bm|ADC_CH_INPUTMODE_SINGLEENDED_gc

        ;DACB_CTRLB=DAC_CHSEL_SINGLE_gc
        ;DACB_CTRLC=0
        ;DACB_CTRLC=DAC_REFSEL_AREFA_gc
        ;DACB_CTRLA=DAC_ENABLE_bm|DAC_CH0EN_bm

        ;EVSYS_CH0MUX=EVSYS_CHMUX_TCC0_OVF_gc
        ;EVSYS_CH1MUX=EVSYS_CHMUX_ADCA_CH0_gc

        ;DMA_CTRL=DMA_ENABLE_bm|DMA_PRIMODE_RR0123_gc
        ;DMA_CH0_ADDRCTRL=DMA_CH_SRCRELOAD_BURST_gc|DMA_CH _SRCDIR_INC_gc|DMA_CH_DESTRELOAD_TRANSACTION_gc|DM A_CH_DESTDIR_INC_gc
        ;DMA_CH0_TRIGSRC=DMA_CH_TRIGSRC_EVSYS_CH1_gc
        ;DMA_CH0_TRFCNT = 1000
        ;DMA_CH0_SRCADDR0 =(((uint16_t)(&ADCA_CH0_RES))>>0*8)& 0XFF
        ;DMA_CH0_SRCADDR1 =(((uint16_t)(&ADCA_CH0_RES))>>1*8)& 0xFF
        ;DMA_CH0_DESTADDR0 =(((uint16_t)0x2000)>>0*8)&0xFF
        ;DMA_CH0_DESTADDR1 =(((uint16_t)0x2000)>>1*8)&0xFF
        ;DMA_CH0_CTRLA=DMA_CH_SINGLE_bm|DMA_CH_REPEAT_bm|D MA_CH_BURSTLEN_2BYTE_gc|DMA_CH_ENABLE_bm

        ;DMA_CH1_ADDRCTRL=DMA_CH_SRCRELOAD_TRANSACTION_gc| DMA_CH_SRCDIR_INC_gc|DMA_CH_DESTRELOAD_BURST_gc|DM A_CH_DESTDIR_INC_gc
        ;DMA_CH1_TRIGSRC=DMA_CH_TRIGSRC_EVSYS_CH1_gc
        ;DMA_CH1_TRFCNT = 1000
        ;DMA_CH1_SRCADDR0 =(((uint16_t)0x2000)>>0*8)&0xFF
        ;DMA_CH1_SRCADDR1 =(((uint16_t)0x2000)>>1*8)&0xFF
        ;DMA_CH1_DESTADDR0 =(((uint16_t)(&DACB_CH0DATA))>>0*8)& 0xFF
        ;DMA_CH1_DESTADDR1 =(((uint16_t)(&DACB_CH0DATA))>>1*8)& 0xFF
        ;DMA_CH1_CTRLA=DMA_CH_SINGLE_bm|DMA_CH_REPEAT_bm|D MA_CH_BURSTLEN_2BYTE_gc

        ;((while(!(DMA_CH0_TRFCNT==100
        ;DMA_CH1_CTRLA|=DMA_CH_ENABLE_bm

        (while(1
        }

        {
        {




        دیدگاه


          پاسخ : نمونه کدهایی برای XMEGA

          باسلام
          در این مثال واحدهای ADC ,TIMER , AWEX , DMA , USART استفاده شده است.

          برنامه بدین گونه است که میکرو MASTER مقادیر ADC CH0 را میخواند و تولید Advanced Waveform Extension نموده و عینا همین شکل موج را از طریق USART به میکرو SLAVE منتقل کرده و این میکرو نیز بر طبق اطلاعات رسیده تولید شکل موج مشابه میکند.

          در میکرو MASTER، واحد DMA CH1 وظیفه ی انتقال مقادیر ADC CH0 به TCC0 و تولید Advanced Waveform را داشته و واحد DMA CH0 وظیفه ی انتقال مقادیر ADC CH0 به USART C0 را خواهد داشت.هر دو واحد DMA زمانی تریگ می شوند که بافرواحد USART C0 خالی شده باشد.

          در میکرو SLAVE به محض پر شدن بافر USART C1 ،واحد DMA تریگ میشود و دیتای دریافتی را برای تولید Advanced Waveform به رجیستر CCA ارسال میکند.

          پی نوشت:
          سعی بر این بوده مثالها به گونه ای طرح شود که فارغ از کد نویسی درون تابع اصلی ، صرفا برروی رجیسترها و قابلیت های XMEGA تمرکز شود.برای مثال در تابع اصلی میتوان بر طبق سخت افزار موجود ، بجای استفاده از ADC بعنوان ورودی ، از KEYPAD ونمایش آن روی LCD استفاده کرد.



          کد میکرو MASTER :


          */
          XMEGA64A3_ADC_AWEX_DMA_USART_MASTER.c*

          Author: Chavosh*
          */

          <include <avr/io.h#

          (int main(void
          }

          ;CCP = CCP_IOREG_gc
          ;OSC_CTRL |= OSC_RC32MEN_bm
          ;((while(!(OSC_STATUS & OSC_RC32MRDY_bm
          ;CLK_CTRL = 0x01

          ;ADCA_CTRLB = ADC_RESOLUTION_8BIT_gc|ADC_FREERUN_bm
          ;ADCA_REFCTRL = ADC_REFSEL_AREFA_gc
          ;ADCA_PRESCALER = ADC_PRESCALER_DIV16_gc
          ;ADCA_EVCTRL=ADC_SWEEP_0_gc
          ;ADCA_CH0_MUXCTRL = ADC_CH_MUXPOS_PIN1_gc
          ;ADCA_CTRLA= ADC_ENABLE_bm|ADC_DMASEL_CH01_gc
          ;ADCA_CH0_CTRL = ADC_CH_START_bm|ADC_CH_INPUTMODE_SINGLEENDED_gc

          ;TCC0_PER=255
          ;TCC0_CTRLB=TC_WGMODE_SS_gc|TC0_CCAEN_bm
          ;TCC0_CTRLA=TC_CLKSEL_DIV8_gc
          ;TCC0_CTRLE=TC0_BYTEM_bm

          ;AWEXC_CTRL=AWEX_DTICCAEN_bm
          ;AWEXC_OUTOVEN=0X03
          ;AWEXC_DTBOTHBUF=10
          ;PORTC_DIRSET=PIN1_bm|PIN0_bm|PIN3_bm

          ;USARTC0_CTRLB=USART_TXEN_bm
          ;USARTC0_CTRLC=USART_CMODE_ASYNCHRONOUS_gc|USART_C HSIZE_8BIT_gc
          ;USARTC0_BAUDCTRLA=5

          ;DMA_CTRL=DMA_PRIMODE_RR0123_gc|DMA_ENABLE_bm
          ;DMA_CH0_ADDRCTRL=DMA_CH_SRCRELOAD_BURST_gc|DMA_CH _SRCDIR_FIXED_gc|DMA_CH_DESTRELOAD_BURST_gc|DMA_CH _DESTDIR_FIXED_gc
          ;DMA_CH0_TRIGSRC=DMA_CH_TRIGSRC_USARTC0_DRE_gc
          ;DMA_CH0_TRFCNT = 0
          ;DMA_CH0_SRCADDR0 =(((uint16_t)(&ADCA_CH0_RES))>>0*8)& 0xFF
          ;DMA_CH0_SRCADDR1 =(((uint16_t)(&ADCA_CH0_RES))>>1*8)& 0xFF
          ;DMA_CH0_DESTADDR0 =(((uint16_t)(&USARTC0_DATA))>>0*8)& 0xFF
          ;DMA_CH0_DESTADDR1 =(((uint16_t)(&USARTC0_DATA))>>1*8)& 0xFF
          ;DMA_CH0_CTRLA=DMA_CH_SINGLE_bm|DMA_CH_REPEAT_bm|D MA_CH_BURSTLEN_1BYTE_gc|DMA_CH_ENABLE_bm

          ;DMA_CH1_ADDRCTRL=DMA_CH_SRCRELOAD_BURST_gc|DMA_CH _SRCDIR_FIXED_gc|DMA_CH_DESTRELOAD_BURST_gc|DMA_CH _DESTDIR_FIXED_gc
          ;DMA_CH1_TRIGSRC=DMA_CH_TRIGSRC_USARTC0_DRE_gc
          ;DMA_CH1_TRFCNT = 0
          ;DMA_CH1_SRCADDR0 =(((uint16_t)(&ADCA_CH0_RES))>>0*8)& 0xFF
          ;DMA_CH1_SRCADDR1 =(((uint16_t)(&ADCA_CH0_RES))>>1*8)& 0xFF
          ;DMA_CH1_DESTADDR0 =(((uint16_t)(&TCC0_CCA))>>0*8)&0xFF
          ;DMA_CH1_DESTADDR1 =(((uint16_t)(&TCC0_CCA))>>1*8)&0xFF
          ;DMA_CH1_CTRLA=DMA_CH_SINGLE_bm|DMA_CH_REPEAT_bm|D MA_CH_BURSTLEN_1BYTE_gc|DMA_CH_ENABLE_bm

          (while(1
          }

          {
          {



          کد میکرو SLAVE :


          */
          XMEGA64A3_ADC_AWEX_DMA_USART_SLAVE.c*

          Author: Chavosh*
          /*

          <include <avr/io.h#

          (int main(void
          }

          ;CCP = CCP_IOREG_gc
          ;OSC_CTRL = OSC_RC32MEN_bm
          ;((while(!(OSC.STATUS & OSC_RC32MRDY_bm
          ;CLK_CTRL = 0x01

          ;TCC0_PER=255
          ;TCC0_CTRLB=TC_WGMODE_SS_gc|TC0_CCAEN_bm
          ;TCC0_CTRLA=TC_CLKSEL_DIV8_gc
          ;TCC0_CTRLE=TC0_BYTEM_bm

          ;AWEXC_CTRL=AWEX_DTICCAEN_bm
          ;AWEXC_OUTOVEN=0X03
          ;PORTC_DIR=PIN1_bm|PIN0_bm
          ;AWEXC_DTBOTHBUF=10

          ;USARTC1_CTRLB=USART_RXEN_bm
          ;USARTC1_CTRLC=USART_CMODE_ASYNCHRONOUS_gc|USART_C HSIZE_8BIT_gc
          ;USARTC1_BAUDCTRLA=5

          ;DMA_CTRL=DMA_ENABLE_bm
          ;DMA_CH0_ADDRCTRL=DMA_CH_SRCRELOAD_BURST_gc|DMA_CH _SRCDIR_FIXED_gc|DMA_CH_DESTRELOAD_BURST_gc|DMA_CH _DESTDIR_FIXED_gc
          ;DMA_CH0_TRIGSRC=DMA_CH_TRIGSRC_USARTC1_RXC_gc
          ;DMA_CH0_TRFCNT = 0
          ;DMA_CH0_SRCADDR0 =(((uint16_t)(&USARTC1_DATA))>>0*8)& 0xFF
          ;DMA_CH0_SRCADDR1 =(((uint16_t)(&USARTC1_DATA))>>1*8)& 0xFF
          ;DMA_CH0_DESTADDR0 =(((uint16_t)(&TCC0_CCA))>>0*8)&0xFF
          ;DMA_CH0_DESTADDR1 =(((uint16_t)(&TCC0_CCA))>>1*8)&0xFF
          ;DMA_CH0_CTRLA=DMA_CH_SINGLE_bm|DMA_CH_REPEAT_bm|D MA_CH_BURSTLEN_1BYTE_gc|DMA_CH_ENABLE_bm

          (while(1
          }

          {
          {



          دیدگاه


            پاسخ : نمونه کدهایی برای XMEGA

            ضمن تشکر از شما برای قرار دادن نمونه کدهای مختلف، با وجود اینکه فرصت نشد که جزئیات عملکرد کدها را بصورت دقیق بررسی کنم، اما به لحاظ نکات آموزشی مواردی در ظاهر کدها به نظر می رسد که به برخی اشاره می کنم:

            1- رجیسترهای اسیلاتور مانند OSC_CTRL در برابر تغییرات محافظت شده نیستند و بنابراین دستور زیر قبل از مقدار دهی به آن لازم نیست:

            کد:
            CCP = CCP_IOREG_gc;


            2- در نمونه کدها در بسیاری از موارد بجای استفاده از اپراتور = از اپراتور =| استفاده شده است. همچنین در مقداردهی به یک رجیستر بجای اینکه در یک مرحله با استفاده از اپراتور = به رجیستر مقدار داده شود، در دو یا چند مرحله با استفاده از =| این عملیات انجام شده که ممکن است در این کاربرد به خصوص مسئله ای را ایجاد نکند، اما بطور کلی تحمیل چند مرحله عملیات Read modify write بجای یک مرحله Write به لحاظ اصولی روش صحیحی نیست. در همین راستا دسترسی به رجیستر PORTC_DIR به شکل زیر انجام شده است:

            کد:
            PORTC_DIR |= PIN0_bm;
            PORTC_DIR |= PIN1_bm;


            که می توانست به این صورت

            کد:
            PORTC_DIR=PIN1_bm|PIN0_bm;


            نوشته شود. یا در صورتی که عدم تغییر سایر بیت ها مد نظر بود، این دستور می توانست به این شکل نوشته شود:

            کد:
            PORTC_DIRSET=PIN1_bm|PIN0_bm;


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

            دیدگاه


              پاسخ : نمونه کدهایی برای XMEGA

              با تشکر از استاد کی نژاد گرامی بخاطر زحمات زیادی که در جهت پیشبرد دانش میکروکنترلر چه در دانشگاه و همچنین فضای اینترنت،با خلوص نیت کشیده اند، کدهای 3 پست اخیر با توجه به موارد اشاره شده ویرایش شد.
              اگر موارد دیگری به ذهن دوستان رسید اشکالات را ذکر بفرمایند تا تصحیح شود.

              دیدگاه


                پاسخ : نمونه کدهایی برای XMEGA

                با سلام و عرض تشکر از جناب کی نژاد بابت زحماتشون.
                لطفا نمونه کد FAT را که برای XMEGA تهیه کرده اید کاملش کنید.
                ممنون

                دیدگاه


                  پاسخ : نمونه کدهایی برای XMEGA

                  نوشته اصلی توسط رضا بابایی
                  کتابخانه LCD کاراکتری:
                  در لینک زیر کتابخانه ای برای کار با LCD2*16 را قرار میدهم. قبلا این ال سی دی رو در مود 8 بیتی راه اندازی کرده بودم اما در مورد مود 4 بیتی با مشکلاتی برخوردم که تصمیم گرفتم تا کتابخانه موجود در avrlib برای lcd کاراکتری رو برای استفاده در IAR تغییر بدهم. نکته جالب توجه این است که کدهای موجود در این کتابخانه را بگونه ای تغییر دادم تا بتوان هر پایه از ال سی دی رو به هر پایه از هر پورت های xmega متصل نمود. در این کتابخانه از پایه RW استفاده و LCD در مود 4 بیتی راه اندازی شده است.
                  http://rapidshare.com/files/454524673/lcd.rar
                  با سلام خدمت همه دوستان و جناب بابایی
                  من کتابخونه ای که شما برای راه اندازی Lcd قرار دادین رو دانلود کردم و به برنامش نگاهی کردم، سوالی که دارم اینه که چطور پورتی که lcd به اون متصل شده رو تعیین میکنید؟ باید در داخل lcd.c پورت رو تعیین کنیم یا اینکه تابع خاصی برای تعیین پورت lcd وجود داره؟ سوال دیگه اینکه استفاده از توابع lcd_puts و lcd_putchar مثل توابع استاندارد کدویژن هست؟
                  با تشکر فراوان از شما

                  دیدگاه


                    پاسخ : نمونه کدهایی برای XMEGA

                    نوشته اصلی توسط طراح
                    نسخه اول کتابخانه LCD کاراکتری به همراه سورسی برای راه اندازی بعضی امکانات آن در این پست ضمیمه می شود. در این مثال به 3 روش مختلف عبارت های Test1 و Test2 و Test3 روی 3 سطر اول از یک LCD کاراکتری 4x20 نمایش داده شده و با توجه به امکان تعریف فونت، به عنوان یک مثال کاراکتر Backslash (که توسط امکان تعریف فونت ساخته شده) در سطر چهارم نمایش داده می شود.
                    با سلام خدمت دوستان
                    من نمی دونم چرا به افرادی مثل من که تازه کار هستم و شاید سوالاتم ابتدایی باشه کم توجه میشه. هر بار سوالی می پرسم بعد از کلی صبر کردن باید یه پست دوباره بزنم و دوباره خواهش کنم که شاید کسی پیدا بشه و کمک کنه. من از دیروز میخوام یه lcd رو با xmega 16 A4 راه اندازی کنم. برنامه آقای بابایی رو تست کردم، موقعی که rebuild رو میزنی یه خطایی میگیره مبنی بر تعریف نشدن عبارت F_CPU ، که من نتونستم برطرف کنم.
                    کتابخانه جناب مهندس کی نژاد برای lcd کاراکتری رو دانلود کردم، میکرو رو به xmega16A4 تغییر دادم، پورتهای lcd رو هم در فایل هدر تغییر دادم. ولی جواب نگرفتم. از جناب مهندس کی نژاد خواهش دارم ما رو هم از تجربه هاشون بی نصیب نذارن، اگه فکر میکنید یه جایی اشتباه کردن، لطفا راهنماییم کنین. (پورت lcd رو در فایل هدر دونه دونه برای خطوط دیتا و RS،RW و E تنظیم کردم)
                    با تشکر فراوان

                    دیدگاه


                      پاسخ : نمونه کدهایی برای XMEGA

                      نوشته اصلی توسط mhm_004
                      با سلام خدمت دوستان
                      من نمی دونم چرا به افرادی مثل من که تازه کار هستم و شاید سوالاتم ابتدایی باشه کم توجه میشه. هر بار سوالی می پرسم بعد از کلی صبر کردن باید یه پست دوباره بزنم و دوباره خواهش کنم که شاید کسی پیدا بشه و کمک کنه. من از دیروز میخوام یه lcd رو با xmega 16 A4 راه اندازی کنم. برنامه آقای بابایی رو تست کردم، موقعی که rebuild رو میزنی یه خطایی میگیره مبنی بر تعریف نشدن عبارت F_CPU ، که من نتونستم برطرف کنم.
                      کتابخانه جناب مهندس کی نژاد برای lcd کاراکتری رو دانلود کردم، میکرو رو به xmega16A4 تغییر دادم، پورتهای lcd رو هم در فایل هدر تغییر دادم. ولی جواب نگرفتم. از جناب مهندس کی نژاد خواهش دارم ما رو هم از تجربه هاشون بی نصیب نذارن، اگه فکر میکنید یه جایی اشتباه کردن، لطفا راهنماییم کنین. (پورت lcd رو در فایل هدر دونه دونه برای خطوط دیتا و RS،RW و E تنظیم کردم)
                      با تشکر فراوان
                      با سلام. شما از همون برنامه ای که آقای کی نژاد قرار داده اند استفاده کنید؛ و در صورت امکان برنامه خود را قرار دهید تا بهتر بشه در موردش بحث کرد. برای کتابخانه قبلی هم اگر بالاتر از اینکلود کردن کتابخانه ها عبارت #define F_CPU 8000000UL رو قرار دهید که 8000000 مقدار فرکانس کاری میکرو میباشد که به صورت پیش فرض این مقدارو گذاشتم.
                      بگذارعشق خاصیت تو باشد نه رابطه خاص تو باکسی
                      موفقیت پیش رفتن است نه به نقطه ی پایان رسیدن
                      نلسون ماندلا

                      دیدگاه


                        پاسخ : نمونه کدهایی برای XMEGA

                        نوشته اصلی توسط mhm_004
                        کتابخانه جناب مهندس کی نژاد برای lcd کاراکتری رو دانلود کردم، میکرو رو به xmega16A4 تغییر دادم، پورتهای lcd رو هم در فایل هدر تغییر دادم. ولی جواب نگرفتم. از جناب مهندس کی نژاد خواهش دارم ما رو هم از تجربه هاشون بی نصیب نذارن، اگه فکر میکنید یه جایی اشتباه کردن، لطفا راهنماییم کنین. (پورت lcd رو در فایل هدر دونه دونه برای خطوط دیتا و RS،RW و E تنظیم کردم)
                        از حالت های ممکن برای جواب نگرفتن، یکی تغییر نادرست در پایه ها در سورس برنامه است که به دلیل عدم وجود نمونه کد نمی توان در مورد آن قضاوت کرد و مورد دیگر قرار دادن پایه های LCD روی پین های jtag است که در این شرایط باید فیوز بیت مربوطه غیر فعال شود.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


                          پاسخ : نمونه کدهایی برای XMEGA

                          نوشته اصلی توسط رضا بابایی
                          با سلام. شما از همون برنامه ای که آقای کی نژاد قرار داده اند استفاده کنید؛ و در صورت امکان برنامه خود را قرار دهید تا بهتر بشه در موردش بحث کرد. برای کتابخانه قبلی هم اگر بالاتر از اینکلود کردن کتابخانه ها عبارت #define F_CPU 8000000UL رو قرار دهید که 8000000 مقدار فرکانس کاری میکرو میباشد که به صورت پیش فرض این مقدارو گذاشتم.
                          با تشکر فراوان از شما دوست عزیز، بالاخره تونستم از کتابخانه شما جواب بگیرم، مشکلی هم که وجود داشت وقتی دنبال کردم به دستور delay در تابع lcd_init می رسید که به جای آن از تابع delay_cycles استفاده کردم و مشکل حل شد. فقط نتونستم اعداد اعشاری بنویسم، میشه در این مورد راهنماییم کنین؟ باز هم سپاسگزارم

                          نوشته اصلی توسط طراح
                          از حالت های ممکن برای جواب نگرفتن، یکی تغییر نادرست در پایه ها در سورس برنامه است که به دلیل عدم وجود نمونه کد نمی توان در مورد آن قضاوت کرد و مورد دیگر قرار دادن پایه های LCD روی پین های jtag است که در این شرایط باید فیوز بیت مربوطه غیر فعال شود.
                          از جناب مهندس کی نژاد هم بسیار ممنونم، فکر کنم مشکل از Jtag باشه که یادآوری کردین، چک میکنم ببینم با غیرفعال کردن Jtag میتونم جواب بگیرم یا نه.
                          بی نهایت ممنونم که در این جمع کمک میکنین تا مشکلات برطرف شود

                          دیدگاه


                            پاسخ : نمونه کدهایی برای XMEGA

                            با عرض سلام خدمت اساتید محترم
                            میتونم بپرسم که avrstudio چه ایرادی داره که شما همگی سعی میکنید از iar استفاده کنید؟

                            دیدگاه


                              پاسخ : نمونه کدهایی برای XMEGA

                              نوشته اصلی توسط mohammad787
                              با عرض سلام خدمت اساتید محترم
                              میتونم بپرسم که avrstudio چه ایرادی داره که شما همگی سعی میکنید از iar استفاده کنید؟
                              http://www.eca.ir/forum2/index.php?topic=41450.0

                              دیدگاه


                                پاسخ : نمونه کدهایی برای XMEGA

                                سلام علیکم و تشکر از همه دوستان
                                سوالی داشتم در رابطه با مقدار عدد اندازه گیری شده سنسور دمای داخلی توسط کارخانه در دمای 85 درجه سلسیوس. این مقدار در بخش calibration signiture قرار دارد. من توسط تابع (read_calibration_byte(PROD_SIGNATURES_START+TEMPS ENSE1_offset و
                                (read_calibration_byte(PROD_SIGNATURES_START+TEMPS ENSE0_offset در کدویژن دو بایت این مقدار را میخوانم. البته آدرس TEMPSENSE0 و TEMPSENSE1 در کدویژن تعریف نشده بود که این مقدار را با توجه به کتابخانه adc_driver.h برابر با عدد 0x2E و 0x2F قرار دادم (و مطمئن نیستم که درست است یا خیر). در دیتاشیت هم چیزی در رابطه با این آدرس ها ندیدم. حال مشکل اینجاست که مقداری که خوانده می شود برای هر دو بایت کالیبراسیون برابر با 0xFF است که فکر می کنم اشتباه است. لطفا در این مورد توضیح دهید. خیلی ممنونم.

                                دیدگاه

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