بخش نهم آموزش ARM : راه اندازی واحدهای جانبی LPC2138

پیش نیاز ها :

کل مباحث دوره آموزشی AVR : از اینجا شروع کنید

شروع دوره های آموزش مجازی ARM

بخش اول آموزش ARM

بخش دوم آموزش ARM

بخش سوم آموزش ARM

بخش چهارم آموزش ARM

بخش پنجم آموزش ARM

بخش ششم آموزش ARM

بخش هفتم آموزش ARM

بخش هشتم آموزش ARM


مقدمه

در این بخش از آموزش ARM به راه اندازی واحدهای جانبی نظیر وقفه ، ADC ، DAC ، تایمر ، PWM ، RTC و Watchdog خواهیم پرداخت. برای هر واحد ابتدا توضیحات عملکرد آن داده می شود ، سپس رجیسترهای هر واحد بررسی شده و توابع مورد نیاز برای راه اندازی آن گفته خواهد شد. مهمترین بخش آموزش ARM7 همین بخش می باشد امیدوارم مورد توجه و استفاده قرار گیرد.

LPC213X


راه اندازی واحد وقفه برداری  ( VIC )

وقفه ( interrupt ) یک سیگنال است که از طرف سخت افزار یا نرم افزار به منظور توجه فوری تولید شده و به پردازنده مرکزی ( CPU ) وارد می شود. با تولید سیگنال وقفه ، CPU باید به سخت افزار یا نرم افزاری که نیاز به توجه فوری دارد پاسخ دهد. بنابراین CPU در اولین فرصت ممکن با ذخیره سازی وضعیت فعلی خود ، به سخت افزار یا نرم افزار مورد نظر سرویس دهی می کند و بعد از سرویس دهی مجددا به وضعیت ذخیره شده قبلی خود باز می گردد. مدیریت و کنترل سیگنال های وقفه یعنی این که سیگنال وقفه از کدام سخت افزار یا نرم افزار آمده است ، اولویت بندی در انجام سیگنال های وقفه چگونه است ، نحوه اتصال سیگنال وقفه چگونه است و … همه بر عهده واحد کنترل وقفه برداری ( VIC ) است. محل قرار گرفتن این واحد درون LPC213X را در شکل زیر مشاهده می کنید.

VIC_LPC2138


معرفی واحد VIC

این واحد Vectored Interrupt Control به معنای واحد کنترل وقفه برداری می باشد. این واحد به تعداد 32 وقفه ورودی را از منابع وقفه دریافت کرده و در دو گروه آن ها را دسته بندی می نماید. دسته اول IRQ ( مخففInterrupt ReQuest ) و دسته دوم FIQ ( مخفف Fast Interrupt reQuest ) نام دارند. سیگنال های وقفه ای که در گروه FIQ قرار می گیرند دارای بالاترین اولویت هستند. دسته IRQ خود به دو بخش برداری (Vectored  ) و غیر برداری (Non-Vectored  ) تقسیم بندی می شود. سیگنال های وقفه ای که در بخش برداری هستند دارای اولویت متوسط و سیگنال های غیر برداری دارای پایین ترین اولویت می باشند. شکل زیر اولویت بندی وقفه ها در میکروکنترلرهای ARM7 را نشان می دهد. همانطور که مشاهده می کنید CPU ابتدا به سیگنال دسته با اولویت بالاتر پاسخ می دهد و سیگنال های وقفه ورودی واحد VIC در هر دسته با یکدیگر OR می شوند.

VIC_LPC2138_

تعریف ISR : مخفف Interrupt Service Routine به معنای روتین (روال) پاسخ دهی به وقفه می باشد. همانطور که از نام آن مشخص است زمانی که یک سیگنال وقفه رخ می دهد کارهایی را که CPU باید برای پاسخ دهی به آن واحد انجام می دهد ISR گویند.

تفاوت وقفه برداری و غیر برداری : برداری در اصطلاح به معنای این است که CPU زمانی که وقفه رخ می دهد از آدرس ISR مورد نظر و منبع وقفه آگاه است اما در وقفه های غیر برداری CPU اطلاعی از آدرس ISR و منبع وقفه ندارد. برای حالت برداری یک جدول ( VIRQ Slot ) درون VIC وجود دارد که کاربر میتواند منبع وقفه و آدرس ISR آن را به دلخواه خود تغییر دهد. به عبارت دیگر تفاوت بین VIRQ ( وقفه برداری ) و NVIRQ ( وقفه غیر برداری ) در این است که برای هر یک از روتین های وقفه برداری میتوان تابع ISR متفاوتی تعریف کرد و اولویت انجام شدن آنها را نیز مشخص کرد اما برای همه وقفه های غیر برداری تنها یک تابع روتین وقفه میتوان تعریف کرد و تعیین اولویت برای آن امکان پذیر نیست و دارای کمترین اولویت در انجام آن می باشد.

نکته : برای دسته وقفه برداری میتوان تعداد 16 وقفه را تعریف کرد. این تعریف توسط کاربر و درون اسلات وقفه برداری ( VIRQ Slot ) صورت می گیرد به طوری که بردار 0 ام ( V0 ) دارای بیشترین اولویت و بردار 15 ام ( V15 ) دارای کمترین اولویت می باشد.

 


منابع وقفه در LPC213X

هر یک از واحدهای جانبی ( Peripherals ) توسط یک خط به واحد VIC متصل هستند که سیگنال وقفه را تولید و به عنوان منبع وقفه برای VIC ارسال می کنند. منابع وقفه ( interrupt sources ) در میکروکنترلرهای سری LPC213X به 22 بلاک ( Block ) وقفه تقسیم بندی می شود که هر بلاک وقفه شامل حداقل یک پرچم ( Flag ) وقفه می باشد که در صفحه 73 از UM10120 تمامی این منابع را میتوان مشاهده کرد.

 


رجیسترهای واحد VIC

در صفحه 65 و 66 از UM10120 جدول و توضیحات کاملی از تمامی رجیسترهای موجود در این واحد را مشاهده می کنید که به صورت جدول شکل زیر خلاصه شده است :

