مطالب آموزشی

آموزش سریع میکروکنترلر STM8S

میکروکنترلر STM8S محصول 8 بیتی شرکت ST هست که در شکل زیر می‌توان مدل‌های مختلف از محصولات این شرکت را با یکدیگر مقایسه کرد.

word image 5

از مشخصات قابل‌توجه این میکروکنترلرها می‌توان به موارد زیر اشاره کرد:

  • قیمت ارزان‌تر نسبت به میکروکنترلرهای مشابه
  • ساخته‌شده توسط تکنولوژی 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

بعد از نصب نرم‌افزار و باز کردن آن، با محیط زیر روبرو می‌شوید.

word image 21

برای ساخت پروژه مطابق شکل از منوی project گزینه Create New Project را انتخاب نمایید.

word image 22

در قسمت بعد زبان برنامه‌نویسی را انتخاب کرده و کلید Ok را فشار دهید.

word image 23

در این قسمت مسیری برای save کردن پروژه انتخاب نموده و گزینه save را انتخاب کنید.

word image 24

شما باید تمامی فایل‌ها و workspace را نیز save کنید. برای این کار از منوی file گزینه save All

word image 25
را انتخاب نمایید. و تمامی فایل‌ها و workspace را save نمایید. در ادامه برای انتخاب نوع میکروکنترلر و تنظیمات پروژه از منوی project گزینه Options را انتخاب کنید.

word image 26

از قسمت General option و سربرگ Target در قسمت Device میکروکنترلر موردنظر خود را انتخاب نمایید.

word image 27
word image 28

همچنین از سربرگ Stack/Heap می‌توانید فضای مربوط به حافظه پشته مقداردهی نمایید.

word image 29

در قسمت c/c++ compiler و از سربرگ preprocessor، درصورتی‌که از فایل و هدر فایل غیر از هدرفایل‌های کامپایلر استفاده می‌کنید مسیر آن را معرفی نمایید. شما اگر از پروژه‌های template استفاده کنید در این قسمت می‌توانید مسیرهای معرفی‌شده را مشاهده کنید.

word image 30

برای ساخت فایل hex باید در قسمت Output Converter و سربرگ Output تیک Generate dditional را زده و در قسمت Output format گزینه intel extended را انتخاب نمایید.

word image 31

همچنین در workspace خود می‌توانید گزینه ‌Debuge و یا Release را انتخاب نمایید.

word image 32

بعد از ساخت پروژه و نوشتن کد موردنظر، نوبت به کامپایل کردن برنامه می‌رسد. شما برای این کار می‌توانید از گزینه compile یا make در نرم‌افزار خود مطابق شکل زیر و یا از کلیدهای میانبر F7 و یا Ctrl+F7 استفاده نمایید.

word image 33

word image 34

برای تست کامپایلر و اطمینان پیدا کردن از درستی نصب نرم‌افزار کدهای زیر را وارد فایل 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);

}

}

word image 35

درصورتی‌که مراحل ساخت پروژه را به‌درستی انجام داده باشید و برنامه نوشته‌شده نیز مشکلی نداشته باشد، بعد از کامپایل برنامه، در قسمت Messages باید مطابق شکل هیچ‌گونه error و warning وجود نداشته و همچنین فایل hex درون پوشه پروژه موجود باشد.

اکنون ساخت پروژه و تنظیمات مربوط به آن به پایان رسیده و در صورت نبود مشکل به مرحله بعد می‌رویم.

توضیحاتی مختصر و موارد لازم برای راه‌اندازی:

در این آموزش کلیه مثال‌ها توسط برد و پروگرامر ST-LINK موجود در شکل راه‌اندازی شده است. شما برای راه‌اندازی و کار با میکروکنترلرهای STM8S باید به چندین مسئله مهم توجه کنید.

  • تغذیه میکروکنترلر
  • پایه ریست
  • Clock

word image 36

پایه NRST میکروکنترلر را توسط یک مقاومت بین 1K-10K اهم به تغذیه VCC متصل نمایید. این میکروکنترلر دارای یک رگولاتور داخلی بوده که نیاز به یک خازن خارجی دارد.

