You are on page 1of 50

Melec.

ir

alimohammad_shafiei@yahoo.com ‫ ﻋﻠﯽ ﻣﺣﻣد ﺷﻔﯾﻌﯽ‬: ‫ﻧوﯾﺳﻧده‬


‫ﻣﯾﮑروﮐﻧﺗرﻟر ‪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‬و ﮐﺗﺎﺑﺧﺎﻧﮫ ﻣﯾﺗواﻧﯾد آن را از ادرس زﯾر داﻧﻠود ﻧﻣﺎﯾﯾد‪ .‬ﺣﺗﻣﺎ ﺑﮫ اﯾن ﻣوﺿوع ﺗوﺟﮫ داﺷﺗﮫ ﺑﺎﺷﯾد‬
‫در ﺻورت اﺳﺗﻔﺎده از ﭘروژه ‪ tempalate‬ﺗﻐﯾﯾراﺗﯽ را در ﭘروژه ﻣطﺎﻟﺑق ﺑﺎ ﻧﯾﺎز ﺧود اﻋﻣﺎل ﮐﻧﯾد‪.‬ﻣواردی ﻣﺛل ﻣدل ﻣﯾﮑروﮐﻧﺗرﻟر و ‪ ...‬ﮐﮫ در اداﻣﮫ ﺑﯾﺷﺗر ﺑﺎ آن‬
‫آﺷﻧﺎ ﺧواھﯾد ﺷد‪.‬‬

‫‪Melec.ir‬‬
‫ﺑﻌد ار ﻧﺻب ﻧرم اﻓزار و ﺑﺎز ﮐردن آن ﺑﺎ ﻣﺣﯾط زﯾر روﺑرو ﻣﯾﺷوﯾد‪.‬‬
‫ﺑرای ﺳﺎﺧت ﭘروژه ﻣطﺎﺑق ﺷﮑل از ﻣﻧوی ‪ 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 additional‬را زده‬
‫و در ﻗﺳﻣت ‪ Output format‬ﮔزﯾﻧﮫ ‪intel extended‬‬
‫را اﻧﺗﺧﺎب ﻧﻣﺎﯾﯾد‪.‬‬

‫ھﻣﭼﻧﯾن در ‪ workspace‬ﺧود ﻣﯾﺗواﻧﯾد ﮔزﯾﻧﮫ ‪ Debuge‬و ﯾﺎ ‪ Release‬را‬


‫اﻧﺗﺧﺎب ﻧﻣﺎﯾﯾد‪.‬‬
‫ﺑﻌد از ﺳﺎﺧت ﭘروژه و ﻧوﺷﺗن ﮐد ﻣورد ﻧظر ﻧوﺑت ﺑﮫ ‪ compile‬ﺑرﻧﺎﻣﮫ ﻣﯾرﺳد ﺷﻣﺎ ﺑرای اﯾن ﮐﺎر ﻣﯾﺗواﻧﯾد از ﮔزﯾﻧﮫ ‪ 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‬اھم ﺑﮫ ﺗﻐذﯾﮫ ﻣﺗﺻل‬