نام رجیسترتوضیحات عملکرد
VICIntSelectFIQ ( 1 ) یا IRQ ( 0 ) بودن وقفه را تعیین می کند
VICIntEnableفعال ( 1 ) یا غیر فعال ( 0 ) کردن وقفه را تعیین می کند
VICVectAddrXآدرس تابع روتین وقفه برداری شماره X را مشخص می کند ( X از 0 تا 15 )
VICVectCntlXمنبع وقفه برداری شماره X را مشخص می کند ( X از 0 تا 15 )
VICVectAddrآدرس برگشت به برنامه اصلی بعد از اتمام وقفه برداری را مشخص می کند
VICDefVectAddrآدرس تابع روتین وقفه غیر برداری را مشخص می کند ( NVIRQ )

 

در شکل زیر جزئیات مربوط به هر یک از بیت های رجیسترهای VICIntSelect و VICIntEnable را مشاهده می کنید. در حالت پیش فرض همه بیت های این رجیسترها صفر هستند. در صورتی که بخواهیم هر یک از وقفه های مربوط به یکی از 22 واحدهای جانبی مشخص شده را FIQ کنیم باید بیت متناظر آن در رجیستر VICIntSelect را 1 نماییم. همچنین برای فعال سازی هر یک از این وقفه ها باید بیت متناظر آن در VICIntEnable را 1 نماییم.

VIC_Int_LPC2138

همچنین با مقدار دهی رجیسترهای VICVectCntlX و VICVectAddrX که در آن X یک عدد صحیح از 0 تا 15 است ، میتوان اسلات مربوط به وقفه برداری دلخواه را به یکی از 22 منبع موجود متصل کرد.برای مثال فرض کنید می خواهیم از وقفه های TIMER0 و SPI0 استفاده کنیم به طوری که وقفه تایمر اولویت بالاتری داشته باشد. بنابراین باید اسلات 0 ام که اولویت بالاتری دارد را به TIMER0 و اسلات 1 ام را به SPI0 تخصیص دهیم. شکل زیر این موضوع را نشان می دهد.

VIC_Slot

در نتیجه برای راه اندازی وقفه در مثال فوق باید خطوط زیر را بنویسیم :

در حالت کلی برای راه اندازی اسلات شماره X و تخصیص آن به منبع وقفه شماره Y و روتین وقفه با نام دلخواه myISR به صورت زیر عمل می کنیم :

روتین وقفه ( ISR ) تابعی است که در هنگام رخ دادن وقفه CPU آن را اجرا می کند. این تابع در ARM7 میتواند نام دلخواهی داشته باشد و حتما در ابتدای آن __IRQ یا __FIQ وجود دارد. همچنین در انتهای تابع روتین وقفه نیز باید آدرس برگشت را صفر کرد. برای مثال :

 


راه اندازی واحد وقفه خارجی ( External Interrupt )

این واحد میتواند وقفه را روی پایه های خارجی میکرو که به صورت EINTx هستند ، فعال نماید. با فعالسازی این واحد ، پایه های EINTx به صورت ورودی تنظیم شده و در زمان رخداد سیگنال وقفه خارجی ، میکرو به تابع روتین وقفه پرش می کند و برنامه نوشته شده در آن را اجرا می کند.  در میکروکنترلرهای سری LPC213X تعداد 4 پایه وقفه خارجی وجود دارد. در شکل زیر واحد وقفه خارجی و پایه های آن را مشاهده می کنید.

External_Interrupt_lpc2138

در جدول زیر وقفه های خارجی و پایه های مربوط به آن را مشاهده می کنید :

EXTINT3EXTINT2EXTINT1EXTINT0Name
P0.9P0.7P0.3P0.1 

Pins

P0.20P0.15P0.14P0.16
P0.30P1.25

وقفه خارجی در یکی از رخدادهای زیر اتفاق می افتد :

  • لبه بالارونده پالس ورودی
  • لبه پایین رونده پالس ورودی
  • سطح منطقی 1 پالس ورودی
  • سطح منطقی 0 پالس ورودی

شکل زیر لبه ها و سطوح مختلف را در یک سیگنال ورودی نمونه نشان می دهد :

interrupt_event


رجیسترهای واحد وقفه خارجی

این رجیسترها تنظیمات واحد وقفه خارجی می باشد که به ترتیب بیت های 0 تا 3 آنها مربوط به EXINT0 تا EXTINT3 می باشد.

 

رجیستر EXTINT ( مخفف External Interrupt Flag Register )

این رجیستر شامل پرچم ( Flag ) برای وقفه های خارجی 0 تا 3 می باشد. به طوری که با فعال بودن حالت وقفه خارجی روی پایه مورد نظر در رجیستر PINSEL ، با 1 کردن بیت مربوط به وقفه مورد نظر در این رجیستر فعال می شود.

 

رجیستر EXTMOD ( مخفف External Interrupt Mode Register )

این رجیستر حالت عملکرد وقفه خارجی را روی EXTINT0..3 مشخص می کند. در صورتی که بیت مربوطه 0 باشد ، وقفه خارجی حساس به سطح ( Level Sensitive ) و در صورت 1 بودن آن حساس به لبه ( Edge Sensitive ) می باشد.

رجیستر EXTPOLAR ( مخفف External Interrupt Polar Register )

این رجیستر بسته به تنظیم رجیستر قبلی پلاریته یا وضعیت رخداد وقفه را مشخص می کند. در صورتی که بیت مربوط به EXTINT0…3 در این رجیستر 0 باشد یعنی وقفه در سطح 0 یا لبه پایین رونده ( بسته به رجیستر قبلی ) می باشد. در صورتی که بیت مربوطه در این رجیستر 1 باشد ، یعنی وقفه در سطح 1 یا لبه بالارونده ( بسته به رجیستر قبل ) می باشد.

 


مراحل راه اندازی وقفه خارجی

  1. تنظیم رجیستر PINSEL
  2. تنظیم رجیسترهای EXTMOD و EXTPOLAR
  3. تنظیمات وقفه خارجی در واحد VIC
  4. فعالسازی عمومی وقفه
  5. نوشتن تابع سابروتین وقفه

 


تابع راه اندازی وقفه خارجی 0  ام روی P0.1

 

مثال عملی شماره 11 : با اتصال یک LED به پورت دلخواه میکروکنترلر LPC2138 و اتصال یک کلید به یکی از پایه های وقفه آن برنامه ای بنویسید که با زدن کلید ، LED در تابع سابروتین وقفه یکبار روشن و خاموش شود.