همچنین برای پروگرام کردن میکروکنترلر توسط پروتکل SWIM می‌بایست پایه‌های موردنظر را به پروگرامر، همانند شماتیک، متصل نمایید. در تمامی مثال‌ها از اسیلاتور داخلی 16Mhz استفاده‌شده است؛ که باید در ابتدای برنامه توسط رجیسترها تنظیم شود.

word image 37

word image 38

word image 39

پروگرام کردن:

شما برای پروگرام کردن می‌توانید از نرم‌افزار IAR و یا از نرم‌افزار ارائه‌شده توسط خود شرکت ST استفاده نمایید. توسط لینک زیر می‌توانید این نرم‌افزار را دانلود و نصب کنید. در هنگام نصب نرم‌افزار ST Visual Developl نرم‌افزار ST Visual Programmer نیز نصب می‌شود.

http://link.eca.ir/1260

در ابتدا سخت‌افزار خود را توسط شماتیک زیر به پروگرامر متصل کرده و سپس پروگرامر را به کامپیوتر متصل نمایید و منتظر بمانید تا درایور پروگرامر نصب شود.

word image 40

بعد از اجرای نرم‌افزار ST Visual Programmer با صفحه زیر روبرو می‌شوید. از منوی configure گزینه Configure ST Visual Programmer را انتخاب نمایید.

word image 41

در این قسمت با انتخاب سخت‌افزار مورداستفاده، پورت آن، پروتکل پروگرام کردن و میکروکنترلر موردنظر به قسمت بعد بروید.

word image 42

word image 43
برای پروگرام کردن میکرو در ابتدا باید فایل hex خود را از منوی file-open انتخاب و به نرم‌افزار معرفی نمایید.

word image 44
بعد از انتخاب فایل hex با کلیک بر روی گزینه Programm—current tab و یا از طریق گزینه مشخص‌شده در شکل می‌توانید میکروکنترلر خود را پروگرام کنید و در قسمت message می‌توانید وضعیت اتصال و پروگرام شدن میکروکنترلر را مشاهده نمایید. با انتخاب گزینه option byte می‌توانید به قسمت پیکربندی مربوط به سخت‌افزار میکروکنترلر دست پیدا کنید. مسائلی از قبیل read protection Watchdog timer, oscillator و دیگر موارد را می‌توانید پیکربندی نمایید.

word image 45

راه‌اندازی I/O

برای کار با پایه‌ها به‌صورت ورودی و یا خروجی دیجیتال، 5 رجیستر وجود دارد که هر یک به‌صورت خلاصه و کاربردی توضیح داده می‌شود. برای توضیحات تکمیلی می‌توانید به datasheet مراجعه کنید.

word image 46

  1. 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)

توسط این رجیستر می‌توانید ورودی یا خروجی بودن پین موردنظر را مشخص کنید. اگر درون این رجیستر مقدار یک قرار گیرد پین متناظر با بیت رجیستر به‌عنوان خروجی و اگر مقدار صفر قرار گیرد به‌صورت ورودی پیکربندی خواهد شد.

word image 47

Port x control register 1 (Px_CR1)

اگر پین موردنظر به‌صورت ورودی تعریف‌شده باشد، می‌توان توسط این رجیستر مقاومت pullup آن را فعال یا غیرفعال کرد و اگر به‌صورت خروجی تعریف‌شده باشد، توسط این رجیستر می‌توان یکی از دو حالت open drain یا Push-pull برای خروجی انتخاب کرد که می‌توانید ساختار آن را در blocK diagram قسمت GPIO ببینید.

word image 48

  1. Port x control register 2 (Px_CR2)

عملکرد این رجیستر همانند رجیستر Px_CR1 تابع ورودی یا خروجی بودن پین موردنظر هست. اگر این پین به‌صورت ورودی باشد می‌توانید توسط این رجیستر، وقفه خارجی آن را فعال یا غیرفعال کنید و اگر به‌صورت خروجی باشد می‌توانید mode fast یا مد slow را انتخاب نمایید.

word image 49

  1. Port x output data register (Px_ODR)

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

word image 50

  1. Port x pin input register (Px_IDR)

