AVR
AVR
ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﺻﻔﺮ
ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻳﻚ
SPI Bus
Modeﻫﺎي Sleepو ﺗﺎﻳﻤﺮ Watchdog
ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ ي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ AVRﻫﺴﺘﻨﺪ ﻛﻪ اﻣﻜﺎﻧﺎﺗﻲ را در اﺧﺘﻴﺎر ﻛﺎرﺑﺮ ﻗﺮار ﻣﻲ دﻫﻨﺪ و ﺑﺎ
Eraseﺷﺪن ﻣﻴﻜﺮو ﻣﻘﺪار آن ﻫﺎ ﺗﻐﻴﻴﺮ ﻧﻤﻲ ﻛﻨﺪ .ﻳﻚ ﺑﻪ ﻣﻌﻨﻲ ﻏﻴﺮ ﻓﻌﺎل ﺑﻮدن و ﺻﻔﺮ ﻓﻌﺎل ﺑﻮدن ﻫﺮ ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ.
-٤-
Page |5
www.eca.ir
ﺷﻤﺎره ﺑﻴﺖ Low Byte ﻋﻤﻠﻜﺮد ﭘﻴﺶ ﻓﺮض
:BOOTRSTاﻧﺘﺨﺎب ﺑﺮدار ري ﺳﺖ BOOTﻛﻪ در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﺑﺮﻧﺎﻣﻪ رﻳﺰي ﻧﺸﺪه اﺳﺖ و آدرس
ﺑﺮدار ري ﺳﺖ 0000اﺳﺖ و در ﺻﻮرت ﺑﺮﻧﺎﻣﻪ رﻳﺰي آدرس ﺑﺮدار Resetﻃﺒﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد) .ﺑﺮ
اﺳﺎس ](BOOTSZ[1:0
-٥-
Page |6
www.eca.ir
:BODENاﻳﻦ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز Brown-out Detectorﺑﻮده و در ﺻﻮرت ﭘﺮوﮔﺮام ﺷﺪن ﻣﻄﺎﺑﻖ وﺿﻌﻴﺖ ﺟﺪول
ﻫﻤﺎﻧﻄﻮر ﻛﻪ در دﻳﺎﮔﺮام زﻳﺮ دﻳﺪه ﻣﻲ ﺷﻮد ،اﻳﻦ ﻣﻨﺎﺑﻊ ﺷﺎﻣﻞ :اﺳﻴﻼﺗﻮر RCﻛﺎﻟﻴﺒﺮه ﺷﺪه ،اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ﻓﺮﻛﺎﻧﺲ
ﭘﺎﻳﻴﻦ ،اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ،ﻛﻼك ﺧﺎرﺟﻲ ،اﺳﻴﻼﺗﻮر RCﺧﺎرﺟﻲ و اﺳﻴﻼﺗﻮر ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻣﻲ ﺑﺎﺷﻨﺪ.
-٦-
Page |7
www.eca.ir
اﻧﺘﺨﺎب ﻣﻨﺒﻊ ﻛﻼك ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﺑﻮده و ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ .ﻣﻘﺪار ﭘﻴﺶ ﻓﺮض ﺑﻴﺖ
ﻫﺎي ،CKSELﻳﻚ ﺑﻮده و در ﻧﺘﻴﺠﻪ ﻣﻨﺒﻊ ﭘﻴﺶ ﻓﺮض ،اﺳﻴﻼﺗﻮر RCداﺧﻠﻲ ﻣﻲ ﺑﺎﺷﺪ.
-٧-
Page |8
www.eca.ir
ﻛﻼك ﺧﺎرﺟﻲ :ﺑﺮاي راه اﻧﺪازي وﺳﻴﻠﻪ ﺑﻮﺳﻴﻠﻪ ي ﻣﻨﺒﻊ ﻛﻼك ﺧﺎرﺟﻲ ﺑﺎﻳﺪ ﻣﻄﺎﺑﻖ ﺷـﻜﻞ زﻳـﺮ ﻳـﻚ ﭘـﺎﻟﺲ ﺑـﻪ ﭘـﻴﻦ
XTAL1اﻋﻤﺎل ﺷﻮد .ﺑﺮاي ﻗﺮار ﮔﺮﻓﺘﻦ در اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻳﺪ ﺗﻤﺎم ﺑﻴﺖ ﻫﺎي CKSELﭘﺮوﮔﺮام ﺷﺪه )ﺻﻔﺮ ﺷﻮﻧﺪ(
و ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﭘﺮوﮔﺮام ﻛﺮدن ﻓﻴﻮزﺑﻴﺖ CKOPTﻳﻚ ﺧﺎزن داﺧﻠﻲ ﺑﻪ ﻇﺮﻓﻴﺖ 36ﭘﻴﻜﻮﻓﺎراد را ﺑـﻴﻦ ورودي و
XTAL1
ﻛﻼك ﺧﺎرﺟﻲ
CKOPT
اﺳﻴﻼﺗﻮر RCﻛﺎﻟﻴﺒﺮه ﺷﺪه ي داﺧﻠﻲ :اﻳﻦ ﻣﻨﺒﻊ در ﻓﺮﻛﺎﻧﺲ ﻫﺎي 4 ،2 ،1و 8ﻣﮕﺎﻫﺮﺗﺰ ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷـﺪ و ﻣﻘـﺪار
آن در دﻣﺎي 25درﺟﻪ و وﻟﺘﺎژ 5وﻟﺖ ﻛﺎﻟﻴﺒﺮه ﺷﺪه اﺳﺖ ﻛﻪ در اﻳﻦ وﺿﻌﻴﺖ ﻣﻤﻜﻦ اﺳﺖ ﺗﺎ 3درﺻﺪ در ﻛﻼك اﻳﺠﺎد
ﺷﺪه وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ .ﻓﺮﻛﺎﻧﺲ ﻧﻮﺳﺎن ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﺗﻌﻴﻴﻦ ﺷﺪه و ﻣﻄـﺎﺑﻖ ﺟـﺪول زﻳـﺮ ﻣـﻲ
-٨-
Page |9
www.eca.ir
اﺳﻴﻼﺗﻮر RCﺧﺎرﺟﻲ :در ﻛﺎرﺑﺮدﻫﺎﻳﻲ ﻛﻪ دﻗﺖ ﻛﻼك اﻫﻤﻴﺖ زﻳﺎدي ﻧﺪارد ﻣـﻲ ﺗـﻮان از اﻳـﻦ ﻣﻨﺒـﻊ اﺳـﺘﻔﺎده ﻛـﺮد.
1
= fﺑﺪﺳﺖ ﻣﻲ آﻳﺪ .ﺣﺪاﻗﻞ ﻣﻘﺪار Cﺑﺮاﺑـﺮ 22 ﭘﻴﻜﺮﺑﻨﺪي ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﺑﻮده و ﻓﺮﻛﺎﻧﺲ ﻧﻮﺳﺎن از راﺑﻄﻪ ي
3 RC
ﭘﻴﻜﻮﻓﺎراد ﺑﻮده و در ﺻﻮرﺗﻲ ﻛﻪ CKOPTﭘﺮوﮔﺮام ﺷﻮد ﻣﻲ ﺗﻮان ﻣﻘﺪار 36ﭘﻴﻜﻮﻓﺎراد را ﻧﻴﺰ ﻟﺤﺎظ ﻧﻤﻮد.
R
XTAL1
C
CKOPT
اﻳﻦ ﻣﻨﺒﻊ ﻧﻮﺳﺎن ﻣﻲ ﺗﻮاﻧﺪ در ﭼﻬﺎر Modeﻛﺎري ﻋﻤﻞ ﻛﻨﺪ ﻛﻪ ﻫﺮ ﻛﺪام ﺑﺮاي ﻳﻚ ﺑﺎزه ي ﻓﺮﻛﺎﻧﺴﻲ ﺑﻬﻴﻨﻪ ﺷﺪه اﺳﺖ
اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ﻓﺮﻛﺎﻧﺲ ﭘﺎﻳﻴﻦ :اﻳﻦ ﻣﻨﺒﻊ ﻛﻼك ﻣﻲ ﺗﻮاﻧﺪ ﻛﺮﻳﺴﺘﺎل ﻫﺎي ﻓﺮﻛﺎﻧﺲ ﭘﺎﻳﻴﻦ ﻣﺜﻞ ﻛﺮﻳﺴﺘﺎل ﺳﺎﻋﺖ ﺑﺎ
ﻓﺮﻛﺎﻧﺲ 32768ﻫﺮﺗﺰ ﺑﺎﺷﺪ .ﺑﺎ دادن ﻣﻘﺪار 1001ﺑﻪ ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﻣﻨﺒﻊ ﻛﻼك ﻛﺮﻳﺴﺘﺎل ﺧﺎرﺟﻲ ﻓﺮﻛﺎﻧﺲ
-٩-
P a g e | 10
www.eca.ir
ﭘﺎﻳﻴﻦ اﻧﺘﺨﺎب ﺷﺪه و در اﻳﻦ وﺿﻌﻴﺖ ﭘﻴﻜﺮﺑﻨﺪي ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ .در ﺻﻮرت ﭘﺮوﮔﺮام ﻧﻤﻮدن CKOPT
36 pF
CKOPT
C1
XTAL1
XTAL Rf
XTAL2
C2
CKOPT
36 pF
ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ ﻳﺎ رزوﻧﺎﺗﻮر ﺳﺮاﻣﻴﻜﻲ :ﭘـﺒﻦ ﻫـﺎي XTAL1و XTAL2ﺑـﻪ ﺗﺮﺗﻴـﺐ ورودي و ﺧﺮوﺟـﻲ ﻳـﻚ
ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي واروﻧﮕﺮ ﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﻋﻨﻮان ﻳﻚ اﺳﻴﻼﺗﻮر On-chipﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﭘﻴﻜﺮﺑﻨﺪي ﺷﻮﻧﺪ.
- ١٠ -
P a g e | 11
www.eca.ir
C1
XTAL1
XTAL Rf
XTAL2
C2
• ﺑﻪ ﺟﺎي ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ ﻣﻲ ﺗﻮان از رزوﻧﺎﺗﻮر ﺳﺮاﻣﻴﻜﻲ اﺳﺘﻔﺎده ﻧﻤـﻮد ﻛـﻪ از دوام ﺑﻴﺸـﺘﺮي در ﻣﻘﺎﺑـﻞ ﺿـﺮﺑﻪ ﺑـﺮ
ﺧﻮردار اﺳﺖ و زﻣﺎن Startupﻛﻤﺘﺮي ﻧﻴﺰ دارد و اﻟﺒﺘﻪ ﻧﺴﺒﺖ ﺑﻪ ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ دﻗـﺖ ﻛﻤﺘـﺮي داﺷـﺘﻪ و ﭘﺎﻳـﺪاري
• در اﻳﻦ وﺿﻌﻴﺖ ﺧﺎزن ﻫﺎي 36ﭘﻴﻜﻮ ﻓﺎراد ﺣﺬف ﺷﺪه و ﻋﻤﻠﻜﺮد ﻓﻴﻮزﺑﻴﺖ CKOPTﻧﻴﺰ ﺗﻐﻴﻴﺮ ﻣـﻲ ﻛﻨـﺪ .ﺑـﺪﻳﻦ
ﺗﺮﺗﻴﺐ ﻛﻪ ﺑﺎ ﭘﺮوﮔﺮام ﺷﺪن اﻳﻦ ﺑﻴﺖ داﻣﻨﻪ ي ﺧﺮوﺟﻲ ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي واروﻧﮕﺮ اﻓـﺰاﻳﺶ ﻳﺎﻓﺘـﻪ و ﻣـﻲ ﺗـﻮان از ﭘـﻴﻦ
XTAL2ﺑﻪ ﻋﻨﻮان ﻛﻼك ﺑﺮاي ﻳﻚ وﺳﻴﻠﻪ ي دﻳﮕﺮ اﺳﺘﻔﺎده ﻧﻤﻮد .ﻫﻤﭽﻨﻴﻦ ﺑﺎ ﻓﻌﺎل ﻛﺮدن CKOPTدر ﻣﺤﻴﻂ ﻫﺎي
• ﭼﻨﺎﻧﭽﻪ از رزوﻧﺎﺗﻮر اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﺑﺮاي ﻓﺮﻛﺎﻧﺲ ﻫﺎي ﺑﺎﻻﺗﺮ از 8ﻣﮕﺎﻫﺮﺗﺰ ﺑﺎﻳﺪ CKOPTﭘﺮوﮔﺮام ﺷﻮد.
اﺳﻴﻼﺗﻮر ﻣﻲ ﺗﻮاﻧﺪ در ﺳﻪ وﺿﻌﻴﺖ ﻣﺘﻔﺎوت ﻧﻮﺳﺎن ﻛﻨﺪ ﻛﻪ ﻫﺮﻛﺪام ﺑﺮاي ﻳﻚ ﻣﺤﺪوده ي ﻓﺮﻛﺎﻧﺴﻲ ﺑﻬﻴﻨﻪ ﺷﺪه اﺳﺖ و
آن را ﻣﻲ ﺗﻮان ﺑﺎ ﻓﻴﻮز ﺑﻴﺖ ﻫﺎي CKSELﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﻧﺘﺨﺎب ﻧﻤﻮد.
- ١١ -
P a g e | 12
www.eca.ir
Áﺑﺎ ﻫﺮ ﻳﻚ از ﻣﻨﺎﺑﻊ ﻛﻼك اﻧﺘﺨﺎب ﺷﺪه ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي ،CKSELدو ﺑﻴﺖ ﺑﻪ ﻧﺎم ﻫﺎي ] SUT[1:0ﻧﻴﺰ
وﺟﻮد دارد ﻛﻪ از ﻃﺮﻳﻖ آن ﻣﻲ ﺗﻮان ﺣﺪاﻛﺜﺮ زﻣﺎن Start-upﻣﻨﺒﻊ ﻛﻼك را ﺑﻪ ﻣﻴﻜﺮو اﻋﻼم ﻧﻤﻮد .ﻣﻘﺪار اﻳﻦ ﺑﻴﺖ ﻫﺎ
ﺑﻪ ﻃﻮر ﭘﻴﺶ ﻓﺮض ﻣﺎﻛﺰﻳﻤﻢ زﻣﺎن Start-upرا در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮد و در ﺻﻮرﺗﻲ ﻛـﻪ ﻧﻴـﺎز اﺳـﺖ ﻣﻘـﺪار آن را ﺗﻐﻴﻴـﺮ
دﻫﻴﺪ ﻣﻄﺎﺑﻖ ﺟﺪاول ﻣﺮﺑﻮﻃﻪ در ﻓﺼﻞ System Clock and Clock Optionsدر Datatsheetﻋﻤﻞ ﻛﻨﻴﺪ.
ﺑﺎ Resetﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ،ﺗﻤﺎم رﺟﻴﺴﺘﺮﻫﺎي I/Oﺑﻪ ﻣﻘﺪار اوﻟﻴﻪ ﺷﺎن ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﻨﺪ و CPUﺷﺮوع ﺑﻪ اﺟﺮاي
دﺳﺘﻮراﻟﻌﻤﻞ ﻫﺎ از ﺑﺮدار Resetﺧﻮاﻫﺪ ﻛﺮد .در ﻗﻄﻌﻪ ي 5 Mega16ﻣﻨﺒﻊ Resetوﺟﻮد دارد ﻛﻪ ﻋﺒﺎرﺗﻨﺪ از:
- ١٢ -
P a g e | 13
www.eca.ir
ﻣﻨﻄﻖ Resetﻣﻄﺎﺑﻖ دﻳﺎﮔﺮام زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
- ١٣ -
P a g e | 14
www.eca.ir
:Power-on Resetزﻣﺎﻧﻲ ﻓﻌﺎل ﺧﻮاﻫﺪ ﻛﻪ وﻟﺘﺎژ Vccﻛﻤﺘﺮ از ﺣﺪ ﺗﻌﻴﻴﻦ ﺷﺪه ﺑﺎﺷﺪ .اﻳﻦ ﻣﻨﺒـﻊ ﺗﻀـﻤﻴﻦ .1
ﻣﻲ ﻛﻨﺪ ﻛﻪ وﺳﻴﻠﻪ در زﻣﺎن راه اﻧﺪازي Resetﻣﻲ ﺷﻮد .ﺑﺎ رﺳﻴﺪن وﻟﺘﺎژ ﺑﻪ ﺣﺪ آﺳﺘﺎﻧﻪ ،ﺷﻤﺎرﻧﺪه ي ﺗﺎﺧﻴﺮ راه اﻧـﺪازي
ﺷﺪه ﻛﻪ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﭼﻪ ﻣﺪت وﺳﻴﻠﻪ در وﺿﻌﻴﺖ Resetﺑﻤﺎﻧﺪ .دﻳﺎﮔﺮام زﻣﺎﻧﻲ زﻳﺮ ﺷﺮاﻳﻄﻲ را ﻧﺸﺎن ﻣﻲ دﻫـﺪ ﻛـﻪ
ﭘﻴﻦ RESETﺑﻪ Vccوﺻﻞ ﺷﺪه اﺳﺖ) .و ﻳﺎ آزاد ﺑﺎﺷﺪ ﭼﻮن اﻳﻦ ﭘﻴﻦ از داﺧﻞ Pull-upﺷﺪه اﺳﺖ(.
و ﻧﻤﻮدار زﻳﺮ ﺷﺮاﻳﻄﻲ اﺳﺖ ﻛﻪ ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﭘﻴﻦ Resetﺗﺎﺑﻊ Vccﻧﻤﻲ ﺑﺎﺷﺪ:
- ١٤ -
P a g e | 15
www.eca.ir
:External Reset .2اﻳﻦ Resetﺑﻮﺳﻴﻠﻪ ي ﻳﻚ ﭘﺎﻟﺲ ﺑﺎ ﺳﻄﺢ ﺻﻔﺮ ﻣﻨﻄﻘﻲ روي ﭘﻴﻦ RESETاﻳﺠﺎد ﺷﺪه و
ﺣﺪاﻗﻞ ﻋﺮض آن 1,5ﻣﻴﻜﺮو ﺛﺎﻧﻴﻪ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺎ رﺳﻴﺪن وﻟﺘﺎژ اﻳﻦ ﭘﻴﻦ ﺑﻪ ﻣﻘﺪار آﺳﺘﺎﻧﻪ در ﻟﺒﻪ ﺑﺎﻻ روﻧـﺪه ،ﺷـﻤﺎرﻧﺪه ي
ﺗﺎﺧﻴﺮ ﺷﺮوع ﺑﻪ ﻛﺎر ﻛﺮده و ﭘﺲ از اﺗﻤﺎم زﻣﺎن Time-outﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻛﺎر ﺧﻮد را ﺷﺮوع ﺧﻮاﻫﺪ ﻛﺮد.
داﺧﻠﻲ ﺑﻮده ﻛﻪ ﭘﻴﻮﺳﺘﻪ ﻣﻘﺪار وﻟﺘﺎژ Vccرا ﺑﺎ ﻳﻚ ﻣﻘﺪار ﺛﺎﺑﺖ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻣﻘﺪار ﺛﺎﺑﺖ ﺑﺮاﺑﺮ 2,7وﻟﺖ ﺑـﻮده
و در ﺻﻮرﺗﻲ ﻛﻪ ﻓﻴﻮزﺑﻴﺖ BODLEVELﭘﺮوﮔﺮام ﺷﻮد ﺑﻪ 4,0وﻟﺖ اﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ .ﺑﺎ ﻛﻤﺘﺮ ﺷﺪن وﻟﺘـﺎژ ﺗﻐﺬﻳـﻪ
از اﻳﻦ ﻣﻘﺪار ﺛﺎﺑﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ وارد ﺣﺎﻟﺖ Resetﺷﺪه و ﺑﺎ ﻋﺎدي ﺷﺪن وﻟﺘﺎژ ،ﭘـﺲ از اﺗﻤـﺎم ﺗـﺎﺧﻴﺮ ﺑـﻪ وﺿـﻌﻴﺖ
ﻋﺎدي ﺑﺎز ﻣﻲ ﮔﺮدد .ﺑﺮاي ﺣﻔﺎﻇﺖ در ﺑﺮاﺑﺮ Spikeﻣﻘﺪار آﺳﺘﺎﻧﻪ داراي ﭘﺴـﻤﺎﻧﺪ ﺑـﻮده و در ﻧﺘﻴﺠـﻪ داراي دو ﻣﻘـﺪار
- ١٥ -
P a g e | 16
www.eca.ir
ﻣﺜﺒﺖ و ﻣﻨﻔﻲ ﻣﻲ ﺑﺎﺷـﺪ ﻛـﻪ ﺑـﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﻣﻘـﺎدﻳﺮ ﻣﻮﺟـﻮد در ﺟـﺪول از راﺑﻄـﻪ ي VBOT+ = VBOT + VHYST / 2و
Áﻣـﺪار Brown-out Detectionدر ﺣﺎﻟـﺖ ﻋـﺎدي ﻏﻴـﺮ ﻓﻌـﺎل ﺑـﻮده و ﺑـﺮاي راه اﻧـﺪازي آن ﺑﺎﻳـﺪ ﻓﻴﻮزﺑﻴـﺖ
:Watchdog Reset .4ﺑﺎ اﺗﻤﺎم زﻣﺎن ﺗﺎﻳﻤﺮ ،Watchdogاﻳﻦ ﺗﺎﻳﻤﺮ ﻳﻚ ﭘﺎﻟﺲ ﺑـﻪ ﻋـﺮض ﻳـﻚ ﺳـﻴﻜﻞ اﻳﺠـﺎد
ﺧﻮاﻫﺪ ﻛﺮد .در ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي اﻳﻦ ﭘﺎﻟﺲ ،ﺗﺎﻳﻤﺮ ﺗﺎﺧﻴﺮ ﺷﺮوع ﺑﻪ ﺷﻤﺎرش زﻣﺎن ﺗﺎﺧﻴﺮ ﻛﺮده و ﭘـﺲ ازاﺗﻤـﺎم آن
- ١٦ -
P a g e | 17
www.eca.ir
MCUCSR 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ JTD ISC2 - JTRF WDRF BORF EXTRF PORF
ﺷﺪهCPU ﺑﺎﻋﺚ راه اﻧﺪازي ﻣﺠﺪدReset اﻳﻦ رﺟﻴﺴﺘﺮ ﻣﺤﺘﻮي اﻃﻼﻋﺎﺗﻲ اﺳﺖ ﻛﻪ ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻛﺪاﻣﻴﻚ از ﻣﻨﺎﺑﻊ
Reset ﭘﺮﭼﻢ را ﭘـﺎك ﻛﻨـﺪ ﺗـﺎ در ﺻـﻮرت، ﻧﺮم اﻓﺰار ﭘﺲ از ﺧﻮاﻧﺪن ﻫﺮ ﺑﻴﺖ ﺑﺎﻳﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﺻﻔﺮ ﺑﺮ روي آن.اﺳﺖ
- ١٧ -
P a g e | 18
www.eca.ir
• ﻫﺮ ﺑﺮﻧﺎﻣﻪ ي Cﺣﺪاﻗﻞ ﻳﻚ ﺗﺎﺑﻊ )( mainدارد) .اﻳﻦ اوﻟﻴﻦ ﺗﺎﺑﻊ اﺟﺮاﻳﻲ اﺳﺖ(.
ﺗﻌﺎرﻳﻒ ﻛﻠﻲ
اﻟﮕﻮي ﺗﻮاﺑﻊ
)(void main
{
{)while(1
.
.
.
}
}
• ﺑﺮﻧﺎﻣﻪ ي ﺳﺎده ي زﻳﺮ رﺷﺘﻪ ي Hello Worldرا ﺑﻪ ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد ارﺳﺎل ﻣﻲ ﻛﻨﺪ.
- ١٨ -
P a g e | 19
www.eca.ir
>#include<stdio.h
)(void main
{
;)"!printf("Hello World
;)while(1
}
• از " " ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن اﺑﺘﺪا و اﻧﺘﻬﺎي ﻳﻚ رﺷﺘﻪ ي ﻣﺘﻨﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.
• ﺷﻨﺎﺳﻪ ﻫﺎ ﻧﻤﻲ ﺗﻮاﻧﺪ از ﻛﻠﻤﺎت رزرو ﺷﺪه ﺑﺎﺷﻨﺪ و ﻫﻤﭽﻨﻴﻦ ﻧﻤﻲ ﺗﻮاﻧﻨﺪ ﺑﺎ ﻳﻚ ﻛﺎراﻛﺘﺮ ﻋﺪدي ﺷﺮوع ﺷﻮد و ﻃﻮل
• Cﻳﻚ زﺑﺎن Case Sensitiveاﺳﺖ و ﺑﻴﻦ ﺣﺮوف ﻛﻮﭼﻚ و ﺑﺰرگ ﺗﻔﺎوت ﻗﺎﺋﻞ ﻣﻲ ﺷﻮد.
• ﻛﻠﻤﺎت رزرو ﺷﺪه ﺣﺘﻤﺎ ﺑﺎﻳﺪ ﺑﺎ ﺣﺮف ﻛﻮﭼﻚ اﺳﺘﻔﺎده ﺷﻮﻧﺪ) .ﻣﺜﻞ …(if, char, while,
- ١٩ -
P a g e | 20
www.eca.ir
ﻣﺘﻐﻴﺮ ﻫﺎ و ﺛﻮاﺑﺖ
; char a ﻣﺜﺎل: ; ﻧﺎم ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮ • ﻓﺮم ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ:
;int b@0xA3 ﻣﺜﺎل: • ﺑﺮاي ﺗﻌﻴﻴﻦ ﻣﺤﻞ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ از ﻋﻤﻠﮕﺮ @ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.
• ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ در ﺣﺎﻓﻈﻪ ي EEPROMاز ﻛﻠﻤﻪ ي ﻛﻠﻴﺪي eepromﻗﺒﻞ از ﻧﺎم ﻣﺘﻐﻴﺮ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.
- ٢٠ -
P a g e | 21
www.eca.ir
;'char s = 'a ﻣﺜﺎل: • ﻣﻲ ﺗﻮان در زﻣﺎن ﺗﻌﺮﻳﻒ ﺑﻪ ﻣﺘﻐﻴﺮ ﻣﻘﺪار اوﻟﻴﻪ داد.
; const float pi = 3.14 • ﺗﻌﺮﻳﻒ ﺛﺎﺑﺖ ﺑﺎ ﻛﻠﻤﻪ ي ﻛﻠﻴﺪي constﻳﺎ flashاﻧﺠﺎم ﻣﻲ ﺷﻮد .ﻣﺜﺎل:
• ﺑﺎ رﻫﻨﻤﻮد #defineﻣﻲ ﺗﻮان ﻣﺎﻛﺮو ﺗﻌﺮﻳﻒ ﻧﻤﻮد ،در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘﺪاري ﻛﻪ ﺑﺮاي ﺛﺎﺑﺖ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد ﻧﻮع
داده را ﺗﻌﻴﻴﻦ ﻛﺮده و ﻣﻘﺎدﻳﺮ ﺗﻌﺮﻳﻒ ﺷﺪه ،ﺗﻮﺳﻂ ﭘﻴﺶ ﭘﺮدازﻧﺪه ﺑﺎ ﻣﻘﺪار ﺛﺎﺑﺖ ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲ ﺷﻮد.
- ٢١ -
P a g e | 22
www.eca.ir
ﻋﻤﻠﮕﺮﻫﺎي ﻳﻜﺎﻧﻲ
- ٢٢ -
P a g e | 23
www.eca.ir
ﻋﻤﻠﮕﺮﻫﺎي ﻣﻨﻄﻘﻲ
ﻋﻤﻠﮕﺮﻫﺎي اﻧﺘﺴﺎب
اﮔﺮ valueﻣﻘﺪار
yﻣﻲ ﺷﻮد.
- ٢٣ -
P a g e | 24
www.eca.ir
آراﻳﻪ ﻫﺎ
ﻓﺮم ﺗﻌﺮﻳﻒ آراﻳﻪ ﻫﺎي دو ﺑﻌﺪي]; :ﻋﺪاد ﻋﻨﺎﺻﺮ ﺳﺘﻮن[]ﺗﻌﺪاد ﻋﻨﺎﺻﺮ ﺳﻄﺮ[اﺳﻢ ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮﻫﺎ •
رﺷﺘﻪ ﻫﺎ
- ٢٤ -
P a g e | 25
www.eca.ir
cدﺳﺘﻮر :goto
)ﺷﺮط(if
{
;دﺳﺘﻮرات1
}
else
{
;دﺳﺘﻮرات 2
}
در ﺻﻮرﺗﻲ ﻛﻪ دﺳﺘﻮرات ﻳﻚ ﺧﻄﻲ ﺑﺎﺷﻨﺪ ﻣﻲ ﺗﻮان braceرا ﺣﺬف ﻧﻤﻮد. 9
ﻣﺜﺎل:
>#include<stdio.h
{)(void main
- ٢٥ -
P a g e | 26
www.eca.ir
int a;
if(a= =0)
printf("You've entered zero\n");
else if(a>0)
printf("You've entered a positive number\n");
else
printf("You've entered a negative number\n");
}
switch()ﻣﻘﺪار
{
case 1ﻣﻘﺪار:
1;دﺳﺘﻮرات
break;
case 2ﻣﻘﺪار:
2;دﺳﺘﻮرات
break;
- ٢٦ -
P a g e | 27
www.eca.ir
.
.
default:
n ;دﺳﺘﻮرات
}
:ﻣﺜﺎل
#include<stdio.h>
void main(){
int a;
printf("Enter Month of your birth: ");
scanf("%d",&a);
switch(a){
case 1:
case 2:
case 3: printf("You've born is spring\n");
break;
case 4:
case 5:
case 6: printf("You've born is summer\n");
break;
case 7:
case 8:
case 9: printf("You've born is autumn\n");
- ٢٧ -
P a g e | 28
www.eca.ir
break;
case 10:
case 11:
case 12: printf("You've born is winter\n");
break;
:While ﺳﺎﺧﺘﺎرc
while()ﺷﺮط
{
;دﺳﺘﻮرات
:ﻣﺜﺎل
#include<stdio.h>
void main(){
- ٢٨ -
P a g e | 29
www.eca.ir
;char a
;)"printf("Enter E to exit\n
;)(while(a != 'E') a=getchar
}
dﺳﺎﺧﺘﺎر :Do/While
{do
;دﺳﺘﻮرات
)ﺷﺮط(} while
9در ﺳﺎﺧﺘﺎر Do/Whileﺑﺮ ﺧﻼف Whileﺷﺮط در اﻧﺘﻬﺎي ﺣﻠﻘﻪ آزﻣﺎﻳﺶ ﻣﻲ ﺷﻮد ،ﺑﻨﺎﺑﺮاﻳﻦ دﺳﺘﻮرات داﺧﻞ
{
;دﺳﺘﻮرات
}
- ٢٩ -
P a g e | 30
www.eca.ir
:ﻣﺜﺎل
#include<stdio.h>
void main(){
int a,i;
long int fact=1;
if(a<0)
printf("Error! You must Enter a positive number\n");
else if(a==0)
printf("Factorial of 1 is 1\n");
else{
for(i=1;i<=a;i++)
fact*=i;
printf("Factorial of %d is %d\n",a,fact);
}
}
- ٣٠ -
P a g e | 31
www.eca.ir
دﺳﺘﻮر breakﺑﺎﻋﺚ ﺧﺮوج ﺑﺪون ﺷﺮط از ﻫﺮ ﺣﻠﻘﻪ اي ﻣﻲ ﺷﻮد. 9
دﺳﺘﻮر continueﺑﺎﻋﺚ ﻣﻲ ﺷﻮد اﺟﺮاي اداﻣﻪ دﺳﺘﻮرات ﻣﺘﻮﻗﻒ ﺷﺪه و ﺣﻠﻘﻪ از اﺑﺘﺪا آﻏﺎز ﺷﻮد. 9
ﺗﻮاﺑﻊ
{
ﻣﺘﻐﻴﺮﻫﺎي ﻣﺤﻠﻲ
دﺳﺘﻮرات ﺗﺎﺑﻊ
}
= ﺗﻮاﺑﻊ داﺧﻞ ﻳﻜﺪﻳﮕﺮ ﻗﺎﺑﻞ ﺗﻌﺮﻳﻒ ﻧﻤﻲ ﺑﺎﺷﻨﺪ و ﺟﺪا از ﻫﻢ ﺑﺎﻳﺪ ﺗﻌﺮﻳﻒ ﮔﺮدﻧﺪ.
ﻣﺜﺎل:
>#include <stdio.h
{)(void main
- ٣١ -
P a g e | 32
www.eca.ir
int a;
:ﻣﺜﺎل
#include<stdio.h>
void main(){
int a,b;
- ٣٢ -
P a g e | 33
www.eca.ir
}
- ٣٣ -
P a g e | 34
www.eca.ir
/*****************************************************
Project : LED Flasher
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/
#include<mega16.h>
#include<delay.h>
#define xtal 1000000
int i;
DDRA = 0xFF; //. ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ1 ﺑﺮاي درك ﻋﻤﻠﻜﺮد اﻳﻦ ﻋﺒﺎرت ﺑﻪ ﭘﻴﻮﺳﺖ
while(1)
{
- ٣٤ -
P a g e | 35
www.eca.ir
- ٣٥ -
P a g e | 36
www.eca.ir
/*****************************************************
Project : Key Counter
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/
#include <mega16.h>
#define xtal 4000000
void main(void)
{
DDRD = 0xFF;
PORTD = digits[0];
DDRC = 0x00;
PORTC = 0xFF;
while(1)
{
if(key==0)
{
if(key!=p_state)
{
if(i==15)
{
i=0;
PORTD=digits[i];
}
else
i++;
PORTD = digits[i];
p_state=0;
};
}
else
p_state=1;
}
- ٣٧ -
P a g e | 38
www.eca.ir
ﺟﺪول زﻳﺮ وﺿﻌﻴﺖ ﺳﮕﻤﻨﺖ ﻫﺎي 7-Segﻛﺎﺗﺪ ﻣﺸﺘﺮك را ﻧﺸﺎن ﻣﻲ دﻫﺪ) .ﺑﺮاي ﻧﻮع آﻧﺪ ﻣﺸﺘﺮك اﻋﺪادرا ﻣﻜﻤﻞ
ﻛﻨﻴﺪ(.
ﻛﺎراﻛﺘﺮ Dp g f e d c b a HEX
0 0 0 1 1 1 1 1 1 0x3F
1 0 0 0 0 0 1 1 0 0x06
2 0 1 0 1 1 0 1 1 0x5B
3 0 1 0 0 1 1 1 1 0x4F
4 0 1 1 0 0 1 1 0 0x66
5 0 1 1 0 1 1 0 1 0x6D
6 0 1 1 1 1 1 0 1 0x7D
7 0 0 0 0 0 1 1 1 0x07
8 0 1 1 1 1 1 1 1 0x7F
9 0 1 1 0 1 1 1 1 0x6F
A 0 1 1 1 0 1 1 1 0x77
b 0 1 1 1 1 1 0 0 0x7C
- ٣٨ -
P a g e | 39
www.eca.ir
C 0 0 1 1 1 0 0 1 0x39
d 0 1 0 1 1 1 1 0 0x5E
E 0 1 1 1 1 0 0 1 0x79
F 0 1 1 1 0 0 0 1 0x71
- ٣٩ -
P a g e | 40
www.eca.ir
/*****************************************************
Project : LCD Interfacing
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/
#include <stdio.h>
#include <mega16.h>
#include <delay.h>
#include <lcd.h>
#define xtal 4000000
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
void main(void)
{
char buffer[10];
unsigned char w;
PORTB=0xFF;
DDRB=0x00;
- ٤٠ -
P a g e | 41
www.eca.ir
lcd_init(16);
lcd_clear();
while (1){
w = ~PINB;
if(w!=0x00)
{
lcd_clear();
lcd_gotoxy(0,0);
sprintf(buffer,"Number=%d",w);
lcd_puts(buffer);
delay_ms(100);
}
else
{
lcd_clear();
lcd_putsf("Number=0");
delay_ms(100);
}
}
}
- ٤١ -
P a g e | 42
www.eca.ir
- ٤٢ -
P a g e | 43
www.eca.ir
/*****************************************************
Project : Keypad Scan
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/
#include <mega16.h>
#include <delay.h>
void main(void)
{
DDRB = 0xff;
PORTB = 0xff;
while(1)
{
DDRC = 0x0f;
- ٤٣ -
P a g e | 44
www.eca.ir
PORTC = 0xf0;
delay_us(5);
key = PINC;
DDRC = 0xf0;
PORTC = 0x0f;
delay_us(5);
key = key | PINC;
delay_ms(10);
if (key != 0xff)
{
for (butnum=0; butnum<16; butnum++)
{
if (keytbl[butnum]==key) break;
}
if (butnum==16) butnum=0;
else butnum++;
}
else butnum=0;
PORTB = ~ butnum ;
}
}
- ٤٤ -
P a g e | 45
www.eca.ir
- ٤٥ -
P a g e | 46
www.eca.ir
/*****************************************************
Project : Dot Matrix Display
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/
#include <mega16.h>
#include <delay.h>
#define xtal 4000000
unsigned char k;
flash unsigned char arr[8]={0x18, 0x3C, 0x66, 0x66, 0x7E,
0x66, 0x66, 0x00};
void main(void)
{
DDRA=0xFF;
DDRB=0xFF;
while (1){
for(k=0;k<=7;k++){
PORTA=arr[k];
PORTB=~(1<<k);
delay_us(100);
- ٤٦ -
P a g e | 47
www.eca.ir
PORTB=0xFF;
}
}
}
- ٤٧ -
P a g e | 48
www.eca.ir
. ﻣﻮرد از آن ﻫﺎ وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﻣﻲ ﺑﺎﺷﻨﺪ3 ﻣﻨﺒﻊ وﻗﻔﻪ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ21 دارايATmega16 ﻗﻄﻌﻪ ي •
ﻧﺎم در
ﺷﻤﺎره آدرس ﻣﻨﺒﻊ وﻗﻔﻪ ﺗﻮﺿﻴﺢ
CodeVision
External Pin, Power-on Reset, Brown-out Reset,
1 $000 RESET
Watchdog Reset, and JTAG AVR Reset
2 EXT_INT0 $002 INT0 External Interrupt Request 0
- ٤٨ -
P a g e | 49
www.eca.ir
19 EXT_INT2 $024 INT2 External Interrupt Request 2
• آدرس ﻫﺎي ﭘﺎﻳﻴﻦ ﺗﺮ داراي اوﻟﻮﻳﺖ ﺑﺎﻻﺗﺮي ﻣﻲ ﺑﺎﺷﻨﺪ و در ﺻﻮرت درﺧﻮاﺳﺖ ﻫﻤﺰﻣﺎن دو ﻳﺎ ﭼﻨﺪ وﻗﻔﻪ اﺑﺘﺪا ﺑﻪ
اوﻟﻮﻳﺖ ﺑﺎﻻﺗﺮ ﭘﺎﺳﺦ داده ﻣﻲ ﺷﻮد و ﭘﺲ از آن ﺑﻪ ﺑﻘﻴﻪ ي وﻗﻔﻪ ﻫﺎ ﺑﺮ ﺣﺴﺐ اوﻟﻮﻳﺖ رﺳﻴﺪﮔﻲ ﻣﻲ ﺷﻮد.
ﺑﺮاي ﻓﻌﺎل ﻛﺮدن ﻫﺮ ﻳﻚ از وﻗﻔﻪ ﻫﺎ ﺑﺎﻳﺪ اﺑﺘﺪا ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ را ﺑﺎ دﺳﺘﻮر اﺳﻤﺒﻠﺮ SEIﻳﺎ ﻣﻘﺪار دﻫﻲ
SREG I
• ﺑﺎ روﻳﺪاد ﻫﺮ وﻗﻔﻪ ي ﺧﺎرﺟﻲ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﺷﺪه و در ﻧﺘﻴﺠﻪ ﺗﻤﺎم وﻗﻔﻪ ﻫﺎي دﻳﮕﺮ ﻏﻴﺮ ﻓﻌﺎل ﻣـﻲ ﺷـﻮﻧﺪ در
اﻳﻦ ﺣﺎﻟﺖ ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ آن را ﻣﺠﺪدا ﻓﻌﺎل ﻛﻨﺪ و ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﻫـﺎي
ﺑﺮاي اﺳﺘﻔﺎده از ﻫﺮﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ ﺑﺎﻳﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ﻣﺮﺑﻮﻃﻪ در رﺟﻴﺴﺘﺮ GICRآن را ﻓﻌﺎل ﻧﻤﻮد:
- ٤٩ -
P a g e | 50
www.eca.ir
• وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ 1،0و 2ﺑﻪ ﺗﺮﺗﻴﺐ از ﭘﻴﻦ ﻫﺎي PD3 ،PD2و PB2ﺗﺮﻳﮕﺮ ﻣﻲ ﺷﻮﻧﺪ.
ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن ﻫﺮﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ 0و 1ﺑﻮﺳﻴﻠﻪ ي ﭼﻬﺎرﺑﻴﺖ اول رﺟﻴﺴﺘﺮ MCUCRﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
- ٥٠ -
P a g e | 51
www.eca.ir
ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن وﻗﻔﻪ ي 2ﺧﺎرﺟﻲ ﺑﻮﺳﻴﻠﻪ ﺑﻴﺖ 6از رﺟﻴﺴﺘﺮ MCUCSRﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
MCUCSR ISC2
• وﻗﻔﻪ ي 2ﺧﺎرﺟﻲ ﺑﺮ ﺧﻼف وﻗﻔـﻪ ي 0و 1ﺗﻨﻬـﺎ در دو ﺣﺎﻟـﺖ ﻟﺒـﻪ ي ﺑـﺎﻻ روﻧـﺪه و ﭘـﺎﻳﻴﻦ روﻧـﺪه ﻗﺎﺑـﻞ
ﭘﻴﻜﺮﺑﻨﺪي اﺳﺖ .ﻧﻮﺷﺘﻦ ﺻﻔﺮ در ISC2ﺑﺎﻋﺚ ﺗﺮﻳﮕﺮ ﺷﺪن اﻳﻦ وﻗﻔﻪ ﺑﺎ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧـﺪه و ﻧﻮﺷـﺘﻦ ﻳـﻚ
ﻫﺮ ﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ داراي ﻳﻚ ﺑﻴﺖ ﭘﺮﭼﻢ ﻫﺴﺘﻨﺪ ﻛﻪ در ﺻﻮرت ﺗﺮﻳﮕﺮ ﺷﺪن از ﭘـﻴﻦ وﻗﻔـﻪ ي ﺧـﺎرﺟﻲ و
ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻣﺮﺑﻮﻃﻪ در رﺟﻴﺴﺘﺮ GICRو ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ) ،(Iﻋﻼوه ﺑﺮ ﻳﻚ ﺷﺪن ﭘـﺮﭼﻢ ،ﻣـﻲ
ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﭘﺲ از اﺟﺮاي ISRﭘﺮﭼﻢ آن وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﭘﺎك ﻣـﻲ
ﺷﻮد.
- ٥١ -
P a g e | 52
www.eca.ir
interrupt [ ]ﺷﻤﺎره ي ﺑﺮدار وﻗﻔﻪvoid ( ﻧﺎم روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪvoid)
{
ﺑﺮﻧﺎﻣﻪ ي ﺳﺮوﻳﺲ وﻗﻔﻪ
ﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺗﻮان از ﻧﺎم ﻣﻌﺎدل آن )ﺟﺪول21 ﺗﺎ2 ﻋﺪدي ﺑﻴﻦATMEGA16 ﺷﻤﺎره ي ﺑﺮدار وﻗﻔﻪ ي در ﻣﻮرد
:1ﻣﺜﺎل
#include <mega16.h>
#include <delay.h>
void main(void)
{
DDRB=0xFF;
PORTB=0x00;
DDRA=0xFF;
PORTA=0x00;
DDRD=0x00;
- ٥٢ -
P a g e | 53
www.eca.ir
PORTD=0xFF;
GICR=0b01000000; // INT0: On
MCUCR=0b00000010; // INT0 Mode: Falling Edge
while (1)
{
PORTB=0x01;
delay_ms(500);
PORTB=0x00;
delay_ms(500);
};
}
- ٥٣ -
P a g e | 54
www.eca.ir
• اﮔﺮ وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﺑﻪ ﺻﻮرت ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ ﺗﻨﻈﻴﻢ ﺷﺪه ﺑﺎﺷﺪ و در ﺣﺎل اﺟﺮاي ﻳﻜﻲ از وﻗﻔﻪ ﻫﺎ ،وﻗﻔﻪ ي
دﻳﮕﺮي اﺗﻔﺎق ﺑﻴﻔﺘﺪ ،ﭘﺲ از ﺧﺮوج از ISRوﻗﻔﻪ ي ﺟﺎري ﺑﻪ آن وﻗﻔﻪ ﻫﺎ ﺑﺮﺣﺴﺐ اوﻟﻮﻳﺖ ﺷﺎن ﭘﺎﺳﺦ داده
ﺧﻮاﻫﺪ ﺷﺪ.
• در ﺻﻮرﺗﻲ ﻛﻪ ﭘﻴﻦ وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ ﺗﻌﺮﻳﻒ ﺷﻮد ،آﻧﭽﻪ روي ﭘﻮرت ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد ﻣﻲ ﺗﻮاﻧﺪ
ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮان وﻗﻔﻪ ي ﻧﺮم اﻓﺰاري اﻳﺠﺎد ﻛﺮد.
• وﻗﻔﻪ ﻫﺎي ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ در ﭘﻴﻦ INT0و INT1و ﻫﻤﭽﻨﻴﻦ وﻗﻔـﻪ ي ﺣﺴـﺎس ﺑـﻪ ﻟﺒـﻪ در INT2ﺑـﻪ
ﺻﻮرت آﺳﻨﻜﺮون ﺗﺸﺨﻴﺺ داده ﻣﻲ ﺷﻮﻧﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮان از آن ﻫﺎ ﺑﺮاي ﺧﺎرج ﻛﺮدن ﻣﻴﻜـﺮو از ﻫﻤـﻪ ي
Modeﻫﺎي ﻛﻢ ﻣﺼﺮف اﺳﺘﻔﺎده ﻧﻤﻮد .ﺣﺪاﻗﻞ ﻋﺮض ﭘﺎﻟﺲ در اﻳﻦ ﺣﺎﻟﺖ 50ﻧﺎﻧﻮ ﺛﺎﻧﻴﻪ ﻣـﻲ ﺑﺎﺷـﺪ و ﺑـﺮاي
• ﻛﺎﻣﭙﺎﻳﻠﺮ CodeVisionﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓـﺮض SREGو رﺟﻴﺴـﺘﺮﻫﺎﻳﻲ CPUرا ﻛـﻪ ﻣﻤﻜـﻦ اﺳـﺖ در
ISRﺗﻐﻴﻴﺮ ﭘﻴﺪا ﻛﻨﻨﺪ ،ﻗﺒﻞ از اﺟﺮاي روﺗﻴﻦ ﺳـﺮوﻳﺲ وﻗﻔـﻪ در Stackذﺧﻴـﺮه ) (PUSHﻛـﺮده و ﭘـﺲ از
ﺑﺎزﮔﺸﺖ از ISRآن ﻫﺎ را ﺑﺎزﻳﺎﺑﻲ ) (POPﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن اﻳـﻦ ﻗﺎﺑﻠﻴـﺖ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻗﺒـﻞ از
- ٥٤ -
P a g e | 55
www.eca.ir
/*****************************************************
Project : Zero Cross Detector
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/
#include <mega16.h>
#include <delay.h>
#define xtal 4000000
void main(void)
{
DDRA=0xFF;
PORTA=0x00;
DDRD=0x00;
PORTD=0xFF;
GICR=0b01000000; // INT0: On
MCUCR=0b00000011; // INT0 Mode: Rising Edge
- ٥٥ -
P a g e | 56
www.eca.ir
while (1);
}
- ٥٦ -
P a g e | 57
www.eca.ir
- ٥٧ -
P a g e | 58
www.eca.ir
ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﺻﻔﺮ
ﺗﺎﻳﻤﺮ /ﻛﺎﻧﺘﺮ ﺻﻔﺮ ﻳﻚ ﺗﺎﻳﻤﺮ 8ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﺪ ﻛـﻪ داراي ﭼﻬـﺎر Modeﻛـﺎري Fast PWM ،CTC ،Normalو
Correct PWM Phaseﻣﻲ ﺑﺎﺷﺪ .ﭘﻴﻦ T0ﺑﻪ ﻋﻨﻮان ورودي ﻛﺎﻧﺘﺮ و ﭘـﻴﻦ OC0ﺧﺮوﺟـﻲ ﺑﺨـﺶ ﻣﻘﺎﻳﺴـﻪ ي
ﺗﺎﻳﻤﺮ ﻣﻲ ﺑﺎﺷﺪ .اﻳﻦ ﺗﺎﻳﻤﺮ داراي ﺳﻪ رﺟﻴﺴﺘﺮ ﺑﻪ ﻧﺎم ﻫﺎي TCNT0 ،TCCR0و OCR0ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻪ ﺗﺮﺗﻴـﺐ
ﺟﻬﺖ ﭘﻴﻜﺮﺑﻨﺪي ﺗﺎﻳﻤﺮ ،ﻣﻘﺪار ﺷﻤﺎرﻧﺪه و ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ اﺳﺘﻔﺎده ﻣـﻲ ﺷـﻮﻧﺪ .ﻫﻤﭽﻨـﻴﻦ اﻳـﻦ ﺗـﺎﻳﻤﺮ در رﺟﻴﺴـﺘﺮﻫﺎي
TIFRو TIMSKﻛﻪ ﺑﻪ ﺗﺮﺗﻴﺐ رﺟﻴﺴﺘﺮﻫﺎي ﭘﺮﭼﻢ و وﻗﻔﻪ ﺗﺎﻳﻤﺮ ﻣﻲ ﺑﺎﺷﻨﺪ ﺑﺎ دﻳﮕﺮ ﺗﺎﻳﻤﺮﻫﺎ ﻣﺸﺘﺮك ﻣﻲ ﺑﺎﺷﺪ.
ﻣﻬﻢ ﺗﺮﻳﻦ رﺟﻴﺴﺘﺮ ﺗﺎﻳﻤﺮ TTCR0ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻴﺖ ﻫﺎي Clock Selectﺟﻬﺖ اﻧﺘﺨﺎب ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ و ﺑﻴﺖ
ﻫﺎي Wave Generation Modeﺑﺮاي ﺗﻨﻈﻴﻢ Modeﻛﺎري ﺗﺎﻳﻤﺮ و ﺑﻴﺖ ﻫﺎي Compare Match Output
Modeﭘﻴﻜﺮﺑﻨﺪي ﭘﻴﻦ OC0را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ .ﻋﻤﻠﻜﺮد ﺑﻴﺖ FOC0ﻧﻴﺰ ﺑﺮرﺳﻲ ﺧﻮاﻫﺪ ﺷﺪ.
Modeﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺑﻴﺖ ﻫﺎي WGM01و WGM00ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
- ٥٨ -
P a g e | 59
www.eca.ir
0 0 0 Normal
1 0 1 PWM, Phase Correct
Clear Timer on Compare Match
2 1 0
(CTC)
3 1 1 Fast PWM
Noramal Mode c
: TIMER0 رﺟﻴﺴﺘﺮﻫﺎي
TCCR0 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
ﺳﻄﺢ ﻣﻨﻄﻘﻲ 0 0 0 0 0 X X X
Clock ﻣﺸﺘﺮك ﺑﻮده وﺿﻌﻴﺖ ﻣﻨﺒﻊ ﻛﻼك ﺑﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﺑﻴـﺖ ﻫـﺎيPrescaler ﻛﺎﻧﺘﺮ ﺻﻔﺮ و ﻳﻚ داراي ﻳﻚ/ﺗﺎﻳﻤﺮ
: ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮدSelect
- ٥٩ -
P a g e | 60
www.eca.ir
ﺳﻄﺢ ﻣﻨﻄﻘﻲ 0 0 0 0 0 0 0 X
- ٦٠ -
P a g e | 61
www.eca.ir
#include<mega16.h>
#define xtal 8000000
void delay()
{
TCCR0=0B00000010; // Timer Clock = CLK/8
while(!TIFR&0x01); // Wait Until Overflow
TIFR=TIFR|0B00000001; // Clear TOV0
TCCR0=0x00; // Stop Timer0
}
void main()
{
DDRA=0xFF;
PORTA=0x00;
TCCR0=0x00;
TCNT0=0x00;
while(1){
PORTA.0=1;
delay();
PORTA.0=0;
delay();
}
- ٦١ -
P a g e | 62
www.eca.ir
void delay()
{
TCNT0=0x38; //TCNT=55
TCCR0=0B00000010;
while(!TIFR&0x01);
TIFR=TIFR|0B00000001;
TCCR0=0x00;
}
در رﺟﻴﺴﺘﺮTOIE2 ﻳﺎTOIE0 ( ﻓﻌﺎل ﺑﻮده و ﺑﻴﺖ ﻫﺎيI) در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ 9
: از ﺳﺮرﻳﺰ ﺷﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻋﻨﻮان وﻗﻔﻪ اﺳﺘﻔﺎده ﻛﺮد، ﻳﻚ ﺑﺎﺷﻨﺪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از وﻗﻔﻪTIMSK
TIMSK 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
ﺳﻄﺢ ﻣﻨﻄﻘﻲ 0 0 0 0 0 0 0 X
#include <mega16.h>
#define xtal 8000000
- ٦٢ -
P a g e | 63
www.eca.ir
}
)void main(void
{
;DDRA=0xFF
;PORTA=0x00
;TCCR0=0B00000010 // Timer Clock = CLK/8
;TIMSK=0x01 //Enable TIMER0 Overflow
Interrupt
)"#asm("sei // Global enable interrupts
;TCNT0=0x38
;)while (1
}
• ﻣﺤﺘﻮاي رﺟﻴﺴﺘﺮ OCR0ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ ﺑﺎ ﻣﻘﺪار TCNT0ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮد و در ﺻﻮرت ﺑﺮاﺑـﺮي ﺑﺎﻋـﺚ
ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ OC0و ﻳﺎ وﻗﻔﻪ ي ﺗﻄﺎﺑﻖ ﻣﻲ ﺷﻮد .در ﺣﺎﻟﺖ ﺑﺮاﺑﺮي ﺑﻴﺖ OCF0ﻳﺎ OCF1ﻳﻚ ﺷﺪه
و ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺳﺎﺑﺮوﺗﻴﻦ وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﺻﻔﺮ ﻣﻲ ﺷﻮد .در ﺻـﻮرت ﻋـﺪم اﺳـﺘﻔﺎده از وﻗﻔـﻪ
- ٦٣ -
P a g e | 64
www.eca.ir
ﻧﺎم ﺑﻴﺖ OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0
ﺳﻄﺢ ﻣﻨﻄﻘﻲ 0 0 0 0 0 0 X X
ﺳﻄﺢ ﻣﻨﻄﻘﻲ X 0 X X 0 X X X
• در ﺻﻮرت ﻳﻚ ﻛﺮدن ﺑﻴﺖ FOC0ﻳﺎ FOC1ﺑﻪ ﺻﻮرت آﻧـﻲ ﻣﻘـﺪار رﺟﻴﺴـﺘﺮ TCNT0ﺑـﺎ ﻣﻘـﺪار OCR0
ﻣﻘﺎﻳﺴﻪ ﺷﺪه و در ﺻﻮرت ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ﻳﻚ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ روي ﭘﻴﻦ OC0اﻳﺠﺎد ﻣﻲ ﺷﻮد .در اﻳﻦ وﺿـﻌﻴﺖ ﺑﻴـﺖ
• در ﺗﻤﺎم ﺣﺎﻟﺖ ﻫﺎﻳﻲ ﻛﻪ روي ﭘﻴﻦ ﻫﺎي OCﺷﻜﻞ ﻣﻮج اﻳﺠﺎد ﻣﻲ ﺷﻮد ﺑﺎﻳﺪ اﻳﻦ ﭘﻴﻦ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ ﺗﻌﺮﻳﻒ
ﺷﺪه ﺑﺎﺷﺪ.
- ٦٤ -
P a g e | 65
www.eca.ir
#include<mega16.h>
#define xtal 8000000
void main()
{
DDRB=0xFF;
PORTB=0x00;
TCNT0=0x00;
TCCR0=0B00010010; //toggle OC0 on compare match
OCR0=0x63; //OCR0=99
while(1);
}
Set ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻣﻘﺎﻳﺴﻪ ي وﻗﻔﻪ ﻧﻴﺰ،ﺑﺮاي اﺳﺘﻔﺎده از وﻗﻔﻪ ﺑﺎﻳﺪ ﻋﻼوه ﺑﺮ ﻳﻚ ﺑﻮدن ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ
.ﺷﻮد
TIMSK 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
ﺳﻄﺢ ﻣﻨﻄﻘﻲ X X 0 0 0 0 X X
- ٦٥ -
P a g e | 66
www.eca.ir
در اﻳﻦ ﺣﺎﻟﺖ ISRﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد:
}
در اﻳﻦ Modeﺗﺎﻳﻤﺮ ﻫﻤﺎﻧﻨﺪ وﺿﻌﻴﺖ ﻧﺮﻣﺎل ﺑﺎ ﻋﻤﻠﻜﺮد ﻣﻘﺎﻳﺴﻪ ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ﺑـﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ در زﻣـﺎن ﺗﻄـﺎﺑﻖ
رﺟﻴﺴﺘﺮﻫﺎي OCR0و TCNT0ﻣﻘﺪار رﺟﻴﺴﺘﺮ TCNT0ﺻﻔﺮ ﺷﺪه و در واﻗﻊ ﺑـﺮ ﺧـﻼف ﺣﺎﻟـﺖ ﻗﺒـﻞ ﻣﻘـﺪار
ﻣﺎﻛﺰﻳﻤﻢ TCNT0ﻋﺪد ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ OCR0ﻣﻲ ﺑﺎﺷﺪ .ﻣﻘﺪار ﺑﻴﺖ ﻫﺎي WGM00و WGM01در اﻳﻦ
ﺳﻄﺢ ﻣﻨﻄﻘﻲ X 0 X X 1 X X X
در اﻳﻦ ﺣﺎﻟﺖ ﻓﺮﻛﺎﻧﺲ ﻣﻮج اﻳﺠﺎد ﺷﺪه روي ﭘﻴﻦ OC0از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ: •
- ٦٦ -
P a g e | 67
www.eca.ir
>#include<mega16.h
#define xtal 8000000
)(void main
{
;DDRB=0xFF
;PORTB=0x00
;TCNT0=0x00
OCR0=0x63; //OCR0=99
TCCR0=0B00011010; //toggle OC0 on compare match
;)while(1
}
8000000
= f OC0 = 5000Hz
)2.8.(1 + 99
وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ي ﺳﺮرﻳﺰ و وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ در CTC Modeﻫﻤﺎﻧﻨﺪ وﺿﻌﻴﺖ ﻧﺮﻣﺎل ﻣﻲ ﺑﺎﺷـﺪ.
ﺑﺎ ﻳﻚ ﺑﻮدن ﺑﻴﺖ OCIE0وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻓﻌﺎل ﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺗﻮان در ISRاﻳﻦ وﻗﻔـﻪ ﻣﻘـﺪار OCR0را ﺗﻐﻴﻴـﺮ
داد.
• ﻣﻘﺪار دﻫﻲ ﺑﻪ رﺟﻴﺴﺘﺮ OCR0ﺑﺎﻳﺪ ﺑﺎ دﻗﺖ اﻧﺠﺎم ﺷﻮد زﻳﺮا در Modeﻫﺎي ﻏﻴﺮ PWMاﻳـﻦ رﺟﻴﺴـﺘﺮ داراي
ﺑﺎﻓﺮ دوﺑﻞ ﻧﻤﻲ ﺑﺎﺷﺪ .وﺟﻮد ﺑﺎﻓﺰ دوﺑﻞ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ اﮔﺮ OCR0ﺑﻪ ﻣﻘـﺪاري ﻛﻤﺘـﺮ از TCNT0ﺗﻐﻴﻴـﺮ ﻛﻨـﺪ،
- ٦٧ -
P a g e | 68
www.eca.ir
ﺑﺮاي از دﺳﺖ ﻧﺮﻓﺘﻦ ﻣﻘﺎﻳﺴﻪ ي ﻓﻌﻠﻲ ﻣﻘﺪار ﺟﺪﻳﺪ در ﺑﺎﻓﺮ دوﺑﻞ ذﺧﻴﺮه ﺷﺪه و ﭘﺲ از ﺳﺮرﻳﺰ اﻳﻦ ﻣﻘﺪار ﺟﺪﻳـﺪ در
. ﺑﺎرﮔﺬاري ﺷﻮدOCR0
/*****************************************************
Project : Frequency Meter
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#include <lcd.h>
#define xtal 8000000
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
void main(void)
{
// Timer/Counter 0 initialization
// Clock source: T0 pin Falling Edge
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCNT0=0x00;
OCR0=0x00;
TCCR0=0x00;
while (1)
{
TCCR0=0x06; // Start Timer T0 pin Falling Edge
delay_ms(1000);
- ٦٩ -
P a g e | 70
www.eca.ir
in_freq = timer0_ov * 256 + TCNT0;
sprintf(lcd_buff,"Freqency=%d",in_freq);
lcd_clear();
lcd_puts(lcd_buff);
TCCR0=0x00; //Stopt Timer0
timer0_ov=0; //Prepare for next count
TCNT0=0; //Clear Timer0
};
}
- ٧٠ -
P a g e | 71
www.eca.ir
اﻳﻦ ﺣﺎﻟﺖ ﻣﺸﺎﺑﻪ Modeﻧﺮﻣﺎل ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ ﭘـﻴﻦ OC0ﻓﻘـﻂ در ﺣﺎﻟـﺖ ﺑﺮاﺑـﺮي رﺟﻴﺴـﺘﺮﻫﺎي
TCNT0و OCR0ﺗﻐﻴﻴﺮ ﺣﺎﻟﺖ ﻧﻤﻲ دﻫﺪ ،ﺑﻠﻜﻪ در زﻣﺎن ﺳﺮرﻳﺰ رﺟﻴﺴﺘﺮ TCNT0ﻧﻴﺰ ﻣﻘﺪار اﻳﻦ ﭘﻴﻦ ﺗﻐﻴﻴﺮ ﻣـﻲ
ﻛﻨﺪ.
ﺧﺮوﺟﻲ PWM
در Modeﻫﺎي PWMﻋﻤﻠﻜﺮد ﺑﻴﺖ ﻫﺎي COM00و COM01ﻣﺘﻔﺎوت از دو وﺿﻌﻴﺖ ﻗﺒﻠـﻲ و ﺑـﻪ ﺻـﻮرت
زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
- ٧١ -
P a g e | 72
www.eca.ir
0 0 ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
1 0 Clearدروﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ Set ،در زﻣﺎن ﺳﺮرﻳﺰ ) PWMﻏﻴﺮ ﻣﻌﻜﻮس(
1 1 Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ Clear ،در زﻣﺎن ﺳﺮرﻳﺰ ) PWMﻣﻌﻜﻮس(
ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ي ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMﺗﻮﻟﻴﺪ ﺷﺪه ﻣﻲ ﺗﻮان از ﻓﺮﻣﻮل زﻳﺮ اﺳﺘﻔﺎد ﻧﻤﻮد:
از وﻗﻔﻪ ي ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻣﻲ ﺗﻮان ﺑﺮاي ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ TCNT0و ﻳـﺎ ﺗﻐﻴﻴـﺮ ﻣﻘـﺪار OCR0اﺳـﺘﻔﺎده 9
ﻧﻤﻮد ،اﮔﺮﭼﻪ ﺑﻬﺘﺮ اﺳﺖ ﻣﻘﺪار OCR0در روﺗﻴﻦ وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﺗﻐﻴﻴﺮ داده ﺷﻮد.
ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ TCNT0ﻣﻲ ﺗﻮان ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMرا ﺗﻐﻴﻴﺮ داد(. 9
>#include <mega16.h
#define xtal 8000000
)void main(void
{
- ٧٢ -
P a g e | 73
www.eca.ir
PORTB=0x00;
DDRB=0x08;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x6A; //0x7A for inverted PWM
TCNT0=0x06;
OCR0=0x38; //OCR0 = 56
while (1);
8000000
f PWM = = 4000Hz
8(256 − 6)
OCR0 50
DutyCycle = × 100% = × 100% = 20%
250 250
- ٧٣ -
P a g e | 74
www.eca.ir
• ﺑﺎ ﻛﻤﺘﺮ ﺷﺪن OCR0زﻣﺎن وﻇﻴﻔﻪ ﻛﻤﺘﺮ ﺷﺪه و ﺗﺎ ﺣﺪي ﻛﻪ ﻣﻘﺪار ﺻﻔﺮ ﻳﻚ ﭘﺎﻟﺲ ﺳﻮزﻧﻲ ﺑﻪ ﻋﺮض ﻳﻚ ﺳﻴﻜﻞ
• ﺑﺎ ﻣﻘﺪاردﻫﻲ 256ﺑﻪ OCR0ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﺑﺮاﺑﺮ ﺷﺪه و ﭘﺎﻟﺲ ﺧﺮوﺟﻲ ﺑﺴﺘﻪ ﺑﻪ ﻣﻘﺪار COM00و
اﻳﻦ Modeﺷﺒﻴﻪ ﺣﺎﻟﺖ Fast PWMﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ ﺑﻪ ﺻﻮرت دو ﺷﻴﺒﻪ ) (Dual Slopeﻋﻤﻞ
ﺷﻤﺎرش را اﻧﺠﺎم ﻣﻲ دﻫﺪ .ﺑﻪ اﻳﻨﺼﻮرت ﻛﻪ ﺗﺎﻳﻤﺮ از ﻋﺪد ﺻﻔﺮ ﺷﺮوع ﺑﻪ ﺷﻤﺎرش ﻛﺮده و ﺑﻪ ﺻﻮرت اﻓﺰاﻳﺸﻲ ﺗﺎ ﻋﺪد
0xFFاﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ و ﺑﻌﺪ از رﺳﻴﺪن ﺑﻪ اﻳﻦ ﻣﻘﺪار ﻋﺪد ﻣﻮﺟﻮد در ﺑﺎﻓﺮ OCR0در رﺟﻴﺴﺘﺮ OCR0ﺑﺎرﮔﺬاري
ﻣﻲ ﺷﻮد .ﺑﻌﺪ از اﻳﻦ ﻟﺤﻈﻪ ﺟﻬﺖ ﺷﻤﺎرش ﺗﺎﻳﻤﺮ ﻋﻮض ﺷﺪه و ﺑﻪ ﺻﻮرت ﻛﺎﻫﺸﻲ ﺗﺎ ﻋﺪد ﺻﻔﺮ ﻣﻲ ﺷﻤﺎرد ﺑﺎ رﺳﻴﺪن
ﺑﻪ اﻳﻦ ﻋﺪد ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ،ﺑﺮﻧﺎﻣﻪ ﺑﻪ ISRﺳـﺮرﻳﺰ ﺗـﺎﻳﻤﺮ
ﻣﻨﺸﻌﺐ ﺷﺪه و ﺑﻴﺖ ﭘﺮﭼﻢ وﻗﻔﻪ ﺑﻮﺳﻴﻠﻪ ﺳﺨﺖ اﻓﺰار ﺻﻔﺮ ﻣﻲ ﺷﻮد .ﻣﺴﺌﻠﻪ ي ﻣﻬﻢ اﻳﻦ اﺳـﺖ ﻛـﻪ در ﻫـﺮ دو ﺣﺎﻟـﺖ
ﺷﻤﺎرش اﻓﺰاﻳﺸﻲ و ﻛﺎﻫﺸﻲ ﻋﻤﻞ ﻣﻘﺎﻳﺴﻪ ﺑﻴﻦ رﺟﻴﺴـﺘﺮﻫﺎي TCNT0و OCR0اﻧﺠـﺎم ﻣـﻲ ﮔﻴـﺮد و در ﺻـﻮرت
ﻣﻘﺪار OCR0
ﻣﻘﺪار TCNT0
- ٧٤ -
P a g e | 75
www.eca.ir
• در ﺻﻮرت ﺗﻐﻴﻴﺮ ﻣﻘﺪار رﺟﻴﺴﺘﺮ OCR0ﻣﻘﺪار ﺟﺪﻳﺪ در ﺑﺎﻓﺮ اﻳـﻦ رﺟﻴﺴـﺘﺮ ﻧﻮﺷـﺘﻪ ﻣـﻲ ﺷـﻮد و در زﻣـﺎن
• ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﺻﻔﺮ زﻣﺎﻧﻲ ﻓﻌﺎل ﻣﻲ ﺷﻮد ﻛﻪ ﻛـﻪ رﺟﻴﺴـﺘﺮ TCNT0ﺑﺮاﺑـﺮ ﺻـﻔﺮ ﺷـﻮد و ﻧـﻪ ،0xFF
ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎﻳﺪ دﻗﺖ داﺷﺖ ﻛﻪ اﮔﺮ در زﻣﺎن ﺷﺮوع ﺑﻪ ﻛﺎر ﻣﻘﺪار اﻳﻦ رﺟﻴﺴﺘﺮ ﺻﻔﺮ ﺑﺎﺷﺪ ﭘـﺮﭼﻢ ﺳـﺮرﻳﺰ ﻓﻌـﺎل
ﺧﻮاﻫﺪ ﺷﺪ.
• ﻓﺮﻛﺎﻧﺲ PWMدر ﺣﺎﻟﺖ Phase Correctاز راﺑﻄﻪ ي زﻳﺮ ﻗﺎﺑﻞ ﻣﺤﺎﺳﺒﻪ اﺳﺖ:
• راﺑﻄﻪ ي ﺑﺎﻻ ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMﺛﺎﺑﺖ اﺳﺖ و ارﺗﺒﺎﻃﻲ ﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي OCR0و
TCNT0ﻧﺪارد.
- ٧٥ -
P a g e | 76
www.eca.ir
اﻓﺰاﻳﺶ ﻳﺎﻓﺘﻪ و ﺑﺎPWM ﻣﻘﺪار ﻣﺘﻮﺳﻂ ﻣﻮجOCR0 ﻏﻴﺮ ﻣﻌﻜﻮس ﺑﺎ اﻓﺰاﻳﺶ ﻣﻘﺪارPWM • در ﺣﺎﻟﺖ
. ﻋﻜﺲ اﻳﻦ ﻗﻀﻴﻪ ﺻﺤﻴﺢ اﺳﺖ، ﻣﻌﻜﻮسPWM ﻛﺎﻫﺶ آن ﻣﻘﺪار ﻣﺘﻮﺳﻂ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ و در ﺣﺎﻟﺖ
/*****************************************************
Project : DC Motor Control
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/
#include <mega16.h>
#define xtal 1000000
char digits[8]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07};
unsigned char;
unsigned char p_state;
unsigned char key;
unsigned char i;
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
DDRD = 0xFF;
PORTD = digits[0];
DDRC = 0x00;
- ٧٦ -
P a g e | 77
www.eca.ir
PORTC = 0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: Phase correct PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x63;
TCNT0=0x00;
OCR0=10;
while (1)
{
if(!PINC.0)
{
if(key!=p_state)
{
if(i==7)
{
i=0;
PORTC=digits[0];
}
else
i++;
PORTD = digits[i];
OCR0 = i*10+10;
p_state=key;
};
}
- ٧٧ -
P a g e | 78
www.eca.ir
else
;p_state=0xFF
;}
}
- ٧٨ -
P a g e | 79
www.eca.ir
ﺑﻪ ﻃﻮر ﻛﻠﻲ ﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ 2ﻣﺸﺎﺑﻪ ﺗﺎﻳﻤﺮ ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ و رﺟﻴﺴﺘﺮﻫﺎي ﻣﺮﺑﻮﻃﻪ ﺑﺎ ﻫﻤﺎن ﻧـﺎم و داراي ﭘﺴـﻮﻧﺪ 2ﻣـﻲ
ﺑﺎﺷﻨﺪ ،ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ 2ﺑﺮﺧﻼف ﺗﺎﻳﻤﺮﻫﺎي ﺻﻔﺮ و ﻳﻚ ﻧﻤﻲ ﺗﻮاﻧﺪ از ﭘﺎﻳﻪ ﺧﺎرﺟﻲ T0ﻳﺎ T1ﻛﻼك درﻳﺎﻓﺖ
ﻛﻨﺪ و در ﻋﻮض ﻣﻲ ﺗﻮان ﺑﺎ وﺻﻞ ﻛﺮدن ﻳﻚ ﻛﺮﻳﺴﺘﺎل 32,768ﻛﻴﻠﻮﻫﺮﺗﺰ ﺑﻪ ﭘﻴﻦ ﻫـﺎي TOSC1و TOSC2از آن
در وﺿﻌﻴﺖ آﺳﻨﻜﺮون ﺟﻬﺖ RTCاﺳﺘﻔﺎده ﻧﻤﻮد .از آﻧﺠﺎﻳﻲ ﻛﻪ ﺗﺎﻳﻤﺮ 2داراي Prescalerﻣﺠـﺰا از دو ﺗـﺎﻳﻤﺮ 0و1
ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ ﺗﻘﺴﻴﻢ ﻛﺮﻳﺴﺘﺎل 32768ﻫﺮﺗﺰ ﺑﺮ 128ﻣﻲ ﺗﻮان ﺑﻪ زﻣﺎن ﺳﺮرﻳﺰ 1ﺛﺎﻧﻴﻪ ﻛﻪ ﻣﻨﺎﺳﺐ ﺑـﺮاي ﻋﻤﻠﻜـﺮد ﺳـﺎﻋﺖ
اﺳﺖ دﺳﺖ ﭘﻴﺪا ﻛﺮد .ﺗﻨﻈﻴﻤﺎت Prescaleﺑﺮاي اﻳﻦ ﺗﺎﻳﻤﺮ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
- ٧٩ -
P a g e | 80
www.eca.ir
Bit 7 6 5 4 3 2 1 0
:Asynchronous Timer/Counter2ﺑﺎ Setﻛﺮدن اﻳﻦ ﺑﻴـﺖ ﻣﻨﺒـﻊ ﻛـﻼك ﺗـﺎﻳﻤﺮ 2از ﻛـﻼك ﺳﻴﺴـﺘﻢ ﺑـﻪ
ﻛﺮﻳﺴﺘﺎل ﺧﺎرﺟﻲ در ﭘﺎﻳﻪ ﻫﺎي TOSC1و TOSC2ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ.ﺑﺎ ﺗﻐﻴﻴـﺮ دادن اﻳـﻦ ﺑﻴـﺖ ﻣﻤﻜـﻦ اﺳـﺖ ﻣﻘـﺪار
ﺗﺎﻳﻤﺮ 2ﺑﺮﺧﻼف ﺗﺎﻳﻤﺮ 0و 1ﺑﻪ ﺻﻮرت ﺑﺎﻓﺮ ﺷﺪه ﺑﺮوز ﻣﻴﺸﻮﻧﺪ .ﺑﺪﻳﻦ ﺗﺮﺗﻴـﺐ ﻛـﻪ وﻗﺘـﻲ روي رﺟﻴﺴـﺘﺮ TCNT2
ﻣﻘﺪاري ﻧﻮﺷﺘﻪ ﺷﻮد ،ﺑﻴﺖ TCN2UBﻳﻚ ﻣﻲ ﺷـﻮد و ﻣﻘـﺪاري ﻛـﻪ در رﺟﻴﺴـﺘﺮ ﻣـﻮﻗﺘﻲ ذﺧﻴـﺮه ﺷـﺪه اﺳـﺖ ﺑـﻪ
TCNT2ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد .ﺑﺎ اﺗﻤﺎم ﺑﺮوز رﺳﺎﻧﻲ TCNT2اﻳﻦ ﺑﻴﺖ ﺗﻮﺳﻂ ﺳﺨﺖ اﻓﺰار ﺻﻔﺮ ﻣﻲ ﺷﻮد .ﺻـﻔﺮ ﺑـﻮدن
:Output Compare Register2 Update Busyاﻳﻦ ﺑﻴﺖ ﻫﻤﺎﻧﻨﺪ TCN2UBﺑﻮده ﺑﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ
:Timer/Counter Control Register2 Update Busyاﻳﻦ ﺑﻴﺖ ﻫﻤﺎﻧﻨـﺪ TCN2UBﺑـﻮده ﺑـﺎ اﻳـﻦ
• در ﺣﺎﻟﺘﻲ ﻛﻪ ﭘﺮﭼﻢ ﻣﺸﻐﻮل ﺑﻮدن ﻳﻚ رﺟﻴﺴﺘﺮ ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ ،ﻧﻮﺷﺘﻦ ﺑﺮ روي آن رﺟﻴﺴﺘﺮ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ
ﻣﻘﺪار ﺑﺮوز ﺷﺪه ﺻﺤﻴﺢ ﻧﺒﺎﺷﺪ و ﻣﻤﻜﻦ اﺳﺖ ﺑﺎﻋﺚ وﻗﻔﻪ ي ﻧﺎﺧﻮاﺳﺘﻪ ﺷﻮد.
- ٨٠ -
P a g e | 81
www.eca.ir
• ﻣﻜﺎﻧﻴﺴﻢ ﺧﻮاﻧﺪن اﻳﻦ ﺳﻪ رﺟﻴﺴﺘﺮ ﻣﺘﻔﺎوت ﻣﻲ ﺑﺎﺷﺪ ،ﺑﺪﻳﻦ ﺻﻮرت ﻛﻪ زﻣﺎن ﺧﻮاﻧﺪن TCNT2ﻣﻘﺪار ﺧـﻮد
رﺟﻴﺴﺘﺮ ﺧﻮاﻧﺪه ﺷﺪه و ﺑﺎ ﺧﻮاﻧﺪن OCR2و TCCR2ﻣﻘﺪار ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ ﻣﻮﻗﺖ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد.
• ﺗﺎﻳﻤﺮ 2در وﺿﻌﻴﺖ آﺳﻨﻜﺮون در ﺣﺎﻟﺖ Power-Saveﻧﻴﺰ ﻓﻌـﺎل ﺑـﻮده و ﭘـﺲ از ﺳـﺮرﻳﺰ ﺷـﺪن ﺗـﺎﻳﻤﺮ از
وﺿﻌﻴﺖ Power-Saveﺧﺎرج ﺷﺪه و در وﺻﺮت ﻓﻌﺎل ﺑﻮدن وﻗﻔـﻪ ISR ،را اﺟـﺮا ﻧﻤـﻮده و ﻣﺠـﺪدا وارد
*****************************************************/
Project : Real Time Clock
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/
>#include <mega16.h
>#include <lcd.h
>#include <stdio.h
#define xtal 8000000
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
- ٨١ -
P a g e | 82
www.eca.ir
void main(void)
{
// Clock source: TOSC1 pin
// Clock value: PCK2/128
- ٨٢ -
P a g e | 83
www.eca.ir
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
lcd_init(16);
while (1);
}
- ٨٣ -
P a g e | 84
www.eca.ir
ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻳﻚ
ﺗﺎﻳﻤﺮ ﻳﻚ ﺗﺎﻳﻤﺮي 16ﺑﻴﺘﻲ اﺳﺖ و در آن ﻋﻼوه ﺑﺮ اﻣﻜﺎﻧﺎت ﺗﺎﻳﻤﺮ ﺻﻔﺮ ،ﻳﻚ ﺑﺨﺶ دﻳﮕﺮ ﺑﻪ ﻧﺎم ﺑﺨﺶ Captureﺑﻪ
آن اﻓﺰوده ﺷﺪه اﺳﺖ .اﻳﻦ ﺑﺨﺶ در زﻣﺎن ﻫﺎي ﺧﺎص ،ﻋﺪد ﺷﻤﺎرش ﺷﺪه ﺗﻮﺳﻂ ﺗﺎﻳﻤﺮ ﻳﻚ و زﻣـﺎن ﺳـﭙﺮي ﺷـﺪه را
ﺛﺒﺖ ﻛﺮده و از ﻃﺮﻳﻖ آن اﻣﻜﺎن اﻧﺪازه ﮔﻴﺮي ﻫﺎي زﻣﺎﻧﻲ را ﻓﺮاﻫﻢ ﻣﻲ آورد .ﺗﺎﻳﻤﺮ ﻳﻚ داراي ﭘـﻨﺞ Modeﻛـﺎري ﺑـﻪ
ﻧــﺎم ﻫــﺎي Phase Correct PWM Mode Fast PWM ،CTC ،Normalو Phase and Mode
Frequency Correctﻣﻲ ﺑﺎﺷﺪ Mode .ﻫﺎي PWMدر ﺗﺎﻳﻤﺮ 1ﺑﺴﻴﺎر ﻣﺘﻨﻮع و داراي 12ﺣﺎﻟـﺖ PWMﻣـﻲ
ﺑﺎﺷﺪ .در اﻳﻦ ﺗﺎﻳﻤﺮ ﭘﻴﻦ T1ﺑﻪ ﻋﻨﻮان ورودي ﻛﺎﻧﺘﺮ و ﭘﻴﻦ ﻫﺎي OC1Aو OC1Bﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴـﻪ ﮔـﺮ
ﺑﻪ ﻋﻠﺖ 16ﺑﻴﺘﻲ ﺑﻮدن ﺗﺎﻳﻤﺮ ،رﺟﻴﺴﺘﺮﻫﺎي TCNT1و OCR1Aو OCR1Bﺷﺎﻧﺰده ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻫﺮ ﻛﺪام
داراي دو ﺑﺎﻳﺖ Lو Hﻫﺴﺘﻨﺪ .ﻫﻤﭽﻨﻴﻦ ﺗﺎﻳﻤﺮ ﻳﻚ داراي دو واﺣﺪ ﻣﻘﺎﻳﺴﻪ ي ﻣﺠﺰا ﻣﻲ ﺑﺎﺷﺪ ﻛـﻪ ﻣﻘـﺪار ﻣﻮﺟـﻮد در
رﺟﻴﺴﺘﺮﻫﺎي OCR1Aو OCR1Bرا ﺑـﺎ TCNT1ﻣﻘﺎﻳﺴـﻪ ﻛـﺮده و در ﺻـﻮرت ﺑﺮاﺑـﺮي وﺿـﻌﻴﺖ ﭘـﻴﻦ ﻫـﺎي
OC1Aو OC1Bرا ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻨﺪ .ﻫﻤﭽﻨﻴﻦ رﺟﻴﺴﺘﺮ ICR1ﻧﻴﺰ ﻛﻪ رﺟﻴﺴﺘﺮ واﺣﺪ Captureاﺳﺖ رﺟﻴﺴـﺘﺮي
16ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﺪ.
- ٨٤ -
P a g e | 85
www.eca.ir
: ﻛﻨﺘﺮل ﺗﺎﻳﻤﺮ را ﺑﺮ ﻋﻬﺪه دارﻧﺪTCCR1B وTCCR1A ﺑﻴﺘﻲ8 رﺟﻴﺴﺘﺮﻫﺎي
TCCR1A 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
TCCR1B 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
: ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮدWGM13 وWGM12 ,WGM11 ,WGM10 ﻛﺎري ﺗﺎﻳﻤﺮ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎيMode
13 1 1 0 1 رزرو ﺷﺪه - -
- ٨٥ -
P a g e | 86
www.eca.ir
15 1 1 1 1 Fast PWM OCR1A TOP
• ﺗﻌﺮﻳﻒ :TOPﺗﺎﻳﻤﺮ وﻗﺘﻲ ﺑﻪ ﻣﻘﺪار TOPﻣﻲ رﺳﺪ ﻛﻪ ﺑﺮاﺑﺮ ﺑﺎ ﺑﺎﻻﺗﺮﻳﻦ ﻣﻘﺪار در رﺷـﺘﻪ ي ﺷـﻤﺎرش ﺧـﻮد
اﺳﺖ .اﻳﻦ ﻣﻘﺪار ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺘﻲ ﻣﺜﻞ 0x01FF ,0x03FFو ﻳﺎ 0x00FFﺑﻮده و ﻳﺎ ﻣﻘﺪار ﻧﮕﻬﺪاري
FOC1Aو :FOC1Bﺑﻴﺖ ﻫﺎي Forceﺑﺨﺶ ﻣﻘﺎﻳﺴﻪ ﮔﺮ ﻛﻪ ﻋﻤﻠﻜﺮد آن ﻫﺎ ﻫﻤﺎﻧﻨﺪ FOC0در ﺗﺎﻳﻤﺮ ﺻـﻔﺮ و
دو ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻪ در Modeﻫﺎي ﻏﻴﺮ ،PWMﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﺑﺪون اﻳﻨﻜﻪ وﻗﻔﻪ اي اﻳﺠﺎد ﻛﻨـﺪ در
ﺻﻮرت ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ،ﺑﺎﻋﺚ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي OC1Aو OC1Bﻣﻄﺎﺑﻖ ﺑﺎ وﺿﻌﻴﺖ ﺑﻴﺖ ﻫـﺎي COMدر
TCCR1ﻣﻲ ﺷﻮد.
ﺑﻴﺖ ﻫـﺎي COM1B0 ,COM1A1 ,COM1A0و :COM1B1ﺗﻐﻴﻴـﺮ وﺿـﻌﻴﺖ ﭘـﻴﻦ ﻫـﺎي OC1Aو
OC1Bرا در ﺣﺎﻟﺖ ﺗﻄﺒﻴﻖ ﻣﻌﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻣﻘﺪار آن ﻫﺎ ﺑﺴﺘﻪ ﺑﻪ Modeﻛﺎري ﻋﻤﻠﻜـﺮد ﻣﺘﻔـﺎوﺗﻲ را اﻳﺠـﺎد ﻣـﻲ
ﺑﻴﺖ ﻫﺎي CS11 ،CS10و :CS12ﺑﺮاي ﺗﻌﻴﻴﻦ ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ ﻣﻲ ﺑﺎﺷﻨﺪ:
- ٨٦ -
P a g e | 87
www.eca.ir
0 1 1 /64ﻛﻼك ﺳﻴﺴﺘﻢ
ﺑﻴﺖ :ICES1ﺑﻴﺖ ﺗﻌﻴﻴﻦ ﻟﺒﻪ ي ورودي ﺑﺨﺶ Captureاز ﭘﻴﻦ .ICP1ﺑﺎ ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه
ﻧﺘﺎﻳﺞ ﺣﺎﺻﻞ از ﻛﺎرﻛﺮد ﺗﺎﻳﻤﺮ 1در 4ﺑﻴﺖ از رﺟﻴﺴﺘﺮ TIFRﺑﻪ ﻧﺎم ﻫﺎي ) TOV1ﭘﺮﭼﻢ ﺳﺮرﻳﺰ( ) OCF1Aﭘﺮﭼﻢ
ﺗﻄﺎﺑﻖ ﻣﻘﺎﻳﺴﻪ ﮔﺮ ) OCF1B (Aﭘﺮﭼﻢ ﺗﻄﺎﺑﻖ ﻣﻘﺎﻳﺴﻪ ﮔﺮ (Bو ) ICF1ﭘﺮﭼﻢ ﺑﺨﺶ Captureﺗـﺎﻳﻤﺮ (1ﻣـﻨﻌﻜﺲ
ﻣﻲ ﺷﻮﻧﺪ:
ﺳﻄﺢ ﻣﻨﻄﻘﻲ 0 0 X X X X 0 0
ﻳﻚ ﺷﺪن ﻫﺮ ﻳﻚ از اﻳﻦ ﭘﺮﭼﻢ ﻫﺎ در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ ) (Iو ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ ي ﻣﺮﺑﻮﻃﻪ
در رﺟﻴﺴﺘﺮ TIMSKﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻧﺸﻌﺎب ﺑﺮﻧﺎﻣﻪ ﺑﻪ ISRﻣﺮﺑﻮط ﺑﻪ آن وﻗﻔﻪ ﺷﻮد:
- ٨٧ -
P a g e | 88
www.eca.ir
ﺳﻄﺢ ﻣﻨﻄﻘﻲ 0 0 X X X X 0 0
ﺑﺎ اﺟﺮا ﺷﺪن ISRﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﺑﻴﺖ ﭘﺮﭼﻢ وﻗﻔﻪ ﺻﻔﺮ ﺷﺪه و ﻳﺎ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي آن ﺑﻮﺳﻴﻠﻪ ي
اﻳﻦ Modeﻫﻤﺎﻧﻨﺪ ﻣﺸﺎﺑﻪ آن در ﺗﺎﻳﻤﺮ ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ ﺗﺎ ﻋﺪد 0xFFFFﺷﻤﺎرش ﻛﺮده و ﺑـﺎ
رﺳﻴﺪن ﺑﻪ آن ﺗﺎﻳﻤﺮ ﺳﺮرﻳﺰ ﻛﺮده و ﺑﻴﺖ TOV1ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ ﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋـﺚ اﺟـﺮاي
ISRﻣﺮﺑﻮﻃﻪ ﺷﻮد .در Modeﻋﺎدي ﻫﺮ دو ﻣﻘﺎﻳﺴﻪ ﮔﺮ Aو Bﻓﻌﺎل ﺑﻮده و ﻫﺮ ﻛﺪام ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻞ ﻋﻤـﻞ ﻣﻘﺎﻳﺴـﻪ
را روي رﺟﻴﺴﺘﺮ TCNT1و OCR1Aو OCR1Bاﻧﺠﺎم ﻣـﻲ دﻫﻨـﺪ .در ﺻـﻮرت ﺑﺮاﺑـﺮي ﺑﻴـﺖ OCF1Aﻳـﺎ
OCF1Bﻳﻚ ﺷﺪه و ﺧﺮوﺟﻲ OC1Aﻳﺎ OC1Bﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ داده و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن
- ٨٨ -
P a g e | 89
www.eca.ir
• در ﺻﻮرت اﺳﺘﻔﺎده از OC1Aﻳﺎ OC1Bﺑﺮاي ﺗﻮﻟﻴﺪ ﺷﻜﻞ ﻣﻮج ،ﺑﺎﻳﺪ اﻳﻦ ﭘﻴﻦ ﻫﺎ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ
ﭘﻴﻜﺮﺑﻨﺪي ﺷﻮﻧﺪ.
ﻣﺜﺎل ) :7ﺗﻮﻟﻴﺪ دو ﺷﻜﻞ ﻣﻮج ﺑﺎ دوره ﺗﻨﺎوب 131ﻣﻴﻠﻲ ﺛﺎﻧﻴﻪ و اﺧﺘﻼف ﻓﺎز 10ﻣﻴﻠﻲ ﺛﺎﻧﻴﻪ(
>#include <mega16.h
#define xtal 8000000
)void main(void
{
;PORTD=0x00
;DDRD=0x30
- ٨٩ -
P a g e | 90
www.eca.ir
;OCR1BH=0x28
;OCR1BL=0x0F //OCR1B=10255
;)while (1
}
در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘﺪار رﺟﻴﺴﺘﺮ TCNT1ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ ﺑﺎ ﻣﻘﺪار رﺟﻴﺴﺘﺮ OCR1Aﻳﺎ ICR1ﻣﻘﺎﻳﺴﻪ ﻣـﻲ ﺷـﻮد و
در ﺻﻮرت ﺑﺮاﺑﺮي ﻣﻘﺪار رﺟﻴﺴﺘﺮ TCNT1ﺑﺮاﺑﺮ ﺻﻔﺮ ﻣﻲ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﺣﺎﻟـﺖ ﻣﻘـﺪار TOPﺗـﺎﻳﻤﺮ را ﺑـﺎ
ﺗﻮﺟﻪ ﺑﻪ ﻣﻘﺪار ﻣﻮﺟﻮد در ﺑﻴﺖ ﻫﺎي WGMﻣﻘﺪار رﺟﻴﺴﺘﺮﻫﺎي OCR1Aﻳﺎ ICR1ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ.
ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار TOPﺧﻮد ﺑﺮ ﺣﺴﺐ اﻳﻨﻜﻪ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ OCR1Aﻳﺎ ICR1اﻧﺘﺨﺎب ﺷـﺪه ﺑﺎﺷـﺪ ﺑـﻪ
ﺗﺮﺗﻴﺐ ﭘﺮﭼﻢ ﻫﺎي OCF1Aﻳﺎ ICF1ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ از آن ﻣـﻲ ﺗـﻮان ﺑـﺮاي ﺗﻐﻴﻴـﺮ دادن
ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ اﺳﺘﻔﺎده ﻛﺮد .اﻳﻦ ﻋﻤﻞ ﺑﺎﻳﺪ ﺑﺎ دﻗﺖ ﺻﻮرت ﮔﻴﺮد زﻳﺮا رﺟﻴﺴـﺘﺮ ﻣﻘﺎﻳﺴـﻪ ي ﺗﺎﻳﻤﺮﻫـﺎ ﻓﻘـﻂ در Mode
ﻫﺎي PWMداراي ﺑﺎﻓﺮ دوﺑﻞ ﻣﻲ ﺑﺎﺷﻨﺪ .در اﻳﻦ ﺣﺎﻟـﺖ ﻓﺮﻛـﺎﻧﺲ ﻣـﻮج اﻳﺠـﺎد ﺷـﺪه روي ﭘﺎﻳـﻪ ﻫـﺎي OC1Aﻳـﺎ
- ٩٠ -
P a g e | 91
www.eca.ir
#include <mega16.h>
#define xtal 8000000
void main(void)
{
PORTD=0x00;
DDRD=0x30;
while (1);
}
8000000
f= = 1000 = 1KHz
2 × 8(1 + 499)
- ٩١ -
P a g e | 92
www.eca.ir
ﺑﺮ ﺧﻼف ﺗﺎﻳﻤﺮﻫﺎي ﺻﻔﺮ و دو ﻛﻪ در آن ﻣﻮج ﻫﺎي PWMﺗﻮﻟﻴﺪ ﺷﺪه داراي دﻗﺖ ﺛﺎﺑـﺖ 8ﺑﻴﺘـﻲ ﻫﺴـﺘﻨﺪ ،ﺗـﺎﻳﻤﺮ 1
ﻗﺎدر اﺳﺖ ﺳﻴﮕﻨﺎل ﻫﺎي PWMاي ﺑﺎ دﻗﺖ ﻣﺘﻐﻴﺮ را اراﺋﻪ ﻛﻨﺪ ،اﻳﻦ ﻣﺴﺌﻠﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﻋـﻼوه ﺑـﺮ
ﺗﻐﻴﻴﺮ Duty Cycleﻓﺮﻛﺎﻧﺲ ﻣﻮج را ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﻛﻨﺘﺮل ﻛﻨﺪ )ﺑﺪون ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ (TCNT1
در اﻳﻦ Modeﺗﺎﻳﻤﺮ از ﺻﻔﺮ ﺗﺎ ﻣﻘﺪار TOPﺧﻮد ﺷﺮوع ﺑﻪ ﺷﻤﺎرش ﻛﺮده و ﭘﺲ از از ﺳﺮرﻳﺰ ﻣﺠﺪدا از ﺻﻔﺮ ﺷﺮوع
ﺑﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ .در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻘﺎﻳﺴﻪ ي ﺧﺮوﺟﻲ در ﺣﺎﻟﺖ PWMﻏﻴﺮ ﻣﻌﻜﻮس ﺑﺎﺷـﺪ در ﺣﺎﻟـﺖ ﺗﻄﺒﻴـﻖ ﻣﻘﺎﻳﺴـﻪ
ﭘﻴﻦ OC1xﻳﻚ ﺷﺪه و ﺑﺎ رﺳﻴﺪن ﺑﻪ ﻣﻘﺪار TOPﭘﺎك ﻣﻲ ﺷﻮد .در ﺑﻴﻦ رﺟﻴﺴﺘﺮﻫﺎي TCNT1و OCR1x
ﺻﻮرﺗﻲ ﻛﻪ ﺧﺮوﺟﻲ PWMﻣﻌﻜﻮس ﺑﺎﺷﺪ وﺿﻌﻴﺘﻲ ﻋﻜﺲ وﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ .دﻗﺖ ﻣﻮج PWMﺧﺮوﺟﻲ ﻣـﻲ
ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺖ 9 ،8ﻳﺎ 10ﺑﻴﺘﻲ داﺷﺘﻪ وﻳﺎ ﺑﻮﺳﻴﻠﻪ ي رﺟﻴﺴﺘﺮﻫﺎي ICR1ﻳﺎ OCR1Aﺑﻪ ﻣﻘـﺪار دﻟﺨـﻮاه ﺗﻨﻈـﻴﻢ
- ٩٢ -
P a g e | 93
www.eca.ir
ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﺣﺪاﻗﻞ ﻣﻘﺪار ﻣﺠﺎز 2ﺑﻴﺖ )ﺑﺎ دادن ﻣﻘﺪار 0x0003ﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي ICR1ﻳـﺎ (OCR1xو
ﺣﺪاﻛﺜﺮ آن 16ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ )ﺑﺎ دادن ﻣﻘﺪار 0xFFFFﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي ICR1ﻳﺎ .(OCR1x
دﻗﺖ ﻣﻮج PWMﺑﺮ ﺣﺴﺐ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ از راﺑﻄﻪ ي زﻳﺮ ﺑﻪ دﺳﺖ ﻣﻲ آﻳﺪ:
)log(TOP + 1
= resolution
)log(2
ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار TOPﭘﺮﭼﻢ ﺳـﺮرﻳﺰ TOV1ﻓﻌـﺎل ﺷـﺪه و ﺑـﺎ ﺗﻄﺒﻴـﻖ ﻣﻘﺎﻳﺴـﻪ ﻧﻴـﺰ ﺑﻴـﺖ OCF1Aﻳـﺎ
OCF1Bﻳﻚ ﻣﻲ ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﻫﺎ اﮔﺮ وﻗﻔﻪ ي ﻣﺮﺑﻮﻃﻪ ﻓﻌﺎل ﺷﺪه ﺑﺎﺷﺪ ﻣـﻲ ﺗـﻮان در ISRآن وﻗﻔـﻪ ﻣﻘـﺪار
ﻣﻘﺎﻳﺴﻪ را ﺗﻐﻴﻴﺮ داد .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻣﻘـﺪار رﺟﻴﺴـﺘﺮﻫﺎي ﻣﻘﺎﻳﺴـﻪ ﺑﺎﻳـﺪ از ﻣﻘـﺪار TOPﻛﻤﺘـﺮ ﺑﺎﺷـﺪ در ﻏﻴـﺮ
ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي OC1Aو OC1Bدر ﺣﺎﻟﺖ ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
COM1A1 COM1A0
وﺿﻌﻴﺖ ﭘﻴﻦ OC1Aﻳﺎ OC1B
/COM1B1 /COM1B0
اﮔﺮ WGM1[3:0] = 15ﺑﺎﺷﺪ Toggle :ﭘﻴﻦ OC1Aدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و OC1Bﭘﻴﻦ I/Oﻣﻌﻤﻮﻟﻲ
0 1
ﺑﺮاي دﻳﮕﺮ ﺣﺎﻟﺖ ﻫﺎي ] :WGM1[3:0ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
1 0 Clearدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و Setدر وﺿﻌﻴﺖ PWM) TOPﻏﻴﺮ ﻣﻌﻜﻮس(
- ٩٣ -
P a g e | 94
www.eca.ir
: ﺣﺎﺻﻞ از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪPWM ﻓﺮﻛﺎﻧﺲ ﻣﻮج
f Clk _ I / O
f PWM =
N.(1 + TOP )
#include <mega16.h>
#define xtal 8000000
void main(void)
{
PORTD=0x00;
DDRD=0x20;
while (1);
}
8000000 256
f PWM = = 976 ≈ 1KHz DutyCycle = × 100% = 25%
8.(1 + 1023 ) 1024
- ٩٤ -
P a g e | 95
www.eca.ir
: ﻛﻴﻠﻮﻫﺮﺗﺰ رﺳﻴﺪ1 ﻣﻲ ﺗﻮان ﺑﻪ ﻓﺮﻛﺎﻧﺲ دﻗﻴﻖ، ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮISR درTCNT1 • ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ
- ٩٥ -
P a g e | 96
www.eca.ir
در اﻳﻦ Modeﺗﺎﻳﻤﺮ ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ از ﻣﻘﺪار ﺻﻔﺮ ﺗﺎ TOPو از TOPﺗﺎ ﺻﻔﺮ ﻣﻲ ﺷﻤﺎرد .در ﺣﺎﻟﺖ PWMﻏﻴﺮ
ﻣﻌﻜﻮس در ﺣﺎﻟﻲ ﻛـﻪ ﺗـﺎﻳﻤﺮ ﺑـﻪ ﺻـﻮرت ﺻـﻌﻮدي ﻣـﻲ ﺷـﻤﺎرد در ﻟﺤﻈـﻪ ي ﺑﺮاﺑـﺮي رﺟﻴﺴـﺘﺮﻫﺎي TCNT1و
OCR1xﭘﻴﻦ OC1xﺻﻔﺮ ﺷﺪه و در ﺣﺎﻟﺖ ﺷﻤﺎرش ﻧﺰوﻟﻲ ﺑﺎ ﺗﻄﺎﺑﻖ دو رﺟﻴﺴﺘﺮ اﻳﻦ ﭘﻴﻦ ﻳﻚ ﻣﻲ ﺷﻮد .در ﺣﺎﻟﺖ
دﻗﺖ ﻣﻮج PWMﺧﺮوﺟﻲ ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺖ 9 ،8ﻳﺎ 10ﺑﻴﺘﻲ داﺷﺘﻪ وﻳـﺎ ﺑﻮﺳـﻴﻠﻪ ي رﺟﻴﺴـﺘﺮﻫﺎي ICR1ﻳـﺎ
OCR1Aﺑﻪ ﻣﻘﺪار دﻟﺨﻮاه ﺗﻨﻈﻴﻢ ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﺣﺪاﻗﻞ ﻣﻘـﺪار ﻣﺠـﺎز 2ﺑﻴـﺖ )ﺑـﺎ دادن ﻣﻘـﺪار 0x0003ﺑـﻪ
رﺟﻴﺴﺘﺮﻫﺎي ICR1ﻳﺎ (OCR1xو ﺣﺪاﻛﺜﺮ آن 16ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ )ﺑﺎ دادن ﻣﻘﺪار 0xFFFFﺑـﻪ رﺟﻴﺴـﺘﺮﻫﺎي
ICR1ﻳﺎ .(OCR1x
دﻗﺖ ﻣﻮج PWMﺑﺮ ﺣﺴﺐ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ از راﺑﻄﻪ ي زﻳﺮ ﺑﻪ دﺳﺖ ﻣﻲ آﻳﺪ:
)log(TOP + 1
= resolution
)log(2
ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ TOV1ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار ﺻﻔﺮ ﻳﻚ ﺧﻮاﻫﺪ ﺷﺪ و ﺑﺎ ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ﻧﻴـﺰ ﺑﻴـﺖ OCF1A
ﻳﺎ OCF1Bﻳﻚ ﻣﻲ ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﻫﺎ اﮔﺮ وﻗﻔﻪ ي ﻣﺮﺑﻮﻃﻪ ﻓﻌﺎل ﺷﺪه ﺑﺎﺷﺪ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ISRآن وﻗﻔـﻪ
ﻣﻨﺸﻌﺐ ﺷﻮد .ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ ) (OCRxرا در ISRﻳﺎ ﻫﺮ زﻣﺎن دﻳﮕـﺮ ﻣـﻲ ﺗـﻮان ﺗﻐﻴﻴـﺮ داد اﻣـﺎ اﻳـﻦ ﻣﻘـﺪار در ﺑـﺎﻓﺮ
رﺟﻴﺴﺘﺮﻫﺎي OCR1Aو OCR1Bذﺧﻴﺮه ﺷﺪه و ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار TOPدر ﺧـﻮد رﺟﻴﺴـﺘﺮ Loadﻣـﻲ
ﺷﻮد ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻐﻴﻴﺮ دادن ﻣﻘﺪار رﺟﻴﺴﺘﺮﻫﺎي OCR1xﺑﻪ دﻟﻴـﻞ ﺗﻐﻴﻴـﺮ آن ﺑـﺎ رﺳـﻴﺪن ﺑـﻪ TOPﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋـﺚ
- ٩٦ -
P a g e | 97
www.eca.ir
TOP OCR1A=110
OCR1A=180
ﻣﺸﻜﻞ ﺑﺎﻻ در PWMﺗﺼﺤﻴﺢ ﻓﺎز و ﻓﺮﻛﺎﻧﺲ ﺑﺎ ﺑﺮوز ﻛﺮدن رﺟﻴﺴﺘﺮﻫﺎي OCR1xدر زﻣﺎن رﺳﻴﺪن ﺑﻪ 9
ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي OC1Aو OC1Bدر ﺣﺎﻟﺖ ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
COM1A1 COM1A0
وﺿﻌﻴﺖ ﭘﻴﻦ OC1Aﻳﺎ OC1B
/COM1B1 /COM1B0
اﮔﺮ WGM1[3:0] = 9, 14ﺑﺎﺷﺪ Toggle :ﭘﻴﻦ OC1Aدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و OC1Bﭘﻴﻦ I/O
0 1
ﻣﻌﻤﻮﻟﻲ ﺑﺮاي دﻳﮕﺮ ﺣﺎﻟﺖ ﻫﺎي ] :WGM1[3:0ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
1 0 Clearدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﺻﻌﻮدي Set .در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﻧﺰوﻟﻲ
1 1 Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﺻﻌﻮدي Clear .در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﻧﺰوﻟﻲ
ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMدر ﺣﺎﻟﺖ ﺗﺼﺤﻴﺢ ﻓﺎز ﻧﺼﻒ ﺣﺎﻟﺖ Fast PWMﺑﻮده و از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:
- ٩٧ -
P a g e | 98
www.eca.ir
ﻣﺜﺎل :10در ﺑﺮﻧﺎﻣﻪ ي ﻣﺜﺎل ﻗﺒﻞ Modeﺗﺎﻳﻤﺮ را از Fast PWMﺑﻪ Phase Correct PWMﺗﻐﻴﻴﺮ داده و ﻧﺼﻒ
;TCCR1A=0x83
;TCCR1B=0x02
;OCR1AL=0xFF
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﻪ دﻟﻴﻞ ﺑﺮوز ﻛﺮدن رﺟﻴﺴﺘﺮ OCR1xﺑﺎ رﺳﻴﺪن ﺑﻪ TOPﻣﻤﻜﻦ اﺳﺖ ﺷﻜﻞ ﻣـﻮج ﺧﺮوﺟـﻲ
ﻧﺎﻣﺘﻘﺎرن ﺷﻮد ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي ﺣﻞ اﻳﻦ ﻣﺸﻜﻞ Modeﭘﻨﺠﻢ ﺗﺎﻳﻤﺮ ﻳﻚ اﻳﻦ رﺟﻴﺴﺘﺮ را ﺑﺎ رﺳﻴﺪن ﺑﻪ ﺻﻔﺮ ﺑﺮوز ﻣﻲ ﻛﻨﺪ.
ﺗﻔﺎوت دﻳﮕﺮ اﻳﻦ Modeو ﻋﻤﻠﻜﺮد ﻗﺒﻠﻲ در اﻳﻦ اﺳﺖ ﻛـﻪ ﺗـﺎﻳﻤﺮ ﺗﻨﻬـﺎ در دو ﺣﺎﻟـﺖ زﻳـﺮ ﻛـﺎر ﻣـﻲ ﻛﻨـﺪ= 9 ،8) :
](WGM1[3:0
- ٩٨ -
P a g e | 99
www.eca.ir
ﻋﻤﻠﻜﺮد اﻳﻦ واﺣﺪ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ در اﺛﺮ ﺗﺮﻳﮕﺮ ﺷﺪن ورودي Captureاز ﭘﻴﻦ ICP1ﻳﺎ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ
ﮔﺮ آﻧﺎﻟﻮگ ﻣﻘﺪار ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ TCNT1در رﺟﻴﺴﺘﺮ ICR1ﻧﻮﺷﺘﻪ ﺷﺪه و ﻫﻤﺰﻣﺎن ﭘﺮﭼﻢ Captureﺗـﺎﻳﻤﺮ
ﻳﻚ ) (ICF1ﻳﻚ ﻣﻲ ﺷﻮد .در اﻳﻦ زﻣﺎن در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴـﺖ ﭘـﺮﭼﻢ ورودي (TICIE1) Captureاﻳـﻦ
ﺗﺮﻳﮕﺮ ﺷﺪن ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد .ﺑﺎ اﺟﺮا ﺷﺪن ISRﺑﻪ ﻃﻮر ﺧﻮدﻛﺎر ﺑﻴـﺖ ICF1ﺻـﻔﺮ ﺷـﺪه و ﻳـﺎ در
• رﺟﻴﺴﺘﺮ ICR1ﺑﻪ ﺟﺰ در ﺣﺎﻟﺘﻲ ﻛﻪ ﺑﻪ ﻋﻨﻮان TOPﺟﻬﺖ ﻣﻘﺎﻳﺴﻪ ﺑﻪ ﻛﺎر ﻣﻲ رود ) Modeﻫﺎي ،10 ،8
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺗﺮﻳﮕﺮ ﺷﺪن واﺣﺪ Captureﻣﻲ ﺗﻮاﻧﺪ از دو ﻣﻨﺒﻊ ﻣﺨﺘﻠﻒ ﺻﻮرت ﮔﻴﺮد ﻛﻪ اﻳﻦ از ﻃﺮﻳﻖ ﺑﻴﺖ
ACICدر رﺟﻴﺴﺘﺮ ACSRﺻﻮرت ﻣﻲ ﮔﻴﺮد .ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﭘﻴﻦ ICP1و ﻳﻚ ﺑـﻮدن آن ﺧﺮوﺟـﻲ ﻣﻘﺎﻳﺴـﻪ
ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ را اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﺪ .ﻫﻤﭽﻨﻴﻦ ﻧﻮع ﺳﻴﮕﻨﺎل ورودي از ﭘﻴﻦ ICP1ﺑﻮﺳﻴﻠﻪ ﺑﻴـﺖ ICES1از رﺟﻴﺴـﺘﺮ
TCCR1Bﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻪ ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه و ﻳـﻚ ﺑـﻮدن آن ﻟﺒـﻪ ي ﺑـﺎﻻ
- ٩٩ -
P a g e | 100
www.eca.ir
ورودي Captureداراي ﻳﻚ واﺣﺪ ﻛﺎﻫﺶ ﻧﻮﻳﺰ ﻧﻴﺰ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﻓﻴﻠﺘﺮ دﻳﺠﻴﺘـﺎل اﻳﻤﻨـﻲ ورودي را
ﺑﻬﺒﻮد ﻣﻲ ﺑﺨﺸﺪ .اﻳﻦ واﺣﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ICNC1از رﺟﻴﺴﺘﺮ TCCR1Bﻓﻌﺎل ﻣﻲ ﺷﻮد .ﺑﺎ ﻓﻌـﺎل ﺷـﺪن اﻳـﻦ
ﻓﻴﻠﺘﺮ ﺑﺎﻳﺪ ﺳﻴﮕﻨﺎل ﻧﻤﻮﻧﻪ ﺑﺮداري ﺷﺪه روي ﭘﺎﻳﻪ ي ICP1ﺑﺮاي ﭼﻬﺎر ﺳﻴﻜﻞ ﻛﻼك ﻣﻌﺘﺒﺮ ﺑﺎﺷﺪ.
*****************************************************/
Project : Servo Motor Controller
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
Chip type : ATmega16
Clock frequency : 16.000000 MHz
*****************************************************/
>#include <mega16.h
>#include <delay.h
#define xtal 16000000
)void main(void
{
;PORTD=0x00
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000.000 kHz
// Mode: Ph. & fr. cor. PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x80;
TCCR1B=0x12;
ICR1H=0x4E;
ICR1L=0x20; //ICR=20000
OCR1AH=0x03;
OCR1AL=0xE8; //1000
while (1)
{
for(OCR1A=1000;OCR1A<2000;OCR1A++)
delay_ms(1);
for(OCR1A=2000;OCR1A>1000;OCR1A--)
delay_ms(1);
};
}
- ١٠١ -
P a g e | 102
www.eca.ir
#include <mega16.h>
#define xtal 8000000
- ١٠٢ -
P a g e | 103
www.eca.ir
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0D,0x0E,0x0F,0x11,0x13,0x14,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x24,
0x26,0x29,0x2B,0x2D,0x30,0x32,0x35,0x37,0x3A,0x3D,0x3F,0x42,0x45,0x48,0x4B,0x4D,
0x50,0x53,0x56,0x59,0x5C,0x5F,0x62,0x65,0x69,0x6C,0x6F,0x72,0x75,0x78,0x7B,0x7E
};
char i=0;
void main(void) {
DDRD=0xFF;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000.000 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x81;
TCCR1B=0x09;
while (1);
}
- ١٠٤ -
P a g e | 105
www.eca.ir
RS-232cدر اواﺧﺮ دﻫﻪ 60ﻣﻴﻼدي ﺑﻪ ﺻﻮرت اﺳﺘﺎﻧﺪارد ﺗﻌﺮﻳﻒ ﺷﺪ و ﻫﻤﭽﻨﺎن ﻳﻜﻲ از اﺳـﺘﺎﻧﺪاردﻫﺎي ﭘﺮﻛـﺎرﺑﺮد
در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ و ﻛﺎرﺑﺮدﻫﺎي ﺻﻨﻌﺘﻲ اﺳﺖ .اﻳﻦ اﺳﺘﺎﻧﺪارد ﻫﻢ ارﺗﺒﺎط ﺳﺮﻳﺎل ﺳـﻨﻜﺮون و ﻫـﻢ آﺳـﻨﻜﺮون را
ﭘﺸﺘﻴﺒﺎﻧﻲ ﻛﺮده و ﺑﻪ ﺻﻮرت Full Duplexﻋﻤﻞ ﻣﻲ ﻧﻤﺎﻳﺪ .ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ ﺗﻨﻬﺎ ارﺗﺒﺎط آﺳﻨﻜﺮون را ﭘﺸﺘﻴﺒﺎﻧﻲ
ﻣﻲ ﻛﻨﻨﺪ و از ﻃﺮﻳﻖ ﭼﻴﭗ UARTﻣﻮﺟﻮد در ﺑﺮد اﺻﻠﻲ ،اﻃﻼﻋﺎت را از ﺣﺎﻟﺖ ﻣﻮازي ﺑﻪ ﺳـﺮﻳﺎل ﻳـﺎ از ﺳـﺮﻳﺎل ﺑـﻪ
ﻣﻮازي ﺗﺒﺪﻳﻞ ﻛﺮده و ﺑﺎ ﺗﻨﻈﻴﻤﺎت زﻣﺎﻧﻲ آن را از ﻃﺮﻳﻖ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻳﺎ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ.
ﭘﻮرت ﺳﺮﻳﺎل داراي ﻳﻚ ﻛﺎﻧﻜﺘﻮر 9ﭘﻴﻦ ﻣﻲ ﺑﺎﺷﺪ و از آﻧﺠﺎﻳﻲ ﻛﻪ اﻳﻦ اﺳﺘﺎﻧﺪارد در اﺑﺘﺪا ﺑﺮاي ارﺗﺒﺎط ﺑﺎ ﻣﻮدم ﻃﺮاﺣـﻲ
ﺷﺪه ﺑﻮد ،داراي ﭘﻴﻦ ﻫﺎي Handshakingو وﺿﻌﻴﺖ ﻣﻲ ﺑﺎﺷﺪ .اﻣﺎ ﻧـﻮع ﺧﺎﺻـﻲ از ارﺗﺒـﺎط ﺑـﺎ RS-232ﺑـﻪ ﻧـﺎم
Null-Modemﻛﻪ ﺗﻨﻬﺎ ﺷﺎﻣﻞ ﭘﻴﻦ ﻫﺎي ارﺳﺎل و درﻳﺎﻓﺖ اﺳﺖ ﺑﺮاي ارﺗﺒﺎط ﺑـﺎ ﻏﻴـﺮ از ﻣـﻮدم اﺳـﺘﻔﺎده ﻣـﻲ ﺷـﻮد.
ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻨﻬﺎ دو ﭘﻴﻦ Rxو ) Txو اﻟﺒﺘﻪ زﻣﻴﻦ( ﻣﻮرد ﻧﻴﺎز اﺳﺖ .در ﺷﻜﻞ زﻳﺮ ﻛﺎﻧﻜﺘﻮر ﭘﻮرت ﺳـﺮﻳﺎل را ﻛـﻪ D9ﻧـﺎم
Pin ﻋﻤﻠﻜﺮد
2 Receive Data ﻛﺎﻣﭙﻴﻮﺗﺮ اﻃﻼﻋﺎت ارﺳﺎل ﺷﺪه ﺗﻮﺳﻂ ﻣﻮدم را درﻳﺎﻓﺖ ﻣﻲ ﻧﻤﺎﻳﺪ.
4 Data Terminal Ready ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻪ ﻣﻮدم آﻣﺎدﮔﻲ ﺧﻮد را ﺑﺮاي ارﺗﺒﺎط اﻋﻼم ﻣﻲ دارد.
6 Data Set Ready ﻣﻮدم آﻣﺎدﮔﻲ ﺧﻮد را ﺑﺮاي ارﺗﺒﺎط ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ اﻋﻼم ﻣﻲ دارد.
7 Request To Send ﻛﺎﻣﭙﻴﻮﺗﺮ از ﻣﻮدم در راﺑﻄﻪ ﺑﺎ ارﺳﺎل اﻃﻼﻋﺎت ﺳﻮال ﻣﻲ ﻧﻤﺎﻳﺪ.
8 Clear To Send ﻣﻮدم ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ اﻋﻼم ﻣﻲ ﻧﻤﺎﻳﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ اﻃﻼﻋﺎﺗﻲ را ارﺳﺎل دارد.
ﺳﻄﺢ ﺳﻴﮕﻨﺎل:
در اﺳﺘﺎﻧﺪارد RS-232ﺳﻄﺢ وﻟﺘﺎژ +3ﺗﺎ +12ﻧﻤﺎﻳﺎﻧﮕﺮ وﺿﻌﻴﺖ Spaceﻳﺎ ﺻﻔﺮ ﻣﻨﻄﻘﻲ و ﺑﺎزه ي -3ﺗﺎ -12وﻟﺖ
اﮔﺮﭼﻪ ﺗﺠﻬﻴﺰات اﺳﺘﺎﻧﺪارد TTLﺑﺎ ﺳﻄﻮح ﻣﻨﻄﻘﻲ 0و 5وﻟﺖ ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ اﻣـﺎ ﻗﺎﻟـﺐ اﻃﻼﻋـﺎت ارﺳـﺎﻟﻲ ﺗﻔـﺎوﺗﻲ
ﻧﺪارد و ﺑﺎ ﻳﻚ ﻣﺪار ﺗﻐﻴﻴﺮ ﺳﻄﺢ وﻟﺘﺎژ PC ،ﻣﻲ ﺗﻮاﻧﺪ ﺑـﺎ ادوات TTLارﺗﺒـﺎط ﺑﺮﻗـﺮار ﻧﻤﺎﻳـﺪ .ﻳﻜـﻲ از ﻣﺒـﺪل ﻫـﺎي
ﻣﺘﺪاول ﺳﻄﺢ RS-232ﺑﻪ TTLﻣﺪار ﻣﺠﺘﻤﻊ MAX232و ﻳﺎ HIN232ﻣﻲ ﺑﺎﺷﺪ MAX232 .ﻳﻚ ﺗﺮاﺷـﻪ ي
16ﭘﺎﻳﻪ اﺳﺖ ﻛﻪ ﺷﺎﻣﻞ 2ﻓﺮﺳﺘﻨﺪه و 2ﻣﺒﺪل ﻣﺠﺰا اﺳﺖ .در زﻳﺮ ﻳﻚ ﻣﺪار ﻧﻤﻮﻧﻪ را ﺑﺮاي ﻛﺎر ﺑﺎ اﻳﻦ ICﻣﺸﺎﻫﺪه ﻣـﻲ
ﻛﻨﻴﺪ:
ﻗﺎﻟﺐ اﻃﻼﻋﺎت:
در ﻳﻚ Frameاﻃﻼﻋﺎﺗﻲ ﻛﻪ ﺗﻮﺳﻂ ﺑﻴﺖ ﺷﺮوع و ﺑﻴﺖ ﭘﺎﻳﺎن ﻣﺤﺼﻮر ﺷﺪه اﺳﺖ ﻣﻌﻤﻮﻻ 5ﺗﺎ 8ﺑﻴﺖ دﻳﺘـﺎ ﻗـﺮار ﻣـﻲ
ﮔﻴﺮد و ﻳﻚ ﺑﻴﺖ ﺗﻮازن ﻧﻴﺰ ﺑﻪ ﺻﻮرت اﺧﺘﻴﺎري ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد .ﺑﻴﺖ ﺷﺮوع ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﺻﻔﺮ ﻣﻨﻄﻘﻲ اﺳﺖ و ﺑﻴﺖ ﭘﺎﻳﺎن
)ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ 1ﻳﺎ 2ﺑﻴﺖ ﺑﺎﺷﺪ (.ﺗﻮﺳﻂ ﻳﻚ ﺷﻨﺎﺳﺎﻳﻲ ﻣﻲ ﺷﻮد .ﻣﺜﻼ در ﻧﻤﻮدار زﻣﺎﻧﻲ زﻳﺮ ﻳﻚ Frameﺷﺎﻣﻞ 10
ﺑﻴﺖ اﺳﺖ ﻛﻪ ﻫﻔﺖ ﺑﻴﺖ آن ﺷﺎﻣﻞ Dataﻳﻚ ﺑﻴﺖ آﻏﺎزﻳﻦ و ﻳﻚ ﺑﻴﺖ ﭘﺎﻳﺎﻧﻲ و ﻳﻚ ﺑﻴﺖ ﺗﻮازن ﻗﺒﻞ از ﺑﻴﺖ ﭘﺎﻳﺎن ﻣﻲ
ﺑﺎﺷﺪ:
ﺳﻨﻜﺮون ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﺪ .دﺳﺘﺮﺳﻲ ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل AVRاز ﻃﺮﻳـﻖ ﺳـﻪ ﭘـﻴﻦ RXD ،TXDو XCKﻛـﻪ ﺑـﻪ
ﺗﺮﺗﻴﺐ ﭘﻴﻦ ارﺳﺎل ،درﻳﺎﻓﺖ وﻛﻼك ﻣﻲ ﺑﺎﺷﻨﺪ اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ) .ﭘﻴﻦ XCKﻓﻘﻂ در Modeﺳﻨﻜﺮون ﻛﺎرﺑﺮد دارد(.
ﺑﻴﺖ ﻫﺎي داده ،ﺑﻴﺖ اﺧﺘﻴﺎري ﺗﻮازن و ﻳﻚ ﻳﺎ دو ﺑﻴﺖ ﭘﺎﻳﺎن اﺳﺖ ،ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ در AVRﻣﻲ ﺗﻮاﻧﺪ 5ﺗـﺎ 9ﺑﻴـﺖ
UCSRCﺗﻨﻈﻴﻢ ﻣﻲ ﺷﻮد.
رﺟﻴﺴﺘﺮﻫﺎي USART
ﺑﺎﻓﺮ درﻳﺎﻓﺖ و ارﺳﺎل ﭘﻮرت ﺳﺮﻳﺎل داراي ﻳﻚ آدرس ﻣﺸﺘﺮك ﺑﻪ ﻧﺎم UDRدر ﻓﻀﺎي I/O Registersﻣﻲ ﺑﺎﺷﻨﺪ.
ﺑﺎﻓﺮ ارﺳﺎل ،ﻣﻘﺼﺪ داده ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در رﺟﻴﺴﺘﺮ UDRﺑﻮده و ﺧﻮاﻧﺪن اﻳﻦ رﺟﻴﺴﺘﺮ ﻣﺤﺘﻮﻳـﺎت ﺑـﺎﻓﺮ درﻳﺎﻓـﺖ را
ﺑﻪ دﺳﺖ ﻣﻲ دﻫﺪ .ﺗﻨﻬﺎ زﻣﺎﻧﻲ ﻣـﻲ ﺗـﻮان روي رﺟﻴﺴـﺘﺮ UDRﻣﻘـﺪاري را ﻧﻮﺷـﺖ ﻛـﻪ ﺑﻴـﺖ UDREاز رﺟﻴﺴـﺘﺮ
UCSRAﻳﻚ ﺷﺪه ﺑﺎﺷﺪ و در ﻏﻴﺮ اﻳﻨﺼﻮرت دﻳﺘﺎي ارﺳﺎﻟﻲ ﺗﻮﺳﻂ USARTﻧﺎدﻳﺪه ﮔﺮﻓﺘﻪ ﻣـﻲ ﺷـﻮد .ﺑـﺎ ارﺳـﺎل
اﻃﻼﻋﺎت ﺑﻪ ﺑﺎﻓﺮ ارﺳﺎل USARTدر ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴـﺖ TXENاز رﺟﻴﺴـﺘﺮ UCSRBﻳـﻚ ﺑﺎﺷـﺪ اﻃﻼﻋـﺎت در
:Double the USART Transmission Speedﺑﺎ ﻳﻚ ﻛـﺮدن اﻳـﻦ ﺑﻴـﺖ در Modeآﺳـﻨﻜﺮون Baud
Rateدو ﺑﺮاﺑﺮ ﺧﻮاﻫﺪ ﺷﺪ .در Modeﺳﻨﻜﺮون اﻳﻦ ﺑﻴﺖ ﺑﺎﻳﺪ ﺻﻔﺮ ﺑﺎﺷﺪ.
:Parity Errorدر ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺗﻮﻟﻴﺪ ﺑﻴﺖ ﺗﻮازن از ﻃﺮﻳﻖ ﺑﻴﺖ ﻫﺎي ] ،UPM[1:0ﺑﺎ روي دادن ﺧﻄـﺎي
:Data Overrunﺑﺎ ﺑﺮوز Overrunاﻳﻦ ﺑﻴﺖ ﻳﻚ ﻣﻲ ﺷﻮد .ﺷﺮاﻳﻂ Overrunﻳﺎ ﻟﺒﺮﻳﺰ وﻗﺘـﻲ روي ﻣـﻲ دﻫـﺪ
ﻛﻪ ﺑﺎﻓﺮ درﻳﺎﻓﺖ ﭘﺮ ﺑﺎﺷﺪ و ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ﻧﻴﺰ ﻣﺤﺘﻮي داده ي ﺟﺪﻳـﺪي ﺑﺎﺷـﺪ و داده ي ﺟﺪﻳـﺪي ﻧﻴـﺰ از راه ﺑﺮﺳـﺪ،
ﻳﻌﻨﻲ ﻳﻚ ﺑﺎﻳﺖ در ﺑﺎﻓﺮ ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ﻣﻨﺘﻈﺮ ﺑﺎﺷﺪ و ﺑﻴﺖ ﺷﺮوع ﺟﺪﻳﺪي درﻳﺎﻓﺖ ﺷـﻮد .در اﻳـﻦ ﺣﺎﻟـﺖ اﻃﻼﻋـﺎت
:Frame Errorاﮔﺮ در Frameدرﻳﺎﻓﺖ ﺷﺪه ﺑﻴﺖ ﭘﺎﻳﺎن ﺻﻔﺮ ﺑﺎﺷﺪ اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺷﺪه و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﺻﻔﺮ
ﺧﻮاﻫﺪ ﺑﻮد.
:USART Data Register Emptyﻳﻚ ﺑﻮدن اﻳﻦ ﭘﺮﭼﻢ ﻧﺸﺎن دﻫﻨﺪه ي اﻳﻦ اﺳﺖ ﻛﻪ اﻃﻼﻋـﺎت ﻣﻮﺟـﻮد در
ﺑﺎﻓﺮ ارﺳﺎل ﺑﺮاي ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ارﺳﺎل ﺷﺪه و ﺑﺎﻓﺮ ارﺳﺎل آﻣﺎده ي درﻳﺎﻓﺖ ﻛﺎراﻛﺘﺮ ﺟﺪﻳﺪ اﺳﺖ .ﻫﻤﭽﻨﻴﻦ در ﺻﻮرﺗﻲ
ﻛﻪ ﺑﻴﺖ UDRIEاز رﺟﻴﺴﺘﺮ UCSRBﻳﻚ ﺑﺎﺷﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﺪه و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺑﻴﺖ UDREﻳـﻚ اﺳـﺖ
ﺑﺎ ﺧﺎرج ﺷﺪن از ISRدوﺑﺎره آن را اﺟﺮا ﻣﻲ ﻛﻨﺪ ﺑﺎ ﻧﻮﺷﺘﻦ داده ي ﺟﺪﻳﺪ در UDRﭘـﺮﭼﻢ UDREﺻـﻔﺮ ﻣـﻲ
ﺷﻮد .ﺑﻌﺪ از رﻳﺴﺖ ﺷﺪن ﻣﻴﻜﺮو اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻪ ﻣﻌﻨﺎي آﻣﺎده ﺑﻮدن درﻳﺎﻓﺖ ﻛﺎراﻛﺘﺮ ﺟﺪﻳﺪ اﺳﺖ.
رﺟﻴﺴﺘﺮ ﺑﻪ ﺑﻴﺮون ﺷﻴﻔﺖ داده ﺷﺪه و داده ي ﺟﺪﻳﺪي در ﺑﺎﻓﺮ ارﺳﺎل وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ .ﺑﺎ ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ
TXCIEاﻳﻦ ﭘﺮﭼﻢ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ي ﻛﺎﻣﻞ ﺷﺪن ارﺳﺎل ﺷﻮد و ﺑﺎ اﺟﺮاي ISRﺑﻴﺖ TXCﺗﻮﺳﻂ
ﺳﺨﺖ اﻓﺰار ﭘﺎك ﺷﺪه و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي آن ،آن را ﭘﺎك ﻛﻨﺪ.
:USART Receive Completeاﻳﻦ ﺑﻴﺖ ﺑﺎ ﻛﺎﻣﻞ ﺷﺪن درﻳﺎﻓﺖ ﻳﻚ Frameدر UDRﻳﻚ ﺷﺪه و ﭘﺲ از
:Transmit Data Bit 8در ﺣﺎﻟﺘﻲ ﻛﻪ از ﭘﻮرت ﺳﺮﻳﺎل در 9 Modeﺑﻴﺘﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷـﻮد اﻳـﻦ ﺑﻴـﺖ ﻧﻬﻤـﻴﻦ
ﺑﻴﺖ ﻛﺎراﻛﺘﺮ ارﺳﺎﻟﻲ ﺧﻮاﻫﺪ ﺑﻮد .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻗﺒﻞ از ﻧﻮﺷﺘﻦ در UDRﺑﺎﻳﺪ وﺿﻌﻴﺖ اﻳـﻦ ﺑﻴـﺖ را ﻣﺸـﺨﺺ
ﻛﺮد.
:Receive Data Bit 8در ﺣﺎﻟﺘﻲ ﻛﻪ از ﭘﻮرت ﺳﺮﻳﺎل در 9 Modeﺑﻴﺘﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد اﻳﻦ ﺑﻴﺖ ﻧﻬﻤﻴﻦ ﺑﻴـﺖ
ﻛﺎراﻛﺘﺮ درﻳﺎﻓﺘﻲ ﺧﻮاﻫﺪ ﺑﻮد .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻗﺒﻞ از ﺧﻮاﻧﺪن UDRﺑﺎﻳﺪ اﻳﻦ ﺑﻴﺖ را ﺧﻮاﻧﺪ.
:Character Sizeﺑﺎ ﺗﺮﻛﻴﺐ اﻳﻦ ﺑﻴﺖ و ﺑﻴﺖ ﻫﺎي ] UCSZ[1:0در رﺟﻴﺴﺘﺮ UCSRCﺗﻌﺪاد ﺑﻴـﺖ ﻫـﺎي داده
داده و ﺑﻌﺪ از آن ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﻪ ﺻﻮرت I/Oﻣﻌﻤﻮﻟﻲ ﻧﻴﺴﺖ .ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن اﻳﻦ ﺑﻴﺖ در ﺣﺎﻟﻴﻜﻪ UARTﺳـﺮﻳﺎل
:Receiver Enableﺑﺎ ﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﻋﻤﻠﻜﺮد ﻋﺎدي ﭘﻴﻦ RxDﺑﻪ درﻳﺎﻓﺖ ﭘﻮرت ﺳﺮﻳﺎل ﺗﻐﻴﻴﺮ ﺣﺎﻟـﺖ داده
و ﺑﻌﺪ از آن ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﻪ ﺻﻮرت I/Oﻣﻌﻤﻮﻟﻲ ﻧﻴﺴﺖ .ﺑﺎ ﺻﻔﺮ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﺑﺎﻓﺮ ﭘـﻮرت ﺳـﺮﻳﺎل ﺧـﺎﻟﻲ ﺷـﺪه و
:USART Data Register Empty Interrupt Enableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴـﺖ ،در ﺻـﻮرﺗﻲ ﻛـﻪ ﺑﻴـﺖ
ﻓﻌﺎل ﺳﺎز ﻛﻠﻲ وﻗﻔﻪ ﻫﺎ ) (Iﻳﻚ ﺑﺎﺷﺪ ،ﻓﻌﺎل ﺷﺪن ﭘﺮﭼﻢ ﺧﺎﻟﻲ ﺑﻮدن ﺑﺎﻓﺮ ارﺳﺎل ) (UDREﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋـﺚ اﻳﺠـﺎد
وﻗﻔﻪ ﺷﻮد.
:TX Complete Interrupt Enableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ،در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻛﻠﻲ وﻗﻔﻪ ﻫـﺎ )(I
ﻳﻚ ﺑﺎﺷﺪ ،ﻓﻌﺎل ﺷﺪن ﭘﺮﭼﻢ اﺗﻤﺎم ارﺳﺎل ) (TXCﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد.
:RX Complete Interrupt Enableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ،در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻛﻠﻲ وﻗﻔﻪ ﻫـﺎ )(I
ﻳﻚ ﺑﺎﺷﺪ ،ﻓﻌﺎل ﺷﺪن ﭘﺮﭼﻢ اﺗﻤﺎم ارﺳﺎل ) (RXCﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد.
:Clock Polarityاﻳﻦ ﺑﻴﺖ ﻓﻘﻂ در Modeﺳﻨﻜﺮون ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲ ﺷﻮد و در Modeآﺳﻨﻜﺮون ﺑﺎﻳﺪ روي آن
ﺻﻔﺮ ﻧﻮﺷﺘﻪ ﺷﻮد .ﻋﻤﻠﻜﺮد اﻳﻦ ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﺳﺖ:
ﻧﻤﻮﻧﻪ ﺑﺮداري از داده ي درﻳﺎﻓﺘﻲ روي ﭘﻴﻦ RxDﺗﻐﻴﻴﺮ داده ي ارﺳﺎﻟﻲ روي ﭘﻴﻦ UCPOL TxD
٠ ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ XCK ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ XCK
١ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ XCK ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ XCK
] :Character Size[1:0اﻳﻦ ﺑﻴﺖ ﺑﻪ ﻫﻤﺮاه ﺑﻴﺖ UCSZ2ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﺪاد ﺑﻴﺖ ﻫﺎي ﻳﻚ ﻛﺎراﻛﺘﺮ را
ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ،در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض اﻳﻦ ﺑﻴﺖ ﻫﺎ اﻧﺪازه ي 8ﺑﻴﺖ را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ.
:Stop Bit Selectاﻳﻦ ﺑﻴﺖ ،ﺗﻌﺪاد ﺑﻴﺖ ﻫﺎي ﭘﺎﻳﺎن را ﻣﻌﻴﻦ ﻣﻲ ﻛﻨﺪ .در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﻛﻪ اﻳﻦ ﺑﻴﺖ ﺻﻔﺮ ﻣﻲ
ﺑﺎﺷﺪ ﻳﻚ ﺑﻴﺖ ﭘﺎﻳﺎن و در ﺻﻮرت 1ﺷﺪن 2ﺑﻴﺖ ﭘﺎﻳﺎن در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد.
] :Parity Mode[1:0اﻳﻦ دو ﺑﻴﺖ ﺗﻨﻈﻴﻤﺎت ﻣﺮﺑﻮط ﺑﻪ ﺑﻴﺖ ﺗﻮازن را ﻣﻄـﺎﺑﻖ ﺟـﺪول زﻳـﺮ اﻧﺠـﺎم ﻣـﻲ دﻫﻨـﺪ .در
ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﺗﻮازن ﻫﻤﺮاه ﻫﺮ Frameاﻳﻦ ﺑﻴﺖ اﻳﺠﺎد ﺷﺪه و در ﮔﻴﺮﻧﺪه ﺑﺮ ﺣﺴﺐ ﻫﻤـﺎن ﺗﻨﻈﻴﻤـﺎت )ﻛـﻪ
ﺑﺎﻳﺪ در آﻧﺠﺎ ﻧﻴﺰ ﻣﻄﺎﺑﻖ ﺗﻨﻈﻴﻤﺎت ﻓﺮﺳﺘﻨﺪه اﻧﺠﺎم ﺷﻮد (.ﻣﻘﺪار ﺑﻴﺖ ﺗﻮازن ﺑﺎ ﻣﻘﺪار درﻳﺎﻓـﺖ ﺷـﺪه ﻣﻘﺎﻳﺴـﻪ ﺷـﺪه و در
UMSEL :USART Mode Selectﺣﺎﻟﺖ ﻛﺎر UARTرا ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ .در ﺻﻮرﺗﻲ اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺑﺎﺷﺪ در
ﻫﺴﺘﻨﺪ و اﻳﻦ ﺑﻴﺖ ﺑﺮاي اﻧﺘﺨﺎب ﻧﻮﺷﺘﻦ روي ﻳﻜﻲ از اﻳﻦ دو رﺟﻴﺴﺘﺮ ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ اﻳﻦ ﺻﻮرت ﻛﻪ اﮔﺮ ﺑﺨﻮاﻫﻴﻢ روي
UCSRCﻣﻘﺪاري را ﺑﻨﻮﻳﺴﻴﻢ ﺑﺎﻳﺪ در ﻫﻤﺎن ﺑﺎﻳﺖ MSBﻳﻚ ﺑﺎﺷﺪ و ﭼﻨﺎﻧﭽﻪ ﺑﺨﻮاﻫﻴﻢ روي UBRRHﻣﻘﺪاري
را ﺑﻨﻮﻳﺴﻴﻢ ﺑﺎﻳﺪ MSBﺻﻔﺮ ﺑﺎﺷﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل دﺳﺘﻮرات زﻳﺮ ﻣﻘﺪار ﺑﻴﺖ 1از ﻫﺮ رﺟﻴﺴﺘﺮ را ﻳﻚ ﻣﻲ ﻛﻨﺪ:
;UBRRH = 0x02
;UCSRC = 0x82
روش ﺧﻮاﻧﺪن اﻳﻦ دو رﺟﻴﺴﺘﺮ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ در ﺻﻮرت ﺧﻮاﻧـﺪن ﻣﻘـﺪار آدرس 0x40و ﻳـﺎ ﻫـﺮ ﻳـﻚ از
اﺳﺎﻣﻲ ﻣﺴﺘﻌﺎر اﻳﻦ آدرس ) UCSRCﻳﺎ (UBRRHﻣﻘﺪار رﺟﻴﺴﺘﺮ UBRRHﺑﻪ دﺳﺖ ﺧﻮاﻫﺪ آﻣﺪ:
;a = UBRRH
ﭼﻨﺎﻧﭽﻪ ﺑﺨﻮاﻫﻴﻢ ﻣﻘﺪار رﺟﻴﺴﺘﺮ UCSRCرا ﺑﺪﺳﺖ آورﻳﻢ ﺑﺎﻳﺪ در ﺳﻴﻜﻞ ﻛﻼك ﺑﻌﺪي ﻣﻘﺪار ﺧﻮاﻧـﺪه ﺷـﺪه را ﺑـﻪ
;b = UBRRH
;b = UCSRC
ﺑﻬﺘﺮ اﺳﺖ در ﺻﻮرت اﺳـﺘﻔﺎده از وﻗﻔـﻪ ،ﻗﺒـﻞ از ﭘﺮوﺳـﻪ ي ﺑـﺎﻻ ﺑﻴـﺖ ﻓﻌـﺎل ﺳـﺎز وﻗﻔـﻪ ﻫـﺎ را ﺑـﺎ دﺳـﺘﻮر 9
ﺷﻮد.
UBRRL ]UBRR[7:0
] :UBRRH[7:4ﺑﺮاي ﻛﺎرﺑﺮدﻫﺎي آﻳﻨﺪه رزرو ﺷﺪه ﻫﺴﺘﻨﺪ و ﺑﺮاي ﺳﺎزﮔﺎري ﺑﺎ ﻗﻄﻌﺎت آﺗﻲ ﺑﺎﻳﺪ روي آن ﻫﺎ ﺻﻔﺮ
ﻧﻮﺷﺘﻪ ﺷﻮد.
] :UBRR[11:0اﻳﻦ دوازده ﺑﻴﺖ ﺑﺮاي ﺗﻌﻴﻴﻦ Baud Rateراﺑﻂ USARTﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .ﺑﻪ اﻳﻦ
Modeﻛﺎري ﻣﺤﺎﺳﺒﻪ Baud Rateاز روي UBRR ﻣﺤﺎﺳﺒﻪ UBRRاز روي Baud Rate
BaudRate ClosestMatch
( = ]Error[% − 1) ×100%
BaudRate
ﻣﺜﺎل :1ﺑﺎ ﻛﻼك 8ﻣﮕﺎﻫﺮﺗﺰ و Baud Rate = 2400در Modeآﺳﻨﻜﺮون ﻋﺎدي ،ﻣﻘﺪار UBRRرا ﺑﺪﺳﺖ آورﻳﺪ.
8000000
= UBRR − 1 = 207.33 ⇒ UBRR = 207
16 × 2400
8000000
= BaudRate = 2404
)16(207 + 1
2404
( = ]Error[% − 1) × 100% = 0.2%
2400
ﺑﺮاي ﺻﻔﺮ ﺷﺪن ﺧﻄﺎ ﻣﻲ ﺗﻮان از ﻛﺮﺳﻴﺘﺎل 7.3728ﻣﮕﺎﻫﺮﺗﺰ اﺳﺘﻔﺎده ﻧﻤﻮد اﮔﺮﭼﻪ ﺣﺪاﻛﺜﺮ ﺧﻄﺎي ﻗﺎﺑﻞ ﻗﺒﻮل ﺑﺮاي
ﻛﺮﻳﺴﺘﺎل ﻫﺎﻳﻲ ﻛﻪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از آن ﻫﺎ ﺑﻪ ﺧﻄﺎي Baud Rateﺻﻔﺮ رﺳﻴﺪ ،3,6864 ،1,8432 9
ﻣﻘﺪار UBRRو ﺧﻄﺎﻫﺎي ﺣﺎﺻﻞ در ﻛﻠﻴﻪ ﺣﺎﻟﺖ ﻫﺎ در ﺻﻔﺤﺎت 166 -169از ﺑﺮﮔﻪ ي اﻃﻼﻋﺎﺗﻲ 9
ATmega16ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ.
اﻋﻼن اﻳﻦ ﺗﻮاﺑﻊ در ﻓﺎﻳﻞ stdio.hﻗﺮار دارد و ﻗﺒﻞ از اﺳﺘﻔﺎده از آن ﻫﺎ ﺑﺎﻳﺪ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ USARTاﻧﺠﺎم ﺷﻮد.
ﺗﺎﺑﻊ )( :getcharاﻳﻦ ﺗﺎﺑﻊ ﺑﻪ روش Pollingﻣﻨﺘﻈﺮ ﻣﻲ ﻣﺎﻧﺪ ﺗﺎ ﭘﺮﭼﻢ RXCﻳﻚ ﺷﺪه و ﺑﻌﺪ از آن ﻣﻘﺪار
UDRرا ﻣﻲ ﺧﻮاﻧﺪ.
ﺗﺎﺑﻊ )( :putcharاﻳﻦ ﺗﺎﺑﻊ ﺑﻪ روش Pollingﻣﻨﺘﻈﺮ ﻣﻲ ﻣﺎﻧﺪ ﺗـﺎ ﭘـﺮﭼﻢ UDREﻳـﻚ ﺷـﺪه و ﺑﻌـﺪ از آن ﻳـﻚ
ﻣﺜﺎل) :2ﻣﻴﻜﺮو اول ﺑﻌﺪ از 3ﺛﺎﻧﻴﻪ ﻋﺪد 7را ﺑﺮاي ﻣﻴﻜﺮو دوم ارﺳﺎل ﻣﻲ ﻛﻨﺪ و در ﻣﺪت اﻳﻦ ﺳﻪ ﺛﺎﻧﻴﻪ ﻣﻴﻜـﺮو دوم ﺑـﻪ
>#include <mega16.h
>#include <delay.h
>#include <stdio.h
#define xtal 8000000
)void main(void
{
;UCSRA=0x00
UCSRB=0x08; // USART Transmitter: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
;UBRRH=0x00
delay_ms(3000);
putchar(7);
while (1);
}
:ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو دوم
#include <mega16.h>
#include <stdio.h>
#define xtal 8000000
void main(void)
{
char a;
DDRA=0xFF;
PORTA=0xFF;
UCSRA=0x00;
UCSRB=0x10; // USART Receiver: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
UBRRH=0x00;
UBRRL=0x33; // USART Baud rate: 9600
- ١١٩ -
P a g e | 120
www.eca.ir
}
ﺗﻮاﺑﻊ ﺳﻄﺢ ﺑﺎﻻي USARTﺗﻨﻬﺎ ﺑﺮاي ﺻﺮﻓﻪ ﺟﻮﻳﻲ در وﻗﺖ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ ﺑﺎﺷﻨﺪ .در ﺻﻮرت ﻧﻴـﺎز ﻣـﻲ ﺗـﻮان ﺑـﻪ
ﺻﻮرت ﻣﺴﺘﻘﻴﻢ ﺑﺎ رﺟﻴﺴﺘﺮﻫﺎ ﻛﺎر ﻛﺮد .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﺣﻠﻘﻪ ي اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ي ﻣﻴﻜﺮو دوم را ﺑﻪ ﺻﻮرت زﻳﺮ ﻧﻴـﺰ ﻣـﻲ
ﺗﻮان ﻧﻮﺷﺖ:
;))while(!(UCSRA&0x80
;PORTA=UDR
;)while (1
ﺗﻮاﺑﻊ )( putsو )( :putsfاﻳﻦ ﺗﻮاﺑﻊ ﻳﻚ رﺷﺘﻪ را ﺗﻮﺳـﻂ USARTﺑـﻪ ﭘـﻮرت ﺳـﺮﻳﺎل ارﺳـﺎل ﻣـﻲ ﻛﻨﻨـﺪ .ﺗـﺎﺑﻊ
)( putsرﺷﺘﻪ اي را ﻛﻪ در SRAMاﺳﺖ و ﺗﺎﺑﻊ )( putsfرﺷﺘﻪ اي را ﻛﻪ در Flashاﺳﺖ ﺑﻪ ﺧﺮوﺟﻲ ارﺳﺎل ﻣـﻲ
ﻛﻨﺪ .اﺳﺎس ﺗﻤﺎم ﺗﻮاﺑﻊ ﺳﻄﺢ ﺑﺎﻻي USARTﺗﻮاﺑﻊ )( putcharو )( getcharﻣﻲ ﺑﺎﺷﻨﺪ و در اﻳﻨﺠﺎ ﻧﻴﺰ ﺑﺎ اﺳـﺘﻔﺎده
از اﺷــﺎره ﮔــﺮ ،Yﻛﺎراﻛﺘﺮﻫــﺎ ﭘﺸــﺖ ﺳــﺮ ﻫــﻢ ﺑﻮﺳــﻴﻠﻪ ي اﻳــﻦ ﺗﻮاﺑــﻊ ﺑــﻪ رﺟﻴﺴــﺘﺮ UDRارﺳــﺎل ﻣــﻲ ﺷــﻮﻧﺪ.
اﻳﻦ ﺗﻮاﺑﻊ ﺑﻪ اﻧﺘﻬﺎي رﺷﺘﻪ ﻛﺎراﻛﺘﺮ (0x10) LFرا اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻨﺪ. 9
ﻣﺜﺎل) :3رﺷﺘﻪ ﻫﺎي " "Kavoshو " "AVRﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﺷﻮﻧﺪ(.
>#include <mega16.h
>#include <delay.h
>#include <stdio.h
#define xtal 8000000
)void main(void
{
;UCSRA=0x00
UCSRB=0x08; // USART Transmitter: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
;UBRRH=0x00
UBRRL=0x33; // USART Baud rate: 9600
;)putsf(string1
;)puts(string2
;)while (1
}
ﺗﺎﺑﻊ )( :getsاﻳﻦ ﺗﺎﺑﻊ داراي دو آرﮔﻮﻣﺎن ﻧﺎم ﻣﺘﻐﻴﺮ و ﻃﻮل اﺳﺖ ﻛﻪ ﻣﻨﺘﻈﺮ ﻣﻲ ﻣﺎﻧﺪ ﺗﺎ ﻛﺎراﻛﺘﺮﻫﺎي درﻳﺎﻓﺘﻲ ﺑﻪ
ﻣﺜﺎل ) :4ﻣﻴﻜﺮو اول ﺑﻌﺪ از 1ﺛﺎﻧﻴﻪ ﻋﺪد رﺷﺘﻪ ي Kavoshرا ﺑﺮاي ﻣﻴﻜﺮو دوم ارﺳﺎل ﻣﻲ ﻛﻨﺪ و در ﻣﺪت اﻳﻦ ﻳﻚ
ﺛﺎﻧﻴﻪ ﻣﻴﻜﺮو دوم ﺑﻪ روش Pollingﻣﻨﺘﻈﺮ درﻳﺎﻓﺖ رﺷﺘﻪ ﻣﻲ ﻣﺎﻧﺪ و ﭘﺲ از درﻳﺎﻓﺖ آن را در LCDﻧﻤﺎﻳﺶ ﻣﻲ
دﻫﺪ(.
>#include <mega16.h
>#include <delay.h
- ١٢١ -
P a g e | 122
www.eca.ir
#include <stdio.h>
#define xtal 8000000
void main(void)
{
UCSRA=0x00;
UCSRB=0x08; // USART Transmitter: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
UBRRH=0x00;
UBRRL=0x33; // USART Baud rate: 9600
delay_ms(1000);
putsf(" Kavosh ");
while (1);
}
:2 ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو
#include <mega16.h>
#include <stdio.h>
#include <lcd.h>
#define xtal 8000000
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
- ١٢٢ -
P a g e | 123
www.eca.ir
char a[10];
void main(void)
{
UCSRA=0x00;
UCSRB=0x10; // USART Receiver: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
UBRRH=0x00;
UBRRL=0x33; // USART Baud rate: 9600
lcd_init(16);
lcd_clear();
lcd_putsf("Waiting...");
gets(a,10);
lcd_clear();
lcd_puts(a);
while(1);
ﻛﺎراﻛﺘﺮ ﻓﺮﻣﺖ ﻣﻲ ﺗﻮاﻧﺪ. اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ رﺷﺘﻪ ي ﻗﺎﻟﺐ ﺑﻨﺪي ﺷﺪه را ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﻛﻨﺪ:printf() ﺗﺎﺑﻊ
- ١٢٣ -
P a g e | 124
www.eca.ir
ﻳﻚ ﻛﺎراﻛﺘﺮ %c
ﻣﺜﺎل ) :5ﻳﻚ رﺷﺘﻪ ي ﻗﺎﻟﺐ ﺑﻨﺪي ﺷﺪه را ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﻛﻨﺪ(.
>#include <mega16.h
>#include <delay.h
>#include <stdio.h
#define xtal 8000000
;int a = 100
;'char b = 'A
;float pi = 3.14
;UCSRA=0x00
UCSRB=0x08; // USART Transmitter: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
;UBRRH=0x00
UBRRL=0x33; // USART Baud rate: 9600
;)while (1
}
ﺗﺎﺑﻊ )( printfاﻳﻦ ﻗﺎﺑﻠﻴﺖ را دارد ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻃﻮل ﻣﻴﺪان و دﻗﺖ ﭘﺎراﻣﺘﺮ را ﺗﻌﻴﻴﻦ ﻛﻨﺪ ﻛﻪ اﻳﻦ اﻣﻜﺎن ﺑﻪ ﺻﻮرت
%width.precisionﻗﺎﺑﻞ ﺗﻨﻈﻴﻢ ﻣﻲ ﺑﺎﺷﺪ width .ﻧﺸﺎن دﻫﻨﺪه ي ﻃﻮل ﻳﻚ ﻋﺪد اﺳﺖ ﻛﻪ در ﻣﻮرد اﻋﺪاد ﺻﺤﻴﺢ
اﮔﺮ ﺑﻴﺸﺘﺮ از ﺗﻌﺪاد ارﻗﺎم ﺑﺎﺷﺪ ﺑﻪ اﻧﺪازه ي اﺿﺎﻓﻪ ﺟﺎي ﺧﺎﻟﻲ در ﺳﻤﺖ ﭼﭗ ﻋﺪد در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷـﻮد و ﭼﻨﺎﻧﭽـﻪ
ﻋﺪد اﻋﺸﺎري ﺑﺎﺷﺪ اﻳﻦ ﻣﻘﺪار ﺑﻴﺎﻧﮕﺮ ﻗﺴﻤﺖ ﺻﺤﻴﺢ و " ".و ﻗﺴﻤﺖ اﻋﺸﺎري ﻣـﻲ ﺑﺎﺷـﺪ precision .ﻣﻘـﺪار دﻗـﺖ
اﻋﺸﺎر را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل اﮔﺮ a = 3.145ﺑﺎﺷﺪ دﺳﺘﻮر زﻳﺮ a=3.14را ﭼﺎپ ﻣﻲ ﻛﻨﺪ.
;)printf("a=%4.2",a
ﺗﺎﺑﻊ )( :scanfﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﺗﺎﺑﻊ ﻣﻲ ﺗﻮاﻧﺪ ﻗﺎﻟﺐ اﻃﻼﻋﺎت درﻳﺎﻓﺘﻲ از ﭘﻮرت ﺳﺮﻳﺎل را ﺗﻌﻴﻴﻦ ﻧﻤﻮد .ﻃﺮز ﻛﺎر
ﻋﺒﺎرت دوم ﻧﺎم ﻣﺘﻐﻴﺮي اﺳﺖ ﻛﻪ رﺷﺘﻪ ي درﻳﺎﻓﺘﻲ در آن ﻗﺮار ﻣﻲ ﮔﻴﺮد و ﻋﺒﺎرت اول ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻗﺎﻟﺐ داده ي
درﻳﺎﻓﺘﻲ ﺑﻪ ﭼﻪ ﺻﻮرت ﺑﺎﺷﺪ .ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻃﻮل رﺷﺘﻪ ي درﻳﺎﻓﺘﻲ 256ﻛﺎراﻛﺘﺮ اﺳﺖ اﻣﺎ ﺑـﺎ اﻓـﺰودن ﻃـﻮل
ﻗﺒﻞ از ﻛﺎراﻛﺘﺮ ﻓﺮﻣﺖ ﻣﻲ ﺗﻮان آن را ﺑﻪ ﻣﻘﺪار دﻟﺨﻮاه ﻛﺎﻫﺶ داد .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل:
)scanf("%10d",a
10ﻛﺎراﻛﺘﺮ را از ورودي ﺧﻮاﻧﺪه و در ﻣﺘﻐﻴﺮ aذﺧﻴﺮه ﻣﻲ ﻛﻨﺪ.
ﺗﻮﺟﻪ :ﺗﻮاﺑﻊ )( printfو )( scanfﺣﺠﻢ زﻳﺎدي از ﺣﺎﻓﻈﻪ ي Flashرا ﻣﺼﺮف ﻛﺮده و ﺳﺮﻋﺖ اﺟﺮاي آن ﻫﺎ
ﭘﺎﻳﻴﻦ اﺳﺖ ،ﺑﻨﺎﺑﺮاﻳﻦ ﺗﺎ ﺣﺪ اﻣﻜﺎن از آن ﻫﺎ اﺳﺘﻔﺎده ﻧﻜﺮده و در ﺻﻮرت ﻟﺰوم ﻣﺸﺨﺼﺎت آن ﻫﺎ را ﺑﻪ ﺳﺎده ﺗﺮﻳﻦ
ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ UMSELاز رﺟﻴﺴﺘﺮ UCSRCﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ در اﻳﻦ ﺣﺎﻟﺖ ﻗﺮار ﻣﻲ ﮔﻴﺮد و اﺗﺼﺎﻻت ﺳﺨﺖ
TxD TxD
RxD RxD
XCK XCK
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي UCPOLﻣﻲ ﺗﻮان ﻟﺒﻪ ي ﻧﻤﻮﻧﻪ ﺑﺮداري و ﺗﻐﻴﻴﺮ ﺑﺮ اﺳﺎل ﻛﻼك را ﺗﻌﻴﻴﻦ
ﻧﻤﻮد .ﻣﺴﺌﻠﻪ اي ﻛﻪ ﺑﺎﻳﺪ در Modeﺳﻨﻜﺮون رﻋﺎﻳﺖ ﺷﻮد اﻳﻦ اﺳﺖ ﻛﻪ داده ﺑﺎﻳﺪ در ﺧﻼف ﻟﺒـﻪ اي ﻛـﻪ در ﻓﺮﺳـﺘﻨﺪه
ارﺳﺎل ﺷﺪه اﺳﺖ ،در ﮔﻴﺮﻧﺪه ﻧﻤﻮﻧﻪ ﺑﺮداري ﺷﻮد ﻳﻌﻨﻲ اﮔﺮ داده در ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ارﺳﺎل ﺷﺪه ﺑﺎﺷﺪ در ﻟﺒﻪ ي ﺑﺎﻻ
وﺿﻌﻴﺖ Multi-processor
ﺑﺮاي اﻳﺠﺎد ﺷﺒﻜﻪ ﺑﻴﻦ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎ از اﻳﻦ Modeاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .ﻣﻌﻤﻮﻻ ﻳﻚ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺑﻪ ﻋﻨﻮان Masterو
TxD
Master MCU
RxD
Slave 1
Slave 2
Slave 3
Slave 4
ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ MPCMاز رﺟﻴﺴﺘﺮ UCSRAﻣﻴﻜﺮوﻛﻨﺘﺮﻟـﺮ وارد اﻳـﻦ Modeﺧﻮاﻫـﺪ ﺷـﺪ .ﺑـﺮاي ﻣﺒﺎدﻟـﻪ ي
اﻃﻼﻋﺎت ﺑﻴﻦ Masterو ،Slaveﺑﺎﻳﺪ Slaveﺗﻮﺳﻂ Masterآدرس دﻫﻲ ﺷﻮد ﻛﻪ ﺑﺪﻳﻦ ﻣﻨﻈﻮر از ﺑﻴﻦ ﻧﻬـﻢ داده
)(TXB8اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .آدرس Slaveﻫﺎ ﻗﺒﻼ ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺗﻌﻴﻴﻦ ﺷﺪه و ﺗﻤﺎم آن ﻫﺎ ﺑﺎﻳﺪ ﺑﺎ ﻳـﻚ ﺷـﺪن
ﺑﻴﺖ MPCMدر Modeﭼﻨﺪ ﭘﺮدازﻧﺪه اي ﻗﺮار ﺑﮕﻴﺮﻧﺪ و ﻣﻨﺘﻈﺮ درﻳﺎﻓﺖ آدرس از Masterﺑﻤﺎﻧﻨﺪ .ﺑـﺮاي ﺷـﺮوع
ارﺗﺒﺎط Masterﻳﻚ ﻓـﺮﻳﻢ اﻃﻼﻋـﺎﺗﻲ 9ﺑﻴﺘـﻲ ﻛـﻪ ﻫﺸـﺖ ﺑﻴـﺖ آن ﺷـﺎﻣﻞ آدرس و ﺑﻴـﺖ ﻧﻬـﻢ آن ﻳـﻚ اﺳـﺖ ﺑـﻪ
ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎ ارﺳﺎل ﻣﻲ ﻛﻨﺪ .ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻧﻬﻢ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ رﻓﺘﺎر Slaveﻫﺎ ﺑﺎ داده ي درﻳﺎﻓﺘﻲ ﻫﻤﺎﻧﻨﺪ ﻳﻚ
آدرس ﺑﻮده و آن را ﺑﺎ آدرس ﺧﻮد ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪ Slave .اﻧﺘﺨﺎب ﺷﺪه ﺑﻴﺖ MPCMﺧـﻮد را ﭘـﺎك ﻛـﺮده و ﻣﻨﺘﻈـﺮ
درﻳﺎﻓﺖ داده ﻣﻲ ﻣﺎﻧﺪ و ﺑﻘﻴﻪ Slaveﻫﺎ ﻛﻪ ﺑﻴﺖ MPCMآن ﻫﺎ ﻳﻚ اﺳﺖ ﻫﻤﭽﻨﺎن ﻣﻨﺘﻈﺮ درﻳﺎﻓﺖ آدرس ﻣﻲ ﻣﺎﻧﻨﺪ.
در اﻳﻦ زﻣﺎن Slaveاﻧﺘﺨﺎب ﺷﺪه ﺑﺎ ارﺳﺎل ﭘﻴﺎﻣﻲ ﺑﺮاي Masterﺗﺼﺪﻳﻖ ﻣﻲ ﻓﺮﺳﺘﻨﺪ ﺗﺎ ﺑﻴﺖ ﻧﻬﻢ ﺧﻮد را ﺻـﻔﺮ ﻛﻨـﺪ
ﺗﺎ در در ارﺳﺎل ﺑﻌﺪي ﺑﻪ اﺷﺘﺒﺎه Slaveدﻳﮕﺮي اﻧﺘﺨﺎب ﻧﺸﻮد .ﭘﺲ از اﺗﻤﺎم ارﺳﺎل داده Masterﻣﺠﺪدا ﺑﻪ ﻧﺸـﺎﻧﻪ ي
آدرس دﻫﻲ ﺑﻴﺖ ﻧﻬﻢ ﺧﻮد را ﻳﻚ ﻛﺮده و آدرس دﻳﮕﺮي را ارﺳﺎل ﻣﻲ ﻛﻨﺪ Slave .ﻗﺒﻞ ﻛﻪ ﺑﻴﺖ MPCMآن ﺻـﻔﺮ
ﺷﺪه ﺑﻮد ﻣﺠﺪدا اﻳﻦ ﺑﻴﺖ را ﻳﻚ ﻛﺮده و آﻣﺎده ي درﻳﺎﻓﺖ آدرس ﻣﻲ ﺷﻮد.
ارﺗﺒﺎط ﺑﻴﻦ ﻛﺎﻣﭙﻴﻮﺗﺮ و PCﺑﻪ ﺻﻮرت Null-Modemﺑﻮده و ﻫﻤﺎﻧﻄﻮر ﻛﻪ اﺷﺎره ﺷﺪ ﺑﺮاي ﺗﻐﻴﻴﺮ ﺳﻄﺢ RS-
ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﭘﻮرت ﻫﺎي COMدر وﻳﮋوال ﺑﻴﺴﻴﻚ ﻣﻲ ﺗﻮان از ﻛﻨﺘﺮل MSCommﻛﻪ ﻫﻤﺮاه ﻛﺎﻣﭙﺎﻳﻠﺮ وﺟﻮد
دارد اﺳﺘﻔﺎده ﻧﻤﻮد .اﻳﻦ ﻛﻨﺘﺮل ،ارﺗﺒﺎط دﻫﻲ ﭘﻮرت ﺳﺮﻳﺎل را از ﻃﺮﻳﻖ ﻓﺎﻳﻞ mscomm32.ocxﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ
ﺣﺎﺻﻞ ﮔﺰﻳﻨﻪ ي Microsoft Comm Control 6.0را ﻋﻼﻣﺖ زده و دﻛﻤﻪ ي OKرا ﻛﻠﻴﻚ ﻛﻨﻴﺪ.
MSComm1.Settings = "9600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True
MSComm1.Output = "Test" + Chr(16)
End Sub
ﺑﺪون ﺑﻴﺖ،Baud Rate=1200 ﺑﺎTest رﺷﺘﻪ ي. ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪF5 ﺑﺎ ﻓﺸﺮدن دﻛﻤﻪ ي .٧
- ١٣١ -
P a g e | 132
www.eca.ir
ﺷﻤﺎﺗﻴﻚ:
ﭘﺲ از ﭘﻴﻜﺮﺑﻨﺪي ﺳﺨﺖ اﻓﺰاري ﻣﺪار ﻧﻴﺎز ﺑﻪ دراﻳﻮر دارد ﻛﻪ ﺗﻨﻈﻴﻢ آن در Win XPﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:
http://www.ftdichip.com/Drivers/VCP.htm
ﻓﺎﻳﻞ ﺑﺎرﮔﺬاري ﺷﺪه را در ﻳﻚ ﻣﺴﻴﺮ دﻟﺨﻮاه Unzipﻛﻨﻴﺪ) .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل(E:\CDM 2.00.00 : (2
Hardwareﻇﺎﻫﺮ ﺷﺪه و ﭘﺲ از آن ﻛﺎدر ﻣﺤﺎوره ي Found New Hardware Wizardﻧﻤﺎﻳﺶ داده ﻣﻲ
در ﻛﺎدر ﺣﺎﺻﻞ ﻣﺴﻴﺮ دراﻳﻮر را وارد ﻛﺮده و ﺑﺮ روي Nextﻛﻠﻴﻚ ﻧﻤﺎﻳﻴﺪ. (4
در ﺻﻮرﺗﻲ ﻛﻪ وﻳﻨﺪوز ﺑﻪ ﻧﺤﻮي ﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه ﺑﺎﺷـﺪ ﻛـﻪ در ﺻـﻮرت ﻧﺼـﺐ دراﻳﻮرﻫـﺎي آزﻣـﺎﻳﺶ ﻧﺸـﺪه ﺗﻮﺳـﻂ
ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ،ﭘﻴﻐﺎﻣﻲ داده ﺷﻮد اﺧﻄﺎر زﻳﺮ اﻳﺠﺎد ﺷﺪه و در اﻳﻦ ﺣﺎﻟﺖ ﺑﺎ ﭼﺸﻢ ﭘﻮﺷﻲ از اﺧﻄﺎر ﺑﺮ روي Continue
Anywayﻛﻠﻴﻚ ﻛﻨﻴﺪ.
ﻛﺎدر زﻳﺮ ﻧﻤﺎﻳﺶ داده ﺷﺪه و ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻛﻪ وﻳﻨﺪوز در ﺣﺎل ﻛﭙﻲ ﻧﻤﻮدن ﻓﺎﻳﻞ ﻫﺎي ﻣﻮرد ﻧﻴﺎز ﻣﻲ ﺑﺎﺷﺪ. (5
ﺗﻤﺎم ﻣﻲ ﺷﻮد.
) Device Managerدر ﻣﺴﻴﺮ Control Panel\Systemﺑﺮ روي زﺑﺎﻧﻪ ي (Hardwareرا ﺑﺎز ﻛﻨﻴـﺪ (7
و درﺧﺖ Portرا ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ] [+ﻛﻨﺎر آن ﺑﺴﻂ دﻫﻴﺪ .ﻣﻼﺣﻈﻪ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ COMﻣﺠﺎزي ﺑﺎ ﻧﺎم COMxﺑﻪ
ﻟﻴﺴﺖ اﻓﺰوده ﺷﺪه اﺳﺖ .از اﻳﻦ ﭘﺲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻄﺎﺑﻖ ﭘﺮوژه ي 12اﻃﻼﻋﺎت را ﺑﻪ COMxارﺳﺎل ﻳﺎ درﻳﺎﻓﺖ ﻛـﺮده
- ١٣٨ -
P a g e | 139
www.eca.ir
اﺳﺘﺎﻧﺪارد I2Cدر اواﻳﻞ دﻫﻪ 1980ﺗﻮﺳﻂ ﺷﺮﻛﺖ Philipsﻃﺮاﺣﻲ ﺷﺪ .در اﺑﺘـﺪا اﻳـﻦ ﭘﺮوﺗﻜـﻞ ﺑـﻪ ﻣﻨﻈـﻮر اﻳﺠـﺎد
روﺷﻲ ﺳﺎده ﺑﺮاي اﻳﺠﺎد ارﺗﺒﺎط ﭘﺮدازﻧﺪه ﺑﺎ ﺗﺮاﺷﻪ ﻫﺎي ﺟﺎﻧﺒﻲ در ﻳﻚ دﺳﺘﮕﺎه ﺗﻠﻮﻳﺰﻳﻮن اﺑﺪاع ﺷﺪ.
I2Cﻃﺒﻖ ﺗﻌﺮﻳﻒ ﺷﺮﻛﺖ ﻓﻴﻠﻴﭙﺲ ﻣﺨﻔﻒ Inter-ICﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻴﺎﻧﮕﺮ ﻫﺪف آن ﻳﻌﻨﻲ ﻓـﺮاﻫﻢ آوردن ﻳـﻚ ﻟﻴﻨـﻚ
ارﺗﺒﺎﻃﻲ ﺑﻴﻦ ﻣﺪارات ﻣﺠﺘﻤﻊ ﻣﻲ ﺑﺎﺷﺪ .اﻣﺮوزه اﻳﻦ ﭘﺮوﺗﻜﻞ ﺑﻪ ﺻـﻮرت ﻋﻤـﻮﻣﻲ در ﺻـﻨﻌﺖ ﭘﺬﻳﺮﻓﺘـﻪ ﺷـﺪه اﺳـﺖ و
ﻛﺎرﺑﺮد آن از ﺳﻄﺢ ﺗﺠﻬﻴﺰات ﺻﻮﺗﻲ و ﺗﺼﻮﻳﺮي ﻧﻴﺰ ﻓﺮاﺗﺮ رﻓﺘﻪ اﺳﺖ .ﺑﻪ ﮔﻮﻧﻪ اي ﻛﻪ اﻣﺮوزه در ﺑـﻴﺶ از 1000ﻧـﻮع
ICﻣﺨﺘﻠﻒ ﺑﻪ ﻛﺎر ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ I2C .ﻓﻀﺎ را ﺣﻔﻆ ﻣﻲ ﻛﻨﺪ و ﺑﺎﻋﺚ ﻛﺎﻫﺶ ﭼﺸﻤﮕﻴﺮ ﻫﺰﻳﻨﻪ ي ﻧﻬﺎﻳﻲ ﻣﻲ ﺷـﻮد.
دو ﺧﻂ ارﺗﺒﺎﻃﻲ ﺑﻪ ﻣﻌﻨﻲ Trackﻫﺎي ﻣﺴﻲ ﻛﻤﺘﺮ و در ﻧﺘﻴﺠﻪ ﺑﺮد ﻣﺪار ﭼﺎﭘﻲ ﻛﻮﭼﻜﺘﺮ و ﺗﺴﺖ ﻋﻴﺐ ﻳﺎﺑﻲ ﺳـﺮﻳﻌﺘﺮ و
راﺣﺘﺘﺮ ﻣﻲ ﺑﺎﺷﺪ .ﻋﻼوه ﺑﺮ اﻳﻦ در اﻏﻠﺐ ﻣﻮارد ﺣﺴﺎﺳﻴﺖ ﻣﺪار اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻧﺴﺒﺖ ﺑﻪ ﺗﺪاﺧﻞ اﻣـﻮاج اﻟﻜﺘﺮوﻣﻐﻨﺎﻃﻴﺴـﻲ
I2C .1ﻳﻚ ﭘﺮوﺗﻜﻞ ﺳﺮﻳﺎل ﺳﻨﻜﺮون ﻣﻲ ﺑﺎﺷﺪ و ﻛﻼك آن ﻣﻲ ﺗﻮاﻧﺪ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﺗﻐﻴﻴﺮ ﻛﻨﺪ.
.2آدرس دﻫﻲ 7ﺑﻴﺘﻲ ) 127وﺳﻴﻠﻪ ي ﻣﺘﻔﺎوت ﺑﺮ روي ﺑﺎس( و ﻧﻴﺰ آدرس دﻫـﻲ 10ﺑﻴﺘـﻲ در وﻳـﺮاﻳﺶ ﺟﺪﻳـﺪ اﻳـﻦ
.4ﺑﺮ روي ﺑﺎس اﻃﻼﻋﺎت 8ﺑﻴﺘﻲ ﺑﻪ ﺻﻮرت دو ﺟﻬﺘﻪ ﺑﺎ ﻧﺮخ ارﺳﺎل ﺣﺪاﻛﺜﺮ 400ﻛﻴﻠﻮﺑﻴﺖ ﺑﺮ ﺛﺎﻧﻴـﻪ) .و 3,4ﻣﮕﺎﺑﻴـﺖ
.6ﺣﺬف Spikeﻫﺎي ﻧﺎﺧﻮاﺳﺘﻪ از ﺧﻂ SDAﺑﺎ اﺳﺘﻔﺎده از ﻓﻴﻠﺘﺮ ﻣﻮﺟﻮد در ﭼﻴﭗ ،ﺑـﻪ ﻃـﻮري ﻛـﻪ ﺳـﻴﮕﻨﺎل ﻫـﺎي
.7ﭘﻴﻦ ﻫﺎي SDAو SCLﻣﺠﻬﺰ ﺑﻪ ﻛﻨﺘﺮل ﻛﻨﻨﺪه ي Slew Rateﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻛﺎراﻳﻲ ﺑـﺎس I2Cرا در ﻓﺮﻛـﺎﻧﺲ
ﻫﺎي ﺑﺎﻻ )ﻧﺰدﻳﻚ 400ﻛﻴﻠﻮﻫﺮﺗﺰ( ﺑﻬﺒﻮد ﻣﻲ ﺑﺨﺸﺪ .ﻋﻤﻠﻜﺮد ﻛﻨﺘﺮل ﻛﻨﻨﺪه ﺑﻪ اﻳـﻦ ﺻـﻮرت اﺳـﺖ ﻛـﻪ ﻟﺒـﻪ ﻫـﺎي ﺗﻴـﺰ
ﺳﻴﮕﻨﺎل را ﺗﺎ ﺣﺪودي ﺻﺎف ﻛﺮده و در واﻗﻊ ﺑﺎ ﺣﺬف ﻫﺎرﻣﻮﻧﻴﻚ ﻫﺎي ﺑﺎﻻ ﺑﻪ ﻛﺎﻫﺶ EMIﻛﻤﻚ ﻣﻲ ﻛﻨﺪ.
.8ﻋﺪم ﻧﻴﺎز ﺑﻪ ﻃﺮاﺣﻲ ﻣﺪار واﺳﻂ و راه اﻧﺪازي ﺑﺎس ﺗﻨﻬﺎ ﺑﺎ دو ﻣﻘﺎوﻣﺖ زﻳﺮا ﻛﻪ ﻣﺪار ﻛﻨﺘﺮل ﺑﺎس ﺑﻪ ﺻﻮرت ﻣﺠﺘﻤـﻊ
:Masterوﺳﻴﻠﻪ اي اﺳﺖ ﻛﻪ ﺷﺮوع ﻛﻨﻨﺪه ي ارﺳﺎل اﻃﻼﻋﺎت و ﺗﻮﻟﻴﺪ ﻛﻨﻨـﺪه ي ﭘـﺎﻟﺲ ﻛـﻼك و ﭘﺎﻳـﺎن دﻫﻨـﺪه ي
ﺧﻮد درآورﻧﺪ ،ﺗﻨﻬﺎ ﻳﻜﻲ از آن ﻫﺎ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﻣﻮﻓﻖ ﺷﻮد.
Pull-upﻣﺸﺨﺺ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻣﻘﺪار ﺗﻘﺮﻳﺒﻲ آن ﻫﺎ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺳﺮﻋﺖ ارﺗﺒﺎط ﺑﻪ ﻃﻮر ﺗﻘﺮﻳﺒﻲ از ﺷﻜﻞ زﻳـﺮ ﺑﺪﺳـﺖ
ﻣﻲ آﻳﺪ:
ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ اﺳﺘﻔﺎده از ﻳﻚ ﻣﻘﺎوﻣـﺖ Pull-upﻣﺸـﺘﺮك ﺑﺎﻋـﺚ اﻳﺠـﺎد ﻳـﻚ ﺑـﺎس
Wired-ANDﻣﻲ ﺷﻮد ،ﺑﺪﻳﻦ ﻣﻌﻨﺎ ﻛﻪ ﺑﺮاي ﺻﻔﺮ ﺷﺪن ﺑﺎس ﺗﻨﻬﺎ ﻻزم اﺳﺖ ﻛﻪ ﻳﻜﻲ از وﺳﺎﻳﻞ ﺧﻂ را Lowﻛﻨﺪ.
ﻫﺮ ﭼﻨﺪ ﺗﻜﻨﻴﻚ اراﺋـﻪ ﺷـﺪه در ﻣـﻮرد Open-collectorﺑـﻮدن و ﻣﻘﺎوﻣﺘﻬـﺎي Pull-upداراي ﻣﺰﻳـﺖWired-
ANDﻣﻲ ﺑﺎﺷﺪ وﻟﻲ اﻳﻦ ﻣﻮﺿﻮع در ﻣﻮرد ﺧﻄﻮط ﻃﻮﻻﻧﻲ ﻛﻪ داراي ﻳﻚ ﻇﺮﻓﻴﺖ ﺧﺎزﻧﻲ ﻣـﻲ ﺑﺎﺷـﻨﺪ ﺑﺎﻋـﺚ اﻳﺠـﺎد
ﻳﻚ ﺛﺎﺑﺖ زﻣﺎﻧﻲ RCﻣﻲ ﮔﺮدد ﻛﻪ ﺑﺮاي رﻓﻊ اﻳﻦ ﻣﻮﺿﻮع ﺑﻪ ﺟﺎي ﻣﻘﺎوﻣﺖ ﻣﻲ ﺗﻮان از Pull-upﻓﻌﺎل و ﻳﺎ ﺑﺎﻓﺮﻫـﺎي
ﺳﻮﻳﻴﭻ ،ﺑﺎﻋﺚ ﺷﺎرژ ﺷﺮﻳﻊ ﺧﺎزن ﭘﺎرازﻳﺘﻲ ﺷﺪه و در ﻧﺘﻴﺠﻪ زﻣﺎن ﺻﻌﻮد و ﻧﺰول ﭘﺎﻟﺲ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ.
ﺑﺎس I2Cداراي ﺗﻌﺪادي وﺿﻌﻴﺖ ﻳﺎ ﻋﻨﺼﺮ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ وﺿﻌﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﭼﻪ زﻣﺎﻧﻲ ﻳﻚ اﻧﺘﻘﺎل آﻏﺎز
ﺷﻮد ،ﺧﺎﺗﻤﻪ ﻳﺎﺑﺪ ،ﺗﺎﻳﻴﺪﻳﻪ ﮔﺮﻓﺘﻪ ﺷﻮد و ﻏﻴﺮه .ﺷﻤﺎي ﻛﻠﻲ اﻳﻦ ﻋﻨﺎﺻﺮ را در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ:
ﺷﺮاﻳﻂ آﻏﺎز ﻳﺎ :Start Conditionاز زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز اﻳﺠﺎد ﻣﻲ ﺷﻮد ﺗﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ،ﺑﺎس
Busyﻣﺤﺴﻮب ﻣﻲ ﺷﻮد .ﻧﻤﻮدار زﻣﺎﻧﻲ اﻳﺠﺎد اﻳﻦ وﺿﻌﻴﺖ ﺑﻪ اﻳﻦ ﺻﻮرت ﻣﻲ ﺑﺎﺷﺪ:
ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ :Stop Conditionﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎس آزاد ﺷﺪه و ﻣﻲ ﺗﻮاﻧﺪ ﺗﻮﺳﻂ ﻳﻚ Device
ﺷﺮاﻳﻂ ﺷﺮوع ﻣﺠﺪد ﻳﺎ :Restart Conditionاﻳﻦ وﺿﻌﻴﺖ زﻣﺎﻧﻲ ﻛﺎرﺑﺮد دارد ﻛﻪ وﺳﻴﻠﻪ ﺑﺨﻮاﻫﺪ ﺑﺪون از
دﺳﺖ دادن ﻛﻨﺘﺮل ﺑﺎس ،ﺷﺮاﻳﻂ آﻏﺎز دﻳﮕﺮي اﻳﺠﺎد ﻛﻨﺪ و ارﺗﺒﺎط ﺑﺎ Slaveدﻳﮕﺮي را آﻏﺎز ﻛﻨﺪ .ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
ﭼﻴﺰي ﺟﺰ ﻳﻚ ﺳﮕﻨﺎل ﺷﺮوع ﻛﻪ ﺑﻌﺪ از ﺳﻴﮕﻨﺎل ﭘﺎﻳﺎن آﻣﺪه اﺳﺖ ﻧﻤﻲ ﺑﺎﺷﺪ:
SDAدر ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﻛﻼك ﻣﻮﺟﻮد در SCLﻧﻤﻮﻧﻪ ﺑﺮداري ﻣﻲ ﺷﻮد و ﻣﻘﺪار ﺻﻔﺮ ﻳﺎ ﻳﻚ ﻣﻨﻄﻘﻲ از SDA
ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد .ﺑﻪ ﻣﻨﻈﻮر اﻳﻨﻜﻪ ﻣﻘﺪار ﺧﻮاﻧﺪه ﺷﺪه از SDAﻣﻌﺘﺒﺮ ﺑﺎﺷﺪ ﺑﺎﻳﺪ ﻣﻘﺪار SDAدر ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي
SCLﺗﻐﻴﻴﺮ ﻧﻜﻨﺪ و ﺑﻪ ﻃﻮر ﻛﻠﻲ وﺿﻌﻴﺖ ﺧﻂ SDAﺗﻨﻬﺎ در ﺣﺎﻟﺘﻲ ﻛﻪ SCLﺻﻔﺮ اﺳﺖ ﻣﺠﺎز ﺑﻪ ﺗﻐﻴﻴﺮ اﺳﺖ ،ﺗﻨﻬﺎ
وﺿﻌﻴﺖ :ACK/NACKوﺳﻴﻠﻪ ي ﮔﻴﺮﻧﺪه ﭘﺲ از درﻳﺎﻓﺖ 8ﺑﻴﺖ داده در ﺳﻴﻜﻞ ﻧﻬﻢ ﻛﻼك ﺑﺎ زﻣﻴﻦ ﻛﺮدن ﺧﻂ
SDAﺑﻪ ﻓﺮﺳﺘﻨﺪه ﭘﺎﺳﺦ ﻳﺎ Acknowledgeﻣﻲ دﻫﺪ .ﻳﻚ ﻣﺎﻧﺪن ﺧﻂ SDAدر ﻛﻼك ﻧﻬﻢ ﻧﻮﻋﻲ ﻋﺪم ﺗﺼﺪﻳﻖ
ﭘﺲ از ﻫﺮ ﺷﺮاﻳﻂ آﻏﺎز 7ﺑﻴﺖ آدرس وﺳﻴﻠﻪ ي ﻣﻘﺼﺪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻌﺪ از ﺑﻴﺖ ﻫﻔﺘﻢ ﻳـﻚ ﺑﻴـﺖ ﺧﻮاﻧـﺪن ﻳـﺎ
ﻧﻮﺷﺘﻦ وﺟﻮد دارد .ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ Masterﻗﺼﺪ ﻧﻮﺷﺘﻦ روي وﺳﻴﻠﻪ را دارد و ﻳﻚ ﺑﻮدن آن
ﺑﻪ ﻃﻮر ﻛﻠﻲ وﺳﺎﻳﻞ I2Cداراي ﻳﻚ آدرس 7ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ اﻣﻜﺎن آدرس دﻫﻲ 128وﺳﻴﻠﻪ ي ﻣﺨﺘﻠﻒ را ﻓﺮاﻫﻢ
ﻣﻲ ﻛﻨﺪ .از اﻳﻦ ﺗﻌﺪاد 16آدرس رزرو ﺷﺪه ﻣﻲ ﺑﺎﺷﻨﺪ و در ﻧﺘﻴﺠﻪ ﺣﺪاﻛﺜﺮ 112وﺳﻴﻠﻪ ﺑﺮ روي ﻳﻚ ﺑﺎس ﻗﺎﺑﻞ آدرس
دﻫﻲ ﻫﺴﺘﻨﺪ .آدرس ﺻﻔﺮ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺑﻮده و ﭘﺲ از ارﺳﺎل اﻳﻦ آدرس ﺗﻤﺎم ﻣﻴﻜﺮوﻫﺎﻳﻲ ﻛﻪ ﺑﺎ زﻣﻴﻦ ﻛﺮدن
SDAﺑﻪ Masterﭘﺎﺳﺦ دﻫﻨﺪ ،داده ي 8ﺑﻴﺘﻲ را درﻳﺎﻓﺖ ﺧﻮاﻫﻨﺪ ﻛﺮد .ﭘﻴﻐﺎﻣﻲ ﻛﻪ ﺑﺮاي ﻫﻤﻪ Slaveﻫﺎ ﻓﺮﺳﺘﺎده
ﻣﻲ ﺷﻮد Broadcastﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد .اﻳﻦ ﻣﻲ ﺗﻮاﻧﺪ ﭘﻴﻐﺎﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺗﻮﺳﻂ Masterﺑﻪ ﺗﻤﺎﻣﻲ Slaveﻫﺎ دﺳﺘﻮر
ﻋﻼوه ﺑﺮ ﻣﺤﺪودﻳﺖ 112آدرس ،ﺗﻌﺪاد وﺳﺎﻳﻞ ﻣﺠﺎز روي ﺑﺎس ﺑﻮﺳﻴﻠﻪ ي ﻇﺮﻓﻴﺖ ﺧﺎزﻧﻲ 400ﭘﻴﻜﻮﻓﺎراد ﻧﻴﺰ ﻣﺤﺪود
ﻣﻲ ﺷﻮد.
ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ Masterﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺧﻮاﻫﺪ اﻃﻼﻋﺎﺗﻲ را ﺑﻪ ﻳﻜﻲ از Slaveﻫﺎ
ارﺳﺎل ﻛﻨﺪ:
در اﺑﺘﺪا ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻳﻚ وﺿﻌﻴﺖ ﺷﺮوع روي ﺑﺎس اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ،اﻳﻦ ﺳﻴﮕﻨﺎل ﻫﻤﻪ ي Slaveﻫﺎ را ﻣﺘﻮﺟﻪ ﺑﺎس
ﻣﻲ ﻛﻨﺪ و ﭘﺲ از آن ،Masterآدرس Slaveاي را ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﺑﺎ آن ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﺪ را روي ﺑﺎس ﻣﻲ ﻓﺮﺳﺘﺪ
و در ﺑﻴﺖ ﻫﺸﺘﻢ آن ﻣﺸﺨﺺ ﻣﻲ ﺳﺎزد ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ اﻃﻼﻋﺎت را از آن ﺑﺨﻮاﻧﺪ ﻳﺎ روي آن ﺑﻨﻮﻳﺴﺪ .ﺳﭙﺲ ﺗﻤﺎم
Slaveﻫﺎ آدرس را درﻳﺎﻓﺖ ﻛﺮده و ﺑﺎ آدرس ﺧﻮد ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﻨﺪ و وﺳﻴﻠﻪ اي ﻛﻪ آدرس ﺑﻪ آن ﺗﻌﻠﻖ داﺷﺘﻪ ﺑﺎﺷﺪ
ﺑﺎ زﻣﻴﻦ ﻛﺮدن SDAدر ﻛﻼك ﻧﻬﻢ ﻳﻚ ﺳﻴﮕﻨﺎل ACKاﻳﺠﺎد ﻛﺮده و ﺑﻪ Masterﭘﺎﺳﺦ ﻣﻲ دﻫﺪ .ﺑﻪ ﻣﺤﺾ
درﻳﺎﻓﺖ ﺳﻴﮕﻨﺎل ﺗﺼﺪﻳﻖ ﺗﻮﺳﻂ Masterﺗﺒﺎدل اﻃﻼﻋﺎت ﺑﺎ Slaveآﻏﺎز ﺷﺪه و در ﻧﻬﺎﻳﺖ ،Masterﻳﻚ وﺿﻌﻴﺖ
اﻳﻦ ﻣﺎژول دوره ي ﺗﻨﺎوب ﺧﻂ SCLرا در ﺣﺎﻟﺘﻲ ﻛﻪ ﺑﻪ ﺻﻮرت Masterﻋﻤﻞ ﻣﻲ ﻛﻨـﺪ ،ﻛﻨﺘـﺮل ﻣـﻲ ﻧﻤﺎﻳـﺪ .اﻳـﻦ
ﻋﻤﻞ ﺑﻮﺳﻴﻠﻪ ي ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴﺘﺮ TWBRو ﺑﻴﺖ ﻫﺎي ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه در رﺟﻴﺴﺘﺮ TWSRاﻧﺠـﺎم ﻣـﻲ ﺷـﻮد.
ﻋﻤﻠﻜﺮد Slaveﺑﺴﺘﮕﻲ ﺑﻪ ﺗﻨﻈﻴﻤﺎت ﻧﺮخ ﺑﻴﺖ و ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ﻧﺪارد اﻣﺎ ﻓﺮﻛﺎﻧﺲ CPUدر Slaveﺑﺎﻳﺪ ﺣﺪاﻗﻞ
ﺗﻮﺟﻪ :در ﺣﺎﻟﺘﻲ ﻛﻪ TWIﺑﻪ ﺻﻮرت Masterﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ﺑﺎﻳﺪ ﻣﻘﺪار TWBRﺑﺰرﮔﺘﺮ و ﻳﺎ ﻣﺴﺎوي 10ﺑﺎﺷﺪ،
در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻤﻜﻦ اﺳﺖ Masterﻛﻼك اﺷﺘﺒﺎه روي ﺧﻂ SCLﺗﻮﻟﻴﺪ ﻛﻨﺪ.
رﺟﻴﺴﺘﺮﻫﺎي TWI
ﺑﺨﺶ TWIداراي ﭘﻨﺞ رﺟﻴﺴﺘﺮ ﺑﻪ ﻧﺎم ﻫﺎي TWDR ،TWSR ،TWCR ،TWBRو TWARﻣﻲ ﺑﺎﺷﺪ.
اﻳﻦ رﺟﻴﺴﺘﺮ ﻓﺮﻛﺎﻧﺲ SCLرا ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ و ﻣﻘﺪار آن ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:
ﻣﺜﺎل) :1ﺗﻌﻴﻴﻦ TWBRﺑﺎ ﻛﺮﻳﺴﺘﺎل 8ﻣﮕﺎﻫﺮﺗﺰ و ﻓﺮﻛﺎﻧﺲ SCKﺑﺮاﺑﺮ 100ﻛﻴﻠﻮﻫﺮﺗﺰ و (TWPS = 0
8000000 − 16 × 100000
= TWBR = 32
2 × 100000 × 40
اﻳﻦ رﺟﻴﺴﺘﺮ وﻇﻴﻔﻪ ي ﻛﻨﺘﺮل TWIرا ﺑﺮ ﻋﻬﺪه دارد و ﻋﻤﻠﻜﺮد ﺑﻴﺖ ﻫﺎي آن ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:
ﺑﺎﺷﺪ ،ﺑﺎ ﻓﻌﺎل ﺷﺪن ﭘﺮﭼﻢ TWINTﺑﺮﻧﺎﻣﻪ ﺑﻪ روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ ي TWIﭘﺮش ﺧﻮاﻫﺪ ﻛﺮد.
:TWI Enable Bitاﻳﻦ ﺑﻴﺖ TWIرا ﻓﻌﺎل ﻛﺮده و ﺑﺎ ﻳﻚ ﺷﺪن آن ،ﻣـﺎژول TWIﻛﻨﺘـﺮل ﭘـﻴﻦ ﻫـﺎي SCLو
SDAرا ﺑﺮﻋﻬﺪه ﻣﻲ ﮔﻴﺮد .در اﻳﻦ ﺣﺎﻟﺖ واﺣﺪ ﻛﻨﺘﺮل Slew Rateو ﻓﻴﻠﺘﺮ ورودي ﻓﻌﺎل ﺷﺪه و ﺑﺎ ﺻﻔﺮ ﺷﺪن اﻳـﻦ
:TWI Write Collision Flagاﻳﻦ ﺑﻴﺖ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ زﻣـﺎﻧﻲ ﻳـﻚ ﻣـﻲ ﺷـﻮد ﻛـﻪ روي رﺟﻴﺴـﺘﺮ TWDR
ﻣﻘﺪاري ﻧﻮﺷﺘﻪ ﺷﻮد و ﺑﻴﺖ TWINTﺻﻔﺮ ﺑﺎﺷﺪ .ﺑﺎ ﻧﻮﺷﺘﻦ روي رﺟﻴﺴﺘﺮ TWDRدر ﺷﺮاﻳﻄﻲ ﻛﻪ TWINTﻳﻚ
:TWI STOP Condition Bitﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ در وﺿﻌﻴﺖ Masterﺑﺎﻋﺚ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ
ﭘﺎﻳﺎن در ﺑﺎس I2Cﺧﻮاﻫﺪ ﺷﺪ و ﭘﺲ اﺟﺮا ﺷﺪن اﻳﻦ وﺿﻌﻴﺖ ﺑﻴﺖ TWSTOﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﭘﺎك ﺧﻮاﻫﺪ ﺷﺪ.
در وﺿﻌﻴﺖ ،Slaveﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ وﺿﻌﻴﺖ ﭘﺎﻳﺎن اﻳﺠﺎد ﻧﺨﻮاﻫﺪ ﻛﺮد اﻣﺎ ﺧﻄﻮط SDAو SCLرﻫﺎ ﺷﺪه و
ﺑﻪ ﺣﺎﻟﺖ ﺷﻨﺎور ﺑﺮ ﻣﻲ ﮔﺮدﻧﺪ ،ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮان از وﺿﻌﻴﺖ ﺧﻄﺎ ﺧﺎرج ﺷﺪ.
:TWI START Condition Bitﻧﺮم اﻓﺰار ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ ﺑﺎ ﻫﺪف Masterﺷﺪن ،اﻳﺠﺎد ﻳـﻚ
ﺷﺮاﻳﻂ آﻏﺎز ﻣﻲ ﻛﻨﺪ .ﺳﺨﺖ اﻓﺰار ﺑﺎس را ﭼﻚ ﻛﺮده و در ﺻﻮرﺗﻲ ﻛﻪ آزاد ﺑﺎﺷﺪ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز ﻣﻲ ﻛﻨـﺪ ،در
ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﺎژول TWIﻣﻨﺘﻈﺮ ﺗﺸﺨﻴﺺ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن روي ﺑﺎس ﻣﻲ ﺷﻮد و ﭘﺲ از آن ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷـﺮاﻳﻂ
آﻏﺎز ﻛﻨﺘﺮل ﺑﺎس را ﺑﻪ دﺳﺖ ﻣﻲ ﮔﻴﺮد .ﺑﻴﺖ TWSTAﺑﺎﻳﺪ ﺑﻌﺪ از اﻳﺠﺎد ﺷﺮاﻳﻂ آﻏﺎز ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﭘﺎك ﺷﻮد.
TWEA :TWI Enable Acknowledge Bitاﻳﺠﺎد ﭘﺎﻟﺲ ﺗﺼﺪﻳﻖ ﻳﺎ Acknowledgeرا ﻛﻨﺘﺮل ﻣﻲ ﻛﻨـﺪ.
اﮔﺮ روي اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻧﻮﺷﺘﻪ ﺷﻮد ﭘﺎﻟﺲ ACKدر ﺷﺮاﻳﻂ زﻳﺮ اﻳﺠﺎد ﻣﻲ ﺷﻮد:
ﻣﺎداﻣﻴﻜﻪ ﺑﻴﺖ TWGCEدر TWARﻳﻚ ﺑﻮده و ﻳﻚ ﻓﺮاﺧﻮان ﻋﻤﻮﻣﻲ درﻳﺎﻓﺖ ﺷﺪه ﺑﺎﺷﺪ. .2
:TWI Interrupt Flagاﻳﻦ ﺑﻴﺖ ﭘﺲ از اﺗﻤﺎم ﻫﺮ ﻳﻚ از وﻇﺎﻳﻒ TWIﻳﻚ ﺷﺪه و در ﺻـﻮرﺗﻲ ﻛـﻪ وﻗﻔـﻪ ي
ﺳﺮاﺳﺮي و ﺑﻴﺖ TWIEﻳﻚ ﺑﺎﺷﻨﺪ ﺑﻪ ﺑﺮدار وﻗﻔﻪ ي TWIﭘﺮش ﻣـﻲ ﻛﻨـﺪ .اﻳـﻦ ﺑﻴـﺖ ﭘـﺲ از اﺟـﺮاي ISRﺑـﻪ
ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﭘﺎك ﻧﻤﻲ ﺷﻮد و ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﭘﺎك ﺷﻮد.
ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﭘﺮﭼﻢ TWINTﻳﻚ ﺷﻮد ،ﻧﺮم اﻓﺰار ﺑﺎﻳﺪ ﻣﺤﺘﻮﻳﺎت ﺗﻤﺎم رﺟﻴﺴﺘﺮﻫﺎﻳﻲ را ﻛﻪ ﺑﺮاي وﻇﻴﻔﻪ ي ﺑﻌﺪي ﻧﻴـﺎز
اﺳﺖ )ﻣﺜﻞ (TWDRﺗﻨﻈﻴﻢ ﻛﺮده و ﭘﺲ از آن ﻫﻤﺰﻣﺎن ﺑﺎ ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴـﺘﺮ ،TWCRﭘـﺮﭼﻢ TWINTرا ﭘـﺎك
ﻛﻨﺪ ﺗﺎ ﻣﺎژول TWIﺷﺮوع ﺑﻪ اﻧﺠﺎم وﻇﻴﻔﻪ ي ﺑﻌﺪي ﻧﻤﺎﻳـﺪ .ﻣﺎداﻣﻴﻜـﻪ ﻛـﻪ ﭘـﺮﭼﻢ TWINTﻳـﻚ اﺳـﺖ SCLدر
وﺿﻌﻴﺖ ﺻﻔﺮ ﺑﺎﻗﻲ ﻣﻲ ﻣﺎﻧﺪ و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﻧﺸﻮد TWIﻫﻴﭻ ﻋﻤﻠﻲ اﻧﺠﺎم ﻧﺨﻮاﻫﺪ داد.
] :TWI Prescaler Bits[1:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﻘﺪار ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ
ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
] :TWI Status[7:3اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻧﻤﺎﻳﺎﻧﮕﺮ وﺿﻌﻴﺖ TWIﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ در ﺑﺮرﺳﻲ Modeﻫﺎي ﻛﺎري ﻋﻤﻠﻜﺮد
در ﺣﺎﻟﺖ اﻧﺘﻘﺎل TWDR ،ﻣﺤﺘﻮي ﺑﺎﻳﺖ ﺑﻌﺪي اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ ارﺳﺎل ﺷﻮد و در ﺣﺎﻟﺖ درﻳﺎﻓﺖ ﺷﺎﻣﻞ آﺧﺮﻳﻦ ﺑﺎﻳﺖ
درﻳﺎﻓﺘﻲ اﺳﺖ .اﻳﻦ رﺟﻴﺴﺘﺮ ﺗﻨﻬﺎ در ﺣﺎﻟﺘﻲ ﻛﻪ TWIدر ﺣﺎل اﻧﺘﻘﺎل اﻃﻼﻋﺎت ﻧﺒﺎﺷﺪ و ﭘﺮﭼﻢ TWINTﻳﻚ ﺷﺪه
. ﻣﻲ ﺑﺎﺷﺪSR وST در وﺿﻌﻴﺖ ﻫﺎيSlave اﻳﻦ رﺟﻴﺴﺘﺮ آدرس:TWI (Slave) Address Register
TWAR 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE
ﻣﺮﺑﻮط ﺑﻪ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺑﻮده و ﺗﺸﺨﻴﺺ0x00 آدرس:TWI General Call Recognition Enable
:ﻧﺎم ﮔﺬاري ﻫﺎي زﻳﺮ ﺑﻪ ﺻﻮرت ﻗﺮارداد در اداﻣﻪ اﺳﺘﻔﺎده ﺧﻮاﻫﻨﺪ ﺷﺪ
S: START condition
Rs: REPEATED START condition
R: Read bit (high level at SDA)
W: Write bit (low level at SDA)
ACK: Acknowledge bit (low level at SDA)
NACK: Not acknowledge bit (high level at SDA)
Data: 8-bit data byte
P: STOP condition
SLA: Slave Address
- ١٥٣ -
P a g e | 154
www.eca.ir
Modeﻫﺎي ﻋﻤﻠﻜﺮد :TWI
در اﻳﻦ Modeاﺑﺘﺪا ﺗﻮﺳﻂ Masterﻳﻚ وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه و ﺑﻠﻮك آدرﺳﻲ ﻛﻪ در اداﻣﻪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷـﻮد
ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ Masterﮔﻴﺮﻧﺪه ﻳﺎ ﻓﺮﺳﺘﻨﺪه اﺳﺖ .اﮔـﺮ ﭘـﺲ از اﻳﺠـﺎد ﺣﺎﻟـﺖ ﺷـﺮوع SLA+Wارﺳـﺎل ﮔـﺮدد
Masterوارد ﺣﺎﻟﺖ ارﺳﺎل ﺷﺪه و در ﺻﻮرﺗﻲ ﻛﻪ SLA+Rارﺳﺎل ﺷﻮد وارد ﺣﺎﻟﺖ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮد.
TWWCﻛﻪ ﻳﻚ ﺑﻴﺖ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ در اﻳﻦ ﺣﺎﻟﺖ ﺻﻔﺮ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد زﻳﺮا ﻧﺮم اﻓﺰار ﻫﻨﻮز ﻣﻘـﺪاري را را
روي TWDRﻧﻨﻮﻧﺸﺘﻪ اﺳﺖ و ﺑﻨﺎﺑﺮاﻳﻦ Collisionﻳﺎ ﺗﺼﺎدﻣﻲ ﻧﻴﺰ ﭘﻴﺶ ﻧﻴﺎﻣﺪه اﺳﺖ.
TWSTOﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا در اﻳﻨﺠﺎ ﻧﻤﻲ ﺧﻮاﻫﻴﻢ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن اﻳﺠﺎد ﺷﻮد.
TWEAﻣﻘﺪاري ﺑﻲ اﻫﻤﻴﺖ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا ﺑﺎ ﻓﺮض Setﻛﺮدن آن در ﺷﺮاﻳﻂ آﻏﺎز ﻫﻴﭻ ﮔـﺎه ACKﻧﻴـﺎز ﻧﺒـﻮده و
TWINTﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﭘﺎك ﻣﻲ ﺷﻮد ﺗﺎ TWIﺷﺮوع ﺑﻪ اﻧﺠﺎم ﻓﺮﻣﺎن داده ﺷﺪه ﺗﻮﺳﻂ رﺟﻴﺴﺘﺮ TWCRﻛﻨﺪ.
ﭘﺲ از اﺟﺮاي ﺗﻨﻈﻴﻤﺎت ﻓﻮق در ﺻـﻮرت آزاد ﺑـﻮدن ﺑـﺎس ﻣـﺎژول TWIﺷـﺮاﻳﻂ آﻏـﺎز را اﻳﺠـﺎد ﻛـﺮده و در ﻏﻴـﺮ
اﻳﻨﺼﻮرت ﻣﻨﺘﻄﺮ آزاد ﺷﺪن ﺑﺎس ﺷﺪه و ﺑﻪ ﻣﺤﺾ ﺗﺸﺨﻴﺺ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻛﻨﺘﺮل ﺑﺎس را ﺑﻪ دﺳﺖ ﮔﺮﻓﺘﻪ و ﺷﺮاﻳﻂ
آﻏﺎز را اﻳﺠﺎد ﻣﻲ ﻧﻤﺎﻳﺪ ،ﭘﺲ از آن ﭘﺮﭼﻢ TWINTﻳﻚ ﺷـﺪه و ﻛـﺪ وﺿـﻌﻴﺖ ﻣﻮﺟـﻮد در TWSRﺑﺮاﺑـﺮ 0x08
ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺮاي ورود ﺑﻪ وﺿﻌﻴﺖ MTﺑﺎﻳﺪ روي TWDRﻣﻘﺪار SLA+Wﻧﻮﺷﺘﻪ ﺷﺪه و ﭘﺲ از آن ﺑﺎ ﻧﻮﺷـﺘﻦ
ﻳﻚ روي TWINTآن را ﭘﺎك ﻛﺮده ﺗـﺎ ﻣﺮﺣﻠـﻪ ي ﺑﻌـﺪ آﻏـﺎز ﺷـﻮد .ﭘـﺲ از ﻧﻮﺷـﺘﻦ SLA+Wروي TWDR
ﺗﻔﺎوت ﺑﺎ ﻣﺮﺣﻠﻪ ي ﻗﺒﻞ اﻳﻦ اﺳﺖ ﻛﻪ از آﻧﺠﺎﻳﻲ ﻛﻪ ﻧﻴﺎز ﺑﻪ ﺷﺮاﻳﻂ آﻏﺎز وﺟﻮد ﻧﺪارد ﺑﻴﺖ TWSTAﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ.
ﺑﺎ ﻓﺮﺳﺘﺎده ﺷﺪن SLA+Wو درﻳﺎﻓﺖ ACKﻣﺠﺪدا ﺑﻴﺖ TWINTﻳﻚ ﺷﺪه و در اﻳﻦ ﺷﺮاﻳﻂ ﻳﻜﻲ از ﭼﻨـﺪ ﻛـﺪ
0x18 ،0x20ﻳﺎ 0x38در TWSRﻗﺮار ﻣﻲ ﮔﻴﺮد .در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﻣﻘﺪار ﺑﺮاﺑﺮ 0x18ﺑﺎﺷﺪ ﺑﺪﻳﻦ ﻣﻌﻨﺎﺳﺖ ﻛﻪ
آدرس ارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ .ﭘﺲ از اﻳﻦ ﺑﺎﻳﺪ ﺑﻠﻮك داده ارﺳﺎل ﺷﻮد .ﻫﻤﺎﻧﻨـﺪ ﺣﺎﻟـﺖ ﻗﺒـﻞ اﺑﺘـﺪا
ارﺳﺎل ﺧﻮاﻫﺪ ﺷﺪ .در ﺻﻮرﺗﻲ ﻛـﻪ رﺟﻴﺴـﺘﺮ TWDRﺑﻌـﺪ از ﭘـﺎك ﻛـﺮدن TWINTﻣﻘـﺪاردﻫﻲ ﺷـﻮد رﺟﻴﺴـﺘﺮ
TWWCﻳﻚ ﺷﺪه و اﻋﻼم ﻳﻚ ﺣﺎﻟﺖ ﺗﺼﺎدم را ﻣﻲ ﻛﻨﺪ .ﺗﻨﻈﻴﻤﺎت TWCRﻫﻤﺎﻧﻨﺪ ﺣﺎﻟﺖ ﻗﺒﻞ ﺑـﻪ ﺻـﻮرت زﻳـﺮ
ﺧﻮاﻫﺪ ﺑﻮد:
اﻳﻦ ﻣﺮﺣﻠﻪ ﺗﺎ اﺗﻤﺎم ارﺳﺎل ﺗﻤﺎم ﺑﺎﻳﺖ ﻫﺎي داده ﺗﻜﺮار ﻣﻲ ﺷﻮد و ﺳﺮاﻧﺠﺎم ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ ﺷﺮوع ﻣﺠـﺪد
ﭘﺎﻳﺎن ﻣﻲ ﻳﺎﺑﺪ .ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎ ﻣﻘﺪاردﻫﻲ رﺟﻴﺴﺘﺮ TWCRﺑﻪ ﺻﻮرت زﻳﺮ اﻳﺠﺎد ﻣﻲ ﺷﻮد:
ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد ﻣﻘﺪار رﺟﻴﺴﺘﺮ TWSRﺑﺮاﺑﺮ 0x10ﺧﻮاﻫﺪ ﺑﻮد و اﻳﻦ ﻗﺎﺑﻠﻴﺖ ﺑﻪ Masterاﺟـﺎزه
ﻣﻘﺎدﻳﺮ رﺟﻴﺴﺘﺮ TWSRدر وﺿﻌﻴﺖ ﻫﺎي ﻣﺨﺘﻠﻒ ﺣﺎﻟﺖ Master Transmitterﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
0x08 وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه اﺳﺖ. ارﺳﺎل SLA+Wو درﻳﺎﻓﺖ ACKﻳﺎ NACK
0x18 ﺑﺎﻳﺖ SLA+Wارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ. اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
0x28 ﺑﺎﻳﺖ داده ارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ. اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
0x30 ﺑﺎﻳﺖ داده ارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﻧﺸﺪه اﺳﺖ. اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
0x38 ﻛﻨﺘﺮل ﺑﺎس از دﺳﺖ رﻓﺘﻪ اﺳﺖ. ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع و ﺗﻼش ﺑﺮاي ﻛﻨﺘﺮل ﻣﺠﺪد آن
#include <mega16.h>
#define xtal 8000000
void main()
{
//------------------------------------------------
error:
while(1);
درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و ﺑﺮاي اﻳﺠﺎد آن ﺑﺎﻳﺪ ﭘﺲ از اﻳﺠﺎد ﺷـﺮاﻳﻂ آﻏـﺎزSlave اﻃﻼﻋﺎت را ازMaster در اﻳﻦ وﺿﻌﻴﺖ
در ﺻﻮرﺗﻲ ﻛﻪ ﺷﺮاﻳﻂ آﻏﺎز ﺑﻪ درﺳـﺘﻲ اﻳﺠـﺎد ﺷـﺪه ﺑﺎﺷـﺪ. ﻓﺮﺳﺘﺎده ﺷﻮدSlave ﺑﻪSLA+R ﺑﺮ ﺧﻼف ﺣﺎﻟﺖ ﻗﺒﻞ
ﺑﺎﻳـﺪ ﻣﻘـﺪار آن را درSLA+R ﺑـﺮاي ارﺳـﺎل، ﻣﻲ ﺷـﻮد0x08 ﺑﺮاﺑﺮTWSR ﻳﻚ ﺷﺪه و ﻣﻘﺪارTWINT ﺑﻴﺖ
- ١٥٩ -
P a g e | 160
www.eca.ir
زﻣﺎﻧﻲ ﻛﻪ SLA+Rﻓﺮﺳﺘﺎده ﺷﻮد و ACKدرﻳﺎﻓﺖ ﺷﻮد ﺑﻴـﺖ TWINTﻳـﻚ ﺷـﺪه و در اﻳـﻦ ﺷـﺮاﻳﻂ ﻳﻜـﻲ از
0x08 وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه اﺳﺖ. ارﺳﺎل SLA+Rو درﻳﺎﻓﺖ ACKﻳﺎ NACK
0x38 ﻛﻨﺘﺮل ﺑﺎس از دﺳﺖ رﻓﺘﻪ اﺳﺖ. ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع و ﺗﻼش ﺑﺮاي ﻛﻨﺘﺮل ﻣﺠﺪد آن
0x40 ﺑﺎﻳﺖ SLA+Rارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ. درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
0x50 درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACK درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
در ﺻﻮرﺗﻲ ﻛﻪ SLA+Rارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه ﺑﺎﺷﺪ ﺑﻌﺪ از ﻳـﻚ ﺷـﺪن TWINTداده ي درﻳﺎﻓـﺖ
ﺷﺪه در TWDRﻣﻲ ﺗﻮاﻧﺪ ﺧﻮاﻧﺪه ﺷﻮد .اﻳﻦ ﻛﺎر ﺗﺎ درﻳﺎﻓﺖ آﺧﺮﻳﻦ ﺑﺎﻳـﺖ ﺗﻜـﺮار ﺷـﺪه و ﺑﻌـﺪ از آن Masterﺑـﺎ
ﻓﺮﺳﺘﺎدن NACKﺑﻪ Slaveاﻋﻼم ﻣﻲ ﻛﻨﺪ ﻛﻪ دﻳﮕﺮ ﻗﺼﺪ ﺧﻮاﻧﺪن از آن را ﻧـﺪارد و در ﻧﺘﻴﺠـﻪ ﻣـﻲ ﺗـﻮان ﻋﻤﻠﻴـﺎت
ﻣﺜﺎل ) :3ﺧﻮاﻧﺪن 2ﺑﺎﻳﺖ داده از Slaveﺑﺎ آدرس 0xA0و ﻧﺮخ ﺑﻴﺖ 100ﻛﻴﻠﻮﻫﺮﺗﺰ(
>#include <mega16.h
#define xtal 8000000
void main()
{
- ١٦١ -
P a g e | 162
www.eca.ir
//------------------------------------------------
error:
while(1);
- ١٦٢ -
P a g e | 163
www.eca.ir
}
در اﻳﻦ وﺿﻌﻴﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﮔﻴﺮﻧﺪه Slave ،ﺑﻮده و اﻃﻼﻋـﺎت را از Master Transmitterدرﻳﺎﻓـﺖ ﻣـﻲ ﻛﻨـﺪ.
ﺑﺮاي ﺷﺮوع ﺑﻪ ﻛﺎر ﺑﺎﻳﺪ آدرس Slaveدر 7ﺑﻴﺖ ﺑـﺎﻻي TWARﻗـﺮار ﮔﻴـﺮد .و ﭼﻨﺎﻧﭽـﻪ ﺑﻴـﺖ LSBﻳـﻚ ﺷـﻮد
Masterﻗﺎدر ﺑﻪ ﭘﺎﺳﺨﮕﻮﻳﻲ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﻧﻴﺰ ﺧﻮاﻫﺪ ﺑﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت آن را ﻧﺎدﻳﺪه ﺧﻮاﻫﺪ ﮔﺮﻓﺖ.
ﺑﻴﺖ ﻫﺎي TWSTAو TWSTOﺻﻔﺮ ﻣﻲ ﺑﺎﺷﻨﺪ زﻳﺮا اﻳﺠﺎد ﺷﺮاﻳﻂ آﻏﺎز و ﭘﺎﻳﺎن ﺑﺮ ﻋﻬﺪه ي Masterﻣﻲ ﺑﺎﺷﺪ.
اﮔﺮ در آدرس درﻳﺎﻓﺖ ﺷﺪه ﺑﻴﺖ ﺟﻬﺖ ) (W/Rﺻﻔﺮ ﺑﺎﺷﺪ ﻧﺸﺎن دﻫﻨـﺪه ي اﻳـﻦ اﺳـﺖ ﻛـﻪ Masterﻣـﻲ ﺧﻮاﻫـﺪ
ﻣﻘـﺪاري را ﺑـﻪ Slaveﺑﻔﺮﺳـﺘﺪ ﻛـﻪ در اﻳﻨﺼـﻮرت Slaveوارد وﺿـﻌﻴﺖ ) Slave Read (SRﺷـﺪه و در ﻏﻴـﺮ
اﻳﻨﺼﻮرت در ﺣﺎﻟﺖ ) Slave Transmiter (STﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ .ﭘﺲ از درﻳﺎﻓﺖ SLA+Wﺑﻴﺖ TWINT
0x60 ﺑﺎﻳﺖ SLA+Wدرﻳﺎﻓﺖ ﺷﺪه و ACKارﺳﺎل ﺷﺪه اﺳﺖ. درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
0x70 ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ رﻳﺎﻓﺖ ﺷﺪه و ACKارﺳﺎل ﺷﺪه اﺳﺖ. درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
0x80 درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKدر ﻓﺮاﺧﻮاﻧﻲ اﺧﺘﺼﺎﺻﻲ درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
0x90 درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKدر ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
در ﺻﻮرﺗﻲ ﻛﻪ ﻛﺪ ﺧﻮاﻧﺪه ﺷﺪه 0x60ﺑﺎﺷﺪ آدرس ﺑﺪرﺳﺘﻲ ﺗﻮﺳﻂ Slaveدرﻳﺎﻓﺖ ﺷﺪه و ﺑﺮاي Masterﺗﺼـﺪﻳﻖ
) (ACKﻧﻴﺰ ارﺳﺎل ﺷﺪه اﺳﺖ .ﭘﺲ از اﻳﻦ Slaveﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻳﺖ ﻫﺎي داده را درﻳﺎﻓﺖ ﻛﺮده و ﺗـﺎ زﻣـﺎﻧﻲ ﻛـﻪ ﻳـﻚ
. ﻣﻲ ﺑﺎﺷﺪ0xA0 ﺑﺮاﺑﺮ
#include <mega16.h>
#define xtal 8000000
char incoming_data;
void main()
{
- ١٦٥ -
P a g e | 166
www.eca.ir
goto error;
error:
while(1);
- ١٦٦ -
P a g e | 167
www.eca.ir
اﻳﻦ وﺿﻌﻴﺖ ﻣﺸﺎﺑﻪ SRﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺑﻌﺪ از درﻳﺎﻓﺖ آدرس ﺑﻴﺖ W/Rﻳﻚ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ
ﭘﺲ از درﻳﺎﻓﺖ آدرس ﺑﻴﺖ TWINTﻳﻚ ﺷﺪه و ﻣﻲ ﺗﻮان ﻛﺪ وﺿﻌﻴﺖ ﺟﺎري را از TWSRﺑﺪﺳﺖ آورد ،ﺑﻌﺪ ار
ارﺳﺎل ﻫﺮ ﺑﺎﻳﺖ داده از Master ،Slaveﺑﺎ ﻓﺮﺳﺘﺎدن ACKآن را ﺗﺼﺪﻳﻖ ﻣﻲ ﻛﻨﺪ و ﭼﻨﺎﻧﭽﻪ Masterﺑﺨﻮاﻫﺪ
0xA8 ﺑﺎﻳﺖ SLA+Rدرﻳﺎﻓﺖ ﺷﺪه و ACKارﺳﺎل ﺷﺪه اﺳﺖ. ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK
0xB8 ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACK ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK
ﻣﺜﺎل ) :5ﺧﻮاﻧﺪن ﻳﻚ ﺑﺎﻳﺖ داده از Slaveﺑﺎ آدرس 0x01و ﻧﺮخ ﺑﻴﺖ 100ﻛﻴﻠﻮﻫﺮﺗﺰ(
>#include <mega16.h
#define xtal 8000000
)(void main
{
error:
while(1);
- ١٦٨ -
P a g e | 169
www.eca.ir
}
ﻫﻤﺰﻣﺎن ﺳﺎزي ﭘﺎﻟﺲ ﺳﺎﻋﺖ:
ﭘﺎﻟﺲ ﺳﺎﻋﺖ ﺗﻮﺳﻂ Masterﻫﺎ ﺗﻮﻟﻴﺪ ﻣﻲ ﮔﺮدد .ﻫﺮ Masterﭘﺎﻟﺲ ﺳﺎﻋﺖ ﺧﻮد را ﺑﺮ روي SCLﻗﺮار ﻣﻲ دﻫﺪ و
ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺧﺎﺻﻴﺖ wired-ANDدر ﺑﺎس I2Cﭘﺎﻟﺲ ﺳﺎﻋﺖ ﻫﺎ ﺑﺎ ﻫﻢ ANDﺷـﺪه و ﺑﺎﻋـﺚ ﺗﻮﻟﻴـﺪ ﻳـﻚ ﭘـﺎﻟﺲ
ﻫﺮ Masterﺗﻨﻬﺎ در زﻣﺎﻧﻲ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺑﺎس دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﺪ ﻛـﻪ ﺧـﻂ SDAآزاد ﺑﺎﺷـﺪ .اﻣـﺎ ﭘﺮوﺗﻜـﻞ I2Cﺑـﻪ
ﺷﻜﻠﻲ ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ ﻛﻪ در ﺻﻮرﺗﻴﻜﻪ در ﺷﺮاﻳﻂ آزاد ﺑـﻮدن ﺑـﺎس دو ﻳـﺎ ﭼﻨـﺪ Masterﻫﻤﺰﻣـﺎن درﺧﻮاﺳـﺖ
دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﺎس را داﺷﺘﻪ ﺑﺎﺷﻨﺪ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ارﺗﺒﺎط ﺣﻔـﻆ ﺷـﻮد .در اﻳﻨﺠـﺎ ﻧﻴـﺰ وﺟـﻮد ﺧﺎﺻـﻴﺖ
Wired-ANDﺑﺎﻋﺚ ﺣﻞ ﻣﺸﻜﻞ ﻣﻲ ﮔﺮدد ﻳﻌﻨﻲ ﭼﻨﺪ Masterﺑﻄﻮر ﻫﻤﺰﻣﺎن داده ﻫﺎﻳﺸﺎن را ﺑﺮ روي ﺧﻂ SDA
ﺑﻪ ﺻﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ دارﻧﺪ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺑﺎ ﻫﻢ ANDﺷﺪه و ﺑﺮ روي ﺑﺎس ﻳﻚ دﻳﺘﺎي واﺣﺪ را اﻳﺠﺎد ﻣـﻲ
ﺳﺮﻳﺎل را در ﺳﻄﺢ ﻳﻚ ﻣﻨﻄﻘﻲ رﻫﺎ ﻣﻲ ﻛﻨﺪ )ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ وﺟﻮد Pull-upﺳﻄﺢ ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ( ﺗـﺎ
ﻫﻤﺎن ﻃﻮر ﻛﻪ دﻳﺪه ﻣﻲ ﺷﻮد ﻣﺴﺎﻟﻪ Arbitrationﺗﻨﻬﺎ در ﻣﻮرد ﺣﺎﻟﺘﻲ ﻣﻌﻨﻲ دارد ﻛﻪ ﭼﻨـﺪ Masterداﺷـﺘﻪ ﺑﺎﺷـﻴﻢ
زﻳﺮا:
در ﻣﻮرد Slaveﻫﺎ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ در ﻫﺮ زﻣﺎن ﻳـﻚ Slaveآدرس دﻫـﻲ ﻣـﻲ ﺷـﻮد و ﺣـﻖ دﺳﺘﺮﺳـﻲ ﺑـﻪ .١
ﻛﺎﻣﭙﺎﻳﻠﺮ CodeVisionﺑﺎ اراﺋﻪ ي ﻳﻚ ﺳﺮي ﺗﻮاﺑﻊ ﻣﺮﺑﻮط ﺑﻪ ﺑﺎس ،I2Cاﻣﻜﺎن اﻳﺠﺎد اﻳﻦ ﭘﺮوﺗﻜﻞ را ﺑﻪ ﺻﻮرت ﻧﺮم
اﻓﺰاري ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ دﻫﺪ .ﭘﻴﻦ ﻫﺎي SDAو SCLﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﻴﻴﻦ ﺷﻮﻧﺪ:
#asm
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
#endasm
در اﻳﻦ ﻗﻄﻌﻪ ﻛﺪ ﭘﻴﻦ ﻫﺎي 3و 4از PORTBﺑﻪ ﻋﻨﻮان SDAو SCLﺗﻌﻴﻴﻦ ﺷﺪه اﻧﺪ.
)(:i2c_init
اﻳﻦ ﺗﺎﺑﻊ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ ي ﺑﺎس I2Cرا اﻧﺠﺎم داده و ﺑﺎﻳﺪ ﻗﺒﻞ از اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ دﻳﮕﺮ ﺑﻪ ﺑﻪ ﻛﺎر ﺑﺮده ﺷﻮد.
)(:i2c_start
اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ و در ﺻﻮرﺗﻲ ﻛﻪ ﺑﺎس آزاد ﺑﺎﺷﺪ ﻣﻘﺪار ﻳﻚ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و در ﻏﺮ اﻳﻦ
)(:i2c_read
اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺑﺎﻳﺖ را از ﺑﺎس I2Cﺧﻮاﻧﺪه و ﺷﻜﻞ ﻛﻠﻲ آن ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
ﭘﺎراﻣﺘﺮ ackﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﭘﺲ از درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ acknowledgementارﺳﺎل ﺷﻮد ﻳﺎ ﺧﻴﺮ .در ﺻﻮرﺗﻲ
ﻛﻪ اﻳﻦ ﭘﺎراﻣﺘﺮ ﻳﻚ ﺑﺎﺷﺪ ACKارﺳﺎل ﺧﻮاﻫﺪ و در ﻏﻴـﺮ اﻳﻨﺼـﻮرت ﺑـﺎ اﻳﺠـﺎد ﻧﻜـﺮدن ACKﺑـﻪ ﺻـﻮرت ﭘﺴـﻴﻮ
)(:i2c_write
اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺑﺎﻳﺖ را ﺑﻪ ﺑﺎس I2Cارﺳﺎل ﻛﺮده و ﺷﻜﻞ ﻛﻠﻲ آن ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
ﻣﺘﻐﻴﺮ dataﻣﻘﺪار ارﺳﺎﻟﻲ ﺑﻪ ﺑﺎس ﺑﻮده و در ﺻﻮرﺗﻲ ﻛﻪ ACK ،Slaveاﻳﺠﺎد ﻛﻨﺪ اﻳﻦ ﺗﺎﺑﻊ ﻣﻘـﺪار ﻳـﻚ و در ﻏﻴـﺮ
:ﺷﻤﺎﺗﻴﻚ
:ﻧﺮم اﻓﺰار
#include<mega16.h>
#define xtal 1000000
- ١٧٣ -
P a g e | 174
www.eca.ir
#asm
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
#endasm
#include <i2c.h>
- ١٧٤ -
P a g e | 175
www.eca.ir
/* write a byte to the EEPROM */
void eeprom_write(unsigned char address, unsigned char
data) {
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_write(data);
i2c_stop();
void main(void) {
unsigned char i;
DDRD=0xFF;
- ١٧٥ -
P a g e | 176
www.eca.ir
ﻋﻤﺪه روش ﻫﺎﻳﻲ ﻛﻪ ﺑﺮاي ﺗﺒﺪﻳﻞ آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل وﺟﻮد دارﻧﺪ ﻋﺒﺎرﺗﻨﺪ از :ﺗﺒﺪﻳﻞ آﻧـﻲ ﻳـﺎ ،Flashروش ﺗﻘﺮﻳـﺐ
Sigma-Delta ،Pipeline ADCو ﻏﻴﺮه ﻛﻪ از اﻳﻦ ﻣﻴﺎن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎي AVRاز روش ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘـﻮاﻟﻲ
اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ.
:Sample and Holdﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻧﻤﻮﻧﻪ ي آﻧﺎﻟﻮگ ﺑﻪ ﻣﻘﺪار ﺑـﺎﻳﻨﺮي ﻣﺘﻨـﺎﻇﺮ ﺑـﺎ آن
ﻧﻴﺎز ﺑﻪ ﻳﻚ ورودي Stableدارد ﻛﻪ اﻳﻦ ﻃﺮﻳﻖ ﻣﺪار Sample and Holdاﻳﺠﺎد ﻣـﻲ ﺷـﻮد .در ﺷـﻜﻞ زﻳـﺮ ﻳـﻚ
ﻧﻤﻮﻧﻪ ي ﺑﺴﻴﺎر ﺳﺎده از آن را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﻛﻠﻴﺪ ،ﺳﻴﮕﻨﺎل ورودي را ﺑﺎ ﻫﺮ ﻧﻤﻮﻧﻪ ي ﺑﺮداﺷﺘﻪ ﺷﺪه ﺑﻪ ﺧﺎزن وﺻﻞ
ﻣﻲ ﻛﻨﺪ و ﺧﺎزن ﻧﻴﺰ ﻣﻘﺪار وﻟﺘﺎژ را ﺗﺎ ﻧﻤﻮﻧﻪ ي ﺑﻌﺪي ﺛﺎﺑﺖ ﻧﮕﺎه ﻣﻲ دارد.
:Successive Approximation Registerاﻳﻦ رﺟﻴﺴﺘﺮ ﻣﻘﺪار ﺗﻘﺮﻳﺐ زده ﺷﺪه ي دﻳﺠﻴﺘﺎل را ﺑﺮاي ﻣﻘﺎﻳﺴﻪ
اﻟﮕﻮرﻳﺘﻢ ﺗﺒﺪﻳﻞ:
اﺑﺘﺪا رﺟﻴﺴﺘﺮ SARﺑﺎ ﻋﺪد ﺑﺎﻳﻨﺮي 10000000ﺑﺎرﮔﺬاري ﻣﻲ ﺷﻮد و اﻳﻦ ﻋـﺪد ﺗﻮﺳـﻂ DACﺑـﺎ ﻣﻘـﺪار آﻧـﺎﻟﻮگ
ورودي ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد ﻣﻘﺎﻳﺴﻪ ﺷﺪه ﺑﺰرﮔﺘﺮ ﺑﺎﺷﺪ و ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨـﺪه ﺑﺎﻋـﺚ ﻣـﻲ ﺷـﻮد،
SARﺑﻴﺖ MSBرا ﭘﺎك ﻛﺮده و ﺑﻴﺖ ﻗﺒﻞ از آن را ﻳﻚ ﻛﻨﺪ و در ﻧﺘﻴﺠﻪ ﻋـﺪد 01000000در DACﺑﺎرﮔـﺬاري
ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد ﻣﻘﺎﻳﺴﻪ ﺷﺪه ﻛﻮﭼﻜﺘﺮ ﺑﺎﺷﺪ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺑﺎﻋﺚ ﻣﻲ ﺷـﻮد ﺑﻴـﺖ ﻛـﻮﭼﻜﺘﺮ ﻧﻴـﺰ
ﻳﻚ ﺷﺪه و در ﻧﺘﻴﺠﻪ ﻋﺪد 11000000در ورودي DACﺑﺎرﮔﺬاري ﺷﻮد .اﻳﻦ ﻋﻤﻞ ﺗﺎ ﭘﻴـﺪا ﺷـﺪن ﻣﻘـﺪار آﻧـﺎﻟﻮگ
اداﻣﻪ داﺷﺘﻪ و در اﻳﻦ زﻣﺎن ﺑﻴﺖ End of Conversionﺑﻪ ﻧﺸﺎﻧﻪ ي ﭘﺎﻳﺎن ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻲ ﺷﻮد.
• 10-bit Resolution
• ±2 LSB Absolute Accuracy
• 65 - 260 μs Conversion Time
• Up to 15 kSPS at Maximum Resolution
• 8 Multiplexed Single Ended Input Channels
• 7 Differential Input Channels
• 2 Differential Input Channels with Optional Gain of 10x and 200x
• 0 - VCC ADC Input Voltage Range
• Selectable 2.56V ADC Reference Voltage
• Free Running or Single Conversion Mode
• ADC Start Conversion by Auto Triggering on Interrupt Sources
• Interrupt on ADC Conversion Complete
• Sleep Mode Noise Canceler
اﻋﻤﺎلADC ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﺑﻪ ﺻﻮرت ﻣﺎﻟﺘﻲ ﭘﻠﻜﺲ ﺷﺪه ﺑﻪPORA ﻋﻤﻠﻜﺮد دومADC ﭘﻴﻦ ﻫﺎي ورودي
و وﻟﺘﺎژAREF ﭘﻴﻦ،AVCC وﻟﺘﺎژ ورودي ﺑﻴﻦ ﺻﻔﺮ ﺗﺎ وﻟﺘﺎژ ﻣﺮﺟﻊ ﺑﻮده و وﻟﺘﺎژ ﻣﺮﺟﻊ از ﺳﻪ ﻣﻨﺒﻊ.ﻣﻲ ﺷﻮﻧﺪ
ﺗﻐﺬﻳﻪ ي آن ﺑﻪ ﺻﻮرتADC ﺟﻬﺖ ﻛﺎﻫﺶ ﻧﻮﻳﺰ ﻣﻮﺛﺮ ﺑﺮ روي واﺣﺪ. وﻟﺖ ﻗﺎﺑﻞ ﺗﺎﻣﻴﻦ ﻣﻲ ﺑﺎﺷﺪ2,56 داﺧﻠﻲ
در. ﺗﻔﺎوت داﺷﺘﻪ ﺑﺎﺷﺪVCC وﻟﺖ ﺑﺎ0,3 وﻟﺘﺎژ اﻳﻦ ﭘﻴﻦ ﻧﺒﺎﻳﺪ ﺑﻴﺸﺘﺮ از. ﺗﺎﻣﻴﻦ ﻣﻲ ﺷﻮدAVCC ﺟﺪاﮔﺎﻧﻪ از ﭘﻴﻦ
VCC اﻳﻦ ﭘﺎﻳﻪ ﺑﻪLC ﻣﻲ ﺗﻮان ﺑﻮﺳﻴﻠﻪ ي ﻳﻚ ﻓﻴﻠﺘﺮ، اﺳﺘﻔﺎده ﻣﻲ ﺷﻮدAVCC ﺑﻪ ﻋﻨﻮانVCC ﺻﻮرﺗﻲ ﻛﻪ از
.ﻣﺘﺼﻞ ﻧﻤﻮد
- ١٧٨ -
P a g e | 179
www.eca.ir
] :Analog Channel and Gain Selection Bits[4:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛـﻪ ﭼـﻪ ﺗﺮﻛﻴﺒـﻲ از 8
ﻛﺎﻧﺎل ورودي ﺑﻪ واﺣﺪ ADCﻣﺘﺼﻞ ﺷﺪه و ﻫﻤﭽﻨﻴﻦ ﺑﻬﺮه ورودي ﺗﻔﺎﺿﻠﻲ را ﻧﻴﺰ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ .در ﺣﺎﻟـﺖ ﻫـﺎي
Single-endedدﻗﺖ 10 ADCﺑﻴﺘﻲ ﺑﻮده ﻛﻪ در ﺣﺎﻟﺖ ورودي دﻳﻔﺮاﻧﺴﻴﻞ ﺑﺎ ﺑﻬﺮه ي 1xو 10xاﻳﻦ ﻣﻘﺪار ﺑﻪ 8
در ﺻﻮرﺗﻲ ﻛﻪ ADCﻣﺸﻐﻮل اﻧﺠﺎم ﻳﻚ ﺗﺒﺪﻳﻞ ﺑﻮده و اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ ﺗﺎ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ﺟﺎري اﻳﻦ ﺗﻐﻴﻴﺮ اﻧﺠـﺎم
ﻧﺨﻮاﻫﺪ ﺷﺪ.ﺗﻨﻈﻴﻤﺎت اﻳﻦ 4ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ) :ﻋﻤﻠﻜﺮد ﺗﻔﺎﺿـﻠﻲ ﻓﻘـﻂ ﺑـﺮ روي Packageﻫـﺎي
- ١٨٠ -
P a g e | 181
www.eca.ir
:ADC Left Adjust Resultﺑﻴﺖ ADLRﺑﺮ ﻧﺤﻮه ﻧﻤﺎﻳﺶ ﻧﺘﻴﺠﻪ ي ﺗﺒﺪﻳﻞ در رﺟﻴﺴﺘﺮ داده ي ADCﺗـﺎﺛﻴﺮ
ﻣﻲ ﮔﺬارد .ﻧﻮﺷﺘﻦ ﻳﻚ در اﻳﻦ ﺑﻴﺖ آن را ﺑﻪ ﺻﻮرت Left Adjustﺗﻨﻈﻴﻢ ﻣﻲ ﻛﻨﺪ و در ﻏﻴـﺮ اﻳﻨﺼـﻮرت ﻧﺘﻴﺠـﻪ ﺑـﻪ
ﺻﻮرت Right Adjustﺧﻮاﻫﺪ ﺑﻮد .ﺗﻐﻴﻴﺮ اﻳﻦ ﺑﻴﺖ ﺑﻪ ﺻﻮرت آﻧﻲ ﺑﺮ روي رﺟﻴﺴﺘﺮ داده ﺗﺎﺛﻴﺮ ﻣﻲ ﮔﺬارد.
] :Reference Selection Bits[1:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﺮﺟﻊ وﻟﺘﺎژ ADCرا ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ .در
ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﻫﺎ در ﺣﻴﻦ ﺗﺒﺪﻳﻞ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ ﺗﺎ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ﺗﻐﻴﻴﺮ اﻋﻤﺎل ﻧﺨﻮاﻫﺪ ﺷﺪ .در ﺻﻮرﺗﻲ ﻛـﻪ از ﻣﺮﺟـﻊ
وﻟﺘﺎژ داﺧﻠﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﻧﺒﺎﻳﺪ وﻟﺘﺎژ ﺧﺎرﺟﻲ ﺑﻪ ﭘﻴﻦ AREFاﻋﻤﺎل ﺷﻮد .زﻣﺎﻧﻲ ﻛﻪ ﻳﻜﻲ از دو وﻟﺘﺎژ AREFﻳﺎ
2,56وﻟﺖ ﺑﻪ ﻋﻨﻮان ﻣﺮﺟﻊ اﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﻨﺪ ﺑﺎ اﺗﺼﺎل ﻳﻚ ﺧﺎزن 100ﻧﺎﻧﻮ ﺑـﻴﻦ ﭘـﻴﻦ AREFو زﻣـﻴﻦ ﻣـﻲ ﺗـﻮان
] :ADC Prescaler Select Bits[2:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺿﺮﻳﺐ ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه اي را ﻛﻪ از ﻛﻼك ﺳﻴﺴﺘﻢ ﺑـﺮاي
:ADC Interrupt Enableدر ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ) (Iو ﻳﻚ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ،اﺗﻤﺎم
:ADC Interrupt Flagﺑﺎ اﺗﻤﺎم ﻳﻚ ﺗﺒﺪﻳﻞ اﻳﻦ ﭘﺮﭼﻢ ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔـﻪ ،اﺟـﺮاي ISR
ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ ﭘﺎك ﺷﺪن آن ﺷﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ در ﻣﺤﻞ اﻳﻦ ﺑﻴﺖ ﻣﻲ ﺗﻮان آن را ﭘﺎك ﻧﻤﻮد.
:ADC Auto Trigger Enableﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﺑﻪ دو ﺻﻮرت ﻣﻲ ﺗﻮاﻧﺪ راه اﻧﺪازي ﺷـﻮد Single ،و Auto
Triggerﻛﻪ ﺣﺎﻟﺖ اول ﺑﺎ ﻫﺮ ﺑﺎر راه اﻧﺪازي ADCﻳﻚ ﺗﺒﺪﻳﻞ اﻧﺠﺎم ﺷﺪه و در وﺿﻌﻴﺖ دوم ADCﺑـﻪ ﺻـﻮرت
ﺧﻮدﻛﺎر از ﻃﺮﻳﻖ ﻳﻜﻲ ازﻣﻨﺎﺑﻊ داﺧﻠﻲ ﺗﺤﺮﻳﻚ ﻣﻲ ﺷﻮد .ﺑﺮاي ﻗﺮار دادن ADCدر وﺿـﻌﻴﺖ Auto Triggerﺑﺎﻳـﺪ
اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺷﻮد .ﻧﻮع ﻣﻨﺒﻊ ﺗﺮﻳﮕـﺮ ﻛﻨﻨـﺪه ﺑﻮﺳـﻴﻠﻪ ي ﺑﻴـﺖ ﻫـﺎي ] ADTS[2:0از رﺟﻴﺴـﺘﺮ SFIORاﻧﺘﺨـﺎب
ﻣﻲ ﺷﻮد.
:ADC Start Conversionدر وﺿﻌﻴﺖ راه اﻧﺪازي ،Singleﺑﺮاي آﻏﺎز ﻫﺮ ﺗﺒﺪﻳﻞ ﺑﺎﻳﺪ اﻳﻦ ﺑﻴﺖ ﻳـﻚ ﺷـﻮد و
در وﺿﻌﻴﺖ ﺗﺒﺪﻳﻞ ﭘﻴﻮﺳﺘﻪ ) (Free Runningﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ اوﻟﻴﻦ ﺗﺒﺪﻳﻞ را ﻣﻮﺟﺐ ﻣﻲ ﺷﻮد.
:ADC Enableاﻳﻦ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻣﺎژول ADCﺑﻮده و ﺑﺎ ﻳﻚ ﻛﺮدن آن ﻣﻲ ﺗﻮان ADCرا ﻓﻌﺎل ﻧﻤﻮد .ﻧﻮﺷـﺘﻦ
ﺻﻔﺮ روي اﻳﻦ ﺑﻴﺖ در ﺣﺎﻟﻲ ﻛﻪ ADCﻣﺸﻐﻮل ﺗﺒﺪﻳﻞ اﺳﺖ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﻧﻴﻤﻪ ﻛﺎره رﻫﺎ ﺷﻮد.
ﺑﺎ ﭘﺎﻳﺎن ﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﻧﺘﻴﺠﻪ در اﻳﻦ رﺟﻴﺴﺘﺮ ﻗﺮار ﻣﻲ ﮔﻴﺮد و در ﺻﻮرﺗﻲ ﻛﻪ ورودي ADCﺑﻪ ﺻـﻮرت دﻳﻔﺮاﻧﺴـﻴﻞ
ﻣﻄﺎﺑﻖ ﺑﻴﺖ ADLRدر رﺟﻴﺴﺘﺮ ADMUXﺑﻪ دو ﺻﻮرت LAو RAﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد:
ADLR=0
Bit 7 6 5 4 3 2 1 0
ADCL ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
ADLR=1
Bit 7 6 5 4 3 2 1 0
ADCL ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2
:ADC Auto Trigger Sourceدر ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ADATEاز رﺟﻴﺴـﺘﺮ ADCSRAﻣﻘـﺪار ﻳـﻚ داﺷـﺘﻪ
ﺑﺎﺷﺪ ﺑﻴﺖ ﻫﺎي ADTSﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻛﺪام ﻣﻨﺒﻊ ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ADCرا راه اﻧﺪازي ﻛﻨـﺪ .ﻣﻨﺒـﻊ اﻳـﻦ راه
اﻧﺪازي ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺮﭼﻢ وﻗﻔﻪ ي آن ﻣﻨﺒﻊ ﻣﻲ ﺑﺎﺷﺪ و در ﺻﻮرﺗﻲ ﻛـﻪ ﺑﺨـﻮاﻫﻴﻢ اﺗﻤـﺎم ﺗﺒـﺪﻳﻞ ﺧـﻮد ADC
ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﺑﻌﺪي ﺑﺎﺷﺪ و ADCﺑﻪ ﺻﻮرت ﭘﻴﻮﺳـﺘﻪ ﻋﻤﻠﻴـﺎت ﺗﺒـﺪﻳﻞ را اﻧﺠـﺎم دﻫـﺪ از ﺣﺎﻟـﺖ Free Running
اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.
ﭘﺲ از اﻧﺘﺨﺎب ﻛﺎﻧﺎل ﻣﻮرد ﻧﻈﺮ و وﻟﺘﺎژ ﻣﺮﺟﻊ ﺑﻮﺳﻴﻠﻪ رﺟﻴﺴﺘﺮ ،ADMUXﺑﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜـﻪ ﺑﻴـﺖ ADEN
ﻳﻚ ﺑﻮده ﺑﺎﺷﺪ ،ﻧﻮﺷﺘﻦ ﻳﻚ ﻣﻨﻄﻘﻲ ﺑﺮ روي ﺑﻴﺖ ADSCﺷﺮوع ﻳﻚ ﺗﺒﺪﻳﻞ را ﻣﻮﺟﺐ ﺧﻮاﻫﺪ ﺷﺪ .اﻳﻦ ﺑﻴﺖ در ﺣﻴﻦ
اﻧﺠﺎم ﺗﺒﺪﻳﻞ ﻳﻚ ﺑﻮده و ﺑﺎ ﭘﺎﻳﺎن آن ﺑﻮﺳﻴﻠﻪ ي ﺳﺨﺖ اﻓﺰار ﭘﺎك ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻗﺒﻞ از اﺗﻤﺎم ﺗﺒـﺪﻳﻞ ،ﻛﺎﻧـﺎل
ADCﺗﻐﻴﻴﺮ ﻛﻨﺪ ﺗﺎ ﭘﺎﻳﺎن ﺗﺒﺪﻳﻞ ﺟﺎري اﻳﻦ ﺗﻐﻴﻴﺮ ﺗﺎﺛﻴﺮ ﻧﺨﻮاﻫﺪ ﮔﺬاﺷﺖ.
راه دﻳﮕﺮ ﺑﺮاي راه اﻧﺪازي ADCوﺿﻌﻴﺖ ﺗﺤﺮﻳﻚ ﺧﻮدﻛﺎر ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ ﺣﺎﻟﺖ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ADATEاز
رﺟﻴﺴﺘﺮ ADCSRAآﻏﺎز ﻣﻲ ﺷﻮد .ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي ADTSدر رﺟﻴﺴﺘﺮ SFIORاﻧﺘﺨـﺎب ﻣـﻲ
ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ ،ﺑﺪﻳﻦ وﺳﻴﻠﻪ ﻣﻲ ﺗﻮان در ﺑﺎزه ﻫﺎي زﻣﺎﻧﻲ ﺛﺎﺑﺖ ADCرا ﺗﺮﻳﮕﺮ ﻧﻤﻮد.
ﭘﺮﭼﻢ اﺗﻤﺎم ﻳﻚ ﺗﺒﺪﻳﻞ ﺑﻴﺖ ADIFﻣﻲ ﺑﺎﺷﺪ ،در ﺻﻮرﺗﻲ ﻛﻪ ADCدر وﺿﻌﻴﺖ ﺗﺤﺮﻳـﻚ ﺧﻮدﻛـﺎر ﻗـﺮار ﮔﺮﻓﺘـﻪ و
اﻳﻦ ﺑﻴﺖ ﺑﻪ ﻋﻨﻮان ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ اﻧﺘﺨﺎب ﺷﻮد ،ﭘﺲ از اﺗﻤﺎم ﻳﻚ ﺗﻴﺪﻳﻞ ،ﺗﺒﺪﻳﻞ ﺟﺪﻳﺪي ﺷﺮوع ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺮاي رﺳﻴﺪن
ﺑﻪ اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻳﺪ ﺑﻴﺖ ﻫﺎي ADTSدر ﺣﺎﻟﺖ Free Runningﻗﺮار ﮔﻴﺮﻧﺪ و ﺑﺮاي ﺷﺮوع ﺗﺒﺪﻳﻞ ﺗﻨﻬﺎ ﻳـﻚ ﺑـﺎر
ﻫﻤﺎن ﻃﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ADIEﺑﺎﻻ رﻓﺘﻦ ﭘﺮﭼﻢ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ) (ADIFﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ
اﻳﺠﺎد وﻗﻔﻪ ﺷﺪه و ﺑﺎ اﺟﺮاي ISRاﻳﻦ ﺑﻴﺖ ﺗﻮﺳﻂ ﺳـﺨﺖ اﻓـﺰار ﭘـﺎك ﺷـﻮد .در ﺻـﻮرﺗﻲ ﻛـﻪ ADCدر وﺿـﻌﻴﺖ
Single Conversionﻳﺎ ﺗﻚ ﺗﺒﺪﻳﻞ ﺑﺎﺷﺪ ﺑﺮاي ﺷﺮوع ﺗﺒﺪﻳﻞ ﺑﻌﺪي ﺑﺎﻳﺪ ﭘﺮﭼﻢ ADIFﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑـﺮ روي آن
ﭘﺎك ﺷﻮد ،در ﺣﺎﻟﻴﻜﻪ وﺿﻌﻴﺖ Free Runningاﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﺪ ﺑﺪون در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜﻪ ﭘﺮﭼﻢ ADIFﭘـﺎك
ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ،ﻣﺪاري ﻛﻪ ﺑﺮ اﺳﺎس ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘﻮاﻟﻲ ﺗﺒﺪﻳﻞ آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل را اﻧﺠﺎم ﻣﻲ دﻫﺪ ﺑﺮاي
رﺳﻴﺪن ﺑﻪ ﻣﺎﻛﺰﻳﻤﻢ ،Resolutionﻧﻴﺎز ﺑﻪ ﻳﻚ ﻛﻼك ورودي ﺑﺎ ﻓﺮﻛﺎﻧﺴﻲ ﺑﻴﻦ 50ﺗﺎ 200ﻛﻴﻠﻮﻫﺮﺗﺰ دارد .ﻣﺎژول
ADCﺑﺮاي ﺗﺎﻣﻴﻦ ﻛﻼك ﻣﻮرد ﻧﻴﺎز داراي ﻳﻚ ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻣﻘﺪار آن ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي
ADPSاز رﺟﻴﺴﺘﺮ ADCSRAﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد .واﺣﺪ ADCﺑﺮاي ﻋﻤﻠﻜﺮد ﺻﺤﻴﺢ ﺑﻪ ﻓﺮﻛﺎﻧﺲ ﻛﻼﻛﻲ ﺑﻴﻦ 50ﺗﺎ
200ﻛﻴﻠﻮﻫﺮﺗﺰ ﻧﻴﺎز دارد و در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻘﺪار آن ﺧﺎرج از اﻳﻦ ﻣﺤﺪوده ﺗﻌﺮﻳﻒ ﺷﻮد ﻣﻤﻜﻦ اﺳﺖ ﻋﻤﻠﻜﺮد
ﻣﻲ ﻛﺸﺪ ،درﺣﺎﻟﻴﻜﻪ در وﺿﻌﻴﺖ Free Runningﻫﺮ ﺗﺒﺪﻳﻞ ﺑﺮاي ﻛﺎﻣﻞ ﺷﺪن ﺣﺪود 13ﻛﻼك زﻣﺎن ﻧﻴﺎز دارد.
ﻣﺪارات داﺧﻠﻲ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺑﺎ اﻳﺠﺎد ﻧﻮﻳﺰ ﺑﺎﻋﺚ ﻛﺎﻫﺶ دﻗﺖ ﻣﻘﺪار ﺧﻮاﻧﺪه ﺷـﺪه ﺗﻮﺳـﻂ ADCﻣـﻲ ﺷـﻮﻧﺪ ،ﺑـﺮاي
ﺑﻬﺒﻮد اﻳﻦ ﻣﺸﻜﻞ ﻣﻲ ﺗﻮان در زﻣـﺎن ﺗﺒـﺪﻳﻞ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟـﺮ را ﺑـﻪ ﻳﻜـﻲ از Modeﻫـﺎي ﻛـﻢ ﺗـﻮان ADC Noise
*****************************************************/
Project : Temprature Measurement with LM35
Author : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
Chip type : ATmega16
Clock frequency : 1.000000 MHz
*****************************************************/
>#include <mega16.h
>#include <delay.h
>#include <stdio.h
#define xtal 8000000
#include <lcd.h>
void main(void)
{
char lcd_buff[10];
int adc_in;
float temp;
PORTA=0x00;
DDRA=0x00;
// ADC initialization
// ADC Clock frequency: 45 kHz
// ADC Voltage Reference: Int., cap. on AREF
- ١٨٩ -
P a g e | 190
www.eca.ir
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;
while (1)
{
adc_in=read_adc(0);
temp=adc_in/4;
sprintf(lcd_buff,"Temp=%5.1f C",temp);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(lcd_buff);
delay_ms(1000);
};
}
- ١٩٠ -
P a g e | 191
www.eca.ir
:ﺷﻤﺎﺗﻴﻚ
- ١٩١ -
P a g e | 192
www.eca.ir
ﻣﺎژول ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ داراي دو ورودي AIN0و AIN1ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ دو ﺑﻪ ﺗﺮﺗﻴﺐ ورودي ﻣﺜﺒـﺖ و
ﻣﻨﻔﻲ واﺣﺪ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺑﻮده ﻛﻪ ﻫﻤﺎﻧﻨﺪ ﻳﻚ ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي ﻋﻤﻠﻴﺎﺗﻲ وﻟﺘﺎژ روي اﻳـﻦ دو ﭘﺎﻳـﻪ را ﻣﻘﺎﻳﺴـﻪ ﻛـﺮده و
ﻫﻨﮕﺎﻣﻲ ﻛﻪ وﻟﺘﺎژ روي ﭘﺎﻳﻪ ي AIN0ﺑﻴﺸﺘﺮ از وﻟﺘﺎژ AIN1ﺑﺎﺷﺪ ﺧﺮوﺟﻲ آن ﻳﻌﻨﻲ ﺑﻴﺖ ACOﻳﻚ ﻣﻲ ﺷﻮد .اﻳﻦ
ﺧﺮوﺟﻲ ﻋﻼوه ﺑﺮ ﻛﺎرﺑﺮدﻫﺎي ﻋﺎدي ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﺗﺮﻳﮕﺮ ﻛﺮدن ورودي Captureﺗﺎﻳﻤﺮ ﻳﻚ ﻧﻴﺰ ﺑﻪ ﻛﺎر رود.
:Analog Comparator Multiplexer Enableﻣﺎژول ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ اﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﺗـﺎ
ورودي ﻣﻨﻔﻲ از ﻃﺮﻳﻖ ﭘﺎﻳﻪ ﻫﺎي ADC0ﺗﺎ ADC7اﻧﺘﺨﺎب ﺷﻮد .در ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ACMEو ﺧـﺎﻣﻮش
ﺑﻮدن ) ADCﺑﻴﺖ ADENدر ADCSRAﺻﻔﺮ ﺑﺎﺷﺪ( ،ﺧﺮوﺟﻲ ﻣﺎﻟﺘﻲ ﭘﻠﻜﺴﺮ ADCﺑـﻪ ﻋﻨـﻮان ورودي ﻣﻨﻔـﻲ
ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه اﻧﺘﺨﺎب ﻣﻲ ﺷﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﭘﺎﻳﻪ AIN1ورودي ﻣﻨﻔﻲ ﺧﻮاﻫﺪ ﺑﻮد.
] :Analog Comparator Interrupt Mode Select[1:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ ﻛـﻪ ﻛـﺪاﻣﻴﻚ از
روﻳﺪادﻫﺎي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ وﻗﻔﻪ ي آن را ﺗﺮﻳﮕﺮ ﻣﻲ ﻛﻨﺪ.
:Analog Comparator Input Capture Enableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ورودي Captureﺗﺎﻳﻤﺮ ﻳـﻚ
:Analog Comparator Interrupt Enableدر ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ و ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔـﻪ ﻫـﺎ
:Analog Comparator Interrupt Flagاﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻛﻪ ﻳﻜﻲ از روﻳﺪاد ﻫﺎي ﺗﻌﺮﻳﻒ ﺷـﺪه ﺑﻮﺳـﻴﻠﻪ
ي ﺑﻴﺖ ﻫﺎي ACIS1و ACIS0روي دﻫﺪ ،ﺑﻮﺳﻴﻠﻪ ي ﺳﺨﺖ اﻓﺰار ﻳﻚ ﻣﻲ ﺷﻮد .در اﻳﻦ وﺿﻌﻴﺖ اﮔـﺮ ACIEو
ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ ﻳﻚ ﺑﺎﺷﺪ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ISRﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﻣﻨﺸﻌﺐ ﺧﻮاﻫﺪ ﺷﺪ و ﺑﻴـﺖ ACIﺗﻮﺳـﻂ ﺳـﺨﺖ
اﻓﺰار ﭘﺎك ﺧﻮاﻫﺪ ﺷﺪ ،در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ آن را ﭘﺎك ﻛﻨﺪ.
:Analog Comparator Outputاﻳﻦ ﺑﻴﺖ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه آﻧﺎﻟﻮگ ﺑﻮده و ﺑﺎ ﺗﺎﺧﻴﺮي ﺑﻴﻦ ﻳـﻚ ﺗـﺎ دو
ورودي ﻣﺜﺒﺖ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺧﻮاﻫﺪ ﺷﺪ .در ﺻﻮرت ﺻﻔﺮ ﺑﻮدن ﺑﻴـﺖ ACGBﭘـﻴﻦ AIN0ورودي ﻣﺜﺒـﺖ ﻣﻘﺎﻳﺴـﻪ
:Analog Comparator Disableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ﺗﻐﺬﻳﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﻗﻄﻊ ﻣﻲ ﺷﻮد .اﻳﻦ
ﻣﺴﺌﻠﻪ ﺑﻪ ﻛﺎﻫﺶ ﺗﻮان ﻣﺼﺮﻓﻲ در Modeﻫﺎي ﻓﻌﺎل و ﺑﻴﻜﺎري ﻛﻤﻚ ﺧﻮاﻫﺪ ﻛﺮد .ﻗﺒـﻞ از ﺗﻐﻴﻴـﺮ دادن ﺑﻴـﺖ ACD
ﺑﺎﻳﺪ وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﺑﺎ ﭘﺎك ﻛﺮدن ﺑﻴﺖ ACIEاز ACSRﻏﻴﺮ ﻓﻌـﺎل ﺷـﻮد در ﻏﻴـﺮ اﻳﻨﺼـﻮرت در
اﻳﻦ اﻣﻜﺎن وﺟﻮد دارد ﻛﻪ ﻫﺮ ﻳﻚ از ورودي ﻫﺎي ADC0ﺗﺎ ADC7ﺑﻪ ﻋﻨﻮان ورودي ﻣﻨﻔﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه آﻧـﺎﻟﻮگ
اﻧﺘﺨﺎب ﺷﻮﻧﺪ .ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﻣﺴﺌﻠﻪ ﺑﺎﻳﺪ )ﺑﺎ ﺻﻔﺮ ﺑﻮدن ﺑﻴﺖ (ADENﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل ﺧﺎﻣﻮش ﺑـﻮده
و ﺑﻴﺖ ACMEاز SFIORﻳﻚ ﺑﺎﺷﺪ .در اﻳﻦ وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي ] MUX[2:0از رﺟﻴﺴﺘﺮ ADMUXورودي
ﻣﻨﻔﻲ را ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﻨﺪ .ﻣﺴﻠﻤﺎ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ACMEﺻﻔﺮ ﺑﻮده ﻳﺎ ADENﻳـﻚ ﺑﺎﺷـﺪ
1 0 001 ADC1
1 0 010 ADC2
1 0 011 ADC3
1 0 100 ADC4
1 0 101 ADC5
1 0 110 ADC6
1 0 111 ADC7
#include <mega16.h>
void main(void)
{
// Declare your local variables here
- ١٩٦ -
P a g e | 197
www.eca.ir
PORTA=0x00;
DDRA=0x01;
while (1);
}
:ﺷﻤﺎﺗﻴﻚ
- ١٩٧ -
P a g e | 198
www.eca.ir
- ١٩٨ -
P a g e | 199
www.eca.ir
SPI Bus
ﺑﻮده و ﺑﻮﺳـﻴﻠﻪ ﺷـﺮﻛﺖSerial Peripheral Interface ﻛﻪ ﻳﻚ اﺳﺘﺎﻧﺪارد ﺳﺮﻳﺎل ﺳﻨﻜﺮون ﻣﻲ ﺑﺎﺷﺪ ﺳﺮﻧﺎمSPI
اﻳﻦ اﺳﺘﺎﻧﺪارد ﺑﻪ ﻟﺤﺎظ ﭘﺸﺘﻴﺒﺎﻧﻲ از ﺳﺮﻋﺖ ﻫﺎي ﺑﺎﻻ ﻧﻪ ﺗﻨﻬﺎ در ﻛﺎرﺑﺮدﻫﺎي اﻧﺪازه ﮔﻴـﺮي.ﻣﻮﺗﻮروﻻ ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ
ﻧﻴـﺰ ﻣـﻮرد... ﻛﺎﻧـﺎل ﻫـﺎي ارﺗﺒـﺎﻃﻲ و، ﭘﺮدازش ﺳﻴﮕﻨﺎل دﻳﺠﻴﺘﺎل،ﺑﻠﻜﻪ در ﻣﻮاردي ﻧﻈﻴﺮ اﻧﺘﻘﺎل ﺣﺠﻢ ﺑﺎﻻي اﻃﻼﻋﺎت
ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳـﺖ و در ﻧﺘﻴﺠـﻪ اﻣﻜـﺎنSPI ﺳﺮﻋﺖ ﭼﻨﺪ ﻣﮕﺎﺑﻴﺖ ﺑﺮ ﺛﺎﻧﻴﻪ ﺑﻪ راﺣﺘﻲ ﺗﻮﺳﻂ.اﺳﺘﻔﺎده واﻗﻊ ﻣﻲ ﺷﻮد
.اﻧﺘﻘﺎل ﺻﻮت ﻓﺸﺮده ﻧﺸﺪه و ﺗﺼﻮﻳﺮ ﻓﺸﺮده ﺷﺪه وﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ
SSM2163 8x2 Audio Mixer 63dB attenuation in 1dB steps Analog Devices
- ١٩٩ -
P a g e | 200
www.eca.ir
AT45DB041 FLASH 5V 4MBit 10MHz ATMEL
- ٢٠٠ -
P a g e | 201
www.eca.ir
years
National
CLC5506 GTA (Gain Trim Amplifier) 600MHz bandwidth control range 16dB
Semiconductor
National
COP472-3 LCD Controller Keine SDO-Leitung
Semiconductor
National
LM74 Temperature Sensor 12Bit + sign 3V to 5V -55 °C to +150 °C
Semiconductor
National
MM5483 LCD Controller 31 segment outputs cascadeable
Semiconductor
National
USBN9602 USB Controller DMA-Support Several FIFOs
Semiconductor
Master Slave
SCK SCK
MOSI MOSI
MISO MISO
SS SS
- ٢٠١ -
P a g e | 202
www.eca.ir
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻼﺣﻈﻪ ﻣﻲ ﺷﻮد اﻳﻦ ﭼﻬﺎر ﺧﻂ MISO ،MOSI ،SCKو SSﺑـﻮده ﻛـﻪ ﺑـﻪ ﺗﺮﺗﻴـﺐ ﺧـﻂ ﻛـﻼك،
.Master in slave out ،Master out slave inو Slave Selectﻣـﻲ ﺑﺎﺷـﻨﺪ .ﻧﺤـﻮه ي ﺗﻌﺎﻣـﻞ Masterو
ﺳﻴﺴﺘﻢ ﺷﺎﻣﻞ دو Shift Registerو ﻳﻚ ﻣﻮﻟﺪ ﻛﻼك ﻣﻲ ﺑﺎﺷﺪ Master .ﺑﺎ ﺻﻔﺮ ﻛﺮدن ﺧﻂ SSاز Slaveﻣـﻮرد
ﻧﻈـﺮ ،ﭼﺮﺧـﻪ ي ارﺗﺒـﺎﻃﻲ را آﻣـﺎده ﻣـﻲ ﻛﻨـﺪ Master .و Slaveداده ي ﻣـﻮرد ﻧﻈـﺮ ﺑـﺮاي ارﺳـﺎل را در Shift
Registerﻗﺮار داده و Masterﺑﺎ اﻳﺠﺎد ﻛﻼك در ﺧﻂ SCKﻣﺒﺎدﻟﻪ ي داده را آﻏـﺎز ﻣـﻲ ﻛﻨـﺪ .اﻃﻼﻋـﺎت از ﭘـﻴﻦ
MOSIدر Masterﺧﺎرج ﺷـﺪه و وارد ﭘـﻴﻦ MOSIاز Slaveﻣـﻲ ﺷـﻮد .در ﻃـﺮف Slaveﻧﻴـﺰ داده از ﭘـﻴﻦ
MISOﺧﺎرج ﺷﺪه و وارد MISOاز Masterﻣﻲ ﺷﻮد .ﺑﻌﺪ از اﺗﻤـﺎم ارﺳـﺎل ﻳـﻚ ،Packetﻣﺠـﺪدا ﺧـﻂ SS
رﺟﻴﺴﺘﺮﻫﺎي SPI
ﻣﺎژول SPIداراي ﺳﻪ رﺟﻴﺴﺘﺮ SPSR ،SPDRو SPCRﺑﻮده ﻛﻪ ﺑﻪ ﺗﺮﺗﻴﺐ رﺟﻴﺴﺘﺮﻫﺎي داده ،وﺿﻌﻴﺖ و ﻛﻨﺘﺮل
ﻣﻲ ﺑﺎﺷﻨﺪ.
ﻧﻮﺷﺘﻦ ﺑﺮ روي اﻳﻦ رﺟﻴﺴﺘﺮ ﺷﺮوع اﻧﺘﻘﺎل داده را ﻣﻮﺟﺐ ﺧﻮاﻫﺪ ﺷﺪ و ﺧﻮاﻧﺪن آن ﻣﻮﺟﺐ ﺧﻮاﻧـﺪن داده ي ﻣﻮﺟـﻮد
:Double SPI Speed Bitﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي اﻳﻦ ﺑﻴﺖ در ﺻـﻮرﺗﻴﻜﻪ ﻣـﺎژول SPIدر وﺿـﻌﻴﺖ Master
ﺑﺎﺷﺪ ﻓﺮﻛﺎﻧﺲ ﻛﻼك ﻣﻮﺟﻮد روي ﭘﻴﻦ SCKدو ﺑﺮاﺑﺮ ﺧﻮاﻫﺪ ﺷﺪ.
:Write COLlision Flagاﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻳﻚ ﺧﻮاﻫﺪ ﺷﺪ ﻛﻪ در ﺣﻴﻦ اﻧﺘﻘﺎل ﻳـﻚ ﺑﺎﻳـﺖ ﺑـﺮ روي رﺟﻴﺴـﺘﺮ
SPDRﻣﻘﺪاري ﻧﻮﺷﺘﻪ ﺷﻮد .ﺑﺎ اوﻟﻴﻦ ﺧﻮاﻧﺪن رﺟﻴﺴﺘﺮ SPSRاﻳﻦ ﺑﻴﺖ ﭘﺎك ﻣﻲ ﺷﻮد.
:SPI Interrupt Flagاﻳﻦ ﺑﻴﺖ در دو ﺣﺎﻟﺖ ﻳﻚ ﻣﻲ ﺷﻮد .1 :ﺑﺎ اﺗﻤﺎم ارﺳﺎل ﻳﻚ ﺑﺎﻳﺖ اﻳﻦ ﭘﺮﭼﻢ ﻳﻚ ﺷـﺪه و
در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ SPIEو ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ ﻳﻚ ﺑﺎﺷﻨﺪ اﺗﻤﺎم ﻋﻤﻠﻴﺎت ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠـﺎد ﻳـﻚ وﻗﻔـﻪ
ﺷﻮد .2 .ﭘﻴﻦ SSاز ﺧﺎرج ﺗﻮﺳﻂ ﻳﻚ وﺳﻴﻠﻪ ي دﻳﮕﺮ زﻣﻴﻦ ﺷﻮد ،اﻳﻦ ﺑﻪ ﻣﻌﻨﺎي از دﺳﺖ دادن ﺣﺎﻛﻤﺖ ﺑﺎس ﺑـﻮده و
اﻳﻦ وﺿﻌﻴﺖ ﺑﺎ ﻳﻚ ﺷﺪن ﺑﻴﺖ SPIFاﻋﻼم ﻣﻲ ﺷﻮد .ﺑﺎ اﺟﺮاي ISRﻳﺎ ﺧﻮاﻧﺪن رﺟﻴﺴﺘﺮ وﺿﻌﻴﺖ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﻣﻲ
ﺷﻮد.
:SPI Clock Rate Select 1 and 0اﻳﻦ دو ﺑﻴﺖ ﻧﺮخ ﻛﻼك SCKرا ﻛﻪ Masterاﻳﺠـﺎد ﻣـﻲ ﻛﻨـﺪ ﻣﻄـﺎﺑﻖ
Clock Phaseو :Clock Polarityاﻳﻦ دو ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ زﻣـﺎن ﺑﻨـﺪي اﻧﺘﻘـﺎل و درﻳﺎﻓـﺖ داده روي
:Data Orderﺑﺎ ﻳﻚ ﺑﻮدن اﻳﻦ ﺑﻴﺖ اﺑﺘﺪا MSBروي ﺑﺎس ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد و در ﺻﻮرت ﺻﻔﺮ ﺑﻮدن اﺑﺘﺪا .LSB
وﻗﺘﻲ ﻣﺎژول SPIﺑﻪ ﻋﻨﻮان Masterﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه اﺳﺖ ﺧﻂ SSرا ﺑﺼﻮرت ﺧﻮدﻛـﺎر ﻛﻨﺘـﺮل ﻧﻤـﻲ ﻛﻨـﺪ و اﻳـﻦ
وﻇﻴﻔﻪ ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ،ﻗﺒﻞ از آﻏﺎز ﻳﻚ ﭼﺮﺧﻪ ي ارﺗﺒﺎﻃﻲ اﻧﺠﺎم ﺷﻮد .ﭘﺲ از ﺻـﻔﺮ ﻛـﺮدن ، SSﻧﻮﺷـﺘﻦ ﻳـﻚ
ﺑﺎﻳﺖ در رﺟﻴﺴﺘﺮ داده ) (SPDRﺑﺎﻋﺚ اﻳﺠﺎد ﻛﻼك ﺗﻮﺳﻂ واﺣﺪ ﺗﻮﻟﻴﺪ ﻛﻼك ﺧﻮاﻫﺪ ﺷـﺪ و ﺑـﺎ ﻫـﺮ ﭘـﺎﻟﺲ ،داده ي
ﻣﻮﺟﻮد در Shift Registerﻫﺎي Masterو Slaveﻳﻚ ﺑﻴﺖ ﺷﻴﻔﺖ داده ﺷﺪه و ﭘﺲ از 8ﭘﺎﻟﺲ ﺳـﺎﻋﺖ ﭘـﺮﭼﻢ
SPIFﺑﻪ ﻧﺸﺎﻧﻪ ي اﺗﻤﺎم ارﺳﺎل ﻳﻚ ﻣﻲ ﺷﻮد .ﭘﺲ از اﻳﻦ Masterﻣﻲ ﺗﻮاﻧـﺪ ﺑـﺮاي ارﺳـﺎل ﺑﺎﻳـﺖ ﺑﻌـﺪي آن را در
MISOدر وﺿﻌﻴﺖ tri-statedﻣﻲ ﺑﺎﺷﺪ .در اﻳﻦ ﺷﺮاﻳﻂ ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ رﺟﻴﺴﺘﺮ SPDRﺗﻮﺳـﻂ Slaveﺑـﺮوز
ﺷﻮد اﻣﺎ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺧﻂ SSﺗﻮﺳﻂ Masterﺻﻔﺮ ﻧﺸﻮد اﻧﺘﻘﺎل اﻧﺠـﺎم ﻧﺨﻮاﻫـﺪ ﺷـﺪ .ﭘـﺲ از Lowﺷـﺪن SSو
اﺗﻤﺎم درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ ﭘﺮﭼﻢ SPIFﻳﻚ ﺷﺪه و در ﺻﻮرت ﻳﻚ ﺑﻮدن SPIEو ﺑﻴـﺖ ،Iاﻳـﻦ روﻳـﺪاد ﻣـﻲ ﺗﻮاﻧـﺪ
ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد .ﭘﺲ از اﻳﻦ ﻣﻤﻜﻦ اﺳﺖ Slaveداده ي ﺟﺪﻳﺪي را در SPDRﻗﺮار دﻫﺪ ﻣﻨﺘﻬﺎ ﺑﺎﻳـﺪ ﻗﺒـﻞ از
ﻣﻄﺎﺑﻖ ﺗﺼﻮﻳﺮ زﻳﺮ ﺑﺎ اﺳﺘﻔﺎده از ﭘﻴﻦ SSﻣﻲ ﺗـﻮان ﺗﻌـﺪادي Slaveرا ﻛﻨﺘـﺮل ﻧﻤـﻮد Master .ﺑﺎﻳـﺪ ﺗﻨﻬـﺎ ﭘـﻴﻦ SS
Slaveاي را ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﺑﺎ آن ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﺪ ﺻﻔﺮ ﻛﻨﺪ و ﺑﻘﻴﻪ را ﻳﻚ ﻧﮕﻪ دارد.
اﻋﻼن اﻳﻦ ﺗﺎﺑﻊ در ﻓﺎﻳﻞ spi.hﺑﻮده و ﻧﺤﻮه ي ﻋﻤﻠﻜﺮد آن در ﻓﺎﻳﻞ spi.libﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
ﺑﻨﺎﺑﺮاﻳﻦ آﻧﭽﻪ اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ ﻋﻨﻮان آرﮔﻮﻣﺎن درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ روي ﺑﺎس SPIﻗﺮار ﻣﻲ دﻫﺪ و ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ آن ﻣﻘـﺪار
ﺧﻮاﻧﺪه ﺷﺪه از ﺑﺎس اﺳﺖ .ﻗﺒﻞ از اﺳﺘﻔﺎده از اﻳﻦ ﺗﺎﺑﻊ ﺑﺎﻳﺪ SPIﺑﻮﺳﻴﻠﻪ ي رﺟﻴﺴﺘﺮﻫﺎي ﻛﻨﺘﺮل و وﺿﻌﻴﺖ ﺗﻨﻈﻴﻢ ﺷﺪه
ﺑﺎﺷﺪ.
>#include <mega16.h
>#include <delay.h
)void main(void
{
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 500.000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
// SPI Enable: True
SPCR=0x71;
while(1)
{
incoming=spi(0x77);
delay_ms(50);
}
}
#include <mega16.h>
#include <delay.h>
- ٢٠٩ -
P a g e | 210
www.eca.ir
// SPI functions
#include <spi.h>
void main(void)
{
// SPI initialization
// SPI Type: Slave
// SPI Clock Rate: 500.000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
// SPI Enable: True
SPCR=0x61;
while(1)
{
incoming=spi(0x33);
delay_ms(50);
}
}
- ٢١٠ -
P a g e | 211
www.eca.ir
ﺑﻪ ﻣﻨﻈﻮر ﻣﺪﻳﺮﻳﺖ ﻳﻬﻴﻨﻪ ي ﺗﻮان ﻣﺼﺮﻓﻲ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎي AVRداراي ﺣﺪاﻛﺜﺮ Mode 6ﺧﻮاب ﻣﻲ ﺑﺎﺷﻨﺪ .ﺑـﺮاي
ورود ﺑﻪ ﻫﺮﻳﻚ از 6وﺿﻌﻴﺖ ﺧﻮاب ﺑﺎﻳﺪ ﺑﻴﺖ SEاز رﺟﻴﺴﺘﺮ MCUCEﻳﻚ ﺷﺪه و دﺳﺘﻮراﻟﻌﻤﻞ SLEEPاﺟﺮا
ﺷﻮد .ﺑﻴﺖ ﻫﺎي ] SM[2:0از اﻳﻦ رﺟﻴﺴﺘﺮ ﺗﻌﻴﻴﻦ ﻣـﻲ ﻛﻨﻨـﺪ ﻛـﻪ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟـﺮ وارد ﻛـﺪاﻣﻴﻚ از Modeﻫـﺎي ﻛـﻢ
ﻣﺼﺮف ﺷﻮد .در ﺣﻴﻦ ﺧﻮاب اﮔﺮ وﻗﻔﻪ اي روي دﻫﺪ ﻣﻴﻜﺮو از اﻳﻦ وﺿﻌﻴﺖ ﺧﺎرج ﺷﺪه و ﺑﻌﺪ از ﮔﺬﺷـﺖ 4ﺳـﻴﻜﻞ
ﺑﻪ ﻋﻼوه ي زﻣﺎن ،Startupروﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ را اﺟﺮا ﻛﺮده و ﭘﺲ از آن دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪ از SLEEPرا اﺟـﺮا
ﺧﻮاﻫﺪ ﻛﺮد.
] :Sleep Mode Select Bits[2:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻳﻜﻲ از 6وﺿﻌﻴﺖ SLEEPرا اﻧﺘﺨﺎب ﻣﻲ
ﻛﻨﻨﺪ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ Modeﻫﺎي Standbyو Extended Standbyﻓﻘﻂ ﺑﺎ ﻣﻨﺒﻊ ﻛﻼك ﻛﺮﻳﺴﺘﺎل ﻳﺎ
Modeﻫﺎي ﺧﻮاب
:Idle Modeدر اﻳﻦ وﺿﻌﻴﺖ CPUﻣﺘﻮﻗـﻒ ﺷـﺪه اﻣـﺎ ,SPI, USARTﻣﻘﺎﻳﺴـﻪ ﻛﻨﻨـﺪه ي آﻧـﺎﻟﻮگ، •
,ADC, TWIﺗﺎﻳﻤﺮﻫﺎ Watchdog ،و ﺳﻴﺴﺘﻢ وﻗﻔﻪ ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ دﻫﻨﺪ .اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻋﺚ ﻣﻲ ﺷـﻮد ﻛـﻼك
CPUو ﻛﻼك Flashﻣﺘﻮﻗﻒ ﺷﺪه اﻣﺎ ﺑﻘﻴﻪ ي ﻣﻨﺎﺑﻊ ﻛﻼك ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ دﻫﻨﺪ .ﻣﻨﺎﺑﻊ وﻗﻔﻪ ي داﺧﻠﻲ و ﺧﺎرﺟﻲ
ﺗﺸﺨﻴﺺ آدرس ,TWIﺗﺎﻳﻤﺮ 2و Wathdogﺑﻪ ﻛﺎر ﺧﻮد اداﻣـﻪ ﻣـﻲ دﻫﻨـﺪ .در ﺻـﻮرت ﻓﻌـﺎل ﺑـﻮدن ADCﺑـﻪ
ﻣﺤﺾ ورود ﺑﻪ اﻳﻦ Modeاﻧﺠﺎم ﺗﺒﺪﻳﻞ ﺷﺮوع ﺷﺪه و ﺑﺎ اﺗﻤﺎم آن از اﻳﻦ وﺿﻌﻴﺖ ﺧﺎرج ﻣﻲ ﺷـﻮد .ﻣﻨـﺎﺑﻊ وﻗﻔـﻪ ي
ﻣﺎژول ﻫﺎﻳﻲ ﻛﻪ در اﻳﻦ Modeﻓﻌﺎﻟﻨﺪ و ﻫﻤﭽﻨﻴﻦ Resetﺧـﺎرﺟﻲ Reset ,ﺗـﺎﻳﻤﺮ Wachdogو Brown-out
:Power-down Modeدر اﻳﻦ وﺿﻌﻴﺖ اﺳﻴﻼﺗﻮر ﺧﺎرﺟﻲ ﻣﺘﻮﻗﻒ ﺷـﺪه در ﺻـﻮرﺗﻲ ﻛـﻪ وﻗﻔـﻪ ﻫـﺎي •
ﺧــﺎرﺟﻲ آﺳــﻨﻜﺮون TWI ،و Watchdogﺑــﻪ ﻛــﺎر ﺧــﻮد اداﻣــﻪ ﻣــﻲ دﻫﻨــﺪ Reset .ﺧــﺎرﺟﻲ Reset ،ﺗــﺎﻳﻤﺮ
،Brown-out Reset ،Watchdogﺗﻄﺒﻴــﻖ آدرس TWIو وﻗﻔــﻪ ﻫــﺎي ﺧــﺎرﺟﻲ ﻣــﻲ ﺗﻮاﻧﻨــﺪ ﺑﺎﻋــﺚ ﺧــﺮوج
ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ از ﺣﺎﻟﺖ ﺧﻮاب ﺷﻮﻧﺪ .اﺳﺎﺳﺎ در اﻳﻦ Modeﺗﻤﺎم ﻛﻼك ﻫﺎ ﻣﺘﻮﻗﻒ ﺷﺪه و ﺗﻨﻬﺎ ﻣﺎژول ﻫﺎي آﺳـﻨﻜﺮون
:Power-save Modeاﻳﻦ Modeﻣﺸﺎﺑﻪ Power-downﺑﻮده ﺑﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ اﮔـﺮ ﺗـﺎﻳﻤﺮ 2در •
Modeآﺳﻨﻜﺮون ﻛﺎر ﻛﻨﺪ در ﺣﻴﻦ ﺧﻮاب ﺑﻪ ﻛـﺎر ﺧـﻮد اداﻣـﻪ ﺧﻮاﻫـﺪ داد .در ﺻـﻮرﺗﻲ ﻛـﻪ از ﺗـﺎﻳﻤﺮ 2ﺑﺼـﻮرت
آﺳﻨﻜﺮون اﺳﺘﻔﺎده ﻧﻤﻲ ﺷﻮد ﺑﻬﺘﺮ اﺳﺖ ﺑﺠﺎي اﻳﻦ Modeاز Power-downاﺳﺘﻔﺎده ﺷﻮد.
:Standby Modeاﻳﻦ Modeﻣﺸﺎﺑﻪ Power-downﺑـﻮده ﺑـﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ اﺳـﻴﻼﺗﻮر ﺧـﺎرﺟﻲ •
ﻣﺘﻮﻗﻒ ﻧﻤﻲ ﺷﻮد و اﮔﺮﭼﻪ از ﺑﺨﺶ ﻫﺎي دﻳﮕﺮ ﺟﺪا ﺷﺪه اﺳﺖ اﻣﺎ ﻫﻤﭽﻨﺎن ﺑﻪ ﻛﺎر ﺧـﻮد اداﻣـﻪ ﻣـﻲ دﻫـﺪ .در ﻧﺘﻴﺠـﻪ
زﻣﺎن Startupﺣﺬف ﺷﺪه و زﻣﺎن ﺑﻴﺪار ﺷﺪن ﻣﻴﻜﺮو ﺑﻪ 6ﺳﻴﻜﻞ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ.
:Extended Standby Modeاﻳﻦ Modeﻣﺸﺎﺑﻪ Power-saveﺑﻮده ﺑﺎ اﻳﻦ ﺗﻔـﺎوت ﻛـﻪ اﺳـﻴﻼﺗﻮر •
اﻋﻼن اﻳﻦ ﺗﻮاﺑﻊ در ﻓﺎﻳﻞ sleep.hﻣﻲ ﺑﺎﺷﺪ .ﺷﺎﻣﻞ ﻣﻮارد زﻳﺮ ﻣﻲ ﺑﺎﺷﻨﺪ.
)( :sleep_enableاﻳﻦ ﺗﺎﺑﻊ ﻓﻌﺎل ﺳﺎز ورود ﺑﻪ Modeﻫﺎي ﺧﻮاب ﺑﻮده و ﻗﺒﻞ از اﺳﺘﻔﺎده از ﺳﺎﻳﺮ ﺗﻮاﺑﻊ ﻣﺪﻳﺮﻳﺖ
)( :sleep_disableاﻳﻦ ﺗﺎﺑﻊ ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن Modeﻫﺎي ﺧﻮاب ﺑﻪ ﻛﺎر ﻣﻲ رود.
)( standby() ،powersave() ،powerdown() ،idleو )( :extended_standbyﺑﺎ اﺟﺮاي ﻫﺮﻳﻚ از اﻳﻦ
ﺗﺎﻳﻤﺮ Watchdog
ﺗﺎﻳﻤﺮ Watchdogاز ﻳﻚ اﺳﻴﻼﺗﻮر داﺧﻠﻲ ﻣﺠﺰا ﺑﺎ ﻓﺮﻛﺎﻧﺲ 1ﻣﮕﺎﻫﺮﺗﺰ ﻛﻼك درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺑـﺎ ﺗﻨﻈـﻴﻢ ﭘـﻴﺶ
ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ي ﺗﺎﻳﻤﺮ ،Watchdogﻓﻮاﺻﻞ ﺑﻴﻦ ﻫﺮ Resetﺑـﺎ ﺑﻴـﺖ ﻫـﺎي ] WDP[0:2ﻗﺎﺑـﻞ ﺗﻨﻈـﻴﻢ اﺳـﺖ .ﺑـﺎ
دﺳﺘﻮراﻟﻌﻤﻞ WDRﻳﺎ Resetﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺗﺎﻳﻤﺮ Reset ,Watchdogﺷﺪه و ﻧﺮم اﻓﺰار ﺑﺎﻳـﺪ در ﻓﻮاﺻـﻞ
ﻣﻨﺎﺳﺐ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺗﺎﻳﻤﺮ را Resetﻛﺮده ﺗﺎ ﻣﺎﻧﻊ Resetﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺷﻮد .ﺑﻠـﻮك دﻳـﺎﮔﺮام
WDTCR 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ - - - WDTOE WDE WDP2 WDP1 WDP0
ﻓﻌﺎل اﺳﺖ اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺿﺮﻳﺐ ﺗﻘﺴﻴﻢWatchdog زﻣﺎﻧﻲ ﻛﻪ ﺗﺎﻳﻤﺮ:Watchdog Timer Prescaler[2:0]
- ٢١٥ -
P a g e | 216
www.eca.ir
Watchdog Turn-off Enableو :Watchdog Enableﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي ﺑﻴﺖ WDEﺗﺎﻳﻤﺮ
Watchdogﻓﻌﺎل ﺷﺪه و ﺑﺎ ﭘﺎك ﻛﺮدن آن ﺗﺎﻳﻤﺮ ﻏﻴﺮ ﻓﻌﺎل ﻣﻲ ﺷﻮد .اﮔﺮﭼﻪ ﻓﻌﺎل ﻛﺮدن ﺗﺎﻳﻤﺮ ﺑﻪ ﺳﺎدﮔﻲ و ﺑﺎ ﻧﻮﺷﺘﻦ
ﻳﻚ روي WDEاﻧﺠﺎم ﻣﻲ ﺷﻮد اﻣﺎ ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن آن ﺑﺎﻳﺪ ﻣﺮاﺣﻞ زﻳﺮ ﺑﻪ ﺗﺮﺗﻴﺐ اﻧﺠﺎم ﺷﻮد:
.1ﻫﻤﺰﻣﺎن ﺑﻴﺖ ﻫﺎي WDTOEو WDEرا ﻳﻚ ﻛﻨﻴﺪ) .ﺑﻴﺖ WDEﻋﻠﻴﺮﻏﻢ اﻳﻨﻜﻪ ﻗﺒﻼ ﻳﻚ ﺑﻮده ﺑﺎﺷﺪ ﺑﺎﻳﺪ
ﻣﺠﺪدا ﻳﻚ ﺷﻮد(.
.2ﺗﺎ ﭼﻬﺎر ﺳﻴﻜﻞ ﺑﻌﺪ ﻧﺮم اﻓﺰار ﻓﺮﺻﺖ دارد ﺗﺎ WDEرا ﭘﺎك ﻛﻨﺪ.
ﻫﺮ ﻳﻚ از ﭼﻬﺎر ﭘﻮرت C ،B ،Aو Dﻗﻄﻌﻪ ي ATmega16داراي ﺳﻪ رﺟﻴﺴﺘﺮ PORTx ،DDRxو PINx
ﺑﻮده ﻛﻪ xﺣﺮف ﻣﺮﺑﻮط ﺑﻪ ﭘﻮرت ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل رﺟﻴﺴﺘﺮﻫﺎي اوﻟﻴﻦ ﭘﻮرت PORTA ،DDRA ،و
اﻳﻦ رﺟﻴﺴﺘﺮ ﻫﻤﺎﻧﻄﻮر ﻛﻪ از ﻧﺎم اش ﻣﺸﺨﺺ اﺳﺖ رﺟﻴﺴﺘﺮ ﺟﻬﺖ داده ي ﭘﻮرت ﺑﻮده و ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﭘﻮرت
ورودي اﺳﺖ ﻳﺎ ﺧﺮوﺟﻲ .ﺑﺪﻳﻦ ﺻﻮرت ﻛﻪ اﮔﺮ روي ﻫﺮﻛﺪام از ﺑﻴﺖ ﻫﺎي اﻳﻦ رﺟﻴﺴﺘﺮ ﻳﻚ ﻧﻮﺷﺘﻪ ﺷﻮد ﭘﻴﻦ ﻣﺘﻨﺎﻇﺮ
آن ﭘﻮرت ﺧﺮوﺟﻲ ﺑﻮده و در ﻏﻴﺮ اﻳﻨﺼﻮرت ورودي ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﺑﺎ اﺟﺮاي ﻋﺒﺎرت = DDRA
0b10111101وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي اﻳﻦ رﺟﻴﺴﺘﺮ و ﭘﻴﻦ ﻫﺎي ﻣﺮﺑﻮﻃﻪ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ.
ﺟﻬﺖ داده ﺧﺮوﺟﻲ ورودي ﺧﺮوﺟﻲ ﺧﺮوﺟﻲ ﺧﺮوﺟﻲ ﺧﺮوﺟﻲ ورودي ﺧﺮوﺟﻲ
رﺟﻴﺴﺘﺮ :PORTx
ﻋﻤﻠﻜﺮد اﻳﻦ رﺟﻴﺴﺘﺮ ﺑﺴﺘﮕﻲ ﺑﻪ ﺟﻬﺖ داده ي ﭘﻮرت دارد .در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه ﺑﺎﺷﺪ.
آﻧﭽﻪ روي ﭘﻮرت ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد ﺳﻄﺢ ﻣﻨﻄﻘﻲ آن را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ و در ﺻﻮرﺗﻲ ﻛﻪ ورودي ﺑﺎﺷﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﻫﺮ
ﻋﺒﺎرت PORTA = 0b11010100اﺟﺮا ﺷﻮد ،وﺿﻌﻴﺖ ﭘﻮرت ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد.
ﺷﻤﺎره ﺑﻴﺖ 7 6 5 4 3 2 1 0
ﺑﺎ ﺳﻄﺢ ﺑﺎ ﺑﺎ ﺳﻄﺢ ﺑﺎ ﺳﻄﺢ ﺑﺎ ﺳﻄﺢ ﺑﺎ ﺳﻄﺢ ﺑﺪون ﺑﺎ ﺳﻄﺢ
ﺟﻬﺖ داده
ﻣﻨﻄﻘﻲ ﻣﻘﺎوﻣﺖ ﻣﻨﻄﻘﻲ ﻣﻨﻄﻘﻲ ﻣﻨﻄﻘﻲ ﻣﻨﻄﻘﻲ ﻣﻘﺎوﻣﺖ ﻣﻨﻄﻘﻲ
رﺟﻴﺴﺘﺮ :PINx
ﺑﺮاي ﺧﻮاﻧﺪن ﻣﻘﺪار ﻫﺮ ﭘﻴﻦ ﺑﺎﻳﺪ ﻣﺤﺘﻮﻳﺎت اﻳﻦ رﺟﻴﺴﺘﺮ ﺧﻮاﻧﺪه ﺷﻮد .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﭼﻨﺎﻧﭽﻪ PORCرا ﻗﺒﻼ ﺑﻪ
ﺻﻮرت ورودي ﭘﻴﻜﺮﺑﻨﺪي ﻛﺮده ﺑﺎﺷﻴﻢ و ﻣﻘﺪار رﺟﻴﺴﺘﺮ PINCﺑﺮاﺑﺮ 0b11010000ﺑﺎﺷﺪ ،ﺳﻄﺢ ﻣﻨﻄﻘﻲ اﻋﻤﺎل
ﺟﻬﺖ داده ﻳﻚ ﻳﻚ ﺻﻔﺮ ﻳﻚ ﺻﻔﺮ ﺻﻔﺮ ﺻﻔﺮ ﺻﻔﺮ
Flash EEPROM SRAM Max F.max 16-bit 8-bit PWM 10-bit Ext
Devices Vcc (V) SPI UART TWI Interrupts
(Kbytes) (Kbytes) (Bytes) I/O (MHz) Timers Timer (channels) A/D Interrupts
- ٢٢٠ -
P a g e | 221
www.eca.ir
ATmega6450 64 2 4096 69 16 1.8-5.5 1 2 4 1 1 USI 8 32 17
ATtiny11 1 -- -- 6 6 2.7-5.5 -- 1 -- -- -- -- -- 4 1
- ٢٢١ -
P a g e | 222
www.eca.ir
ATmega8 ATiny26
- ٢٢٢ -
P a g e | 223
www.eca.ir