لینک دانلود سورس مثال عملی شماره 11

 


راه اندازی واحد مبدل آنالوگ به دیجیتال ( ADC )

همانطور که میدانید تمامی عملیات ها در میکروکنترلرها به صورت دیجیتال انجام می شود. برای تبدیل انواع سیگنال های الکترونیکی آنالوگ نظیر سیگنال خروجی بسیاری از سنسورها ، از این واحد استفاده می شود. این واحد ولتاژ ورودی آنالوگ را دریافت کرده و به کد دیجیتال در خروجی تبدیل می کند. خروجی دیجیتال درون یک رجیستر ذخیره می شود.

adc


معرفی واحد مبدل ADC

واحد ADC در میکروکنترلر LPC2138  دو واحد مجزا از هم می باشد که هر یک 8 کانال ورودی مختلف نیز دارند. در نتیجه مجموعا 16 ورودی آنالوگ وجود دارد. در یک زمان فقط یکی از کانال ها میتواند به کد دیجیتال در خروجی تبدیل شود. این واحد دارای مشخصات زیر می باشد :

ولتاژ مرجع ( VREF ) : بین 0 تا VDDA ( حداکثر 3.3v) می تواند باشد.

دقت ( رزولوشن ) : فقط 10 بیت می تواند باشد

حداکثر نرخ نمونه برداری :  4.5Msps ( چهار و نیم میلیون نمونه در ثانیه )

تعداد واحدهای ADC در LPC2138 : دو واحد مجزا از هم

تعداد کانال های ورودی آنالوگ هر واحد : 8 کانال

resolution_adc


پایه های واحد ADC

ValueDescriptionPinName
3.3vAnalog PowerVDDAVDDA
0vAnalog GroundVSSAVSSA
0-3.3vReference VoltageVREFVREF
0-VREFADC0 Channel0P0.27AD0.0
0-VREFADC0 Channel1P0.28AD0.1
0-VREFADC0 Channel2P0.29AD0.2
0-VREFADC0 Channel3P0.30AD0.3
0-VREFADC0 Channel4P0.25AD0.4
0-VREFADC0 Channel5P0.26AD0.5
0-VREFADC0 Channel6P0.4AD0.6
0-VREFADC0 Channel7P0.5AD0.7
0-VREFADC1 Channel0P0.6AD1.0
0-VREFADC1 Channel1P0.8AD1.1
0-VREFADC1 Channel2P0.10AD1.2
0-VREFADC1 Channel3P0.12AD1.3
0-VREFADC1 Channel4P0.13AD1.4
0-VREFADC1 Channel5P0.15AD1.5
0-VREFADC1 Channel6P0.21AD1.6
0-VREFADC1 Channel7P0.22AD1.7

 


رجیسترهای مربوط به واحد ADC

رجیسترهای ADXCR برای کنترل واحد و رجیسترهای ADXDR برای دیتای خروجی دیجیتال هستند که در آن X میتواند 0 یا 1 بسته به شماره واحد ADC مورد استفاده باشد.

 

رجیستر کنترل ADXCR

یک رجیستر 32 بیتی برای تنظیمات واحد ADC شماره X می باشد که در LPC2138 عدد X می تواند 0 یا 1 باشد.

8  بیت اول این رجیستر مشخص کننده شماره کانالی است که می خواهیم ولتاژ ورودی آنالوگ را از آن بخوانیم. هر بیتی که 1 شود ، ورودی آنالوگ متناظر با آن وارد واحد ADC می شود.

8  بیت بعدی آن عددی قرار می گیرد که کلاک واحد ADC ( نرخ نمونه برداری ) را مشخص می کند. این کلاک می تواند حداکثر 4.5Mhz  باشد اما استاندارد نمونه برداری برای کارهای معمولی مورد استفاده بین 100 تا 300 کیلوهرتز می باشد. اگر عددی که در این 8 بیت قرار می گیرد را Y بنامیم ، به صورت زیر مشخص می شود  :

ADC_Resolution_ARM

برای مثال فرض کنید می خواهیم واحد ADC را با نرخ 100KSPS راه اندازی نماییم. در صورتی که از کریستال 12Mhz استفاده نماییم و تقسیم کننده APB روی N=4 باشد. داریم  :

ADC_ARM

زمانی که میکروکنترلر شروع به کار می کند ، واحد ADC در حالت غیر فعال است ( حالت Power Down است). بعد از مشخص کردن شماره کانال و مقدار کلاک واحد باید بیت 21 از رجیستر ADXCR را 1 کرد تا واحد ADC فعال شود.

سه بیت 24 ، 25 و 26 از این رجیستر مربوط به وضعیت تبدیل می باشد. به طوری که

زمانی که این سه بیت به صورت 001 باشد ، تبدیل آغاز می گردد. بنابراین به محض 1 شدن بیت 24 ام عملیات تبدیل آغاز می گردد.

بعد از انجام شدن یک تبدیل ، هر سه بیت باید 0 شود تا تبدیل قطع شده و واحد ADC برای تبدیل بعدی آماده گردد.

 

رجیستر دیتا ADXDR

یک رجیستر 32 بیتی است که نتیجه تبدیل زمانی که بیت 31 ام آن 1 شود ، در بیت های 6 تا 15 آن قرار می گیرد.

بیت 31 ام زمانی که تبدیل به پایان رسیده باشد و نتیجه آن در بیت های 6 تا 15 قرار گرفته باشد ، به طور خودکار 1 می شود. بنابراین باید تا زمانی که این بیت 0 است ، صبر کنیم.

 


توابع راه اندازی ADC

یک تابع تعریف می کنیم که هنگام نیاز به راه اندازی ADC از آن استفاده کنیم ( initialization ) . همچنین یک تابع هم برای خواندن ( read ) از کانال مورد نظر تعریف می کنیم که همانند برنامه نویسی در AVR از آن استفاده نماییم.

 

1- توابع adc0_init و adc1_init :

این دو تابع که به صورت زیر تعریف می شوند ، تنظیمات لازم برای رجیستر ADXCR را اعمال می نمایند و در صورت نیاز از آن ها در برنامه استفاده می گردد. ورودی این توابع عدد Y می باشد.