اگر پین را به‌صورت وردی تعریف کرده باشید می‌توانید وضعیت وردی را توسط این رجیستر بخوانید. همان‌طور که در شکل زیر مشاهده می‌نمایید این رجیستر فقط قابل‌خواندن هست.

word image 51

در زیر می‌توانید خلاصه‌ای از وضعیت رجیسترها را مشاهده نمایید.

word image 52

مثال شماره یک:

می‌خواهیم وضعیت PIN3 از PORTD را در حالت mode fast به‌صورت خروجی قرار داده و هر یک ثانیه یک‌بار چشمک بزند. از اسیلاتور داخلی Mhz16 به‌عنوان منبع کلاک میکروکنترلر استفاده نمایید.

word image 53

#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به‌عنوان منبع کلاک میکروکنترلر استفاده کنید. با فشردن کلید وضعیت پین خروجی تغییر حالت دهد.

word image 54

#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 متنی دلخواه روی آن نمایش دهید.

word image 55

#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 می‌شود. به همین منظور شما بعد از فعال کردن این تایمر باید در برنامه خود مقدار این تایمر را صفر کنید.

word image 56

مثال شماره چهار:

wachdog timer میکروکنترلر را فعال و در برنامه اصلی مقدار آن را صفر کرده تا مانع از reset شدن میکروکنترلر شود. در برنامه اصلی led مربوط به شکل زیر، به‌صورت چشمک‌زن باشد.

word image 57

#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 متصل به میکروکنترلر را تغییر وضعیت دهید.

word image 58

#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 مراجعه نمایید.

word image 59

مثال شماره شش:

به‌وسیله تایمر 8 بیتی شماره چهار و وقفه تایم، یک‌زمان یک‌ثانیه‌ای ایجاد کرده و یک چشمک‌زن برای led متصل به میکروکنترلر بسازید. آدرس وقفه تایمر شماره چهار را می‌توانید از کتابخانه توضیح داده‌شده استخراج نمایید. توضیحات مربوط به هر رجیستر در جلوی آن داده‌شده است.

word image 60

#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 بیتی بهره می‌برد. در زیر می‌توانید مشخصات کلی این ماژول را مشاهده نمایید.

word image 61

همان‌طور که در شکل زیر مشاهده می‌نمایید پایه‌ای آنالوگ با اسم AINx مشخص‌شده‌اند.

word image 62

ADC این میکروکنترلر دارای چندین رجیستر هست که توضیح تک‌تک آن‌ها از حوصله این بحث خارج بوده و می‌توانید توضیحات آن را از datasheet میکروکنترلر بخوانید. در زیر با ارائه یک مثال و با استفاده از رجیسترهای مهم، مثالی نوشته‌شده است که می‌توانید از آن بهره ببرید.

تمرین شماره هفت:

مطابق شکل زیر با اتصال یک پتانسیومتر به ورودی AIN6 مقدار ولتاژ ورودی را به یک عدد دیجیتال تبدیل کرده و بر روی LCD نمایش دهید.

word image 63

#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 ارائه شود و از بیان جزئیات خودداری شده است. همچنین، شما می‌توانید از کتابخانه‌های ارائه‌شده توسط کامپایلر نیز استفاده نمایید، اما در این آموزش برای درک بهتر از این میکروکنترلر از رجیسترها برای آموزش استفاده شد. امید است با خواندن این مطالب توانسته باشم خدمتی بسیار کوچک در زمینه علم الکترونیک به علاقه‌مندان این علم زیبا کرده باشم.

 این مطلب در شماره 15 مجله نویز منتشر شده است.

نوشته های مشابه

2 دیدگاه

  1. سلام
    یک سایت آموزشی هست بنامUBOARD.IR سرفصلهاش گول زنه است و آموزش آن با سرفصل هاش سنخیت نداره و کیفیت فنی بسیار پایینی داره .دوستان گول نخورید.شماره تلفونشون هم اصلا جواب نمیدن که اعتراض کنیم.آرم قابل اعتماد هم نداره .مراقب باشید خرید نکنید

  2. ممنون مطلب کاملا مفید مفید بود فقط در باره standard preferal lyberary یکم بیشتر توضیح میدادید عالی میشد….

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا