اطلاعیه

Collapse
No announcement yet.

مشکل خالی بودن نصف بافر در خواندن ADC با DMA??!!

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

    مشکل خالی بودن نصف بافر در خواندن ADC با DMA??!!

    ADC رو فعال کردم . تریگرش رو روی تایمر 4 ایونت 4 قرار دادم . بعد یک بافر 1000 تایی برای خوندن داده ADC با استفاده از DMA برای اون لحاظ کردم. تایمر 4 رو طوری تنظیم کردم که 8 کیلوهرتز ایونت تولید کنه .
    همه چیز به درستی کار میکنه ، هم اینتراپت کامل شدن ترنسمیت و هم اینتراپت نصف ترنسمیت.
    ولی مشکل اینه که همیشه نصف بافر خالیه . یعنی 500 تای اولی مقدار دارند و مقدارشون هم کاملا درسته ولی 500 تای آخری همیشه صفر هستند . تعداد رو هم تغییر میدم باز نصفشون خالیه.

    همه حالت ها رو هم تست کردم . اینتراپت نصف ترنسمیت رو غیر فعال کردم ، تعداد بافر رو هم کم و زیاد کردم . باز نشد . مشکل به نظر شما چیه؟؟
    خواهشن کمک کنین.
    يا حق

    #2
    پاسخ : مشکل خالی بودن نصف بافر در خواندن ADC با DMA??!!

    سلام
    درست متوجه منظورتان نشدم
    ولی اگر بخواهید یک کانال ADC بخوانید که نیازی به DMA نیست. در اینجا DMA موقعی لازم می شود که بخواهید چند کانال ADC بخوانید (مد scan) . یعنی هر با که میکرو چند کانال را خواند وقفه DMA فعال میشه. در اینجا لازم است تنظیمات DMA به درستی انجام شود.
    به این روش من انجام دادم مشکلی نداشته است. مثلا 4 کانال را هر 100 میکرو ثانیه یک بار خوانده به تعداد 100 بار ،در آرایه ای قرار می دهیم
    فيلم آموزشي ميکروکنترلر LPC1768
    فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
    فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
    فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

    دیدگاه


      #3
      پاسخ : مشکل خالی بودن نصف بافر در خواندن ADC با DMA??!!

      با تشکر از پاسخ شما

      ولی من میخام ADC رو با "نرخ دلخواه" خودم نمونه برداری کنم. برای اینکار دو راه وجود داره ، یکی اینکه اینتراپت یک تایمر رو فعال کنم و باهاش هر چند کلاک یکبار بیام و ADC رو بخونم که این کار اصلا مناسب نیست چون هرچی اینتراپت بیشتر بشه لود CPU هم میره بالا.
      راه دوم اینه که ADC که توسط یک تایمر تریگ میشه، رو با استفاده از DMA بخونم ، یعنی یه مقدار از بافر رو در اختیار یک کانال لDMA قرار بدم و هر وقت پر شد برم ازش استفاده کنم. خوب اینکار باعث میشه لود CPU خیلی خیلی بیاد پایین به خاطر همین هنگ کردن میکرو هم احتمالش خیلی میاد پایین.

      در مورد مشکلم هم برطرف شد. من متغییرم رو 32 بیتی در نظر گرفته بودم ، حال اونکه DMA داشت اونها رو 16 بیت ، 16 بیت پر میکرد ، بنا بر این وقتی ترنسمیت کامل میشد. در حقیقت فقط نصف بافر پر میشد. و نصف دیگه همیشه خالی میموند. یعنی با تغییر جنس متغییر مشکلم برطرف شد.

      باز هم از توجهتون بابت سوال بنده ممنونم.
      يا حق

      دیدگاه

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