توضیح برنامه : در خط اول هر تابع ، تنظیمات مربوط به عدد Y و نیز فعالسازی واحد ADC صورت می گیرد و در خط دوم هر تابع ، برنامه کانال های واحد ADC را 0 می کند ( یعنی هیچ کانالی انتخاب نشود )

 

2- توابع read_adc0 و read_adc1 :

این دو تابع که به صورت زیر تعریف می شوند، در ورودی خود عدد مربوط به کانال را دریافت و بعد از اتمام عملیات تبدیل، عدد دیجیتال را به خروجی تابع می فرستد.

 

توضیح برنامه : در ابتدای هر تابع ، بسته به ورودی تابع ، رجیستر PINSEL مربوط به پایه کانال مورد نظر ، روی حالت ADC  قرار می گیرد. سپس کانال مورد نظر و شروع تبدیل به رجیستر ADXCR اعمال می گردد. سپس برنامه منتظر میماند تا تبدیل به اتمام برسد. سپس بیت تبدیل در رجیستر ADXCR برابر 0 می گردد. در نهایت مقدار بیتهای بین 6 تا 15 رجیستر ADXDR به خروجی تابع برمی گردد.

 

مثال عملی شماره 12 : با استفاده از یک LCD کاراکتری 2 در 16 و یک مقاومت متغیر که به میکروکنترلر LPC2138 متصل شده است برنامه ای بنویسید که ولتاژ آنالوگ ایجاد شده توسط مقاومت متغیر را روی LCD نمایش دهد.

لینک دانلود سورس مثال عملی شماره 12

 


راه اندازی واحد مبدل دیجیتال به آنالوگ (DAC )

این واحد عملیاتی برعکس مبدل ADC را انجام می دهد. یعنی یک عدد دیجیتال 10 بیتی به صورت 0 و 1 را درون یک رجیستر دریافت کرده و متناسب با آن عدد ولتاژ آنالوگ بین 0 تا VREF در خروجی تولید می کند. شکل زیر یک مبدل DAC  نمونه 8 بیتی را نشان می دهد. در میکروکنترلرهای ARM7 از جمله LPC2138 این واحد 10 بیتی است.

dac

این واحد در میکروکنترلرهای سری LPC213x دارای ویژگی های زیر است :

  • مبدل دیجیتال به آنالوگ با دقت 10 بیت
  • دارای معماری به صورت آرایه های مقاومتی
  • دارای بافر پایه خروجی
  • دارای حالت کم مصرف
  • قابلیت تنظیم سرعت و توان پایه خروجی

نام رجیستر ورودی دیجیتال : DACR

پایه خروجی آنالوگ : پایه AOUT

ولتاژ مرجع واحد DAC : ولتاژ پایه VREF

تغذیه واحد DAC : پایه های VSSA و VDDA

در شکل زیر پایه خروجی این واحد را مشاهده می کنید. (P0.25)

dac_aout


رجیستر DACR

مخفف Digital to Analog Control Register می باشد. یک رجیستر 32 بیتی است که فقط بیت های زیر از این رجیستر استفاده می شود و بقیه بیت ها بلا استفاده ( RESERVE ) هستند.

بیت های 6 تا 15 : دیتای دیجیتال ورودی ( 10 بیت )

بیت 16 : تنظیم سرعت و توان پایه خروجی

در صورتی که این بیت 0 باشد حداکثر زمان تبدیل 1us و حداکثر جریان پایه خروجی 700mA  می شود. در صورتی که این بیت 1 باشد حداکثر زمان تبدیل 2.5us  و حداکثر جریان پایه خروجی 350ma  می شود.

 


توابع راه اندازی واحد  DAC

برای استفاده از واحد مبدل DAC دو تابع به صورت زیر تعریف می کنیم.

1- تابع dac_init :

با فراخوانی این تابع ، پایه AOUT به عنوان خروجی واحد DAC تنظیم می شود.

2- تابع dac_convert :

با فراخوانی این تابع ، متناسب با مقدار ورودی تابع ولتاژی آنالوگ روی پایهAOUT  تولید می شود. درون این تابع تنظیمات رجیستر DACR انجام می گیرد.

 

مثال عملی شماره 13 : با استفاده از میکروکنترلر LPC2138 و واحد DAC برنامه ای بنویسید که یک موج سینوسی با دامنه 0 تا 3.3 ولت روی پایه Aout ایجاد کند.

لینک دانلود سورس مثال عملی شماره 13

 


راه اندازی واحد تایمر/کانتر Timer/Counter

timer_counter

این واحد در میکروکنترلرهای ARM7 شامل یک شمارنده 32 بیتی است که در دو حالت تایمری و کانتری از آن استفاده می گردد. شکل زیر بلوک دیاگرام ساده شده این واحد را نشان می دهد.

timer_counter_

در میکروکنترلر LPC2138 دو واحد تایمر/کانتر 32 بیتی وجود دارد که در هر یک از آنها یک رجیستر شمارنده اصلی یا TC وجود دارد که از 0 تا 1-232  تغییر کرده و سپس سر ریز می شود. یعنی بعد از پر شدن به حالت اولیه 0 برمیگردد و مجددا به صورت افزایشی ادامه می یابد. یک Prescaler یا پیش تقسیم کننده نیز وجود دارد که کلاک ورودی واحد Timer را تقسیم بر یک عدد صحیح می کند. تعداد 4 رجیستر تطبیق ( Match Register ) وجود دارد که همواره با عدد رجیستر TC مقایسه می شود و در صورت برابر بودن با هر یک از آنها در برنامه وقفه تطبیق اتفاق می افتد.

 

نکته مهم : کلاک ورودی در حالت تایمری از Pclk و در حالت کانتری از پایه CAPx.n تامین می شود.

 

نکته : در میکروکنترلرهای ARM7 به علت استفاده زیاد از موج PWM ، یک واحد مجزا برای تولید PWM در نظر گرفته شده است.

 

نتیجه : از واحد تایمر/کانتر فقط برای تولید زمان خاص ( تایمر ) یا برای شمارش ( کانتر ) استفاده می شود.

