آموزش جامع میکروکنترلر STM8S
میکروکنترلر STM8S محصول 8 بیتی شرکت ST هست که در شکل زیر میتوان مدلهای مختلف از محصولات این شرکت را با یکدیگر مقایسه کرد.
از مشخصات قابلتوجه این میکروکنترلرها میتوان به موارد زیر اشاره کرد:
- قیمت ارزانتر نسبت به میکروکنترلرهای مشابه
- ساختهشده توسط تکنولوژی 130 نانومتری
- up to 20 MIPS at 24 MHz
- 10 bit ADC
- SWIM debuge module
- Small size package
- Voltage supply 2.95 V ~ 5.5 V
- …
میکروکنترلرهای STM8S دارای چهار گروه مختلف هست:
- The STM8S003/005/007 Value line is the entry-level series with a basic feature set.
- The STM8S103/105 Access line offers more features and a larger variety of packages.
- The STM8S207/208 Performance line features a full set of peripherals and provides performance for medium- to higher-end applications.
- The STM8S Application specific line provides more analog features and dedicated firmware solutions.
در این مقاله آموزشی سعی شده است از بیان مطالب اضافی خودداری شود و بیشتر بر روی مسائل عملی و راهاندازی میکروکنترلر تمرکز شود.
سه کامپایلر برای این میکروکنترلر وجود دارد:
- ST Visual Develop (STVD) – STMicroelectronics
- IAR-EWSTM8 – STMicroelectronics
- Raisonance-RIDE – STMicroelectronics
در این آموزش از کامپایلر IAR و میکروکنترلر STM8S003K3 استفادهشده است. مطالب ارائهشده بهصورت پایهای بوده که شما میتوانید از هر میکروکنترلر دیگری نیز استفاده کنید.
مطالب ارائهشده در این مقاله آموزشی به شرح زیر است:
- آشنایی با محیط کامپایلر IAR و ایجاد پروژه جدید
- توضیحات مختصر درباره موارد لازم برای راهاندازی
- نحوه پروگرام کردن میکروکنترلر
- راهاندازی I/O
- راهاندازی lcd کاراکتری
- راهاندازی watch dog timer
- راهاندازی وقفه
- راهاندازی تایمر
- راهاندازی ADC
آشنایی با محیط کامپایلر IAR و ایجاد پروژه جدید:
در اولین قدم، میبایست یک پروژه جدید تعریف کنید. برای این کار شما میتوانید یک پروژه را خودتان ساخته و یا از یک پروژه template استفاده نمایید. در صورت تمایل به استفاده از پروژه tempalte و کتابخانه، میتوانید آن را از آدرس زیر دانلود کنید.
http://uplod.ir/3zyunmtxs9h3/STM8S_StdPeriph_Lib2015JAN16.rar.htm
یا
https://www.4shared.com/rar/vFrHtE24ce/STM8S_StdPeriph_Lib2015JAN16.html
بعد از نصب نرمافزار و باز کردن آن، با محیط زیر روبرو میشوید.
برای ساخت پروژه مطابق شکل از منوی project گزینه Create New Project را انتخاب نمایید.
در قسمت بعد زبان برنامهنویسی را انتخاب کرده و کلید Ok را فشار دهید.
در این قسمت مسیری برای save کردن پروژه انتخاب نموده و گزینه save را انتخاب کنید.
شما باید تمامی فایلها و workspace را نیز save کنید. برای این کار از منوی file گزینه save All
را انتخاب نمایید. و تمامی فایلها و workspace را save نمایید. در ادامه برای انتخاب نوع میکروکنترلر و تنظیمات پروژه از منوی project گزینه Options را انتخاب کنید.
از قسمت General option و سربرگ Target در قسمت Device میکروکنترلر موردنظر خود را انتخاب نمایید.
همچنین از سربرگ Stack/Heap میتوانید فضای مربوط به حافظه پشته مقداردهی نمایید.
در قسمت c/c++ compiler و از سربرگ preprocessor، درصورتیکه از فایل و هدر فایل غیر از هدرفایلهای کامپایلر استفاده میکنید مسیر آن را معرفی نمایید. شما اگر از پروژههای template استفاده کنید در این قسمت میتوانید مسیرهای معرفیشده را مشاهده کنید.
برای ساخت فایل hex باید در قسمت Output Converter و سربرگ Output تیک Generate dditional را زده و در قسمت Output format گزینه intel extended را انتخاب نمایید.
همچنین در workspace خود میتوانید گزینه Debuge و یا Release را انتخاب نمایید.
بعد از ساخت پروژه و نوشتن کد موردنظر، نوبت به کامپایل کردن برنامه میرسد. شما برای این کار میتوانید از گزینه compile یا make در نرمافزار خود مطابق شکل زیر و یا از کلیدهای میانبر F7 و یا Ctrl+F7 استفاده نمایید.
برای تست کامپایلر و اطمینان پیدا کردن از درستی نصب نرمافزار کدهای زیر را وارد فایل main.c پروژه خود کرده و گزینه کامپایل را بزید. در قسمتهای بعد در مورد کدهای واردشده توضیح داده میشود.
#include <iostm8s003f3.h> void delay_ms(unsigned long int n) { unsigned long int x=0; unsigned long fCPU=2000000; // HSI RC =16 MHz ----- HSIDIV=8 ------CPUDIV=1 fCPU=16 / 8 / 1 Mhz x=fCPU/1000; x=x/50; n=n*x; while (n-- > 0); } //main entry point int main( void ) { CLK_ICKR=1; // High-speed internal RC on = 16 Mhz CLK_CKDIVR = 24; //fHSI RC output/8 & fCPU=fMASTER/1 PD_ODR = 0; //Turn off all pins PD_DDR_DDR3 = 1; //PortD, Bit 3 is output (PD3 - Data Direction Register) PD_CR1_C13 = 1; //PortD, Control Register 1, Bit 3 (PD3) set to Push-Pull PD_CR2_C23 = 1; //PortD, Control Register 2, Bit 3 (PD3) Output speed up to 10 MHz while (1) { //Turn on and off the output and then delay PD_ODR_bit.ODR3 = !PD_ODR_bit.ODR3; delay_ms(500); } }
درصورتیکه مراحل ساخت پروژه را بهدرستی انجام داده باشید و برنامه نوشتهشده نیز مشکلی نداشته باشد، بعد از کامپایل برنامه، در قسمت Messages باید مطابق شکل هیچگونه error و warning وجود نداشته و همچنین فایل hex درون پوشه پروژه موجود باشد.
اکنون ساخت پروژه و تنظیمات مربوط به آن به پایان رسیده و در صورت نبود مشکل به مرحله بعد میرویم.
توضیحاتی مختصر و موارد لازم برای راهاندازی:
در این آموزش کلیه مثالها توسط برد و پروگرامر ST-LINK موجود در شکل راهاندازی شده است. شما برای راهاندازی و کار با میکروکنترلرهای STM8S باید به چندین مسئله مهم توجه کنید.
- تغذیه میکروکنترلر
- پایه ریست
- Clock
پایه NRST میکروکنترلر را توسط یک مقاومت بین 1K-10K اهم به تغذیه VCC متصل نمایید. این میکروکنترلر دارای یک رگولاتور داخلی بوده که نیاز به یک خازن خارجی دارد.
همچنین برای پروگرام کردن میکروکنترلر توسط پروتکل SWIM میبایست پایههای موردنظر را به پروگرامر، همانند شماتیک، متصل نمایید.
در تمامی مثالها از اسیلاتور داخلی 16Mhz استفادهشده است؛ که باید در ابتدای برنامه توسط رجیسترها تنظیم شود.
پروگرام کردن:
شما برای پروگرام کردن میتوانید از نرمافزار IAR و یا از نرمافزار ارائهشده توسط خود شرکت ST استفاده نمایید. توسط لینک زیر میتوانید این نرمافزار را دانلود و نصب کنید. در هنگام نصب نرمافزار ST Visual Developl نرمافزار ST Visual Programmer نیز نصب میشود.
http://link.eca.ir/1260
در ابتدا سختافزار خود را توسط شماتیک زیر به پروگرامر متصل کرده و سپس پروگرامر را به کامپیوتر متصل نمایید و منتظر بمانید تا درایور پروگرامر نصب شود.
بعد از اجرای نرمافزار ST Visual Programmer با صفحه زیر روبرو میشوید. از منوی configure گزینه Configure ST Visual Programmer را انتخاب نمایید.
در این قسمت با انتخاب سختافزار مورداستفاده، پورت آن، پروتکل پروگرام کردن و میکروکنترلر موردنظر به قسمت بعد بروید.
برای پروگرام کردن میکرو در ابتدا باید فایل hex خود را از منوی file-open انتخاب و به نرمافزار معرفی نمایید.
بعد از انتخاب فایل hex با کلیک بر روی گزینه Programm—current tab و یا از طریق گزینه مشخصشده در شکل میتوانید میکروکنترلر خود را پروگرام کنید و در قسمت message میتوانید وضعیت اتصال و پروگرام شدن میکروکنترلر را مشاهده نمایید.
با انتخاب گزینه option byte میتوانید به قسمت پیکربندی مربوط به سختافزار میکروکنترلر دست پیدا کنید.
مسائلی از قبیل read protection Watchdog timer, oscillator و دیگر موارد را میتوانید پیکربندی نمایید.
راهاندازی I/O
برای کار با پایهها بهصورت ورودی و یا خروجی دیجیتال، 5 رجیستر وجود دارد که هر یک بهصورت خلاصه و کاربردی توضیح داده میشود. برای توضیحات تکمیلی میتوانید به datasheet مراجعه کنید.
GPIO registers
Port x data direction register (Px_DDR)
Port x control register 1 (Px_CR1)
Port x control register 2 (Px_CR2)
Port x output data register (Px_ODR)
Port x pin input register (Px_IDR)
- Port x data direction register (Px_DDR)
توسط این رجیستر میتوانید ورودی یا خروجی بودن پین موردنظر را مشخص کنید. اگر درون این رجیستر مقدار یک قرار گیرد پین متناظر با بیت رجیستر بهعنوان خروجی و اگر مقدار صفر قرار گیرد بهصورت ورودی پیکربندی خواهد شد.
- Port x control register 1 Px_CR1
اگر پین موردنظر بهصورت ورودی تعریفشده باشد، میتوان توسط این رجیستر مقاومت pullup آن را فعال یا غیرفعال کرد و اگر بهصورت خروجی تعریفشده باشد، توسط این رجیستر میتوان یکی از دو حالت open drain یا Push-pull برای خروجی انتخاب کرد که میتوانید ساختار آن را در blocK diagram قسمت GPIO ببینید.
- Port x control register 2 Px_CR2
عملکرد این رجیستر همانند رجیستر Px_CR1 تابع ورودی یا خروجی بودن پین موردنظر هست. اگر این پین بهصورت ورودی باشد میتوانید توسط این رجیستر، وقفه خارجی آن را فعال یا غیرفعال کنید و اگر بهصورت خروجی باشد میتوانید mode fast یا مد slow را انتخاب نمایید.
- Port x output data register Px_ODR
اگر پین را بهصورت خروجی تعریف کرده باشید میتوانید توسط این رجیستر مقدار خروجی را تعیین کنید.
- Port x pin input register (Px_IDR)
اگر پین را بهصورت وردی تعریف کرده باشید میتوانید وضعیت وردی را توسط این رجیستر بخوانید. همانطور که در شکل زیر مشاهده مینمایید این رجیستر فقط قابلخواندن هست.
در زیر میتوانید خلاصهای از وضعیت رجیسترها را مشاهده نمایید.
مثال شماره یک:
میخواهیم وضعیت PIN3 از PORTD را در حالت mode fast بهصورت خروجی قرار داده و هر یک ثانیه یکبار چشمک بزند. از اسیلاتور داخلی Mhz16 بهعنوان منبع کلاک میکروکنترلر استفاده نمایید.
#include <iostm8s003f3.h> void delay_ms(unsigned long int n) { unsigned long int x=0; unsigned long fCPU=2000000; // HSI RC =16 MHz ----- HSIDIV=8 ------CPUDIV=1 fCPU=16 / 8 / 1 Mhz x=fCPU/1000; x=x/50; n=n*x; while (n-- > 0); } //main entry point int main( void ) { CLK_ICKR=1; // High-speed internal RC on = 16 Mhz CLK_CKDIVR = 24; //fHSI RC output/8 & fCPU=fMASTER/1 PD_ODR = 0; //Turn off all pins PD_DDR_DDR3 = 1; //PortD, Bit 3 is output (PD3 - Data Direction Register) PD_CR1_C13 = 1; //PortD, Control Register 1, Bit 3 (PD3) set to Push-Pull PD_CR2_C23 = 1; //PortD, Control Register 2, Bit 3 (PD3) Output speed up to 10 MHz while (1) { //Turn on and off the output and then delay PD_ODR_bit.ODR3 = !PD_ODR_bit.ODR3; delay_ms(1000); } }
در این مثال و مثالهای بعد توضیح برای هر رجیستر در جلوی آن نوشتهشده است. همچنین از یک تابع برای ایجاد تأخیر استفادهشده است. در صورت تغییر فرکانس، مقدار فرکانس cpu در این تابع را تغییر دهید. همچنین میتوانید کتابخانهها را از آدرس زیر دانلود نمایید.
http://s6.picofile.com/file/8267114792/lib.rar.html
or
http://www.4shared.com/rar/m3qojt0ece/lib.html
مثال شماره دو:
وضعیت PIN3 از PORTD را خروجی و PIN2 از PORTD را ورودی قرار داده از mode fast برای خروجی و pull up را برای حالت ورودی استفاده نمایید. از اسیلاتور داخلی 16 Mhzبهعنوان منبع کلاک میکروکنترلر استفاده کنید. با فشردن کلید وضعیت پین خروجی تغییر حالت دهد.
#include <iostm8s003f3.h> #include "delay.h" #define led PD_ODR_bit.ODR3 #define key PD_IDR_bit.IDR2 //main entry point int main( void ) { CLK_ICKR=1; // High-speed internal RC on = 16 Mhz CLK_CKDIVR = 24; //fHSI RC output/8 & fCPU=fMASTER/1 PD_DDR_DDR3 = 1; //PortD, Bit 3 is output (PD3 - Data Direction Register) PD_CR1_C13 = 1; //PortD, Control Register 1, Bit 3 (PD3) set to Push-Pull PD_CR2_C23 = 1; //PortD, Control Register 2, Bit 3 (PD3) Output speed up to 10 MHz PD_DDR_DDR2 = 0; //PortD, Bit 2 is INPUT (PD2 - Data Direction Register) PD_CR1_C12 = 0; //PortD, Control Register 1, Bit 2 (PD2) Input with pull-up PD_CR2_C22 = 0; //PortD, Control Register 2, Bit 2 (PD2) External interrupt disabled while (1) { //Turn on and off the output and then key pressure if(key==0){ led = !led; while(key==0); delay_ms(100); } } }
حال که با پایههای میکروکنترلر آشنا شدید به سراغ راهاندازی lcd کاراکتری 2*16 میرویم. شما در ابتدا باید کتابخانه lcd را در برنامه معرفی و پایههای lcd را به میکروکنترلر معرفی کنید. با باز کردن فایل lcd.h در ابتدا، پایههای lcd را معرفی نمایید. این کتابخانه برای راهاندازی از مدل 4 بیتی برای راهاندازی lcd استفاده میکند. حتماً به این موضوع توجه داشته باشید که فایلهای مربوط به lcd را به پروژه خود اضافه نمایید.
#define LCD_Enable PD_ODR_ODR4 #define LCD_RS PD_ODR_ODR5 #define LCDPort PC_ODR
به خاطر کامل نبودن پورتهای میکروکنترلر STM8S003F3، مجبور هستیم از دو پورت برای راهاندازی استفاده نماییم. همچنین پورتی که برای پایههای data استفاده میشود باید به بیتهای پر ارزش پورت متصل شود. تابع lcd_command در فایل lcd.c بهصورت پیشفرض از پایههای پر ارزش بیت برای data استفاده میکند. (پایههای 4-7 هر پورت)
void lcd_command(unsigned char cmd) { LCD_RS = 0; LCDPort= 16*((cmd >> 4) & 0x0F); lcd_enable(); LCDPort = 16*(cmd & 0x0F); lcd_enable(); Delay(2); }
درصورتیکه مایل هستید از پینهای 0-3 پورت استفاده نمایید از کدهای زیر برای تابع lcd_command در فایل lcd.c استفاده نمایید.
void lcd_command(unsigned char cmd) { LCD_RS = 0; LCDPort= 16*((cmd >> 4) & 0x0F); lcd_enable(); LCDPort = 16*(cmd & 0x0F); lcd_enable(); Delay(2); }
مثال شماره سه:
پایههای میکروکنترلر را مطابق شکل زیر برای راهاندازی lcd معرفی نمایید و برای تست lcd متنی دلخواه روی آن نمایش دهید.
#include <iostm8s003k3.h> #include <intrinsics.h> #include "lcd.h" #include "delay.h" void InitMCU(void) { CLK_CKDIVR = 0x00; PC_DDR = 0xF0; PC_CR1 = 0xF0; PC_ODR = 0x00; PD_DDR_DDR4 = 1; PD_CR1_C14 = 1; PD_ODR_ODR4 = 0; PD_DDR_DDR5 = 1; PD_CR1_C15 = 1; PD_ODR_ODR5 = 0; } void main(void) { InitMCU(); lcd_init(); lcd_string(1,1,"be name KHODA "); lcd_string(2,3,"TEST "); for(;;); }
Watchdog timer
WDT به تایمری خاص اشاره دارد که وظیفه آن نگهداری و نظارت بر کار میکروکنترلر است. این تایمر مجهز به اسیلاتور RC داخلی برای خود بوده که پس از شمارش و سرریز شدن، میکروکنترلر را بهصورت داخلی ریست میکند. این تایمر در مواردی کاربرد دارد که امکان قفلکردن تراشه وجود داشته و به این وسیله پس از قفلکردن میکروکنترلر، دیگر امکان ریست کردن WDT وجود ندارد و به همین دلیل WDT شمارش خود را انجام داده، سرریز شده و درنتیجه میکروکنترلر را ریست میکند تا از حالت قفل خارج شود. برنامه میکروکنترلر باید بهگونهای باشد که در حین اجرا، تایمر سگ نگهبان (Watch Dog Timer) بهصورت مداوم قبل از سرریز شدن، صفر شود.
در زیر میتوانید رجیستر مربوط به watchdog timer را مشاهده نماید. با یک شدن بیت شماره 7 این رجیستر تایمر فعالشده و توسط مابقی بیتها مقدار تایمر مشخص میشود. در صورت سرریز این تایمر میکروکنترلر reset میشود. به همین منظور شما بعد از فعال کردن این تایمر باید در برنامه خود مقدار این تایمر را صفر کنید.
مثال شماره چهار:
wachdog timer میکروکنترلر را فعال و در برنامه اصلی مقدار آن را صفر کرده تا مانع از reset شدن میکروکنترلر شود. در برنامه اصلی led مربوط به شکل زیر، بهصورت چشمکزن باشد.
#include <iostm8s003f3.h> #include "delay.h" #define led PD_ODR_bit.ODR3 #define key PD_IDR_bit.IDR2 unsigned char i; //main entry point int main( void ) { CLK_ICKR=1; // High-speed internal RC on = 16 Mhz CLK_CKDIVR = 24; //fHSI RC output/8 & fCPU=fMASTER/1 PD_DDR_DDR3 = 1; //PortD, Bit 3 is output (PD3 - Data Direction Register) PD_CR1_C13 = 1; //PortD, Control Register 1, Bit 3 (PD3) set to Push-Pull PD_CR2_C23 = 1; //PortD, Control Register 2, Bit 3 (PD3) Output speed up to 10 MHz for(i=0;i<10;i++){ PD_ODR_bit.ODR3 = !PD_ODR_bit.ODR3; delay_ms(500); } WWDG_CR=255; // Watchdog enabled while (1) { WWDG_CR=255; //reset value of Watchdog //Turn on and off the output and then delay PD_ODR_bit.ODR3 = !PD_ODR_bit.ODR3; delay_ms(1000); } } }
راهاندازی وقفه
در زبان رایانه، وقفه یا Interrupt یک سیگنال به ریزپردازنده است که به توجه و پاسخ سریع CPU نیاز دارد. هنگامیکه یک وقفه رخ میدهد، پردازنده عملیات جاری خود را متوقف میکند تا به درخواست وقفه رسیدگی کند. در هر میکروکنترلر تعدادی وقفه وجود دارد که کاربر بسته به نوع نیاز خود از آنها میتواند استفاده کند. هر وقفه دارای آدرس منحصربهفردی است که با اتفاق افتادن آن cpu برنامه اصلی خود را رها کرده و به آن آدرس میرود و برنامه وقفه موردنظر را اجرا کرده و سپس به برنامه اصلی برمیگردد.
با باز کردن فایل iostm8s003F3.h میتوانید در قسمت آخر این فایل، در قسمت Interrupt vector numbers آدرس مربوط به هر وقفه را مشاهده و از آن استفاده نمایید. همچنین برای فعال کردن وقفه سراسری میتوانید از فایل intrinsics.h و دستورات آن استفاده نمایید.
مثال شماره پنج:
External interrupt مربوط به PIN2 از PORTD بهصورت فعال با لبه پایینرونده فعال کرده و با هر بار فشردن کلید متصل به آن در برنامه، وقفه LED متصل به میکروکنترلر را تغییر وضعیت دهید.
#include <iostm8s003F3.h> #include <intrinsics.h> #include "delay.h" #pragma vector = 8 __interrupt void EXTI_PORTD_2(void) { PD_ODR_ODR3 = !PD_ODR_ODR3; // Toggle Port D, pin 3. } void main() { CLK_ICKR=1; // High-speed internal RC on = 16 Mhz CLK_CKDIVR = 24; //fHSI RC output/8 & fCPU=fMASTER/1 __disable_interrupt(); PD_ODR = 0; // All pins are turned off. PD_DDR = 0xff; // All pins are outputs. PD_CR1 = 0xff; // Push-Pull outputs. PD_CR2 = 0xff; // Output speeds up to 10 MHz. PD_DDR_DDR2 = 0; // PD4 is input. PD_CR1_C12 = 1; // PD4 is floating input. // Set up the interrupt. // EXTI_CR1_PDIS = 2; // Interrupt on falling edge. EXTI_CR2_TLIS = 0; // Falling edge only. __enable_interrupt(); while (1) { __wait_for_interrupt(); } }
تایمر
میکروکنترلر STM8S دارای تایمرهای 8 و 16 بیتی هست که راهاندازی آنها تفاوت زیادی با یکدیگر ندارند، بعضی از این تایمرها، دارای نقشهای دیگری بهجز تایمر میباشند. در این آموزش سعی شده است از مسائل اولیه خودداری شده و با ارائه مثال از تایمر استفاده شود. برای درک بهتر از عملکرد تایمرها میتوانید به datasheet مراجعه نمایید.
مثال شماره شش:
بهوسیله تایمر 8 بیتی شماره چهار و وقفه تایم، یکزمان یکثانیهای ایجاد کرده و یک چشمکزن برای led متصل به میکروکنترلر بسازید. آدرس وقفه تایمر شماره چهار را میتوانید از کتابخانه توضیح دادهشده استخراج نمایید. توضیحات مربوط به هر رجیستر در جلوی آن دادهشده است.
#include <iostm8s003f3.h> #include <intrinsics.h> #include "delay.h" unsigned int count=0; // toggle pin every 1 seconde #pragma vector = 0x19 __interrupt void timer4_interrupt(void){ count++; if(count>60){ PD_ODR_bit.ODR3=!PD_ODR_bit.ODR3; count=0; } TIM4_SR_bit.UIF=0; // timer4 interrupt flage=0 } //main entry point int main( void ) { CLK_ICKR=1; // High-speed internal RC on = 16 Mhz CLK_CKDIVR = 24; //fHSI RC output/8 & fCPU=fMASTER/1 PD_ODR = 0; //Turn off all pins PD_DDR_DDR3 = 1; //PortD, Bit 3 is output (PD3 - Data Direction Register) PD_CR1_C13 = 1; //PortD, Control Register 1, Bit 3 (PD3) set to Push-Pull PD_CR2_C23 = 1; //PortD, Control Register 2, Bit 3 (PD3) Output speed up to 10 MHz TIM4_IER_bit.UIE=1; // timer4 interrupt enable TIM4_SR=0; // timer4 interrupt flage=0 TIM4_CNTR=0; // timer4_value=0 TIM4_PSCR=7; // prescaler=128 TIM4_CR1=1; // timer4 enable __enable_interrupt(); while (1) { __wait_for_interrupt(); } }
راهاندازی Analog/digital converter ADC
میکروکنترلر STM8S از یک مبدل آنالوگ به دیجیتال 10 بیتی بهره میبرد. در زیر میتوانید مشخصات کلی این ماژول را مشاهده نمایید.
همانطور که در شکل زیر مشاهده مینمایید پایهای آنالوگ با اسم AINx مشخصشدهاند.
ADC این میکروکنترلر دارای چندین رجیستر هست که توضیح تکتک آنها از حوصله این بحث خارج بوده و میتوانید توضیحات آن را از datasheet میکروکنترلر بخوانید. در زیر با ارائه یک مثال و با استفاده از رجیسترهای مهم، مثالی نوشتهشده است که میتوانید از آن بهره ببرید.
تمرین شماره هفت:
مطابق شکل زیر با اتصال یک پتانسیومتر به ورودی AIN6 مقدار ولتاژ ورودی را به یک عدد دیجیتال تبدیل کرده و بر روی LCD نمایش دهید.
#include <iostm8s003F3.h> #include <stdio.h> #include "delay.h" #include "lcd.h" char a[4]; signed int l,h,value; void InitMCU(void) { CLK_CKDIVR = 1; PC_DDR = 0xFF; PC_CR1 = 0xFF; PC_ODR = 0x00; PD_DDR_DDR4 = 1; PD_CR1_C14 = 1; PD_ODR_ODR4 = 0; PD_DDR_DDR5 = 1; PD_CR1_C15 = 1; PD_ODR_ODR5 = 0; } void main(void) { PB_DDR_DDR0 = 0; //PortB, Bit 0 is input InitMCU(); lcd_init(); while(1) { ADC_CSR=0x06; // ADC on AIN6 ADC_CR2=0X38; // right Right alignment ADC_CR1=0x01; // Turn ADC on & triger //while(ADC_CSR_EOC==0); l=ADC_DRL; h=ADC_DRH; value=h*256; value=value+l; lcd_string(1,1,"ADC6= "); sprintf(a,"%d ",value); lcd_string(1,6,a); delay_ms(100); } }
در این آموزش سعی شد، مسائل مهم و کاربردی برای راهاندازی میکروکنترلر STM8S ارائه شود و از بیان جزئیات خودداری شده است. همچنین، شما میتوانید از کتابخانههای ارائهشده توسط کامپایلر نیز استفاده نمایید، اما در این آموزش برای درک بهتر از این میکروکنترلر از رجیسترها برای آموزش استفاده شد. امید است با خواندن این مطالب توانسته باشم خدمتی بسیار کوچک در زمینه علم الکترونیک به علاقهمندان این علم زیبا کرده باشم.
در صورت وجود مشکل و هرگونه پیشنهادی در ارائه بهتر مطالب و مطالبی برای کامل کردن این آموزش میتوانید نظرات خود را به آدرس زیر ارسال نمایید.
منبع:مجله نویز
نویسنده: علیمحمد شفیعی alimohammad_shafiei@yahoo.com
سلام پروگرامرش چیه
سلام
ضمن تشکر از سایت خوبتون؛ در همهی سایتها تنها به پروگرام stm8 اشاره شده، آیا میتوان اطلاعات داخل میکرو STM8S003F3P6 رو کپی کرد و روی میکرو دیگر ریخت؟
عالی بود مرسی.خلاصه و مفید و کاربردی
درود بر شما .
با توجه به قیمت عالی و امکانات خوب این سری کنترلر ؛مورد توجه بسیاری از طراحان محصولات الکترونیکی هست منتها مشکل کمبود حافظه و منابع این سری میکروکنترلر هست که با وجود استفاده از کتابخانه spl فضای در دسترس بسیار کمتر خواهد شد .
اکثر منابع در اینترنت به راه اندازی stm8 توسط کتابخانه پیشنهادی ST که با SPL میشناسیم بسنده کرده اند .
مطلب شما در رابطه با استفاده مستقیم از رجیستر ها بسیار کارامد و عالی هست و میتونه کمک بزرگی به طراحان و برنامه نویسان داشته باشه .
سپاسگزارم از شما . موفق باشید .