‫ﻧﻣﺎﯾﯾد ‪.‬اﯾن ﻣﯾﮑروﮐﻧﺗرﻟر دارای ﯾﮏ رﮔوﻻﺗور داﺧﻠﯽ ﻣﯾﺑﺎﺷد ﮐﮫ ﻧﯾﺎز ﺑﮫ ﯾﮏ ﺧﺎزن ﺧﺎرﺟﯽ‬
‫دارد ‪.‬‬
‫ھﻣﭼﻧﯾن ﺑرای ﭘروﮔرام ﮐردن ﻣﯾﮑروﮐﻧﺗرﻟر ﺗوﺳط ﭘروﺗﮑل ‪ SWIM‬ﺑﺎﯾد ﭘﺎﯾﮫ ﻣورد ﻧظر‬
‫را ﺑﮫ ﭘروﮔراﻣر ﻣﺗﺻل ﻧﻣﺎﯾﯾد ‪.‬ﮐﮫ ﻣﯾﺗواﻧﯾد در ﺷﮑل روﺑرو ﻣﺷﺎھده ﻓرﻣﺎﯾﯾد‪.‬‬
‫در ﺗﻣﺎﻣﯽ ﻣﺛﺎل ھﺎ از اﺳﯾﻼﺗور داﺧﻠﯽ ‪ 16Mhz‬اﺳﺗﻔﺎده ﺷده اﺳت ‪ .‬ﮐﮫ ﺑﺎﯾد در اﺑﺗدای ﺑرﻧﺎﻣﮫ‬
‫ﺗوﺳط رﺟﯾﺳﺗرھﺎ ﺗﻧظﯾم ﺷود‪ .‬در ﺷﮑل ﺻﻔﺣﮫ ﺑﻌد ﻣﯾﺗواﻧﯾد ‪ Block diagram‬اﺳﯾﻼﺗور‬
‫داﺧﻠﯽ را ﻣﺷﺎھده ﻧﻣﺎﯾﯾد‪.‬‬
‫ﭘروﮔرام ﮐردن‪:‬‬
‫ﺷﻣﺎ ﺑرای ﭘروﮔرام ﮐردن ﻣﯾﺗواﻧﯾد ھم از ﻧرم اﻓزار ‪ IAR‬و ھم از ﻧرم اﻓزار اراﺋﮫ ﺷده ﺗوﺳط ﺧود ﺷرﮐت ‪ ST‬اﺳﺗﻔﺎده ﻧﻣﺎﯾﯾد ‪ .‬ﺗوﺳط ﻟﯾﻧﮏ زﯾر ﻣﯾﺗواﻧﯾد اﯾن ﻧرم‬
‫اﻓزار را ﻧﺻب و از اﺳﺗﻔﺎده ﻧﻣﺎﯾﯾد‪.‬ﺷﻣﺎ وﻗﺗﯽ اﯾن ﻧرم اﻓزار را ﻧﺻب ﻣﯽ ﮐﻧﯾد ﺑﮫ ھﻣراه آن ﮐﺎﻣﭘﺎﯾﻠر ‪ ST Visual Developl‬ﻧرم اﻓزار ‪ST Visual‬‬
‫‪ Programmer‬ﻧﯾز ﻧﺻب ﻣﯾﺷود‪ .‬ﮐﮫ ﻣﯾﺗواﻧﯾد ﺗوﺳط ﻟﯾﻧﮏ زﯾر آن را ‪ download‬ﻧﻣﺎﯾﯾد‪.‬‬

‫‪http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm8-software-‬‬
‫‪development-tools/stm8-programmers.html?querycriteria=productId=LN2016‬‬

‫در اﺑﺗدا ﺳﺧت اﻓزار ﺧود را ﺗوﺳط ﺷﻣﺎﺗﯾﮏ زﯾر ﺑﮫ ﭘروﮔراﻣر ﻣﺗﺻل ﮐرده و ﺳﭘس ﭘروﮔراﻣر را ﺑﮫ ﮐﺎﻣﭘﯾوﺗر ﻣﺗﺻل ﻧﻣﺎﯾﯾد و ﻣﻧﺗظر ﻧﺻب دراﯾور ﭘروراﻣر ﺷوﯾد‪.‬‬
‫ﺑﻌد از اﺟرای ﻧرم اﻓزار ‪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) .1‬‬
‫ﺗوﺳط اﯾن رﺟﯾﺳﺗر ﻣﯾﺗواﻧﯾد ورودی ﯾﺎ ﺧروﺟﯽ ﺑودن ﭘﯾن ﻣورد ﻧظر را ﻣﺷﺧص ﮐﻧﯾد‪ .‬اﮔر درون اﯾن رﺟﯾﺳﺗر ﻣﻘدار ﯾﮏ ﻗرار ﮔﯾرد ﭘﯾن ﻣﺗﻧﺎظر ﺑﺎ ﺑﯾت رﺟﯾﺳﺗر ﺑﮫ‬
‫ﻋﻧوان ﺧروﺟﯽ و اﮔر ﻣﻘدار ﺻﻔر ﻗرار ﮔﯾرد ﺑﮫ ﺻورت ورودی ﭘﯾﮑرﺑﻧدی ﺧواھد ﺷد‪.‬‬
‫‪Port x control register 1 (Px_CR1) .2‬‬
‫اﮔر ﭘﯾن ﻣورد ﻧظر ﺑﮫ ﺻورت ورودی ﺗﻌرﯾف ﺷده ﺑﺎﺷد ﻣﯾﺗوان ﺗوﺳط اﯾن رﺟﯾﺳﺗر ﻣﻘﺎوﻣت ‪ pullup‬آن را ﻓﻌﺎل ﯾﺎ ﻏﯾر ﻓﻌﺎل ﮐرد و اﮔر ﺑﮫ ﺻورت ﺧروﺟﯽ ﺗﻌرﯾف‬
‫ﺷده ﺑﺎﺷد ﺗوﺳط اﯾن رﺟﯾﺳﺗر ﻣﯾﺗوان ﯾﮑﯽ از دو ﺣﺎﻟت ‪ open drain‬ﯾﺎ ‪ Push-pull‬ﺑرای ﺧروﺟﯽ اﻧﺗﺧﺎب ﮐرد‪ .‬ﮐﮫ ﻣﯾﺗواﻧﯾد ﺳﺎﺧﺗﺎر آن را در ‪blocK diagram‬‬
‫ﻗﺳﻣت ‪ GPIO‬ﺑﺑﯾﻧﯾد‪.‬‬
‫‪Port x control register 2 (Px_CR2) .3‬‬