در این واحد 4 رجیستر 32 بیتی ( MR0 تا MR3 ) برای مقایسه در نظر گرفته شده است که قابلیت تولید وضعیت های زیر در شرایط تطبیق را دارد :

– ادامه شمارش تایمر و تولید وقفه در زمان تطبیق

– متوقف کردن شمارش تایمر و تولید وقفه اختیاری در زمان تطبیق

– ریست کردن شمارش تایمر و تولید وقفه اختیاری در زمان تطبیق

همچنین تا 4 پایه خروجی ( MATx.n ) برای زمان تطبیق در نظر گرفته شده است که قابلیت های زیر را دارد :

– خروجی در زمان تطبیق Low می شود.

– خروجی در زمان تطبیق High می شود.

– خروجی در زمان تطبیق تغییر وضعیت می دهد ( Toggle ).

– خروجی در زمان تطبیق هیچ تغییری نمی کند.

 


پایه های مربوط به واحد تایمر/کانتر

در میکروکنترلرهای ARM7 چندین خروجی با نام MATX.n وجود دارد که هر یک از آنها به طور مجزا میتواند زمانی که شرایط تطبیق بین رجیستر تایمر و یکی از رجیسترهای مقایسه اتفاق افتاد ، تغییر وضعیت بدهد. همچنین چندین ورودی با نام CAPX.n وجود دارد که هر یک از آنها در زمان رخداد پالس ورودی یک واحد به رجیستر شمارنده اضافه می کند.

Capture3Capture2Capture1Capture0Match3Match2Macth1Match0
P0.29P0.6

P0.16

P0.28

P0.4

P0.27

P0.2

P0.22

P0.30

P0.29P0.16

P0.28

P0.5

P0.27

P0.3

P0.22

Timer0
P0.18

P0.21

P0.17P0.11

P0.19

P0.10P0.18

P0.20

P0.17

P0.19

P0.13P0.12Timer1

 


کلاک واحد تایمر/کانتر

در حالت تایمری کلاک این واحد Pclk و در حالت کانتری کلاک واحد از پایه های CAPX.n تامین می شود که در آن X یکی از اعداد 0 یا 1 و n یکی از اعداد 0,1,2,3 می باشد.

یک پیش تقسیم کننده ( pre Scaler ) درون واحد تایمر/کانتر وجود دارد که میتوان با استفاده از آن کلاک این واحد را قبل از ورود به سیستم تقسیم کرد. این پیش تقسیم کننده به علت 32 بیتی بودن از 0 تا 1-232 می تواند تقسیم کند.

Timer_Clock


رجیسترهای واحد تایمر/کانتر

رجیستر TXTC ( مخفف Timer/Counter ) : رجیستر تایمر شماره X است که عدد لحظه ای تایمر را نشان می دهد.

رجیستر TXTCR ( مخفف Timer Control Register ) : رجیستر تنظیمات تایمر/کانتر شماره X است. بیت 0 ام آن اگر 1 باشد، تایمر فعال Enable می شود و بیت 1 ام آن اگر 1 باشد تایمر Reset می شود.

رجیستر TXPR ( مخفف Prescaler Register ) : این رجیستر مربوط به پیش تقسیم کننده است. در صورتی که 0 باشد، عدد تقسیم برابر 1 است. به طور کلی عددی که میخواهیم تقسیم شود منهای 1 باید در آن قرار گیرد. بنابراین پیش تقسیم کننده به اندازی PR+1 تقسیم می کند.

رجیسترهای TXMR0 تا TXMR3 ( مخفف Match Register ) : رجیسترهای مقایسه می باشند. مقدار رجیستر TXTC هر لحظه با همه این رجیسترها مقایسه می شود و به محض برابر شدن مقدار تایمر میتواند Reset یا Stop شود یا وارد تابع وقفه شود.

رجیستر TXMCR ( مخفف Match Control Register ) : این رجیستر تنظیمات مربوط به Reset ، Stop یا وقفه قرار گرفتن رجیسترهای TXMR0  تا TXMR3 در زمان برابری را مشخص می کند. در این رجیستر برای هر 4 رجیستر TXMR0 تا TXMR3، به تعداد 3 بیت برای تنظیم وقفه ،Reset  یا Stop شدن وجود دارد (مجموعا 12 بیت). بنابراین سه بیت اول این رجیستر برای MR0 ، سه بیت دوم برای MR1، … سه بیت چهارم برای MR3 می باشد.

رجیستر TXEMR ( مخفف External Match Register ) : این رجیستر برای فعالسازی و تنظیمات چگونگی عملکرد پایه های خروجی MATX.n در زمان تطبیق است.

رجیستر TXCTCR ( مخفف Count Control Register ) : دو بیت اول این رجیستر تنظیمات حالت تایمری/کانتری بودن واحد را مشخص می کند. دو بیت بعدی آن تنظیم اینکه کانتر روی کدام پایه عمل می کند.

 


مراحل راه اندازی واحد تایمر/کانتر در حالت تایمری

  1. تنظیم کلاک واحد توسط TxPR
  2. تنظیم.3 در صورت نیاز
  3. تنظیم TxMCR متناسب با مرحله قبل
  4. تنظیم رجیستر PINSEL برای پایه های خروجی n
  5. انجام تنظیمات واحد VIC در صورت نیاز به وقفه تطبیق
  6. ریست کردن رجیستر تایمر به منظور آماده شدن به شروع کار
  7. فعال کردن تایمر توسط رجیستر TxTCR

 


تابع راه اندازی واحد تایمر/کانتر

برای راحتی توابع timer0_init و timer1_init را تعریف کرده و مراحل را اندازی را در این توابع انجام می دهیم. برای راه اندازی LPC2138 به علت وجود دو واحد مجزا تایمر/کانتر دو تابع تعریف می کنیم.

 

مثال عملی شماره 14 : با استفاده از واحد تایمر میکروکنترلر LPC2138 و اتصال یک LCD کاراکتری به آن برنامه ای بنویسید که با هر بار آمدن تعداد PCLK/3 کلاک ، یک واحد به عدد روی LCD اضافه شود.

لینک دانلود سورس مثال عملی شماره 14

 


استفاده از واحد تایمر/کانتر در حالت کانتری

