Escolar Documentos
Profissional Documentos
Cultura Documentos
www.avr.ir
ﻋﻨﻮان ﻣﻄﺎﻟﺐ
ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﺻﻔﺮ
ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻳﻚ
SPI Bus
Modeﻫﺎي Sleepو ﺗﺎﻳﻤﺮ Watchdog
ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ ي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ AVRﻫﺴﺘﻨﺪ ﻛﻪ اﻣﻜﺎﻧﺎﺗﻲ را در اﺧﺘﻴﺎر ﻛﺎرﺑﺮ ﻗﺮار ﻣﻲ دﻫﻨﺪ و ﺑﺎ
Eraseﺷﺪن ﻣﻴﻜﺮو ﻣﻘﺪار آن ﻫﺎ ﺗﻐﻴﻴﺮ ﻧﻤﻲ ﻛﻨﺪ .ﻳﻚ ﺑﻪ ﻣﻌﻨﻲ ﻏﻴﺮ ﻓﻌﺎل ﺑﻮدن و ﺻﻔﺮ ﻓﻌﺎل ﺑﻮدن ﻫﺮ ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ.
Page |5
www.avr.ir
ﺷﻤﺎره ﺑﻴﺖ Low Byte ﻋﻤﻠﻜﺮد ﭘﻴﺶ ﻓﺮض
:BOOTRSTاﻧﺘﺨﺎب ﺑﺮدار ري ﺳﺖ BOOTﻛﻪ در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﺑﺮﻧﺎﻣﻪ رﻳﺰي ﻧﺸﺪه اﺳﺖ و آدرس
ﺑﺮدار ري ﺳﺖ 0000اﺳﺖ و در ﺻﻮرت ﺑﺮﻧﺎﻣﻪ رﻳﺰي آدرس ﺑﺮدار Resetﻃﺒﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد) .ﺑﺮ
اﺳﺎس ](BOOTSZ[1:0
Page |6
www.avr.ir
:BODENاﻳﻦ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز Brown-out Detectorﺑﻮده و در ﺻﻮرت ﭘﺮوﮔﺮام ﺷﺪن ﻣﻄﺎﺑﻖ وﺿﻌﻴﺖ ﺟﺪول
ﻫﻤﺎﻧﻄﻮر ﻛﻪ در دﻳﺎﮔﺮام زﻳﺮ دﻳﺪه ﻣﻲ ﺷﻮد ،اﻳﻦ ﻣﻨﺎﺑﻊ ﺷﺎﻣﻞ :اﺳﻴﻼﺗﻮر RCﻛﺎﻟﻴﺒﺮه ﺷﺪه ،اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ﻓﺮﻛﺎﻧﺲ
ﭘﺎﻳﻴﻦ ،اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ،ﻛﻼك ﺧﺎرﺟﻲ ،اﺳﻴﻼﺗﻮر RCﺧﺎرﺟﻲ و اﺳﻴﻼﺗﻮر ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻣﻲ ﺑﺎﺷﻨﺪ.
Page |7
www.avr.ir
اﻧﺘﺨﺎب ﻣﻨﺒﻊ ﻛﻼك ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﺑﻮده و ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ .ﻣﻘﺪار ﭘﻴﺶ ﻓﺮض ﺑﻴﺖ
ﻫﺎي ،CKSELﻳﻚ ﺑﻮده و در ﻧﺘﻴﺠﻪ ﻣﻨﺒﻊ ﭘﻴﺶ ﻓﺮض ،اﺳﻴﻼﺗﻮر RCداﺧﻠﻲ ﻣﻲ ﺑﺎﺷﺪ.
Page |8
www.avr.ir
ﻛﻼك ﺧﺎرﺟﻲ :ﺑﺮاي راه اﻧﺪازي وﺳﻴﻠﻪ ﺑﻮﺳﻴﻠﻪ ي ﻣﻨﺒﻊ ﻛﻼك ﺧﺎرﺟﻲ ﺑﺎﻳﺪ ﻣﻄﺎﺑﻖ ﺷـﻜﻞ زﻳـﺮ ﻳـﻚ ﭘـﺎﻟﺲ ﺑـﻪ ﭘـﻴﻦ
XTAL1اﻋﻤﺎل ﺷﻮد .ﺑﺮاي ﻗﺮار ﮔﺮﻓﺘﻦ در اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻳﺪ ﺗﻤﺎم ﺑﻴﺖ ﻫﺎي CKSELﭘﺮوﮔﺮام ﺷﺪه )ﺻﻔﺮ ﺷﻮﻧﺪ(
و ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﭘﺮوﮔﺮام ﻛﺮدن ﻓﻴﻮزﺑﻴﺖ CKOPTﻳﻚ ﺧﺎزن داﺧﻠﻲ ﺑﻪ ﻇﺮﻓﻴﺖ 36ﭘﻴﻜﻮﻓﺎراد را ﺑﻴﻦ ورودي و
XTAL1
ﻛﻼك ﺧﺎرﺟﻲ
CKOPT
XTAL2
36 pF
اﺳﻴﻼﺗﻮر RCﻛﺎﻟﻴﺒﺮه ﺷﺪه ي داﺧﻠﻲ :اﻳﻦ ﻣﻨﺒﻊ در ﻓﺮﻛﺎﻧﺲ ﻫﺎي 4 ،2 ،1و 8ﻣﮕﺎﻫﺮﺗﺰ ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷـﺪ و ﻣﻘـﺪار
آن در دﻣﺎي 25درﺟﻪ و وﻟﺘﺎژ 5وﻟﺖ ﻛﺎﻟﻴﺒﺮه ﺷﺪه اﺳﺖ ﻛﻪ در اﻳﻦ وﺿﻌﻴﺖ ﻣﻤﻜﻦ اﺳﺖ ﺗﺎ 3درﺻﺪ در ﻛﻼك اﻳﺠﺎد
ﺷﺪه وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ .ﻓﺮﻛﺎﻧﺲ ﻧﻮﺳﺎن ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﺗﻌﻴﻴﻦ ﺷﺪه و ﻣﻄـﺎﺑﻖ ﺟـﺪول زﻳـﺮ ﻣـﻲ
Page |9
www.avr.ir
اﺳﻴﻼﺗﻮر RCﺧﺎرﺟﻲ :در ﻛﺎرﺑﺮدﻫﺎﻳﻲ ﻛﻪ دﻗﺖ ﻛﻼك اﻫﻤﻴﺖ زﻳﺎدي ﻧﺪارد ﻣﻲ ﺗـﻮان از اﻳـﻦ ﻣﻨﺒـﻊ اﺳـﺘﻔﺎده ﻛـﺮد.
1
= fﺑﺪﺳﺖ ﻣﻲ آﻳﺪ .ﺣﺪاﻗﻞ ﻣﻘﺪار Cﺑﺮاﺑﺮ 22 ﭘﻴﻜﺮﺑﻨﺪي ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﺑﻮده و ﻓﺮﻛﺎﻧﺲ ﻧﻮﺳﺎن از راﺑﻄﻪ ي
3 RC
ﭘﻴﻜﻮﻓﺎراد ﺑﻮده و در ﺻﻮرﺗﻲ ﻛﻪ CKOPTﭘﺮوﮔﺮام ﺷﻮد ﻣﻲ ﺗﻮان ﻣﻘﺪار 36ﭘﻴﻜﻮﻓﺎراد را ﻧﻴﺰ ﻟﺤﺎظ ﻧﻤﻮد.
R
XTAL1
C
CKOPT
اﻳﻦ ﻣﻨﺒﻊ ﻧﻮﺳﺎن ﻣﻲ ﺗﻮاﻧﺪ در ﭼﻬﺎر Modeﻛﺎري ﻋﻤﻞ ﻛﻨﺪ ﻛﻪ ﻫﺮ ﻛﺪام ﺑﺮاي ﻳﻚ ﺑﺎزه ي ﻓﺮﻛﺎﻧﺴﻲ ﺑﻬﻴﻨﻪ ﺷﺪه اﺳﺖ
اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ﻓﺮﻛﺎﻧﺲ ﭘﺎﻳﻴﻦ :اﻳﻦ ﻣﻨﺒﻊ ﻛﻼك ﻣﻲ ﺗﻮاﻧﺪ ﻛﺮﻳﺴﺘﺎل ﻫﺎي ﻓﺮﻛﺎﻧﺲ ﭘﺎﻳﻴﻦ ﻣﺜﻞ ﻛﺮﻳﺴﺘﺎل ﺳﺎﻋﺖ ﺑﺎ
ﻓﺮﻛﺎﻧﺲ 32768ﻫﺮﺗﺰ ﺑﺎﺷﺪ .ﺑﺎ دادن ﻣﻘﺪار 1001ﺑﻪ ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﻣﻨﺒﻊ ﻛﻼك ﻛﺮﻳﺴﺘﺎل ﺧﺎرﺟﻲ ﻓﺮﻛﺎﻧﺲ
P a g e | 10
www.avr.ir
ﭘﺎﻳﻴﻦ اﻧﺘﺨﺎب ﺷﺪه و در اﻳﻦ وﺿﻌﻴﺖ ﭘﻴﻜﺮﺑﻨﺪي ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ .در ﺻﻮرت ﭘﺮوﮔﺮام ﻧﻤﻮدن CKOPT
36 pF
CKOPT
C1
XTAL1
XTAL Rf
XTAL2
C2
CKOPT
36 pF
ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ ﻳﺎ رزوﻧﺎﺗﻮر ﺳﺮاﻣﻴﻜﻲ :ﭘﺒﻦ ﻫـﺎي XTAL1و XTAL2ﺑـﻪ ﺗﺮﺗﻴـﺐ ورودي و ﺧﺮوﺟـﻲ ﻳـﻚ
ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي واروﻧﮕﺮ ﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﻋﻨﻮان ﻳﻚ اﺳﻴﻼﺗﻮر On-chipﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﭘﻴﻜﺮﺑﻨﺪي ﺷﻮﻧﺪ.
P a g e | 11
www.avr.ir
C1
XTAL1
XTAL Rf
XTAL2
C2
• ﺑﻪ ﺟﺎي ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ ﻣﻲ ﺗﻮان از رزوﻧﺎﺗﻮر ﺳﺮاﻣﻴﻜﻲ اﺳﺘﻔﺎده ﻧﻤـﻮد ﻛـﻪ از دوام ﺑﻴﺸـﺘﺮي در ﻣﻘﺎﺑـﻞ ﺿـﺮﺑﻪ ﺑـﺮ
ﺧﻮردار اﺳﺖ و زﻣﺎن Startupﻛﻤﺘﺮي ﻧﻴﺰ دارد و اﻟﺒﺘﻪ ﻧﺴﺒﺖ ﺑﻪ ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ دﻗـﺖ ﻛﻤﺘـﺮي داﺷـﺘﻪ و ﭘﺎﻳـﺪاري
• در اﻳﻦ وﺿﻌﻴﺖ ﺧﺎزن ﻫﺎي 36ﭘﻴﻜﻮ ﻓﺎراد ﺣﺬف ﺷﺪه و ﻋﻤﻠﻜﺮد ﻓﻴﻮزﺑﻴﺖ CKOPTﻧﻴﺰ ﺗﻐﻴﻴﺮ ﻣـﻲ ﻛﻨـﺪ .ﺑـﺪﻳﻦ
ﺗﺮﺗﻴﺐ ﻛﻪ ﺑﺎ ﭘﺮوﮔﺮام ﺷﺪن اﻳﻦ ﺑﻴﺖ داﻣﻨﻪ ي ﺧﺮوﺟﻲ ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي واروﻧﮕﺮ اﻓـﺰاﻳﺶ ﻳﺎﻓﺘـﻪ و ﻣـﻲ ﺗـﻮان از ﭘـﻴﻦ
XTAL2ﺑﻪ ﻋﻨﻮان ﻛﻼك ﺑﺮاي ﻳﻚ وﺳﻴﻠﻪ ي دﻳﮕﺮ اﺳﺘﻔﺎده ﻧﻤﻮد .ﻫﻤﭽﻨﻴﻦ ﺑﺎ ﻓﻌﺎل ﻛﺮدن CKOPTدر ﻣﺤﻴﻂ ﻫﺎي
• ﭼﻨﺎﻧﭽﻪ از رزوﻧﺎﺗﻮر اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﺑﺮاي ﻓﺮﻛﺎﻧﺲ ﻫﺎي ﺑﺎﻻﺗﺮ از 8ﻣﮕﺎﻫﺮﺗﺰ ﺑﺎﻳﺪ CKOPTﭘﺮوﮔﺮام ﺷﻮد.
اﺳﻴﻼﺗﻮر ﻣﻲ ﺗﻮاﻧﺪ در ﺳﻪ وﺿﻌﻴﺖ ﻣﺘﻔﺎوت ﻧﻮﺳﺎن ﻛﻨﺪ ﻛﻪ ﻫﺮﻛﺪام ﺑﺮاي ﻳﻚ ﻣﺤﺪوده ي ﻓﺮﻛﺎﻧﺴﻲ ﺑﻬﻴﻨﻪ ﺷﺪه اﺳﺖ و
آن را ﻣﻲ ﺗﻮان ﺑﺎ ﻓﻴﻮز ﺑﻴﺖ ﻫﺎي CKSELﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﻧﺘﺨﺎب ﻧﻤﻮد.
P a g e | 12
www.avr.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.avr.ir
ﻣﻨﻄﻖ Resetﻣﻄﺎﺑﻖ دﻳﺎﮔﺮام زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
P a g e | 14
www.avr.ir
:Power-on Resetزﻣﺎﻧﻲ ﻓﻌﺎل ﺧﻮاﻫﺪ ﻛﻪ وﻟﺘﺎژ Vccﻛﻤﺘﺮ از ﺣﺪ ﺗﻌﻴﻴﻦ ﺷﺪه ﺑﺎﺷﺪ .اﻳﻦ ﻣﻨﺒﻊ ﺗﻀـﻤﻴﻦ .1
ﻣﻲ ﻛﻨﺪ ﻛﻪ وﺳﻴﻠﻪ در زﻣﺎن راه اﻧﺪازي Resetﻣﻲ ﺷﻮد .ﺑﺎ رﺳﻴﺪن وﻟﺘﺎژ ﺑﻪ ﺣﺪ آﺳﺘﺎﻧﻪ ،ﺷﻤﺎرﻧﺪه ي ﺗﺎﺧﻴﺮ راه اﻧـﺪازي
ﺷﺪه ﻛﻪ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﭼﻪ ﻣﺪت وﺳﻴﻠﻪ در وﺿﻌﻴﺖ Resetﺑﻤﺎﻧﺪ .دﻳﺎﮔﺮام زﻣﺎﻧﻲ زﻳﺮ ﺷﺮاﻳﻄﻲ را ﻧﺸﺎن ﻣﻲ دﻫـﺪ ﻛـﻪ
ﭘﻴﻦ RESETﺑﻪ Vccوﺻﻞ ﺷﺪه اﺳﺖ) .و ﻳﺎ آزاد ﺑﺎﺷﺪ ﭼﻮن اﻳﻦ ﭘﻴﻦ از داﺧﻞ Pull-upﺷﺪه اﺳﺖ(.
و ﻧﻤﻮدار زﻳﺮ ﺷﺮاﻳﻄﻲ اﺳﺖ ﻛﻪ ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﭘﻴﻦ Resetﺗﺎﺑﻊ Vccﻧﻤﻲ ﺑﺎﺷﺪ:
P a g e | 15
www.avr.ir
:External Reset .2اﻳﻦ Resetﺑﻮﺳﻴﻠﻪ ي ﻳﻚ ﭘﺎﻟﺲ ﺑﺎ ﺳﻄﺢ ﺻﻔﺮ ﻣﻨﻄﻘﻲ روي ﭘﻴﻦ RESETاﻳﺠﺎد ﺷﺪه و
ﺣﺪاﻗﻞ ﻋﺮض آن 1.5ﻣﻴﻜﺮو ﺛﺎﻧﻴﻪ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺎ رﺳﻴﺪن وﻟﺘﺎژ اﻳﻦ ﭘﻴﻦ ﺑﻪ ﻣﻘﺪار آﺳﺘﺎﻧﻪ در ﻟﺒﻪ ﺑﺎﻻ روﻧﺪه ،ﺷـﻤﺎرﻧﺪه ي
ﺗﺎﺧﻴﺮ ﺷﺮوع ﺑﻪ ﻛﺎر ﻛﺮده و ﭘﺲ از اﺗﻤﺎم زﻣﺎن Time-outﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻛﺎر ﺧﻮد را ﺷﺮوع ﺧﻮاﻫﺪ ﻛﺮد.
داﺧﻠﻲ ﺑﻮده ﻛﻪ ﭘﻴﻮﺳﺘﻪ ﻣﻘﺪار وﻟﺘﺎژ Vccرا ﺑﺎ ﻳﻚ ﻣﻘﺪار ﺛﺎﺑﺖ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻣﻘﺪار ﺛﺎﺑﺖ ﺑﺮاﺑﺮ 2.7وﻟﺖ ﺑـﻮده
و در ﺻﻮرﺗﻲ ﻛﻪ ﻓﻴﻮزﺑﻴﺖ BODLEVELﭘﺮوﮔﺮام ﺷﻮد ﺑﻪ 4.0وﻟﺖ اﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ .ﺑﺎ ﻛﻤﺘﺮ ﺷﺪن وﻟﺘـﺎژ ﺗﻐﺬﻳـﻪ
از اﻳﻦ ﻣﻘﺪار ﺛﺎﺑﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ وارد ﺣﺎﻟﺖ Resetﺷﺪه و ﺑﺎ ﻋﺎدي ﺷﺪن وﻟﺘﺎژ ،ﭘـﺲ از اﺗﻤـﺎم ﺗـﺎﺧﻴﺮ ﺑـﻪ وﺿـﻌﻴﺖ
ﻋﺎدي ﺑﺎز ﻣﻲ ﮔﺮدد .ﺑﺮاي ﺣﻔﺎﻇﺖ در ﺑﺮاﺑﺮ Spikeﻣﻘﺪار آﺳﺘﺎﻧﻪ داراي ﭘﺴـﻤﺎﻧﺪ ﺑـﻮده و در ﻧﺘﻴﺠـﻪ داراي دو ﻣﻘـﺪار
P a g e | 16
www.avr.ir
ﻣﺜﺒﺖ و ﻣﻨﻔﻲ ﻣﻲ ﺑﺎﺷـﺪ ﻛـﻪ ﺑـﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﻣﻘـﺎدﻳﺮ ﻣﻮﺟـﻮد در ﺟـﺪول از راﺑﻄـﻪ ي VBOT+ = VBOT + VHYST / 2و
ﻣﺪار Brown-out Detectionدر ﺣﺎﻟـﺖ ﻋـﺎدي ﻏﻴـﺮ ﻓﻌـﺎل ﺑـﻮده و ﺑـﺮاي راه اﻧـﺪازي آن ﺑﺎﻳـﺪ ﻓﻴﻮزﺑﻴـﺖ
:Watchdog Reset .4ﺑﺎ اﺗﻤﺎم زﻣﺎن ﺗﺎﻳﻤﺮ ،Watchdogاﻳﻦ ﺗﺎﻳﻤﺮ ﻳﻚ ﭘﺎﻟﺲ ﺑـﻪ ﻋـﺮض ﻳـﻚ ﺳـﻴﻜﻞ اﻳﺠـﺎد
ﺧﻮاﻫﺪ ﻛﺮد .در ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي اﻳﻦ ﭘﺎﻟﺲ ،ﺗﺎﻳﻤﺮ ﺗﺎﺧﻴﺮ ﺷﺮوع ﺑﻪ ﺷﻤﺎرش زﻣﺎن ﺗﺎﺧﻴﺮ ﻛﺮده و ﭘﺲ ازاﺗﻤـﺎم آن
P a g e | 17
www.avr.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.avr.ir
• ﻫﺮ ﺑﺮﻧﺎﻣﻪ ي Cﺣﺪاﻗﻞ ﻳﻚ ﺗﺎﺑﻊ )( mainدارد) .اﻳﻦ اوﻟﻴﻦ ﺗﺎﺑﻊ اﺟﺮاﻳﻲ اﺳﺖ(.
ﺗﻌﺎرﻳﻒ ﻛﻠﻲ
اﻟﮕﻮي ﺗﻮاﺑﻊ
)(void main
{
{)while(1
.
.
.
}
}
• ﺑﺮﻧﺎﻣﻪ ي ﺳﺎده ي زﻳﺮ رﺷﺘﻪ ي Hello Worldرا ﺑﻪ ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد ارﺳﺎل ﻣﻲ ﻛﻨﺪ.
P a g e | 19
www.avr.ir
>#include<stdio.h
)(void main
{
;)"!printf("Hello World
;)while(1
}
• از " " ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن اﺑﺘﺪا و اﻧﺘﻬﺎي ﻳﻚ رﺷﺘﻪ ي ﻣﺘﻨﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.
• ﺷﻨﺎﺳﻪ ﻫﺎ ﻧﻤﻲ ﺗﻮاﻧﺪ از ﻛﻠﻤﺎت رزرو ﺷﺪه ﺑﺎﺷﻨﺪ و ﻫﻤﭽﻨﻴﻦ ﻧﻤﻲ ﺗﻮاﻧﻨﺪ ﺑﺎ ﻳﻚ ﻛﺎراﻛﺘﺮ ﻋﺪدي ﺷﺮوع ﺷﻮد و ﻃﻮل
• Cﻳﻚ زﺑﺎن Case Sensitiveاﺳﺖ و ﺑﻴﻦ ﺣﺮوف ﻛﻮﭼﻚ و ﺑﺰرگ ﺗﻔﺎوت ﻗﺎﺋﻞ ﻣﻲ ﺷﻮد.
• ﻛﻠﻤﺎت رزرو ﺷﺪه ﺣﺘﻤﺎ ﺑﺎﻳﺪ ﺑﺎ ﺣﺮف ﻛﻮﭼﻚ اﺳﺘﻔﺎده ﺷﻮﻧﺪ) .ﻣﺜﻞ …(if, char, while,
P a g e | 20
www.avr.ir
ﻣﺘﻐﻴﺮ ﻫﺎ و ﺛﻮاﺑﺖ
; char a ﻣﺜﺎل: ; ﻧﺎم ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮ • ﻓﺮم ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ:
;int b@0xA3 ﻣﺜﺎل: • ﺑﺮاي ﺗﻌﻴﻴﻦ ﻣﺤﻞ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ از ﻋﻤﻠﮕﺮ @ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.
• ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ در ﺣﺎﻓﻈﻪ ي EEPROMاز ﻛﻠﻤﻪ ي ﻛﻠﻴﺪي eepromﻗﺒﻞ از ﻧﺎم ﻣﺘﻐﻴﺮ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.
P a g e | 21
www.avr.ir
;'char s = 'a ﻣﺜﺎل: • ﻣﻲ ﺗﻮان در زﻣﺎن ﺗﻌﺮﻳﻒ ﺑﻪ ﻣﺘﻐﻴﺮ ﻣﻘﺪار اوﻟﻴﻪ داد.
; const float pi = 3.14 • ﺗﻌﺮﻳﻒ ﺛﺎﺑﺖ ﺑﺎ ﻛﻠﻤﻪ ي ﻛﻠﻴﺪي constﻳﺎ flashاﻧﺠﺎم ﻣﻲ ﺷﻮد .ﻣﺜﺎل:
• ﺑﺎ رﻫﻨﻤﻮد #defineﻣﻲ ﺗﻮان ﻣﺎﻛﺮو ﺗﻌﺮﻳﻒ ﻧﻤﻮد ،در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘﺪاري ﻛﻪ ﺑﺮاي ﺛﺎﺑﺖ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد ﻧﻮع
داده را ﺗﻌﻴﻴﻦ ﻛﺮده و ﻣﻘﺎدﻳﺮ ﺗﻌﺮﻳﻒ ﺷﺪه ،ﺗﻮﺳﻂ ﭘﻴﺶ ﭘﺮدازﻧﺪه ﺑﺎ ﻣﻘﺪار ﺛﺎﺑﺖ ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲ ﺷﻮد.
P a g e | 22
www.avr.ir
ﻋﻤﻠﮕﺮﻫﺎي ﻳﻜﺎﻧﻲ
P a g e | 23
www.avr.ir
ﻋﻤﻠﮕﺮﻫﺎي ﻣﻨﻄﻘﻲ
ﻋﻤﻠﮕﺮﻫﺎي اﻧﺘﺴﺎب
اﮔﺮ valueﻣﻘﺪار
yﻣﻲ ﺷﻮد.
P a g e | 24
www.avr.ir
آراﻳﻪ ﻫﺎ
ﻓﺮم ﺗﻌﺮﻳﻒ آراﻳﻪ ﻫﺎي دو ﺑﻌﺪي]; :ﻋﺪاد ﻋﻨﺎﺻﺮ ﺳﺘﻮن[]ﺗﻌﺪاد ﻋﻨﺎﺻﺮ ﺳﻄﺮ[اﺳﻢ ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮﻫﺎ •
رﺷﺘﻪ ﻫﺎ
P a g e | 25
www.avr.ir
دﺳﺘﻮر :goto
)ط(if
{
;دﺳﺘﻮرات1
}
else
{
;دﺳﺘﻮرات 2
}
در ﺻﻮرﺗﻲ ﻛﻪ دﺳﺘﻮرات ﻳﻚ ﺧﻄﻲ ﺑﺎﺷﻨﺪ ﻣﻲ ﺗﻮان braceرا ﺣﺬف ﻧﻤﻮد.
ﻣﺜﺎل:
>#include<stdio.h
{)(void main
P a g e | 26
www.avr.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.avr.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.avr.ir
break;
case 10:
case 11:
case 12: printf("You've born is winter\n");
break;
:While ﺳﺎﺧﺘﺎر
while()ﺷﺮط
{
;دﺳﺘﻮرات
:ﻣﺜﺎل
#include<stdio.h>
void main(){
P a g e | 29
www.avr.ir
;char a
;)"printf("Enter E to exit\n
;)(while(a != 'E') a=getchar
}
ﺳﺎﺧﺘﺎر :Do/While
{do
;دﺳﺘﻮرات
)ﺷﺮط(} while
در ﺳﺎﺧﺘﺎر Do/Whileﺑﺮ ﺧﻼف Whileﺷﺮط در اﻧﺘﻬﺎي ﺣﻠﻘﻪ آزﻣﺎﻳﺶ ﻣﻲ ﺷﻮد ،ﺑﻨﺎﺑﺮاﻳﻦ دﺳﺘﻮرات داﺧﻞ
{
;دﺳﺘﻮرات
}
P a g e | 30
www.avr.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.avr.ir
دﺳﺘﻮر breakﺑﺎﻋﺚ ﺧﺮوج ﺑﺪون ﺷﺮط از ﻫﺮ ﺣﻠﻘﻪ اي ﻣﻲ ﺷﻮد.
دﺳﺘﻮر continueﺑﺎﻋﺚ ﻣﻲ ﺷﻮد اﺟﺮاي اداﻣﻪ دﺳﺘﻮرات ﻣﺘﻮﻗﻒ ﺷﺪه و ﺣﻠﻘﻪ از اﺑﺘﺪا آﻏﺎز ﺷﻮد.
ﺗﻮاﺑﻊ
{
ﻣﺘﻐﻴﺮﻫﺎي ﻣﺤﻠﻲ
دﺳﺘﻮرات ﺗﺎﺑﻊ
}
ﺗﻮاﺑﻊ داﺧﻞ ﻳﻜﺪﻳﮕﺮ ﻗﺎﺑﻞ ﺗﻌﺮﻳﻒ ﻧﻤﻲ ﺑﺎﺷﻨﺪ و ﺟﺪا از ﻫﻢ ﺑﺎﻳﺪ ﺗﻌﺮﻳﻒ ﮔﺮدﻧﺪ.
ﻣﺜﺎل:
>#include <stdio.h
{)(void main
P a g e | 32
www.avr.ir
int a;
:ﻣﺜﺎل
#include<stdio.h>
void main(){
int a,b;
P a g e | 33
www.avr.ir
}
P a g e | 34
www.avr.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.avr.ir
P a g e | 36
www.avr.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.avr.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.avr.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.avr.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.avr.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.avr.ir
P a g e | 43
www.avr.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.avr.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.avr.ir
P a g e | 46
www.avr.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.avr.ir
PORTB=0xFF;
}
}
}
P a g e | 48
www.avr.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.avr.ir
19 EXT_INT2 $024 INT2 External Interrupt Request 2
• آدرس ﻫﺎي ﭘﺎﻳﻴﻦ ﺗﺮ داراي اوﻟﻮﻳﺖ ﺑﺎﻻﺗﺮي ﻣﻲ ﺑﺎﺷﻨﺪ و در ﺻﻮرت درﺧﻮاﺳﺖ ﻫﻤﺰﻣﺎن دو ﻳﺎ ﭼﻨﺪ وﻗﻔﻪ اﺑﺘﺪا ﺑﻪ
اوﻟﻮﻳﺖ ﺑﺎﻻﺗﺮ ﭘﺎﺳﺦ داده ﻣﻲ ﺷﻮد و ﭘﺲ از آن ﺑﻪ ﺑﻘﻴﻪ ي وﻗﻔﻪ ﻫﺎ ﺑﺮ ﺣﺴﺐ اوﻟﻮﻳﺖ رﺳﻴﺪﮔﻲ ﻣﻲ ﺷﻮد.
ﺑﺮاي ﻓﻌﺎل ﻛﺮدن ﻫﺮ ﻳﻚ از وﻗﻔﻪ ﻫﺎ ﺑﺎﻳﺪ اﺑﺘﺪا ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ را ﺑﺎ دﺳﺘﻮر اﺳﻤﺒﻠﺮ SEIﻳﺎ ﻣﻘﺪار دﻫﻲ
SREG I
• ﺑﺎ روﻳﺪاد ﻫﺮ وﻗﻔﻪ ي ﺧﺎرﺟﻲ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﺷﺪه و در ﻧﺘﻴﺠﻪ ﺗﻤﺎم وﻗﻔﻪ ﻫﺎي دﻳﮕﺮ ﻏﻴﺮ ﻓﻌﺎل ﻣـﻲ ﺷـﻮﻧﺪ در
اﻳﻦ ﺣﺎﻟﺖ ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ آن را ﻣﺠﺪدا ﻓﻌﺎل ﻛﻨﺪ و ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﻫـﺎي
ﺑﺮاي اﺳﺘﻔﺎده از ﻫﺮﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ ﺑﺎﻳﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ﻣﺮﺑﻮﻃﻪ در رﺟﻴﺴﺘﺮ GICRآن را ﻓﻌﺎل ﻧﻤﻮد:
P a g e | 50
www.avr.ir
• وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ 1،0و 2ﺑﻪ ﺗﺮﺗﻴﺐ از ﭘﻴﻦ ﻫﺎي PD3 ،PD2و PB2ﺗﺮﻳﮕﺮ ﻣﻲ ﺷﻮﻧﺪ.
ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن ﻫﺮﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ 0و 1ﺑﻮﺳﻴﻠﻪ ي ﭼﻬﺎرﺑﻴﺖ اول رﺟﻴﺴﺘﺮ MCUCRﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
P a g e | 51
www.avr.ir
ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن وﻗﻔﻪ ي 2ﺧﺎرﺟﻲ ﺑﻮﺳﻴﻠﻪ ﺑﻴﺖ 6از رﺟﻴﺴﺘﺮ MCUCSRﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
MCUCSR ISC2
• وﻗﻔﻪ ي 2ﺧﺎرﺟﻲ ﺑﺮ ﺧﻼف وﻗﻔـﻪ ي 0و 1ﺗﻨﻬـﺎ در دو ﺣﺎﻟـﺖ ﻟﺒـﻪ ي ﺑـﺎﻻ روﻧـﺪه و ﭘـﺎﻳﻴﻦ روﻧـﺪه ﻗﺎﺑـﻞ
ﭘﻴﻜﺮﺑﻨﺪي اﺳﺖ .ﻧﻮﺷﺘﻦ ﺻﻔﺮ در ISC2ﺑﺎﻋﺚ ﺗﺮﻳﮕﺮ ﺷﺪن اﻳﻦ وﻗﻔﻪ ﺑﺎ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧـﺪه و ﻧﻮﺷـﺘﻦ ﻳـﻚ
ﻫﺮ ﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ داراي ﻳﻚ ﺑﻴﺖ ﭘﺮﭼﻢ ﻫﺴﺘﻨﺪ ﻛﻪ در ﺻﻮرت ﺗﺮﻳﮕﺮ ﺷﺪن از ﭘﻴﻦ وﻗﻔـﻪ ي ﺧـﺎرﺟﻲ و
ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻣﺮﺑﻮﻃﻪ در رﺟﻴﺴﺘﺮ GICRو ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ) ،(Iﻋﻼوه ﺑﺮ ﻳﻚ ﺷﺪن ﭘـﺮﭼﻢ ،ﻣـﻲ
ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﭘﺲ از اﺟﺮاي ISRﭘﺮﭼﻢ آن وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﭘﺎك ﻣـﻲ
ﺷﻮد.
P a g e | 52
www.avr.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.avr.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.avr.ir
• اﮔﺮ وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﺑﻪ ﺻﻮرت ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ ﺗﻨﻈﻴﻢ ﺷﺪه ﺑﺎﺷﺪ و در ﺣﺎل اﺟﺮاي ﻳﻜﻲ از وﻗﻔﻪ ﻫﺎ ،وﻗﻔﻪ ي
دﻳﮕﺮي اﺗﻔﺎق ﺑﻴﻔﺘﺪ ،ﭘﺲ از ﺧﺮوج از ISRوﻗﻔﻪ ي ﺟﺎري ﺑﻪ آن وﻗﻔﻪ ﻫﺎ ﺑﺮﺣﺴﺐ اوﻟﻮﻳﺖ ﺷﺎن ﭘﺎﺳﺦ داده
ﺧﻮاﻫﺪ ﺷﺪ.
• در ﺻﻮرﺗﻲ ﻛﻪ ﭘﻴﻦ وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ ﺗﻌﺮﻳﻒ ﺷﻮد ،آﻧﭽﻪ روي ﭘﻮرت ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد ﻣﻲ ﺗﻮاﻧﺪ
ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮان وﻗﻔﻪ ي ﻧﺮم اﻓﺰاري اﻳﺠﺎد ﻛﺮد.
• وﻗﻔﻪ ﻫﺎي ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ در ﭘﻴﻦ INT0و INT1و ﻫﻤﭽﻨﻴﻦ وﻗﻔـﻪ ي ﺣﺴـﺎس ﺑـﻪ ﻟﺒـﻪ در INT2ﺑـﻪ
ﺻﻮرت آﺳﻨﻜﺮون ﺗﺸﺨﻴﺺ داده ﻣﻲ ﺷﻮﻧﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮان از آن ﻫﺎ ﺑﺮاي ﺧﺎرج ﻛﺮدن ﻣﻴﻜـﺮو از ﻫﻤـﻪ ي
Modeﻫﺎي ﻛﻢ ﻣﺼﺮف اﺳﺘﻔﺎده ﻧﻤﻮد .ﺣﺪاﻗﻞ ﻋﺮض ﭘﺎﻟﺲ در اﻳﻦ ﺣﺎﻟﺖ 50ﻧﺎﻧﻮ ﺛﺎﻧﻴﻪ ﻣـﻲ ﺑﺎﺷـﺪ و ﺑـﺮاي
• ﻛﺎﻣﭙﺎﻳﻠﺮ CodeVisionﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض SREGو رﺟﻴﺴـﺘﺮﻫﺎﻳﻲ CPUرا ﻛـﻪ ﻣﻤﻜـﻦ اﺳـﺖ در
ISRﺗﻐﻴﻴﺮ ﭘﻴﺪا ﻛﻨﻨﺪ ،ﻗﺒﻞ از اﺟﺮاي روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔـﻪ در Stackذﺧﻴـﺮه ) (PUSHﻛـﺮده و ﭘـﺲ از
ﺑﺎزﮔﺸﺖ از ISRآن ﻫﺎ را ﺑﺎزﻳﺎﺑﻲ ) (POPﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن اﻳﻦ ﻗﺎﺑﻠﻴـﺖ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻗﺒـﻞ از
P a g e | 55
www.avr.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;
P a g e | 56
www.avr.ir
PORTD=0xFF;
GICR=0b01000000; // INT0: On
MCUCR=0b00000011; // INT0 Mode: Rising Edge
while (1);
}
P a g e | 57
www.avr.ir
P a g e | 58
www.avr.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.avr.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
: 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.avr.ir
ﺳﻄﺢ ﻣﻨﻄﻘﻲ 0 0 0 0 0 0 0 X
P a g e | 61
www.avr.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.avr.ir
void delay()
{
TCNT0=0x38; //TCNT=55
TCCR0=0B00000010;
while(!TIFR&0x01);
TIFR=TIFR|0B00000001;
TCCR0=0x00;
}
در رﺟﻴﺴﺘﺮTOIE2 ﻳﺎTOIE0 ( ﻓﻌﺎل ﺑﻮده و ﺑﻴﺖ ﻫﺎيI) در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ
: از ﺳﺮرﻳﺰ ﺷﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻋﻨﻮان وﻗﻔﻪ اﺳﺘﻔﺎده ﻛﺮد، ﻳﻚ ﺑﺎﺷﻨﺪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از وﻗﻔﻪ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.avr.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.avr.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.avr.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.avr.ir
در اﻳﻦ ﺣﺎﻟﺖ ISRﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد:
}
CTC Mode
در اﻳﻦ Modeﺗﺎﻳﻤﺮ ﻫﻤﺎﻧﻨﺪ وﺿﻌﻴﺖ ﻧﺮﻣﺎل ﺑﺎ ﻋﻤﻠﻜﺮد ﻣﻘﺎﻳﺴﻪ ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ﺑـﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ در زﻣـﺎن ﺗﻄـﺎﺑﻖ
رﺟﻴﺴﺘﺮﻫﺎي OCR0و TCNT0ﻣﻘﺪار رﺟﻴﺴﺘﺮ TCNT0ﺻﻔﺮ ﺷﺪه و در واﻗﻊ ﺑـﺮ ﺧـﻼف ﺣﺎﻟـﺖ ﻗﺒـﻞ ﻣﻘـﺪار
ﻣﺎﻛﺰﻳﻤﻢ TCNT0ﻋﺪد ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ OCR0ﻣﻲ ﺑﺎﺷﺪ .ﻣﻘﺪار ﺑﻴﺖ ﻫﺎي WGM00و WGM01در اﻳﻦ
ﺳﻄﺢ ﻣﻨﻄﻘﻲ X 0 X X 1 X X X
در اﻳﻦ ﺣﺎﻟﺖ ﻓﺮﻛﺎﻧﺲ ﻣﻮج اﻳﺠﺎد ﺷﺪه روي ﭘﻴﻦ OC0از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ: •
P a g e | 67
www.avr.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.avr.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.avr.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.avr.ir
اﻳﻦ ﺣﺎﻟﺖ ﻣﺸﺎﺑﻪ Modeﻧﺮﻣﺎل ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ ﭘـﻴﻦ OC0ﻓﻘـﻂ در ﺣﺎﻟـﺖ ﺑﺮاﺑـﺮي رﺟﻴﺴـﺘﺮﻫﺎي
TCNT0و OCR0ﺗﻐﻴﻴﺮ ﺣﺎﻟﺖ ﻧﻤﻲ دﻫﺪ ،ﺑﻠﻜﻪ در زﻣﺎن ﺳﺮرﻳﺰ رﺟﻴﺴﺘﺮ TCNT0ﻧﻴﺰ ﻣﻘﺪار اﻳﻦ ﭘﻴﻦ ﺗﻐﻴﻴﺮ ﻣﻲ
ﻛﻨﺪ.
ﺧﺮوﺟﻲ PWM
در Modeﻫﺎي PWMﻋﻤﻠﻜﺮد ﺑﻴﺖ ﻫﺎي COM00و COM01ﻣﺘﻔﺎوت از دو وﺿﻌﻴﺖ ﻗﺒﻠـﻲ و ﺑـﻪ ﺻـﻮرت
زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
P a g e | 72
www.avr.ir
0 0 ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
1 0 Clearدروﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ Set ،در زﻣﺎن ﺳﺮرﻳﺰ ) PWMﻏﻴﺮ ﻣﻌﻜﻮس(
1 1 Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ Clear ،در زﻣﺎن ﺳﺮرﻳﺰ ) PWMﻣﻌﻜﻮس(
ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ي ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMﺗﻮﻟﻴﺪ ﺷﺪه ﻣﻲ ﺗﻮان از ﻓﺮﻣﻮل زﻳﺮ اﺳﺘﻔﺎد ﻧﻤﻮد:
از وﻗﻔﻪ ي ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻣﻲ ﺗﻮان ﺑﺮاي ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ TCNT0و ﻳـﺎ ﺗﻐﻴﻴـﺮ ﻣﻘـﺪار OCR0اﺳـﺘﻔﺎده
ﻧﻤﻮد ،اﮔﺮﭼﻪ ﺑﻬﺘﺮ اﺳﺖ ﻣﻘﺪار OCR0در روﺗﻴﻦ وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﺗﻐﻴﻴﺮ داده ﺷﻮد.
ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ TCNT0ﻣﻲ ﺗﻮان ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMرا ﺗﻐﻴﻴﺮ داد(.
>#include <mega16.h
#define xtal 8000000
)void main(void
{
P a g e | 73
www.avr.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.avr.ir
• ﺑﺎ ﻛﻤﺘﺮ ﺷﺪن OCR0زﻣﺎن وﻇﻴﻔﻪ ﻛﻤﺘﺮ ﺷﺪه و ﺗﺎ ﺣﺪي ﻛﻪ ﻣﻘﺪار ﺻﻔﺮ ﻳﻚ ﭘﺎﻟﺲ ﺳﻮزﻧﻲ ﺑﻪ ﻋﺮض ﻳﻚ ﺳﻴﻜﻞ
• ﺑﺎ ﻣﻘﺪاردﻫﻲ 256ﺑﻪ OCR0ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﺑﺮاﺑﺮ ﺷﺪه و ﭘﺎﻟﺲ ﺧﺮوﺟﻲ ﺑﺴﺘﻪ ﺑﻪ ﻣﻘﺪار COM00و
اﻳﻦ Modeﺷﺒﻴﻪ ﺣﺎﻟﺖ Fast PWMﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ ﺑﻪ ﺻﻮرت دو ﺷﻴﺒﻪ ) (Dual Slopeﻋﻤﻞ
ﺷﻤﺎرش را اﻧﺠﺎم ﻣﻲ دﻫﺪ .ﺑﻪ اﻳﻨﺼﻮرت ﻛﻪ ﺗﺎﻳﻤﺮ از ﻋﺪد ﺻﻔﺮ ﺷﺮوع ﺑﻪ ﺷﻤﺎرش ﻛﺮده و ﺑﻪ ﺻﻮرت اﻓﺰاﻳﺸﻲ ﺗﺎ ﻋﺪد
0xFFاﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ و ﺑﻌﺪ از رﺳﻴﺪن ﺑﻪ اﻳﻦ ﻣﻘﺪار ﻋﺪد ﻣﻮﺟﻮد در ﺑﺎﻓﺮ OCR0در رﺟﻴﺴﺘﺮ OCR0ﺑﺎرﮔﺬاري
ﻣﻲ ﺷﻮد .ﺑﻌﺪ از اﻳﻦ ﻟﺤﻈﻪ ﺟﻬﺖ ﺷﻤﺎرش ﺗﺎﻳﻤﺮ ﻋﻮض ﺷﺪه و ﺑﻪ ﺻﻮرت ﻛﺎﻫﺸﻲ ﺗﺎ ﻋﺪد ﺻﻔﺮ ﻣﻲ ﺷﻤﺎرد ﺑﺎ رﺳﻴﺪن
ﺑﻪ اﻳﻦ ﻋﺪد ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ،ﺑﺮﻧﺎﻣﻪ ﺑﻪ ISRﺳـﺮرﻳﺰ ﺗـﺎﻳﻤﺮ
ﻣﻨﺸﻌﺐ ﺷﺪه و ﺑﻴﺖ ﭘﺮﭼﻢ وﻗﻔﻪ ﺑﻮﺳﻴﻠﻪ ﺳﺨﺖ اﻓﺰار ﺻﻔﺮ ﻣﻲ ﺷﻮد .ﻣﺴﺌﻠﻪ ي ﻣﻬﻢ اﻳﻦ اﺳﺖ ﻛـﻪ در ﻫـﺮ دو ﺣﺎﻟـﺖ
ﺷﻤﺎرش اﻓﺰاﻳﺸﻲ و ﻛﺎﻫﺸﻲ ﻋﻤﻞ ﻣﻘﺎﻳﺴﻪ ﺑﻴﻦ رﺟﻴﺴـﺘﺮﻫﺎي TCNT0و OCR0اﻧﺠـﺎم ﻣـﻲ ﮔﻴـﺮد و در ﺻـﻮرت
ﻣﻘﺪار OCR0
ﻣﻘﺪار TCNT0
P a g e | 75
www.avr.ir
• در ﺻﻮرت ﺗﻐﻴﻴﺮ ﻣﻘﺪار رﺟﻴﺴﺘﺮ OCR0ﻣﻘﺪار ﺟﺪﻳﺪ در ﺑﺎﻓﺮ اﻳﻦ رﺟﻴﺴـﺘﺮ ﻧﻮﺷـﺘﻪ ﻣـﻲ ﺷـﻮد و در زﻣـﺎن
• ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﺻﻔﺮ زﻣﺎﻧﻲ ﻓﻌﺎل ﻣﻲ ﺷﻮد ﻛﻪ ﻛﻪ رﺟﻴﺴـﺘﺮ TCNT0ﺑﺮاﺑـﺮ ﺻـﻔﺮ ﺷـﻮد و ﻧـﻪ ،0xFF
ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎﻳﺪ دﻗﺖ داﺷﺖ ﻛﻪ اﮔﺮ در زﻣﺎن ﺷﺮوع ﺑﻪ ﻛﺎر ﻣﻘﺪار اﻳﻦ رﺟﻴﺴﺘﺮ ﺻﻔﺮ ﺑﺎﺷﺪ ﭘـﺮﭼﻢ ﺳـﺮرﻳﺰ ﻓﻌـﺎل
ﺧﻮاﻫﺪ ﺷﺪ.
• ﻓﺮﻛﺎﻧﺲ PWMدر ﺣﺎﻟﺖ Phase Correctاز راﺑﻄﻪ ي زﻳﺮ ﻗﺎﺑﻞ ﻣﺤﺎﺳﺒﻪ اﺳﺖ:
• راﺑﻄﻪ ي ﺑﺎﻻ ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMﺛﺎﺑﺖ اﺳﺖ و ارﺗﺒﺎﻃﻲ ﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي OCR0و
TCNT0ﻧﺪارد.
P a g e | 76
www.avr.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.avr.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.avr.ir
else
;p_state=0xFF
;}
}
P a g e | 79
www.avr.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.avr.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.avr.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.avr.ir
void main(void)
{
// Clock source: TOSC1 pin
// Clock value: PCK2/128
P a g e | 83
www.avr.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.avr.ir
ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻳﻚ
ﺗﺎﻳﻤﺮ ﻳﻚ ﺗﺎﻳﻤﺮي 16ﺑﻴﺘﻲ اﺳﺖ و در آن ﻋﻼوه ﺑﺮ اﻣﻜﺎﻧﺎت ﺗﺎﻳﻤﺮ ﺻﻔﺮ ،ﻳﻚ ﺑﺨﺶ دﻳﮕﺮ ﺑﻪ ﻧﺎم ﺑﺨﺶ Captureﺑﻪ
آن اﻓﺰوده ﺷﺪه اﺳﺖ .اﻳﻦ ﺑﺨﺶ در زﻣﺎن ﻫﺎي ﺧﺎص ،ﻋﺪد ﺷﻤﺎرش ﺷﺪه ﺗﻮﺳﻂ ﺗﺎﻳﻤﺮ ﻳﻚ و زﻣـﺎن ﺳـﭙﺮي ﺷـﺪه را
ﺛﺒﺖ ﻛﺮده و از ﻃﺮﻳﻖ آن اﻣﻜﺎن اﻧﺪازه ﮔﻴﺮي ﻫﺎي زﻣﺎﻧﻲ را ﻓﺮاﻫﻢ ﻣﻲ آورد .ﺗﺎﻳﻤﺮ ﻳﻚ داراي ﭘﻨﺞ Modeﻛـﺎري ﺑـﻪ
ﻧــﺎم ﻫــﺎي Phase and Mode Phase Correct PWM Mode Fast PWM ،CTC ،Normal
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.avr.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.avr.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.avr.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.avr.ir
ﺳﻄﺢ ﻣﻨﻄﻘﻲ 0 0 X X X X 0 0
ﺑﺎ اﺟﺮا ﺷﺪن ISRﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﺑﻴﺖ ﭘﺮﭼﻢ وﻗﻔﻪ ﺻﻔﺮ ﺷﺪه و ﻳﺎ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي آن ﺑﻮﺳﻴﻠﻪ ي
Normal Mode
اﻳﻦ Modeﻫﻤﺎﻧﻨﺪ ﻣﺸﺎﺑﻪ آن در ﺗﺎﻳﻤﺮ ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ ﺗﺎ ﻋﺪد 0xFFFFﺷﻤﺎرش ﻛﺮده و ﺑـﺎ
رﺳﻴﺪن ﺑﻪ آن ﺗﺎﻳﻤﺮ ﺳﺮرﻳﺰ ﻛﺮده و ﺑﻴﺖ TOV1ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ ﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋـﺚ اﺟـﺮاي
ISRﻣﺮﺑﻮﻃﻪ ﺷﻮد .در Modeﻋﺎدي ﻫﺮ دو ﻣﻘﺎﻳﺴﻪ ﮔﺮ Aو Bﻓﻌﺎل ﺑﻮده و ﻫﺮ ﻛﺪام ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻞ ﻋﻤﻞ ﻣﻘﺎﻳﺴـﻪ
را روي رﺟﻴﺴﺘﺮ TCNT1و OCR1Aو OCR1Bاﻧﺠﺎم ﻣﻲ دﻫﻨـﺪ .در ﺻـﻮرت ﺑﺮاﺑـﺮي ﺑﻴـﺖ OCF1Aﻳـﺎ
OCF1Bﻳﻚ ﺷﺪه و ﺧﺮوﺟﻲ OC1Aﻳﺎ OC1Bﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ داده و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن
P a g e | 89
www.avr.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.avr.ir
;OCR1BH=0x28
;OCR1BL=0x0F //OCR1B=10255
;)while (1
}
CTC Mode
در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘﺪار رﺟﻴﺴﺘﺮ TCNT1ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ ﺑﺎ ﻣﻘﺪار رﺟﻴﺴﺘﺮ OCR1Aﻳﺎ ICR1ﻣﻘﺎﻳﺴﻪ ﻣـﻲ ﺷـﻮد و
در ﺻﻮرت ﺑﺮاﺑﺮي ﻣﻘﺪار رﺟﻴﺴﺘﺮ TCNT1ﺑﺮاﺑﺮ ﺻﻔﺮ ﻣﻲ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘـﺪار TOPﺗـﺎﻳﻤﺮ را ﺑـﺎ
ﺗﻮﺟﻪ ﺑﻪ ﻣﻘﺪار ﻣﻮﺟﻮد در ﺑﻴﺖ ﻫﺎي WGMﻣﻘﺪار رﺟﻴﺴﺘﺮﻫﺎي OCR1Aﻳﺎ ICR1ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ.
ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار TOPﺧﻮد ﺑﺮ ﺣﺴﺐ اﻳﻨﻜﻪ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ OCR1Aﻳﺎ ICR1اﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷـﺪ ﺑـﻪ
ﺗﺮﺗﻴﺐ ﭘﺮﭼﻢ ﻫﺎي OCF1Aﻳﺎ ICF1ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ از آن ﻣـﻲ ﺗـﻮان ﺑـﺮاي ﺗﻐﻴﻴـﺮ دادن
ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ اﺳﺘﻔﺎده ﻛﺮد .اﻳﻦ ﻋﻤﻞ ﺑﺎﻳﺪ ﺑﺎ دﻗﺖ ﺻﻮرت ﮔﻴﺮد زﻳﺮا رﺟﻴﺴـﺘﺮ ﻣﻘﺎﻳﺴـﻪ ي ﺗﺎﻳﻤﺮﻫـﺎ ﻓﻘـﻂ در Mode
ﻫﺎي PWMداراي ﺑﺎﻓﺮ دوﺑﻞ ﻣﻲ ﺑﺎﺷﻨﺪ .در اﻳﻦ ﺣﺎﻟﺖ ﻓﺮﻛـﺎﻧﺲ ﻣـﻮج اﻳﺠـﺎد ﺷـﺪه روي ﭘﺎﻳـﻪ ﻫـﺎي OC1Aﻳـﺎ
P a g e | 91
www.avr.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.avr.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.avr.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.avr.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.avr.ir
: ﻛﻴﻠﻮﻫﺮﺗﺰ رﺳﻴﺪ1 ﻣﻲ ﺗﻮان ﺑﻪ ﻓﺮﻛﺎﻧﺲ دﻗﻴﻖ، ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮISR درTCNT1 • ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ
P a g e | 96
www.avr.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.avr.ir
TOP OCR1A=110
OCR1A=180
ﻣﺸﻜﻞ ﺑﺎﻻ در PWMﺗﺼﺤﻴﺢ ﻓﺎز و ﻓﺮﻛﺎﻧﺲ ﺑﺎ ﺑﺮوز ﻛﺮدن رﺟﻴﺴﺘﺮﻫﺎي OCR1xدر زﻣﺎن رﺳﻴﺪن ﺑﻪ
ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي 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.avr.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.avr.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.avr.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
P a g e | 101
www.avr.ir
DDRD=0x20;
// 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.avr.ir
#include <mega16.h>
#define xtal 8000000
P a g e | 103
www.avr.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.avr.ir
RS-232cدر اواﺧﺮ دﻫﻪ 60ﻣﻴﻼدي ﺑﻪ ﺻﻮرت اﺳﺘﺎﻧﺪارد ﺗﻌﺮﻳﻒ ﺷﺪ و ﻫﻤﭽﻨﺎن ﻳﻜﻲ از اﺳـﺘﺎﻧﺪاردﻫﺎي ﭘﺮﻛـﺎرﺑﺮد
در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ و ﻛﺎرﺑﺮدﻫﺎي ﺻﻨﻌﺘﻲ اﺳﺖ .اﻳﻦ اﺳﺘﺎﻧﺪارد ﻫﻢ ارﺗﺒﺎط ﺳﺮﻳﺎل ﺳـﻨﻜﺮون و ﻫـﻢ آﺳـﻨﻜﺮون را
ﭘﺸﺘﻴﺒﺎﻧﻲ ﻛﺮده و ﺑﻪ ﺻﻮرت Full Duplexﻋﻤﻞ ﻣﻲ ﻧﻤﺎﻳﺪ .ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ ﺗﻨﻬﺎ ارﺗﺒﺎط آﺳﻨﻜﺮون را ﭘﺸﺘﻴﺒﺎﻧﻲ
ﻣﻲ ﻛﻨﻨﺪ و از ﻃﺮﻳﻖ ﭼﻴﭗ UARTﻣﻮﺟﻮد در ﺑﺮد اﺻﻠﻲ ،اﻃﻼﻋﺎت را از ﺣﺎﻟﺖ ﻣﻮازي ﺑﻪ ﺳـﺮﻳﺎل ﻳـﺎ از ﺳـﺮﻳﺎل ﺑـﻪ
ﻣﻮازي ﺗﺒﺪﻳﻞ ﻛﺮده و ﺑﺎ ﺗﻨﻈﻴﻤﺎت زﻣﺎﻧﻲ آن را از ﻃﺮﻳﻖ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻳﺎ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ.
ﭘﻮرت ﺳﺮﻳﺎل داراي ﻳﻚ ﻛﺎﻧﻜﺘﻮر 9ﭘﻴﻦ ﻣﻲ ﺑﺎﺷﺪ و از آﻧﺠﺎﻳﻲ ﻛﻪ اﻳﻦ اﺳﺘﺎﻧﺪارد در اﺑﺘﺪا ﺑﺮاي ارﺗﺒﺎط ﺑﺎ ﻣﻮدم ﻃﺮاﺣﻲ
ﺷﺪه ﺑﻮد ،داراي ﭘﻴﻦ ﻫﺎي Handshakingو وﺿﻌﻴﺖ ﻣﻲ ﺑﺎﺷﺪ .اﻣﺎ ﻧﻮع ﺧﺎﺻـﻲ از ارﺗﺒـﺎط ﺑـﺎ RS-232ﺑـﻪ ﻧـﺎم
Null-Modemﻛﻪ ﺗﻨﻬﺎ ﺷﺎﻣﻞ ﭘﻴﻦ ﻫﺎي ارﺳﺎل و درﻳﺎﻓﺖ اﺳﺖ ﺑﺮاي ارﺗﺒﺎط ﺑـﺎ ﻏﻴـﺮ از ﻣـﻮدم اﺳـﺘﻔﺎده ﻣـﻲ ﺷـﻮد.
ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻨﻬﺎ دو ﭘﻴﻦ Rxو ) Txو اﻟﺒﺘﻪ زﻣﻴﻦ( ﻣﻮرد ﻧﻴﺎز اﺳﺖ .در ﺷﻜﻞ زﻳﺮ ﻛﺎﻧﻜﺘﻮر ﭘﻮرت ﺳـﺮﻳﺎل را ﻛـﻪ D9ﻧـﺎم
P a g e | 106
www.avr.ir
در ﺟﺪول زﻳﺮ ﻋﻤﻠﻜﺮد ﻫﺮ ﭘﻴﻦ آورده ﺷﺪه اﺳﺖ:
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وﻟﺖ
P a g e | 107
www.avr.ir
اﮔﺮﭼﻪ ﺗﺠﻬﻴﺰات اﺳﺘﺎﻧﺪارد TTLﺑﺎ ﺳﻄﻮح ﻣﻨﻄﻘﻲ 0و 5وﻟﺖ ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ اﻣﺎ ﻗﺎﻟـﺐ اﻃﻼﻋـﺎت ارﺳـﺎﻟﻲ ﺗﻔـﺎوﺗﻲ
ﻧﺪارد و ﺑﺎ ﻳﻚ ﻣﺪار ﺗﻐﻴﻴﺮ ﺳﻄﺢ وﻟﺘﺎژ PC ،ﻣﻲ ﺗﻮاﻧﺪ ﺑـﺎ ادوات TTLارﺗﺒـﺎط ﺑﺮﻗـﺮار ﻧﻤﺎﻳـﺪ .ﻳﻜـﻲ از ﻣﺒـﺪل ﻫـﺎي
ﻣﺘﺪاول ﺳﻄﺢ RS-232ﺑﻪ TTLﻣﺪار ﻣﺠﺘﻤﻊ MAX232و ﻳﺎ HIN232ﻣﻲ ﺑﺎﺷﺪ MAX232 .ﻳﻚ ﺗﺮاﺷﻪ ي
16ﭘﺎﻳﻪ اﺳﺖ ﻛﻪ ﺷﺎﻣﻞ 2ﻓﺮﺳﺘﻨﺪه و 2ﻣﺒﺪل ﻣﺠﺰا اﺳﺖ .در زﻳﺮ ﻳﻚ ﻣﺪار ﻧﻤﻮﻧﻪ را ﺑﺮاي ﻛﺎر ﺑﺎ اﻳﻦ ICﻣﺸﺎﻫﺪه ﻣـﻲ
ﻛﻨﻴﺪ:
P a g e | 108
www.avr.ir
ﻗﺎﻟﺐ اﻃﻼﻋﺎت:
در ﻳﻚ Frameاﻃﻼﻋﺎﺗﻲ ﻛﻪ ﺗﻮﺳﻂ ﺑﻴﺖ ﺷﺮوع و ﺑﻴﺖ ﭘﺎﻳﺎن ﻣﺤﺼﻮر ﺷﺪه اﺳﺖ ﻣﻌﻤﻮﻻ 5ﺗﺎ 8ﺑﻴﺖ دﻳﺘـﺎ ﻗـﺮار ﻣـﻲ
ﮔﻴﺮد و ﻳﻚ ﺑﻴﺖ ﺗﻮازن ﻧﻴﺰ ﺑﻪ ﺻﻮرت اﺧﺘﻴﺎري ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد .ﺑﻴﺖ ﺷﺮوع ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﺻﻔﺮ ﻣﻨﻄﻘﻲ اﺳﺖ و ﺑﻴﺖ ﭘﺎﻳﺎن
)ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ 1ﻳﺎ 2ﺑﻴﺖ ﺑﺎﺷﺪ (.ﺗﻮﺳﻂ ﻳﻚ ﺷﻨﺎﺳﺎﻳﻲ ﻣﻲ ﺷﻮد .ﻣﺜﻼ در ﻧﻤﻮدار زﻣﺎﻧﻲ زﻳﺮ ﻳﻚ Frameﺷﺎﻣﻞ 10
ﺑﻴﺖ اﺳﺖ ﻛﻪ ﻫﻔﺖ ﺑﻴﺖ آن ﺷﺎﻣﻞ Dataﻳﻚ ﺑﻴﺖ آﻏﺎزﻳﻦ و ﻳﻚ ﺑﻴﺖ ﭘﺎﻳﺎﻧﻲ و ﻳﻚ ﺑﻴﺖ ﺗﻮازن ﻗﺒﻞ از ﺑﻴﺖ ﭘﺎﻳﺎن ﻣﻲ
ﺑﺎﺷﺪ:
ﺳﻨﻜﺮون ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﺪ .دﺳﺘﺮﺳﻲ ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل AVRاز ﻃﺮﻳـﻖ ﺳـﻪ ﭘـﻴﻦ RXD ،TXDو XCKﻛـﻪ ﺑـﻪ
ﺗﺮﺗﻴﺐ ﭘﻴﻦ ارﺳﺎل ،درﻳﺎﻓﺖ وﻛﻼك ﻣﻲ ﺑﺎﺷﻨﺪ اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ) .ﭘﻴﻦ XCKﻓﻘﻂ در Modeﺳﻨﻜﺮون ﻛﺎرﺑﺮد دارد(.
ﺑﻴﺖ ﻫﺎي داده ،ﺑﻴﺖ اﺧﺘﻴﺎري ﺗﻮازن و ﻳﻚ ﻳﺎ دو ﺑﻴﺖ ﭘﺎﻳﺎن اﺳﺖ ،ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ در AVRﻣﻲ ﺗﻮاﻧﺪ 5ﺗﺎ 9ﺑﻴـﺖ
P a g e | 109
www.avr.ir
Dataﺗﻌﺮﻳﻒ ﺷﻮد .ﺑﻴﺖ ﺗﻮازن ﻣـﻲ ﺗﻮاﻧـﺪ ﻓـﺮد ﻳـﺎ زوج ﺑﺎﺷـﺪ و از ﻃﺮﻳـﻖ ﺑﻴـﺖ ﻫـﺎي ] UPM[1:0از رﺟﻴﺴـﺘﺮ
UCSRCﺗﻨﻈﻴﻢ ﻣﻲ ﺷﻮد.
رﺟﻴﺴﺘﺮﻫﺎي USART
ﺑﺎﻓﺮ درﻳﺎﻓﺖ و ارﺳﺎل ﭘﻮرت ﺳﺮﻳﺎل داراي ﻳﻚ آدرس ﻣﺸﺘﺮك ﺑﻪ ﻧﺎم UDRدر ﻓﻀﺎي I/O Registersﻣﻲ ﺑﺎﺷﻨﺪ.
ﺑﺎﻓﺮ ارﺳﺎل ،ﻣﻘﺼﺪ داده ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در رﺟﻴﺴﺘﺮ UDRﺑﻮده و ﺧﻮاﻧﺪن اﻳﻦ رﺟﻴﺴﺘﺮ ﻣﺤﺘﻮﻳـﺎت ﺑـﺎﻓﺮ درﻳﺎﻓـﺖ را
ﺑﻪ دﺳﺖ ﻣﻲ دﻫﺪ .ﺗﻨﻬﺎ زﻣﺎﻧﻲ ﻣﻲ ﺗـﻮان روي رﺟﻴﺴـﺘﺮ UDRﻣﻘـﺪاري را ﻧﻮﺷـﺖ ﻛـﻪ ﺑﻴـﺖ UDREاز رﺟﻴﺴـﺘﺮ
UCSRAﻳﻚ ﺷﺪه ﺑﺎﺷﺪ و در ﻏﻴﺮ اﻳﻨﺼﻮرت دﻳﺘﺎي ارﺳﺎﻟﻲ ﺗﻮﺳﻂ USARTﻧﺎدﻳﺪه ﮔﺮﻓﺘﻪ ﻣـﻲ ﺷـﻮد .ﺑـﺎ ارﺳـﺎل
اﻃﻼﻋﺎت ﺑﻪ ﺑﺎﻓﺮ ارﺳﺎل USARTدر ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ TXENاز رﺟﻴﺴـﺘﺮ UCSRBﻳـﻚ ﺑﺎﺷـﺪ اﻃﻼﻋـﺎت در
UCSR
7 6 5 4 3 2 1 0
A
P a g e | 110
www.avr.ir
RX UDR U2 MPC
ﻧﺎم ﺑﻴﺖ TXC FE DOR PE
C E X M
: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ﻳﻚ اﺳـﺖ
P a g e | 111
www.avr.ir
ﺑﺎ ﺧﺎرج ﺷﺪن از ISRدوﺑﺎره آن را اﺟﺮا ﻣﻲ ﻛﻨﺪ ﺑﺎ ﻧﻮﺷﺘﻦ داده ي ﺟﺪﻳﺪ در UDRﭘﺮﭼﻢ UDREﺻـﻔﺮ ﻣـﻲ
ﺷﻮد .ﺑﻌﺪ از رﻳﺴﺖ ﺷﺪن ﻣﻴﻜﺮو اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻪ ﻣﻌﻨﺎي آﻣﺎده ﺑﻮدن درﻳﺎﻓﺖ ﻛﺎراﻛﺘﺮ ﺟﺪﻳﺪ اﺳﺖ.
:USART Transmit Completeاﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻳﻚ ﻣﻲ ﺷﻮد ﻛﻪ ﺗﻤﺎم اﻃﻼﻋﺎت ﻣﻮﺟﻮد در ﺷﻴﻔﺖ
رﺟﻴﺴﺘﺮ ﺑﻪ ﺑﻴﺮون ﺷﻴﻔﺖ داده ﺷﺪه و داده ي ﺟﺪﻳﺪي در ﺑﺎﻓﺮ ارﺳﺎل وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ .ﺑﺎ ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ
TXCIEاﻳﻦ ﭘﺮﭼﻢ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ي ﻛﺎﻣﻞ ﺷﺪن ارﺳﺎل ﺷﻮد و ﺑﺎ اﺟﺮاي ISRﺑﻴﺖ TXCﺗﻮﺳﻂ
ﺳﺨﺖ اﻓﺰار ﭘﺎك ﺷﺪه و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي آن ،آن را ﭘﺎك ﻛﻨﺪ.
:USART Receive Completeاﻳﻦ ﺑﻴﺖ ﺑﺎ ﻛﺎﻣﻞ ﺷﺪن درﻳﺎﻓﺖ ﻳﻚ Frameدر UDRﻳﻚ ﺷﺪه و ﭘﺲ از
:Transmit Data Bit 8در ﺣﺎﻟﺘﻲ ﻛﻪ از ﭘﻮرت ﺳﺮﻳﺎل در 9 Modeﺑﻴﺘﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد اﻳـﻦ ﺑﻴـﺖ ﻧﻬﻤـﻴﻦ
ﺑﻴﺖ ﻛﺎراﻛﺘﺮ ارﺳﺎﻟﻲ ﺧﻮاﻫﺪ ﺑﻮد .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻗﺒﻞ از ﻧﻮﺷﺘﻦ در UDRﺑﺎﻳﺪ وﺿﻌﻴﺖ اﻳﻦ ﺑﻴـﺖ را ﻣﺸـﺨﺺ
ﻛﺮد.
:Receive Data Bit 8در ﺣﺎﻟﺘﻲ ﻛﻪ از ﭘﻮرت ﺳﺮﻳﺎل در 9 Modeﺑﻴﺘﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد اﻳﻦ ﺑﻴﺖ ﻧﻬﻤﻴﻦ ﺑﻴـﺖ
ﻛﺎراﻛﺘﺮ درﻳﺎﻓﺘﻲ ﺧﻮاﻫﺪ ﺑﻮد .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻗﺒﻞ از ﺧﻮاﻧﺪن UDRﺑﺎﻳﺪ اﻳﻦ ﺑﻴﺖ را ﺧﻮاﻧﺪ.
P a g e | 112
www.avr.ir
:Character Sizeﺑﺎ ﺗﺮﻛﻴﺐ اﻳﻦ ﺑﻴﺖ و ﺑﻴﺖ ﻫﺎي ] UCSZ[1:0در رﺟﻴﺴﺘﺮ UCSRCﺗﻌﺪاد ﺑﻴﺖ ﻫـﺎي داده
:Transmitter Enableﺑﺎ ﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﻋﻤﻠﻜﺮد ﻋﺎدي ﭘﻴﻦ TxDﺑﻪ ارﺳﺎل ﭘﻮرت ﺳﺮﻳﺎل ﺗﻐﻴﻴـﺮ ﺣﺎﻟـﺖ
داده و ﺑﻌﺪ از آن ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﻪ ﺻﻮرت 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ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد.
P a g e | 113
www.avr.ir
ﻧﺎم ﺑﻴﺖ URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
رﺟﻴﺴﺘﺮﻫﺎي UCSRCو UBRRHداراي آدرس ﻣﺸﺘﺮﻛﻲ در ﻓﻀﺎي I/Oﻫﺴﺘﻨﺪ ،ﻛﻪ ﺑﺮاي اﻧﺘﺨﺎب اﻳﻦ دو از
:Clock Polarityاﻳﻦ ﺑﻴﺖ ﻓﻘﻂ در Modeﺳﻨﻜﺮون ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲ ﺷﻮد و در Modeآﺳﻨﻜﺮون ﺑﺎﻳﺪ روي آن
ﺻﻔﺮ ﻧﻮﺷﺘﻪ ﺷﻮد .ﻋﻤﻠﻜﺮد اﻳﻦ ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﺳﺖ:
ﻧﻤﻮﻧﻪ ﺑﺮداري از داده ي درﻳﺎﻓﺘﻲ روي ﭘﻴﻦ RxDﺗﻐﻴﻴﺮ داده ي ارﺳﺎﻟﻲ روي ﭘﻴﻦ UCPOL TxD
ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ XCK ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ XCK
ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ XCK ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ XCK
] :Character Size[1:0اﻳﻦ ﺑﻴﺖ ﺑﻪ ﻫﻤﺮاه ﺑﻴﺖ UCSZ2ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﺪاد ﺑﻴﺖ ﻫﺎي ﻳﻚ ﻛﺎراﻛﺘﺮ را
ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ،در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض اﻳﻦ ﺑﻴﺖ ﻫﺎ اﻧﺪازه ي 8ﺑﻴﺖ را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ.
5ﺑﻴﺖ
P a g e | 114
www.avr.ir
6ﺑﻴﺖ
7ﺑﻴﺖ
8ﺑﻴﺖ
رزرو ﺷﺪه
رزرو ﺷﺪه
رزرو ﺷﺪه
ﭘﺎﻳﺎن را ﻣﻌﻴﻦ ﻣﻲ ﻛﻨﺪ .در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﻛﻪ اﻳﻦ ﺑﻴﺖ ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ ﻳﻚ ﺑﻴﺖ ﭘﺎﻳﺎن و در ﺻﻮرت 1ﺷﺪن 2ﺑﻴﺖ
] :Parity Mode[1:0اﻳﻦ دو ﺑﻴﺖ ﺗﻨﻈﻴﻤﺎت ﻣﺮﺑﻮط ﺑﻪ ﺑﻴﺖ ﺗﻮازن را ﻣﻄـﺎﺑﻖ ﺟـﺪول زﻳـﺮ اﻧﺠـﺎم ﻣـﻲ دﻫﻨـﺪ .در
ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﺗﻮازن ﻫﻤﺮاه ﻫﺮ Frameاﻳﻦ ﺑﻴﺖ اﻳﺠﺎد ﺷﺪه و در ﮔﻴﺮﻧﺪه ﺑﺮ ﺣﺴﺐ ﻫﻤـﺎن ﺗﻨﻈﻴﻤـﺎت )ﻛـﻪ
ﺑﺎﻳﺪ در آﻧﺠﺎ ﻧﻴﺰ ﻣﻄﺎﺑﻖ ﺗﻨﻈﻴﻤﺎت ﻓﺮﺳﺘﻨﺪه اﻧﺠﺎم ﺷﻮد (.ﻣﻘﺪار ﺑﻴﺖ ﺗﻮازن ﺑﺎ ﻣﻘﺪار درﻳﺎﻓـﺖ ﺷـﺪه ﻣﻘﺎﻳﺴـﻪ ﺷـﺪه و در
P a g e | 115
www.avr.ir
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
ﺑﻬﺘﺮ اﺳﺖ در ﺻﻮرت اﺳﺘﻔﺎده از وﻗﻔـﻪ ،ﻗﺒـﻞ از ﭘﺮوﺳـﻪ ي ﺑـﺎﻻ ﺑﻴـﺖ ﻓﻌـﺎل ﺳـﺎز وﻗﻔـﻪ ﻫـﺎ را ﺑـﺎ دﺳـﺘﻮر
ﺑﺎ ﺧﻮاﻧﺪن UBRRHﺑﻴﺖ URSELﺻﻔﺮ ﺧﻮاﻧﺪه ﺷﺪه و ﺑﺎ ﺧﻮاﻧﺪن UCSRCاﻳﻦ ﺑﻴﺖ ﻳﻚ ﺧﻮاﻧﺪه ﻣﻲ
ﺷﻮد.
P a g e | 116
www.avr.ir
UBRRL ]UBRR[7:0
] :UBRRH[7:4ﺑﺮاي ﻛﺎرﺑﺮدﻫﺎي آﻳﻨﺪه رزرو ﺷﺪه ﻫﺴﺘﻨﺪ و ﺑﺮاي ﺳﺎزﮔﺎري ﺑﺎ ﻗﻄﻌﺎت آﺗﻲ ﺑﺎﻳﺪ روي آن ﻫﺎ ﺻﻔﺮ
ﻧﻮﺷﺘﻪ ﺷﻮد.
] :UBRR[11:0اﻳﻦ دوازده ﺑﻴﺖ ﺑﺮاي ﺗﻌﻴﻴﻦ Baud Rateراﺑﻂ USARTﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .ﺑﻪ اﻳﻦ
Modeﻛﺎري ﻣﺤﺎﺳﺒﻪ Baud Rateاز روي UBRR ﻣﺤﺎﺳﺒﻪ UBRRاز روي Baud Rate
P a g e | 117
www.avr.ir
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
ﻣﻘﺪار UBRRو ﺧﻄﺎﻫﺎي ﺣﺎﺻﻞ در ﻛﻠﻴﻪ ﺣﺎﻟﺖ ﻫﺎ در ﺻﻔﺤﺎت 166 -169از ﺑﺮﮔﻪ ي اﻃﻼﻋﺎﺗﻲ
ATmega16ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ.
اﻋﻼن اﻳﻦ ﺗﻮاﺑﻊ در ﻓﺎﻳﻞ stdio.hﻗﺮار دارد و ﻗﺒﻞ از اﺳﺘﻔﺎده از آن ﻫﺎ ﺑﺎﻳﺪ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ USARTاﻧﺠﺎم ﺷﻮد.
P a g e | 118
www.avr.ir
ﺗﺎﺑﻊ )( :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
UBRRL=0x33; // USART Baud rate: 9600
;)delay_ms(3000
;)putchar(7
;)while (1
}
P a g e | 119
www.avr.ir
:ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو دوم
#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
در ﺻﻮرت ﻧﻴﺎز ﻣـﻲ ﺗـﻮان ﺑـﻪ. ﺗﻨﻬﺎ ﺑﺮاي ﺻﺮﻓﻪ ﺟﻮﻳﻲ در وﻗﺖ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ ﺑﺎﺷﻨﺪUSART ﺗﻮاﺑﻊ ﺳﻄﺢ ﺑﺎﻻي
ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﺣﻠﻘﻪ ي اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ي ﻣﻴﻜﺮو دوم را ﺑﻪ ﺻﻮرت زﻳﺮ ﻧﻴـﺰ ﻣـﻲ.ﺻﻮرت ﻣﺴﺘﻘﻴﻢ ﺑﺎ رﺟﻴﺴﺘﺮﻫﺎ ﻛﺎر ﻛﺮد
:ﺗﻮان ﻧﻮﺷﺖ
while(!(UCSRA&0x80));
P a g e | 120
www.avr.ir
;PORTA=UDR
;)while (1
ﺗﻮاﺑﻊ )( putsو )( :putsfاﻳﻦ ﺗﻮاﺑﻊ ﻳﻚ رﺷﺘﻪ را ﺗﻮﺳﻂ USARTﺑـﻪ ﭘـﻮرت ﺳـﺮﻳﺎل ارﺳـﺎل ﻣـﻲ ﻛﻨﻨـﺪ .ﺗـﺎﺑﻊ
)( putsرﺷﺘﻪ اي را ﻛﻪ در SRAMاﺳﺖ و ﺗﺎﺑﻊ )( putsfرﺷﺘﻪ اي را ﻛﻪ در Flashاﺳﺖ ﺑﻪ ﺧﺮوﺟﻲ ارﺳﺎل ﻣـﻲ
ﻛﻨﺪ .اﺳﺎس ﺗﻤﺎم ﺗﻮاﺑﻊ ﺳﻄﺢ ﺑﺎﻻي USARTﺗﻮاﺑﻊ )( putcharو )( getcharﻣﻲ ﺑﺎﺷﻨﺪ و در اﻳﻨﺠﺎ ﻧﻴﺰ ﺑﺎ اﺳﺘﻔﺎده
از اﺷــﺎره ﮔــﺮ ،Yﻛﺎراﻛﺘﺮﻫــﺎ ﭘﺸــﺖ ﺳــﺮ ﻫــﻢ ﺑﻮﺳــﻴﻠﻪ ي اﻳــﻦ ﺗﻮاﺑــﻊ ﺑــﻪ رﺟﻴﺴــﺘﺮ UDRارﺳــﺎل ﻣــﻲ ﺷــﻮﻧﺪ.
اﻳﻦ ﺗﻮاﺑﻊ ﺑﻪ اﻧﺘﻬﺎي رﺷﺘﻪ ﻛﺎراﻛﺘﺮ (0x10) LFرا اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻨﺪ.
ﻣﺜﺎل) :3رﺷﺘﻪ ﻫﺎي " "Kavoshو " "AVRﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﺷﻮﻧﺪ(.
>#include <mega16.h
>#include <delay.h
>#include <stdio.h
#define xtal 8000000
)void main(void
{
P a g e | 121
www.avr.ir
;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
>#include <stdio.h
#define xtal 8000000
)void main(void
{
P a g e | 122
www.avr.ir
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
char a[10];
void main(void)
{
UCSRA=0x00;
P a g e | 123
www.avr.ir
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.avr.ir
SRAM
واﻗﻊ درNull رﺷﺘﻪ ي ﺧﺘﻢ ﺷﺪه ﺑﻪ
%p
Flash
10 ﻋﺪد ﺻﺤﻴﺢ ﺑﺪون ﻋﻼﻣﺖ در ﻣﺒﻨﺎي %u
% ﻛﺎراﻛﺘﺮ %%
(. )ﻳﻚ رﺷﺘﻪ ي ﻗﺎﻟﺐ ﺑﻨﺪي ﺷﺪه را ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﻛﻨﺪ:5 ﻣﺜﺎل
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#define xtal 8000000
int a = 100;
char b = 'A';
float pi = 3.14;
void main(void)
{
UCSRA=0x00;
UCSRB=0x08; // USART Transmitter: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
UBRRH=0x00;
P a g e | 125
www.avr.ir
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ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﺗﺎﺑﻊ ﻣﻲ ﺗﻮاﻧﺪ ﻗﺎﻟﺐ اﻃﻼﻋﺎت درﻳﺎﻓﺘﻲ از ﭘﻮرت ﺳﺮﻳﺎل را ﺗﻌﻴﻴﻦ ﻧﻤﻮد .ﻃﺮز ﻛﺎر اﻳﻦ
P a g e | 126
www.avr.ir
;)ﻋﺒﺎرت دوم",ﻋﺒﺎرت اول"(scanf
ﻋﺒﺎرت دوم ﻧﺎم ﻣﺘﻐﻴﺮي اﺳﺖ ﻛﻪ رﺷﺘﻪ ي درﻳﺎﻓﺘﻲ در آن ﻗﺮار ﻣﻲ ﮔﻴﺮد و ﻋﺒﺎرت اول ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻗﺎﻟﺐ داده ي
درﻳﺎﻓﺘﻲ ﺑﻪ ﭼﻪ ﺻﻮرت ﺑﺎﺷﺪ .ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻃﻮل رﺷﺘﻪ ي درﻳﺎﻓﺘﻲ 256ﻛﺎراﻛﺘﺮ اﺳﺖ اﻣﺎ ﺑـﺎ اﻓـﺰودن ﻃـﻮل
ﻗﺒﻞ از ﻛﺎراﻛﺘﺮ ﻓﺮﻣﺖ ﻣﻲ ﺗﻮان آن را ﺑﻪ ﻣﻘﺪار دﻟﺨﻮاه ﻛﺎﻫﺶ داد .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل:
)scanf("%10d",a
10ﻛﺎراﻛﺘﺮ را از ورودي ﺧﻮاﻧﺪه و در ﻣﺘﻐﻴﺮ aذﺧﻴﺮه ﻣﻲ ﻛﻨﺪ.
ﺗﻮﺟﻪ :ﺗﻮاﺑﻊ )( printfو )( scanfﺣﺠﻢ زﻳﺎدي از ﺣﺎﻓﻈﻪ ي Flashرا ﻣﺼﺮف ﻛﺮده و ﺳﺮﻋﺖ اﺟﺮاي آن ﻫﺎ
ﭘﺎﻳﻴﻦ اﺳﺖ ،ﺑﻨﺎﺑﺮاﻳﻦ ﺗﺎ ﺣﺪ اﻣﻜﺎن از آن ﻫﺎ اﺳﺘﻔﺎده ﻧﻜﺮده و در ﺻﻮرت ﻟﺰوم ﻣﺸﺨﺼﺎت آن ﻫﺎ را ﺑﻪ ﺳﺎده ﺗﺮﻳﻦ
P a g e | 127
www.avr.ir
اﺳﺘﻔﺎده از ﭘﻮرت ﺳﺮﻳﺎل در وﺿﻌﻴﺖ ﺳﻨﻜﺮون
ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ UMSELاز رﺟﻴﺴﺘﺮ UCSRCﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ در اﻳﻦ ﺣﺎﻟﺖ ﻗﺮار ﻣﻲ ﮔﻴﺮد و اﺗﺼﺎﻻت ﺳﺨﺖ
TxD TxD
RxD RxD
XCK XCK
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي UCPOLﻣﻲ ﺗﻮان ﻟﺒﻪ ي ﻧﻤﻮﻧﻪ ﺑﺮداري و ﺗﻐﻴﻴﺮ ﺑﺮ اﺳﺎل ﻛﻼك را ﺗﻌﻴﻴﻦ
ﻧﻤﻮد .ﻣﺴﺌﻠﻪ اي ﻛﻪ ﺑﺎﻳﺪ در Modeﺳﻨﻜﺮون رﻋﺎﻳﺖ ﺷﻮد اﻳﻦ اﺳﺖ ﻛﻪ داده ﺑﺎﻳﺪ در ﺧﻼف ﻟﺒﻪ اي ﻛـﻪ در ﻓﺮﺳـﺘﻨﺪه
ارﺳﺎل ﺷﺪه اﺳﺖ ،در ﮔﻴﺮﻧﺪه ﻧﻤﻮﻧﻪ ﺑﺮداري ﺷﻮد ﻳﻌﻨﻲ اﮔﺮ داده در ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ارﺳﺎل ﺷﺪه ﺑﺎﺷﺪ در ﻟﺒﻪ ي ﺑﺎﻻ
وﺿﻌﻴﺖ Multi-processor
ﺑﺮاي اﻳﺠﺎد ﺷﺒﻜﻪ ﺑﻴﻦ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎ از اﻳﻦ Modeاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .ﻣﻌﻤﻮﻻ ﻳﻚ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺑﻪ ﻋﻨﻮان Masterو
P a g e | 128
www.avr.ir
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آن ﺻﻔﺮ
ﺷﺪه ﺑﻮد ﻣﺠﺪدا اﻳﻦ ﺑﻴﺖ را ﻳﻚ ﻛﺮده و آﻣﺎده ي درﻳﺎﻓﺖ آدرس ﻣﻲ ﺷﻮد.
P a g e | 129
www.avr.ir
ارﺗﺒﺎط ﺑﻴﻦ ﻛﺎﻣﭙﻴﻮﺗﺮ و PCﺑﻪ ﺻﻮرت Null-Modemﺑﻮده و ﻫﻤﺎﻧﻄﻮر ﻛﻪ اﺷﺎره ﺷﺪ ﺑﺮاي ﺗﻐﻴﻴﺮ ﺳﻄﺢ RS-
ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﭘﻮرت ﻫﺎي COMدر وﻳﮋوال ﺑﻴﺴﻴﻚ ﻣﻲ ﺗﻮان از ﻛﻨﺘﺮل MSCommﻛﻪ ﻫﻤﺮاه ﻛﺎﻣﭙﺎﻳﻠﺮ وﺟﻮد
دارد اﺳﺘﻔﺎده ﻧﻤﻮد .اﻳﻦ ﻛﻨﺘﺮل ،ارﺗﺒﺎط دﻫﻲ ﭘﻮرت ﺳﺮﻳﺎل را از ﻃﺮﻳﻖ ﻓﺎﻳﻞ mscomm32.ocxﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ
P a g e | 130
www.avr.ir
از ﻃﺮﻳﻖ ﻣﻨﻮي اﺻﻠﻲ ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﮔﺰﻳﻨﻪ ي Projectﻣﻮرد Componentرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ و در ﻛﺎدر .2
ﺣﺎﺻﻞ ﮔﺰﻳﻨﻪ ي Microsoft Comm Control 6.0را ﻋﻼﻣﺖ زده و دﻛﻤﻪ ي OKرا ﻛﻠﻴﻚ ﻛﻨﻴﺪ.
P a g e | 131
www.avr.ir
. ﻓﺮم ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ را وارد ﻛﻨﻴﺪLoad در روﻳﺪاد .6
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.avr.ir
ﺷﻤﺎﺗﻴﻚ:
P a g e | 133
www.avr.ir
ﭘﺲ از ﭘﻴﻜﺮﺑﻨﺪي ﺳﺨﺖ اﻓﺰاري ﻣﺪار ﻧﻴﺎز ﺑﻪ دراﻳﻮر دارد ﻛﻪ ﺗﻨﻈﻴﻢ آن در Win XPﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:
http://www.ftdichip.com/Drivers/VCP.htm
ﻓﺎﻳﻞ ﺑﺎرﮔﺬاري ﺷﺪه را در ﻳﻚ ﻣﺴﻴﺮ دﻟﺨﻮاه Unzipﻛﻨﻴﺪ) .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل(E:\CDM 2.00.00 : (2
P a g e | 134
www.avr.ir
ﺳﺨﺖ اﻓﺰار ﺧﻮد را ﺑﻪ ﻳﻜـﻲ از ﻛﺎﻧﻜﺘﻮرﻫـﺎي USBوﺻـﻞ ﻛﻨﻴـﺪ .در اﻳـﻦ ﺣﺎﻟـﺖ ﭘﻴـﺎم Found New (3
Hardwareﻇﺎﻫﺮ ﺷﺪه و ﭘﺲ از آن ﻛﺎدر ﻣﺤﺎوره ي Found New Hardware Wizardﻧﻤﺎﻳﺶ داده ﻣﻲ
در ﻛﺎدر ﺣﺎﺻﻞ ﻣﺴﻴﺮ دراﻳﻮر را وارد ﻛﺮده و ﺑﺮ روي Nextﻛﻠﻴﻚ ﻧﻤﺎﻳﻴﺪ. (4
P a g e | 135
www.avr.ir
در ﺻﻮرﺗﻲ ﻛﻪ وﻳﻨﺪوز ﺑﻪ ﻧﺤﻮي ﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه ﺑﺎﺷﺪ ﻛـﻪ در ﺻـﻮرت ﻧﺼـﺐ دراﻳﻮرﻫـﺎي آزﻣـﺎﻳﺶ ﻧﺸـﺪه ﺗﻮﺳـﻂ
ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ،ﭘﻴﻐﺎﻣﻲ داده ﺷﻮد اﺧﻄﺎر زﻳﺮ اﻳﺠﺎد ﺷﺪه و در اﻳﻦ ﺣﺎﻟﺖ ﺑﺎ ﭼﺸﻢ ﭘﻮﺷﻲ از اﺧﻄﺎر ﺑﺮ روي Continue
Anywayﻛﻠﻴﻚ ﻛﻨﻴﺪ.
P a g e | 136
www.avr.ir
ﻛﺎدر زﻳﺮ ﻧﻤﺎﻳﺶ داده ﺷﺪه و ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻛﻪ وﻳﻨﺪوز در ﺣﺎل ﻛﭙﻲ ﻧﻤﻮدن ﻓﺎﻳﻞ ﻫﺎي ﻣﻮرد ﻧﻴﺎز ﻣﻲ ﺑﺎﺷﺪ. (5
P a g e | 137
www.avr.ir
وﻳﻨﺪوز ﭘﻴﺎﻣﻲ ﻣﺒﻨﻲ ﺑﺮ اﺗﻤﺎم ﻣﻮﻓﻘﻴﺖ آﻣﻴﺰ ﻧﺼﺐ ﺳﺨﺖ اﻓﺰار داده و ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي Finishاﻳﻦ ﭘﺮوﺳﻪ (6
ﺗﻤﺎم ﻣﻲ ﺷﻮد.
) Device Managerدر ﻣﺴﻴﺮ Control Panel\Systemﺑﺮ روي زﺑﺎﻧﻪ ي (Hardwareرا ﺑﺎز ﻛﻨﻴﺪ (7
و درﺧﺖ Portرا ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ] [+ﻛﻨﺎر آن ﺑﺴﻂ دﻫﻴﺪ .ﻣﻼﺣﻈﻪ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ COMﻣﺠﺎزي ﺑﺎ ﻧﺎم COMxﺑﻪ
ﻟﻴﺴﺖ اﻓﺰوده ﺷﺪه اﺳﺖ .از اﻳﻦ ﭘﺲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻄﺎﺑﻖ ﭘﺮوژه ي 12اﻃﻼﻋﺎت را ﺑﻪ COMxارﺳﺎل ﻳﺎ درﻳﺎﻓﺖ ﻛﺮده
P a g e | 138
www.avr.ir
P a g e | 139
www.avr.ir
اﺳﺘﺎﻧﺪارد I2Cدر اواﻳﻞ دﻫﻪ 1980ﺗﻮﺳﻂ ﺷﺮﻛﺖ Philipsﻃﺮاﺣﻲ ﺷﺪ .در اﺑﺘـﺪا اﻳـﻦ ﭘﺮوﺗﻜـﻞ ﺑـﻪ ﻣﻨﻈـﻮر اﻳﺠـﺎد
روﺷﻲ ﺳﺎده ﺑﺮاي اﻳﺠﺎد ارﺗﺒﺎط ﭘﺮدازﻧﺪه ﺑﺎ ﺗﺮاﺷﻪ ﻫﺎي ﺟﺎﻧﺒﻲ در ﻳﻚ دﺳﺘﮕﺎه ﺗﻠﻮﻳﺰﻳﻮن اﺑﺪاع ﺷﺪ.
I2Cﻃﺒﻖ ﺗﻌﺮﻳﻒ ﺷﺮﻛﺖ ﻓﻴﻠﻴﭙﺲ ﻣﺨﻔﻒ Inter-ICﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻴﺎﻧﮕﺮ ﻫﺪف آن ﻳﻌﻨﻲ ﻓـﺮاﻫﻢ آوردن ﻳـﻚ ﻟﻴﻨـﻚ
ارﺗﺒﺎﻃﻲ ﺑﻴﻦ ﻣﺪارات ﻣﺠﺘﻤﻊ ﻣﻲ ﺑﺎﺷﺪ .اﻣﺮوزه اﻳﻦ ﭘﺮوﺗﻜﻞ ﺑﻪ ﺻـﻮرت ﻋﻤـﻮﻣﻲ در ﺻـﻨﻌﺖ ﭘﺬﻳﺮﻓﺘـﻪ ﺷـﺪه اﺳـﺖ و
ﻛﺎرﺑﺮد آن از ﺳﻄﺢ ﺗﺠﻬﻴﺰات ﺻﻮﺗﻲ و ﺗﺼﻮﻳﺮي ﻧﻴﺰ ﻓﺮاﺗﺮ رﻓﺘﻪ اﺳﺖ .ﺑﻪ ﮔﻮﻧﻪ اي ﻛﻪ اﻣﺮوزه در ﺑـﻴﺶ از 1000ﻧـﻮع
ICﻣﺨﺘﻠﻒ ﺑﻪ ﻛﺎر ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ I2C .ﻓﻀﺎ را ﺣﻔﻆ ﻣﻲ ﻛﻨﺪ و ﺑﺎﻋﺚ ﻛﺎﻫﺶ ﭼﺸﻤﮕﻴﺮ ﻫﺰﻳﻨﻪ ي ﻧﻬﺎﻳﻲ ﻣﻲ ﺷـﻮد.
دو ﺧﻂ ارﺗﺒﺎﻃﻲ ﺑﻪ ﻣﻌﻨﻲ Trackﻫﺎي ﻣﺴﻲ ﻛﻤﺘﺮ و در ﻧﺘﻴﺠﻪ ﺑﺮد ﻣﺪار ﭼﺎﭘﻲ ﻛﻮﭼﻜﺘﺮ و ﺗﺴﺖ ﻋﻴﺐ ﻳﺎﺑﻲ ﺳﺮﻳﻌﺘﺮ و
راﺣﺘﺘﺮ ﻣﻲ ﺑﺎﺷﺪ .ﻋﻼوه ﺑﺮ اﻳﻦ در اﻏﻠﺐ ﻣﻮارد ﺣﺴﺎﺳﻴﺖ ﻣﺪار اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻧﺴﺒﺖ ﺑﻪ ﺗﺪاﺧﻞ اﻣﻮاج اﻟﻜﺘﺮوﻣﻐﻨﺎﻃﻴﺴـﻲ
I2C .1ﻳﻚ ﭘﺮوﺗﻜﻞ ﺳﺮﻳﺎل ﺳﻨﻜﺮون ﻣﻲ ﺑﺎﺷﺪ و ﻛﻼك آن ﻣﻲ ﺗﻮاﻧﺪ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﺗﻐﻴﻴﺮ ﻛﻨﺪ.
.2آدرس دﻫﻲ 7ﺑﻴﺘﻲ ) 127وﺳﻴﻠﻪ ي ﻣﺘﻔﺎوت ﺑﺮ روي ﺑﺎس( و ﻧﻴﺰ آدرس دﻫـﻲ 10ﺑﻴﺘـﻲ در وﻳـﺮاﻳﺶ ﺟﺪﻳـﺪ اﻳـﻦ
P a g e | 140
www.avr.ir
.3ﺑﺎس ﺗﻨﻬﺎ ﺑﻪ دو ﺧﻂ SCLو SDAﻧﻴﺎز دارد .ﺑﺮ روي SCLﺗﻮﺳﻂ Masterﻛﻼك اﻳﺠﺎد ﻣـﻲ ﺷـﻮد و SDA
.4ﺑﺮ روي ﺑﺎس اﻃﻼﻋﺎت 8ﺑﻴﺘﻲ ﺑﻪ ﺻﻮرت دو ﺟﻬﺘﻪ ﺑﺎ ﻧﺮخ ارﺳﺎل ﺣﺪاﻛﺜﺮ 400ﻛﻴﻠﻮﺑﻴﺖ ﺑﺮ ﺛﺎﻧﻴـﻪ) .و 3.4ﻣﮕﺎﺑﻴـﺖ
.6ﺣﺬف Spikeﻫﺎي ﻧﺎﺧﻮاﺳﺘﻪ از ﺧﻂ SDAﺑﺎ اﺳﺘﻔﺎده از ﻓﻴﻠﺘﺮ ﻣﻮﺟﻮد در ﭼﻴﭗ ،ﺑﻪ ﻃـﻮري ﻛـﻪ ﺳـﻴﮕﻨﺎل ﻫـﺎي
.7ﭘﻴﻦ ﻫﺎي SDAو SCLﻣﺠﻬﺰ ﺑﻪ ﻛﻨﺘﺮل ﻛﻨﻨﺪه ي Slew Rateﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻛﺎراﻳﻲ ﺑﺎس I2Cرا در ﻓﺮﻛـﺎﻧﺲ
ﻫﺎي ﺑﺎﻻ )ﻧﺰدﻳﻚ 400ﻛﻴﻠﻮﻫﺮﺗﺰ( ﺑﻬﺒﻮد ﻣﻲ ﺑﺨﺸﺪ .ﻋﻤﻠﻜﺮد ﻛﻨﺘﺮل ﻛﻨﻨﺪه ﺑﻪ اﻳـﻦ ﺻـﻮرت اﺳـﺖ ﻛـﻪ ﻟﺒـﻪ ﻫـﺎي ﺗﻴـﺰ
ﺳﻴﮕﻨﺎل را ﺗﺎ ﺣﺪودي ﺻﺎف ﻛﺮده و در واﻗﻊ ﺑﺎ ﺣﺬف ﻫﺎرﻣﻮﻧﻴﻚ ﻫﺎي ﺑﺎﻻ ﺑﻪ ﻛﺎﻫﺶ EMIﻛﻤﻚ ﻣﻲ ﻛﻨﺪ.
.8ﻋﺪم ﻧﻴﺎز ﺑﻪ ﻃﺮاﺣﻲ ﻣﺪار واﺳﻂ و راه اﻧﺪازي ﺑﺎس ﺗﻨﻬﺎ ﺑﺎ دو ﻣﻘﺎوﻣﺖ زﻳﺮا ﻛﻪ ﻣﺪار ﻛﻨﺘﺮل ﺑﺎس ﺑﻪ ﺻﻮرت ﻣﺠﺘﻤﻊ
:Masterوﺳﻴﻠﻪ اي اﺳﺖ ﻛﻪ ﺷﺮوع ﻛﻨﻨﺪه ي ارﺳﺎل اﻃﻼﻋﺎت و ﺗﻮﻟﻴﺪ ﻛﻨﻨـﺪه ي ﭘـﺎﻟﺲ ﻛـﻼك و ﭘﺎﻳـﺎن دﻫﻨـﺪه ي
P a g e | 141
www.avr.ir
:Arbitrationﻣﻜﺎﻧﻴﺴﻤﻲ ﻛﻪ اﻃﻤﻴﻨﺎن ﻣﻲ دﻫﺪ ﻛﻪ اﮔﺮ ﺑﻴﺶ از ﻳﻚ Masterﻫﻤﺰﻣﺎن ﺑﺨﻮاﻫﻨﺪ ﺑﺎس را ﺑﻪ ﻛﻨﺘﺮل
ﺧﻮد درآورﻧﺪ ،ﺗﻨﻬﺎ ﻳﻜﻲ از آن ﻫﺎ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﻣﻮﻓﻖ ﺷﻮد.
P a g e | 142
www.avr.ir
وﺿﻌﻴﺖ idleﻳﺎ ﺑﻴﻜﺎري ﺑﺎس ﺑﺎ ﺳﻄﺢ Float Highﻣﺸﺨﺺ ﻣﻲ ﺷﻮد و ﺑﺎ ﺗﻮﺟﻪ ﺑﺎ اﻳﻦ ﻣﺴﺌﻠﻪ ﻧﻘﺶ ﻣﻘﺎوﻣﺖ ﻫﺎي
Pull-upﻣﺸﺨﺺ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻣﻘﺪار ﺗﻘﺮﻳﺒﻲ آن ﻫﺎ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺳﺮﻋﺖ ارﺗﺒﺎط ﺑﻪ ﻃﻮر ﺗﻘﺮﻳﺒﻲ از ﺷﻜﻞ زﻳﺮ ﺑﺪﺳـﺖ
ﻣﻲ آﻳﺪ:
ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ اﺳﺘﻔﺎده از ﻳﻚ ﻣﻘﺎوﻣـﺖ Pull-upﻣﺸـﺘﺮك ﺑﺎﻋـﺚ اﻳﺠـﺎد ﻳـﻚ ﺑـﺎس
Wired-ANDﻣﻲ ﺷﻮد ،ﺑﺪﻳﻦ ﻣﻌﻨﺎ ﻛﻪ ﺑﺮاي ﺻﻔﺮ ﺷﺪن ﺑﺎس ﺗﻨﻬﺎ ﻻزم اﺳﺖ ﻛﻪ ﻳﻜﻲ از وﺳﺎﻳﻞ ﺧﻂ را Lowﻛﻨﺪ.
ﻫﺮ ﭼﻨﺪ ﺗﻜﻨﻴﻚ اراﺋـﻪ ﺷـﺪه در ﻣـﻮرد Open-collectorﺑـﻮدن و ﻣﻘﺎوﻣﺘﻬـﺎي Pull-upداراي ﻣﺰﻳـﺖWired-
ANDﻣﻲ ﺑﺎﺷﺪ وﻟﻲ اﻳﻦ ﻣﻮﺿﻮع در ﻣﻮرد ﺧﻄﻮط ﻃﻮﻻﻧﻲ ﻛﻪ داراي ﻳﻚ ﻇﺮﻓﻴﺖ ﺧﺎزﻧﻲ ﻣﻲ ﺑﺎﺷـﻨﺪ ﺑﺎﻋـﺚ اﻳﺠـﺎد
ﻳﻚ ﺛﺎﺑﺖ زﻣﺎﻧﻲ RCﻣﻲ ﮔﺮدد ﻛﻪ ﺑﺮاي رﻓﻊ اﻳﻦ ﻣﻮﺿﻮع ﺑﻪ ﺟﺎي ﻣﻘﺎوﻣﺖ ﻣﻲ ﺗﻮان از Pull-upﻓﻌﺎل و ﻳﺎ ﺑﺎﻓﺮﻫﺎي
P a g e | 143
www.avr.ir
وﻳﮋه اي ﻛﻪ ﺗﻮﺳﻂ ﺷﺮﻛﺖ ﻓﻴﻠﻴﭙﺲ اراﺋﻪ ﺷﺪه اﺳﺖ اﺳﺘﻔﺎده ﻧﻤﻮد .ﻛﺎﻫﺶ ﻣﻘﺎوﻣﺖ در ﺳـﻄﺢ Highﺑﻮﺳـﻴﻠﻪ ي ﻳـﻚ
ﺳﻮﻳﻴﭻ ،ﺑﺎﻋﺚ ﺷﺎرژ ﺷﺮﻳﻊ ﺧﺎزن ﭘﺎرازﻳﺘﻲ ﺷﺪه و در ﻧﺘﻴﺠﻪ زﻣﺎن ﺻﻌﻮد و ﻧﺰول ﭘﺎﻟﺲ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ.
ﺑﺎس I2Cداراي ﺗﻌﺪادي وﺿﻌﻴﺖ ﻳﺎ ﻋﻨﺼﺮ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ وﺿﻌﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﭼﻪ زﻣﺎﻧﻲ ﻳﻚ اﻧﺘﻘﺎل آﻏﺎز
ﺷﻮد ،ﺧﺎﺗﻤﻪ ﻳﺎﺑﺪ ،ﺗﺎﻳﻴﺪﻳﻪ ﮔﺮﻓﺘﻪ ﺷﻮد و ﻏﻴﺮه .ﺷﻤﺎي ﻛﻠﻲ اﻳﻦ ﻋﻨﺎﺻﺮ را در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ:
ﺷﺮاﻳﻂ آﻏﺎز ﻳﺎ :Start Conditionاز زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز اﻳﺠﺎد ﻣﻲ ﺷﻮد ﺗﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ،ﺑﺎس
Busyﻣﺤﺴﻮب ﻣﻲ ﺷﻮد .ﻧﻤﻮدار زﻣﺎﻧﻲ اﻳﺠﺎد اﻳﻦ وﺿﻌﻴﺖ ﺑﻪ اﻳﻦ ﺻﻮرت ﻣﻲ ﺑﺎﺷﺪ:
P a g e | 144
www.avr.ir
ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ :Stop Conditionﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎس آزاد ﺷﺪه و ﻣﻲ ﺗﻮاﻧﺪ ﺗﻮﺳﻂ ﻳﻚ Device
ﺷﺮاﻳﻂ ﺷﺮوع ﻣﺠﺪد ﻳﺎ :Restart Conditionاﻳﻦ وﺿﻌﻴﺖ زﻣﺎﻧﻲ ﻛﺎرﺑﺮد دارد ﻛﻪ وﺳﻴﻠﻪ ﺑﺨﻮاﻫﺪ ﺑﺪون از
دﺳﺖ دادن ﻛﻨﺘﺮل ﺑﺎس ،ﺷﺮاﻳﻂ آﻏﺎز دﻳﮕﺮي اﻳﺠﺎد ﻛﻨﺪ و ارﺗﺒﺎط ﺑﺎ Slaveدﻳﮕﺮي را آﻏﺎز ﻛﻨﺪ .ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
ﭼﻴﺰي ﺟﺰ ﻳﻚ ﺳﮕﻨﺎل ﺷﺮوع ﻛﻪ ﺑﻌﺪ از ﺳﻴﮕﻨﺎل ﭘﺎﻳﺎن آﻣﺪه اﺳﺖ ﻧﻤﻲ ﺑﺎﺷﺪ:
P a g e | 145
www.avr.ir
وﺿﻌﻴﺖ :Dataدر اﻳﻦ ﺣﺎﻟﺖ 8ﺑﻴﺖ اﻃﻼﻋﺎت ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد و ﻫﺮ ﺑﻴﺖ ﺑﺎ ﻳﻚ ﻛﻼك ﻫﻤﺮاﻫﻲ ﻣﻲ ﺷﻮد .ﺧﻂ
SDAدر ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﻛﻼك ﻣﻮﺟﻮد در SCLﻧﻤﻮﻧﻪ ﺑﺮداري ﻣﻲ ﺷﻮد و ﻣﻘﺪار ﺻﻔﺮ ﻳﺎ ﻳﻚ ﻣﻨﻄﻘﻲ از SDA
ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد .ﺑﻪ ﻣﻨﻈﻮر اﻳﻨﻜﻪ ﻣﻘﺪار ﺧﻮاﻧﺪه ﺷﺪه از SDAﻣﻌﺘﺒﺮ ﺑﺎﺷﺪ ﺑﺎﻳﺪ ﻣﻘﺪار SDAدر ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي
SCLﺗﻐﻴﻴﺮ ﻧﻜﻨﺪ و ﺑﻪ ﻃﻮر ﻛﻠﻲ وﺿﻌﻴﺖ ﺧﻂ SDAﺗﻨﻬﺎ در ﺣﺎﻟﺘﻲ ﻛﻪ SCLﺻﻔﺮ اﺳﺖ ﻣﺠﺎز ﺑﻪ ﺗﻐﻴﻴﺮ اﺳﺖ ،ﺗﻨﻬﺎ
وﺿﻌﻴﺖ :ACK/NACKوﺳﻴﻠﻪ ي ﮔﻴﺮﻧﺪه ﭘﺲ از درﻳﺎﻓﺖ 8ﺑﻴﺖ داده در ﺳﻴﻜﻞ ﻧﻬﻢ ﻛﻼك ﺑﺎ زﻣﻴﻦ ﻛﺮدن ﺧﻂ
SDAﺑﻪ ﻓﺮﺳﺘﻨﺪه ﭘﺎﺳﺦ ﻳﺎ Acknowledgeﻣﻲ دﻫﺪ .ﻳﻚ ﻣﺎﻧﺪن ﺧﻂ SDAدر ﻛﻼك ﻧﻬﻢ ﻧﻮﻋﻲ ﻋﺪم ﺗﺼﺪﻳﻖ
P a g e | 146
www.avr.ir
ﭘﺲ از ﻫﺮ ﺷﺮاﻳﻂ آﻏﺎز 7ﺑﻴﺖ آدرس وﺳﻴﻠﻪ ي ﻣﻘﺼﺪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻌﺪ از ﺑﻴﺖ ﻫﻔﺘﻢ ﻳﻚ ﺑﻴـﺖ ﺧﻮاﻧـﺪن ﻳـﺎ
ﻧﻮﺷﺘﻦ وﺟﻮد دارد .ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ Masterﻗﺼﺪ ﻧﻮﺷﺘﻦ روي وﺳﻴﻠﻪ را دارد و ﻳﻚ ﺑﻮدن آن
ﺑﻪ ﻃﻮر ﻛﻠﻲ وﺳﺎﻳﻞ I2Cداراي ﻳﻚ آدرس 7ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ اﻣﻜﺎن آدرس دﻫﻲ 128وﺳﻴﻠﻪ ي ﻣﺨﺘﻠﻒ را ﻓﺮاﻫﻢ
ﻣﻲ ﻛﻨﺪ .از اﻳﻦ ﺗﻌﺪاد 16آدرس رزرو ﺷﺪه ﻣﻲ ﺑﺎﺷﻨﺪ و در ﻧﺘﻴﺠﻪ ﺣﺪاﻛﺜﺮ 112وﺳﻴﻠﻪ ﺑﺮ روي ﻳﻚ ﺑﺎس ﻗﺎﺑﻞ آدرس
دﻫﻲ ﻫﺴﺘﻨﺪ .آدرس ﺻﻔﺮ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺑﻮده و ﭘﺲ از ارﺳﺎل اﻳﻦ آدرس ﺗﻤﺎم ﻣﻴﻜﺮوﻫﺎﻳﻲ ﻛﻪ ﺑﺎ زﻣﻴﻦ ﻛﺮدن
SDAﺑﻪ Masterﭘﺎﺳﺦ دﻫﻨﺪ ،داده ي 8ﺑﻴﺘﻲ را درﻳﺎﻓﺖ ﺧﻮاﻫﻨﺪ ﻛﺮد .ﭘﻴﻐﺎﻣﻲ ﻛﻪ ﺑﺮاي ﻫﻤﻪ Slaveﻫﺎ ﻓﺮﺳﺘﺎده
ﻣﻲ ﺷﻮد Broadcastﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد .اﻳﻦ ﻣﻲ ﺗﻮاﻧﺪ ﭘﻴﻐﺎﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺗﻮﺳﻂ Masterﺑﻪ ﺗﻤﺎﻣﻲ Slaveﻫﺎ دﺳﺘﻮر
ﻋﻼوه ﺑﺮ ﻣﺤﺪودﻳﺖ 112آدرس ،ﺗﻌﺪاد وﺳﺎﻳﻞ ﻣﺠﺎز روي ﺑﺎس ﺑﻮﺳﻴﻠﻪ ي ﻇﺮﻓﻴﺖ ﺧﺎزﻧﻲ 400ﭘﻴﻜﻮﻓﺎراد ﻧﻴﺰ ﻣﺤﺪود
ﻣﻲ ﺷﻮد.
P a g e | 147
www.avr.ir
ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ Masterﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺧﻮاﻫﺪ اﻃﻼﻋﺎﺗﻲ را ﺑﻪ ﻳﻜﻲ از Slaveﻫﺎ
ارﺳﺎل ﻛﻨﺪ:
در اﺑﺘﺪا ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻳﻚ وﺿﻌﻴﺖ ﺷﺮوع روي ﺑﺎس اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ،اﻳﻦ ﺳﻴﮕﻨﺎل ﻫﻤﻪ ي Slaveﻫﺎ را ﻣﺘﻮﺟﻪ ﺑﺎس
ﻣﻲ ﻛﻨﺪ و ﭘﺲ از آن ،Masterآدرس Slaveاي را ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﺑﺎ آن ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﺪ را روي ﺑﺎس ﻣﻲ ﻓﺮﺳﺘﺪ
و در ﺑﻴﺖ ﻫﺸﺘﻢ آن ﻣﺸﺨﺺ ﻣﻲ ﺳﺎزد ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ اﻃﻼﻋﺎت را از آن ﺑﺨﻮاﻧﺪ ﻳﺎ روي آن ﺑﻨﻮﻳﺴﺪ .ﺳﭙﺲ ﺗﻤﺎم
Slaveﻫﺎ آدرس را درﻳﺎﻓﺖ ﻛﺮده و ﺑﺎ آدرس ﺧﻮد ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﻨﺪ و وﺳﻴﻠﻪ اي ﻛﻪ آدرس ﺑﻪ آن ﺗﻌﻠﻖ داﺷﺘﻪ ﺑﺎﺷﺪ
ﺑﺎ زﻣﻴﻦ ﻛﺮدن SDAدر ﻛﻼك ﻧﻬﻢ ﻳﻚ ﺳﻴﮕﻨﺎل ACKاﻳﺠﺎد ﻛﺮده و ﺑﻪ Masterﭘﺎﺳﺦ ﻣﻲ دﻫﺪ .ﺑﻪ ﻣﺤﺾ
درﻳﺎﻓﺖ ﺳﻴﮕﻨﺎل ﺗﺼﺪﻳﻖ ﺗﻮﺳﻂ Masterﺗﺒﺎدل اﻃﻼﻋﺎت ﺑﺎ Slaveآﻏﺎز ﺷﺪه و در ﻧﻬﺎﻳﺖ ،Masterﻳﻚ وﺿﻌﻴﺖ
P a g e | 148
www.avr.ir
اﻳﻦ ﻣﺎژول دوره ي ﺗﻨﺎوب ﺧﻂ SCLرا در ﺣﺎﻟﺘﻲ ﻛﻪ ﺑﻪ ﺻﻮرت Masterﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ،ﻛﻨﺘـﺮل ﻣـﻲ ﻧﻤﺎﻳـﺪ .اﻳـﻦ
ﻋﻤﻞ ﺑﻮﺳﻴﻠﻪ ي ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴﺘﺮ TWBRو ﺑﻴﺖ ﻫﺎي ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه در رﺟﻴﺴﺘﺮ TWSRاﻧﺠـﺎم ﻣـﻲ ﺷـﻮد.
ﻋﻤﻠﻜﺮد Slaveﺑﺴﺘﮕﻲ ﺑﻪ ﺗﻨﻈﻴﻤﺎت ﻧﺮخ ﺑﻴﺖ و ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ﻧﺪارد اﻣﺎ ﻓﺮﻛﺎﻧﺲ CPUدر Slaveﺑﺎﻳﺪ ﺣﺪاﻗﻞ
ﺗﻮﺟﻪ :در ﺣﺎﻟﺘﻲ ﻛﻪ TWIﺑﻪ ﺻﻮرت Masterﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ﺑﺎﻳﺪ ﻣﻘﺪار TWBRﺑﺰرﮔﺘﺮ و ﻳﺎ ﻣﺴﺎوي 10ﺑﺎﺷﺪ،
در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻤﻜﻦ اﺳﺖ Masterﻛﻼك اﺷﺘﺒﺎه روي ﺧﻂ SCLﺗﻮﻟﻴﺪ ﻛﻨﺪ.
رﺟﻴﺴﺘﺮﻫﺎي TWI
ﺑﺨﺶ TWIداراي ﭘﻨﺞ رﺟﻴﺴﺘﺮ ﺑﻪ ﻧﺎم ﻫﺎي TWDR ،TWSR ،TWCR ،TWBRو TWARﻣﻲ ﺑﺎﺷﺪ.
P a g e | 149
www.avr.ir
اﻳﻦ رﺟﻴﺴﺘﺮ ﻓﺮﻛﺎﻧﺲ SCLرا ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ و ﻣﻘﺪار آن ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:
ﻣﺜﺎل) :1ﺗﻌﻴﻴﻦ TWBRﺑﺎ ﻛﺮﻳﺴﺘﺎل 8ﻣﮕﺎﻫﺮﺗﺰ و ﻓﺮﻛﺎﻧﺲ SCKﺑﺮاﺑﺮ 100ﻛﻴﻠﻮﻫﺮﺗﺰ و (TWPS = 0
8000000 − 16 × 100000
= TWBR = 32
2 × 100000 × 40
TWC
7 6 5 4 3 2 1 0
R
TWIN TWE TWST TWST TWW TWE TWI
ﻧﺎم ﺑﻴﺖ -
T A A O C N E
اﻳﻦ رﺟﻴﺴﺘﺮ وﻇﻴﻔﻪ ي ﻛﻨﺘﺮل TWIرا ﺑﺮ ﻋﻬﺪه دارد و ﻋﻤﻠﻜﺮد ﺑﻴﺖ ﻫﺎي آن ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:
P a g e | 150
www.avr.ir
:TWI Interrupt Enableﺑﺎ ﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔـﻪ ﻫـﺎ Setﺷـﺪه
ﺑﺎﺷﺪ ،ﺑﺎ ﻓﻌﺎل ﺷﺪن ﭘﺮﭼﻢ 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ﺷﺪن ،اﻳﺠﺎد ﻳـﻚ
ﺷﺮاﻳﻂ آﻏﺎز ﻣﻲ ﻛﻨﺪ .ﺳﺨﺖ اﻓﺰار ﺑﺎس را ﭼﻚ ﻛﺮده و در ﺻﻮرﺗﻲ ﻛﻪ آزاد ﺑﺎﺷﺪ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز ﻣﻲ ﻛﻨـﺪ ،در
P a g e | 151
www.avr.ir
ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﺎژول 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ﻫﻴﭻ ﻋﻤﻠﻲ اﻧﺠﺎم ﻧﺨﻮاﻫﺪ داد.
P a g e | 152
www.avr.ir
TWS
7 6 5 4 3 2 1 0
R
TWS TWS TWS TWS TWS TWPS TWPS
ﻧﺎم ﺑﻴﺖ -
7 6 5 4 3 1 0
] :TWI Prescaler Bits[1:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﻘﺪار ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ
ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
TWPS TWPS
ﻣﻘﺪار ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه
1 0
0 0 1
] :TWI Status[7:3اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻧﻤﺎﻳﺎﻧﮕﺮ وﺿﻌﻴﺖ TWIﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ در ﺑﺮرﺳﻲ Modeﻫﺎي ﻛﺎري ﻋﻤﻠﻜﺮد
P a g e | 153
www.avr.ir
در ﺣﺎﻟﺖ اﻧﺘﻘﺎل TWDR ،ﻣﺤﺘﻮي ﺑﺎﻳﺖ ﺑﻌﺪي اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ ارﺳﺎل ﺷﻮد و در ﺣﺎﻟﺖ درﻳﺎﻓﺖ ﺷﺎﻣﻞ آﺧﺮﻳﻦ ﺑﺎﻳﺖ
درﻳﺎﻓﺘﻲ اﺳﺖ .اﻳﻦ رﺟﻴﺴﺘﺮ ﺗﻨﻬﺎ در ﺣﺎﻟﺘﻲ ﻛﻪ TWIدر ﺣﺎل اﻧﺘﻘﺎل اﻃﻼﻋﺎت ﻧﺒﺎﺷﺪ و ﭘﺮﭼﻢ TWINTﻳﻚ ﺷﺪه
:TWI (Slave) Address Registerاﻳﻦ رﺟﻴﺴﺘﺮ آدرس Slaveدر وﺿﻌﻴﺖ ﻫﺎي STو SRﻣﻲ ﺑﺎﺷﺪ.
TWA
7 6 5 4 3 2 1 0
R
TWA TWA TWA TWA TWA TWA TWA TWGC
ﻧﺎم ﺑﻴﺖ
6 5 4 3 2 1 0 E
:TWI General Call Recognition Enableآدرس 0x00ﻣﺮﺑﻮط ﺑﻪ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺑﻮده و ﺗﺸﺨﻴﺺ
ﻧﺎم ﮔﺬاري ﻫﺎي زﻳﺮ ﺑﻪ ﺻﻮرت ﻗﺮارداد در اداﻣﻪ اﺳﺘﻔﺎده ﺧﻮاﻫﻨﺪ ﺷﺪ:
P a g e | 154
www.avr.ir
Data: 8-bit data byte
P: STOP condition
SLA: Slave Address
در اﻳﻦ Modeاﺑﺘﺪا ﺗﻮﺳﻂ Masterﻳﻚ وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه و ﺑﻠﻮك آدرﺳﻲ ﻛﻪ در اداﻣﻪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷـﻮد
ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ Masterﮔﻴﺮﻧﺪه ﻳﺎ ﻓﺮﺳﺘﻨﺪه اﺳﺖ .اﮔـﺮ ﭘـﺲ از اﻳﺠـﺎد ﺣﺎﻟـﺖ ﺷـﺮوع SLA+Wارﺳـﺎل ﮔـﺮدد
Masterوارد ﺣﺎﻟﺖ ارﺳﺎل ﺷﺪه و در ﺻﻮرﺗﻲ ﻛﻪ SLA+Rارﺳﺎل ﺷﻮد وارد ﺣﺎﻟﺖ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮد.
TWC
7 6 5 4 3 2 1 0
R
TWIN TWE TWST TWST TWW TWE TWI
ﻧﺎم ﺑﻴﺖ -
T A A O C N E
ﻣﻘﺪار 1 X 1 0 X 1 0 X
P a g e | 155
www.avr.ir
TWIEﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ي TWIﺑﻮده و ﻣﻘﺪار آن اﺧﺘﻴﺎري ﻣﻲ ﺑﺎﺷﺪ.
TWWCﻛﻪ ﻳﻚ ﺑﻴﺖ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ در اﻳﻦ ﺣﺎﻟﺖ ﺻﻔﺮ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد زﻳﺮا ﻧﺮم اﻓﺰار ﻫﻨﻮز ﻣﻘـﺪاري را را
روي TWDRﻧﻨﻮﻧﺸﺘﻪ اﺳﺖ و ﺑﻨﺎﺑﺮاﻳﻦ Collisionﻳﺎ ﺗﺼﺎدﻣﻲ ﻧﻴﺰ ﭘﻴﺶ ﻧﻴﺎﻣﺪه اﺳﺖ.
TWSTOﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا در اﻳﻨﺠﺎ ﻧﻤﻲ ﺧﻮاﻫﻴﻢ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن اﻳﺠﺎد ﺷﻮد.
TWSAﻳﻚ ﺑﻮده ﺗﺎ ﻣﺎژول TWIدر ﺻﻮرت آزاد ﺑﻮدن ﺑﺎس ،ﺷﺮاﻳﻂ آﻏﺎز را اﻳﺠـﺎد ﻛـﺮده و در ﻏﻴـﺮ اﻳﻨﺼـﻮرت
TWEAﻣﻘﺪاري ﺑﻲ اﻫﻤﻴﺖ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا ﺑﺎ ﻓﺮض Setﻛﺮدن آن در ﺷﺮاﻳﻂ آﻏﺎز ﻫﻴﭻ ﮔـﺎه ACKﻧﻴـﺎز ﻧﺒـﻮده و
TWINTﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﭘﺎك ﻣﻲ ﺷﻮد ﺗﺎ TWIﺷﺮوع ﺑﻪ اﻧﺠﺎم ﻓﺮﻣﺎن داده ﺷﺪه ﺗﻮﺳﻂ رﺟﻴﺴﺘﺮ TWCRﻛﻨﺪ.
ﭘﺲ از اﺟﺮاي ﺗﻨﻈﻴﻤﺎت ﻓﻮق در ﺻـﻮرت آزاد ﺑـﻮدن ﺑـﺎس ﻣـﺎژول TWIﺷـﺮاﻳﻂ آﻏـﺎز را اﻳﺠـﺎد ﻛـﺮده و در ﻏﻴـﺮ
اﻳﻨﺼﻮرت ﻣﻨﺘﻄﺮ آزاد ﺷﺪن ﺑﺎس ﺷﺪه و ﺑﻪ ﻣﺤﺾ ﺗﺸﺨﻴﺺ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻛﻨﺘﺮل ﺑﺎس را ﺑﻪ دﺳﺖ ﮔﺮﻓﺘﻪ و ﺷﺮاﻳﻂ
آﻏﺎز را اﻳﺠﺎد ﻣﻲ ﻧﻤﺎﻳﺪ ،ﭘﺲ از آن ﭘﺮﭼﻢ TWINTﻳﻚ ﺷﺪه و ﻛـﺪ وﺿـﻌﻴﺖ ﻣﻮﺟـﻮد در TWSRﺑﺮاﺑـﺮ 0x08
ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺮاي ورود ﺑﻪ وﺿﻌﻴﺖ MTﺑﺎﻳﺪ روي TWDRﻣﻘﺪار SLA+Wﻧﻮﺷﺘﻪ ﺷﺪه و ﭘﺲ از آن ﺑﺎ ﻧﻮﺷـﺘﻦ
ﻳﻚ روي TWINTآن را ﭘﺎك ﻛﺮده ﺗـﺎ ﻣﺮﺣﻠـﻪ ي ﺑﻌـﺪ آﻏـﺎز ﺷـﻮد .ﭘـﺲ از ﻧﻮﺷـﺘﻦ SLA+Wروي TWDR
TWC
7 6 5 4 3 2 1 0
R
ﻧﺎم ﺑﻴﺖ TWIN TWE TWST TWST TWW TWE - TWI
P a g e | 156
www.avr.ir
T A A O C N E
ﻣﻘﺪار 1 X 0 0 X 1 0 X
ﺗﻔﺎوت ﺑﺎ ﻣﺮﺣﻠﻪ ي ﻗﺒﻞ اﻳﻦ اﺳﺖ ﻛﻪ از آﻧﺠﺎﻳﻲ ﻛﻪ ﻧﻴﺎز ﺑﻪ ﺷﺮاﻳﻂ آﻏﺎز وﺟﻮد ﻧﺪارد ﺑﻴﺖ TWSTAﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ.
ﺑﺎ ﻓﺮﺳﺘﺎده ﺷﺪن SLA+Wو درﻳﺎﻓﺖ ACKﻣﺠﺪدا ﺑﻴﺖ TWINTﻳﻚ ﺷﺪه و در اﻳﻦ ﺷﺮاﻳﻂ ﻳﻜﻲ از ﭼﻨـﺪ ﻛـﺪ
0x18 ،0x20ﻳﺎ 0x38در TWSRﻗﺮار ﻣﻲ ﮔﻴﺮد .در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﻣﻘﺪار ﺑﺮاﺑﺮ 0x18ﺑﺎﺷﺪ ﺑﺪﻳﻦ ﻣﻌﻨﺎﺳﺖ ﻛﻪ
آدرس ارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ .ﭘﺲ از اﻳﻦ ﺑﺎﻳﺪ ﺑﻠﻮك داده ارﺳﺎل ﺷﻮد .ﻫﻤﺎﻧﻨـﺪ ﺣﺎﻟـﺖ ﻗﺒـﻞ اﺑﺘـﺪا
ﻣﻘﺪار ﻣﻮرد ﻧﻈﺮ در رﺟﻴﺴﺘﺮ TWDRﻧﻮﺷﺘﻪ ﺷﺪه و ﺑﺎ ﭘﺎك ﻛـﺮدن ﺑﻴـﺖ TWINTداده ي 8ﺑﻴﺘـﻲ ﺗﻮﺳـﻂ TWI
ارﺳﺎل ﺧﻮاﻫﺪ ﺷﺪ .در ﺻﻮرﺗﻲ ﻛـﻪ رﺟﻴﺴـﺘﺮ TWDRﺑﻌـﺪ از ﭘـﺎك ﻛـﺮدن TWINTﻣﻘـﺪاردﻫﻲ ﺷـﻮد رﺟﻴﺴـﺘﺮ
TWWCﻳﻚ ﺷﺪه و اﻋﻼم ﻳﻚ ﺣﺎﻟﺖ ﺗﺼﺎدم را ﻣﻲ ﻛﻨﺪ .ﺗﻨﻈﻴﻤﺎت TWCRﻫﻤﺎﻧﻨﺪ ﺣﺎﻟﺖ ﻗﺒﻞ ﺑـﻪ ﺻـﻮرت زﻳـﺮ
ﺧﻮاﻫﺪ ﺑﻮد:
TWC
7 6 5 4 3 2 1 0
R
TWIN TWE TWST TWST TWW TWE TWI
ﻧﺎم ﺑﻴﺖ -
T A A O C N E
ﻣﻘﺪار 1 X 0 0 X 1 0 X
اﻳﻦ ﻣﺮﺣﻠﻪ ﺗﺎ اﺗﻤﺎم ارﺳﺎل ﺗﻤﺎم ﺑﺎﻳﺖ ﻫﺎي داده ﺗﻜﺮار ﻣﻲ ﺷﻮد و ﺳﺮاﻧﺠﺎم ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ ﺷﺮوع ﻣﺠـﺪد
ﭘﺎﻳﺎن ﻣﻲ ﻳﺎﺑﺪ .ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎ ﻣﻘﺪاردﻫﻲ رﺟﻴﺴﺘﺮ TWCRﺑﻪ ﺻﻮرت زﻳﺮ اﻳﺠﺎد ﻣﻲ ﺷﻮد:
P a g e | 157
www.avr.ir
R
TWIN TWE TWST TWST TWW TWE TWI
ﻧﺎم ﺑﻴﺖ -
T A A O C N E
ﻣﻘﺪار 1 X 0 1 X 1 0 X
TWC
7 6 5 4 3 2 1 0
R
TWIN TWE TWST TWST TWW TWE TWI
ﻧﺎم ﺑﻴﺖ -
T A A O C N E
ﻣﻘﺪار 1 X 1 0 X 1 0 X
ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد ﻣﻘﺪار رﺟﻴﺴﺘﺮ TWSRﺑﺮاﺑﺮ 0x10ﺧﻮاﻫﺪ ﺑﻮد و اﻳﻦ ﻗﺎﺑﻠﻴﺖ ﺑﻪ Masterاﺟﺎزه
ﻣﻘﺎدﻳﺮ رﺟﻴﺴﺘﺮ TWSRدر وﺿﻌﻴﺖ ﻫﺎي ﻣﺨﺘﻠﻒ ﺣﺎﻟﺖ Master Transmitterﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
0x08 وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه اﺳﺖ. ارﺳﺎل SLA+Wو درﻳﺎﻓﺖ ACKﻳﺎ NACK
P a g e | 158
www.avr.ir
ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK
0x18 ﺑﺎﻳﺖ SLA+Wارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ. اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
0x28 ﺑﺎﻳﺖ داده ارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ. اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
0x30 ﺑﺎﻳﺖ داده ارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﻧﺸﺪه اﺳﺖ. اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
0x38 ﻛﻨﺘﺮل ﺑﺎس از دﺳﺖ رﻓﺘﻪ اﺳﺖ. ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع و ﺗﻼش ﺑﺮاي ﻛﻨﺘﺮل ﻣﺠﺪد آن
ﻣﺜﺎل) :2ارﺳﺎل ﻋﺪد 0x77ﺑﻪ Slaveﺑﺎ آدرس 0xA0و ﺑﺎ ﻧﺮخ ﺑﻴﺖ 100ﻛﻴﻠﻮﻫﺮﺗﺰ(
>#include <mega16.h
#define xtal 8000000
)(void main
{
P a g e | 159
www.avr.ir
P a g e | 160
www.avr.ir
//------------------------------------------------
error:
;)while(1
}
در اﻳﻦ وﺿﻌﻴﺖ Masterاﻃﻼﻋﺎت را از Slaveدرﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و ﺑﺮاي اﻳﺠﺎد آن ﺑﺎﻳﺪ ﭘﺲ از اﻳﺠﺎد ﺷـﺮاﻳﻂ آﻏـﺎز
ﺑﺮ ﺧﻼف ﺣﺎﻟﺖ ﻗﺒﻞ SLA+Rﺑﻪ Slaveﻓﺮﺳﺘﺎده ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﺷﺮاﻳﻂ آﻏﺎز ﺑﻪ درﺳـﺘﻲ اﻳﺠـﺎد ﺷـﺪه ﺑﺎﺷـﺪ
ﺑﻴﺖ TWINTﻳﻚ ﺷﺪه و ﻣﻘﺪار TWSRﺑﺮاﺑﺮ 0x08ﻣﻲ ﺷـﻮد ،ﺑـﺮاي ارﺳـﺎل SLA+Rﺑﺎﻳـﺪ ﻣﻘـﺪار آن را در
زﻣﺎﻧﻲ ﻛﻪ SLA+Rﻓﺮﺳﺘﺎده ﺷﻮد و ACKدرﻳﺎﻓﺖ ﺷﻮد ﺑﻴـﺖ TWINTﻳـﻚ ﺷـﺪه و در اﻳـﻦ ﺷـﺮاﻳﻂ ﻳﻜـﻲ از
0x08 وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه اﺳﺖ. ارﺳﺎل SLA+Rو درﻳﺎﻓﺖ ACKﻳﺎ NACK
0x38 ﻛﻨﺘﺮل ﺑﺎس از دﺳﺖ رﻓﺘﻪ اﺳﺖ. ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع و ﺗﻼش ﺑﺮاي ﻛﻨﺘﺮل ﻣﺠﺪد آن
0x40 ﺑﺎﻳﺖ SLA+Rارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ. درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
P a g e | 161
www.avr.ir
0x50 درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACK درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
در ﺻﻮرﺗﻲ ﻛﻪ SLA+Rارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه ﺑﺎﺷﺪ ﺑﻌﺪ از ﻳـﻚ ﺷـﺪن TWINTداده ي درﻳﺎﻓـﺖ
ﺷﺪه در TWDRﻣﻲ ﺗﻮاﻧﺪ ﺧﻮاﻧﺪه ﺷﻮد .اﻳﻦ ﻛﺎر ﺗﺎ درﻳﺎﻓﺖ آﺧﺮﻳﻦ ﺑﺎﻳـﺖ ﺗﻜـﺮار ﺷـﺪه و ﺑﻌـﺪ از آن Masterﺑـﺎ
ﻓﺮﺳﺘﺎدن NACKﺑﻪ Slaveاﻋﻼم ﻣﻲ ﻛﻨﺪ ﻛﻪ دﻳﮕﺮ ﻗﺼﺪ ﺧﻮاﻧﺪن از آن را ﻧﺪارد و در ﻧﺘﻴﺠـﻪ ﻣـﻲ ﺗـﻮان ﻋﻤﻠﻴـﺎت
ﻣﺜﺎل ) :3ﺧﻮاﻧﺪن 2ﺑﺎﻳﺖ داده از Slaveﺑﺎ آدرس 0xA0و ﻧﺮخ ﺑﻴﺖ 100ﻛﻴﻠﻮﻫﺮﺗﺰ(
>#include <mega16.h
#define xtal 8000000
;char incoming_data
)(void main
{
P a g e | 163
www.avr.ir
while(TWCR&0x80==0); // Waiting for TWINT flag
//------------------------------------------------
error:
while(1);
. درﻳﺎﻓـﺖ ﻣـﻲ ﻛﻨـﺪMaster Transmitter ﺑﻮده و اﻃﻼﻋـﺎت را ازSlave ،در اﻳﻦ وﺿﻌﻴﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﮔﻴﺮﻧﺪه
ﻳـﻚ ﺷـﻮدLSB و ﭼﻨﺎﻧﭽـﻪ ﺑﻴـﺖ. ﻗـﺮار ﮔﻴـﺮدTWAR ﺑﻴﺖ ﺑـﺎﻻي7 درSlave ﺑﺮاي ﺷﺮوع ﺑﻪ ﻛﺎر ﺑﺎﻳﺪ آدرس
. ﻗﺎدر ﺑﻪ ﭘﺎﺳﺨﮕﻮﻳﻲ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﻧﻴﺰ ﺧﻮاﻫﺪ ﺑﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت آن را ﻧﺎدﻳﺪه ﺧﻮاﻫﺪ ﮔﺮﻓﺖMaster
TWAR 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ TWAR[7:1] X
P a g e | 164
www.avr.ir
TWC
7 6 5 4 3 2 1 0
R
TWIN TWE TWST TWST TWW TWE TWI
ﻧﺎم ﺑﻴﺖ -
T A A O C N E
ﻣﻘﺪار 1 1 0 0 0 1 0 X
ﺑﻴﺖ ﻫﺎي TWSTAو TWSTOﺻﻔﺮ ﻣﻲ ﺑﺎﺷﻨﺪ زﻳﺮا اﻳﺠﺎد ﺷﺮاﻳﻂ آﻏﺎز و ﭘﺎﻳﺎن ﺑﺮ ﻋﻬﺪه ي Masterﻣﻲ ﺑﺎﺷﺪ.
ﺑﻌﺪ از ﭘﻴﻜﺮﺑﻨﺪي ،Slaveﻣﻨﺘﻈﺮ ﺷﺪه ﺗﺎ ﺗﻮﺳﻂ Masterآدرس دﻫﻲ ﺷﺪه و ﻳﺎ ﻳﻚ ﻓﺮاﺧﻮان ﻋﻤﻮﻣﻲ درﻳﺎﻓـﺖ ﻛﻨـﺪ.
اﮔﺮ در آدرس درﻳﺎﻓﺖ ﺷﺪه ﺑﻴﺖ ﺟﻬﺖ ) (W/Rﺻﻔﺮ ﺑﺎﺷﺪ ﻧﺸﺎن دﻫﻨـﺪه ي اﻳـﻦ اﺳـﺖ ﻛـﻪ Masterﻣـﻲ ﺧﻮاﻫـﺪ
ﻣﻘـﺪاري را ﺑـﻪ Slaveﺑﻔﺮﺳـﺘﺪ ﻛـﻪ در اﻳﻨﺼـﻮرت Slaveوارد وﺿـﻌﻴﺖ ) Slave Read (SRﺷـﺪه و در ﻏﻴـﺮ
اﻳﻨﺼﻮرت در ﺣﺎﻟﺖ ) Slave Transmiter (STﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ .ﭘﺲ از درﻳﺎﻓﺖ SLA+Wﺑﻴﺖ TWINT
0x60 ﺑﺎﻳﺖ SLA+Wدرﻳﺎﻓﺖ ﺷﺪه و ACKارﺳﺎل ﺷﺪه اﺳﺖ. درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
P a g e | 165
www.avr.ir
0x70 ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ رﻳﺎﻓﺖ ﺷﺪه و ACKارﺳﺎل ﺷﺪه اﺳﺖ. درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
0x80 درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKدر ﻓﺮاﺧﻮاﻧﻲ اﺧﺘﺼﺎﺻﻲ درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
0x90 درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKدر ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
در ﺻﻮرﺗﻲ ﻛﻪ ﻛﺪ ﺧﻮاﻧﺪه ﺷﺪه 0x60ﺑﺎﺷﺪ آدرس ﺑﺪرﺳﺘﻲ ﺗﻮﺳﻂ Slaveدرﻳﺎﻓﺖ ﺷﺪه و ﺑﺮاي Masterﺗﺼـﺪﻳﻖ
) (ACKﻧﻴﺰ ارﺳﺎل ﺷﺪه اﺳﺖ .ﭘﺲ از اﻳﻦ Slaveﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻳﺖ ﻫﺎي داده را درﻳﺎﻓﺖ ﻛﺮده و ﺗـﺎ زﻣـﺎﻧﻲ ﻛـﻪ ﻳـﻚ
ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ ﺷﺮوع ﻣﺠﺪد اﻳﺠﺎد ﺷﻮد اﻳﻦ روﻧﺪ اداﻣﻪ ﺧﻮاﻫﺪ داﺷﺖ ﻛﻪ در اﻳﻦ ﺻﻮرت ﻣﻘـﺪار رﺟﻴﺴـﺘﺮ TWSR
ﻣﺜﺎل ) :4درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ داده ﺗﻮﺳﻂ Slaveﺑﺎ آدرس 0x01و ﻧﺮخ ﺑﻴﺖ 100ﻛﻴﻠﻮﻫﺮﺗﺰ(
>#include <mega16.h
#define xtal 8000000
;char incoming_data
)(void main
{
P a g e | 166
www.avr.ir
P a g e | 167
www.avr.ir
//---------- Receiving Stop Condition ----------
error:
;)while(1
}
اﻳﻦ وﺿﻌﻴﺖ ﻣﺸﺎﺑﻪ SRﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺑﻌﺪ از درﻳﺎﻓﺖ آدرس ﺑﻴﺖ W/Rﻳﻚ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ
ﭘﺲ از درﻳﺎﻓﺖ آدرس ﺑﻴﺖ TWINTﻳﻚ ﺷﺪه و ﻣﻲ ﺗﻮان ﻛﺪ وﺿﻌﻴﺖ ﺟﺎري را از TWSRﺑﺪﺳﺖ آورد ،ﺑﻌﺪ ار
ارﺳﺎل ﻫﺮ ﺑﺎﻳﺖ داده از Master ،Slaveﺑﺎ ﻓﺮﺳﺘﺎدن ACKآن را ﺗﺼﺪﻳﻖ ﻣﻲ ﻛﻨﺪ و ﭼﻨﺎﻧﭽﻪ Masterﺑﺨﻮاﻫﺪ
0xA8 ﺑﺎﻳﺖ SLA+Rدرﻳﺎﻓﺖ ﺷﺪه و ACKارﺳﺎل ﺷﺪه اﺳﺖ. ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK
P a g e | 168
www.avr.ir
ﻛﻨﺘﺮل ﺑﺎس در ﺣﻴﻦ ارﺳﺎل SLA + Wﺗﻮﺳﻂ Masterاز
0xB0 ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK
دﺳﺖ رﻓﺘﻪ اﺳﺖ.
0xB8 ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACK ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK
ﻣﺜﺎل ) :5ﺧﻮاﻧﺪن ﻳﻚ ﺑﺎﻳﺖ داده از Slaveﺑﺎ آدرس 0x01و ﻧﺮخ ﺑﻴﺖ 100ﻛﻴﻠﻮﻫﺮﺗﺰ(
>#include <mega16.h
#define xtal 8000000
)(void main
{
error:
while(1);
}
:ﻫﻤﺰﻣﺎن ﺳﺎزي ﭘﺎﻟﺲ ﺳﺎﻋﺖ
ﻗﺮار ﻣﻲ دﻫﺪ وSCL ﭘﺎﻟﺲ ﺳﺎﻋﺖ ﺧﻮد را ﺑﺮ رويMaster ﻫﺮ. ﻫﺎ ﺗﻮﻟﻴﺪ ﻣﻲ ﮔﺮددMaster ﭘﺎﻟﺲ ﺳﺎﻋﺖ ﺗﻮﺳﻂ
ﺷﺪه و ﺑﺎﻋـﺚ ﺗﻮﻟﻴـﺪ ﻳـﻚ ﭘـﺎﻟﺲAND ﭘﺎﻟﺲ ﺳﺎﻋﺖ ﻫﺎ ﺑﺎ ﻫﻢI2C در ﺑﺎسwired-AND ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺧﺎﺻﻴﺖ
P a g e | 170
www.avr.ir
ﻫﺮ Masterﺗﻨﻬﺎ در زﻣﺎﻧﻲ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺑﺎس دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﺪ ﻛـﻪ ﺧـﻂ SDAآزاد ﺑﺎﺷـﺪ .اﻣـﺎ ﭘﺮوﺗﻜـﻞ I2Cﺑـﻪ
ﺷﻜﻠﻲ ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ ﻛﻪ در ﺻﻮرﺗﻴﻜﻪ در ﺷﺮاﻳﻂ آزاد ﺑـﻮدن ﺑـﺎس دو ﻳـﺎ ﭼﻨـﺪ Masterﻫﻤﺰﻣـﺎن درﺧﻮاﺳـﺖ
دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﺎس را داﺷﺘﻪ ﺑﺎﺷﻨﺪ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ارﺗﺒﺎط ﺣﻔـﻆ ﺷـﻮد .در اﻳﻨﺠـﺎ ﻧﻴـﺰ وﺟـﻮد ﺧﺎﺻـﻴﺖ
Wired-ANDﺑﺎﻋﺚ ﺣﻞ ﻣﺸﻜﻞ ﻣﻲ ﮔﺮدد ﻳﻌﻨﻲ ﭼﻨﺪ Masterﺑﻄﻮر ﻫﻤﺰﻣﺎن داده ﻫﺎﻳﺸﺎن را ﺑﺮ روي ﺧﻂ SDA
ﺑﻪ ﺻﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ دارﻧﺪ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺑﺎ ﻫﻢ ANDﺷﺪه و ﺑﺮ روي ﺑﺎس ﻳﻚ دﻳﺘﺎي واﺣﺪ را اﻳﺠﺎد ﻣـﻲ
ﻛﻨﺪ ،در اوﻟﻴﻦ ﻣﻜﺎﻧﻲ ﻛﻪ ﺧﻂ SDAﺑﺎ ﺧﻂ داده ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ Masterﻣﻄﺎﺑﻘـﺖ ﻧﺪاﺷـﺖ آن Masterﺧـﻂ داده
ﺳﺮﻳﺎل را در ﺳﻄﺢ ﻳﻚ ﻣﻨﻄﻘﻲ رﻫﺎ ﻣﻲ ﻛﻨﺪ )ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ وﺟﻮد Pull-upﺳﻄﺢ ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ( ﺗـﺎ
P a g e | 171
www.avr.ir
ﻫﻤﺎن ﻃﻮر ﻛﻪ دﻳﺪه ﻣﻲ ﺷﻮد ﻣﺴﺎﻟﻪ Arbitrationﺗﻨﻬﺎ در ﻣﻮرد ﺣﺎﻟﺘﻲ ﻣﻌﻨﻲ دارد ﻛﻪ ﭼﻨـﺪ Masterداﺷـﺘﻪ ﺑﺎﺷـﻴﻢ
زﻳﺮا:
در ﻣﻮرد Slaveﻫﺎ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ در ﻫﺮ زﻣﺎن ﻳﻚ Slaveآدرس دﻫـﻲ ﻣـﻲ ﺷـﻮد و ﺣـﻖ دﺳﺘﺮﺳـﻲ ﺑـﻪ .١
ﻛﺎﻣﭙﺎﻳﻠﺮ CodeVisionﺑﺎ اراﺋﻪ ي ﻳﻚ ﺳﺮي ﺗﻮاﺑﻊ ﻣﺮﺑﻮط ﺑﻪ ﺑﺎس ،I2Cاﻣﻜﺎن اﻳﺠﺎد اﻳﻦ ﭘﺮوﺗﻜﻞ را ﺑﻪ ﺻﻮرت ﻧﺮم
اﻓﺰاري ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ دﻫﺪ .ﭘﻴﻦ ﻫﺎي SDAو SCLﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﻴﻴﻦ ﺷﻮﻧﺪ:
#asm
P a g e | 172
www.avr.ir
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
#endasm
در اﻳﻦ ﻗﻄﻌﻪ ﻛﺪ ﭘﻴﻦ ﻫﺎي 3و 4از PORTBﺑﻪ ﻋﻨﻮان SDAو SCLﺗﻌﻴﻴﻦ ﺷﺪه اﻧﺪ.
)(:i2c_init
اﻳﻦ ﺗﺎﺑﻊ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ ي ﺑﺎس I2Cرا اﻧﺠﺎم داده و ﺑﺎﻳﺪ ﻗﺒﻞ از اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ دﻳﮕﺮ ﺑﻪ ﺑﻪ ﻛﺎر ﺑﺮده ﺷﻮد.
)(:i2c_start
اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ و در ﺻﻮرﺗﻲ ﻛﻪ ﺑﺎس آزاد ﺑﺎﺷﺪ ﻣﻘﺪار ﻳﻚ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و در ﻏﺮ اﻳﻦ
)(:i2c_stop
)(:i2c_read
P a g e | 173
www.avr.ir
اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺑﺎﻳﺖ را از ﺑﺎس I2Cﺧﻮاﻧﺪه و ﺷﻜﻞ ﻛﻠﻲ آن ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
ﭘﺎراﻣﺘﺮ ackﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﭘﺲ از درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ acknowledgementارﺳﺎل ﺷﻮد ﻳﺎ ﺧﻴﺮ .در ﺻﻮرﺗﻲ
ﻛﻪ اﻳﻦ ﭘﺎراﻣﺘﺮ ﻳﻚ ﺑﺎﺷﺪ ACKارﺳﺎل ﺧﻮاﻫﺪ و در ﻏﻴـﺮ اﻳﻨﺼـﻮرت ﺑـﺎ اﻳﺠـﺎد ﻧﻜـﺮدن ACKﺑـﻪ ﺻـﻮرت ﭘﺴـﻴﻮ
)(:i2c_write
اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺑﺎﻳﺖ را ﺑﻪ ﺑﺎس I2Cارﺳﺎل ﻛﺮده و ﺷﻜﻞ ﻛﻠﻲ آن ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
ﻣﺘﻐﻴﺮ dataﻣﻘﺪار ارﺳﺎﻟﻲ ﺑﻪ ﺑﺎس ﺑﻮده و در ﺻﻮرﺗﻲ ﻛﻪ ACK ،Slaveاﻳﺠﺎد ﻛﻨﺪ اﻳﻦ ﺗﺎﺑﻊ ﻣﻘـﺪار ﻳـﻚ و در ﻏﻴـﺮ
P a g e | 174
www.avr.ir
:ﺷﻤﺎﺗﻴﻚ
:ﻧﺮم اﻓﺰار
#include<mega16.h>
#define xtal 1000000
#asm
.equ __i2c_port=0x18
.equ __sda_bit=3
P a g e | 175
www.avr.ir
.equ __scl_bit=4
#endasm
#include <i2c.h>
P a g e | 176
www.avr.ir
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 | 177
www.avr.ir
ﻋﻤﺪه روش ﻫﺎﻳﻲ ﻛﻪ ﺑﺮاي ﺗﺒﺪﻳﻞ آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل وﺟﻮد دارﻧﺪ ﻋﺒﺎرﺗﻨﺪ از :ﺗﺒﺪﻳﻞ آﻧـﻲ ﻳـﺎ ،Flashروش ﺗﻘﺮﻳـﺐ
Sigma-Delta ،Pipeline ADCو ﻏﻴﺮه ﻛﻪ از اﻳﻦ ﻣﻴﺎن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎي AVRاز روش ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘـﻮاﻟﻲ
اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ.
:Sample and Holdﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻧﻤﻮﻧﻪ ي آﻧﺎﻟﻮگ ﺑﻪ ﻣﻘﺪار ﺑﺎﻳﻨﺮي ﻣﺘﻨـﺎﻇﺮ ﺑـﺎ آن
ﻧﻴﺎز ﺑﻪ ﻳﻚ ورودي Stableدارد ﻛﻪ اﻳﻦ ﻃﺮﻳﻖ ﻣﺪار Sample and Holdاﻳﺠﺎد ﻣـﻲ ﺷـﻮد .در ﺷـﻜﻞ زﻳـﺮ ﻳـﻚ
P a g e | 178
www.avr.ir
ﻧﻤﻮﻧﻪ ي ﺑﺴﻴﺎر ﺳﺎده از آن را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﻛﻠﻴﺪ ،ﺳﻴﮕﻨﺎل ورودي را ﺑﺎ ﻫﺮ ﻧﻤﻮﻧﻪ ي ﺑﺮداﺷﺘﻪ ﺷﺪه ﺑﻪ ﺧﺎزن وﺻﻞ
ﻣﻲ ﻛﻨﺪ و ﺧﺎزن ﻧﻴﺰ ﻣﻘﺪار وﻟﺘﺎژ را ﺗﺎ ﻧﻤﻮﻧﻪ ي ﺑﻌﺪي ﺛﺎﺑﺖ ﻧﮕﺎه ﻣﻲ دارد.
:Successive Approximation Registerاﻳﻦ رﺟﻴﺴﺘﺮ ﻣﻘﺪار ﺗﻘﺮﻳﺐ زده ﺷﺪه ي دﻳﺠﻴﺘﺎل را ﺑﺮاي ﻣﻘﺎﻳﺴﻪ
اﻟﮕﻮرﻳﺘﻢ ﺗﺒﺪﻳﻞ:
اﺑﺘﺪا رﺟﻴﺴﺘﺮ SARﺑﺎ ﻋﺪد ﺑﺎﻳﻨﺮي 10000000ﺑﺎرﮔﺬاري ﻣﻲ ﺷﻮد و اﻳﻦ ﻋﺪد ﺗﻮﺳـﻂ DACﺑـﺎ ﻣﻘـﺪار آﻧـﺎﻟﻮگ
ورودي ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد ﻣﻘﺎﻳﺴﻪ ﺷﺪه ﺑﺰرﮔﺘﺮ ﺑﺎﺷﺪ و ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨـﺪه ﺑﺎﻋـﺚ ﻣـﻲ ﺷـﻮد،
SARﺑﻴﺖ MSBرا ﭘﺎك ﻛﺮده و ﺑﻴﺖ ﻗﺒﻞ از آن را ﻳﻚ ﻛﻨﺪ و در ﻧﺘﻴﺠﻪ ﻋﺪد 01000000در DACﺑﺎرﮔـﺬاري
ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد ﻣﻘﺎﻳﺴﻪ ﺷﺪه ﻛﻮﭼﻜﺘﺮ ﺑﺎﺷﺪ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﺑﻴـﺖ ﻛـﻮﭼﻜﺘﺮ ﻧﻴـﺰ
ﻳﻚ ﺷﺪه و در ﻧﺘﻴﺠﻪ ﻋﺪد 11000000در ورودي DACﺑﺎرﮔﺬاري ﺷﻮد .اﻳﻦ ﻋﻤﻞ ﺗﺎ ﭘﻴـﺪا ﺷـﺪن ﻣﻘـﺪار آﻧـﺎﻟﻮگ
اداﻣﻪ داﺷﺘﻪ و در اﻳﻦ زﻣﺎن ﺑﻴﺖ End of Conversionﺑﻪ ﻧﺸﺎﻧﻪ ي ﭘﺎﻳﺎن ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻲ ﺷﻮد.
P a g e | 179
www.avr.ir
• ±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 | 180
www.avr.ir
] :Analog Channel and Gain Selection Bits[4:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﭼـﻪ ﺗﺮﻛﻴﺒـﻲ از 8
ﻛﺎﻧﺎل ورودي ﺑﻪ واﺣﺪ ADCﻣﺘﺼﻞ ﺷﺪه و ﻫﻤﭽﻨﻴﻦ ﺑﻬﺮه ورودي ﺗﻔﺎﺿﻠﻲ را ﻧﻴﺰ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ .در ﺣﺎﻟـﺖ ﻫـﺎي
Single-endedدﻗﺖ 10 ADCﺑﻴﺘﻲ ﺑﻮده ﻛﻪ در ﺣﺎﻟﺖ ورودي دﻳﻔﺮاﻧﺴﻴﻞ ﺑﺎ ﺑﻬﺮه ي 1xو 10xاﻳﻦ ﻣﻘﺪار ﺑﻪ 8
P a g e | 181
www.avr.ir
در ﺻﻮرﺗﻲ ﻛﻪ ADCﻣﺸﻐﻮل اﻧﺠﺎم ﻳﻚ ﺗﺒﺪﻳﻞ ﺑﻮده و اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ ﺗﺎ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ﺟﺎري اﻳﻦ ﺗﻐﻴﻴﺮ اﻧﺠـﺎم
ﻧﺨﻮاﻫﺪ ﺷﺪ.ﺗﻨﻈﻴﻤﺎت اﻳﻦ 4ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ) :ﻋﻤﻠﻜﺮد ﺗﻔﺎﺿـﻠﻲ ﻓﻘـﻂ ﺑـﺮ روي Packageﻫـﺎي
P a g e | 182
www.avr.ir
:ADC Left Adjust Resultﺑﻴﺖ ADLRﺑﺮ ﻧﺤﻮه ﻧﻤﺎﻳﺶ ﻧﺘﻴﺠﻪ ي ﺗﺒﺪﻳﻞ در رﺟﻴﺴﺘﺮ داده ي ADCﺗﺎﺛﻴﺮ
P a g e | 183
www.avr.ir
ﻣﻲ ﮔﺬارد .ﻧﻮﺷﺘﻦ ﻳﻚ در اﻳﻦ ﺑﻴﺖ آن را ﺑﻪ ﺻﻮرت Left Adjustﺗﻨﻈﻴﻢ ﻣﻲ ﻛﻨﺪ و در ﻏﻴﺮ اﻳﻨﺼـﻮرت ﻧﺘﻴﺠـﻪ ﺑـﻪ
ﺻﻮرت Right Adjustﺧﻮاﻫﺪ ﺑﻮد .ﺗﻐﻴﻴﺮ اﻳﻦ ﺑﻴﺖ ﺑﻪ ﺻﻮرت آﻧﻲ ﺑﺮ روي رﺟﻴﺴﺘﺮ داده ﺗﺎﺛﻴﺮ ﻣﻲ ﮔﺬارد.
] :Reference Selection Bits[1:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﺮﺟﻊ وﻟﺘﺎژ ADCرا ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ .در
ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﻫﺎ در ﺣﻴﻦ ﺗﺒﺪﻳﻞ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ ﺗﺎ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ﺗﻐﻴﻴﺮ اﻋﻤﺎل ﻧﺨﻮاﻫﺪ ﺷﺪ .در ﺻﻮرﺗﻲ ﻛـﻪ از ﻣﺮﺟـﻊ
وﻟﺘﺎژ داﺧﻠﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﻧﺒﺎﻳﺪ وﻟﺘﺎژ ﺧﺎرﺟﻲ ﺑﻪ ﭘﻴﻦ AREFاﻋﻤﺎل ﺷﻮد .زﻣﺎﻧﻲ ﻛﻪ ﻳﻜﻲ از دو وﻟﺘﺎژ AREFﻳﺎ
2.56وﻟﺖ ﺑﻪ ﻋﻨﻮان ﻣﺮﺟﻊ اﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﻨﺪ ﺑﺎ اﺗﺼﺎل ﻳﻚ ﺧﺎزن 100ﻧﺎﻧﻮ ﺑـﻴﻦ ﭘـﻴﻦ AREFو زﻣـﻴﻦ ﻣـﻲ ﺗـﻮان
P a g e | 184
www.avr.ir
ADCSRA 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
] :ADC Prescaler Select Bits[2:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺿﺮﻳﺐ ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه اي را ﻛﻪ از ﻛﻼك ﺳﻴﺴﺘﻢ ﺑﺮاي
:ADC Interrupt Enableدر ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ) (Iو ﻳﻚ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ،اﺗﻤﺎم
P a g e | 185
www.avr.ir
: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ﺑﻪ ﺻﻮرت دﻳﻔﺮاﻧﺴـﻴﻞ
P a g e | 186
www.avr.ir
ﻣﻄﺎﺑﻖ ﺑﻴﺖ 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
اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.
P a g e | 187
www.avr.ir
ADTS2 ADTS1 ADTS0 ﻣﻨﺒﻊ راه اﻧﺪازي
ﭘﺲ از اﻧﺘﺨﺎب ﻛﺎﻧﺎل ﻣﻮرد ﻧﻈﺮ و وﻟﺘﺎژ ﻣﺮﺟﻊ ﺑﻮﺳﻴﻠﻪ رﺟﻴﺴﺘﺮ ،ADMUXﺑﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜـﻪ ﺑﻴـﺖ ADEN
ﻳﻚ ﺑﻮده ﺑﺎﺷﺪ ،ﻧﻮﺷﺘﻦ ﻳﻚ ﻣﻨﻄﻘﻲ ﺑﺮ روي ﺑﻴﺖ ADSCﺷﺮوع ﻳﻚ ﺗﺒﺪﻳﻞ را ﻣﻮﺟﺐ ﺧﻮاﻫﺪ ﺷﺪ .اﻳﻦ ﺑﻴﺖ در ﺣﻴﻦ
اﻧﺠﺎم ﺗﺒﺪﻳﻞ ﻳﻚ ﺑﻮده و ﺑﺎ ﭘﺎﻳﺎن آن ﺑﻮﺳﻴﻠﻪ ي ﺳﺨﺖ اﻓﺰار ﭘﺎك ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻗﺒﻞ از اﺗﻤﺎم ﺗﺒـﺪﻳﻞ ،ﻛﺎﻧـﺎل
ADCﺗﻐﻴﻴﺮ ﻛﻨﺪ ﺗﺎ ﭘﺎﻳﺎن ﺗﺒﺪﻳﻞ ﺟﺎري اﻳﻦ ﺗﻐﻴﻴﺮ ﺗﺎﺛﻴﺮ ﻧﺨﻮاﻫﺪ ﮔﺬاﺷﺖ.
راه دﻳﮕﺮ ﺑﺮاي راه اﻧﺪازي ADCوﺿﻌﻴﺖ ﺗﺤﺮﻳﻚ ﺧﻮدﻛﺎر ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ ﺣﺎﻟﺖ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ADATEاز
رﺟﻴﺴﺘﺮ ADCSRAآﻏﺎز ﻣﻲ ﺷﻮد .ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي ADTSدر رﺟﻴﺴﺘﺮ SFIORاﻧﺘﺨـﺎب ﻣـﻲ
ﺷﻮﻧﺪ .زﻣﺎﻧﻲ ﻛﻪ ﭘﺮﭼﻢ ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﻳﻚ ﻣﻲ ﺷﻮد ،ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه Resetﺷـﺪه و ADCﺷـﺮوع ﺑـﻪ اﻧﺠـﺎم ﻳـﻚ
ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ ،ﺑﺪﻳﻦ وﺳﻴﻠﻪ ﻣﻲ ﺗﻮان در ﺑﺎزه ﻫﺎي زﻣﺎﻧﻲ ﺛﺎﺑﺖ ADCرا ﺗﺮﻳﮕﺮ ﻧﻤﻮد.
P a g e | 188
www.avr.ir
ﭘﺮﭼﻢ اﺗﻤﺎم ﻳﻚ ﺗﺒﺪﻳﻞ ﺑﻴﺖ ADIFﻣﻲ ﺑﺎﺷﺪ ،در ﺻﻮرﺗﻲ ﻛﻪ ADCدر وﺿﻌﻴﺖ ﺗﺤﺮﻳﻚ ﺧﻮدﻛـﺎر ﻗـﺮار ﮔﺮﻓﺘـﻪ و
اﻳﻦ ﺑﻴﺖ ﺑﻪ ﻋﻨﻮان ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ اﻧﺘﺨﺎب ﺷﻮد ،ﭘﺲ از اﺗﻤﺎم ﻳﻚ ﺗﻴﺪﻳﻞ ،ﺗﺒﺪﻳﻞ ﺟﺪﻳﺪي ﺷﺮوع ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺮاي رﺳﻴﺪن
ﺑﻪ اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻳﺪ ﺑﻴﺖ ﻫﺎي ADTSدر ﺣﺎﻟﺖ Free Runningﻗﺮار ﮔﻴﺮﻧﺪ و ﺑﺮاي ﺷﺮوع ﺗﺒﺪﻳﻞ ﺗﻨﻬﺎ ﻳﻚ ﺑـﺎر
ﻫﻤﺎن ﻃﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ADIEﺑﺎﻻ رﻓﺘﻦ ﭘﺮﭼﻢ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ) (ADIFﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ
اﻳﺠﺎد وﻗﻔﻪ ﺷﺪه و ﺑﺎ اﺟﺮاي ISRاﻳﻦ ﺑﻴﺖ ﺗﻮﺳﻂ ﺳـﺨﺖ اﻓـﺰار ﭘـﺎك ﺷـﻮد .در ﺻـﻮرﺗﻲ ﻛـﻪ ADCدر وﺿـﻌﻴﺖ
Single Conversionﻳﺎ ﺗﻚ ﺗﺒﺪﻳﻞ ﺑﺎﺷﺪ ﺑﺮاي ﺷﺮوع ﺗﺒﺪﻳﻞ ﺑﻌﺪي ﺑﺎﻳﺪ ﭘﺮﭼﻢ ADIFﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي آن
ﭘﺎك ﺷﻮد ،در ﺣﺎﻟﻴﻜﻪ وﺿﻌﻴﺖ Free Runningاﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﺪ ﺑﺪون در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜﻪ ﭘﺮﭼﻢ ADIFﭘـﺎك
P a g e | 189
www.avr.ir
ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه و زﻣﺎن ﺑﻨﺪي ﺗﺒﺪﻳﻞ
ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ،ﻣﺪاري ﻛﻪ ﺑﺮ اﺳﺎس ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘﻮاﻟﻲ ﺗﺒﺪﻳﻞ آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل را اﻧﺠﺎم ﻣﻲ دﻫﺪ ﺑﺮاي
رﺳﻴﺪن ﺑﻪ ﻣﺎﻛﺰﻳﻤﻢ ،Resolutionﻧﻴﺎز ﺑﻪ ﻳﻚ ﻛﻼك ورودي ﺑﺎ ﻓﺮﻛﺎﻧﺴﻲ ﺑﻴﻦ 50ﺗﺎ 200ﻛﻴﻠﻮﻫﺮﺗﺰ دارد .ﻣﺎژول
ADCﺑﺮاي ﺗﺎﻣﻴﻦ ﻛﻼك ﻣﻮرد ﻧﻴﺎز داراي ﻳﻚ ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻣﻘﺪار آن ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي
ADPSاز رﺟﻴﺴﺘﺮ ADCSRAﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد .واﺣﺪ ADCﺑﺮاي ﻋﻤﻠﻜﺮد ﺻﺤﻴﺢ ﺑﻪ ﻓﺮﻛﺎﻧﺲ ﻛﻼﻛﻲ ﺑﻴﻦ 50ﺗﺎ
200ﻛﻴﻠﻮﻫﺮﺗﺰ ﻧﻴﺎز دارد و در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻘﺪار آن ﺧﺎرج از اﻳﻦ ﻣﺤﺪوده ﺗﻌﺮﻳﻒ ﺷﻮد ﻣﻤﻜﻦ اﺳﺖ ﻋﻤﻠﻜﺮد
P a g e | 190
www.avr.ir
در ﺻﻮرت اﺳﺘﻔﺎده از Modeﺗﻚ ﺗﺒﺪﻳﻞ ﺑﻪ دﻟﻴﻞ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ ي ADCﻫﺮ ﺗﺒﺪﻳﻞ ﺣﺪود 25ﺳﻴﻜﻞ ﻛﻼك ﻃـﻮل
ﻣﻲ ﻛﺸﺪ ،درﺣﺎﻟﻴﻜﻪ در وﺿﻌﻴﺖ 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 | 192
www.avr.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 | 193
www.avr.ir
:ﺷﻤﺎﺗﻴﻚ
P a g e | 194
www.avr.ir
ﻣﺎژول ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ داراي دو ورودي AIN0و AIN1ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ دو ﺑﻪ ﺗﺮﺗﻴﺐ ورودي ﻣﺜﺒـﺖ و
ﻣﻨﻔﻲ واﺣﺪ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺑﻮده ﻛﻪ ﻫﻤﺎﻧﻨﺪ ﻳﻚ ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي ﻋﻤﻠﻴﺎﺗﻲ وﻟﺘﺎژ روي اﻳـﻦ دو ﭘﺎﻳـﻪ را ﻣﻘﺎﻳﺴـﻪ ﻛـﺮده و
ﻫﻨﮕﺎﻣﻲ ﻛﻪ وﻟﺘﺎژ روي ﭘﺎﻳﻪ ي AIN0ﺑﻴﺸﺘﺮ از وﻟﺘﺎژ AIN1ﺑﺎﺷﺪ ﺧﺮوﺟﻲ آن ﻳﻌﻨﻲ ﺑﻴﺖ ACOﻳﻚ ﻣﻲ ﺷﻮد .اﻳﻦ
ﺧﺮوﺟﻲ ﻋﻼوه ﺑﺮ ﻛﺎرﺑﺮدﻫﺎي ﻋﺎدي ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﺗﺮﻳﮕﺮ ﻛﺮدن ورودي Captureﺗﺎﻳﻤﺮ ﻳﻚ ﻧﻴﺰ ﺑﻪ ﻛﺎر رود.
P a g e | 195
www.avr.ir
:Analog Comparator Multiplexer Enableﻣﺎژول ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ اﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﺗﺎ
ورودي ﻣﻨﻔﻲ از ﻃﺮﻳﻖ ﭘﺎﻳﻪ ﻫﺎي ADC0ﺗﺎ ADC7اﻧﺘﺨﺎب ﺷﻮد .در ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ACMEو ﺧـﺎﻣﻮش
ﺑﻮدن ) ADCﺑﻴﺖ ADENدر ADCSRAﺻﻔﺮ ﺑﺎﺷﺪ( ،ﺧﺮوﺟﻲ ﻣﺎﻟﺘﻲ ﭘﻠﻜﺴﺮ ADCﺑﻪ ﻋﻨـﻮان ورودي ﻣﻨﻔـﻲ
ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه اﻧﺘﺨﺎب ﻣﻲ ﺷﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﭘﺎﻳﻪ AIN1ورودي ﻣﻨﻔﻲ ﺧﻮاﻫﺪ ﺑﻮد.
] :Analog Comparator Interrupt Mode Select[1:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ ﻛـﻪ ﻛـﺪاﻣﻴﻚ از
روﻳﺪادﻫﺎي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ وﻗﻔﻪ ي آن را ﺗﺮﻳﮕﺮ ﻣﻲ ﻛﻨﺪ.
P a g e | 196
www.avr.ir
:Analog Comparator Input Capture Enableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ورودي Captureﺗﺎﻳﻤﺮ ﻳﻚ
:Analog Comparator Interrupt Enableدر ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ و ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫـﺎ
:Analog Comparator Interrupt Flagاﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻛﻪ ﻳﻜﻲ از روﻳﺪاد ﻫﺎي ﺗﻌﺮﻳﻒ ﺷـﺪه ﺑﻮﺳـﻴﻠﻪ
ي ﺑﻴﺖ ﻫﺎي ACIS1و ACIS0روي دﻫﺪ ،ﺑﻮﺳﻴﻠﻪ ي ﺳﺨﺖ اﻓﺰار ﻳﻚ ﻣﻲ ﺷﻮد .در اﻳﻦ وﺿﻌﻴﺖ اﮔﺮ ACIEو
ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ ﻳﻚ ﺑﺎﺷﺪ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ISRﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﻣﻨﺸﻌﺐ ﺧﻮاﻫﺪ ﺷﺪ و ﺑﻴﺖ ACIﺗﻮﺳـﻂ ﺳـﺨﺖ
اﻓﺰار ﭘﺎك ﺧﻮاﻫﺪ ﺷﺪ ،در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ آن را ﭘﺎك ﻛﻨﺪ.
:Analog Comparator Outputاﻳﻦ ﺑﻴﺖ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه آﻧﺎﻟﻮگ ﺑﻮده و ﺑﺎ ﺗﺎﺧﻴﺮي ﺑﻴﻦ ﻳﻚ ﺗـﺎ دو
P a g e | 197
www.avr.ir
:Analog Comparator Bandgap Selectﺑﺎ ﻳﻚ ﺷﺪن اﻳـﻦ ﺑﻴـﺖ وﻟﺘـﺎژ ﻣﺮﺟـﻊ Bandgapﺟـﺎﻳﮕﺰﻳﻦ
ورودي ﻣﺜﺒﺖ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺧﻮاﻫﺪ ﺷﺪ .در ﺻﻮرت ﺻﻔﺮ ﺑﻮدن ﺑﻴﺖ ACGBﭘـﻴﻦ AIN0ورودي ﻣﺜﺒـﺖ ﻣﻘﺎﻳﺴـﻪ
:Analog Comparator Disableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ﺗﻐﺬﻳﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﻗﻄﻊ ﻣﻲ ﺷﻮد .اﻳﻦ
ﻣﺴﺌﻠﻪ ﺑﻪ ﻛﺎﻫﺶ ﺗﻮان ﻣﺼﺮﻓﻲ در Modeﻫﺎي ﻓﻌﺎل و ﺑﻴﻜﺎري ﻛﻤﻚ ﺧﻮاﻫﺪ ﻛﺮد .ﻗﺒـﻞ از ﺗﻐﻴﻴـﺮ دادن ﺑﻴـﺖ ACD
ﺑﺎﻳﺪ وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﺑﺎ ﭘﺎك ﻛﺮدن ﺑﻴﺖ ACIEاز ACSRﻏﻴﺮ ﻓﻌﺎل ﺷـﻮد در ﻏﻴـﺮ اﻳﻨﺼـﻮرت در
اﻳﻦ اﻣﻜﺎن وﺟﻮد دارد ﻛﻪ ﻫﺮ ﻳﻚ از ورودي ﻫﺎي ADC0ﺗﺎ ADC7ﺑﻪ ﻋﻨﻮان ورودي ﻣﻨﻔﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه آﻧﺎﻟﻮگ
اﻧﺘﺨﺎب ﺷﻮﻧﺪ .ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﻣﺴﺌﻠﻪ ﺑﺎﻳﺪ )ﺑﺎ ﺻﻔﺮ ﺑﻮدن ﺑﻴﺖ (ADENﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل ﺧﺎﻣﻮش ﺑـﻮده
و ﺑﻴﺖ ACMEاز SFIORﻳﻚ ﺑﺎﺷﺪ .در اﻳﻦ وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي ] MUX[2:0از رﺟﻴﺴﺘﺮ ADMUXورودي
ﻣﻨﻔﻲ را ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﻨﺪ .ﻣﺴﻠﻤﺎ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ACMEﺻﻔﺮ ﺑﻮده ﻳﺎ ADENﻳـﻚ ﺑﺎﺷـﺪ
P a g e | 198
www.avr.ir
1 0 000 ADC0
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 | 199
www.avr.ir
PORTA=0x00;
DDRA=0x01;
while (1);
}
:ﺷﻤﺎﺗﻴﻚ
P a g e | 200
www.avr.ir
P a g e | 201
www.avr.ir
SPI Bus
ﺑﻮده و ﺑﻮﺳﻴﻠﻪ ﺷـﺮﻛﺖSerial Peripheral Interface ﻛﻪ ﻳﻚ اﺳﺘﺎﻧﺪارد ﺳﺮﻳﺎل ﺳﻨﻜﺮون ﻣﻲ ﺑﺎﺷﺪ ﺳﺮﻧﺎمSPI
اﻳﻦ اﺳﺘﺎﻧﺪارد ﺑﻪ ﻟﺤﺎظ ﭘﺸﺘﻴﺒﺎﻧﻲ از ﺳﺮﻋﺖ ﻫﺎي ﺑﺎﻻ ﻧﻪ ﺗﻨﻬﺎ در ﻛﺎرﺑﺮدﻫﺎي اﻧﺪازه ﮔﻴﺮي.ﻣﻮﺗﻮروﻻ ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ
ﻧﻴـﺰ ﻣـﻮرد... ﻛﺎﻧﺎل ﻫـﺎي ارﺗﺒـﺎﻃﻲ و، ﭘﺮدازش ﺳﻴﮕﻨﺎل دﻳﺠﻴﺘﺎل،ﺑﻠﻜﻪ در ﻣﻮاردي ﻧﻈﻴﺮ اﻧﺘﻘﺎل ﺣﺠﻢ ﺑﺎﻻي اﻃﻼﻋﺎت
ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳـﺖ و در ﻧﺘﻴﺠـﻪ اﻣﻜـﺎنSPI ﺳﺮﻋﺖ ﭼﻨﺪ ﻣﮕﺎﺑﻴﺖ ﺑﺮ ﺛﺎﻧﻴﻪ ﺑﻪ راﺣﺘﻲ ﺗﻮﺳﻂ.اﺳﺘﻔﺎده واﻗﻊ ﻣﻲ ﺷﻮد
.اﻧﺘﻘﺎل ﺻﻮت ﻓﺸﺮده ﻧﺸﺪه و ﺗﺼﻮﻳﺮ ﻓﺸﺮده ﺷﺪه وﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ
SSM2163 8x2 Audio Mixer 63dB attenuation in 1dB steps Analog Devices
P a g e | 202
www.avr.ir
AT45DB041 FLASH 5V 4MBit 10MHz ATMEL
P a g e | 203
www.avr.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 | 204
www.avr.ir
SSﺑﻮده ﻛـﻪ ﺑـﻪ ﺗﺮﺗﻴـﺐ ﺧـﻂ ﻛـﻼك، ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻼﺣﻈﻪ ﻣﻲ ﺷﻮد اﻳﻦ ﭼﻬﺎر ﺧﻂ MISO ،MOSI ،SCKو
.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
P a g e | 205
www.avr.ir
رﺟﻴﺴﺘﺮﻫﺎي SPI
ﻣﺎژول SPIداراي ﺳﻪ رﺟﻴﺴﺘﺮ SPSR ،SPDRو SPCRﺑﻮده ﻛﻪ ﺑﻪ ﺗﺮﺗﻴﺐ رﺟﻴﺴﺘﺮﻫﺎي داده ،وﺿﻌﻴﺖ و ﻛﻨﺘﺮل
ﻣﻲ ﺑﺎﺷﻨﺪ.
ﻧﻮﺷﺘﻦ ﺑﺮ روي اﻳﻦ رﺟﻴﺴﺘﺮ ﺷﺮوع اﻧﺘﻘﺎل داده را ﻣﻮﺟﺐ ﺧﻮاﻫﺪ ﺷﺪ و ﺧﻮاﻧﺪن آن ﻣﻮﺟﺐ ﺧﻮاﻧـﺪن داده ي ﻣﻮﺟـﻮد
:Double SPI Speed Bitﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي اﻳﻦ ﺑﻴﺖ در ﺻـﻮرﺗﻴﻜﻪ ﻣـﺎژول SPIدر وﺿـﻌﻴﺖ Master
ﺑﺎﺷﺪ ﻓﺮﻛﺎﻧﺲ ﻛﻼك ﻣﻮﺟﻮد روي ﭘﻴﻦ SCKدو ﺑﺮاﺑﺮ ﺧﻮاﻫﺪ ﺷﺪ.
P a g e | 206
www.avr.ir
:Write COLlision Flagاﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻳﻚ ﺧﻮاﻫﺪ ﺷﺪ ﻛﻪ در ﺣﻴﻦ اﻧﺘﻘﺎل ﻳـﻚ ﺑﺎﻳـﺖ ﺑـﺮ روي رﺟﻴﺴـﺘﺮ
SPDRﻣﻘﺪاري ﻧﻮﺷﺘﻪ ﺷﻮد .ﺑﺎ اوﻟﻴﻦ ﺧﻮاﻧﺪن رﺟﻴﺴﺘﺮ SPSRاﻳﻦ ﺑﻴﺖ ﭘﺎك ﻣﻲ ﺷﻮد.
:SPI Interrupt Flagاﻳﻦ ﺑﻴﺖ در دو ﺣﺎﻟﺖ ﻳﻚ ﻣﻲ ﺷﻮد .1 :ﺑﺎ اﺗﻤﺎم ارﺳﺎل ﻳﻚ ﺑﺎﻳﺖ اﻳﻦ ﭘﺮﭼﻢ ﻳﻚ ﺷـﺪه و
در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ SPIEو ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ ﻳﻚ ﺑﺎﺷﻨﺪ اﺗﻤﺎم ﻋﻤﻠﻴﺎت ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد ﻳـﻚ وﻗﻔـﻪ
ﺷﻮد .2 .ﭘﻴﻦ SSاز ﺧﺎرج ﺗﻮﺳﻂ ﻳﻚ وﺳﻴﻠﻪ ي دﻳﮕﺮ زﻣﻴﻦ ﺷﻮد ،اﻳﻦ ﺑﻪ ﻣﻌﻨﺎي از دﺳﺖ دادن ﺣﺎﻛﻤﺖ ﺑﺎس ﺑـﻮده و
اﻳﻦ وﺿﻌﻴﺖ ﺑﺎ ﻳﻚ ﺷﺪن ﺑﻴﺖ SPIFاﻋﻼم ﻣﻲ ﺷﻮد .ﺑﺎ اﺟﺮاي ISRﻳﺎ ﺧﻮاﻧﺪن رﺟﻴﺴﺘﺮ وﺿﻌﻴﺖ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﻣﻲ
ﺷﻮد.
:SPI Clock Rate Select 1 and 0اﻳﻦ دو ﺑﻴﺖ ﻧﺮخ ﻛﻼك SCKرا ﻛﻪ Masterاﻳﺠﺎد ﻣـﻲ ﻛﻨـﺪ ﻣﻄـﺎﺑﻖ
P a g e | 207
www.avr.ir
Clock Phaseو :Clock Polarityاﻳﻦ دو ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ زﻣﺎن ﺑﻨـﺪي اﻧﺘﻘـﺎل و درﻳﺎﻓـﺖ داده روي
P a g e | 208
www.avr.ir
:Master/Slave Selectﺑﺎ ﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﻣﺎژول SPIدر وﺿﻌﻴﺖ Masterﻗﺮار ﻣﻲ ﮔﻴﺮد.
:Data Orderﺑﺎ ﻳﻚ ﺑﻮدن اﻳﻦ ﺑﻴﺖ اﺑﺘﺪا MSBروي ﺑﺎس ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد و در ﺻﻮرت ﺻﻔﺮ ﺑﻮدن اﺑﺘﺪا .LSB
وﻗﺘﻲ ﻣﺎژول SPIﺑﻪ ﻋﻨﻮان Masterﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه اﺳﺖ ﺧﻂ SSرا ﺑﺼﻮرت ﺧﻮدﻛﺎر ﻛﻨﺘـﺮل ﻧﻤـﻲ ﻛﻨـﺪ و اﻳـﻦ
وﻇﻴﻔﻪ ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ،ﻗﺒﻞ از آﻏﺎز ﻳﻚ ﭼﺮﺧﻪ ي ارﺗﺒﺎﻃﻲ اﻧﺠﺎم ﺷﻮد .ﭘﺲ از ﺻـﻔﺮ ﻛـﺮدن ، SSﻧﻮﺷـﺘﻦ ﻳـﻚ
ﺑﺎﻳﺖ در رﺟﻴﺴﺘﺮ داده ) (SPDRﺑﺎﻋﺚ اﻳﺠﺎد ﻛﻼك ﺗﻮﺳﻂ واﺣﺪ ﺗﻮﻟﻴﺪ ﻛﻼك ﺧﻮاﻫﺪ ﺷـﺪ و ﺑـﺎ ﻫـﺮ ﭘـﺎﻟﺲ ،داده ي
ﻣﻮﺟﻮد در Shift Registerﻫﺎي Masterو Slaveﻳﻚ ﺑﻴﺖ ﺷﻴﻔﺖ داده ﺷﺪه و ﭘﺲ از 8ﭘﺎﻟﺲ ﺳﺎﻋﺖ ﭘـﺮﭼﻢ
SPIFﺑﻪ ﻧﺸﺎﻧﻪ ي اﺗﻤﺎم ارﺳﺎل ﻳﻚ ﻣﻲ ﺷﻮد .ﭘﺲ از اﻳﻦ Masterﻣﻲ ﺗﻮاﻧﺪ ﺑـﺮاي ارﺳـﺎل ﺑﺎﻳـﺖ ﺑﻌـﺪي آن را در
P a g e | 209
www.avr.ir
در ﻧﻘﻄﻪ ي ﻣﻘﺎﺑﻞ زﻣﺎﻧﻴﻜﻪ ﻣﺎژول SPIدر ﻧﻘﺶ Slaveﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه اﺳﺖ ،ﻣﺎداﻣﻴﻜﻪ ﺧـﻂ SSﻳـﻚ اﺳـﺖ ﭘـﻴﻦ
MISOدر وﺿﻌﻴﺖ tri-statedﻣﻲ ﺑﺎﺷﺪ .در اﻳﻦ ﺷﺮاﻳﻂ ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ رﺟﻴﺴﺘﺮ SPDRﺗﻮﺳـﻂ Slaveﺑـﺮوز
ﺷﻮد اﻣﺎ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺧﻂ SSﺗﻮﺳﻂ Masterﺻﻔﺮ ﻧﺸﻮد اﻧﺘﻘﺎل اﻧﺠـﺎم ﻧﺨﻮاﻫـﺪ ﺷـﺪ .ﭘـﺲ از Lowﺷـﺪن SSو
اﺗﻤﺎم درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ ﭘﺮﭼﻢ SPIFﻳﻚ ﺷﺪه و در ﺻﻮرت ﻳﻚ ﺑﻮدن SPIEو ﺑﻴـﺖ ،Iاﻳـﻦ روﻳـﺪاد ﻣـﻲ ﺗﻮاﻧـﺪ
ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد .ﭘﺲ از اﻳﻦ ﻣﻤﻜﻦ اﺳﺖ Slaveداده ي ﺟﺪﻳﺪي را در SPDRﻗﺮار دﻫﺪ ﻣﻨﺘﻬﺎ ﺑﺎﻳﺪ ﻗﺒـﻞ از
ﻣﻄﺎﺑﻖ ﺗﺼﻮﻳﺮ زﻳﺮ ﺑﺎ اﺳﺘﻔﺎده از ﭘﻴﻦ SSﻣﻲ ﺗـﻮان ﺗﻌـﺪادي Slaveرا ﻛﻨﺘـﺮل ﻧﻤـﻮد Master .ﺑﺎﻳـﺪ ﺗﻨﻬـﺎ ﭘـﻴﻦ SS
Slaveاي را ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﺑﺎ آن ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﺪ ﺻﻔﺮ ﻛﻨﺪ و ﺑﻘﻴﻪ را ﻳﻚ ﻧﮕﻪ دارد.
P a g e | 210
www.avr.ir
اﻋﻼن اﻳﻦ ﺗﺎﺑﻊ در ﻓﺎﻳﻞ spi.hﺑﻮده و ﻧﺤﻮه ي ﻋﻤﻠﻜﺮد آن در ﻓﺎﻳﻞ spi.libﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
ﺑﻨﺎﺑﺮاﻳﻦ آﻧﭽﻪ اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ ﻋﻨﻮان آرﮔﻮﻣﺎن درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ روي ﺑﺎس SPIﻗﺮار ﻣﻲ دﻫﺪ و ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ آن ﻣﻘـﺪار
ﺧﻮاﻧﺪه ﺷﺪه از ﺑﺎس اﺳﺖ .ﻗﺒﻞ از اﺳﺘﻔﺎده از اﻳﻦ ﺗﺎﺑﻊ ﺑﺎﻳﺪ SPIﺑﻮﺳﻴﻠﻪ ي رﺟﻴﺴﺘﺮﻫﺎي ﻛﻨﺘﺮل و وﺿﻌﻴﺖ ﺗﻨﻈﻴﻢ ﺷﺪه
ﺑﺎﺷﺪ.
>#include <mega16.h
>#include <delay.h
)void main(void
{
P a g e | 211
www.avr.ir
// 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 | 212
www.avr.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 | 213
www.avr.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ﻓﻘﻂ ﺑﺎ ﻣﻨﺒﻊ ﻛﻼك ﻛﺮﻳﺴﺘﺎل ﻳﺎ
P a g e | 214
www.avr.ir
Modeﻫﺎي ﺧﻮاب
:Idle Modeدر اﻳﻦ وﺿﻌﻴﺖ CPUﻣﺘﻮﻗـﻒ ﺷـﺪه اﻣـﺎ ,SPI, USARTﻣﻘﺎﻳﺴـﻪ ﻛﻨﻨـﺪه ي آﻧـﺎﻟﻮگ، •
,ADC, TWIﺗﺎﻳﻤﺮﻫﺎ Watchdog ،و ﺳﻴﺴﺘﻢ وﻗﻔﻪ ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ دﻫﻨﺪ .اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛـﻼك
CPUو ﻛﻼك Flashﻣﺘﻮﻗﻒ ﺷﺪه اﻣﺎ ﺑﻘﻴﻪ ي ﻣﻨﺎﺑﻊ ﻛﻼك ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ دﻫﻨﺪ .ﻣﻨﺎﺑﻊ وﻗﻔﻪ ي داﺧﻠﻲ و ﺧﺎرﺟﻲ
P a g e | 215
www.avr.ir
CPU :ADC Noise Reduction Modeﻣﺘﻮﻗﻒ ﺷﺪه اﻣﺎ ﻣﺎژول ﻫﺎي ,ADCوﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ، •
ﺗﺸﺨﻴﺺ آدرس ,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ﺑﻮده ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛـﻪ اﺳـﻴﻼﺗﻮر •
P a g e | 216
www.avr.ir
اﻋﻼن اﻳﻦ ﺗﻮاﺑﻊ در ﻓﺎﻳﻞ 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ﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺷﻮد .ﺑﻠـﻮك دﻳـﺎﮔﺮام
P a g e | 217
www.avr.ir
WDTCR 7 6 5 4 3 2 1 0
ﻧﺎم ﺑﻴﺖ - - - WDTOE WDE WDP2 WDP1 WDP0
ﻓﻌﺎل اﺳﺖ اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺿﺮﻳﺐ ﺗﻘﺴﻴﻢWatchdog زﻣﺎﻧﻲ ﻛﻪ ﺗﺎﻳﻤﺮ:Watchdog Timer Prescaler[2:0]
P a g e | 218
www.avr.ir
Watchdog Turn-off Enableو :Watchdog Enableﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي ﺑﻴﺖ WDEﺗﺎﻳﻤﺮ
Watchdogﻓﻌﺎل ﺷﺪه و ﺑﺎ ﭘﺎك ﻛﺮدن آن ﺗﺎﻳﻤﺮ ﻏﻴﺮ ﻓﻌﺎل ﻣﻲ ﺷﻮد .اﮔﺮﭼﻪ ﻓﻌﺎل ﻛﺮدن ﺗﺎﻳﻤﺮ ﺑﻪ ﺳﺎدﮔﻲ و ﺑﺎ ﻧﻮﺷﺘﻦ
ﻳﻚ روي WDEاﻧﺠﺎم ﻣﻲ ﺷﻮد اﻣﺎ ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن آن ﺑﺎﻳﺪ ﻣﺮاﺣﻞ زﻳﺮ ﺑﻪ ﺗﺮﺗﻴﺐ اﻧﺠﺎم ﺷﻮد:
.1ﻫﻤﺰﻣﺎن ﺑﻴﺖ ﻫﺎي WDTOEو WDEرا ﻳﻚ ﻛﻨﻴﺪ) .ﺑﻴﺖ WDEﻋﻠﻴﺮﻏﻢ اﻳﻨﻜﻪ ﻗﺒﻼ ﻳﻚ ﺑﻮده ﺑﺎﺷﺪ ﺑﺎﻳﺪ
ﻣﺠﺪدا ﻳﻚ ﺷﻮد(.
.2ﺗﺎ ﭼﻬﺎر ﺳﻴﻜﻞ ﺑﻌﺪ ﻧﺮم اﻓﺰار ﻓﺮﺻﺖ دارد ﺗﺎ WDEرا ﭘﺎك ﻛﻨﺪ.
P a g e | 219
www.avr.ir
ﻫﺮ ﻳﻚ از ﭼﻬﺎر ﭘﻮرت C ،B ،Aو Dﻗﻄﻌﻪ ي ATmega16داراي ﺳﻪ رﺟﻴﺴﺘﺮ PORTx ،DDRxو PINx
ﺑﻮده ﻛﻪ xﺣﺮف ﻣﺮﺑﻮط ﺑﻪ ﭘﻮرت ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل رﺟﻴﺴﺘﺮﻫﺎي اوﻟﻴﻦ ﭘﻮرت PORTA ،DDRA ،و
اﻳﻦ رﺟﻴﺴﺘﺮ ﻫﻤﺎﻧﻄﻮر ﻛﻪ از ﻧﺎم اش ﻣﺸﺨﺺ اﺳﺖ رﺟﻴﺴﺘﺮ ﺟﻬﺖ داده ي ﭘﻮرت ﺑﻮده و ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﭘﻮرت
ورودي اﺳﺖ ﻳﺎ ﺧﺮوﺟﻲ .ﺑﺪﻳﻦ ﺻﻮرت ﻛﻪ اﮔﺮ روي ﻫﺮﻛﺪام از ﺑﻴﺖ ﻫﺎي اﻳﻦ رﺟﻴﺴﺘﺮ ﻳﻚ ﻧﻮﺷﺘﻪ ﺷﻮد ﭘﻴﻦ ﻣﺘﻨﺎﻇﺮ
آن ﭘﻮرت ﺧﺮوﺟﻲ ﺑﻮده و در ﻏﻴﺮ اﻳﻨﺼﻮرت ورودي ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﺑﺎ اﺟﺮاي ﻋﺒﺎرت = DDRA
0b10111101وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي اﻳﻦ رﺟﻴﺴﺘﺮ و ﭘﻴﻦ ﻫﺎي ﻣﺮﺑﻮﻃﻪ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ.
ﺟﻬﺖ داده ﺧﺮوﺟﻲ ورودي ﺧﺮوﺟﻲ ﺧﺮوﺟﻲ ﺧﺮوﺟﻲ ﺧﺮوﺟﻲ ورودي ﺧﺮوﺟﻲ
رﺟﻴﺴﺘﺮ :PORTx
ﻋﻤﻠﻜﺮد اﻳﻦ رﺟﻴﺴﺘﺮ ﺑﺴﺘﮕﻲ ﺑﻪ ﺟﻬﺖ داده ي ﭘﻮرت دارد .در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه ﺑﺎﺷﺪ.
آﻧﭽﻪ روي ﭘﻮرت ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد ﺳﻄﺢ ﻣﻨﻄﻘﻲ آن را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ و در ﺻﻮرﺗﻲ ﻛﻪ ورودي ﺑﺎﺷﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﻫﺮ
P a g e | 220
www.avr.ir
ﺑﻴﺖ ﻣﻘﺎوﻣﺖ Pull-upداﺧﻠﻲ ﻣﺮﺑﻮط ﺑﻪ آن ﭘﻴﻦ ﻓﻌﺎل ﻣﻲ ﺷﻮد .ﺑﻪ ﻋﻨﻮان ﻧﻤﻮﻧﻪ در اداﻣﻪ ي ﻣﺜﺎل ﻗﺒﻞ در ﺻﻮرﺗﻲ ﻛﻪ
ﻋﺒﺎرت PORTA = 0b11010100اﺟﺮا ﺷﻮد ،وﺿﻌﻴﺖ ﭘﻮرت ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد.
ﺷﻤﺎره ﺑﻴﺖ 7 6 5 4 3 2 1 0
ﺑﺎ ﺳﻄﺢ ﺑﺎ ﺑﺎ ﺳﻄﺢ ﺑﺎ ﺳﻄﺢ ﺑﺎ ﺳﻄﺢ ﺑﺎ ﺳﻄﺢ ﺑﺪون ﺑﺎ ﺳﻄﺢ
ﺟﻬﺖ داده
ﻣﻨﻄﻘﻲ ﻣﻘﺎوﻣﺖ ﻣﻨﻄﻘﻲ ﻣﻨﻄﻘﻲ ﻣﻨﻄﻘﻲ ﻣﻨﻄﻘﻲ ﻣﻘﺎوﻣﺖ ﻣﻨﻄﻘﻲ
رﺟﻴﺴﺘﺮ :PINx
ﺑﺮاي ﺧﻮاﻧﺪن ﻣﻘﺪار ﻫﺮ ﭘﻴﻦ ﺑﺎﻳﺪ ﻣﺤﺘﻮﻳﺎت اﻳﻦ رﺟﻴﺴﺘﺮ ﺧﻮاﻧﺪه ﺷﻮد .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﭼﻨﺎﻧﭽﻪ PORCرا ﻗﺒﻼ ﺑﻪ
ﺻﻮرت ورودي ﭘﻴﻜﺮﺑﻨﺪي ﻛﺮده ﺑﺎﺷﻴﻢ و ﻣﻘﺪار رﺟﻴﺴﺘﺮ PINCﺑﺮاﺑﺮ 0b11010000ﺑﺎﺷﺪ ،ﺳﻄﺢ ﻣﻨﻄﻘﻲ اﻋﻤﺎل
ﺟﻬﺖ داده ﻳﻚ ﻳﻚ ﺻﻔﺮ ﻳﻚ ﺻﻔﺮ ﺻﻔﺮ ﺻﻔﺮ ﺻﻔﺮ
P a g e | 221
www.avr.ir
P a g e | 222
www.avr.ir
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 | 223
www.avr.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 | 224
www.avr.ir
ATmega8 ATiny26
P a g e | 225
www.avr.ir