‫ﻋﻣﻠﮑرد اﯾن رﺟﯾﺳﺗر ھم ﻣﺛل رﺟﯾﺳﺗر ‪ Px_CR1‬ﺗﺎﺑﻊ ورودی ﯾﺎ ﺧروﺟﯽ ﺑودن ﭘﯾن ﻣورد ﻧظر ﻣﯾﺑﺎﺷد ‪ .‬اﮔر اﯾن ﭘﯾن ﺑﮫ ﺻورت ورودی ﺑﺎﺷد ﻣﯾﺗواﻧﯾد ﺗوﺳط‬
‫اﯾن رﺟﯾﺳﺗر وﻗﻔﮫ ﺧﺎرﺟﯽ ان را ﻓﻌﺎل ﯾﺎ ﻏﯾر ﻓﻌﺎل ﮐرد و اﮔر ﺑﮫ ﺻورت ﺧروﺟﯽ ﺑﺎﺷد ﻣﯾﺗواﻧﯾد ‪ mode fast‬ﯾﺎ ﻣد ‪ slow‬را اﻧﺗﺧﺎب ﻧﻣﺎﯾﯾد‪.‬‬
‫‪Port x output data register (Px_ODR) .4‬‬

‫اﮔر ﭘﯾن را ﺑﮫ ﺻورت ﺧروﺟﯽ ﺗﻌرﯾف ﮐرده ﺑﺎﺷﯾد ﻣﯾﺗواﻧﯾد ﺗوﺳط اﯾن رﺟﯾﺳﺗر ﻣﻘدار ﺧروﺟﯽ را ﺗﺎﯾﯾن ﮐﻧﯾد‪.‬‬
‫‪Port x pin input register (Px_IDR) .5‬‬

‫اﮔر ﭘﯾن را ﺑﮫ ﺻورت وردی ﺗﻌرﯾف ﮐرده ﺑﺎﺷﯾد ﻣﯾﺗواﻧﯾد وﺿﻌﯾت وردی را از اﯾن رﺟﯾﺳﺗر ﺑﺧواﻧﯾد‪ .‬ھﻣﺎﻧطور ﮐﮫ در ﺷﮑل زﯾر ﻣﺷﺎھده ﻣﯾﻧﻣﺎﯾﯾد اﯾن رﺟﯾﺳﺗر ﻓﻘط‬
‫ﻗﺎﺑل ﺧواﻧدن ﻣﯽ ﺑﺎﺷد‪.‬‬
‫در زﯾر ﻣﯾﺗواﻧﯾد ﺧﻼﺻﮫ از وﺿﻌﯾت رﺟﯾﺳﺗرھﺎ را ﺑﮭﺗر ﻣﺷﺎھده ﻧﻣﺎﯾﯾد‪.‬‬
‫ﻣﺛﺎل ﺷﻣﺎره ﯾﮏ‪:‬‬