در حالت کانتری، باید به یکی از پایه های CAPX.n به عنوان ورودی کلاک واحد تایمر/کانتر ، پالسی اعمال شود. مراحل راه اندازی در این حالت به صورت زیر است :

  1. تنظیم حالت رخداد پالس ورودی در رجیستر TXCTCR
  2. تنظیم عدد تطبیق در رجیسترهای .3 و حالت تطبیق در TXMCR
  3. تنظیم رجیستر PINSELX برایn مورد نظر
  4. انجام تنظیمات واحد VIC در صورت نیاز به وقفه تطبیق
  5. ریست کردن رجیستر تایمر به منظور آماده شدن به شروع کار
  6. فعال کردن کانتر توسط رجیستر TXTCR

 

نحوه تنظیم رجیستر TXCTCR : برای دو بیت اول ( بیت 0 و 1 ) این رجیستر 4 حالت زیر قابل استفاده است :

00 : حالت کار تایمری ( با لبه بالارونده کلاک PCLK/PRESCALE کار می کند )

01 : حالت کار کانتری با لبه بالا رونده یکی از پایه های مشخص شده در بیت 2 و 3 همین رجیستر

10 : حالت کار کانتری با لبه پایین رونده یکی از پایه های مشخص شده در بیت 2 و 3 همین رجیستر

11 : حالت کار کانتری با هر دو لبه بالا رونده و پایین رونده یکی از پایه های مشخص شده در بیت 2 و 3 همین رجیستر

برای دو بیت دوم ( بیت 2 و 3 ) این رجیستر نیز وقتی دوبیت قبلی 00 نباشد چهار حالت زیر قابل استفاده است :

00 : تنظیم CAP0.0 به عنوان ورودی TIMER0 و CAP1.0 به عنوان ورودی TIMER1

01 : تنظیم CAP0.1 به عنوان ورودی TIMER0 و CAP1.1 به عنوان ورودی TIMER1

10 : تنظیم CAP0.2 به عنوان ورودی TIMER0 و CAP1.2 به عنوان ورودی TIMER1

11 : تنظیم CAP0.3 به عنوان ورودی TIMER0 و CAP1.3 به عنوان ورودی TIMER1

برای مثال در صورتی که کانتر در لبه بالا رونده عمل کند و ورودی CAP0.2 مورد نظر باشد رجیستر TXCTCR روی 1001یعنی 9 تنظیم می شود.

 

تابع راه اندازی کانتر توسط TIMER0 روی CAP0.2

طبق مراحل راه اندازی عمل می کنیم. ابتدا رجیستر PINSEL1 مربوط به پایه P0.28 را تنظیم می کنیم.

 

مثال عملی شماره 15 : با اتصال یک کلید به ورودی واحد تایمر/کانتر میکروکنترلر LPC2138 و یک LCD کاراکتری 2 در 16 برنامه ای بنویسید که با زدن هر بار کلید یک واحد به عدد روی نمایشگر اضافه شود.

لینک دانلود سورس مثال عملی شماره 15

 


راه اندازی واحد  PWM

مدولاسیون عرض پالس ( Pulse Width Modulation ) به معنای تولید یک پالس مربعی متناوب با فرکانس ثابت اما پهنای متغیر می باشد. منظور از پهنای پالس متغیر ، دیوتی سایکل ( Duty Cycle ) است که به صورت فرمول زیر تعریف می شود که در آن TON زمان 1 بودن سیگنال و TOFF زمان 0 بودن سیگنال در یک دوره تناوب می باشد.

pwm_duty_cycleduty_cycle_pwm

هر چه دیوتی سایکل بیشتر باشد سیگنال توان بیشتری را به همراه دارد. بنابراین از این خاصیت میتوان در کاربردهایی نظیر کنترل سرعت موتورها ، کنترل نور لامپ و … استفاده کرد. شکل زیر این موضوع را نشان می دهد.

pwm


معرفی واحد PWM

در میکروکنترلرهای ARM7 این واحد مجزا از واحد تایمر/کانتر است و متشکل از یک شمارنده 32 بیتی و یک پیش تقسیم کننده 32 بیتی و تعدادی رجیستر می باشد. ورودی پیش تقسیم کننده Pclk و خروجی پیش تقسیم کننده کلاک اصلی این واحد می باشد. این واحد در میکروکنترلر LPC2138 دارای 6 کانال خروجی مجزا می باشد که توانایی تولید 6 پالس PWM تک لبه یا 3 پالس PWM دو لبه یا ترکیبی از این دو حالت با فرکانس یکسان اما سیکل وظیفه ( Duty Cycle ) متفاوت را دارد. PWM در ARM7 دارای هفت رجیستر تطابق است (Match Register) که رجیستر صفر یعنی MR0 برای تعیین دوره تناوب سینگال استفاده می شود و بقیه رجیسترها تطابق یعنی MR1 تا MR6 برای تعیین طول پالس استفاده می شود. برخلاف میکروکنترلرهای AVR که دارای 3 حالت کاری مختلف برای تولید پالس PWM بودند، در میکروکنترلرهای ARM7 تنها دو حالت کاری زیر وجود دارد :

  1. PWM تک لبه ( single edge ) : در این حالت یک لبه پایین رونده درون یک سیکل از پالس PWM قرار گرفته است.
  2. PWM دو لبه ( double edge ) : در این حالت هر دو لبه پایین رونده و بالارونده درون یک سیکل از پالس PWM قرار گرفته است.

single_edge-and-double_edge-pwm

نتیجه : حالت PWM دو لبه به علت کنترل بیشتر روی لبه ها، دارای دقت بیشتر و عملکرد قوی تر می باشد.

 


پایه های واحد PWM :

به تعداد 6 پایه (کانال) خروجی واحد PWM است که از PWM1 تا PWM6 نامگذاری شده است.

PWM6PWM5PWM4PWM3PWM2PWM1Name
P0.9P0.21P0.8P0.1P0.7P0.0Pin

 


رجیسترهای واحد PWM

رجیستر PWMTCR ( مخفف PWM Timer Control Register ) : این رجیستر به منظور کنترل عملکرد واحد PWM به کار می رود.تنظیمات بیت های این رجیستر به صورت زیر است :

بیت 0 : زمانی که این بیت برابر 1 قرار گیرد ، پیش تقسیم کننده و شمارنده واحد PWM فعال می شود.

