اطلاعیه

Collapse
No announcement yet.

DMA controller

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

    #16
    پاسخ : DMA controller

    خوب با خوندن منوال متوجه شدم باید حالت تکرار پذیری رو فعال کنم
    با فعال کردن اون در هر بار دریافت اطلاعات و اتمام اون سخت افزار آماده دریافت بلوک اطلاعات بعدی میشه :applause:
    حالا مشکل بعدی
    مشکل اینجاست که از اونجایی که dma یک واحد real time محسوب میشه بنابر این مقدار مثلا4000 رو نمیتونم در عرض یک لحظه و اونم با مولتی متر :eek: ببینم
    نتیجه اینکه سرعت انتقال رو بردم (هر 3 میلی ثانیه دریافت عدد 4000 ) بنابراین باید کوچکترین اثر رو در پایه dac میدیدم که ندیدم :eek:
    حتی یک دهم هم تغیر نکرد
    حتی ولتاژش از حالت عادی کمتر هم شد :eek:
    آیا کلا دیتا برای تبدیل به این بلوک میرسه یا مشکل در سنجش ولتاژه؟؟ :redface:

    دیدگاه


      #17
      پاسخ : DMA controller

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

      دیدگاه


        #18
        پاسخ : DMA controller

        با تشکر از توجه شما
        توضیح بیشتر اینکه
        طرح ازین قرار است که سیگنال آنالوگی توسط ادواتی تبدیل به دیجیتال میشود که بنده به این سیگنال ها و تبدیلات آن دسترسی ندارم
        تا آنجایی که مقادیر حاصل از این تبدیلات به واسطه یوزارت به بنده تحویل داده میشود
        یعنی ابتدای کار بنده با ورودی دیتایی است که از پورت یوزارت دریافت میکنم و میخواهم به واسطه dma آن را در خروجی dac ببینم
        با نمونه کد قبلی کار را شروع کردم
        کار تاجایی پیش رفته که با دریافت داده در یوزارت ، پرچم مربوط dmaیک میشود و این به این معنی است که با ورود داده از یوزارت عمل تریگر انجام شده است
        اما در قسمت dac هیچ گونه اثری از مقادیر انتقال داده شده وجود ندارد
        حالا سوال در مورد این مشکل است
        با توجه به تنظیمات کد مربوطه آیا اشکالی در کد دیده میشود؟
        کد:
        $regfile= "xm128a4udef.dat".
        $crystal= 14745600
        $hwstack = 512
        $swstack = 512
        $framesize = 512
        
        
        Config Osc = Enabled , Pllosc = enabled , Extosc = Enabled , Range = 12mhz_16mhz , Startup = Xtal_16kclk ,PLLSOURCE=EXTCLOCK , pllmul=1
        
        
        config DACb = enabled ,Io0 = Enabled ,Io1 = disabled ,INTERNAL_OUTPUT=disabled , Channel =single , Reference = AVCC , Interval = 1 , Refresh = 16
        
        Config Com4 = 4800 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
        Open "COM4:" For Binary As #4
        Do
        Loop Until Osc_status.3 = 1
        Set Osc_ctrl.4
        
        Config Sysclock = pll , Prescalea = 1 , Prescalebc = 1_1
        
        Config Priority = Static , Vector = Application , Lo = Enabled    'Interrupts
        
        On Dma_ch3 Dma_ch3_int
        
        config DMA=enabled , DOUBLEBUF = disabled ,Cpm = Ch0123
        
        config dmach3=enabled , burstlen = 8 , CHANRPT=enabled , tci = lo , eil = off , Singleshot = enabled, Sar = Burst , _
         Sam = FIXED , Dar = Transaction , Dam = Fixed , trigger = &h6e , btc = 64 , repeat = 0 , sadr=Varptr(usartd1_data) , dadr =Varptr(dacb_ch0data)
        
        enable interrupts 
        do 
        loop
        
        Dma_ch3_int:
        If Dma_intflags.3 = 1 Then
          Set Dma_intflags.3
          set porte.0
          waitus 100
          reset porte.0
        End If
        return

        دیدگاه


          #19
          پاسخ : DMA controller

          در کد شما موارد مختلفی دیده می شود که بررسی و موشکافی کامل آن نیاز به چند ده خط توضیح دارد. به صورت بسیار خلاصه به دلیل 16 بیتی بودن رجیستر Data در DAC و اگر هدف نوشتن در بخش های Low و High باشد، باید از طریق usart دو بایت متوالی ارسال و در این دو رجیستر نوشته شود. اگر هم هدف استفاده از DAC بصورت 8 بیتی و ارسال یک بایت باشد، باید DAC بصورت Left adjust و آدرس مقصد هم روی بایت بالا تنظیم شود. در هر یک از این دو حالت Burst به ترتیب باید 2 و 1 بایت باشد و اضافه کردن به آدرس مقصد در حالت دو بایتی باید فعال شود. مسئله مهم دیگر این است که در سری AU اصولا رجیستر TIMCTRL برای DAC وجود ندارد و بنابراین تعیین Refresh در تنظیمات DAC موضوعیتی ندارد. در حالی که در کد چنین بخشی وجود دارد. یکسری موارد دیگر هم وجود دارد که به دلیل کمبود وقت به آن اشاره نمی کنم. توصیه من به شما این است که بعد از مطالعه دقیق بخش DMA کد خود را با C بنویسید تا امکان بررسی جزئیات رجیسترها و تصحیح موارد لازم بیشتر فراهم باشد.
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


            #20
            dma

            سلام
            من میخوام 1000 تا داده 8 بیتی را که روی یک پورت قرار میگیرند با سرعت بالا در رم میکرو ذخیره کنم.
            اگر از dma استفاده کنم حداکثر با چه فرکانسی میتوانم داذه هارا از پورت بخوانم و ذخیره کنم؟
            با تشکر

            دیدگاه


              #21
              پاسخ : dma

              طبق توضیحات منوال (Memories -> Memory Timing) برای DMA در حالت Burst دیتای جدید در هر سیکل کلاک در دسترس هست. اما برای اینکه داده ها از دست نرود باید با استفاده از event system روی یک پین فرمان خواندن رو به DMA بدهید که 2 سیکل کلاک طول می کشد و همچنین اولویت CPU برای استفاده از باس دیتا بیشتر از DMA هست و ممکن هست تاثیرگذار باشد که به نحوه مدیریت و برنامه نویسی شما بستگی دارد.
              گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

              دیدگاه

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