‫وﺿﻌﯾت ‪ PIN3‬از ‪ PORTD‬را ﺧروﺟﯽ ﻗرار داده و ھر ﯾﮏ ﺛﺎﻧﯾﮫ ﯾﮏ ﺑﺎر ﭼﺷﻣﮏ ﺑزﻧد‪ .‬ھﻣﭼﻧﯾن از ‪ mode fast‬اﺳﺗﻔﺎده ﻧﻣﺎﯾﯾد‪ .‬از اﺳﯾﻼﺗور داﺧﻠﯽ ‪16‬‬
‫‪ Mhz‬ﺑﮫ ﻋﻧوان ﻣﻧﺑﻊ ﮐﻼک ﻣﯾﮑروﮐﻧﺗرﻟر اﺳﺗﻔﺎده ﻧﻣﺎﯾﯾد‪.‬‬
#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‬در اﯾن ﺗﺎﺑﻊ را ﺗﻐﯾﯾر دھﯾد‪ .‬ھﻣﭼﻧﯾن ﻣﯾﺗواﻧﯾد ﮐﺗﺎﺑﺧﺎﻧﮫ ھﺎ را از ادرس زﯾر ‪ download‬ﻧﻣﺎﯾﯾد‪.‬‬
‫‪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‬را ﺑﮫ ﻣﯾﮑروﮐﻧﺗرﻟر ﻣﻌرﻓﯽ ﻧﻣﺎﯾﯾد‪ .‬ﺑﺎ ﺑﺎز ﮐردن ﻓﺎﯾل ‪ lcd.h‬در اﺑﺗدای ان ﭘﺎﯾﮫ ھﺎی ‪ lcd‬را ﻣﻌرﻓﯽ‬
‫ﻧﻣﺎﯾﯾد‪ .‬اﯾن ﮐﺗﺎﺑﺧﺎﻧﮫ ﺑرای راه اﻧدازی از ‪ 4 mode‬ﺑﯾﺗﯽ ﺑرای راه اﻧدازی ‪ 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‬اﺳﺗﻔﺎده ﻣﯾﮑﻧد ‪ ) .‬ﭘﺎﯾﮫ ھﺎی ‪ 7-4‬ھر ﭘورت (‬
‫)‪void lcd_command(unsigned char cmd‬‬
‫{‬
‫;‪LCD_RS = 0‬‬
‫;)‪LCDPort= 16*((cmd >> 4) & 0x0F‬‬
‫;)(‪lcd_enable‬‬
‫;)‪LCDPort = 16*(cmd & 0x0F‬‬
‫;)(‪lcd_enable‬‬
‫;)‪Delay(2‬‬
‫}‬

‫در ﺻورﺗﯽ ﮐﮫ ﻣﺎﯾل ھﺳﺗﯾد ار ﭘﯾن ھﺎی ‪ 3-0‬ﭘورت اﺳﺗﻔﺎده ﻧﻣﺎﯾﯾد از ﮐد ھﺎی زﯾر ﺑرای ﺗﺎﺑﻊ ‪ 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‬از ﯾﮏ ‪ ADC 10bit‬ﺑﮭره ﻣﯽ ﺑرد‪ .‬در زﯾر ﻣﯾﺗواﻧﯾد ﻣﺷﺧﺻﺎت ﮐﻠﯽ اﯾن ﻣﺎژول را ﻣﺷﺎھده ﻧﻣﺎﯾﯾد‪.‬‬

‫ھﻣﺎﻧطور ﮐﮫ در ﺷﮑل زﯾر ﻣﺷﺎھده ﻣﯽ ﻧﻣﺎﯾﯾد ﭘﺎﯾﮫ ای آﻧﺎﻟوگ ﺑﺎ اﺳم ‪ 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‬‬

‫ﺑﺎ ﺗﺷﮑر‬
‫ﻋﻠﯽ ﻣﺣﻣد ﺷﻔﯾﻌﯽ‬

You might also like