بیت 1 : زمانی که این بیت برابر 1 قرار گیرد ، پیش تقسیم کننده و شمارنده واحد PWM ریست می گردد.

بیت 3 : زمانی که این بیت برابر 1 قرار گیرد ، حالت تطبیق PWM فعال می گردد. ( فعالساز PWM )

 

رجیستر PWMPR ( مخفف PWM Prescale Register ) : رجیستر پیش تقسیم کننده کلاک واحد PWM می باشد که به اندازه PWMPR+1 فرکانس Pclk را تقسیم می کند.
رجیستر PWMPCR ( مخفف PWM Control Register ) : این رجیستر فعال کننده خروجی های واحد PWM و مشخص کننده حالت یک لبه یا دو لبه بودن عملکرد این واحد می باشد. بیت های 2 تا 6 از این رجیستر به ترتیب مربوط به تک لبه یا دو لبه بودن خروجی های PWM2 تا PWM6 می باشد. در صورت 0 بودن هر بیت ، حالت تک لبه و در صورت 1 بودن هر بیت ، حالت دو لبه انتخاب می گردد. همچنین بیت های 9 تا 14 از این رجیستر مربوط به فعال کردن هر یک از خروجی های PWM1 تا PWM6 می باشد. در صورت 1 شدن هر یک از این بیت ها خروجی مربوط به آن در واحد PWM ، فعال می شود.
رجیستر PWMMCR ( مخفف PWM Match Control Register ) : این رجیستر تنظیمات مربوط به Reset ، Stop یا وقفه قرار گرفتن رجیسترهای PWMMR0 تا PWMMR6 در زمان برابری ( تطبیق ) را مشخص می کند. در این رجیستر برای هر 7 رجیستر PWMMR0 تا PWMMR6 ، به تعداد 3 بیت برای تنظیم وقفه ، Reset یا Stop شدن وجود دارد ( مجموعا 21 بیت ). بنابراین سه بیت اول این رجیستر برای MR0 ، سه بیت دوم برای MR1 ، … سه بیت هفتم برای MR6 می باشد.
رجیسترهای PWMMR0 تا PWMMR6 ( مخفف PWM Match Register ) : کلیه این رجیسترها به منظور تطابق هستند به طوری که رجیستر PWMMR0 برای تعیین دوره تناوب سینگال ( فرکانس PWM ) استفاده می شود و بقیه رجیسترها تطابق یعنی PWMMR1 تا PWMMR6 برای تعیین طول پالس ( Duty Cycle ) استفاده می شود.

 

نکته : عرض پالس خروجی کانال های 1 تا 6 ( یعنی مقدار رجیسترهای PWMMR1 تا PWMMR6 ) تنها می تواند عددی بین 0 تا مقدار رجیستر PWMMR0 را به خود بگیرد.

 

محاسبه فرکانس PWM : فرکانس واحد PWM همواره ثابت بوده و توسط رابطه زیر بدست می آید :

PWM_Frequency_lpc213x


مراحل راه اندازی واحد PWM ( تک لبه )

  1. تنظیم رجیستر PINSELX متناسب با کانال خروجی PWM مورد نیاز
  2. تنظیم رجیسترهای PWMPR ( پیش تقسیم کننده ) و PWMMR0 ( تطبیق 0 ) برای فرکانس مورد نیاز
  3. تنظیم رجیستر PWMMRX ( که X بین 1 تا 6 است ) برای داشتن DutyCycle مورد نظر
  4. تنظیم چگونگی عملکرد PWM در هنگام تطبیق ( و فعالسازی وقفه ) در رجیستر PWMMCR
  5. فعالسازی و تنظیمات نهایی PWM در رجیستر PWMTCR و PWMPCR

 


توابع راه اندازی واحد PWM

1- توابع pwmx_init :

در این توابع که x عددی بین 1 تا 6 می باشد ، واحد PWM روی کانال x فعالسازی می گردد. این توابع به شرح زیر می باشند.

 

توضیح برنامه : همانطور که در هر تابع مشاهده می کنید ، تنها تنظیم رجیستر PWMPCR و PINSEL  برای هر کانال PWMX متفاوت است. بقیه توابع مربوط به مراحل راه اندازی گفته شده می باشند.

 

2- توابع pwmx_out :

این توابع رجیسترهای لچ و تطبیق مربوط به هر کانال را مقداردهی می کنند. ورودی این تابع عددی بین 0 تا PWMMR0 می تواند باشد.

 

مثال عملی شماره 16 : با راه اندازی واحد PWM به صورت تک لبه روی یکی از پایه های خروجی PWM در میکروکنترلر LPC2138 برنامه ای بنویسید که PWM متغیر بین 0 تا 100 درصد را ایجاد کند.

لینک دانلود سورس مثال عملی شماره 16

 


راه اندازی واحد RTC

این واحد یک ساعت و تقویم دقیق را درون میکرو راه اندازی می کند که توانایی محاسبه گذشت ثانیه ، دقیقه ، ساعت ، روز ، هفته ، ماه و سال را دارد. همچنین این واحد قابلیت تنظیم آلارم را نیز دارد. برای استفاده از این واحد یک کریستال 32768 هرتز به پایه های RTCX1 و RTCX2 متصل شده و پایه تغذیه واحد RTC یعنی VBAT نیز به ولتاژ 1.8 تا 3.3 ولت متصل می گردد. در شکل زیر نحوه اتصال این واحد و نحوه تولید یک ثانیه دقیق را مشاهده می کنید.

rtc


رجیسترهای واحد RTC

رجیستر کنترل کلاک CCR ( مخفف Clock Control Register )

بیت 0 و 1 این رجیستر تنظیمات اصلی واحد RTC را مشخص می کند. به طوری که با 1 شدن بیت 0 ام آن کلاک واحد RTC فعال می گردد ( ClkEN ) و با 1 شدن بیت 1 ام این رجیستر واحد RTC ریست می شود و تا زمانی که این بیت 1 باشد ریست باقی خواهد ماند.

بیت 4 ام این رجیستر منبع کلاک واحد RTC را مشخص می کند به طوری که اگر این بیت 0 باشد کلاک واحد RTC از کلاک سیستم تامین می شود و اگر این بیت 1 باشد کلاک واحد RTC از کریستال خارجی و اسیلاتور RTC تامین می گردد.

نکته : در این واحد قابلیتی فراهم شده است که با تنظیم رجیسترهای PREINT و PREFRAC بتوان از فرکانس اصلی سیستم برای واحد RTC نیز استفاده کرد. در صورت استفاده از کریستال ساعت خارجی به آن رجیسترها کاری نداریم.

 

رجیسترهای تنظیم ساعت و تاریخ کنونی

نام رجیستروظیفه رجیسترمحدوده مقدار
SECثانیه0-59
MINدقیقه0-59
HOURساعت0-23
DOMروز از ماه1-31
DOWروز از هفته0-6
DOYروز از سال1-365(366)
MONTHماه1-12
YEARسال0-4095

 

رجیسترهای تنظیم آلارم در یک زمان خاص

نام رجیستروظیفه رجیسترمحدوده مقدار
ALSECثانیه0-59
ALMINدقیقه0-59
ALHOURساعت0-23
ALDOMروز از ماه1-31
ALDOWروز از هفته0-6
ALDOYروز از سال1-365(366)
ALMONماه1-12
ALYEARسال0-4095

 

رجیستر فعالسازی وقفه افزایشی CIIR ( مخفف Counter Increment Interrupt Register )

این رجیستر قابلیت تولید وقفه در هر بار افزایش یکی از مقادیر زمانی را جدول زیر را دارد. با یک شدن بیت مربوطه وقفه روی آن فعال می شود و با صفر شدن وقفه غیر فعال می باشد.

 

شماره بیتنام بیتوظیفه بیت
IMSECفعالسازی وقفه در هر ثانیه
1IMMINفعالسازی وقفه در هر دقیقه
2IMHOURفعالسازی وقفه در هر ساعت
3IMDOMفعالسازی وقفه در هر روز از ماه
4IMDOWفعالسازی وقفه در هر روز از هفته
5IMDOYفعالسازی وقفه در هر روز از سال
6IMMONفعالسازی وقفه در هر ماه
7IMYEARفعالسازی وقفه در هر سال

 

 رجیستر تعیین مکان وقفه ILR ( مخفف Interrupt Location Register )

این رجیستر دارای دو بیت برای تنظیمات اینکه کدام بلاک وقفه را تولید می کند ، می باشد. بیت 0 ام این رجیستر زمانی که وقفه افزایشی در رجیستر CIIR رخ دهد برابر 1 می شود. بیت 1 ام این رجیستر زمانی که رجیسترهای آلارم وقفه تولید کنند برابر 1 می شود. نوشتن 1 در هر یک از این بیت ها باعث پاک شدن بیت مورد نظر می شود.

 


مراحل راه اندازی RTC

  1. تنظیم رجیسترهای ILR و CCR
  2. تنظیم وقفه در واحد VIC
  3. تنظیم وقفه در رجیستر CIIR
  4. تنظیم ساعت و تاریخ ( در صورت تنظیم نبودن اولیه )

 


تابع راه اندازی واحد RTC

 

مثال عملی شماره 17 : با راه اندازی واحد RTC در میکروکنترلر LPC2138 و اتصال یک LCD کاراکتری 2 در 16 به آن برنامه ای بنویسید که ساعت و تقویم را روی LCD نمایش دهد.

لینک دانلود سورس مثال عملی شماره 17

 


راه اندازی تایمر سگ نگهبان Whatchdog

سگ نگهبان نام یک نوع تایمر در میکروکنترلرها می باشد که وظیفه ریست کردن میکرو در هنگام هنگ یا توقف برنامه را دارد. در میکروکنترلرهای ARM7 نیز این قابلیت وجود دارد که تایمر سگ نگهبان بین 16.1 میلی ثانیه تا 2.1 ثانیه تنظیم شود. سپس در صورتی که در این مدت تنظیم شده ، تایمر سگ نگهبان ریست نشود ، باعث سر ریز شدن تایمر می شود ، و در نتیجه تایمر به صورت خودکار میکرو را ریست می کند. شکل زیر بلوک دیاگرام این واحد را نشان می دهد.

whatchdog


رجیسترهای واحد Watchdog

رجیستر تنظیم حالت عملکرد WDMOD ( مخفف Watchdog Mode Register )

در صورت 1 بودن بیت 0  ام این رجیستر ، واحد تایمر سگ نگهبان فعال می شود.

در صورت 1 بودن بیت 1 ام این رجیستر ، قابلیت ریست شدن واحد Watchdog فعال می گردد.

بیت 2 ام این رجیستر مربوط به ریست کننده شمارنده تایمر می باشد و در طول برنامه مداوم باید صفر شود.

 

رجیستر تنظیم زمان WDTC ( مخفف Watchdog Timer Constant Register )

درون این رجیستر یک مقدار 32 بیتی قرار می گیرد که زمان سر ریز شدن تایمر سگ نگهبان را تنظیم می کند. این زمان بر حسب ثانیه از رابطه زیر بدست می آید:

whatchdog_time

که در آن  مقدار 32 بیتی رجیستر WDTC است که حداقل میتواند FF باشد.

 

رجیستر اعمال تنظیمات WDFEED ( مخفف Watchdog Feed Register )

هر تغییری که در رجیسترهای واحد سگ نگهبان صورت می گیرید با اعمال دو خط زیر به واحد اعمال می شود :

 

رجیستر مقدار تایمر WDTV ( مخفف Watchdog Timer Value Register )

این رجیستر مقدار کنونی شمارنده تایمر سگ نگهبان را نشان می دهد که فقط میتوان این مقدار 32 بیتی را خواند.

 

مثال عملی شماره 18 : با راه اندازی واحد Watchdog در میکروکنترلر LPC2138 و اتصال یک LCD کاراکتری 2 در 16 به آن برنامه ای بنویسید که عددی روی LCD شمارش شده و در حین شمارش توسط واحد سگ نگهبان ریست شود.

لینک دانلود سورس مثال عملی شماره 18

 



برای ادامه آموزش ARM روی تصویر زیر کلیک کنید.

next-image


در صورتی که این مطلب مورد پسندتان بود لایک و اشتراک گذاری فراموش نشود

این مطلب را با دوستانتان به اشتراگ بگذارید

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

15 − 14 =