آﻣﻮزش ﺳﺮﻳﻊ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ AVR
ﻣﻮﻟﻒ :رﺿﺎ ﺳﭙﺎس ﻳﺎر )(
[email protected]
ﻋﻨﻮان ﻣﻄﺎﻟﺐ ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ ،ﻣﻨﺎﺑﻊ ﻛﻼك و Reset آﺷﻨﺎﻳﻲ ﺑﺎ زﺑﺎن C ﭘﺮوژه : 1ﻓﻼﺷﺮ ﺳﺎده ﭘﺮوژه :2ﻛﺎﻧﺘﺮ ﻳﻚ رﻗﻤﻲ ﺑﺎ 7-Segment ﭘﺮوژه : 3ﻧﻤﺎﻳﺸﮕﺮ ﻛﺮﻳﺴﺘﺎل ﻣﺎﻳﻊ )(LCD ﭘﺮوژه :4اﺳﻜﻦ ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻣﺎﺗﺮﻳﺴﻲ ﭘﺮوژه :5ﻧﻤﺎﻳﺸﮕﺮﻫﺎي LED Dot Matrix وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ ﭘﺮوژه :6آﺷﻜﺎر ﺳﺎز ﻋﺒﻮر از ﺻﻔﺮ ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﺻﻔﺮ ﭘﺮوژه : 7ﻓﺮﻛﺎﻧﺲ ﻣﺘﺮ دﻳﺠﻴﺘﺎل ﭘﺮوژه :8ﻛﻨﺘﺮل ﻣﻮﺗﻮر DCﺑﺎ PWM ﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ دو ﭘﺮوژه :9ﺳﺎﻋﺖ ﺑﺎ RTCﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻳﻚ ﭘﺮوژه :10ﻛﻨﺘﺮل ﺳﺮو ﻣﻮﺗﻮر ﭘﺮوژه :11ﺗﻮﻟﻴﺪ ﻣﻮج ﺳﻴﻨﻮﺳﻲ ﭘﻮرت ﺳﺮﻳﺎل )(RS-232 ﭘﺮوژه :12ﭘﻮرت ﺳﺮﻳﺎل در وﻳﮋوال ﺑﻴﺴﻴﻚ ﭘﺮوژه :13ارﺗﺒﺎط دﻫﻲ USBﺑﺎ RS232
)I2C Bus (TWI ﭘﺮوژه :12ارﺗﺒﺎط ﺑﺎ EEPROMﻫﺎي I2C ﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل ﭘﺮوژه :13اﻧﺪازه ﮔﻴﺮي دﻣﺎ ﺑﺎ ﺳﻨﺴﻮر LM35 ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ SPI Bus Modeﻫﺎي Sleepو ﺗﺎﻳﻤﺮ Watchdog
ﭘﻴﻮﺳﺖ :1ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴﺘﺮﻫﺎي I/O ﭘﻴﻮﺳﺖ :2ﻧﺤﻮه ي ارﺗﺒﺎط دﻫﻲ ورودي وﺧﺮوﺟﻲ ﻫﺎي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﭘﻴﻮﺳﺖ :3ﻣﺸﺨﺼﺎت ﺑﺮﺧﻲ ﻗﻄﻌﺎت AVR ﭘﻴﻮﺳﺖ Pinout :4ﺑﺮﺧﻲ ﻗﻄﻌﺎت AVR ﭘﻴﻮﺳﺖ :5ﺧﻼﺻﻪ ي رﺟﻴﺴﺘﺮﻫﺎيATmega16
Page |4
www.eca.ir
ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ ،ﻣﻨﺎﺑﻊ ﻛﻼك و Reset
•
ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ
ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ ي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ AVRﻫﺴﺘﻨﺪ ﻛﻪ اﻣﻜﺎﻧﺎﺗﻲ را در اﺧﺘﻴﺎر ﻛﺎرﺑﺮ ﻗﺮار ﻣﻲ دﻫﻨﺪ و ﺑﺎ Eraseﺷﺪن ﻣﻴﻜﺮو ﻣﻘﺪار آن ﻫﺎ ﺗﻐﻴﻴﺮ ﻧﻤﻲ ﻛﻨﺪ .ﻳﻚ ﺑﻪ ﻣﻌﻨﻲ ﻏﻴﺮ ﻓﻌﺎل ﺑﻮدن و ﺻﻔﺮ ﻓﻌﺎل ﺑﻮدن ﻫﺮ ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ. ﻗﻄﻌﻪ ي Mega16داراي 2ﺑﺎﻳﺖ ﻓﻴﻮز ﺑﻴﺖ ﻃﺒﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
ﭘﻴﺶ ﻓﺮض 1
ﻋﻤﻠﻜﺮد اﻧﺘﺨﺎب ﺑﺮدار Resetﺑﺨﺶ Boot
High Byteﺷﻤﺎره ﺑﻴﺖ BOOTRST
0
BOOTSZ0
1
BOOTSZ1
2
1
ﺣﻔﺎﻃﺖ از EEPROMدر زﻣﺎن Erase
EESAVE
3
1
اﻧﺘﺨﺎب ﻋﻤﻠﻜﺮد ﻛﻼك
CKOPT
4
0
ﻓﻌﺎل ﺳﺎز ﭘﺮوﮔﺮام ﺷﺪن از ﻃﺮﻳﻖ SPI
SPIEN
5
0
ﻓﻌﺎل ﺳﺎز ﭘﻮرت JTAG
JTAGEN
6
1
ﻓﻌﺎل ﺳﺎز اﺷﻜﺎل زداﻳﻲ از ﻃﺮﻳﻖ JTAG
OCDEN
7
0
اﻧﺘﺨﺎب اﻧﺪازه ي Bootloader
0
-٤-
Page |5
www.eca.ir
Low Byte
ﺷﻤﺎره ﺑﻴﺖ
ﻋﻤﻠﻜﺮد
ﭘﻴﺶ ﻓﺮض 1
CKSEL0
0
0
CKSEL1
1
اﻧﺘﺨﺎب ﻣﻨﺒﻊ ﻛﻼك 0
CKSEL2
2
0
CKSEL3
3
0
SUT0
4
SUT1
5
BODEN
6
BODLEVEL
7
اﻧﺘﺨﺎب زﻣﺎن Startup
1 1
ﻓﻌﺎل ﺳﺎز آﺷﻜﺎر ﺳﺎز Brown-out
1
ﺗﻨﻈﻴﻢ ﺳﻄﺢ وﻟﺘﺎژ Brown-out
:BOOTRSTاﻧﺘﺨﺎب ﺑﺮدار ري ﺳﺖ BOOTﻛﻪ در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﺑﺮﻧﺎﻣﻪ رﻳﺰي ﻧﺸﺪه اﺳﺖ و آدرس ﺑﺮدار ري ﺳﺖ 0000اﺳﺖ و در ﺻﻮرت ﺑﺮﻧﺎﻣﻪ رﻳﺰي آدرس ﺑﺮدار Resetﻃﺒﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد) .ﺑﺮ اﺳﺎس ](BOOTSZ[1:0
آدرس ﺑﺮدار Pages Resetاﻧﺪازه ي BOOTSZ1 BOOTSZ0 Boot $1F80
2
Word 128
1
1
$F00
4
Word 256
0
1
$E00
8
Word 512
1
0
$C00
16
Word 1024
0
0
-٥-
Page |6
www.eca.ir
:BODENاﻳﻦ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز Brown-out Detectorﺑﻮده و در ﺻﻮرت ﭘﺮوﮔﺮام ﺷﺪن ﻣﻄﺎﺑﻖ وﺿﻌﻴﺖ ﺟﺪول زﻳﺮ ﺳﻄﺢ وﻟﺘﺎژ Brown-outﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد.
ﺳﻄﺢ وﻟﺘﺎژ BODEN BODLEVEL Brown-out
•
ﻏﻴﺮ ﻓﻌﺎل
1
1
ﻏﻴﺮ ﻓﻌﺎل
0
1
Vcc=2.7v
1
0
Vcc=4.0v
0
0
ﻣﻨﺎﺑﻊ ﻛﻼك
ﻫﻤﺎﻧﻄﻮر ﻛﻪ در دﻳﺎﮔﺮام زﻳﺮ دﻳﺪه ﻣﻲ ﺷﻮد ،اﻳﻦ ﻣﻨﺎﺑﻊ ﺷﺎﻣﻞ :اﺳﻴﻼﺗﻮر RCﻛﺎﻟﻴﺒﺮه ﺷﺪه ،اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ﻓﺮﻛﺎﻧﺲ ﭘﺎﻳﻴﻦ ،اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ،ﻛﻼك ﺧﺎرﺟﻲ ،اﺳﻴﻼﺗﻮر RCﺧﺎرﺟﻲ و اﺳﻴﻼﺗﻮر ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻣﻲ ﺑﺎﺷﻨﺪ.
-٦-
Page |7
www.eca.ir
اﻧﺘﺨﺎب ﻣﻨﺒﻊ ﻛﻼك ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﺑﻮده و ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ .ﻣﻘﺪار ﭘﻴﺶ ﻓﺮض ﺑﻴﺖ ﻫﺎي ،CKSELﻳﻚ ﺑﻮده و در ﻧﺘﻴﺠﻪ ﻣﻨﺒﻊ ﭘﻴﺶ ﻓﺮض ،اﺳﻴﻼﺗﻮر RCداﺧﻠﻲ ﻣﻲ ﺑﺎﺷﺪ.
-٧-
Page |8
www.eca.ir
ﻛﻼك ﺧﺎرﺟﻲ :ﺑﺮاي راه اﻧﺪازي وﺳﻴﻠﻪ ﺑﻮﺳﻴﻠﻪ ي ﻣﻨﺒﻊ ﻛﻼك ﺧﺎرﺟﻲ ﺑﺎﻳﺪ ﻣﻄﺎﺑﻖ ﺷـﻜﻞ زﻳـﺮ ﻳـﻚ ﭘـﺎﻟﺲ ﺑـﻪ ﭘـﻴﻦ XTAL1اﻋﻤﺎل ﺷﻮد .ﺑﺮاي ﻗﺮار ﮔﺮﻓﺘﻦ در اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻳﺪ ﺗﻤﺎم ﺑﻴﺖ ﻫﺎي CKSELﭘﺮوﮔﺮام ﺷﺪه )ﺻﻔﺮ ﺷﻮﻧﺪ( و ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﭘﺮوﮔﺮام ﻛﺮدن ﻓﻴﻮزﺑﻴﺖ CKOPTﻳﻚ ﺧﺎزن داﺧﻠﻲ ﺑﻪ ﻇﺮﻓﻴﺖ 36ﭘﻴﻜﻮﻓﺎراد را ﺑـﻴﻦ ورودي و زﻣﻴﻦ ﻗﺮار دﻫﺪ.
XTAL1 ﻛﻼك ﺧﺎرﺟﻲ CKOPT 36 pF
XTAL2
اﺳﻴﻼﺗﻮر RCﻛﺎﻟﻴﺒﺮه ﺷﺪه ي داﺧﻠﻲ :اﻳﻦ ﻣﻨﺒﻊ در ﻓﺮﻛﺎﻧﺲ ﻫﺎي 4 ،2 ،1و 8ﻣﮕﺎﻫﺮﺗﺰ ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷـﺪ و ﻣﻘـﺪار آن در دﻣﺎي 25درﺟﻪ و وﻟﺘﺎژ 5وﻟﺖ ﻛﺎﻟﻴﺒﺮه ﺷﺪه اﺳﺖ ﻛﻪ در اﻳﻦ وﺿﻌﻴﺖ ﻣﻤﻜﻦ اﺳﺖ ﺗﺎ 3درﺻﺪ در ﻛﻼك اﻳﺠﺎد ﺷﺪه وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ .ﻓﺮﻛﺎﻧﺲ ﻧﻮﺳﺎن ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﺗﻌﻴﻴﻦ ﺷﺪه و ﻣﻄـﺎﺑﻖ ﺟـﺪول زﻳـﺮ ﻣـﻲ ﺑﺎﺷﺪ .در اﻳﻦ وﺿﻌﻴﺖ CKOPTﻧﺒﺎﻳﺪ ﭘﺮوﮔﺮام ﺷﻮد.
-٨-
Page |9
www.eca.ir
اﺳﻴﻼﺗﻮر RCﺧﺎرﺟﻲ :در ﻛﺎرﺑﺮدﻫﺎﻳﻲ ﻛﻪ دﻗﺖ ﻛﻼك اﻫﻤﻴﺖ زﻳﺎدي ﻧﺪارد ﻣـﻲ ﺗـﻮان از اﻳـﻦ ﻣﻨﺒـﻊ اﺳـﺘﻔﺎده ﻛـﺮد. 1 ﭘﻴﻜﺮﺑﻨﺪي ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﺑﻮده و ﻓﺮﻛﺎﻧﺲ ﻧﻮﺳﺎن از راﺑﻄﻪ ي 3 RC
= fﺑﺪﺳﺖ ﻣﻲ آﻳﺪ .ﺣﺪاﻗﻞ ﻣﻘﺪار Cﺑﺮاﺑـﺮ 22
ﭘﻴﻜﻮﻓﺎراد ﺑﻮده و در ﺻﻮرﺗﻲ ﻛﻪ CKOPTﭘﺮوﮔﺮام ﺷﻮد ﻣﻲ ﺗﻮان ﻣﻘﺪار 36ﭘﻴﻜﻮﻓﺎراد را ﻧﻴﺰ ﻟﺤﺎظ ﻧﻤﻮد.
R XTAL1 C
CKOPT 36 pF
XTAL2
اﻳﻦ ﻣﻨﺒﻊ ﻧﻮﺳﺎن ﻣﻲ ﺗﻮاﻧﺪ در ﭼﻬﺎر Modeﻛﺎري ﻋﻤﻞ ﻛﻨﺪ ﻛﻪ ﻫﺮ ﻛﺪام ﺑﺮاي ﻳﻚ ﺑﺎزه ي ﻓﺮﻛﺎﻧﺴﻲ ﺑﻬﻴﻨﻪ ﺷﺪه اﺳﺖ و ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﻧﺘﺨﺎب ﻣﻲ ﺷﻮد.
اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ﻓﺮﻛﺎﻧﺲ ﭘﺎﻳﻴﻦ :اﻳﻦ ﻣﻨﺒﻊ ﻛﻼك ﻣﻲ ﺗﻮاﻧﺪ ﻛﺮﻳﺴﺘﺎل ﻫﺎي ﻓﺮﻛﺎﻧﺲ ﭘﺎﻳﻴﻦ ﻣﺜﻞ ﻛﺮﻳﺴﺘﺎل ﺳﺎﻋﺖ ﺑﺎ ﻓﺮﻛﺎﻧﺲ 32768ﻫﺮﺗﺰ ﺑﺎﺷﺪ .ﺑﺎ دادن ﻣﻘﺪار 1001ﺑﻪ ﻓﻴﻮزﺑﻴﺖ ﻫﺎي CKSELﻣﻨﺒﻊ ﻛﻼك ﻛﺮﻳﺴﺘﺎل ﺧﺎرﺟﻲ ﻓﺮﻛﺎﻧﺲ
-٩-
P a g e | 10
www.eca.ir
ﭘﺎﻳﻴﻦ اﻧﺘﺨﺎب ﺷﺪه و در اﻳﻦ وﺿﻌﻴﺖ ﭘﻴﻜﺮﺑﻨﺪي ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ .در ﺻﻮرت ﭘﺮوﮔﺮام ﻧﻤﻮدن CKOPT ﻣﻲ ﺗﻮان از ﺧﺎزن ﺧﺎرﺟﻲ ﺻﺮﻓﻨﻈﺮ ﻧﻤﻮد.
36 pF
CKOPT XTAL1
C1
XTAL
Rf XTAL2
C2 CKOPT 36 pF
ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ ﻳﺎ رزوﻧﺎﺗﻮر ﺳﺮاﻣﻴﻜﻲ :ﭘـﺒﻦ ﻫـﺎي XTAL1و XTAL2ﺑـﻪ ﺗﺮﺗﻴـﺐ ورودي و ﺧﺮوﺟـﻲ ﻳـﻚ ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي واروﻧﮕﺮ ﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﻋﻨﻮان ﻳﻚ اﺳﻴﻼﺗﻮر On-chipﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﭘﻴﻜﺮﺑﻨﺪي ﺷﻮﻧﺪ.
- ١٠ -
P a g e | 11
www.eca.ir
XTAL1
C1
XTAL
Rf XTAL2
C2
• ﺑﻪ ﺟﺎي ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ ﻣﻲ ﺗﻮان از رزوﻧﺎﺗﻮر ﺳﺮاﻣﻴﻜﻲ اﺳﺘﻔﺎده ﻧﻤـﻮد ﻛـﻪ از دوام ﺑﻴﺸـﺘﺮي در ﻣﻘﺎﺑـﻞ ﺿـﺮﺑﻪ ﺑـﺮ ﺧﻮردار اﺳﺖ و زﻣﺎن Startupﻛﻤﺘﺮي ﻧﻴﺰ دارد و اﻟﺒﺘﻪ ﻧﺴﺒﺖ ﺑﻪ ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ دﻗـﺖ ﻛﻤﺘـﺮي داﺷـﺘﻪ و ﭘﺎﻳـﺪاري دﻣﺎﻳﻲ آن ﻧﻴﺰ ﻛﻤﺘﺮ اﺳﺖ.
• در اﻳﻦ وﺿﻌﻴﺖ ﺧﺎزن ﻫﺎي 36ﭘﻴﻜﻮ ﻓﺎراد ﺣﺬف ﺷﺪه و ﻋﻤﻠﻜﺮد ﻓﻴﻮزﺑﻴﺖ CKOPTﻧﻴﺰ ﺗﻐﻴﻴﺮ ﻣـﻲ ﻛﻨـﺪ .ﺑـﺪﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻪ ﺑﺎ ﭘﺮوﮔﺮام ﺷﺪن اﻳﻦ ﺑﻴﺖ داﻣﻨﻪ ي ﺧﺮوﺟﻲ ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي واروﻧﮕﺮ اﻓـﺰاﻳﺶ ﻳﺎﻓﺘـﻪ و ﻣـﻲ ﺗـﻮان از ﭘـﻴﻦ XTAL2ﺑﻪ ﻋﻨﻮان ﻛﻼك ﺑﺮاي ﻳﻚ وﺳﻴﻠﻪ ي دﻳﮕﺮ اﺳﺘﻔﺎده ﻧﻤﻮد .ﻫﻤﭽﻨﻴﻦ ﺑﺎ ﻓﻌﺎل ﻛﺮدن CKOPTدر ﻣﺤﻴﻂ ﻫﺎي ﻧﻮﻳﺰي ﻋﻤﻠﻜﺮد اﺳﻴﻼﺗﻮر ﺑﻬﺒﻮد ﻣﻲ ﻳﺎﺑﺪ.
• ﭼﻨﺎﻧﭽﻪ از رزوﻧﺎﺗﻮر اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﺑﺮاي ﻓﺮﻛﺎﻧﺲ ﻫﺎي ﺑﺎﻻﺗﺮ از 8ﻣﮕﺎﻫﺮﺗﺰ ﺑﺎﻳﺪ CKOPTﭘﺮوﮔﺮام ﺷﻮد.
اﺳﻴﻼﺗﻮر ﻣﻲ ﺗﻮاﻧﺪ در ﺳﻪ وﺿﻌﻴﺖ ﻣﺘﻔﺎوت ﻧﻮﺳﺎن ﻛﻨﺪ ﻛﻪ ﻫﺮﻛﺪام ﺑﺮاي ﻳﻚ ﻣﺤﺪوده ي ﻓﺮﻛﺎﻧﺴﻲ ﺑﻬﻴﻨﻪ ﺷﺪه اﺳﺖ و آن را ﻣﻲ ﺗﻮان ﺑﺎ ﻓﻴﻮز ﺑﻴﺖ ﻫﺎي CKSELﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﻧﺘﺨﺎب ﻧﻤﻮد.
- ١١ -
P a g e | 12
www.eca.ir
Áﺑﺎ ﻫﺮ ﻳﻚ از ﻣﻨﺎﺑﻊ ﻛﻼك اﻧﺘﺨﺎب ﺷﺪه ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي ،CKSELدو ﺑﻴﺖ ﺑﻪ ﻧﺎم ﻫﺎي ] SUT[1:0ﻧﻴﺰ وﺟﻮد دارد ﻛﻪ از ﻃﺮﻳﻖ آن ﻣﻲ ﺗﻮان ﺣﺪاﻛﺜﺮ زﻣﺎن Start-upﻣﻨﺒﻊ ﻛﻼك را ﺑﻪ ﻣﻴﻜﺮو اﻋﻼم ﻧﻤﻮد .ﻣﻘﺪار اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺑﻪ ﻃﻮر ﭘﻴﺶ ﻓﺮض ﻣﺎﻛﺰﻳﻤﻢ زﻣﺎن Start-upرا در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮد و در ﺻﻮرﺗﻲ ﻛـﻪ ﻧﻴـﺎز اﺳـﺖ ﻣﻘـﺪار آن را ﺗﻐﻴﻴـﺮ دﻫﻴﺪ ﻣﻄﺎﺑﻖ ﺟﺪاول ﻣﺮﺑﻮﻃﻪ در ﻓﺼﻞ System Clock and Clock Optionsدر Datatsheetﻋﻤﻞ ﻛﻨﻴﺪ.
•
ﻣﻨﺎﺑﻊ Reset
ﺑﺎ Resetﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ،ﺗﻤﺎم رﺟﻴﺴﺘﺮﻫﺎي I/Oﺑﻪ ﻣﻘﺪار اوﻟﻴﻪ ﺷﺎن ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﻨﺪ و CPUﺷﺮوع ﺑﻪ اﺟﺮاي دﺳﺘﻮراﻟﻌﻤﻞ ﻫﺎ از ﺑﺮدار Resetﺧﻮاﻫﺪ ﻛﺮد .در ﻗﻄﻌﻪ ي 5 Mega16ﻣﻨﺒﻊ Resetوﺟﻮد دارد ﻛﻪ ﻋﺒﺎرﺗﻨﺪ از:
- ١٢ -
Power-on Reset
1.
External Reset
2.
Brown-out Reset
3.
Watchdog Reset
4.
JTAG AVR Reset
5.
P a g e | 13
www.eca.ir
ﻣﻨﻄﻖ Resetﻣﻄﺎﺑﻖ دﻳﺎﮔﺮام زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
ﻣﺸﺨﺼﺎت ﻫﺮ ﻳﻚ از ﻣﻨﺎﺑﻊ Resetرا در ﺟﺪول زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ:
- ١٣ -
P a g e | 14
www.eca.ir
.1
:Power-on Resetزﻣﺎﻧﻲ ﻓﻌﺎل ﺧﻮاﻫﺪ ﻛﻪ وﻟﺘﺎژ Vccﻛﻤﺘﺮ از ﺣﺪ ﺗﻌﻴﻴﻦ ﺷﺪه ﺑﺎﺷﺪ .اﻳﻦ ﻣﻨﺒـﻊ ﺗﻀـﻤﻴﻦ
ﻣﻲ ﻛﻨﺪ ﻛﻪ وﺳﻴﻠﻪ در زﻣﺎن راه اﻧﺪازي Resetﻣﻲ ﺷﻮد .ﺑﺎ رﺳﻴﺪن وﻟﺘﺎژ ﺑﻪ ﺣﺪ آﺳﺘﺎﻧﻪ ،ﺷﻤﺎرﻧﺪه ي ﺗﺎﺧﻴﺮ راه اﻧـﺪازي ﺷﺪه ﻛﻪ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﭼﻪ ﻣﺪت وﺳﻴﻠﻪ در وﺿﻌﻴﺖ Resetﺑﻤﺎﻧﺪ .دﻳﺎﮔﺮام زﻣﺎﻧﻲ زﻳﺮ ﺷﺮاﻳﻄﻲ را ﻧﺸﺎن ﻣﻲ دﻫـﺪ ﻛـﻪ ﭘﻴﻦ RESETﺑﻪ Vccوﺻﻞ ﺷﺪه اﺳﺖ) .و ﻳﺎ آزاد ﺑﺎﺷﺪ ﭼﻮن اﻳﻦ ﭘﻴﻦ از داﺧﻞ Pull-upﺷﺪه اﺳﺖ(.
و ﻧﻤﻮدار زﻳﺮ ﺷﺮاﻳﻄﻲ اﺳﺖ ﻛﻪ ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﭘﻴﻦ Resetﺗﺎﺑﻊ Vccﻧﻤﻲ ﺑﺎﺷﺪ:
- ١٤ -
P a g e | 15
www.eca.ir
:External Reset .2اﻳﻦ Resetﺑﻮﺳﻴﻠﻪ ي ﻳﻚ ﭘﺎﻟﺲ ﺑﺎ ﺳﻄﺢ ﺻﻔﺮ ﻣﻨﻄﻘﻲ روي ﭘﻴﻦ RESETاﻳﺠﺎد ﺷﺪه و ﺣﺪاﻗﻞ ﻋﺮض آن 1,5ﻣﻴﻜﺮو ﺛﺎﻧﻴﻪ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺎ رﺳﻴﺪن وﻟﺘﺎژ اﻳﻦ ﭘﻴﻦ ﺑﻪ ﻣﻘﺪار آﺳﺘﺎﻧﻪ در ﻟﺒﻪ ﺑﺎﻻ روﻧـﺪه ،ﺷـﻤﺎرﻧﺪه ي ﺗﺎﺧﻴﺮ ﺷﺮوع ﺑﻪ ﻛﺎر ﻛﺮده و ﭘﺲ از اﺗﻤﺎم زﻣﺎن Time-outﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻛﺎر ﺧﻮد را ﺷﺮوع ﺧﻮاﻫﺪ ﻛﺮد.
.3
:Brown-out Detectionﻗﻄﻌـﻪ ي ATmega16داراي ﻳـﻚ ﻣـﺪار Brown-out Detection
داﺧﻠﻲ ﺑﻮده ﻛﻪ ﭘﻴﻮﺳﺘﻪ ﻣﻘﺪار وﻟﺘﺎژ Vccرا ﺑﺎ ﻳﻚ ﻣﻘﺪار ﺛﺎﺑﺖ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻣﻘﺪار ﺛﺎﺑﺖ ﺑﺮاﺑﺮ 2,7وﻟﺖ ﺑـﻮده و در ﺻﻮرﺗﻲ ﻛﻪ ﻓﻴﻮزﺑﻴﺖ BODLEVELﭘﺮوﮔﺮام ﺷﻮد ﺑﻪ 4,0وﻟﺖ اﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ .ﺑﺎ ﻛﻤﺘﺮ ﺷﺪن وﻟﺘـﺎژ ﺗﻐﺬﻳـﻪ از اﻳﻦ ﻣﻘﺪار ﺛﺎﺑﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ وارد ﺣﺎﻟﺖ Resetﺷﺪه و ﺑﺎ ﻋﺎدي ﺷﺪن وﻟﺘﺎژ ،ﭘـﺲ از اﺗﻤـﺎم ﺗـﺎﺧﻴﺮ ﺑـﻪ وﺿـﻌﻴﺖ ﻋﺎدي ﺑﺎز ﻣﻲ ﮔﺮدد .ﺑﺮاي ﺣﻔﺎﻇﺖ در ﺑﺮاﺑﺮ Spikeﻣﻘﺪار آﺳﺘﺎﻧﻪ داراي ﭘﺴـﻤﺎﻧﺪ ﺑـﻮده و در ﻧﺘﻴﺠـﻪ داراي دو ﻣﻘـﺪار
- ١٥ -
P a g e | 16
www.eca.ir
ﻣﺜﺒﺖ و ﻣﻨﻔﻲ ﻣﻲ ﺑﺎﺷـﺪ ﻛـﻪ ﺑـﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﻣﻘـﺎدﻳﺮ ﻣﻮﺟـﻮد در ﺟـﺪول از راﺑﻄـﻪ ي VBOT+ = VBOT + VHYST / 2و VBOT− = VBOT − VHYST / 2ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ.
Áﻣـﺪار Brown-out Detectionدر ﺣﺎﻟـﺖ ﻋـﺎدي ﻏﻴـﺮ ﻓﻌـﺎل ﺑـﻮده و ﺑـﺮاي راه اﻧـﺪازي آن ﺑﺎﻳـﺪ ﻓﻴﻮزﺑﻴـﺖ BODENﭘﺮوﮔﺮام )ﺻﻔﺮ( ﺷﻮد.
:Watchdog Reset .4ﺑﺎ اﺗﻤﺎم زﻣﺎن ﺗﺎﻳﻤﺮ ،Watchdogاﻳﻦ ﺗﺎﻳﻤﺮ ﻳﻚ ﭘﺎﻟﺲ ﺑـﻪ ﻋـﺮض ﻳـﻚ ﺳـﻴﻜﻞ اﻳﺠـﺎد ﺧﻮاﻫﺪ ﻛﺮد .در ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي اﻳﻦ ﭘﺎﻟﺲ ،ﺗﺎﻳﻤﺮ ﺗﺎﺧﻴﺮ ﺷﺮوع ﺑﻪ ﺷﻤﺎرش زﻣﺎن ﺗﺎﺧﻴﺮ ﻛﺮده و ﭘـﺲ ازاﺗﻤـﺎم آن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻛﺎر ﻋﺎدي ﺧﻮد را اداﻣﻪ ﺧﻮاﻫﺪ داد.
- ١٦ -
P a g e | 17
www.eca.ir
MCU Control and Status Register
MCUCSR ﻧﺎم ﺑﻴﺖ
7
6
5
4
3
2
1
0
JTD ISC2 - JTRF WDRF BORF EXTRF PORF
ﺷﺪهCPU ﺑﺎﻋﺚ راه اﻧﺪازي ﻣﺠﺪدReset اﻳﻦ رﺟﻴﺴﺘﺮ ﻣﺤﺘﻮي اﻃﻼﻋﺎﺗﻲ اﺳﺖ ﻛﻪ ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻛﺪاﻣﻴﻚ از ﻣﻨﺎﺑﻊ Reset ﭘﺮﭼﻢ را ﭘـﺎك ﻛﻨـﺪ ﺗـﺎ در ﺻـﻮرت، ﻧﺮم اﻓﺰار ﭘﺲ از ﺧﻮاﻧﺪن ﻫﺮ ﺑﻴﺖ ﺑﺎﻳﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﺻﻔﺮ ﺑﺮ روي آن.اﺳﺖ . وﻗﻮع آن ﻗﺎﺑﻞ ﺗﺸﺨﻴﺺ ﺑﺎﺷﺪ،ﻣﺠﺪد
Bit 0 – PORF: Power-on Reset Flag Bit 1 – EXTRF: External Reset Flag Bit 2 – BORF: Brown-out Reset Flag Bit 3 – WDRF: Watchdog Reset Flag Bit 4 – JTRF: JTAG Reset Flag
- ١٧ -
P a g e | 18
www.eca.ir
آﺷﻨﺎﻳﻲ ﺑﺎ زﺑﺎن C • ﻫﺮ ﺑﺮﻧﺎﻣﻪ ي Cﺣﺪاﻗﻞ ﻳﻚ ﺗﺎﺑﻊ )( mainدارد) .اﻳﻦ اوﻟﻴﻦ ﺗﺎﺑﻊ اﺟﺮاﻳﻲ اﺳﺖ(. • ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮي در ﺳﺎده ﺗﺮﻳﻦ ﺣﺎﻟﺖ ﺧﻮد ﺑﻪ ﺷﻜﻞ زﻳﺮ اﺳﺖ: ﺗﻌﺎرﻳﻒ ﻛﻠﻲ اﻟﮕﻮي ﺗﻮاﺑﻊ
)(void main { {)while(1 . . . } }
ﺗﻮاﺑﻊ ﺗﻌﺮﻳﻒ ﺷﺪه
• ﺑﺮﻧﺎﻣﻪ ي ﺳﺎده ي زﻳﺮ رﺷﺘﻪ ي Hello Worldرا ﺑﻪ ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد ارﺳﺎل ﻣﻲ ﻛﻨﺪ.
- ١٨ -
P a g e | 19
www.eca.ir
>#include<stdio.h )(void main { ;)"!printf("Hello World ;)while(1 } • ﺧﻂ اول از رﻫﻨﻤﻮد ﻫﺎي ﭘﻴﺶ ﭘﺮدازﻧﺪه اﺳﺖ. • ) while(1اﻳﺠﺎد ﻳﻚ ﺣﻠﻘﻪ ي ﻧﺎﻣﺘﻨﺎﻫﻲ ﻣﻲ ﻛﻨﺪ. • در اﻧﺘﻬﺎي ﻫﺮ ﻋﺒﺎرت ﻳﻚ ﺳﻤﻲ ﻛﺎﻟﻦ ﻣﻲ آﻳﺪ. • Braceاﺑﺘﺪا و اﻧﺘﻬﺎي ﻳﻚ ﺗﺎﺑﻊ و ﻫﻤﭽﻨﻴﻦ ﻳﻚ ﺑﻠﻮك را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ. • از " " ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن اﺑﺘﺪا و اﻧﺘﻬﺎي ﻳﻚ رﺷﺘﻪ ي ﻣﺘﻨﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد. • از //ﻳﺎ /* … */ﺑﺮاي ﻧﻮﺷﺘﻦ ﺗﻮﺿﻴﺤﺎت اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد. • ﺷﻨﺎﺳﻪ ﻫﺎ اﺳﺎﻣﻲ ﻣﺘﻐﻴﺮﻫﺎ ،ﺛﻮاﺑﺖ و ﻳﺎ ﺗﻮاﺑﻊ ﻫﺴﺘﻨﺪ. • ﺷﻨﺎﺳﻪ ﻫﺎ ﻧﻤﻲ ﺗﻮاﻧﺪ از ﻛﻠﻤﺎت رزرو ﺷﺪه ﺑﺎﺷﻨﺪ و ﻫﻤﭽﻨﻴﻦ ﻧﻤﻲ ﺗﻮاﻧﻨﺪ ﺑﺎ ﻳﻚ ﻛﺎراﻛﺘﺮ ﻋﺪدي ﺷﺮوع ﺷﻮد و ﻃﻮل آن ﻫﺎ ﺑﺎﻳﺪ ﻛﻤﺘﺮ از 31ﻛﺎراﻛﺘﺮ ﺑﺎﺷﺪ. • Cﻳﻚ زﺑﺎن Case Sensitiveاﺳﺖ و ﺑﻴﻦ ﺣﺮوف ﻛﻮﭼﻚ و ﺑﺰرگ ﺗﻔﺎوت ﻗﺎﺋﻞ ﻣﻲ ﺷﻮد. • ﻛﻠﻤﺎت رزرو ﺷﺪه ﺣﺘﻤﺎ ﺑﺎﻳﺪ ﺑﺎ ﺣﺮف ﻛﻮﭼﻚ اﺳﺘﻔﺎده ﺷﻮﻧﺪ) .ﻣﺜﻞ …(if, char, while,
- ١٩ -
P a g e | 20
www.eca.ir
ﻣﺘﻐﻴﺮ ﻫﺎ و ﺛﻮاﺑﺖ • ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ ﻳﻌﻨﻲ اﻧﺘﺨﺎب ﻧﺎم ﻣﺴﺘﻌﺎر ﺑﺮاي ﻣﻜﺎﻧﻲ از ﺣﺎﻓﻈﻪ • ﻓﺮم ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ:
; ﻧﺎم ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮ
; char a
ﻣﺜﺎل:
اﻧﻮاع داده ﻫﺎ: )Size (Bits
Type
Range 0,1
1
bit
-128 to 127
8
char
0 to 255
8
unsigned char
-128 to 127
8
signed char
-32768 to 32767
16
int
-32768 to 32767
16
short int
0 to 65535
16
unsigned int
-32768 to 32767
16
signed int
-2147483648 to 2147483647
32
long int
0 to 4294967295
32
unsigned long int
-2147483648 to 2147483647
32
signed long int
±1.175e-38 to ±3.402e38
32
float
±1.175e-38 to ±3.402e38
32
double
• ﺑﺮاي ﺗﻌﻴﻴﻦ ﻣﺤﻞ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ از ﻋﻤﻠﮕﺮ @ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.
ﻣﺜﺎل:
;int b@0xA3
• ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ در ﺣﺎﻓﻈﻪ ي EEPROMاز ﻛﻠﻤﻪ ي ﻛﻠﻴﺪي eepromﻗﺒﻞ از ﻧﺎم ﻣﺘﻐﻴﺮ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ. ﻣﺜﺎل:
;eeprom int code
- ٢٠ -
P a g e | 21
www.eca.ir
• ﻣﻲ ﺗﻮان در زﻣﺎن ﺗﻌﺮﻳﻒ ﺑﻪ ﻣﺘﻐﻴﺮ ﻣﻘﺪار اوﻟﻴﻪ داد.
;'char s = 'a
ﻣﺜﺎل:
• ﺗﻌﺮﻳﻒ ﺛﺎﺑﺖ ﺑﺎ ﻛﻠﻤﻪ ي ﻛﻠﻴﺪي constﻳﺎ flashاﻧﺠﺎم ﻣﻲ ﺷﻮد .ﻣﺜﺎل:
; const float pi = 3.14
• ﺑﺎ رﻫﻨﻤﻮد #defineﻣﻲ ﺗﻮان ﻣﺎﻛﺮو ﺗﻌﺮﻳﻒ ﻧﻤﻮد ،در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘﺪاري ﻛﻪ ﺑﺮاي ﺛﺎﺑﺖ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد ﻧﻮع داده را ﺗﻌﻴﻴﻦ ﻛﺮده و ﻣﻘﺎدﻳﺮ ﺗﻌﺮﻳﻒ ﺷﺪه ،ﺗﻮﺳﻂ ﭘﻴﺶ ﭘﺮدازﻧﺪه ﺑﺎ ﻣﻘﺪار ﺛﺎﺑﺖ ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲ ﺷﻮد. ﻣﺜﺎل:
; #define code 100
ﻋﻤﻠﮕﺮﻫﺎي ﺣﺴﺎﺑﻲ و ﺑﻴﺘﻲ
ﻋﻤﻠﮕﺮ
ﻋﻤﻠﻜﺮد
ﻣﺜﺎل
ﻧﺘﻴﺠﻪ
*
ﺿﺮب
3*2
6
/
ﺗﻘﺴﻴﻢ
5 /2
2,5
+
ﺟﻤﻊ
3 +6
9
-
ﺗﻔﺮﻳﻖ
8-3
5
%
ﺑﺎﻗﻴﻤﺎﻧﺪه
10%3
1
&
AND
0xF0 & 0x0F
0x00
|
OR
0x00 | 0x03
0x03
^
XOR
0x0F ^ 0xFF
0xF0
~
ﻣﻜﻤﻞ ﻳﻚ
)~(0xF0
0x0F
>>
ﺷﻴﻔﺖ ﺑﻪ راﺳﺖ
0xF0 >> 4
0x0F
<<
ﺷﻴﻔﺖ ﺑﻪ ﭼﭗ
0x0F << 4
0xF0
- ٢١ -
P a g e | 22
www.eca.ir
ﻋﻤﻠﮕﺮﻫﺎي ﻳﻜﺎﻧﻲ
ﻋﻤﻠﮕﺮ
ﻋﻤﻠﻜﺮد
ﻣﺜﺎل
ﻧﺘﻴﺠﻪ
-
ﻗﺮﻳﻨﻪ
-a
a = a × -1
++
اﻓﺰاﻳﺶ ﻳﻚ واﺣﺪ
a++
a=a+1
--
ﻛﺎﻫﺶ ﻳﻚ واﺣﺪ
a--
a=a-1
ﻋﻤﻠﮕﺮﻫﺎي ﻣﻘﺎﻳﺴﻪ اي
ﻋﻤﻠﮕﺮ
ﻋﻤﻠﻜﺮد
ﻣﺜﺎل
ﻧﺘﻴﺠﻪ
>
ﺑﺰرﮔﺘﺮ
2>3
False
<
ﻛﻮﭼﻜﺘﺮ
''m'>'e
True
=>
ﺑﺰرﮔﺘﺮ ﻳﺎ ﻣﺴﺎوي
5>=5
True
=<
ﻛﻮﭼﻜﺘﺮ ﻳﺎ ﻣﺴﺎوي
2.5<=4
True
==
ﺗﺴﺎوي
''A' =='B
False
=!
ﻧﺎﻣﺴﺎوي
2!=3
True
- ٢٢ -
P a g e | 23
www.eca.ir
ﻋﻤﻠﮕﺮﻫﺎي ﻣﻨﻄﻘﻲ
ﻋﻤﻠﮕﺮ
ﻋﻤﻠﻜﺮد
ﻣﺜﺎل
ﻧﺘﻴﺠﻪ
&&
ANDﻣﻨﻄﻘﻲ
)(2>3)&&(1!=3
False
||
ORﻣﻨﻄﻘﻲ
)('a'<3)||(10
True
!
ﻧﻘﻴﺾ
)!(7>5
False
ﻋﻤﻠﮕﺮﻫﺎي اﻧﺘﺴﺎب
ﻋﻤﻠﮕﺮ
ﻋﻤﻠﻜﺮد
ﻣﺜﺎل
ﻧﺘﻴﺠﻪ
=
اﻧﺘﺴﺎب
a=b
aÕb
=*
ﺿﺮب و اﻧﺘﺴﺎب
a*=b
a=a*b
=/
ﺗﻘﺴﻴﻢ و اﻧﺘﺴﺎب
a/=b
a=a/b
=+
ﺟﻤﻊ و اﻧﺘﺴﺎب
a+= b
a=a+b
=-
ﺗﻔﺮﻳﻖ و اﻧﺘﺴﺎب
a-=b
a=a-b
a=(value)?x:y
اﻧﺘﺴﺎب ﺷﺮﻃﻲ
اﮔﺮ valueﻣﻘﺪار ﺻﺤﻴﺢ ﺑﺎﺷﺪ aﺑﺮاﺑﺮ x و در ﻏﻴﺮاﻳﻨﺼﻮرت ﺑﺮاﺑﺮ yﻣﻲ ﺷﻮد.
- ٢٣ -
P a g e | 24
www.eca.ir
آراﻳﻪ ﻫﺎ آراﻳﻪ ﻫﺎ ﻣﺠﻤﻮﻋﻪ اي از ﻣﺘﻐﻴﺮﻫﺎي ﻫﻤﻨﻮع ﻫﺴﺘﻨﺪ. • ﻓﺮم ﺗﻌﺮﻳﻒ:
; ]ﺗﻌﺪاد ﻋﻨﺎﺻﺮ[اﺳﻢ ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮﻫﺎي آراﻳﻪ
• ﻣﺜﺎل: ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ: •
;}int a[5] = {1,2,3,4,5
ﻓﺮم ﺗﻌﺮﻳﻒ آراﻳﻪ ﻫﺎي دو ﺑﻌﺪي]; :ﻋﺪاد ﻋﻨﺎﺻﺮ ﺳﺘﻮن[]ﺗﻌﺪاد ﻋﻨﺎﺻﺮ ﺳﻄﺮ[اﺳﻢ ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮﻫﺎ ;}}int a[2][3]={{1,2,3},{4,5,6
ﻣﺜﺎل: •
;]int a[5
در زﺑﺎن Cاﻧﺪﻳﺲ آراﻳﻪ ﻫﺎ از ﺻﻔﺮ ﺷﺮوع ﻣﻲ ﺷﻮد.
رﺷﺘﻪ ﻫﺎ رﺷﺘﻪ ﻫﺎ آراﻳﻪ اي ﻛﺎراﻛﺘﺮﻫﺎ ﻫﺴﺘﻨﺪ. •
ﻣﺜﺎل: ﻳﺎ:
;"char name[ ] = "Test ;}'char name[5]={'T','e','s','t','\0
• رﺷﺘﻪ ﻫﺎ ﻫﻤﻮاره ﺑﻪ ﻳﻚ ﻛﺎراﻛﺘﺮ Nullﺧﺘﻢ ﻣﻲ ﺷﻮﻧﺪ.
- ٢٤ -
P a g e | 25
www.eca.ir
ﺗﺼﻤﻴﻢ ﮔﻴﺮي و اﻧﺘﺨﺎب
cدﺳﺘﻮر :goto ﭘﺮش ﺑﺪون ﺷﺮط ﺑﻪ ﻳﻚ ﺑﺮﭼﺴﺐ اﻧﺠﺎم ﻣﻲ ﺷﻮد.
dﺳﺎﺧﺘﺎر :if - else )ﺷﺮط(if { ;دﺳﺘﻮرات1 } else { ;دﺳﺘﻮرات 2 } 9
در ﺻﻮرﺗﻲ ﻛﻪ دﺳﺘﻮرات ﻳﻚ ﺧﻄﻲ ﺑﺎﺷﻨﺪ ﻣﻲ ﺗﻮان braceرا ﺣﺬف ﻧﻤﻮد.
9
اﺳﺘﻔﺎده از ﺑﻼك elseاﺧﺘﻴﺎري اﺳﺖ.
ﻣﺜﺎل:
>#include<stdio.h
{)(void main - ٢٥ -
P a g e | 26
www.eca.ir
int a;
printf("Enter a Number: "); scanf("%d",&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 ﺳﺎﺧﺘﺎرe switch()ﻣﻘﺪار { case
1ﻣﻘﺪار:
1;دﺳﺘﻮرات break; case
2ﻣﻘﺪار:
2;دﺳﺘﻮرات break; - ٢٦ -
P a g e | 27
www.eca.ir
. . default: n ;دﺳﺘﻮرات } :ﻣﺜﺎل #include<stdio.h> void main(){ int a; printf("Enter Month of your birth: "); scanf("%d",&a); switch(a){ case 1: case 2: case 3: printf("You've born is spring\n"); break; case 4: case 5: case 6: printf("You've born is summer\n"); break; case 7: case 8: case 9: printf("You've born is autumn\n"); - ٢٧ -
P a g e | 28
www.eca.ir
break; case 10: case 11: case 12: printf("You've born is winter\n"); break; default: printf("Error! Enter a number between 112\n"); } }
ﺣﻠﻘﻪ ﻫﺎي ﺗﻜﺮار
:While ﺳﺎﺧﺘﺎرc while()ﺷﺮط { ;دﺳﺘﻮرات }
:ﻣﺜﺎل #include<stdio.h> void main(){ - ٢٨ -
P a g e | 29
www.eca.ir
;char a ;)"printf("Enter E to exit\n ;)(while(a != 'E') a=getchar }
dﺳﺎﺧﺘﺎر :Do/While {do ;دﺳﺘﻮرات )ﺷﺮط(} while
9در ﺳﺎﺧﺘﺎر Do/Whileﺑﺮ ﺧﻼف Whileﺷﺮط در اﻧﺘﻬﺎي ﺣﻠﻘﻪ آزﻣﺎﻳﺶ ﻣﻲ ﺷﻮد ،ﺑﻨﺎﺑﺮاﻳﻦ دﺳﺘﻮرات داﺧﻞ ﺣﻠﻘﻪ ،ﺣﺪاﻗﻞ ﻳﻜﺒﺎر اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ.
eﺣﻠﻘﻪ ﻫﺎي :For )ﮔﺎم ; ﺷﺮط ﭘﺎﻳﺎن ; ﻣﻘﺪار اﺑﺘﺪاي ﺣﻠﻘﻪ(for { ;دﺳﺘﻮرات }
- ٢٩ -
P a g e | 30
www.eca.ir
:ﻣﺜﺎل
#include<stdio.h>
void main(){
int a,i; long int fact=1;
printf("Enter a Number: "); scanf("%d",&a);
if(a<0) printf("Error! You must Enter a positive number\n"); else if(a==0) printf("Factorial of 1 is 1\n"); else{ for(i=1;i<=a;i++) fact*=i; printf("Factorial of %d is %d\n",a,fact); } }
- ٣٠ -
P a g e | 31
www.eca.ir
9
دﺳﺘﻮر breakﺑﺎﻋﺚ ﺧﺮوج ﺑﺪون ﺷﺮط از ﻫﺮ ﺣﻠﻘﻪ اي ﻣﻲ ﺷﻮد.
9
دﺳﺘﻮر continueﺑﺎﻋﺚ ﻣﻲ ﺷﻮد اﺟﺮاي اداﻣﻪ دﺳﺘﻮرات ﻣﺘﻮﻗﻒ ﺷﺪه و ﺣﻠﻘﻪ از اﺑﺘﺪا آﻏﺎز ﺷﻮد.
ﺗﻮاﺑﻊ ﺗﻌﺮﻳﻒ ﺗﻮاﺑﻊ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
)آرﮔﻮﻣﺎﻧﻬﺎي ﺗﺎﺑﻊ( ﻧﺎم ﺗﺎﺑﻊ
ﻧﻮع داده ﺧﺮوﺟﻲ {
ﻣﺘﻐﻴﺮﻫﺎي ﻣﺤﻠﻲ دﺳﺘﻮرات ﺗﺎﺑﻊ }
= ﺗﻮاﺑﻊ داﺧﻞ ﻳﻜﺪﻳﮕﺮ ﻗﺎﺑﻞ ﺗﻌﺮﻳﻒ ﻧﻤﻲ ﺑﺎﺷﻨﺪ و ﺟﺪا از ﻫﻢ ﺑﺎﻳﺪ ﺗﻌﺮﻳﻒ ﮔﺮدﻧﺪ.
ﻣﺜﺎل:
>#include <stdio.h
;)long int cube(int x
{)(void main - ٣١ -
P a g e | 32
www.eca.ir
int a;
printf("Enter a number: "); scanf("%d",&a); printf("Cube of %d is %d\n",a,cube(a));
}
long int cube(int x){ return x*x*x; }
:ﻣﺜﺎل
#include<stdio.h> int _max(int a,int b); void main(){ int a,b; printf("Enter Two Numbers: "); scanf("%d%d",&a,&b); printf("Maximum of %d and %d is %d\n",a,b,_max(a,b)); - ٣٢ -
P a g e | 33
www.eca.ir
} int _max(int a,int b){ if(a>b) return a; else return b; }
- ٣٣ -
P a g e | 34
www.eca.ir
ﻓﻼﺷﺮ ﺳﺎده:1 ﭘﺮوژه
/***************************************************** Project : LED Flasher Author
: Reza Sepas Yar
Company : Pishro Noavaran Kavosh *****************************************************/ #include<mega16.h> #include<delay.h> #define xtal 1000000 int i; void main (void) { DDRA = 0xFF;
//. ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ1 ﺑﺮاي درك ﻋﻤﻠﻜﺮد اﻳﻦ ﻋﺒﺎرت ﺑﻪ ﭘﻴﻮﺳﺖ
while(1) { for(i = 1; i <= 128; i = i*2) { PORTD = i; delay_ms(100); } - ٣٤ -
P a g e | 35
www.eca.ir
for(i = 64; i > 1; i = i/2) { PORTD = i; delay_ms(100); } } }
- ٣٥ -
P a g e | 36
www.eca.ir
7-Segment ﻛﺎﻧﺘﺮ ﻳﻚ رﻗﻤﻲ ﺑﺎ:2 ﭘﺮوژه
/***************************************************** Project : Key Counter Author
: Reza Sepas Yar
Company : Pishro Noavaran Kavosh *****************************************************/ #include <mega16.h> #define xtal 4000000 flash char digits[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; unsigned char p_state; unsigned char key; unsigned char i; void main(void) { DDRD = 0xFF; PORTD = digits[0]; DDRC = 0x00; PORTC = 0xFF; while(1) { key = PINC & 0b00000001; - ٣٦ -
P a g e | 37
www.eca.ir
delay_ms(10); if(key==0) { if(key!=p_state) { if(i==15) { i=0; PORTD=digits[i]; } else i++; PORTD = digits[i]; p_state=0; }; } else p_state=1; } }
- ٣٧ -
P a g e | 38
www.eca.ir
ﺟﺪول زﻳﺮ وﺿﻌﻴﺖ ﺳﮕﻤﻨﺖ ﻫﺎي 7-Segﻛﺎﺗﺪ ﻣﺸﺘﺮك را ﻧﺸﺎن ﻣﻲ دﻫﺪ) .ﺑﺮاي ﻧﻮع آﻧﺪ ﻣﺸﺘﺮك اﻋﺪادرا ﻣﻜﻤﻞ ﻛﻨﻴﺪ(.
HEX
a
b
c
d
e
f
g
Dp
ﻛﺎراﻛﺘﺮ
0x3F
1
1
1
1
1
1
0
0
0
0x06
0
1
1
0
0
0
0
0
1
0x5B
1
1
0
1
1
0
1
0
2
0x4F
1
1
1
1
0
0
1
0
3
0x66
0
1
1
0
0
1
1
0
4
0x6D
1
0
1
1
0
1
1
0
5
0x7D
1
0
1
1
1
1
1
0
6
0x07
1
1
1
0
0
0
0
0
7
0x7F
1
1
1
1
1
1
1
0
8
0x6F
1
1
1
1
0
1
1
0
9
0x77
1
1
1
0
1
1
1
0
A
0x7C
0
0
1
1
1
1
1
0
b
- ٣٨ -
P a g e | 39
www.eca.ir C
0
0
1
1
1
0
0
1
0x39
d
0
1
0
1
1
1
1
0
0x5E
E
0
1
1
1
1
0
0
1
0x79
F
0
1
1
1
0
0
0
1
0x71
- ٣٩ -
P a g e | 40
www.eca.ir
(LCD) ﻧﻤﺎﻳﺸﮕﺮ ﻛﺮﻳﺴﺘﺎل ﻣﺎﻳﻊ:3 ﭘﺮوژه
/***************************************************** Project : LCD Interfacing Author
: Reza Sepas Yar
Company : Pishro Noavaran Kavosh *****************************************************/ #include <stdio.h> #include <mega16.h> #include <delay.h> #include
#define xtal 4000000
#asm .equ __lcd_port=0x1B ;PORTA #endasm void main(void) { char buffer[10]; unsigned char w; PORTB=0xFF; DDRB=0x00;
- ٤٠ -
P a g e | 41
www.eca.ir
lcd_init(16); lcd_clear(); while (1){ w = ~PINB; if(w!=0x00) { lcd_clear(); lcd_gotoxy(0,0); sprintf(buffer,"Number=%d",w); lcd_puts(buffer); delay_ms(100); } else { lcd_clear(); lcd_putsf("Number=0"); delay_ms(100); } } }
- ٤١ -
P a g e | 42
www.eca.ir
- ٤٢ -
P a g e | 43
www.eca.ir
اﺳﻜﻦ ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻣﺎﺗﺮﻳﺴﻲ:4 ﭘﺮوژه
/***************************************************** Project : Keypad Scan Author
: Reza Sepas Yar
Company : Pishro Noavaran Kavosh *****************************************************/ #include <mega16.h> #include <delay.h> #define xtal 4000000 unsigned char key, butnum; flash unsigned char keytbl[16]={0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb, 0xb7, 0x7e, 0x7d, 0x7b, 0x77}; void main(void) { DDRB = 0xff; PORTB = 0xff; while(1) { DDRC = 0x0f; - ٤٣ -
P a g e | 44
www.eca.ir
PORTC = 0xf0; delay_us(5); key = PINC; DDRC = 0xf0; PORTC = 0x0f; delay_us(5); key = key | PINC; delay_ms(10); if (key != 0xff) { for (butnum=0; butnum<16; butnum++) { if (keytbl[butnum]==key) } if (butnum==16) butnum=0; else butnum++; } else butnum=0; PORTB = ~ butnum ; } }
- ٤٤ -
break;
P a g e | 45
www.eca.ir
- ٤٥ -
P a g e | 46
www.eca.ir
LED Dot Matrix ﻧﻤﺎﻳﺸﮕﺮﻫﺎي:5 ﭘﺮوژه
/***************************************************** 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<
P a g e | 47
www.eca.ir
PORTB=0xFF; } } }
- ٤٧ -
P a g e | 48
www.eca.ir
وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ
. ﻣﻮرد از آن ﻫﺎ وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﻣﻲ ﺑﺎﺷﻨﺪ3 ﻣﻨﺒﻊ وﻗﻔﻪ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ21 دارايATmega16 ﻗﻄﻌﻪ ي
ﻧﺎم در
ﺷﻤﺎره
آدرس
ﻣﻨﺒﻊ وﻗﻔﻪ
ﺗﻮﺿﻴﺢ
CodeVision 1
$000
RESET
External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset
2
EXT_INT0
$002
INT0
External Interrupt Request 0
3
EXT_INT1
$004
INT1
External Interrupt Request 1
4
TIM2_COMP
$006
TIMER2 COMP
Timer/Counter2 Compare Match
5
TIM2_OVF
$008
TIMER2 OVF
Timer/Counter2 Overflow
6
TIM1_CAPT
$00A
TIMER1 CAPT
Timer/Counter1 Capture Event
7
TIM1_COMPA
$00C
TIMER1 COMPA
Timer/Counter1 Compare Match A
8
TIM1_COMPB
$00E
TIMER1 COMPB
Timer/Counter1 Compare Match B
9
TIM1_OVF
$010
TIMER1 OVF
Timer/Counter1 Overflow
10
TIM0_OVF
$012
TIMER0 OVF
Timer/Counter0 Overflow
11
SPI_STC
$014
SPI, STC
Serial Transfer Complete
12
USART_RXC
$016
USART, RXC
USART, Rx Complete
13
USART_DRE
$018
USART, UDRE
USART Data Register Empty
14
USART_TXC
$01A
USART, TXC
USART, Tx Complete
15
ADC_INT
$01C
ADC
ADC Conversion Complete
16
EE_RDY
$01E
EE_RDY
EEPROM Ready
17
ANA_COMP
$020
ANA_COMP
Analog Comparator
18
TWI
$022
TWI
Two-wire Serial Interface
- ٤٨ -
•
P a g e | 49
www.eca.ir External Interrupt Request 2
INT2
$024
EXT_INT2
Timer/Counter0 Compare Match
TIMER0 COMP
$026
TIM0_COMP
20
Store Program Memory Ready
SPM_RDY
$028
SPM_READY
21
19
• آدرس ﻫﺎي ﭘﺎﻳﻴﻦ ﺗﺮ داراي اوﻟﻮﻳﺖ ﺑﺎﻻﺗﺮي ﻣﻲ ﺑﺎﺷﻨﺪ و در ﺻﻮرت درﺧﻮاﺳﺖ ﻫﻤﺰﻣﺎن دو ﻳﺎ ﭼﻨﺪ وﻗﻔﻪ اﺑﺘﺪا ﺑﻪ اوﻟﻮﻳﺖ ﺑﺎﻻﺗﺮ ﭘﺎﺳﺦ داده ﻣﻲ ﺷﻮد و ﭘﺲ از آن ﺑﻪ ﺑﻘﻴﻪ ي وﻗﻔﻪ ﻫﺎ ﺑﺮ ﺣﺴﺐ اوﻟﻮﻳﺖ رﺳﻴﺪﮔﻲ ﻣﻲ ﺷﻮد.
ﺑﺮاي ﻓﻌﺎل ﻛﺮدن ﻫﺮ ﻳﻚ از وﻗﻔﻪ ﻫﺎ ﺑﺎﻳﺪ اﺑﺘﺪا ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ را ﺑﺎ دﺳﺘﻮر اﺳﻤﺒﻠﺮ SEIﻳﺎ ﻣﻘﺪار دﻫﻲ رﺟﻴﺴﺘﺮ SREGﻓﻌﺎل ﻧﻤﻮد:
0
2
1
4
3
6
5
7
Bit
I
SREG
• ﺑﺎ روﻳﺪاد ﻫﺮ وﻗﻔﻪ ي ﺧﺎرﺟﻲ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﺷﺪه و در ﻧﺘﻴﺠﻪ ﺗﻤﺎم وﻗﻔﻪ ﻫﺎي دﻳﮕﺮ ﻏﻴﺮ ﻓﻌﺎل ﻣـﻲ ﺷـﻮﻧﺪ در اﻳﻦ ﺣﺎﻟﺖ ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ آن را ﻣﺠﺪدا ﻓﻌﺎل ﻛﻨﺪ و ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﻫـﺎي ﺗﻮ در ﺗﻮ ﺷﻮد .ﺑﺎ ﺑﺎزﮔﺸﺖ از ISRاﻳﻦ ﺑﻴﺖ ﻣﺠﺪدا ﻳﻚ ﻣﻲ ﺷﻮد.
ﺑﺮاي اﺳﺘﻔﺎده از ﻫﺮﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ ﺑﺎﻳﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ﻣﺮﺑﻮﻃﻪ در رﺟﻴﺴﺘﺮ GICRآن را ﻓﻌﺎل ﻧﻤﻮد:
0
1
2
3
4
5
6
7
Bit
INT2
INT0
INT1
GICR
- ٤٩ -
P a g e | 50
www.eca.ir
• وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ 1،0و 2ﺑﻪ ﺗﺮﺗﻴﺐ از ﭘﻴﻦ ﻫﺎي PD3 ،PD2و PB2ﺗﺮﻳﮕﺮ ﻣﻲ ﺷﻮﻧﺪ.
ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن ﻫﺮﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ 0و 1ﺑﻮﺳﻴﻠﻪ ي ﭼﻬﺎرﺑﻴﺖ اول رﺟﻴﺴﺘﺮ MCUCRﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
0
1
2
3
ISC00
ICS01
ISC10
ISC11
4
5
6
7
Bit MCUCSR
ﺣﺎﻟﺖ ﻫﺎي ﻣﺨﺘﻠﻒ ﺑﻴﺖ ﻫﺎي ]:MCUCR[3:0
ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن وﻗﻔﻪ ي ﺻﻔﺮ
ISC00
ISC01
ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﺻﻔﺮ در ﭘﻴﻦ INT0
0
0
ﺗﻐﻴﻴﺮ در ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﭘﻴﻦ INT0
1
0
ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه در ﭘﻴﻦ INT0
0
1
ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه در ﭘﻴﻦ INT0
1
1
ISC10
ISC11
ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﺻﻔﺮ در ﭘﻴﻦ INT1
0
0
ﺗﻐﻴﻴﺮ در ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﭘﻴﻦ INT1
1
0
ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه در ﭘﻴﻦ INT1
0
1
ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه در ﭘﻴﻦ INT1
1
1
ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن وﻗﻔﻪ ي ﻳﻚ
- ٥٠ -
P a g e | 51
www.eca.ir
ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن وﻗﻔﻪ ي 2ﺧﺎرﺟﻲ ﺑﻮﺳﻴﻠﻪ ﺑﻴﺖ 6از رﺟﻴﺴﺘﺮ MCUCSRﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
1
0
3
2
5
4
6
Bit
7
MCUCSR
ISC2
• وﻗﻔﻪ ي 2ﺧﺎرﺟﻲ ﺑﺮ ﺧﻼف وﻗﻔـﻪ ي 0و 1ﺗﻨﻬـﺎ در دو ﺣﺎﻟـﺖ ﻟﺒـﻪ ي ﺑـﺎﻻ روﻧـﺪه و ﭘـﺎﻳﻴﻦ روﻧـﺪه ﻗﺎﺑـﻞ ﭘﻴﻜﺮﺑﻨﺪي اﺳﺖ .ﻧﻮﺷﺘﻦ ﺻﻔﺮ در ISC2ﺑﺎﻋﺚ ﺗﺮﻳﮕﺮ ﺷﺪن اﻳﻦ وﻗﻔﻪ ﺑﺎ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧـﺪه و ﻧﻮﺷـﺘﻦ ﻳـﻚ ﺑﺎﻋﺚ ﺗﺮﻳﮕﺮ ﺷﺪن آن ﺑﺎ ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ﻣﻲ ﺷﻮد.
ﻫﺮ ﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ داراي ﻳﻚ ﺑﻴﺖ ﭘﺮﭼﻢ ﻫﺴﺘﻨﺪ ﻛﻪ در ﺻﻮرت ﺗﺮﻳﮕﺮ ﺷﺪن از ﭘـﻴﻦ وﻗﻔـﻪ ي ﺧـﺎرﺟﻲ و ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻣﺮﺑﻮﻃﻪ در رﺟﻴﺴﺘﺮ GICRو ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ) ،(Iﻋﻼوه ﺑﺮ ﻳﻚ ﺷﺪن ﭘـﺮﭼﻢ ،ﻣـﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﭘﺲ از اﺟﺮاي ISRﭘﺮﭼﻢ آن وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﭘﺎك ﻣـﻲ ﺷﻮد.
0
1
2
3
4
5
6
7
Bit
INTF2
INTF0
INTF1
GIFR
روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ ﻫﺎ در CodeVisionﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد:
- ٥١ -
P a g e | 52
www.eca.ir
interrupt [ ]ﺷﻤﺎره ي ﺑﺮدار وﻗﻔﻪvoid
( ﻧﺎم روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪvoid)
{ ﺑﺮﻧﺎﻣﻪ ي ﺳﺮوﻳﺲ وﻗﻔﻪ } ﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺗﻮان از ﻧﺎم ﻣﻌﺎدل آن )ﺟﺪول21 ﺗﺎ2 ﻋﺪدي ﺑﻴﻦATMEGA16 ﺷﻤﺎره ي ﺑﺮدار وﻗﻔﻪ ي در ﻣﻮرد .اﺑﺘﺪاي ﻓﺼﻞ( ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﺮد
:1ﻣﺜﺎل
#include <mega16.h> #include <delay.h> interrupt [2] void LED_ON(void) { PORTA=0x01; delay_ms(1000); PORTA=0x00; } void main(void) { DDRB=0xFF; PORTB=0x00; DDRA=0xFF; PORTA=0x00; DDRD=0x00; - ٥٢ -
P a g e | 53
www.eca.ir
PORTD=0xFF; GICR=0b01000000;
// INT0: On
MCUCR=0b00000010;
// INT0 Mode: Falling Edge
#asm("sei")
// Global enable interrupts
while (1) { PORTB=0x01; delay_ms(500); PORTB=0x00; delay_ms(500); }; }
- ٥٣ -
P a g e | 54
www.eca.ir
• اﮔﺮ وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﺑﻪ ﺻﻮرت ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ ﺗﻨﻈﻴﻢ ﺷﺪه ﺑﺎﺷﺪ و در ﺣﺎل اﺟﺮاي ﻳﻜﻲ از وﻗﻔﻪ ﻫﺎ ،وﻗﻔﻪ ي دﻳﮕﺮي اﺗﻔﺎق ﺑﻴﻔﺘﺪ ،ﭘﺲ از ﺧﺮوج از ISRوﻗﻔﻪ ي ﺟﺎري ﺑﻪ آن وﻗﻔﻪ ﻫﺎ ﺑﺮﺣﺴﺐ اوﻟﻮﻳﺖ ﺷﺎن ﭘﺎﺳﺦ داده ﺧﻮاﻫﺪ ﺷﺪ.
• در ﺻﻮرﺗﻲ ﻛﻪ ﭘﻴﻦ وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ ﺗﻌﺮﻳﻒ ﺷﻮد ،آﻧﭽﻪ روي ﭘﻮرت ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮان وﻗﻔﻪ ي ﻧﺮم اﻓﺰاري اﻳﺠﺎد ﻛﺮد.
• وﻗﻔﻪ ﻫﺎي ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ در ﭘﻴﻦ INT0و INT1و ﻫﻤﭽﻨﻴﻦ وﻗﻔـﻪ ي ﺣﺴـﺎس ﺑـﻪ ﻟﺒـﻪ در INT2ﺑـﻪ ﺻﻮرت آﺳﻨﻜﺮون ﺗﺸﺨﻴﺺ داده ﻣﻲ ﺷﻮﻧﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮان از آن ﻫﺎ ﺑﺮاي ﺧﺎرج ﻛﺮدن ﻣﻴﻜـﺮو از ﻫﻤـﻪ ي Modeﻫﺎي ﻛﻢ ﻣﺼﺮف اﺳﺘﻔﺎده ﻧﻤﻮد .ﺣﺪاﻗﻞ ﻋﺮض ﭘﺎﻟﺲ در اﻳﻦ ﺣﺎﻟﺖ 50ﻧﺎﻧﻮ ﺛﺎﻧﻴﻪ ﻣـﻲ ﺑﺎﺷـﺪ و ﺑـﺮاي ﻣﻘﺎدﻳﺮ ﻛﻤﺘﺮ ﺗﺸﺨﻴﺺ وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﺗﻀﻤﻴﻦ ﻧﺸﺪه اﺳﺖ.
• ﻛﺎﻣﭙﺎﻳﻠﺮ CodeVisionﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓـﺮض SREGو رﺟﻴﺴـﺘﺮﻫﺎﻳﻲ CPUرا ﻛـﻪ ﻣﻤﻜـﻦ اﺳـﺖ در ISRﺗﻐﻴﻴﺮ ﭘﻴﺪا ﻛﻨﻨﺪ ،ﻗﺒﻞ از اﺟﺮاي روﺗﻴﻦ ﺳـﺮوﻳﺲ وﻗﻔـﻪ در Stackذﺧﻴـﺮه ) (PUSHﻛـﺮده و ﭘـﺲ از ﺑﺎزﮔﺸﺖ از ISRآن ﻫﺎ را ﺑﺎزﻳﺎﺑﻲ ) (POPﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن اﻳـﻦ ﻗﺎﺑﻠﻴـﺖ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻗﺒـﻞ از روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ از رﻫﻨﻮد
#-pragma saveregاﺳﺘﻔﺎده ﻛﻨﻴﺪ.
- ٥٤ -
P a g e | 55
www.eca.ir
آﺷﻜﺎر ﺳﺎز ﻋﺒﻮر از ﺻﻔﺮ:6 ﭘﺮوژه
/***************************************************** Project : Zero Cross Detector Author
: Reza Sepas Yar
Company : Pishro Noavaran Kavosh *****************************************************/ #include <mega16.h> #include <delay.h> #define xtal 4000000 interrupt [2] void switch_(void) { PORTA=0x01; delay_ms(1); PORTA=0x00; } void main(void) { DDRA=0xFF; PORTA=0x00; DDRD=0x00; PORTD=0xFF; GICR=0b01000000;
// INT0: On
MCUCR=0b00000011;
// INT0 Mode: Rising Edge - ٥٥ -
P a g e | 56
www.eca.ir
#asm("sei")
// Global enable interrupts
while (1); } Output vs. Input:
- ٥٦ -
P a g e | 57
www.eca.ir
- ٥٧ -
P a g e | 58
www.eca.ir
ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﺻﻔﺮ
ﺗﺎﻳﻤﺮ /ﻛﺎﻧﺘﺮ ﺻﻔﺮ ﻳﻚ ﺗﺎﻳﻤﺮ 8ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﺪ ﻛـﻪ داراي ﭼﻬـﺎر Modeﻛـﺎري Fast PWM ،CTC ،Normalو Correct PWM Phaseﻣﻲ ﺑﺎﺷﺪ .ﭘﻴﻦ T0ﺑﻪ ﻋﻨﻮان ورودي ﻛﺎﻧﺘﺮ و ﭘـﻴﻦ OC0ﺧﺮوﺟـﻲ ﺑﺨـﺶ ﻣﻘﺎﻳﺴـﻪ ي ﺗﺎﻳﻤﺮ ﻣﻲ ﺑﺎﺷﺪ .اﻳﻦ ﺗﺎﻳﻤﺮ داراي ﺳﻪ رﺟﻴﺴﺘﺮ ﺑﻪ ﻧﺎم ﻫﺎي TCNT0 ،TCCR0و OCR0ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻪ ﺗﺮﺗﻴـﺐ ﺟﻬﺖ ﭘﻴﻜﺮﺑﻨﺪي ﺗﺎﻳﻤﺮ ،ﻣﻘﺪار ﺷﻤﺎرﻧﺪه و ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ اﺳﺘﻔﺎده ﻣـﻲ ﺷـﻮﻧﺪ .ﻫﻤﭽﻨـﻴﻦ اﻳـﻦ ﺗـﺎﻳﻤﺮ در رﺟﻴﺴـﺘﺮﻫﺎي TIFRو TIMSKﻛﻪ ﺑﻪ ﺗﺮﺗﻴﺐ رﺟﻴﺴﺘﺮﻫﺎي ﭘﺮﭼﻢ و وﻗﻔﻪ ﺗﺎﻳﻤﺮ ﻣﻲ ﺑﺎﺷﻨﺪ ﺑﺎ دﻳﮕﺮ ﺗﺎﻳﻤﺮﻫﺎ ﻣﺸﺘﺮك ﻣﻲ ﺑﺎﺷﺪ.
ﻣﻬﻢ ﺗﺮﻳﻦ رﺟﻴﺴﺘﺮ ﺗﺎﻳﻤﺮ TTCR0ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻴﺖ ﻫﺎي Clock Selectﺟﻬﺖ اﻧﺘﺨﺎب ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ و ﺑﻴﺖ ﻫﺎي Wave Generation Modeﺑﺮاي ﺗﻨﻈﻴﻢ Modeﻛﺎري ﺗﺎﻳﻤﺮ و ﺑﻴﺖ ﻫﺎي Compare Match Output Modeﭘﻴﻜﺮﺑﻨﺪي ﭘﻴﻦ OC0را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ .ﻋﻤﻠﻜﺮد ﺑﻴﺖ FOC0ﻧﻴﺰ ﺑﺮرﺳﻲ ﺧﻮاﻫﺪ ﺷﺪ.
0
1
2
3
4
5
6
7
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
Modeﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺑﻴﺖ ﻫﺎي WGM01و WGM00ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
- ٥٨ -
TCCR0 ﻧﺎم ﺑﻴﺖ
P a g e | 59
www.eca.ir
Mode
ﻋﻤﻠﻜﺮدMode
WGM01 WGM00
0
0
0
Normal
1
0
1
PWM, Phase Correct
2
1
0
3
1
1
Clear Timer on Compare Match (CTC) Fast PWM
Noramal Mode c
ﺑﻴﺘﻲ8 ﻛﺎﻧﺘﺮ ﺳﺎده ي/ﺗﺎﻳﻤﺮ
•
: TIMER0 رﺟﻴﺴﺘﺮﻫﺎي
TCCR0
7
6
5
4
3
2
1
0
ﻧﺎم ﺑﻴﺖ
FOC0
WGM00
COM01
COM00
WGM01
CS02
CS01
CS00
ﺳﻄﺢ ﻣﻨﻄﻘﻲ
0
0
0
0
0
X
X
X
Clock ﻣﺸﺘﺮك ﺑﻮده وﺿﻌﻴﺖ ﻣﻨﺒﻊ ﻛﻼك ﺑﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﺑﻴـﺖ ﻫـﺎيPrescaler ﻛﺎﻧﺘﺮ ﺻﻔﺮ و ﻳﻚ داراي ﻳﻚ/ﺗﺎﻳﻤﺮ : ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮدSelect
- ٥٩ -
P a g e | 60
www.eca.ir
وﺿﻌﻴﺖ ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ
CS00
CS01
CS02
ﺑﺪون ﻛﻼك )ﻣﺘﻮﻗﻒ(
0
0
0
ﻛﻼك ﺳﻴﺴﺘﻢ )ﺑﺪون ﺗﻘﺴﻴﻢ(
1
0
0
/8ﻛﻼك ﺳﻴﺴﺘﻢ
0
1
0
/64ﻛﻼك ﺳﻴﺴﺘﻢ
1
1
0
/256ﻛﻼك ﺳﻴﺴﺘﻢ
0
0
1
/1024ﻛﻼك ﺳﻴﺴﺘﻢ
1
0
1
ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ ﺧﺎرﺟﻲ )(T0
0
1
1
ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ ﺧﺎرﺟﻲ )(T0
1
1
1
ﻣﻘﺪار ﺗﺎﻳﻤﺮ در ﻫﺮ ﻟﺤﻈﻪ از ﻃﺮﻳﻖ رﺟﻴﺴﺘﺮ TCNTﻗﺎﺑﻞ ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ اﺳﺖ:
0
1
2
4
3
6
5
Bit
7
TCNT0
]TCNT0[7:0
در زﻣﺎن ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ،ﺑﻴﺖ TOV0از رﺟﻴﺴﺘﺮ TIFRﻳﻚ ﻣﻲ ﺷﻮد.
0
1
2
3
4
5
6
7
TIFR
TOV0
OCF0
TOV1
OCF1B
OCF1A
ICF1
TOV2
OCF2
ﻧﺎم ﺑﻴﺖ
X
0
0
0
0
0
0
0
ﺳﻄﺢ ﻣﻨﻄﻘﻲ
- ٦٠ -
P a g e | 61
www.eca.ir
:(T = 512 μs )ﺗﻮﻟﻴﺪ ﻣﻮج ﻣﺮﺑﻌﻲ ﺑﺎ:1ﻣﺜﺎل
#include<mega16.h> #define xtal 8000000 void delay() { TCCR0=0B00000010;
// Timer Clock = CLK/8
while(!TIFR&0x01);
// Wait Until Overflow
TIFR=TIFR|0B00000001;
// Clear TOV0
TCCR0=0x00;
// Stop Timer0
} void main() { DDRA=0xFF; PORTA=0x00; TCCR0=0x00; TCNT0=0x00; while(1){ PORTA.0=1; delay(); PORTA.0=0; delay(); } } - ٦١ -
P a g e | 62
www.eca.ir
( 400μs )ﻛﺎﻫﺶ دوره ي ﺗﻨﺎوب ﺑﻪ:2ﻣﺜﺎل void delay() { TCNT0=0x38;
//TCNT=55
TCCR0=0B00000010; while(!TIFR&0x01); TIFR=TIFR|0B00000001; TCCR0=0x00; }
در رﺟﻴﺴﺘﺮTOIE2 ﻳﺎTOIE0 ( ﻓﻌﺎل ﺑﻮده و ﺑﻴﺖ ﻫﺎيI) در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ
9
: از ﺳﺮرﻳﺰ ﺷﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻋﻨﻮان وﻗﻔﻪ اﺳﺘﻔﺎده ﻛﺮد، ﻳﻚ ﺑﺎﺷﻨﺪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از وﻗﻔﻪTIMSK
TIMSK
7
6
5
4
3
2
1
0
ﻧﺎم ﺑﻴﺖ
OCIE2
TOIE2
TICIE1
OCIE1A
OCIE1B
TOIE1
OCIE0
TOIE0
ﺳﻄﺢ ﻣﻨﻄﻘﻲ
0
0
0
0
0
0
0
X
( ﺑﺎ اﺳﺘﻔﺎده از وﻗﻔﻪ ي ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﺻﻔﺮT = 400μs )ﻣﻮج ﻣﺮﺑﻌﻲ:3ﻣﺜﺎل #include <mega16.h> #define xtal 8000000 interrupt [TIM0_OVF] void timer0_ovf_isr(void) { PORTA^=0xFF; TCNT0=0x38;
//TCNT=55 - ٦٢ -
P a g e | 63
www.eca.ir
} )void main(void { ;DDRA=0xFF ;PORTA=0x00 // Timer Clock = CLK/8
;TCCR0=0B00000010
//Enable TIMER0 Overflow
;TIMSK=0x01 Interrupt )"#asm("sei
// Global enable interrupts
;TCNT0=0x38 ;)while (1 }
• ﺗﺎﻳﻤﺮ /ﻛﺎﻧﺘﺮ ﺑﺎ ﻋﻤﻠﻜﺮد ﻣﻘﺎﻳﺴﻪ
0
1
2
4
3
6
5
Bit
7
OCR0/2
]OCR0[7:0
• ﻣﺤﺘﻮاي رﺟﻴﺴﺘﺮ OCR0ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ ﺑﺎ ﻣﻘﺪار TCNT0ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮد و در ﺻﻮرت ﺑﺮاﺑـﺮي ﺑﺎﻋـﺚ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ OC0و ﻳﺎ وﻗﻔﻪ ي ﺗﻄﺎﺑﻖ ﻣﻲ ﺷﻮد .در ﺣﺎﻟﺖ ﺑﺮاﺑﺮي ﺑﻴﺖ OCF0ﻳﺎ OCF1ﻳﻚ ﺷﺪه و ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺳﺎﺑﺮوﺗﻴﻦ وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﺻﻔﺮ ﻣﻲ ﺷﻮد .در ﺻـﻮرت ﻋـﺪم اﺳـﺘﻔﺎده از وﻗﻔـﻪ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ آن را ﭘﺎك ﻛﻨﺪ.
0
1
2
4
3 - ٦٣ -
5
6
7
TIFR
P a g e | 64
www.eca.ir TOV0
OCF0
TOV1
OCF1B
OCF1A
ICF1
TOV2
OCF2
ﻧﺎم ﺑﻴﺖ
X
X
0
0
0
0
0
0
ﺳﻄﺢ ﻣﻨﻄﻘﻲ
ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ OC0ﺑﻮﺳﻴﻠﻪ ﺑﻴﺖ ﻫﺎي COM00و COM01ﻣﻲ ﺑﺎﺷﺪ:
0
1
2
3
4
5
6
7
TCCR0
CS00
CS01
CS02
WGM01
COM00
COM01
WGM00
FOC0
ﻧﺎم ﺑﻴﺖ
X
X
X
0
X
X
0
X
ﺳﻄﺢ ﻣﻨﻄﻘﻲ
وﺿﻌﻴﺖ ﭘﻴﻦ OC0
COM01 COM00
ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
0
0
Toggleدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ
1
0
Clearدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ
0
1
Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ
1
1
• در ﺻﻮرت ﻳﻚ ﻛﺮدن ﺑﻴﺖ FOC0ﻳﺎ FOC1ﺑﻪ ﺻﻮرت آﻧـﻲ ﻣﻘـﺪار رﺟﻴﺴـﺘﺮ TCNT0ﺑـﺎ ﻣﻘـﺪار OCR0 ﻣﻘﺎﻳﺴﻪ ﺷﺪه و در ﺻﻮرت ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ﻳﻚ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ روي ﭘﻴﻦ OC0اﻳﺠﺎد ﻣﻲ ﺷﻮد .در اﻳﻦ وﺿـﻌﻴﺖ ﺑﻴـﺖ OCF0ﻳﺎ OCF1ﻳﻚ ﻧﺸﺪه و ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﻧﻴﺰ ﻧﺨﻮاﻫﺪ ﺷﺪ. • در ﺗﻤﺎم ﺣﺎﻟﺖ ﻫﺎﻳﻲ ﻛﻪ روي ﭘﻴﻦ ﻫﺎي OCﺷﻜﻞ ﻣﻮج اﻳﺠﺎد ﻣﻲ ﺷﻮد ﺑﺎﻳﺪ اﻳﻦ ﭘﻴﻦ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ ﺗﻌﺮﻳﻒ ﺷﺪه ﺑﺎﺷﺪ.
- ٦٤ -
P a g e | 65
www.eca.ir
(OC0 روي ﭘﻴﻦT = 512 μs )اﻳﺠﺎد ﭘﺎﻟﺲ ﻣﺮﺑﻌﻲ ﺑﺎ:4ﻣﺜﺎل #include<mega16.h> #define xtal 8000000 void main() { DDRB=0xFF; PORTB=0x00; TCNT0=0x00; TCCR0=0B00010010; //toggle OC0 on compare match OCR0=0x63; //OCR0=99 while(1); }
Set ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻣﻘﺎﻳﺴﻪ ي وﻗﻔﻪ ﻧﻴﺰ،ﺑﺮاي اﺳﺘﻔﺎده از وﻗﻔﻪ ﺑﺎﻳﺪ ﻋﻼوه ﺑﺮ ﻳﻚ ﺑﻮدن ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ .ﺷﻮد
TIMSK
7
6
5
4
3
2
1
0
ﻧﺎم ﺑﻴﺖ
OCIE2
TOIE2
TICIE1
OCIE1A
OCIE1B
TOIE1
OCIE0
TOIE0
ﺳﻄﺢ ﻣﻨﻄﻘﻲ
X
X
0
0
0
0
X
X
- ٦٥ -
P a g e | 66
www.eca.ir
در اﻳﻦ ﺣﺎﻟﺖ ISRﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد:
)interrupt [TIM0_COMP] void timer0_comp_isr(void { زﻳﺮ ﺑﺮﻧﺎﻣﻪ ي ﺳﺮوﻳﺲ وﻗﻔﻪ }
CTC Mode d در اﻳﻦ Modeﺗﺎﻳﻤﺮ ﻫﻤﺎﻧﻨﺪ وﺿﻌﻴﺖ ﻧﺮﻣﺎل ﺑﺎ ﻋﻤﻠﻜﺮد ﻣﻘﺎﻳﺴﻪ ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ﺑـﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ در زﻣـﺎن ﺗﻄـﺎﺑﻖ رﺟﻴﺴﺘﺮﻫﺎي OCR0و TCNT0ﻣﻘﺪار رﺟﻴﺴﺘﺮ TCNT0ﺻﻔﺮ ﺷﺪه و در واﻗﻊ ﺑـﺮ ﺧـﻼف ﺣﺎﻟـﺖ ﻗﺒـﻞ ﻣﻘـﺪار ﻣﺎﻛﺰﻳﻤﻢ TCNT0ﻋﺪد ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ OCR0ﻣﻲ ﺑﺎﺷﺪ .ﻣﻘﺪار ﺑﻴﺖ ﻫﺎي WGM00و WGM01در اﻳﻦ Modeﺑﻪ ﺗﺮﺗﻴﺐ ﺑﺮاﺑﺮ 0و 1ﻣﻲ ﺑﺎﺷﺪ.
•
0
1
2
3
4
5
6
7
TCCR0
CS00
CS01
CS02
WGM01
COM00
COM01
WGM00
FOC0
ﻧﺎم ﺑﻴﺖ
X
X
X
1
X
X
0
X
ﺳﻄﺢ ﻣﻨﻄﻘﻲ
در اﻳﻦ ﺣﺎﻟﺖ ﻓﺮﻛﺎﻧﺲ ﻣﻮج اﻳﺠﺎد ﺷﺪه روي ﭘﻴﻦ OC0از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:
f CLK _ I / O )2.N .(1 + OCR 0
- ٦٦ -
= f OC 0
P a g e | 67
www.eca.ir
ﻣﺜﺎل) :5اﻳﺠﺎد ﻣﻮج ﻣﺮﺑﻌﻲ ﺑﺎ ﻓﺮﻛﺎﻧﺲ 5KHzروي ﭘﻴﻦ :(OC0 >#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 = 5000Hz )2.8.(1 + 99
= f OC0
وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ي ﺳﺮرﻳﺰ و وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ در CTC Modeﻫﻤﺎﻧﻨﺪ وﺿﻌﻴﺖ ﻧﺮﻣﺎل ﻣﻲ ﺑﺎﺷـﺪ. ﺑﺎ ﻳﻚ ﺑﻮدن ﺑﻴﺖ OCIE0وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻓﻌﺎل ﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺗﻮان در ISRاﻳﻦ وﻗﻔـﻪ ﻣﻘـﺪار OCR0را ﺗﻐﻴﻴـﺮ داد.
• ﻣﻘﺪار دﻫﻲ ﺑﻪ رﺟﻴﺴﺘﺮ OCR0ﺑﺎﻳﺪ ﺑﺎ دﻗﺖ اﻧﺠﺎم ﺷﻮد زﻳﺮا در Modeﻫﺎي ﻏﻴﺮ PWMاﻳـﻦ رﺟﻴﺴـﺘﺮ داراي ﺑﺎﻓﺮ دوﺑﻞ ﻧﻤﻲ ﺑﺎﺷﺪ .وﺟﻮد ﺑﺎﻓﺰ دوﺑﻞ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ اﮔﺮ OCR0ﺑﻪ ﻣﻘـﺪاري ﻛﻤﺘـﺮ از TCNT0ﺗﻐﻴﻴـﺮ ﻛﻨـﺪ،
- ٦٧ -
P a g e | 68
www.eca.ir
ﺑﺮاي از دﺳﺖ ﻧﺮﻓﺘﻦ ﻣﻘﺎﻳﺴﻪ ي ﻓﻌﻠﻲ ﻣﻘﺪار ﺟﺪﻳﺪ در ﺑﺎﻓﺮ دوﺑﻞ ذﺧﻴﺮه ﺷﺪه و ﭘﺲ از ﺳﺮرﻳﺰ اﻳﻦ ﻣﻘﺪار ﺟﺪﻳـﺪ در . ﺑﺎرﮔﺬاري ﺷﻮدOCR0
ﻓﺮﻛﺎﻧﺲ ﻣﺘﺮ دﻳﺠﻴﺘﺎل:7 ﭘﺮوژه
/***************************************************** Project : Frequency Meter Author
: Reza Sepas Yar
Company : Pishro Noavaran Kavosh *****************************************************/ #include <mega16.h> #include <delay.h> #include <stdio.h> #include #define xtal 8000000 #asm .equ __lcd_port=0x1B ;PORTA #endasm unsigned long int timer0_ov; unsigned long int in_freq; unsigned char lcd_buff[20]; interrupt [TIM0_OVF] void timer0_ovf_isr(void) { - ٦٨ -
P a g e | 69
www.eca.ir
timer0_ov ++; } 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; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01; // LCD module initialization lcd_init(16); while (1) { TCCR0=0x06; #asm("sei")
// Start Timer T0 pin Falling Edge // Global enable interrupts
delay_ms(1000); #asm("cli");
// Global disable interrupts
- ٦٩ -
P a g e | 70
www.eca.ir
in_freq = timer0_ov * 256 + TCNT0; sprintf(lcd_buff,"Freqency=%d",in_freq); lcd_clear(); lcd_puts(lcd_buff); TCCR0=0x00;
//Stopt Timer0
timer0_ov=0;
//Prepare for next count
TCNT0=0;
//Clear Timer0
}; }
- ٧٠ -
P a g e | 71
www.eca.ir
Fast PWM Mode e
اﻳﻦ ﺣﺎﻟﺖ ﻣﺸﺎﺑﻪ Modeﻧﺮﻣﺎل ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ ﭘـﻴﻦ OC0ﻓﻘـﻂ در ﺣﺎﻟـﺖ ﺑﺮاﺑـﺮي رﺟﻴﺴـﺘﺮﻫﺎي TCNT0و OCR0ﺗﻐﻴﻴﺮ ﺣﺎﻟﺖ ﻧﻤﻲ دﻫﺪ ،ﺑﻠﻜﻪ در زﻣﺎن ﺳﺮرﻳﺰ رﺟﻴﺴﺘﺮ TCNT0ﻧﻴﺰ ﻣﻘﺪار اﻳﻦ ﭘﻴﻦ ﺗﻐﻴﻴﺮ ﻣـﻲ ﻛﻨﺪ.
ﻣﻘﺪار TCNT0
ﻣﻘﺪار OCR0
ﺧﺮوﺟﻲ PWM
ﻣﻘﺪار ﺑﻴﺖ ﻫﺎي WGM00و WGM01در اﻳﻦ Modeﺑﺮاﺑﺮ 1ﻣﻲ ﺑﺎﺷﺪ.
0
1
2
3
4
5
6
7
Bit
CS00
CS01
CS02
1
COM00
COM01
1
0
TCCR0
در Modeﻫﺎي PWMﻋﻤﻠﻜﺮد ﺑﻴﺖ ﻫﺎي COM00و COM01ﻣﺘﻔﺎوت از دو وﺿﻌﻴﺖ ﻗﺒﻠـﻲ و ﺑـﻪ ﺻـﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
وﺿﻌﻴﺖ ﭘﻴﻦ OC0
- ٧١ -
COM00
COM01
P a g e | 72
www.eca.ir ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
0
0
رزرو ﺷﺪه
1
0
Clearدروﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ Set ،در زﻣﺎن ﺳﺮرﻳﺰ ) PWMﻏﻴﺮ ﻣﻌﻜﻮس(
0
1
Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ Clear ،در زﻣﺎن ﺳﺮرﻳﺰ ) PWMﻣﻌﻜﻮس(
1
1
ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ي ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMﺗﻮﻟﻴﺪ ﺷﺪه ﻣﻲ ﺗﻮان از ﻓﺮﻣﻮل زﻳﺮ اﺳﺘﻔﺎد ﻧﻤﻮد: ﻣﻘﺪار ﺑﺎرﮔﺬاري ﺷﺪه در ﺗﺎﻳﻤﺮ – X = 256
9
N = Prescale = 1, 8, 64, 256, 1024
f clk _ I / O N .X
= f PWM
از وﻗﻔﻪ ي ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻣﻲ ﺗﻮان ﺑﺮاي ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ TCNT0و ﻳـﺎ ﺗﻐﻴﻴـﺮ ﻣﻘـﺪار OCR0اﺳـﺘﻔﺎده ﻧﻤﻮد ،اﮔﺮﭼﻪ ﺑﻬﺘﺮ اﺳﺖ ﻣﻘﺪار OCR0در روﺗﻴﻦ وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﺗﻐﻴﻴﺮ داده ﺷﻮد.
9
ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ TCNT0ﻣﻲ ﺗﻮان ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMرا ﺗﻐﻴﻴﺮ داد(.
ﻣﺜﺎل) :6ﺗﻮﻟﻴﺪ ﻣﻮج PWMﺑﺎ ﻓﺮﻛﺎﻧﺲ 4KHzو زﻣﺎن وﻇﻴﻔﻪ ي 20درﺻﺪ(
>#include <mega16.h #define xtal 8000000
)interrupt [TIM0_OVF] void timer0_ovf_isr(void { ;TCNT0=0x06 } )void main(void {
- ٧٢ -
P a g e | 73
www.eca.ir
PORTB=0x00; DDRB=0x08; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 1000.000 kHz // Mode: Fast PWM top=FFh // OC0 output: Non-Inverted PWM TCCR0=0x6A; //0x7A for inverted PWM TCNT0=0x06; OCR0=0x38;
//OCR0 = 56
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01; // Global enable interrupts #asm("sei") while (1); }
f PWM =
8000000 = 4000Hz 8(256 − 6)
DutyCycle =
OCR0 50 × 100% = × 100% = 20% 250 250
- ٧٣ -
P a g e | 74
www.eca.ir
• ﺑﺎ ﻛﻤﺘﺮ ﺷﺪن OCR0زﻣﺎن وﻇﻴﻔﻪ ﻛﻤﺘﺮ ﺷﺪه و ﺗﺎ ﺣﺪي ﻛﻪ ﻣﻘﺪار ﺻﻔﺮ ﻳﻚ ﭘﺎﻟﺲ ﺳﻮزﻧﻲ ﺑﻪ ﻋﺮض ﻳﻚ ﺳﻴﻜﻞ اﻳﺠﺎد ﺧﻮاﻫﺪ ﻛﺮد. • ﺑﺎ ﻣﻘﺪاردﻫﻲ 256ﺑﻪ OCR0ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﺑﺮاﺑﺮ ﺷﺪه و ﭘﺎﻟﺲ ﺧﺮوﺟﻲ ﺑﺴﺘﻪ ﺑﻪ ﻣﻘﺪار COM00و COM01ﻫﻤﻮاره ﺻﻔﺮ ﻳﺎ ﻳﻚ ﺧﻮاﻫﺪ ﺑﻮد.
Phase Correct PWM Mode f اﻳﻦ Modeﺷﺒﻴﻪ ﺣﺎﻟﺖ Fast PWMﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ ﺑﻪ ﺻﻮرت دو ﺷﻴﺒﻪ ) (Dual Slopeﻋﻤﻞ ﺷﻤﺎرش را اﻧﺠﺎم ﻣﻲ دﻫﺪ .ﺑﻪ اﻳﻨﺼﻮرت ﻛﻪ ﺗﺎﻳﻤﺮ از ﻋﺪد ﺻﻔﺮ ﺷﺮوع ﺑﻪ ﺷﻤﺎرش ﻛﺮده و ﺑﻪ ﺻﻮرت اﻓﺰاﻳﺸﻲ ﺗﺎ ﻋﺪد 0xFFاﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ و ﺑﻌﺪ از رﺳﻴﺪن ﺑﻪ اﻳﻦ ﻣﻘﺪار ﻋﺪد ﻣﻮﺟﻮد در ﺑﺎﻓﺮ OCR0در رﺟﻴﺴﺘﺮ OCR0ﺑﺎرﮔﺬاري ﻣﻲ ﺷﻮد .ﺑﻌﺪ از اﻳﻦ ﻟﺤﻈﻪ ﺟﻬﺖ ﺷﻤﺎرش ﺗﺎﻳﻤﺮ ﻋﻮض ﺷﺪه و ﺑﻪ ﺻﻮرت ﻛﺎﻫﺸﻲ ﺗﺎ ﻋﺪد ﺻﻔﺮ ﻣﻲ ﺷﻤﺎرد ﺑﺎ رﺳﻴﺪن ﺑﻪ اﻳﻦ ﻋﺪد ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ،ﺑﺮﻧﺎﻣﻪ ﺑﻪ ISRﺳـﺮرﻳﺰ ﺗـﺎﻳﻤﺮ ﻣﻨﺸﻌﺐ ﺷﺪه و ﺑﻴﺖ ﭘﺮﭼﻢ وﻗﻔﻪ ﺑﻮﺳﻴﻠﻪ ﺳﺨﺖ اﻓﺰار ﺻﻔﺮ ﻣﻲ ﺷﻮد .ﻣﺴﺌﻠﻪ ي ﻣﻬﻢ اﻳﻦ اﺳـﺖ ﻛـﻪ در ﻫـﺮ دو ﺣﺎﻟـﺖ ﺷﻤﺎرش اﻓﺰاﻳﺸﻲ و ﻛﺎﻫﺸﻲ ﻋﻤﻞ ﻣﻘﺎﻳﺴﻪ ﺑﻴﻦ رﺟﻴﺴـﺘﺮﻫﺎي TCNT0و OCR0اﻧﺠـﺎم ﻣـﻲ ﮔﻴـﺮد و در ﺻـﻮرت ﺑﺮاﺑﺮي ﭘﺮﭼﻢ OCF0ﻳﻚ ﺷﺪه و ﺑﺎﻋﺚ ﺗﻐﻴﻴﺮ در ﭘﻴﻦ OC0ﻣﻲ ﺷﻮد.
ﻣﻘﺪار OCR0
ﻣﻘﺪار TCNT0
ﺧﺮوﺟﻲ PWMدر ﺣﺎﻟﺖ ﻏﻴﺮ ﻣﻌﻜﻮس
- ٧٤ -
P a g e | 75
www.eca.ir
ﺗﻐﻴﻴﺮ ﭘﻴﻦ OC0ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
وﺿﻌﻴﺖ ﭘﻴﻦ OC0
COM00
COM01
ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
0
0
رزرو ﺷﺪه
1
0
Clearدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ ،در زﻣﺎن ﺷﻤﺎرش اﻓﺰاﻳﺸﻲ ) PWMﻏﻴﺮ ﻣﻌﻜﻮس( 0
Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ ،در زﻣﺎن ﺷﻤﺎرش ﻛﺎﻫﺸﻲ
1
Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ ،در زﻣﺎن ﺷﻤﺎرش اﻓﺰاﻳﺸﻲ ) PWMﻣﻌﻜﻮس( 1
Clearدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ ،در زﻣﺎن ﺷﻤﺎرش ﻛﺎﻫﺸﻲ
1
• در ﺻﻮرت ﺗﻐﻴﻴﺮ ﻣﻘﺪار رﺟﻴﺴﺘﺮ OCR0ﻣﻘﺪار ﺟﺪﻳﺪ در ﺑﺎﻓﺮ اﻳـﻦ رﺟﻴﺴـﺘﺮ ﻧﻮﺷـﺘﻪ ﻣـﻲ ﺷـﻮد و در زﻣـﺎن رﺳﻴﺪن ﺑﻪ 0xFFرﺟﻴﺴﺘﺮ OCR0ﺑﻪ روز ﻣﻲ ﺷﻮد. • ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﺻﻔﺮ زﻣﺎﻧﻲ ﻓﻌﺎل ﻣﻲ ﺷﻮد ﻛﻪ ﻛـﻪ رﺟﻴﺴـﺘﺮ TCNT0ﺑﺮاﺑـﺮ ﺻـﻔﺮ ﺷـﻮد و ﻧـﻪ ،0xFF ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎﻳﺪ دﻗﺖ داﺷﺖ ﻛﻪ اﮔﺮ در زﻣﺎن ﺷﺮوع ﺑﻪ ﻛﺎر ﻣﻘﺪار اﻳﻦ رﺟﻴﺴﺘﺮ ﺻﻔﺮ ﺑﺎﺷﺪ ﭘـﺮﭼﻢ ﺳـﺮرﻳﺰ ﻓﻌـﺎل ﺧﻮاﻫﺪ ﺷﺪ. • ﻓﺮﻛﺎﻧﺲ PWMدر ﺣﺎﻟﺖ Phase Correctاز راﺑﻄﻪ ي زﻳﺮ ﻗﺎﺑﻞ ﻣﺤﺎﺳﺒﻪ اﺳﺖ:
N = 1, 8, 64, 256, 1024
f clk _ I / O N × 510
= f PWM
• راﺑﻄﻪ ي ﺑﺎﻻ ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMﺛﺎﺑﺖ اﺳﺖ و ارﺗﺒﺎﻃﻲ ﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي OCR0و TCNT0ﻧﺪارد.
- ٧٥ -
P a g e | 76
www.eca.ir
اﻓﺰاﻳﺶ ﻳﺎﻓﺘﻪ و ﺑﺎPWM ﻣﻘﺪار ﻣﺘﻮﺳﻂ ﻣﻮجOCR0 ﻏﻴﺮ ﻣﻌﻜﻮس ﺑﺎ اﻓﺰاﻳﺶ ﻣﻘﺪارPWM • در ﺣﺎﻟﺖ . ﻋﻜﺲ اﻳﻦ ﻗﻀﻴﻪ ﺻﺤﻴﺢ اﺳﺖ، ﻣﻌﻜﻮسPWM ﻛﺎﻫﺶ آن ﻣﻘﺪار ﻣﺘﻮﺳﻂ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ و در ﺣﺎﻟﺖ
PWM ﺑﺎDC ﻛﻨﺘﺮل ﻣﻮﺗﻮر:8 ﭘﺮوژه
/***************************************************** Project : DC Motor Control Author
: Reza Sepas Yar
Company : Pishro Noavaran Kavosh *****************************************************/ #include <mega16.h> #define xtal 1000000 char digits[8]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07}; unsigned char; unsigned char p_state; unsigned char key; unsigned char i; void main(void) { PORTB=0x00; DDRB=0xFF; DDRD = 0xFF; PORTD = digits[0]; DDRC = 0x00; - ٧٦ -
P a g e | 77
www.eca.ir
PORTC = 0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 15.625 kHz // Mode: Phase correct PWM top=FFh // OC0 output: Non-Inverted PWM TCCR0=0x63; TCNT0=0x00; OCR0=10; while (1) { if(!PINC.0) { if(key!=p_state) { if(i==7) { i=0; PORTC=digits[0]; } else i++; PORTD = digits[i]; OCR0 = i*10+10; p_state=key; }; } - ٧٧ -
P a g e | 78
www.eca.ir
else ;p_state=0xFF ;} }
ﺗﻮﺿﻴﺢ :ﺑﺮاي آزﻣﺎﻳﺶ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺟﺎي ﻣﻮﺗﻮر ﻣﻲ ﺗﻮان از LEDاﺳﺘﻔﺎده ﻧﻤﻮد.
- ٧٨ -
P a g e | 79
www.eca.ir
ﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ دو
ﺑﻪ ﻃﻮر ﻛﻠﻲ ﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ 2ﻣﺸﺎﺑﻪ ﺗﺎﻳﻤﺮ ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ و رﺟﻴﺴﺘﺮﻫﺎي ﻣﺮﺑﻮﻃﻪ ﺑﺎ ﻫﻤﺎن ﻧـﺎم و داراي ﭘﺴـﻮﻧﺪ 2ﻣـﻲ ﺑﺎﺷﻨﺪ ،ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ 2ﺑﺮﺧﻼف ﺗﺎﻳﻤﺮﻫﺎي ﺻﻔﺮ و ﻳﻚ ﻧﻤﻲ ﺗﻮاﻧﺪ از ﭘﺎﻳﻪ ﺧﺎرﺟﻲ T0ﻳﺎ T1ﻛﻼك درﻳﺎﻓﺖ ﻛﻨﺪ و در ﻋﻮض ﻣﻲ ﺗﻮان ﺑﺎ وﺻﻞ ﻛﺮدن ﻳﻚ ﻛﺮﻳﺴﺘﺎل 32,768ﻛﻴﻠﻮﻫﺮﺗﺰ ﺑﻪ ﭘﻴﻦ ﻫـﺎي TOSC1و TOSC2از آن در وﺿﻌﻴﺖ آﺳﻨﻜﺮون ﺟﻬﺖ RTCاﺳﺘﻔﺎده ﻧﻤﻮد .از آﻧﺠﺎﻳﻲ ﻛﻪ ﺗﺎﻳﻤﺮ 2داراي Prescalerﻣﺠـﺰا از دو ﺗـﺎﻳﻤﺮ 0و1 ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ ﺗﻘﺴﻴﻢ ﻛﺮﻳﺴﺘﺎل 32768ﻫﺮﺗﺰ ﺑﺮ 128ﻣﻲ ﺗﻮان ﺑﻪ زﻣﺎن ﺳﺮرﻳﺰ 1ﺛﺎﻧﻴﻪ ﻛﻪ ﻣﻨﺎﺳﺐ ﺑـﺮاي ﻋﻤﻠﻜـﺮد ﺳـﺎﻋﺖ اﺳﺖ دﺳﺖ ﭘﻴﺪا ﻛﺮد .ﺗﻨﻈﻴﻤﺎت Prescaleﺑﺮاي اﻳﻦ ﺗﺎﻳﻤﺮ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
وﺿﻌﻴﺖ ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ
CS00
CS01
CS02
ﺑﺪون ﻛﻼك )ﻣﺘﻮﻗﻒ(
0
0
0
ﻛﻼك ﺳﻴﺴﺘﻢ )ﺑﺪون ﺗﻘﺴﻴﻢ(
1
0
0
/8ﻛﻼك ﺳﻴﺴﺘﻢ
0
1
0
/32ﻛﻼك ﺳﻴﺴﺘﻢ
1
1
0
/64ﻛﻼك ﺳﻴﺴﺘﻢ
0
0
1
/128ﻛﻼك ﺳﻴﺴﺘﻢ
1
0
1
/256ﻛﻼك ﺳﻴﺴﺘﻢ
0
1
1
/1024ﻛﻼك ﺳﻴﺴﺘﻢ
1
1
1
ﭘﻴﻜﺮ ﺑﻨﺪي RTCﺑﺎ رﺟﻴﺴﺘﺮ وﺿﻌﻴﺖ آﺳﻨﻜﺮون ﻳﺎ ASSRاﻧﺠﺎم ﻣﻲ ﺷﻮد:
- ٧٩ -
P a g e | 80
www.eca.ir 0
1
2
3
TCR2UB
OCR2UB
TCN2UB
AS0
4
5
6
7
Bit ASSR
:Asynchronous Timer/Counter2ﺑﺎ Setﻛﺮدن اﻳﻦ ﺑﻴـﺖ ﻣﻨﺒـﻊ ﻛـﻼك ﺗـﺎﻳﻤﺮ 2از ﻛـﻼك ﺳﻴﺴـﺘﻢ ﺑـﻪ ﻛﺮﻳﺴﺘﺎل ﺧﺎرﺟﻲ در ﭘﺎﻳﻪ ﻫﺎي TOSC1و TOSC2ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ.ﺑﺎ ﺗﻐﻴﻴـﺮ دادن اﻳـﻦ ﺑﻴـﺖ ﻣﻤﻜـﻦ اﺳـﺖ ﻣﻘـﺪار رﺟﻴﺴﺘﺮﻫﺎي OCR2 ،TCNT2و TCCR2ﺧﺮاب ﺷﻮد.
:Timer/Counter2 Update Busyﺑﺮاي ﺗﻀـﻤﻴﻦ ﻋﻤﻠﻜـﺮد ﺻـﺤﻴﺢ در وﺿـﻌﻴﺖ آﺳـﻨﻜﺮون رﺟﻴﺴـﺘﺮﻫﺎي ﺗﺎﻳﻤﺮ 2ﺑﺮﺧﻼف ﺗﺎﻳﻤﺮ 0و 1ﺑﻪ ﺻﻮرت ﺑﺎﻓﺮ ﺷﺪه ﺑﺮوز ﻣﻴﺸﻮﻧﺪ .ﺑﺪﻳﻦ ﺗﺮﺗﻴـﺐ ﻛـﻪ وﻗﺘـﻲ روي رﺟﻴﺴـﺘﺮ TCNT2 ﻣﻘﺪاري ﻧﻮﺷﺘﻪ ﺷﻮد ،ﺑﻴﺖ TCN2UBﻳﻚ ﻣﻲ ﺷـﻮد و ﻣﻘـﺪاري ﻛـﻪ در رﺟﻴﺴـﺘﺮ ﻣـﻮﻗﺘﻲ ذﺧﻴـﺮه ﺷـﺪه اﺳـﺖ ﺑـﻪ TCNT2ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد .ﺑﺎ اﺗﻤﺎم ﺑﺮوز رﺳﺎﻧﻲ TCNT2اﻳﻦ ﺑﻴﺖ ﺗﻮﺳﻂ ﺳﺨﺖ اﻓﺰار ﺻﻔﺮ ﻣﻲ ﺷﻮد .ﺻـﻔﺮ ﺑـﻮدن OCR2UBﻧﺸﺎن دﻫﻨﺪه ي آﻣﺎدﮔﻲ TCNT2ﺑﺮاي ﭘﺬﻳﺮﻓﺘﻦ ﻣﻘﺪار ﺟﺪﻳﺪ اﺳﺖ.
:Output Compare Register2 Update Busyاﻳﻦ ﺑﻴﺖ ﻫﻤﺎﻧﻨﺪ TCN2UBﺑﻮده ﺑﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ ﺑﺮ روي رﺟﻴﺴﺘﺮ OCR2ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ.
:Timer/Counter Control Register2 Update Busyاﻳﻦ ﺑﻴﺖ ﻫﻤﺎﻧﻨـﺪ TCN2UBﺑـﻮده ﺑـﺎ اﻳـﻦ ﺗﻔﺎوت ﻛﻪ ﺑﺮ روي رﺟﻴﺴﺘﺮ TCCR2ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ.
• در ﺣﺎﻟﺘﻲ ﻛﻪ ﭘﺮﭼﻢ ﻣﺸﻐﻮل ﺑﻮدن ﻳﻚ رﺟﻴﺴﺘﺮ ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ ،ﻧﻮﺷﺘﻦ ﺑﺮ روي آن رﺟﻴﺴﺘﺮ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻣﻘﺪار ﺑﺮوز ﺷﺪه ﺻﺤﻴﺢ ﻧﺒﺎﺷﺪ و ﻣﻤﻜﻦ اﺳﺖ ﺑﺎﻋﺚ وﻗﻔﻪ ي ﻧﺎﺧﻮاﺳﺘﻪ ﺷﻮد. - ٨٠ -
P a g e | 81
www.eca.ir
• ﻣﻜﺎﻧﻴﺴﻢ ﺧﻮاﻧﺪن اﻳﻦ ﺳﻪ رﺟﻴﺴﺘﺮ ﻣﺘﻔﺎوت ﻣﻲ ﺑﺎﺷﺪ ،ﺑﺪﻳﻦ ﺻﻮرت ﻛﻪ زﻣﺎن ﺧﻮاﻧﺪن TCNT2ﻣﻘﺪار ﺧـﻮد رﺟﻴﺴﺘﺮ ﺧﻮاﻧﺪه ﺷﺪه و ﺑﺎ ﺧﻮاﻧﺪن OCR2و TCCR2ﻣﻘﺪار ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ ﻣﻮﻗﺖ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد. • ﺗﺎﻳﻤﺮ 2در وﺿﻌﻴﺖ آﺳﻨﻜﺮون در ﺣﺎﻟﺖ Power-Saveﻧﻴﺰ ﻓﻌـﺎل ﺑـﻮده و ﭘـﺲ از ﺳـﺮرﻳﺰ ﺷـﺪن ﺗـﺎﻳﻤﺮ از وﺿﻌﻴﺖ Power-Saveﺧﺎرج ﺷﺪه و در وﺻﺮت ﻓﻌﺎل ﺑﻮدن وﻗﻔـﻪ ISR ،را اﺟـﺮا ﻧﻤـﻮده و ﻣﺠـﺪدا وارد ﺣﺎﻟﺖ Power-Saveﻣﻲ ﺷﻮد.
ﭘﺮوژه :9ﺳﺎﻋﺖ ﺑﺎ RTCﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ
*****************************************************/ Project : Real Time Clock : Reza Sepas Yar
Author
Company : Pishro Noavaran Kavosh *****************************************************/ >#include <mega16.h >#include #include <stdio.h #define xtal 8000000 #asm .equ __lcd_port=0x1B ;PORTA #endasm ;unsigned char second, minute,hour ;]unsigned char lcd_buff[10 - ٨١ -
P a g e | 82
www.eca.ir
interrupt [TIM2_OVF] void timer2_ovf_isr(void) { if(second==59) { second=0; if(minute==59) { minute=0; if(hour==23) hour=0; else hour++; } else minute++; } else second++; sprintf(lcd_buff,"Time = %d:%d:%d",hour, minute, second); lcd_clear(); lcd_puts(lcd_buff); } void main(void) { // Clock source: TOSC1 pin // Clock value: PCK2/128 - ٨٢ -
P a g e | 83
www.eca.ir
// Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x08; TCCR2=0x05; TCNT2=0x00; OCR2=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x40; lcd_init(16); #asm("sei") // Global enable interrupts while (1); }
- ٨٣ -
P a g e | 84
www.eca.ir
ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻳﻚ
ﺗﺎﻳﻤﺮ ﻳﻚ ﺗﺎﻳﻤﺮي 16ﺑﻴﺘﻲ اﺳﺖ و در آن ﻋﻼوه ﺑﺮ اﻣﻜﺎﻧﺎت ﺗﺎﻳﻤﺮ ﺻﻔﺮ ،ﻳﻚ ﺑﺨﺶ دﻳﮕﺮ ﺑﻪ ﻧﺎم ﺑﺨﺶ Captureﺑﻪ آن اﻓﺰوده ﺷﺪه اﺳﺖ .اﻳﻦ ﺑﺨﺶ در زﻣﺎن ﻫﺎي ﺧﺎص ،ﻋﺪد ﺷﻤﺎرش ﺷﺪه ﺗﻮﺳﻂ ﺗﺎﻳﻤﺮ ﻳﻚ و زﻣـﺎن ﺳـﭙﺮي ﺷـﺪه را ﺛﺒﺖ ﻛﺮده و از ﻃﺮﻳﻖ آن اﻣﻜﺎن اﻧﺪازه ﮔﻴﺮي ﻫﺎي زﻣﺎﻧﻲ را ﻓﺮاﻫﻢ ﻣﻲ آورد .ﺗﺎﻳﻤﺮ ﻳﻚ داراي ﭘـﻨﺞ Modeﻛـﺎري ﺑـﻪ ﻧــﺎم ﻫــﺎي Phase Correct PWM Mode Fast PWM ،CTC ،Normalو Phase and Mode Frequency Correctﻣﻲ ﺑﺎﺷﺪ Mode .ﻫﺎي PWMدر ﺗﺎﻳﻤﺮ 1ﺑﺴﻴﺎر ﻣﺘﻨﻮع و داراي 12ﺣﺎﻟـﺖ PWMﻣـﻲ ﺑﺎﺷﺪ .در اﻳﻦ ﺗﺎﻳﻤﺮ ﭘﻴﻦ T1ﺑﻪ ﻋﻨﻮان ورودي ﻛﺎﻧﺘﺮ و ﭘﻴﻦ ﻫﺎي OC1Aو OC1Bﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴـﻪ ﮔـﺮ ﻋﻤﻞ ﻣﻲ ﻛﻨﻨﺪ .ﻫﻤﭽﻨﻴﻦ ﭘﻴﻦ ICP1ﺑﺮاي ورودي ﺑﺨﺶ Captureﺗﺎﻳﻤﺮ ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ. ﺑﻪ ﻋﻠﺖ 16ﺑﻴﺘﻲ ﺑﻮدن ﺗﺎﻳﻤﺮ ،رﺟﻴﺴﺘﺮﻫﺎي TCNT1و OCR1Aو OCR1Bﺷﺎﻧﺰده ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻫﺮ ﻛﺪام داراي دو ﺑﺎﻳﺖ Lو Hﻫﺴﺘﻨﺪ .ﻫﻤﭽﻨﻴﻦ ﺗﺎﻳﻤﺮ ﻳﻚ داراي دو واﺣﺪ ﻣﻘﺎﻳﺴﻪ ي ﻣﺠﺰا ﻣﻲ ﺑﺎﺷﺪ ﻛـﻪ ﻣﻘـﺪار ﻣﻮﺟـﻮد در رﺟﻴﺴﺘﺮﻫﺎي OCR1Aو OCR1Bرا ﺑـﺎ TCNT1ﻣﻘﺎﻳﺴـﻪ ﻛـﺮده و در ﺻـﻮرت ﺑﺮاﺑـﺮي وﺿـﻌﻴﺖ ﭘـﻴﻦ ﻫـﺎي OC1Aو OC1Bرا ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻨﺪ .ﻫﻤﭽﻨﻴﻦ رﺟﻴﺴﺘﺮ ICR1ﻧﻴﺰ ﻛﻪ رﺟﻴﺴﺘﺮ واﺣﺪ Captureاﺳﺖ رﺟﻴﺴـﺘﺮي 16ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﺪ.
Áرﺟﻴﺴﺘﺮﻫﺎي ﺷﺎﻧﺰده ﺑﻴﺘﻲ ﺗﺎﻳﻤﺮ OCR1B ،OCR1A ،TCNT1 :1و ICR1
- ٨٤ -
P a g e | 85
www.eca.ir
: ﻛﻨﺘﺮل ﺗﺎﻳﻤﺮ را ﺑﺮ ﻋﻬﺪه دارﻧﺪTCCR1B وTCCR1A ﺑﻴﺘﻲ8 رﺟﻴﺴﺘﺮﻫﺎي
TCCR1A
7
6
5
4
3
2
1
0
ﻧﺎم ﺑﻴﺖ
COM1A1
COM1A0
COM1B1
COM1B0
FOC1A
FOC1B
WGM11
WGM10
TCCR1B
7
6
5
4
3
2
1
0
ﻧﺎم ﺑﻴﺖ
ICNC1
ICES1
-
WGM13
WGM12
CS12
CS11
CS10
: ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮدWGM13 وWGM12 ,WGM11 ,WGM10 ﻛﺎري ﺗﺎﻳﻤﺮ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎيMode
WGM13
WGM12
WGM11
WGM10
0
0
0
0
0
1
0
0
0
2
0
0
3
0
4
ﻛﺎريMode
TOP
TOV=1
Normal
0xFFFF
0xFFFF
1
PWM, Phase Correct, 8-bit
0x00FF
0
1
0
PWM, Phase Correct, 9-bit
0x01FF
0
0
1
1
PWM, Phase Correct, 10-bit
0x03FF
0
0
1
0
0
CTC
OCR1A
0xFFFF
5
0
1
0
1
Fast PWM, 8-bit
0x00FF
TOP
6
0
1
1
0
Fast PWM, 9-bit
0x01FF
TOP
7
0
1
1
1
Fast PWM, 10-bit
0x03FF
TOP
8
1
0
0
0
PWM, Phase and Frequency Correct
ICR1
0
9
1
0
0
1
PWM, Phase and Frequency Correct
OCR1A
0
10
1
0
1
0
PWM, Phase Correct
ICR1
0
11
1
0
1
1
PWM, Phase Correct
OCR1A
0
12
1
1
0
0
CTC
ICR1
0xFFFF
13
1
1
0
1
رزرو ﺷﺪه
14
1
1
1
0
Fast PWM
- ٨٥ -
-
-
ICR1
TOP
P a g e | 86
www.eca.ir TOP
OCR1A
Fast PWM
1
1
1
1
15
• ﺗﻌﺮﻳﻒ :TOPﺗﺎﻳﻤﺮ وﻗﺘﻲ ﺑﻪ ﻣﻘﺪار TOPﻣﻲ رﺳﺪ ﻛﻪ ﺑﺮاﺑﺮ ﺑﺎ ﺑﺎﻻﺗﺮﻳﻦ ﻣﻘﺪار در رﺷـﺘﻪ ي ﺷـﻤﺎرش ﺧـﻮد اﺳﺖ .اﻳﻦ ﻣﻘﺪار ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺘﻲ ﻣﺜﻞ 0x01FF ,0x03FFو ﻳﺎ 0x00FFﺑﻮده و ﻳﺎ ﻣﻘﺪار ﻧﮕﻬﺪاري ﺷﺪه در ﻳﻜﻲ از رﺟﻴﺴﺘﺮﻫﺎي OCR1Aﻳﺎ ICR1ﺑﺎﺷﺪ.
FOC1Aو :FOC1Bﺑﻴﺖ ﻫﺎي Forceﺑﺨﺶ ﻣﻘﺎﻳﺴﻪ ﮔﺮ ﻛﻪ ﻋﻤﻠﻜﺮد آن ﻫﺎ ﻫﻤﺎﻧﻨﺪ FOC0در ﺗﺎﻳﻤﺮ ﺻـﻔﺮ و دو ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻪ در Modeﻫﺎي ﻏﻴﺮ ،PWMﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﺑﺪون اﻳﻨﻜﻪ وﻗﻔﻪ اي اﻳﺠﺎد ﻛﻨـﺪ در ﺻﻮرت ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ،ﺑﺎﻋﺚ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي OC1Aو OC1Bﻣﻄﺎﺑﻖ ﺑﺎ وﺿﻌﻴﺖ ﺑﻴﺖ ﻫـﺎي COMدر TCCR1ﻣﻲ ﺷﻮد.
ﺑﻴﺖ ﻫـﺎي COM1B0 ,COM1A1 ,COM1A0و :COM1B1ﺗﻐﻴﻴـﺮ وﺿـﻌﻴﺖ ﭘـﻴﻦ ﻫـﺎي OC1Aو OC1Bرا در ﺣﺎﻟﺖ ﺗﻄﺒﻴﻖ ﻣﻌﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻣﻘﺪار آن ﻫﺎ ﺑﺴﺘﻪ ﺑﻪ Modeﻛﺎري ﻋﻤﻠﻜـﺮد ﻣﺘﻔـﺎوﺗﻲ را اﻳﺠـﺎد ﻣـﻲ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ در ﺑﺮرﺳﻲ Modeﻫﺎي ﻣﺨﺘﻠﻒ آن را ﻣﻄﺎﻟﻌﻪ ﺧﻮاﻫﻴﻢ ﻛﺮد.
ﺑﻴﺖ ﻫﺎي CS11 ،CS10و :CS12ﺑﺮاي ﺗﻌﻴﻴﻦ ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ ﻣﻲ ﺑﺎﺷﻨﺪ:
وﺿﻌﻴﺖ ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ
CS00
CS01
CS02
ﺑﺪون ﻛﻼك )ﻣﺘﻮﻗﻒ(
0
0
0
ﻛﻼك ﺳﻴﺴﺘﻢ )ﺑﺪون ﺗﻘﺴﻴﻢ(
1
0
0
/8ﻛﻼك ﺳﻴﺴﺘﻢ
0
1
0
- ٨٦ -
P a g e | 87
www.eca.ir /64ﻛﻼك ﺳﻴﺴﺘﻢ
1
1
0
/256ﻛﻼك ﺳﻴﺴﺘﻢ
0
0
1
/1024ﻛﻼك ﺳﻴﺴﺘﻢ
1
0
1
ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ ﺧﺎرﺟﻲ )(T1
0
1
1
ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ ﺧﺎرﺟﻲ )(T1
1
1
1
ﺑﻴﺖ :ICES1ﺑﻴﺖ ﺗﻌﻴﻴﻦ ﻟﺒﻪ ي ورودي ﺑﺨﺶ Captureاز ﭘﻴﻦ .ICP1ﺑﺎ ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه و ﺑﺎ ﻳﻚ ﺑﻮدن آن ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ﺑﺎﻋﺚ ﺗﺮﻳﮕﺮ ﻣﻲ ﺷﻮد.
ﺑﻴﺖ :ICNC1ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﺣﺬف ﻧﻮﻳﺰ در ورودي ﭘﻴﻦ ICP1
ﻧﺘﺎﻳﺞ ﺣﺎﺻﻞ از ﻛﺎرﻛﺮد ﺗﺎﻳﻤﺮ 1در 4ﺑﻴﺖ از رﺟﻴﺴﺘﺮ TIFRﺑﻪ ﻧﺎم ﻫﺎي ) TOV1ﭘﺮﭼﻢ ﺳﺮرﻳﺰ( ) OCF1Aﭘﺮﭼﻢ ﺗﻄﺎﺑﻖ ﻣﻘﺎﻳﺴﻪ ﮔﺮ ) OCF1B (Aﭘﺮﭼﻢ ﺗﻄﺎﺑﻖ ﻣﻘﺎﻳﺴﻪ ﮔﺮ (Bو ) ICF1ﭘﺮﭼﻢ ﺑﺨﺶ Captureﺗـﺎﻳﻤﺮ (1ﻣـﻨﻌﻜﺲ ﻣﻲ ﺷﻮﻧﺪ:
0
1
2
3
4
5
6
7
TIFR
TOV0
OCF0
TOV1
OCF1B
OCF1A
ICF1
TOV2
OCF2
ﻧﺎم ﺑﻴﺖ
0
0
X
X
X
X
0
0
ﺳﻄﺢ ﻣﻨﻄﻘﻲ
ﻳﻚ ﺷﺪن ﻫﺮ ﻳﻚ از اﻳﻦ ﭘﺮﭼﻢ ﻫﺎ در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ ) (Iو ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ ي ﻣﺮﺑﻮﻃﻪ در رﺟﻴﺴﺘﺮ TIMSKﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻧﺸﻌﺎب ﺑﺮﻧﺎﻣﻪ ﺑﻪ ISRﻣﺮﺑﻮط ﺑﻪ آن وﻗﻔﻪ ﺷﻮد:
- ٨٧ -
P a g e | 88
www.eca.ir
0
1
2
3
4
5
6
7
TIMSK
TOIE0
OCIE0
TOIE1
OCIE1B
OCIE1A
TICIE1
TOIE2
OCIE2
ﻧﺎم ﺑﻴﺖ
0
0
X
X
X
X
0
0
ﺳﻄﺢ ﻣﻨﻄﻘﻲ
ﺑﺎ اﺟﺮا ﺷﺪن ISRﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﺑﻴﺖ ﭘﺮﭼﻢ وﻗﻔﻪ ﺻﻔﺮ ﺷﺪه و ﻳﺎ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي آن ﺑﻮﺳﻴﻠﻪ ي ﻧﺮم اﻓﺰار آن را ﭘﺎك ﻛﺮد.
Normal Mode c
اﻳﻦ Modeﻫﻤﺎﻧﻨﺪ ﻣﺸﺎﺑﻪ آن در ﺗﺎﻳﻤﺮ ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ ﺗﺎ ﻋﺪد 0xFFFFﺷﻤﺎرش ﻛﺮده و ﺑـﺎ رﺳﻴﺪن ﺑﻪ آن ﺗﺎﻳﻤﺮ ﺳﺮرﻳﺰ ﻛﺮده و ﺑﻴﺖ TOV1ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ ﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋـﺚ اﺟـﺮاي ISRﻣﺮﺑﻮﻃﻪ ﺷﻮد .در Modeﻋﺎدي ﻫﺮ دو ﻣﻘﺎﻳﺴﻪ ﮔﺮ Aو Bﻓﻌﺎل ﺑﻮده و ﻫﺮ ﻛﺪام ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻞ ﻋﻤـﻞ ﻣﻘﺎﻳﺴـﻪ را روي رﺟﻴﺴﺘﺮ TCNT1و OCR1Aو OCR1Bاﻧﺠﺎم ﻣـﻲ دﻫﻨـﺪ .در ﺻـﻮرت ﺑﺮاﺑـﺮي ﺑﻴـﺖ OCF1Aﻳـﺎ OCF1Bﻳﻚ ﺷﺪه و ﺧﺮوﺟﻲ OC1Aﻳﺎ OC1Bﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ داده و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮﻧﺪ.
- ٨٨ -
P a g e | 89
www.eca.ir
وﺿﻌﻴﺖ ﭘﻴﻦ OC1Aﻳﺎ OC1B
COM1A0/COM1B0
COM1A1/COM1B1
ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
0
0
Toggleدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ
1
0
Clearدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ
0
1
Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ
1
1
• در ﺻﻮرت اﺳﺘﻔﺎده از OC1Aﻳﺎ OC1Bﺑﺮاي ﺗﻮﻟﻴﺪ ﺷﻜﻞ ﻣﻮج ،ﺑﺎﻳﺪ اﻳﻦ ﭘﻴﻦ ﻫﺎ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ ﭘﻴﻜﺮﺑﻨﺪي ﺷﻮﻧﺪ.
ﻣﺜﺎل ) :7ﺗﻮﻟﻴﺪ دو ﺷﻜﻞ ﻣﻮج ﺑﺎ دوره ﺗﻨﺎوب 131ﻣﻴﻠﻲ ﺛﺎﻧﻴﻪ و اﺧﺘﻼف ﻓﺎز 10ﻣﻴﻠﻲ ﺛﺎﻧﻴﻪ(
>#include <mega16.h #define xtal 8000000 )void main(void { ;PORTD=0x00 ;DDRD=0x30 // Mode: Normal top=FFFFh //toggle OC1A & OC1B
;TCCR1A=0x50
//Clock/8
;TCCR1B=0x02 ;OCR1AH=0x00
//OCR1A=255 - ٨٩ -
;OCR1AL=0xFF
P a g e | 90
www.eca.ir
;OCR1BH=0x28 //OCR1B=10255
;OCR1BL=0x0F ;)while (1 }
T = 2 × 216 × 1μs = 131072μs = 131ms
= OCR1B − OCR1A = 10255 − 255 = 10000μs = 10msاﺧﺘﻼف ﻓﺎز
CTC Mode d
در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘﺪار رﺟﻴﺴﺘﺮ TCNT1ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ ﺑﺎ ﻣﻘﺪار رﺟﻴﺴﺘﺮ OCR1Aﻳﺎ ICR1ﻣﻘﺎﻳﺴﻪ ﻣـﻲ ﺷـﻮد و در ﺻﻮرت ﺑﺮاﺑﺮي ﻣﻘﺪار رﺟﻴﺴﺘﺮ TCNT1ﺑﺮاﺑﺮ ﺻﻔﺮ ﻣﻲ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﺣﺎﻟـﺖ ﻣﻘـﺪار TOPﺗـﺎﻳﻤﺮ را ﺑـﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﻘﺪار ﻣﻮﺟﻮد در ﺑﻴﺖ ﻫﺎي WGMﻣﻘﺪار رﺟﻴﺴﺘﺮﻫﺎي OCR1Aﻳﺎ ICR1ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ. ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار TOPﺧﻮد ﺑﺮ ﺣﺴﺐ اﻳﻨﻜﻪ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ OCR1Aﻳﺎ ICR1اﻧﺘﺨﺎب ﺷـﺪه ﺑﺎﺷـﺪ ﺑـﻪ ﺗﺮﺗﻴﺐ ﭘﺮﭼﻢ ﻫﺎي OCF1Aﻳﺎ ICF1ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ از آن ﻣـﻲ ﺗـﻮان ﺑـﺮاي ﺗﻐﻴﻴـﺮ دادن ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ اﺳﺘﻔﺎده ﻛﺮد .اﻳﻦ ﻋﻤﻞ ﺑﺎﻳﺪ ﺑﺎ دﻗﺖ ﺻﻮرت ﮔﻴﺮد زﻳﺮا رﺟﻴﺴـﺘﺮ ﻣﻘﺎﻳﺴـﻪ ي ﺗﺎﻳﻤﺮﻫـﺎ ﻓﻘـﻂ در Mode ﻫﺎي PWMداراي ﺑﺎﻓﺮ دوﺑﻞ ﻣﻲ ﺑﺎﺷﻨﺪ .در اﻳﻦ ﺣﺎﻟـﺖ ﻓﺮﻛـﺎﻧﺲ ﻣـﻮج اﻳﺠـﺎد ﺷـﺪه روي ﭘﺎﻳـﻪ ﻫـﺎي OC1Aﻳـﺎ OC1Bﻣﻄﺎﺑﻖ راﺑﻄﻪ ي زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
f CLK _ I / O
)2.N .(1 + OCR1A - ٩٠ -
= f OC1x
P a g e | 91
www.eca.ir
(OC1A ﻛﻴﻠﻮﻫﺮﺗﺰ روي ﭘﺎﻳﻪ ي1 )ﺗﻮﻟﻴﺪ ﻣﻮج ﻣﺮﺑﻌﻲ ﺑﺎ ﻓﺮﻛﺎﻧﺲ:8ﻣﺜﺎل
#include <mega16.h> #define xtal 8000000 void main(void) { PORTD=0x00; DDRD=0x30; // Mode: CTC top=01F3h TCCR1A=0x40; TCCR1B=0x0A; OCR1AH=0x01; OCR1AL=0xF3;
//OCR1A=499
while (1); }
f=
8000000 = 1000 = 1KHz 2 × 8(1 + 499)
- ٩١ -
P a g e | 92
www.eca.ir
Fast PWM Mode d
ﺑﺮ ﺧﻼف ﺗﺎﻳﻤﺮﻫﺎي ﺻﻔﺮ و دو ﻛﻪ در آن ﻣﻮج ﻫﺎي PWMﺗﻮﻟﻴﺪ ﺷﺪه داراي دﻗﺖ ﺛﺎﺑـﺖ 8ﺑﻴﺘـﻲ ﻫﺴـﺘﻨﺪ ،ﺗـﺎﻳﻤﺮ 1 ﻗﺎدر اﺳﺖ ﺳﻴﮕﻨﺎل ﻫﺎي PWMاي ﺑﺎ دﻗﺖ ﻣﺘﻐﻴﺮ را اراﺋﻪ ﻛﻨﺪ ،اﻳﻦ ﻣﺴﺌﻠﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﻋـﻼوه ﺑـﺮ ﺗﻐﻴﻴﺮ Duty Cycleﻓﺮﻛﺎﻧﺲ ﻣﻮج را ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﻛﻨﺘﺮل ﻛﻨﺪ )ﺑﺪون ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ (TCNT1
PWMﺳﺮﻳﻊ داراي ﭘﻨﺞ Modeﻣﻲ ﺑﺎﺷﺪ(WGM1[3:0] = 15 ،14 ،7 ،6 ،5) :
.1
PWMﺳﺮﻳﻊ 8ﺑﻴﺘﻲ )(0xFF = TOP
.2
PWMﺳﺮﻳﻊ 9ﺑﻴﺘﻲ )(0x1FF = TOP
.3
PWMﺳﺮﻳﻊ 10ﺑﻴﺘﻲ )(0x03FF = TOP
.4
PWMﺳﺮﻳﻊ ﺑﺎ ICR1 = TOP
.5
PWMﺳﺮﻳﻊ ﺑﺎ OCR1A = TOP
در اﻳﻦ Modeﺗﺎﻳﻤﺮ از ﺻﻔﺮ ﺗﺎ ﻣﻘﺪار TOPﺧﻮد ﺷﺮوع ﺑﻪ ﺷﻤﺎرش ﻛﺮده و ﭘﺲ از از ﺳﺮرﻳﺰ ﻣﺠﺪدا از ﺻﻔﺮ ﺷﺮوع ﺑﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ .در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻘﺎﻳﺴﻪ ي ﺧﺮوﺟﻲ در ﺣﺎﻟﺖ PWMﻏﻴﺮ ﻣﻌﻜﻮس ﺑﺎﺷـﺪ در ﺣﺎﻟـﺖ ﺗﻄﺒﻴـﻖ ﻣﻘﺎﻳﺴـﻪ ﺑﻴﻦ رﺟﻴﺴﺘﺮﻫﺎي TCNT1و OCR1x
ﭘﻴﻦ OC1xﻳﻚ ﺷﺪه و ﺑﺎ رﺳﻴﺪن ﺑﻪ ﻣﻘﺪار TOPﭘﺎك ﻣﻲ ﺷﻮد .در
ﺻﻮرﺗﻲ ﻛﻪ ﺧﺮوﺟﻲ PWMﻣﻌﻜﻮس ﺑﺎﺷﺪ وﺿﻌﻴﺘﻲ ﻋﻜﺲ وﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ .دﻗﺖ ﻣﻮج PWMﺧﺮوﺟﻲ ﻣـﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺖ 9 ،8ﻳﺎ 10ﺑﻴﺘﻲ داﺷﺘﻪ وﻳﺎ ﺑﻮﺳﻴﻠﻪ ي رﺟﻴﺴﺘﺮﻫﺎي ICR1ﻳﺎ OCR1Aﺑﻪ ﻣﻘـﺪار دﻟﺨـﻮاه ﺗﻨﻈـﻴﻢ
- ٩٢ -
P a g e | 93
www.eca.ir
ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﺣﺪاﻗﻞ ﻣﻘﺪار ﻣﺠﺎز 2ﺑﻴﺖ )ﺑﺎ دادن ﻣﻘﺪار 0x0003ﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي ICR1ﻳـﺎ (OCR1xو ﺣﺪاﻛﺜﺮ آن 16ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ )ﺑﺎ دادن ﻣﻘﺪار 0xFFFFﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي ICR1ﻳﺎ .(OCR1x
دﻗﺖ ﻣﻮج PWMﺑﺮ ﺣﺴﺐ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ از راﺑﻄﻪ ي زﻳﺮ ﺑﻪ دﺳﺖ ﻣﻲ آﻳﺪ:
)log(TOP + 1 )log(2
= resolution
ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار TOPﭘﺮﭼﻢ ﺳـﺮرﻳﺰ TOV1ﻓﻌـﺎل ﺷـﺪه و ﺑـﺎ ﺗﻄﺒﻴـﻖ ﻣﻘﺎﻳﺴـﻪ ﻧﻴـﺰ ﺑﻴـﺖ OCF1Aﻳـﺎ OCF1Bﻳﻚ ﻣﻲ ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﻫﺎ اﮔﺮ وﻗﻔﻪ ي ﻣﺮﺑﻮﻃﻪ ﻓﻌﺎل ﺷﺪه ﺑﺎﺷﺪ ﻣـﻲ ﺗـﻮان در ISRآن وﻗﻔـﻪ ﻣﻘـﺪار ﻣﻘﺎﻳﺴﻪ را ﺗﻐﻴﻴﺮ داد .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻣﻘـﺪار رﺟﻴﺴـﺘﺮﻫﺎي ﻣﻘﺎﻳﺴـﻪ ﺑﺎﻳـﺪ از ﻣﻘـﺪار TOPﻛﻤﺘـﺮ ﺑﺎﺷـﺪ در ﻏﻴـﺮ اﻳﻨﺼﻮرت ﻫﻴﭽﮕﺎه ﻣﻘﺎﻳﺴﻪ اي ﺻﻮرت ﻧﻤﻲ ﮔﻴﺮد.
ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي OC1Aو OC1Bدر ﺣﺎﻟﺖ ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
وﺿﻌﻴﺖ ﭘﻴﻦ OC1Aﻳﺎ OC1B ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
COM1A0
COM1A1
/COM1B0
/COM1B1
0
0
اﮔﺮ WGM1[3:0] = 15ﺑﺎﺷﺪ Toggle :ﭘﻴﻦ OC1Aدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و OC1Bﭘﻴﻦ I/Oﻣﻌﻤﻮﻟﻲ 1
0
Clearدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و Setدر وﺿﻌﻴﺖ PWM) TOPﻏﻴﺮ ﻣﻌﻜﻮس(
0
1
Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و Clearدر وﺿﻌﻴﺖ PWM) TOPﻣﻌﻜﻮس(
1
1
ﺑﺮاي دﻳﮕﺮ ﺣﺎﻟﺖ ﻫﺎي ] :WGM1[3:0ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
- ٩٣ -
P a g e | 94
www.eca.ir
: ﺣﺎﺻﻞ از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪPWM ﻓﺮﻛﺎﻧﺲ ﻣﻮج f PWM =
f Clk _ I / O N.(1 + TOP )
( درﺻﺪ25 ﻛﻴﻠﻮ ﻫﺮﺗﺰ و زﻣﺎن وﻇﻴﻔﻪ ي1 ﺑﺎ ﻓﺮﻛﺎﻧﺲPWM )ﻣﻮج:9ﻣﺜﺎل
#include <mega16.h> #define xtal 8000000 void main(void) { PORTD=0x00; DDRD=0x20; // Mode: Fast PWM top=03FFh // OC1A output: Non-Inv. // OC1B output: Disconnected TCCR1A=0x83; TCCR1B=0x0A; //10 Bit PWM OCR1AH=0x00; OCR1AL=0xFF; while (1); }
f PWM =
8000000 = 976 ≈ 1KHz 8.(1 + 1023 )
DutyCycle =
- ٩٤ -
256 × 100% = 25% 1024
P a g e | 95
www.eca.ir
: ﻛﻴﻠﻮﻫﺮﺗﺰ رﺳﻴﺪ1 ﻣﻲ ﺗﻮان ﺑﻪ ﻓﺮﻛﺎﻧﺲ دﻗﻴﻖ، ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮISR درTCNT1 • ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ
interrupt [TIM1_OVF] void timer1_ovf_isr(void) { TCNT1=24; } TIMSK=0x04; //Enable TOV1 #asm("sei") //Enable Interrupts
Phase Correct Mode e
(WGM1[3:0] = 11 ،10 ،3 ،2 ،1) : ﻛﺎري ﻣﻲ ﺑﺎﺷﺪMode ﺗﺼﺤﻴﺢ ﻓﺎز داراي ﭘﻨﺞPWM
(0xFF = TOP) ﺑﻴﺘﻲ8 ﺗﺼﺤﻴﺢ ﻓﺎزPWM
.1
(0x1FF = TOP) ﺑﻴﺘﻲ9 ﺗﺼﺤﻴﺢ ﻓﺎزPWM
.2
(0x03FF = TOP) ﺑﻴﺘﻲ10 ﺗﺼﺤﻴﺢ ﻓﺎزPWM
.3
ICR1 = TOP ﺗﺼﺤﻴﺢ ﻓﺎز ﺑﺎPWM
.4
OCR1A = TOP ﺗﺼﺤﻴﺢ ﻓﺎز ﺑﺎPWM
.5
- ٩٥ -
P a g e | 96
www.eca.ir
در اﻳﻦ Modeﺗﺎﻳﻤﺮ ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ از ﻣﻘﺪار ﺻﻔﺮ ﺗﺎ TOPو از TOPﺗﺎ ﺻﻔﺮ ﻣﻲ ﺷﻤﺎرد .در ﺣﺎﻟﺖ PWMﻏﻴﺮ ﻣﻌﻜﻮس در ﺣﺎﻟﻲ ﻛـﻪ ﺗـﺎﻳﻤﺮ ﺑـﻪ ﺻـﻮرت ﺻـﻌﻮدي ﻣـﻲ ﺷـﻤﺎرد در ﻟﺤﻈـﻪ ي ﺑﺮاﺑـﺮي رﺟﻴﺴـﺘﺮﻫﺎي TCNT1و OCR1xﭘﻴﻦ OC1xﺻﻔﺮ ﺷﺪه و در ﺣﺎﻟﺖ ﺷﻤﺎرش ﻧﺰوﻟﻲ ﺑﺎ ﺗﻄﺎﺑﻖ دو رﺟﻴﺴﺘﺮ اﻳﻦ ﭘﻴﻦ ﻳﻚ ﻣﻲ ﺷﻮد .در ﺣﺎﻟﺖ PWMﻣﻌﻜﻮس ،ﻋﻜﺲ اﻳﻦ ﻗﻀﻴﻪ ﺑﺮﻗﺮار اﺳﺖ. دﻗﺖ ﻣﻮج PWMﺧﺮوﺟﻲ ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺖ 9 ،8ﻳﺎ 10ﺑﻴﺘﻲ داﺷﺘﻪ وﻳـﺎ ﺑﻮﺳـﻴﻠﻪ ي رﺟﻴﺴـﺘﺮﻫﺎي ICR1ﻳـﺎ OCR1Aﺑﻪ ﻣﻘﺪار دﻟﺨﻮاه ﺗﻨﻈﻴﻢ ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﺣﺪاﻗﻞ ﻣﻘـﺪار ﻣﺠـﺎز 2ﺑﻴـﺖ )ﺑـﺎ دادن ﻣﻘـﺪار 0x0003ﺑـﻪ رﺟﻴﺴﺘﺮﻫﺎي ICR1ﻳﺎ (OCR1xو ﺣﺪاﻛﺜﺮ آن 16ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ )ﺑﺎ دادن ﻣﻘﺪار 0xFFFFﺑـﻪ رﺟﻴﺴـﺘﺮﻫﺎي ICR1ﻳﺎ .(OCR1x
دﻗﺖ ﻣﻮج PWMﺑﺮ ﺣﺴﺐ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ از راﺑﻄﻪ ي زﻳﺮ ﺑﻪ دﺳﺖ ﻣﻲ آﻳﺪ:
)log(TOP + 1 )log(2
= resolution
ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ TOV1ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار ﺻﻔﺮ ﻳﻚ ﺧﻮاﻫﺪ ﺷﺪ و ﺑﺎ ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ﻧﻴـﺰ ﺑﻴـﺖ OCF1A ﻳﺎ OCF1Bﻳﻚ ﻣﻲ ﺷﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﻫﺎ اﮔﺮ وﻗﻔﻪ ي ﻣﺮﺑﻮﻃﻪ ﻓﻌﺎل ﺷﺪه ﺑﺎﺷﺪ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ISRآن وﻗﻔـﻪ ﻣﻨﺸﻌﺐ ﺷﻮد .ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ ) (OCRxرا در ISRﻳﺎ ﻫﺮ زﻣﺎن دﻳﮕـﺮ ﻣـﻲ ﺗـﻮان ﺗﻐﻴﻴـﺮ داد اﻣـﺎ اﻳـﻦ ﻣﻘـﺪار در ﺑـﺎﻓﺮ رﺟﻴﺴﺘﺮﻫﺎي OCR1Aو OCR1Bذﺧﻴﺮه ﺷﺪه و ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار TOPدر ﺧـﻮد رﺟﻴﺴـﺘﺮ Loadﻣـﻲ ﺷﻮد ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻐﻴﻴﺮ دادن ﻣﻘﺪار رﺟﻴﺴﺘﺮﻫﺎي OCR1xﺑﻪ دﻟﻴـﻞ ﺗﻐﻴﻴـﺮ آن ﺑـﺎ رﺳـﻴﺪن ﺑـﻪ TOPﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋـﺚ ﺧﺮوﺟﻲ PWMﻧﺎ ﻣﺘﻘﺎرن ﺷﻮد:
- ٩٦ -
P a g e | 97
www.eca.ir OCR1A=110
TOP OCR1A=180
9
ﻣﺸﻜﻞ ﺑﺎﻻ در PWMﺗﺼﺤﻴﺢ ﻓﺎز و ﻓﺮﻛﺎﻧﺲ ﺑﺎ ﺑﺮوز ﻛﺮدن رﺟﻴﺴﺘﺮﻫﺎي OCR1xدر زﻣﺎن رﺳﻴﺪن ﺑﻪ ﺻﻔﺮ ،ﺣﻞ ﻣﻲ ﺷﻮد.
ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي OC1Aو OC1Bدر ﺣﺎﻟﺖ ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
وﺿﻌﻴﺖ ﭘﻴﻦ OC1Aﻳﺎ OC1B ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
COM1A0
COM1A1
/COM1B0
/COM1B1
0
0
اﮔﺮ WGM1[3:0] = 9, 14ﺑﺎﺷﺪ Toggle :ﭘﻴﻦ OC1Aدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و OC1Bﭘﻴﻦ I/O 1
0
Clearدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﺻﻌﻮدي Set .در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﻧﺰوﻟﻲ
0
1
Setدر وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﺻﻌﻮدي Clear .در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﻧﺰوﻟﻲ
1
1
ﻣﻌﻤﻮﻟﻲ ﺑﺮاي دﻳﮕﺮ ﺣﺎﻟﺖ ﻫﺎي ] :WGM1[3:0ﻏﻴﺮ ﻓﻌﺎل ) I/Oﻣﻌﻤﻮﻟﻲ(
ﻓﺮﻛﺎﻧﺲ ﻣﻮج PWMدر ﺣﺎﻟﺖ ﺗﺼﺤﻴﺢ ﻓﺎز ﻧﺼﻒ ﺣﺎﻟﺖ Fast PWMﺑﻮده و از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ: f Clk _ I / O ) 2.N.(1 + TOP
- ٩٧ -
= f PWM
P a g e | 98
www.eca.ir
ﻣﺜﺎل :10در ﺑﺮﻧﺎﻣﻪ ي ﻣﺜﺎل ﻗﺒﻞ Modeﺗﺎﻳﻤﺮ را از Fast PWMﺑﻪ Phase Correct PWMﺗﻐﻴﻴﺮ داده و ﻧﺼﻒ ﺷﺪن ﻓﺮﻛﺎﻧﺲ PWMﺧﺮوﺟﻲ را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ: ;TCCR1A=0x83 ;TCCR1B=0x02 ;OCR1AL=0xFF
Phase and Frequency Correct Mode g
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﻪ دﻟﻴﻞ ﺑﺮوز ﻛﺮدن رﺟﻴﺴﺘﺮ OCR1xﺑﺎ رﺳﻴﺪن ﺑﻪ TOPﻣﻤﻜﻦ اﺳﺖ ﺷﻜﻞ ﻣـﻮج ﺧﺮوﺟـﻲ ﻧﺎﻣﺘﻘﺎرن ﺷﻮد ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي ﺣﻞ اﻳﻦ ﻣﺸﻜﻞ Modeﭘﻨﺠﻢ ﺗﺎﻳﻤﺮ ﻳﻚ اﻳﻦ رﺟﻴﺴﺘﺮ را ﺑﺎ رﺳﻴﺪن ﺑﻪ ﺻﻔﺮ ﺑﺮوز ﻣﻲ ﻛﻨﺪ. ﺗﻔﺎوت دﻳﮕﺮ اﻳﻦ Modeو ﻋﻤﻠﻜﺮد ﻗﺒﻠﻲ در اﻳﻦ اﺳﺖ ﻛـﻪ ﺗـﺎﻳﻤﺮ ﺗﻨﻬـﺎ در دو ﺣﺎﻟـﺖ زﻳـﺮ ﻛـﺎر ﻣـﻲ ﻛﻨـﺪ= 9 ،8) : ](WGM1[3:0
.1
PWMﺗﺼﺤﻴﺢ ﻓﺎز و ﻓﺮﻛﺎﻧﺲ ﺑﺎ ICR1 = TOP
.2
PWMﺗﺼﺤﻴﺢ ﻓﺎز و ﻓﺮﻛﺎﻧﺲ ﺑﺎ OCR1A = TOP
- ٩٨ -
P a g e | 99
www.eca.ir
واﺣﺪ Captureﺗﺎﻳﻤﺮ ﻳﻚ
ﻋﻤﻠﻜﺮد اﻳﻦ واﺣﺪ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ در اﺛﺮ ﺗﺮﻳﮕﺮ ﺷﺪن ورودي Captureاز ﭘﻴﻦ ICP1ﻳﺎ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﮔﺮ آﻧﺎﻟﻮگ ﻣﻘﺪار ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ TCNT1در رﺟﻴﺴﺘﺮ ICR1ﻧﻮﺷﺘﻪ ﺷﺪه و ﻫﻤﺰﻣﺎن ﭘﺮﭼﻢ Captureﺗـﺎﻳﻤﺮ ﻳﻚ ) (ICF1ﻳﻚ ﻣﻲ ﺷﻮد .در اﻳﻦ زﻣﺎن در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴـﺖ ﭘـﺮﭼﻢ ورودي (TICIE1) Captureاﻳـﻦ ﺗﺮﻳﮕﺮ ﺷﺪن ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد .ﺑﺎ اﺟﺮا ﺷﺪن ISRﺑﻪ ﻃﻮر ﺧﻮدﻛﺎر ﺑﻴـﺖ ICF1ﺻـﻔﺮ ﺷـﺪه و ﻳـﺎ در ﺻﻮرت ﻓﻌﺎل ﻧﺒﻮدن وﻗﻔﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي آن ﭘﺎك ﺷﻮد.
0
1
2
4
3
5
6
7
Bit
]ICR1[15:8
ICR1H
]ICR1[7:0
ICR1L
• رﺟﻴﺴﺘﺮ ICR1ﺑﻪ ﺟﺰ در ﺣﺎﻟﺘﻲ ﻛﻪ ﺑﻪ ﻋﻨﻮان TOPﺟﻬﺖ ﻣﻘﺎﻳﺴﻪ ﺑﻪ ﻛﺎر ﻣﻲ رود ) Modeﻫﺎي ،10 ،8 12و (14ﻳﻚ رﺟﻴﺴﺘﺮ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ.
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺗﺮﻳﮕﺮ ﺷﺪن واﺣﺪ Captureﻣﻲ ﺗﻮاﻧﺪ از دو ﻣﻨﺒﻊ ﻣﺨﺘﻠﻒ ﺻﻮرت ﮔﻴﺮد ﻛﻪ اﻳﻦ از ﻃﺮﻳﻖ ﺑﻴﺖ ACICدر رﺟﻴﺴﺘﺮ ACSRﺻﻮرت ﻣﻲ ﮔﻴﺮد .ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﭘﻴﻦ ICP1و ﻳﻚ ﺑـﻮدن آن ﺧﺮوﺟـﻲ ﻣﻘﺎﻳﺴـﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ را اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﺪ .ﻫﻤﭽﻨﻴﻦ ﻧﻮع ﺳﻴﮕﻨﺎل ورودي از ﭘﻴﻦ ICP1ﺑﻮﺳﻴﻠﻪ ﺑﻴـﺖ ICES1از رﺟﻴﺴـﺘﺮ TCCR1Bﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻪ ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه و ﻳـﻚ ﺑـﻮدن آن ﻟﺒـﻪ ي ﺑـﺎﻻ روﻧﺪه ي ﺳﻴﮕﻨﺎل ورودي را اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﺪ.
- ٩٩ -
P a g e | 100
www.eca.ir
0
1
2
4
3
5
6
TCCR1B
7
ﻧﺎم ﺑﻴﺖ
ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
ورودي Captureداراي ﻳﻚ واﺣﺪ ﻛﺎﻫﺶ ﻧﻮﻳﺰ ﻧﻴﺰ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﻓﻴﻠﺘﺮ دﻳﺠﻴﺘـﺎل اﻳﻤﻨـﻲ ورودي را ﺑﻬﺒﻮد ﻣﻲ ﺑﺨﺸﺪ .اﻳﻦ واﺣﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ICNC1از رﺟﻴﺴﺘﺮ TCCR1Bﻓﻌﺎل ﻣﻲ ﺷﻮد .ﺑﺎ ﻓﻌـﺎل ﺷـﺪن اﻳـﻦ ﻓﻴﻠﺘﺮ ﺑﺎﻳﺪ ﺳﻴﮕﻨﺎل ﻧﻤﻮﻧﻪ ﺑﺮداري ﺷﺪه روي ﭘﺎﻳﻪ ي ICP1ﺑﺮاي ﭼﻬﺎر ﺳﻴﻜﻞ ﻛﻼك ﻣﻌﺘﺒﺮ ﺑﺎﺷﺪ.
ﭘﺮوژه :10ﻛﻨﺘﺮل ﺳﺮو ﻣﻮﺗﻮر
*****************************************************/ Project : Servo Motor Controller : Reza Sepas Yar
Author
Company : Pishro Noavaran Kavosh : ATmega16
Chip type
: 16.000000 MHz
Clock frequency
*****************************************************/ >#include <mega16.h >#include <delay.h #define xtal 16000000 )void main(void { ;PORTD=0x00 - ١٠٠ -
P a g e | 101
www.eca.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.eca.ir
ﺗﻮﻟﻴﺪ ﻣﻮج ﺳﻴﻨﻮﺳﻲ:11 ﭘﺮوژه
#include <mega16.h> #define xtal 8000000 flash char sinewave[256]={ 0x80,0x83,0x86,0x89,0x8C,0x8F,0x92,0x95,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE, 0xB1,0xB4,0xB6,0xB9,0xBC,0xBF,0xC1,0xC4,0xC7,0xC9,0xCC,0xCE,0xD1,0xD3,0xD6,0xD8, 0xDA,0xDC,0xDF,0xE1,0xE3,0xE5,0xE6,0xE8,0xEA,0xEC,0xED,0xEF,0xF1,0xF2,0xF3,0xF5, 0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFC,0xFD,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFD,0xFC,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7, 0xF5,0xF4,0xF3,0xF2,0xF0,0xEF,0xED,0xEB,0xEA,0xE8,0xE6,0xE4,0xE2,0xE0,0xDE,0xDC, 0xD9,0xD7,0xD5,0xD2,0xD0,0xCE,0xCB,0xC8,0xC6,0xC3,0xC1,0xBE,0xBB,0xB8,0xB5,0xB3, 0xB0,0xAD,0xAA,0xA7,0xA4,0xA1,0x9E,0x9B,0x97,0x94,0x91,0x8E,0x8B,0x88,0x85,0x82, 0x7E,0x7B,0x78,0x75,0x72,0x6F,0x6C,0x69,0x65,0x62,0x5F,0x5C,0x59,0x56,0x53,0x50, 0x4D,0x4B,0x48,0x45,0x42,0x3F,0x3D,0x3A,0x37,0x35,0x32,0x30,0x2D,0x2B,0x29,0x26, 0x24,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x14,0x13,0x11,0x0F,0x0E,0x0D,0x0B,0x0A, 0x09,0x08,0x06,0x05,0x05,0x04,0x03,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01, - ١٠٢ -
P a g e | 103
www.eca.ir 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, 0x0A,0x0B,0x0D,0x0E,0x0F,0x11,0x13,0x14,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x24, 0x26,0x29,0x2B,0x2D,0x30,0x32,0x35,0x37,0x3A,0x3D,0x3F,0x42,0x45,0x48,0x4B,0x4D, 0x50,0x53,0x56,0x59,0x5C,0x5F,0x62,0x65,0x69,0x6C,0x6F,0x72,0x75,0x78,0x7B,0x7E };
char i=0; interrupt [TIM1_COMPA] void timer1_compa_isr(void) { OCR1A=sinewave[i]; i++; if(i==255) 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; // Timer(s)/Counter(s) Interrupt(s) initialization - ١٠٣ -
P a g e | 104
www.eca.ir
TIMSK=0x10; //enable global interrups #asm("sei"); while (1); }
- ١٠٤ -
P a g e | 105
www.eca.ir
ﭘﻮرت ﺳﺮﻳﺎل )(RS-232
RS-232cدر اواﺧﺮ دﻫﻪ 60ﻣﻴﻼدي ﺑﻪ ﺻﻮرت اﺳﺘﺎﻧﺪارد ﺗﻌﺮﻳﻒ ﺷﺪ و ﻫﻤﭽﻨﺎن ﻳﻜﻲ از اﺳـﺘﺎﻧﺪاردﻫﺎي ﭘﺮﻛـﺎرﺑﺮد در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ و ﻛﺎرﺑﺮدﻫﺎي ﺻﻨﻌﺘﻲ اﺳﺖ .اﻳﻦ اﺳﺘﺎﻧﺪارد ﻫﻢ ارﺗﺒﺎط ﺳﺮﻳﺎل ﺳـﻨﻜﺮون و ﻫـﻢ آﺳـﻨﻜﺮون را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻛﺮده و ﺑﻪ ﺻﻮرت Full Duplexﻋﻤﻞ ﻣﻲ ﻧﻤﺎﻳﺪ .ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ ﺗﻨﻬﺎ ارﺗﺒﺎط آﺳﻨﻜﺮون را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﻨﺪ و از ﻃﺮﻳﻖ ﭼﻴﭗ UARTﻣﻮﺟﻮد در ﺑﺮد اﺻﻠﻲ ،اﻃﻼﻋﺎت را از ﺣﺎﻟﺖ ﻣﻮازي ﺑﻪ ﺳـﺮﻳﺎل ﻳـﺎ از ﺳـﺮﻳﺎل ﺑـﻪ ﻣﻮازي ﺗﺒﺪﻳﻞ ﻛﺮده و ﺑﺎ ﺗﻨﻈﻴﻤﺎت زﻣﺎﻧﻲ آن را از ﻃﺮﻳﻖ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻳﺎ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ.
ﭘﻮرت ﺳﺮﻳﺎل داراي ﻳﻚ ﻛﺎﻧﻜﺘﻮر 9ﭘﻴﻦ ﻣﻲ ﺑﺎﺷﺪ و از آﻧﺠﺎﻳﻲ ﻛﻪ اﻳﻦ اﺳﺘﺎﻧﺪارد در اﺑﺘﺪا ﺑﺮاي ارﺗﺒﺎط ﺑﺎ ﻣﻮدم ﻃﺮاﺣـﻲ ﺷﺪه ﺑﻮد ،داراي ﭘﻴﻦ ﻫﺎي Handshakingو وﺿﻌﻴﺖ ﻣﻲ ﺑﺎﺷﺪ .اﻣﺎ ﻧـﻮع ﺧﺎﺻـﻲ از ارﺗﺒـﺎط ﺑـﺎ RS-232ﺑـﻪ ﻧـﺎم Null-Modemﻛﻪ ﺗﻨﻬﺎ ﺷﺎﻣﻞ ﭘﻴﻦ ﻫﺎي ارﺳﺎل و درﻳﺎﻓﺖ اﺳﺖ ﺑﺮاي ارﺗﺒﺎط ﺑـﺎ ﻏﻴـﺮ از ﻣـﻮدم اﺳـﺘﻔﺎده ﻣـﻲ ﺷـﻮد. ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻨﻬﺎ دو ﭘﻴﻦ Rxو ) Txو اﻟﺒﺘﻪ زﻣﻴﻦ( ﻣﻮرد ﻧﻴﺎز اﺳﺖ .در ﺷﻜﻞ زﻳﺮ ﻛﺎﻧﻜﺘﻮر ﭘﻮرت ﺳـﺮﻳﺎل را ﻛـﻪ D9ﻧـﺎم دارد ﻣﻼﺣﻈﻪ ﻣﻲ ﻛﻨﻴﺪ:
- ١٠٥ -
P a g e | 106
www.eca.ir
در ﺟﺪول زﻳﺮ ﻋﻤﻠﻜﺮد ﻫﺮ ﭘﻴﻦ آورده ﺷﺪه اﺳﺖ:
ﻋﻤﻠﻜﺮد
Pin
آﻳﺎ ﻣﻮدم ﺑﻪ ﻳﻚ ﺧﻂ ﺗﻠﻔﻦ ﻣﺘﺼﻞ اﺳﺖ ؟
Carrier Detect
1
ﻛﺎﻣﭙﻴﻮﺗﺮ اﻃﻼﻋﺎت ارﺳﺎل ﺷﺪه ﺗﻮﺳﻂ ﻣﻮدم را درﻳﺎﻓﺖ ﻣﻲ ﻧﻤﺎﻳﺪ.
Receive Data
2
ﻛﺎﻣﭙﻴﻮﺗﺮ اﻃﻼﻋﺎﺗﻲ را ﺑﺮاي ﻣﻮدم ارﺳﺎل ﻣﻲ دارد.
Transmit Data
3
Data Terminal Ready
4
زﻣﻴﻦ ﺳﻴﮕﻨﺎل
Signal Ground
5
ﻣﻮدم آﻣﺎدﮔﻲ ﺧﻮد را ﺑﺮاي ارﺗﺒﺎط ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ اﻋﻼم ﻣﻲ دارد.
Data Set Ready
6
ﻛﺎﻣﭙﻴﻮﺗﺮ از ﻣﻮدم در راﺑﻄﻪ ﺑﺎ ارﺳﺎل اﻃﻼﻋﺎت ﺳﻮال ﻣﻲ ﻧﻤﺎﻳﺪ.
Request To Send
7
ﻣﻮدم ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ اﻋﻼم ﻣﻲ ﻧﻤﺎﻳﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ اﻃﻼﻋﺎﺗﻲ را ارﺳﺎل دارد.
Clear To Send
8
زﻧﮓ ﺗﻠﻔﻦ ﺗﺸﺨﻴﺺ داده ﺧﻮاﻫﺪ ﺷﺪ.
Ring Indicator
9
ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻪ ﻣﻮدم آﻣﺎدﮔﻲ ﺧﻮد را ﺑﺮاي ارﺗﺒﺎط اﻋﻼم ﻣﻲ دارد.
ﺳﻄﺢ ﺳﻴﮕﻨﺎل: در اﺳﺘﺎﻧﺪارد RS-232ﺳﻄﺢ وﻟﺘﺎژ +3ﺗﺎ +12ﻧﻤﺎﻳﺎﻧﮕﺮ وﺿﻌﻴﺖ Spaceﻳﺎ ﺻﻔﺮ ﻣﻨﻄﻘﻲ و ﺑﺎزه ي -3ﺗﺎ -12وﻟﺖ ﻧﻤﺎﻳﺸﮕﺮ وﺿﻌﻴﺖ Markﻳﺎ ﻳﻚ ﻣﻨﻄﻘﻲ ﻣﻲ ﺑﺎﺷﺪ:
- ١٠٦ -
P a g e | 107
www.eca.ir
اﮔﺮﭼﻪ ﺗﺠﻬﻴﺰات اﺳﺘﺎﻧﺪارد TTLﺑﺎ ﺳﻄﻮح ﻣﻨﻄﻘﻲ 0و 5وﻟﺖ ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ اﻣـﺎ ﻗﺎﻟـﺐ اﻃﻼﻋـﺎت ارﺳـﺎﻟﻲ ﺗﻔـﺎوﺗﻲ ﻧﺪارد و ﺑﺎ ﻳﻚ ﻣﺪار ﺗﻐﻴﻴﺮ ﺳﻄﺢ وﻟﺘﺎژ PC ،ﻣﻲ ﺗﻮاﻧﺪ ﺑـﺎ ادوات TTLارﺗﺒـﺎط ﺑﺮﻗـﺮار ﻧﻤﺎﻳـﺪ .ﻳﻜـﻲ از ﻣﺒـﺪل ﻫـﺎي ﻣﺘﺪاول ﺳﻄﺢ RS-232ﺑﻪ TTLﻣﺪار ﻣﺠﺘﻤﻊ MAX232و ﻳﺎ HIN232ﻣﻲ ﺑﺎﺷﺪ MAX232 .ﻳﻚ ﺗﺮاﺷـﻪ ي 16ﭘﺎﻳﻪ اﺳﺖ ﻛﻪ ﺷﺎﻣﻞ 2ﻓﺮﺳﺘﻨﺪه و 2ﻣﺒﺪل ﻣﺠﺰا اﺳﺖ .در زﻳﺮ ﻳﻚ ﻣﺪار ﻧﻤﻮﻧﻪ را ﺑﺮاي ﻛﺎر ﺑﺎ اﻳﻦ ICﻣﺸﺎﻫﺪه ﻣـﻲ ﻛﻨﻴﺪ:
- ١٠٧ -
P a g e | 108
www.eca.ir
ﻗﺎﻟﺐ اﻃﻼﻋﺎت: در ﻳﻚ Frameاﻃﻼﻋﺎﺗﻲ ﻛﻪ ﺗﻮﺳﻂ ﺑﻴﺖ ﺷﺮوع و ﺑﻴﺖ ﭘﺎﻳﺎن ﻣﺤﺼﻮر ﺷﺪه اﺳﺖ ﻣﻌﻤﻮﻻ 5ﺗﺎ 8ﺑﻴﺖ دﻳﺘـﺎ ﻗـﺮار ﻣـﻲ ﮔﻴﺮد و ﻳﻚ ﺑﻴﺖ ﺗﻮازن ﻧﻴﺰ ﺑﻪ ﺻﻮرت اﺧﺘﻴﺎري ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد .ﺑﻴﺖ ﺷﺮوع ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﺻﻔﺮ ﻣﻨﻄﻘﻲ اﺳﺖ و ﺑﻴﺖ ﭘﺎﻳﺎن )ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ 1ﻳﺎ 2ﺑﻴﺖ ﺑﺎﺷﺪ (.ﺗﻮﺳﻂ ﻳﻚ ﺷﻨﺎﺳﺎﻳﻲ ﻣﻲ ﺷﻮد .ﻣﺜﻼ در ﻧﻤﻮدار زﻣﺎﻧﻲ زﻳﺮ ﻳﻚ Frameﺷﺎﻣﻞ 10 ﺑﻴﺖ اﺳﺖ ﻛﻪ ﻫﻔﺖ ﺑﻴﺖ آن ﺷﺎﻣﻞ Dataﻳﻚ ﺑﻴﺖ آﻏﺎزﻳﻦ و ﻳﻚ ﺑﻴﺖ ﭘﺎﻳﺎﻧﻲ و ﻳﻚ ﺑﻴﺖ ﺗﻮازن ﻗﺒﻞ از ﺑﻴﺖ ﭘﺎﻳﺎن ﻣﻲ ﺑﺎﺷﺪ:
ﻋﻤﻠﻜﺮد USARTﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ AVR
ﻗﻄﻌﻪ ي ATmega16داراي ﻳﻚ ﻣﺎژول USARTﺑﻮده ﻛـﻪ از اﺳـﺘﺎﻧﺪارد RS-232در دو ﺣﺎﻟـﺖ آﺳـﻨﻜﺮون و ﺳﻨﻜﺮون ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﺪ .دﺳﺘﺮﺳﻲ ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل AVRاز ﻃﺮﻳـﻖ ﺳـﻪ ﭘـﻴﻦ RXD ،TXDو XCKﻛـﻪ ﺑـﻪ ﺗﺮﺗﻴﺐ ﭘﻴﻦ ارﺳﺎل ،درﻳﺎﻓﺖ وﻛﻼك ﻣﻲ ﺑﺎﺷﻨﺪ اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ) .ﭘﻴﻦ XCKﻓﻘﻂ در Modeﺳﻨﻜﺮون ﻛﺎرﺑﺮد دارد(. ﻗﺎﻟﺐ اﻃﻼﻋﺎت در USARTﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ AVRﻫﻤﺎﻧﻨﺪ UARTﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ ﺷﺎﻣﻞ ﻳﻚ ﺑﻴـﺖ ﺷـﺮوع، ﺑﻴﺖ ﻫﺎي داده ،ﺑﻴﺖ اﺧﺘﻴﺎري ﺗﻮازن و ﻳﻚ ﻳﺎ دو ﺑﻴﺖ ﭘﺎﻳﺎن اﺳﺖ ،ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ در AVRﻣﻲ ﺗﻮاﻧﺪ 5ﺗـﺎ 9ﺑﻴـﺖ
- ١٠٨ -
P a g e | 109
www.eca.ir
Dataﺗﻌﺮﻳﻒ ﺷﻮد .ﺑﻴﺖ ﺗـﻮازن ﻣـﻲ ﺗﻮاﻧـﺪ ﻓـﺮد ﻳـﺎ زوج ﺑﺎﺷـﺪ و از ﻃﺮﻳـﻖ ﺑﻴـﺖ ﻫـﺎي ] UPM[1:0از رﺟﻴﺴـﺘﺮ UCSRCﺗﻨﻈﻴﻢ ﻣﻲ ﺷﻮد. رﺟﻴﺴﺘﺮﻫﺎي USART .1
(UDR) USART Data Register
0
2
1
4
3
6
5
Bit
7
]RXB[7:0
)UDR (Read
]TXB[7:0
)UDR (Write
ﺑﺎﻓﺮ درﻳﺎﻓﺖ و ارﺳﺎل ﭘﻮرت ﺳﺮﻳﺎل داراي ﻳﻚ آدرس ﻣﺸﺘﺮك ﺑﻪ ﻧﺎم UDRدر ﻓﻀﺎي I/O Registersﻣﻲ ﺑﺎﺷﻨﺪ. ﺑﺎﻓﺮ ارﺳﺎل ،ﻣﻘﺼﺪ داده ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در رﺟﻴﺴﺘﺮ UDRﺑﻮده و ﺧﻮاﻧﺪن اﻳﻦ رﺟﻴﺴﺘﺮ ﻣﺤﺘﻮﻳـﺎت ﺑـﺎﻓﺮ درﻳﺎﻓـﺖ را ﺑﻪ دﺳﺖ ﻣﻲ دﻫﺪ .ﺗﻨﻬﺎ زﻣﺎﻧﻲ ﻣـﻲ ﺗـﻮان روي رﺟﻴﺴـﺘﺮ UDRﻣﻘـﺪاري را ﻧﻮﺷـﺖ ﻛـﻪ ﺑﻴـﺖ UDREاز رﺟﻴﺴـﺘﺮ UCSRAﻳﻚ ﺷﺪه ﺑﺎﺷﺪ و در ﻏﻴﺮ اﻳﻨﺼﻮرت دﻳﺘﺎي ارﺳﺎﻟﻲ ﺗﻮﺳﻂ USARTﻧﺎدﻳﺪه ﮔﺮﻓﺘﻪ ﻣـﻲ ﺷـﻮد .ﺑـﺎ ارﺳـﺎل اﻃﻼﻋﺎت ﺑﻪ ﺑﺎﻓﺮ ارﺳﺎل USARTدر ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴـﺖ TXENاز رﺟﻴﺴـﺘﺮ UCSRBﻳـﻚ ﺑﺎﺷـﺪ اﻃﻼﻋـﺎت در ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ﺑﺎرﮔﺬاري ﺷﺪه و ﺑﻴﺖ ﺑﻪ ﺑﻴﺖ از ﭘﻴﻦ TXDارﺳﺎل ﻣﻲ ﺷﻮد.
.٢
USART Control and Status Register A
0
1
2
3
4
5
6
7
RXC TXC UDRE FE DOR PE U2X MPCM
- ١٠٩ -
UCSRA ﻧﺎم ﺑﻴﺖ
P a g e | 110
www.eca.ir
:Multi-processor Communication Modeﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ را ﺑﻪ ﺣﺎﻟﺖ ارﺗﺒﺎﻃﺎت ﭼﻨﺪ ﭘﺮدازﻧﺪه اي ﻣﻲ ﺑﺮد. :Double the USART Transmission Speedﺑﺎ ﻳﻚ ﻛـﺮدن اﻳـﻦ ﺑﻴـﺖ در Modeآﺳـﻨﻜﺮون Baud Rateدو ﺑﺮاﺑﺮ ﺧﻮاﻫﺪ ﺷﺪ .در Modeﺳﻨﻜﺮون اﻳﻦ ﺑﻴﺖ ﺑﺎﻳﺪ ﺻﻔﺮ ﺑﺎﺷﺪ. :Parity Errorدر ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺗﻮﻟﻴﺪ ﺑﻴﺖ ﺗﻮازن از ﻃﺮﻳﻖ ﺑﻴﺖ ﻫﺎي ] ،UPM[1:0ﺑﺎ روي دادن ﺧﻄـﺎي ﺗﻮازن در ﺑﺎﻓﺮ درﻳﺎﻓﺖ ،اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻣﻲ ﺷﻮد. :Data Overrunﺑﺎ ﺑﺮوز Overrunاﻳﻦ ﺑﻴﺖ ﻳﻚ ﻣﻲ ﺷﻮد .ﺷﺮاﻳﻂ Overrunﻳﺎ ﻟﺒﺮﻳﺰ وﻗﺘـﻲ روي ﻣـﻲ دﻫـﺪ ﻛﻪ ﺑﺎﻓﺮ درﻳﺎﻓﺖ ﭘﺮ ﺑﺎﺷﺪ و ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ﻧﻴﺰ ﻣﺤﺘﻮي داده ي ﺟﺪﻳـﺪي ﺑﺎﺷـﺪ و داده ي ﺟﺪﻳـﺪي ﻧﻴـﺰ از راه ﺑﺮﺳـﺪ، ﻳﻌﻨﻲ ﻳﻚ ﺑﺎﻳﺖ در ﺑﺎﻓﺮ ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ﻣﻨﺘﻈﺮ ﺑﺎﺷﺪ و ﺑﻴﺖ ﺷﺮوع ﺟﺪﻳﺪي درﻳﺎﻓﺖ ﺷـﻮد .در اﻳـﻦ ﺣﺎﻟـﺖ اﻃﻼﻋـﺎت ﺟﺪﻳﺪ از ﺑﻴﻦ ﻣﻲ رود و ﺑﺎ ﻳﻚ ﺷﺪن ﺑﻴﺖ DORﺑﺮوز ﺧﻄﺎ اﻋﻼم ﻣﻲ ﺷﻮد. :Frame Errorاﮔﺮ در Frameدرﻳﺎﻓﺖ ﺷﺪه ﺑﻴﺖ ﭘﺎﻳﺎن ﺻﻔﺮ ﺑﺎﺷﺪ اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺷﺪه و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﺻﻔﺮ ﺧﻮاﻫﺪ ﺑﻮد. :USART Data Register Emptyﻳﻚ ﺑﻮدن اﻳﻦ ﭘﺮﭼﻢ ﻧﺸﺎن دﻫﻨﺪه ي اﻳﻦ اﺳﺖ ﻛﻪ اﻃﻼﻋـﺎت ﻣﻮﺟـﻮد در ﺑﺎﻓﺮ ارﺳﺎل ﺑﺮاي ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ارﺳﺎل ﺷﺪه و ﺑﺎﻓﺮ ارﺳﺎل آﻣﺎده ي درﻳﺎﻓﺖ ﻛﺎراﻛﺘﺮ ﺟﺪﻳﺪ اﺳﺖ .ﻫﻤﭽﻨﻴﻦ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ UDRIEاز رﺟﻴﺴﺘﺮ UCSRBﻳﻚ ﺑﺎﺷﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﺪه و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺑﻴﺖ UDREﻳـﻚ اﺳـﺖ ﺑﺎ ﺧﺎرج ﺷﺪن از ISRدوﺑﺎره آن را اﺟﺮا ﻣﻲ ﻛﻨﺪ ﺑﺎ ﻧﻮﺷﺘﻦ داده ي ﺟﺪﻳﺪ در UDRﭘـﺮﭼﻢ UDREﺻـﻔﺮ ﻣـﻲ ﺷﻮد .ﺑﻌﺪ از رﻳﺴﺖ ﺷﺪن ﻣﻴﻜﺮو اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻪ ﻣﻌﻨﺎي آﻣﺎده ﺑﻮدن درﻳﺎﻓﺖ ﻛﺎراﻛﺘﺮ ﺟﺪﻳﺪ اﺳﺖ.
- ١١٠ -
P a g e | 111
www.eca.ir
:USART Transmit Completeاﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻳﻚ ﻣﻲ ﺷﻮد ﻛﻪ ﺗﻤﺎم اﻃﻼﻋﺎت ﻣﻮﺟﻮد در ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ﺑﻪ ﺑﻴﺮون ﺷﻴﻔﺖ داده ﺷﺪه و داده ي ﺟﺪﻳﺪي در ﺑﺎﻓﺮ ارﺳﺎل وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ .ﺑﺎ ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ TXCIEاﻳﻦ ﭘﺮﭼﻢ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ي ﻛﺎﻣﻞ ﺷﺪن ارﺳﺎل ﺷﻮد و ﺑﺎ اﺟﺮاي ISRﺑﻴﺖ TXCﺗﻮﺳﻂ ﺳﺨﺖ اﻓﺰار ﭘﺎك ﺷﺪه و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي آن ،آن را ﭘﺎك ﻛﻨﺪ. :USART Receive Completeاﻳﻦ ﺑﻴﺖ ﺑﺎ ﻛﺎﻣﻞ ﺷﺪن درﻳﺎﻓﺖ ﻳﻚ Frameدر UDRﻳﻚ ﺷﺪه و ﭘﺲ از ﺧﻮاﻧﺪن UDRﺻﻔﺮ ﻣﻲ ﺷﻮد. .٣
USART Control and Status Register B
0
1
2
3
4
5
6
7
RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
UCSRB ﻧﺎم ﺑﻴﺖ
:Transmit Data Bit 8در ﺣﺎﻟﺘﻲ ﻛﻪ از ﭘﻮرت ﺳﺮﻳﺎل در 9 Modeﺑﻴﺘﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷـﻮد اﻳـﻦ ﺑﻴـﺖ ﻧﻬﻤـﻴﻦ ﺑﻴﺖ ﻛﺎراﻛﺘﺮ ارﺳﺎﻟﻲ ﺧﻮاﻫﺪ ﺑﻮد .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻗﺒﻞ از ﻧﻮﺷﺘﻦ در UDRﺑﺎﻳﺪ وﺿﻌﻴﺖ اﻳـﻦ ﺑﻴـﺖ را ﻣﺸـﺨﺺ ﻛﺮد. :Receive Data Bit 8در ﺣﺎﻟﺘﻲ ﻛﻪ از ﭘﻮرت ﺳﺮﻳﺎل در 9 Modeﺑﻴﺘﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد اﻳﻦ ﺑﻴﺖ ﻧﻬﻤﻴﻦ ﺑﻴـﺖ ﻛﺎراﻛﺘﺮ درﻳﺎﻓﺘﻲ ﺧﻮاﻫﺪ ﺑﻮد .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻗﺒﻞ از ﺧﻮاﻧﺪن UDRﺑﺎﻳﺪ اﻳﻦ ﺑﻴﺖ را ﺧﻮاﻧﺪ.
:Character Sizeﺑﺎ ﺗﺮﻛﻴﺐ اﻳﻦ ﺑﻴﺖ و ﺑﻴﺖ ﻫﺎي ] UCSZ[1:0در رﺟﻴﺴﺘﺮ UCSRCﺗﻌﺪاد ﺑﻴـﺖ ﻫـﺎي داده )اﻧﺪازه ي ﻛﺎراﻛﺘﺮ( را در ﻳﻚ Frameﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ. - ١١١ -
P a g e | 112
www.eca.ir
:Transmitter Enableﺑﺎ ﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﻋﻤﻠﻜﺮد ﻋﺎدي ﭘﻴﻦ TxDﺑﻪ ارﺳﺎل ﭘﻮرت ﺳـﺮﻳﺎل ﺗﻐﻴﻴـﺮ ﺣﺎﻟـﺖ داده و ﺑﻌﺪ از آن ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﻪ ﺻﻮرت I/Oﻣﻌﻤﻮﻟﻲ ﻧﻴﺴﺖ .ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن اﻳﻦ ﺑﻴﺖ در ﺣﺎﻟﻴﻜﻪ UARTﺳـﺮﻳﺎل ﻣﺸﻐﻮل اﺳﺖ ﺗﺎ اﺗﻤﺎم ارﺳﺎل اﻃﻼﻋﺎت ﺗﺎﺛﻴﺮ ﻧﺨﻮاﻫﺪ ﮔﺮﻓﺖ. :Receiver Enableﺑﺎ ﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﻋﻤﻠﻜﺮد ﻋﺎدي ﭘﻴﻦ RxDﺑﻪ درﻳﺎﻓﺖ ﭘﻮرت ﺳﺮﻳﺎل ﺗﻐﻴﻴﺮ ﺣﺎﻟـﺖ داده و ﺑﻌﺪ از آن ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﻪ ﺻﻮرت I/Oﻣﻌﻤﻮﻟﻲ ﻧﻴﺴﺖ .ﺑﺎ ﺻﻔﺮ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﺑﺎﻓﺮ ﭘـﻮرت ﺳـﺮﻳﺎل ﺧـﺎﻟﻲ ﺷـﺪه و ﻣﻘﺪار ﺑﻴﺖ ﻫﺎي FE ،DORو PEﻧﺎﻣﻌﺘﺒﺮ ﺧﻮاﻫﺪ ﺑﻮد. :USART Data Register Empty Interrupt Enableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴـﺖ ،در ﺻـﻮرﺗﻲ ﻛـﻪ ﺑﻴـﺖ ﻓﻌﺎل ﺳﺎز ﻛﻠﻲ وﻗﻔﻪ ﻫﺎ ) (Iﻳﻚ ﺑﺎﺷﺪ ،ﻓﻌﺎل ﺷﺪن ﭘﺮﭼﻢ ﺧﺎﻟﻲ ﺑﻮدن ﺑﺎﻓﺮ ارﺳﺎل ) (UDREﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋـﺚ اﻳﺠـﺎد وﻗﻔﻪ ﺷﻮد. :TX Complete Interrupt Enableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ،در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻛﻠﻲ وﻗﻔﻪ ﻫـﺎ )(I ﻳﻚ ﺑﺎﺷﺪ ،ﻓﻌﺎل ﺷﺪن ﭘﺮﭼﻢ اﺗﻤﺎم ارﺳﺎل ) (TXCﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد. :RX Complete Interrupt Enableﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ،در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻛﻠﻲ وﻗﻔﻪ ﻫـﺎ )(I ﻳﻚ ﺑﺎﺷﺪ ،ﻓﻌﺎل ﺷﺪن ﭘﺮﭼﻢ اﺗﻤﺎم ارﺳﺎل ) (RXCﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد. USART Control and Status Register C
.٤
0
1
2
4
3
5
6
7
URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
- ١١٢ -
UCSRC ﻧﺎم ﺑﻴﺖ
P a g e | 113
www.eca.ir
Áرﺟﻴﺴﺘﺮﻫﺎي UCSRCو UBRRHداراي آدرس ﻣﺸﺘﺮﻛﻲ در ﻓﻀﺎي I/Oﻫﺴﺘﻨﺪ ،ﻛﻪ ﺑﺮاي اﻧﺘﺨﺎب اﻳﻦ دو از ﺑﻴﺖ URSELاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.
:Clock Polarityاﻳﻦ ﺑﻴﺖ ﻓﻘﻂ در Modeﺳﻨﻜﺮون ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲ ﺷﻮد و در Modeآﺳﻨﻜﺮون ﺑﺎﻳﺪ روي آن ﺻﻔﺮ ﻧﻮﺷﺘﻪ ﺷﻮد .ﻋﻤﻠﻜﺮد اﻳﻦ ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﺳﺖ:
ﻧﻤﻮﻧﻪ ﺑﺮداري از داده ي درﻳﺎﻓﺘﻲ روي ﭘﻴﻦ RxDﺗﻐﻴﻴﺮ داده ي ارﺳﺎﻟﻲ روي ﭘﻴﻦ UCPOL TxD ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ XCK
ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ XCK
٠
ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ XCK
ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ XCK
١
] :Character Size[1:0اﻳﻦ ﺑﻴﺖ ﺑﻪ ﻫﻤﺮاه ﺑﻴﺖ UCSZ2ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﺪاد ﺑﻴﺖ ﻫﺎي ﻳﻚ ﻛﺎراﻛﺘﺮ را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ،در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض اﻳﻦ ﺑﻴﺖ ﻫﺎ اﻧﺪازه ي 8ﺑﻴﺖ را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ.
اﻧﺪازه ي ﻛﺎراﻛﺘﺮ
UCSZ0
UCSZ1
UCSZ2
5ﺑﻴﺖ
٠
٠
٠
6ﺑﻴﺖ
١
٠
٠
7ﺑﻴﺖ
٠
١
٠
8ﺑﻴﺖ
١
١
٠
رزرو ﺷﺪه
٠
٠
١
- ١١٣ -
P a g e | 114
www.eca.ir رزرو ﺷﺪه
١
٠
١
رزرو ﺷﺪه
٠
١
١
ﺣﺎﻟﺖ 9ﺑﻴﺘﻲ
١
١
١
:Stop Bit Selectاﻳﻦ ﺑﻴﺖ ،ﺗﻌﺪاد ﺑﻴﺖ ﻫﺎي ﭘﺎﻳﺎن را ﻣﻌﻴﻦ ﻣﻲ ﻛﻨﺪ .در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﻛﻪ اﻳﻦ ﺑﻴﺖ ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ ﻳﻚ ﺑﻴﺖ ﭘﺎﻳﺎن و در ﺻﻮرت 1ﺷﺪن 2ﺑﻴﺖ ﭘﺎﻳﺎن در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد.
] :Parity Mode[1:0اﻳﻦ دو ﺑﻴﺖ ﺗﻨﻈﻴﻤﺎت ﻣﺮﺑﻮط ﺑﻪ ﺑﻴﺖ ﺗﻮازن را ﻣﻄـﺎﺑﻖ ﺟـﺪول زﻳـﺮ اﻧﺠـﺎم ﻣـﻲ دﻫﻨـﺪ .در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﺗﻮازن ﻫﻤﺮاه ﻫﺮ Frameاﻳﻦ ﺑﻴﺖ اﻳﺠﺎد ﺷﺪه و در ﮔﻴﺮﻧﺪه ﺑﺮ ﺣﺴﺐ ﻫﻤـﺎن ﺗﻨﻈﻴﻤـﺎت )ﻛـﻪ ﺑﺎﻳﺪ در آﻧﺠﺎ ﻧﻴﺰ ﻣﻄﺎﺑﻖ ﺗﻨﻈﻴﻤﺎت ﻓﺮﺳﺘﻨﺪه اﻧﺠﺎم ﺷﻮد (.ﻣﻘﺪار ﺑﻴﺖ ﺗﻮازن ﺑﺎ ﻣﻘﺪار درﻳﺎﻓـﺖ ﺷـﺪه ﻣﻘﺎﻳﺴـﻪ ﺷـﺪه و در ﺻﻮرت ﺑﺮوز ﺧﻄﺎ ﭘﺮﭼﻢ PEاز رﺟﻴﺴﺘﺮ UCSRAﻳﻚ ﻣﻲ ﺷﻮد.
وﺿﻌﻴﺖ ﺑﻴﺖ ﺗﻮازن UPM1 UPM0 ﻏﻴﺮ ﻓﻌﺎل
0
0
رزرو ﺷﺪه
1
0
ﺗﻮازن زوج
0
1
- ١١٤ -
P a g e | 115
www.eca.ir
ﺗﻮازن ﻓﺮد
1
1
UMSEL :USART Mode Selectﺣﺎﻟﺖ ﻛﺎر UARTرا ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ .در ﺻﻮرﺗﻲ اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺑﺎﺷﺪ در ﺣﺎﻟﺖ آﺳﻨﻜﺮون و ﺑﺎ ﻳﻚ ﻛﺮدن آن در وﺿﻌﻴﺖ ﺳﻨﻜﺮون ﻛﺎر ﻣﻲ ﻛﻨﺪ.
:Register Selectﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ دو رﺟﻴﺴﺘﺮ UCSRCو UBRRHداراي آدرس ﻣﺸﺘﺮﻛﻲ )(0x40 ﻫﺴﺘﻨﺪ و اﻳﻦ ﺑﻴﺖ ﺑﺮاي اﻧﺘﺨﺎب ﻧﻮﺷﺘﻦ روي ﻳﻜﻲ از اﻳﻦ دو رﺟﻴﺴﺘﺮ ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ اﻳﻦ ﺻﻮرت ﻛﻪ اﮔﺮ ﺑﺨﻮاﻫﻴﻢ روي UCSRCﻣﻘﺪاري را ﺑﻨﻮﻳﺴﻴﻢ ﺑﺎﻳﺪ در ﻫﻤﺎن ﺑﺎﻳﺖ MSBﻳﻚ ﺑﺎﺷﺪ و ﭼﻨﺎﻧﭽﻪ ﺑﺨﻮاﻫﻴﻢ روي UBRRHﻣﻘﺪاري را ﺑﻨﻮﻳﺴﻴﻢ ﺑﺎﻳﺪ MSBﺻﻔﺮ ﺑﺎﺷﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل دﺳﺘﻮرات زﻳﺮ ﻣﻘﺪار ﺑﻴﺖ 1از ﻫﺮ رﺟﻴﺴﺘﺮ را ﻳﻚ ﻣﻲ ﻛﻨﺪ: ;UBRRH = 0x02 ;UCSRC = 0x82 روش ﺧﻮاﻧﺪن اﻳﻦ دو رﺟﻴﺴﺘﺮ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ در ﺻﻮرت ﺧﻮاﻧـﺪن ﻣﻘـﺪار آدرس 0x40و ﻳـﺎ ﻫـﺮ ﻳـﻚ از اﺳﺎﻣﻲ ﻣﺴﺘﻌﺎر اﻳﻦ آدرس ) UCSRCﻳﺎ (UBRRHﻣﻘﺪار رﺟﻴﺴﺘﺮ UBRRHﺑﻪ دﺳﺖ ﺧﻮاﻫﺪ آﻣﺪ: ;a = UBRRH ﭼﻨﺎﻧﭽﻪ ﺑﺨﻮاﻫﻴﻢ ﻣﻘﺪار رﺟﻴﺴﺘﺮ UCSRCرا ﺑﺪﺳﺖ آورﻳﻢ ﺑﺎﻳﺪ در ﺳﻴﻜﻞ ﻛﻼك ﺑﻌﺪي ﻣﻘﺪار ﺧﻮاﻧـﺪه ﺷـﺪه را ﺑـﻪ ﻋﻨﻮان ﻣﻘﺪار واﻗﻌﻲ UCSRCدر ﻧﻈﺮ ﺑﮕﻴﺮﻳﻢ ،ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل: ;b = UBRRH ;b = UCSRC 9
ﺑﻬﺘﺮ اﺳﺖ در ﺻﻮرت اﺳـﺘﻔﺎده از وﻗﻔـﻪ ،ﻗﺒـﻞ از ﭘﺮوﺳـﻪ ي ﺑـﺎﻻ ﺑﻴـﺖ ﻓﻌـﺎل ﺳـﺎز وﻗﻔـﻪ ﻫـﺎ را ﺑـﺎ دﺳـﺘﻮر )" #asm("cliﻏﻴﺮ ﻓﻌﺎل ﻛﻨﻴﻢ.
- ١١٥ -
P a g e | 116
www.eca.ir
9
ﺑﺎ ﺧﻮاﻧﺪن UBRRHﺑﻴﺖ URSELﺻﻔﺮ ﺧﻮاﻧﺪه ﺷﺪه و ﺑﺎ ﺧﻮاﻧﺪن UCSRCاﻳﻦ ﺑﻴﺖ ﻳﻚ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد.
.٥
USART Baud Rate Registers 0
1
2
3
]UBRR[11:8
4
5
6
7
Bit
-
-
-
URSEL
UBRRH UBRRL
]UBRR[7:0
:URSELﻫﻤﺎن ﻃﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﺮاي اﻧﺘﺨﺎب ﺑﻴﻦ UBRRHو UCSRCاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.
] :UBRRH[7:4ﺑﺮاي ﻛﺎرﺑﺮدﻫﺎي آﻳﻨﺪه رزرو ﺷﺪه ﻫﺴﺘﻨﺪ و ﺑﺮاي ﺳﺎزﮔﺎري ﺑﺎ ﻗﻄﻌﺎت آﺗﻲ ﺑﺎﻳﺪ روي آن ﻫﺎ ﺻﻔﺮ ﻧﻮﺷﺘﻪ ﺷﻮد.
] :UBRR[11:0اﻳﻦ دوازده ﺑﻴﺖ ﺑﺮاي ﺗﻌﻴﻴﻦ Baud Rateراﺑﻂ USARTﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .ﺑﻪ اﻳﻦ ﻣﻨﻈﻮر ﻣﻲ ﺗﻮان از رواﺑﻂ زﻳﺮ اﺳﺘﻔﺎده ﻧﻤﻮد:
ﻣﺤﺎﺳﺒﻪ UBRRاز روي Baud Rate
ﻣﺤﺎﺳﺒﻪ Baud Rateاز روي UBRR
f osc −1 16 × Baud
= UBRR
f osc )16 ( UBRR + 1
= Baud
f osc −1 8 × Baud
= UBRR
f osc )8( UBRR + 1
= Baud
- ١١٦ -
Modeﻛﺎري آﺳﻨﻜﺮون )(U2X=0 آﺳﻨﻜﺮون ﺑﺎ ﺳﺮﻋﺖ دوﺑﺮاﺑﺮ )(U2X=1
P a g e | 117
www.eca.ir
f osc −1 2 × Baud
= UBRR
f osc = Baud )2( UBRR + 1
ﻋﻤﻠﻜﺮد ﺳﻨﻜﺮون
ﻣﻘﺪار ﺧﻄﺎي ﺑﻮﺟﻮد آﻣﺪه از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ: BaudRate ClosestMatch − 1) ×100% BaudRate
( = ]Error[%
ﻣﺜﺎل :1ﺑﺎ ﻛﻼك 8ﻣﮕﺎﻫﺮﺗﺰ و Baud Rate = 2400در Modeآﺳﻨﻜﺮون ﻋﺎدي ،ﻣﻘﺪار UBRRرا ﺑﺪﺳﺖ آورﻳﺪ.
8000000 − 1 = 207.33 ⇒ UBRR = 207 16 × 2400
= UBRR
8000000 = 2404 )16(207 + 1
= BaudRate
2404 − 1) × 100% = 0.2% 2400
( = ]Error[%
ﺑﺮاي ﺻﻔﺮ ﺷﺪن ﺧﻄﺎ ﻣﻲ ﺗﻮان از ﻛﺮﺳﻴﺘﺎل 7.3728ﻣﮕﺎﻫﺮﺗﺰ اﺳﺘﻔﺎده ﻧﻤﻮد اﮔﺮﭼﻪ ﺣﺪاﻛﺜﺮ ﺧﻄﺎي ﻗﺎﺑﻞ ﻗﺒﻮل ﺑﺮاي اﻳﻦ وﺿﻌﻴﺖ 2درﺻﺪ ﻣﻲ ﺑﺎﺷﺪ.
9
ﻛﺮﻳﺴﺘﺎل ﻫﺎﻳﻲ ﻛﻪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از آن ﻫﺎ ﺑﻪ ﺧﻄﺎي Baud Rateﺻﻔﺮ رﺳﻴﺪ ،3,6864 ،1,8432 14,7456 ،11,0592 ،7,3728ﻣﻲ ﺑﺎﺷﻨﺪ.
9
ﻣﻘﺪار UBRRو ﺧﻄﺎﻫﺎي ﺣﺎﺻﻞ در ﻛﻠﻴﻪ ﺣﺎﻟﺖ ﻫﺎ در ﺻﻔﺤﺎت 166 -169از ﺑﺮﮔﻪ ي اﻃﻼﻋﺎﺗﻲ ATmega16ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ.
- ١١٧ -
P a g e | 118
www.eca.ir
ﺗﻮاﺑﻊ USARTدر CodeVision
اﻋﻼن اﻳﻦ ﺗﻮاﺑﻊ در ﻓﺎﻳﻞ stdio.hﻗﺮار دارد و ﻗﺒﻞ از اﺳﺘﻔﺎده از آن ﻫﺎ ﺑﺎﻳﺪ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ USARTاﻧﺠﺎم ﺷﻮد.
ﺗﺎﺑﻊ )( :getcharاﻳﻦ ﺗﺎﺑﻊ ﺑﻪ روش Pollingﻣﻨﺘﻈﺮ ﻣﻲ ﻣﺎﻧﺪ ﺗﺎ ﭘﺮﭼﻢ RXCﻳﻚ ﺷﺪه و ﺑﻌﺪ از آن ﻣﻘﺪار UDRرا ﻣﻲ ﺧﻮاﻧﺪ. ﺗﺎﺑﻊ )( :putcharاﻳﻦ ﺗﺎﺑﻊ ﺑﻪ روش Pollingﻣﻨﺘﻈﺮ ﻣﻲ ﻣﺎﻧﺪ ﺗـﺎ ﭘـﺮﭼﻢ UDREﻳـﻚ ﺷـﺪه و ﺑﻌـﺪ از آن ﻳـﻚ ﻛﺎراﻛﺘﺮ را در UDRﻛﭙﻲ ﻣﻲ ﻛﻨﺪ.
ﻣﺜﺎل) :2ﻣﻴﻜﺮو اول ﺑﻌﺪ از 3ﺛﺎﻧﻴﻪ ﻋﺪد 7را ﺑﺮاي ﻣﻴﻜﺮو دوم ارﺳﺎل ﻣﻲ ﻛﻨﺪ و در ﻣﺪت اﻳﻦ ﺳﻪ ﺛﺎﻧﻴﻪ ﻣﻴﻜـﺮو دوم ﺑـﻪ روش Pollingﻣﻨﺘﻈﺮ درﻳﺎﻓﺖ ﻳﻚ ﻛﺎراﻛﺘﺮ ﻣﻲ ﻣﺎﻧﺪ و ﭘﺲ از درﻳﺎﻓﺖ آن را در PORTAﻣﻲ رﻳﺰد(. ﺑﺮﻧﺎﻣﻪ ي ﻣﻴﻜﺮو اول: >#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 - ١١٨ -
P a g e | 119
www.eca.ir
UBRRL=0x33; // USART Baud rate: 9600
delay_ms(3000); putchar(7); while (1); } :ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو دوم #include <mega16.h> #include <stdio.h> #define xtal 8000000
void main(void) {
char a; DDRA=0xFF; PORTA=0xFF;
UCSRA=0x00; UCSRB=0x10; // USART Receiver: On UCSRC=0x86; //8 Data, 1 Stop, No Parity UBRRH=0x00; UBRRL=0x33; // USART Baud rate: 9600
a = getchar(); // Polling RXC PORTA = a; while (1);
- ١١٩ -
P a g e | 120
www.eca.ir
} ﺗﻮاﺑﻊ ﺳﻄﺢ ﺑﺎﻻي USARTﺗﻨﻬﺎ ﺑﺮاي ﺻﺮﻓﻪ ﺟﻮﻳﻲ در وﻗﺖ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ ﺑﺎﺷﻨﺪ .در ﺻﻮرت ﻧﻴـﺎز ﻣـﻲ ﺗـﻮان ﺑـﻪ ﺻﻮرت ﻣﺴﺘﻘﻴﻢ ﺑﺎ رﺟﻴﺴﺘﺮﻫﺎ ﻛﺎر ﻛﺮد .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﺣﻠﻘﻪ ي اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ي ﻣﻴﻜﺮو دوم را ﺑﻪ ﺻﻮرت زﻳﺮ ﻧﻴـﺰ ﻣـﻲ ﺗﻮان ﻧﻮﺷﺖ: ;))while(!(UCSRA&0x80 ;PORTA=UDR ;)while (1
ﺗﻮاﺑﻊ )( putsو )( :putsfاﻳﻦ ﺗﻮاﺑﻊ ﻳﻚ رﺷﺘﻪ را ﺗﻮﺳـﻂ USARTﺑـﻪ ﭘـﻮرت ﺳـﺮﻳﺎل ارﺳـﺎل ﻣـﻲ ﻛﻨﻨـﺪ .ﺗـﺎﺑﻊ )( putsرﺷﺘﻪ اي را ﻛﻪ در SRAMاﺳﺖ و ﺗﺎﺑﻊ )( putsfرﺷﺘﻪ اي را ﻛﻪ در Flashاﺳﺖ ﺑﻪ ﺧﺮوﺟﻲ ارﺳﺎل ﻣـﻲ ﻛﻨﺪ .اﺳﺎس ﺗﻤﺎم ﺗﻮاﺑﻊ ﺳﻄﺢ ﺑﺎﻻي USARTﺗﻮاﺑﻊ )( putcharو )( getcharﻣﻲ ﺑﺎﺷﻨﺪ و در اﻳﻨﺠﺎ ﻧﻴﺰ ﺑﺎ اﺳـﺘﻔﺎده از اﺷــﺎره ﮔــﺮ ،Yﻛﺎراﻛﺘﺮﻫــﺎ ﭘﺸــﺖ ﺳــﺮ ﻫــﻢ ﺑﻮﺳــﻴﻠﻪ ي اﻳــﻦ ﺗﻮاﺑــﻊ ﺑــﻪ رﺟﻴﺴــﺘﺮ UDRارﺳــﺎل ﻣــﻲ ﺷــﻮﻧﺪ.
9
اﻳﻦ ﺗﻮاﺑﻊ ﺑﻪ اﻧﺘﻬﺎي رﺷﺘﻪ ﻛﺎراﻛﺘﺮ (0x10) LFرا اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻨﺪ.
ﻣﺜﺎل) :3رﺷﺘﻪ ﻫﺎي " "Kavoshو " "AVRﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﺷﻮﻧﺪ(.
>#include <mega16.h >#include <delay.h >#include <stdio.h #define xtal 8000000 - ١٢٠ -
P a g e | 121
www.eca.ir
;"flash char string1[7]="Kavosh ;"char string2[7]="AVR )void main(void { ;UCSRA=0x00 UCSRB=0x08; // USART Transmitter: On UCSRC=0x86; //8 Data, 1 Stop, No Parity ;UBRRH=0x00 UBRRL=0x33; // USART Baud rate: 9600 ;)putsf(string1 ;)puts(string2 ;)while (1 } ﺗﺎﺑﻊ )( :getsاﻳﻦ ﺗﺎﺑﻊ داراي دو آرﮔﻮﻣﺎن ﻧﺎم ﻣﺘﻐﻴﺮ و ﻃﻮل اﺳﺖ ﻛﻪ ﻣﻨﺘﻈﺮ ﻣﻲ ﻣﺎﻧﺪ ﺗﺎ ﻛﺎراﻛﺘﺮﻫﺎي درﻳﺎﻓﺘﻲ ﺑﻪ اﻧﺪازه ي ﻃﻮل ﺷﺪه و ﺳﭙﺲ آن ﻫﺎ را داﺧﻞ ﻣﺘﻐﻴﺮ ﻣﻲ رﻳﺰد.
ﻣﺜﺎل ) :4ﻣﻴﻜﺮو اول ﺑﻌﺪ از 1ﺛﺎﻧﻴﻪ ﻋﺪد رﺷﺘﻪ ي Kavoshرا ﺑﺮاي ﻣﻴﻜﺮو دوم ارﺳﺎل ﻣﻲ ﻛﻨﺪ و در ﻣﺪت اﻳﻦ ﻳﻚ ﺛﺎﻧﻴﻪ ﻣﻴﻜﺮو دوم ﺑﻪ روش Pollingﻣﻨﺘﻈﺮ درﻳﺎﻓﺖ رﺷﺘﻪ ﻣﻲ ﻣﺎﻧﺪ و ﭘﺲ از درﻳﺎﻓﺖ آن را در LCDﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ(. ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو :1 >#include <mega16.h >#include <delay.h - ١٢١ -
P a g e | 122
www.eca.ir
#include <stdio.h> #define xtal 8000000
void main(void) {
UCSRA=0x00; UCSRB=0x08; // USART Transmitter: On UCSRC=0x86; //8 Data, 1 Stop, No Parity UBRRH=0x00; UBRRL=0x33; // USART Baud rate: 9600
delay_ms(1000); putsf(" Kavosh "); while (1); }
:2 ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو #include <mega16.h> #include <stdio.h> #include #define xtal 8000000
#asm .equ __lcd_port=0x1B ;PORTA #endasm
- ١٢٢ -
P a g e | 123
www.eca.ir
char a[10];
void main(void) {
UCSRA=0x00; UCSRB=0x10; // USART Receiver: On UCSRC=0x86; //8 Data, 1 Stop, No Parity UBRRH=0x00; UBRRL=0x33; // USART Baud rate: 9600
lcd_init(16); lcd_clear(); lcd_putsf("Waiting..."); gets(a,10); lcd_clear(); lcd_puts(a); while(1);
} ﻛﺎراﻛﺘﺮ ﻓﺮﻣﺖ ﻣﻲ ﺗﻮاﻧﺪ. اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ رﺷﺘﻪ ي ﻗﺎﻟﺐ ﺑﻨﺪي ﺷﺪه را ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﻛﻨﺪ:printf() ﺗﺎﺑﻊ :ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺑﺎﺷﺪ
ﻧﻮع اﻃﻼﻋﺎت
ﻛﺎراﻛﺘﺮ ﻓﺮﻣﺖ
- ١٢٣ -
P a g e | 124
www.eca.ir
%c
ﻳﻚ ﻛﺎراﻛﺘﺮ
%dو %i
ﻋﺪد ﺻﺤﻴﺢ ﻋﻼﻣﺘﺪار در ﻣﺒﻨﺎي 10
%eو %E
ﻋﺪد اﻋﺸﺎري ﺑﻪ ﺻﻮرت ﻧﻤﺎد ﻋﻠﻤﻲ
%f %s
ﻋﺪد اﻋﺸﺎري رﺷﺘﻪ ي ﺧﺘﻢ ﺷﺪه ﺑﻪ Nullواﻗﻊ در SRAM
%p
رﺷﺘﻪ ي ﺧﺘﻢ ﺷﺪه ﺑﻪ Nullواﻗﻊ در Flash
%u
ﻋﺪد ﺻﺤﻴﺢ ﺑﺪون ﻋﻼﻣﺖ در ﻣﺒﻨﺎي 10
%xو %X
ﻋﺪد ﺻﺤﻴﺢ ﺑﺪون ﻋﻼﻣﺖ در ﻣﺒﻨﺎي 16
%%
ﻛﺎراﻛﺘﺮ %
ﻣﺜﺎل ) :5ﻳﻚ رﺷﺘﻪ ي ﻗﺎﻟﺐ ﺑﻨﺪي ﺷﺪه را ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﻛﻨﺪ(.
>#include <mega16.h >#include <delay.h >#include <stdio.h #define xtal 8000000
;int a = 100 ;'char b = 'A ;float pi = 3.14
- ١٢٤ -
P a g e | 125
www.eca.ir
)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
;)printf("a=%d b=%c pi=%f",a,b,pi
;)while (1 } ﺗﺎﺑﻊ )( printfاﻳﻦ ﻗﺎﺑﻠﻴﺖ را دارد ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻃﻮل ﻣﻴﺪان و دﻗﺖ ﭘﺎراﻣﺘﺮ را ﺗﻌﻴﻴﻦ ﻛﻨﺪ ﻛﻪ اﻳﻦ اﻣﻜﺎن ﺑﻪ ﺻﻮرت %width.precisionﻗﺎﺑﻞ ﺗﻨﻈﻴﻢ ﻣﻲ ﺑﺎﺷﺪ width .ﻧﺸﺎن دﻫﻨﺪه ي ﻃﻮل ﻳﻚ ﻋﺪد اﺳﺖ ﻛﻪ در ﻣﻮرد اﻋﺪاد ﺻﺤﻴﺢ اﮔﺮ ﺑﻴﺸﺘﺮ از ﺗﻌﺪاد ارﻗﺎم ﺑﺎﺷﺪ ﺑﻪ اﻧﺪازه ي اﺿﺎﻓﻪ ﺟﺎي ﺧﺎﻟﻲ در ﺳﻤﺖ ﭼﭗ ﻋﺪد در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷـﻮد و ﭼﻨﺎﻧﭽـﻪ ﻋﺪد اﻋﺸﺎري ﺑﺎﺷﺪ اﻳﻦ ﻣﻘﺪار ﺑﻴﺎﻧﮕﺮ ﻗﺴﻤﺖ ﺻﺤﻴﺢ و " ".و ﻗﺴﻤﺖ اﻋﺸﺎري ﻣـﻲ ﺑﺎﺷـﺪ precision .ﻣﻘـﺪار دﻗـﺖ اﻋﺸﺎر را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل اﮔﺮ a = 3.145ﺑﺎﺷﺪ دﺳﺘﻮر زﻳﺮ a=3.14را ﭼﺎپ ﻣﻲ ﻛﻨﺪ. ;)printf("a=%4.2",a ﻣﺸﺨﺼﺎت ﺗﺎﺑﻊ )( printfدر ﻛﺎﻣﭙﺎﻳﻠﺮ CodeVisionرا ﻣﻲ ﺗﻮان از ﻃﺮﻳﻖ: Project/Configure/C Compiler/(s)printf Features ﺗﻌﻴﻴﻦ ﻧﻤﻮد.
- ١٢٥ -
P a g e | 126
www.eca.ir
ﺗﺎﺑﻊ )( :scanfﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﺗﺎﺑﻊ ﻣﻲ ﺗﻮاﻧﺪ ﻗﺎﻟﺐ اﻃﻼﻋﺎت درﻳﺎﻓﺘﻲ از ﭘﻮرت ﺳﺮﻳﺎل را ﺗﻌﻴﻴﻦ ﻧﻤﻮد .ﻃﺮز ﻛﺎر اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ: ;)ﻋﺒﺎرت دوم",ﻋﺒﺎرت اول"(scanf
ﻋﺒﺎرت دوم ﻧﺎم ﻣﺘﻐﻴﺮي اﺳﺖ ﻛﻪ رﺷﺘﻪ ي درﻳﺎﻓﺘﻲ در آن ﻗﺮار ﻣﻲ ﮔﻴﺮد و ﻋﺒﺎرت اول ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻗﺎﻟﺐ داده ي درﻳﺎﻓﺘﻲ ﺑﻪ ﭼﻪ ﺻﻮرت ﺑﺎﺷﺪ .ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻃﻮل رﺷﺘﻪ ي درﻳﺎﻓﺘﻲ 256ﻛﺎراﻛﺘﺮ اﺳﺖ اﻣﺎ ﺑـﺎ اﻓـﺰودن ﻃـﻮل ﻗﺒﻞ از ﻛﺎراﻛﺘﺮ ﻓﺮﻣﺖ ﻣﻲ ﺗﻮان آن را ﺑﻪ ﻣﻘﺪار دﻟﺨﻮاه ﻛﺎﻫﺶ داد .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل: )scanf("%10d",a 10ﻛﺎراﻛﺘﺮ را از ورودي ﺧﻮاﻧﺪه و در ﻣﺘﻐﻴﺮ aذﺧﻴﺮه ﻣﻲ ﻛﻨﺪ.
ﻣﺸﺨﺼﺎت ﺗﺎﺑﻊ )( scanfرا ﻫﻤﺎﻧﻨﺪ )( printfﻣﻲ ﺗﻮان از:
Project/Configure/C Compiler/(s)scanf Features ﺗﻨﻈﻴﻢ ﻧﻤﻮد.
ﺗﻮﺟﻪ :ﺗﻮاﺑﻊ )( printfو )( scanfﺣﺠﻢ زﻳﺎدي از ﺣﺎﻓﻈﻪ ي Flashرا ﻣﺼﺮف ﻛﺮده و ﺳﺮﻋﺖ اﺟﺮاي آن ﻫﺎ ﭘﺎﻳﻴﻦ اﺳﺖ ،ﺑﻨﺎﺑﺮاﻳﻦ ﺗﺎ ﺣﺪ اﻣﻜﺎن از آن ﻫﺎ اﺳﺘﻔﺎده ﻧﻜﺮده و در ﺻﻮرت ﻟﺰوم ﻣﺸﺨﺼﺎت آن ﻫﺎ را ﺑﻪ ﺳﺎده ﺗﺮﻳﻦ ﺣﺎﻟﺖ ) intو (int, widthﺗﻨﻈﻴﻢ ﻧﻤﺎﻳﻴﺪ.
- ١٢٦ -
P a g e | 127
www.eca.ir
اﺳﺘﻔﺎده از ﭘﻮرت ﺳﺮﻳﺎل در وﺿﻌﻴﺖ ﺳﻨﻜﺮون ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ UMSELاز رﺟﻴﺴﺘﺮ UCSRCﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ در اﻳﻦ ﺣﺎﻟﺖ ﻗﺮار ﻣﻲ ﮔﻴﺮد و اﺗﺼﺎﻻت ﺳﺨﺖ اﻓﺰاري ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
TxD
TxD
RxD
RxD
XCK
XCK
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي UCPOLﻣﻲ ﺗﻮان ﻟﺒﻪ ي ﻧﻤﻮﻧﻪ ﺑﺮداري و ﺗﻐﻴﻴﺮ ﺑﺮ اﺳﺎل ﻛﻼك را ﺗﻌﻴﻴﻦ ﻧﻤﻮد .ﻣﺴﺌﻠﻪ اي ﻛﻪ ﺑﺎﻳﺪ در Modeﺳﻨﻜﺮون رﻋﺎﻳﺖ ﺷﻮد اﻳﻦ اﺳﺖ ﻛﻪ داده ﺑﺎﻳﺪ در ﺧﻼف ﻟﺒـﻪ اي ﻛـﻪ در ﻓﺮﺳـﺘﻨﺪه ارﺳﺎل ﺷﺪه اﺳﺖ ،در ﮔﻴﺮﻧﺪه ﻧﻤﻮﻧﻪ ﺑﺮداري ﺷﻮد ﻳﻌﻨﻲ اﮔﺮ داده در ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ارﺳﺎل ﺷﺪه ﺑﺎﺷﺪ در ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه درﻳﺎﻓﺖ ﺷﻮد.
وﺿﻌﻴﺖ Multi-processor ﺑﺮاي اﻳﺠﺎد ﺷﺒﻜﻪ ﺑﻴﻦ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎ از اﻳﻦ Modeاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .ﻣﻌﻤﻮﻻ ﻳﻚ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺑﻪ ﻋﻨﻮان Masterو ﺑﻘﻴﻪ ﺑﻪ ﻋﻨﻮان Slaveاﻳﻔﺎي ﻧﻘﺶ ﻣﻲ ﻛﻨﻨﺪ.
- ١٢٧ -
P a g e | 128
www.eca.ir
TxD
RxD
Master MCU
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.eca.ir
* ﭘﺮوژه :12ﭘﻮرت ﺳﺮﻳﺎل در وﻳﮋوال ﺑﻴﺴﻴﻚ
ارﺗﺒﺎط ﺑﻴﻦ ﻛﺎﻣﭙﻴﻮﺗﺮ و PCﺑﻪ ﺻﻮرت Null-Modemﺑﻮده و ﻫﻤﺎﻧﻄﻮر ﻛﻪ اﺷﺎره ﺷﺪ ﺑﺮاي ﺗﻐﻴﻴﺮ ﺳﻄﺢ RS- 232ﺑﻪ TTLﻣﻄﺎﺑﻖ ﺷﻤﺎﺗﻴﻚ اﺑﺘﺪاي ﻓﺼﻞ از ﻣﺒﺪل MAX232اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.
ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﭘﻮرت ﻫﺎي COMدر وﻳﮋوال ﺑﻴﺴﻴﻚ ﻣﻲ ﺗﻮان از ﻛﻨﺘﺮل MSCommﻛﻪ ﻫﻤﺮاه ﻛﺎﻣﭙﺎﻳﻠﺮ وﺟﻮد دارد اﺳﺘﻔﺎده ﻧﻤﻮد .اﻳﻦ ﻛﻨﺘﺮل ،ارﺗﺒﺎط دﻫﻲ ﭘﻮرت ﺳﺮﻳﺎل را از ﻃﺮﻳﻖ ﻓﺎﻳﻞ mscomm32.ocxﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ .ﺑﺮاي آﺷﻨﺎﻳﻲ ﺑﺎ اﻳﻦ OCXﻣﺮاﺣﻞ زﻳﺮ را اﻧﺠﺎم دﻫﻴﺪ: .1
ﻳﻚ ﭘﺮوژه ي ﺟﺪﻳﺪ از ﻧﻮع Standard EXEﺑﺴﺎزﻳﺪ:
- ١٢٩ -
P a g e | 130
www.eca.ir
.2
از ﻃﺮﻳﻖ ﻣﻨﻮي اﺻﻠﻲ ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﮔﺰﻳﻨﻪ ي Projectﻣﻮرد Componentرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ و در ﻛﺎدر
ﺣﺎﺻﻞ ﮔﺰﻳﻨﻪ ي Microsoft Comm Control 6.0را ﻋﻼﻣﺖ زده و دﻛﻤﻪ ي OKرا ﻛﻠﻴﻚ ﻛﻨﻴﺪ.
.3
آﻳﻜﻮن ﻛﻨﺘﺮل MScommرا از Toolboxروي ﻓﺮم ﻗﺮار دﻫﻴﺪ:
- ١٣٠ -
P a g e | 131
www.eca.ir . ﻓﺮم ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ را وارد ﻛﻨﻴﺪLoad در روﻳﺪاد .6
Private Sub Form_Load() MSComm1.Settings = "9600,N,8,1" MSComm1.CommPort = 1 MSComm1.PortOpen = True MSComm1.Output = "Test" + Chr(16) End Sub ﺑﺪون ﺑﻴﺖ،Baud Rate=1200 ﺑﺎTest رﺷﺘﻪ ي. ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪF5 ﺑﺎ ﻓﺸﺮدن دﻛﻤﻪ ي
.٧
. ارﺳﺎل ﺧﻮاﻫﺪ ﺷﺪCOM1 ﺑﻴﺖ داده و ﻳﻚ ﺑﻴﺖ ﭘﺎﻳﺎن ﺑﻪ8 ،ﺗﻮازن
- ١٣١ -
P a g e | 132
www.eca.ir
ﭘﺮوژه :13ارﺗﺒﺎط دﻫﻲ USBﺑﺎ RS232
ﺷﻤﺎﺗﻴﻚ:
- ١٣٢ -
P a g e | 133
www.eca.ir
Packageﭼﻴﭗ FT232BMاز ﻧﻮع LQFPﺑﻮده و Pin outآن ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
ﭘﺲ از ﭘﻴﻜﺮﺑﻨﺪي ﺳﺨﺖ اﻓﺰاري ﻣﺪار ﻧﻴﺎز ﺑﻪ دراﻳﻮر دارد ﻛﻪ ﺗﻨﻈﻴﻢ آن در Win XPﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:
(1
دراﻳﻮر ﺳﺨﺖ اﻓﺰار را ﻣﻲ ﺗﻮاﻧﻴﺪ از آدرس زﻳﺮ درﻳﺎﻓﺖ ﻧﻤﺎﻳﻴﺪ:
http://www.ftdichip.com/Drivers/VCP.htm
(2
ﻓﺎﻳﻞ ﺑﺎرﮔﺬاري ﺷﺪه را در ﻳﻚ ﻣﺴﻴﺮ دﻟﺨﻮاه Unzipﻛﻨﻴﺪ) .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل(E:\CDM 2.00.00 :
- ١٣٣ -
P a g e | 134
www.eca.ir ﺳﺨﺖ اﻓﺰار ﺧﻮد را ﺑﻪ ﻳﻜـﻲ از ﻛﺎﻧﻜﺘﻮرﻫـﺎي USBوﺻـﻞ ﻛﻨﻴـﺪ .در اﻳـﻦ ﺣﺎﻟـﺖ ﭘﻴـﺎم Found New (3
Hardwareﻇﺎﻫﺮ ﺷﺪه و ﭘﺲ از آن ﻛﺎدر ﻣﺤﺎوره ي Found New Hardware Wizardﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﮔﺰﻳﻨﻪ ي دوم را اﻧﺘﺨﺎب ﻛﺮده و Nextرا ﻛﻠﻴﻚ ﻛﻨﻴﺪ.
(4
در ﻛﺎدر ﺣﺎﺻﻞ ﻣﺴﻴﺮ دراﻳﻮر را وارد ﻛﺮده و ﺑﺮ روي Nextﻛﻠﻴﻚ ﻧﻤﺎﻳﻴﺪ.
- ١٣٤ -
P a g e | 135
www.eca.ir
در ﺻﻮرﺗﻲ ﻛﻪ وﻳﻨﺪوز ﺑﻪ ﻧﺤﻮي ﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه ﺑﺎﺷـﺪ ﻛـﻪ در ﺻـﻮرت ﻧﺼـﺐ دراﻳﻮرﻫـﺎي آزﻣـﺎﻳﺶ ﻧﺸـﺪه ﺗﻮﺳـﻂ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ،ﭘﻴﻐﺎﻣﻲ داده ﺷﻮد اﺧﻄﺎر زﻳﺮ اﻳﺠﺎد ﺷﺪه و در اﻳﻦ ﺣﺎﻟﺖ ﺑﺎ ﭼﺸﻢ ﭘﻮﺷﻲ از اﺧﻄﺎر ﺑﺮ روي Continue Anywayﻛﻠﻴﻚ ﻛﻨﻴﺪ.
- ١٣٥ -
P a g e | 136
www.eca.ir
(5
ﻛﺎدر زﻳﺮ ﻧﻤﺎﻳﺶ داده ﺷﺪه و ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻛﻪ وﻳﻨﺪوز در ﺣﺎل ﻛﭙﻲ ﻧﻤﻮدن ﻓﺎﻳﻞ ﻫﺎي ﻣﻮرد ﻧﻴﺎز ﻣﻲ ﺑﺎﺷﺪ.
- ١٣٦ -
P a g e | 137
www.eca.ir وﻳﻨﺪوز ﭘﻴﺎﻣﻲ ﻣﺒﻨﻲ ﺑﺮ اﺗﻤﺎم ﻣﻮﻓﻘﻴﺖ آﻣﻴﺰ ﻧﺼﺐ ﺳﺨﺖ اﻓﺰار داده و ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي Finishاﻳﻦ ﭘﺮوﺳﻪ (6
ﺗﻤﺎم ﻣﻲ ﺷﻮد.
(7
) Device Managerدر ﻣﺴﻴﺮ Control Panel\Systemﺑﺮ روي زﺑﺎﻧﻪ ي (Hardwareرا ﺑﺎز ﻛﻨﻴـﺪ
و درﺧﺖ Portرا ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ] [+ﻛﻨﺎر آن ﺑﺴﻂ دﻫﻴﺪ .ﻣﻼﺣﻈﻪ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ COMﻣﺠﺎزي ﺑﺎ ﻧﺎم COMxﺑﻪ ﻟﻴﺴﺖ اﻓﺰوده ﺷﺪه اﺳﺖ .از اﻳﻦ ﭘﺲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻄﺎﺑﻖ ﭘﺮوژه ي 12اﻃﻼﻋﺎت را ﺑﻪ COMxارﺳﺎل ﻳﺎ درﻳﺎﻓﺖ ﻛـﺮده و اﻃﻼﻋﺎت ارﺳﺎل ﺷﺪه را در ﺧﺮوﺟﻲ ﻣﺪار درﻳﺎﻓﺖ ﻛﻨﻴﺪ.
- ١٣٧ -
P a g e | 138
www.eca.ir
- ١٣٨ -
P a g e | 139
www.eca.ir
(TWI) I2C Bus
اﺳﺘﺎﻧﺪارد I2Cدر اواﻳﻞ دﻫﻪ 1980ﺗﻮﺳﻂ ﺷﺮﻛﺖ Philipsﻃﺮاﺣﻲ ﺷﺪ .در اﺑﺘـﺪا اﻳـﻦ ﭘﺮوﺗﻜـﻞ ﺑـﻪ ﻣﻨﻈـﻮر اﻳﺠـﺎد روﺷﻲ ﺳﺎده ﺑﺮاي اﻳﺠﺎد ارﺗﺒﺎط ﭘﺮدازﻧﺪه ﺑﺎ ﺗﺮاﺷﻪ ﻫﺎي ﺟﺎﻧﺒﻲ در ﻳﻚ دﺳﺘﮕﺎه ﺗﻠﻮﻳﺰﻳﻮن اﺑﺪاع ﺷﺪ. I2Cﻃﺒﻖ ﺗﻌﺮﻳﻒ ﺷﺮﻛﺖ ﻓﻴﻠﻴﭙﺲ ﻣﺨﻔﻒ Inter-ICﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻴﺎﻧﮕﺮ ﻫﺪف آن ﻳﻌﻨﻲ ﻓـﺮاﻫﻢ آوردن ﻳـﻚ ﻟﻴﻨـﻚ ارﺗﺒﺎﻃﻲ ﺑﻴﻦ ﻣﺪارات ﻣﺠﺘﻤﻊ ﻣﻲ ﺑﺎﺷﺪ .اﻣﺮوزه اﻳﻦ ﭘﺮوﺗﻜﻞ ﺑﻪ ﺻـﻮرت ﻋﻤـﻮﻣﻲ در ﺻـﻨﻌﺖ ﭘﺬﻳﺮﻓﺘـﻪ ﺷـﺪه اﺳـﺖ و ﻛﺎرﺑﺮد آن از ﺳﻄﺢ ﺗﺠﻬﻴﺰات ﺻﻮﺗﻲ و ﺗﺼﻮﻳﺮي ﻧﻴﺰ ﻓﺮاﺗﺮ رﻓﺘﻪ اﺳﺖ .ﺑﻪ ﮔﻮﻧﻪ اي ﻛﻪ اﻣﺮوزه در ﺑـﻴﺶ از 1000ﻧـﻮع ICﻣﺨﺘﻠﻒ ﺑﻪ ﻛﺎر ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ I2C .ﻓﻀﺎ را ﺣﻔﻆ ﻣﻲ ﻛﻨﺪ و ﺑﺎﻋﺚ ﻛﺎﻫﺶ ﭼﺸﻤﮕﻴﺮ ﻫﺰﻳﻨﻪ ي ﻧﻬﺎﻳﻲ ﻣﻲ ﺷـﻮد. دو ﺧﻂ ارﺗﺒﺎﻃﻲ ﺑﻪ ﻣﻌﻨﻲ Trackﻫﺎي ﻣﺴﻲ ﻛﻤﺘﺮ و در ﻧﺘﻴﺠﻪ ﺑﺮد ﻣﺪار ﭼﺎﭘﻲ ﻛﻮﭼﻜﺘﺮ و ﺗﺴﺖ ﻋﻴﺐ ﻳﺎﺑﻲ ﺳـﺮﻳﻌﺘﺮ و راﺣﺘﺘﺮ ﻣﻲ ﺑﺎﺷﺪ .ﻋﻼوه ﺑﺮ اﻳﻦ در اﻏﻠﺐ ﻣﻮارد ﺣﺴﺎﺳﻴﺖ ﻣﺪار اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻧﺴﺒﺖ ﺑﻪ ﺗﺪاﺧﻞ اﻣـﻮاج اﻟﻜﺘﺮوﻣﻐﻨﺎﻃﻴﺴـﻲ و ﺗﺨﻠﻴﻪ ي اﻟﻜﺘﺮوﺳﺘﺎﺗﻴﻜﻲ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ.
ﺑﺮﺧﻲ از وﻳﮋﮔﻲ ﻫﺎي ﺑﺎس I2C
I2C .1ﻳﻚ ﭘﺮوﺗﻜﻞ ﺳﺮﻳﺎل ﺳﻨﻜﺮون ﻣﻲ ﺑﺎﺷﺪ و ﻛﻼك آن ﻣﻲ ﺗﻮاﻧﺪ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﺗﻐﻴﻴﺮ ﻛﻨﺪ. .2آدرس دﻫﻲ 7ﺑﻴﺘﻲ ) 127وﺳﻴﻠﻪ ي ﻣﺘﻔﺎوت ﺑﺮ روي ﺑﺎس( و ﻧﻴﺰ آدرس دﻫـﻲ 10ﺑﻴﺘـﻲ در وﻳـﺮاﻳﺶ ﺟﺪﻳـﺪ اﻳـﻦ اﺳﺘﺎﻧﺪارد ) 1024وﺳﻴﻠﻪ ﺑﺮ روي ﺑﺎس(.
- ١٣٩ -
P a g e | 140
www.eca.ir
.3ﺑﺎس ﺗﻨﻬﺎ ﺑﻪ دو ﺧﻂ SCLو SDAﻧﻴﺎز دارد .ﺑﺮ روي SCLﺗﻮﺳﻂ Masterﻛﻼك اﻳﺠﺎد ﻣـﻲ ﺷـﻮد و SDA ﺧﻂ Dataي دو ﻃﺮﻓﻪ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺟﻬﺖ آن ﺗﻮﺳﻂ Masterﻛﻨﺘﺮل ﻣﻲ ﺷﻮد. .4ﺑﺮ روي ﺑﺎس اﻃﻼﻋﺎت 8ﺑﻴﺘﻲ ﺑﻪ ﺻﻮرت دو ﺟﻬﺘﻪ ﺑﺎ ﻧﺮخ ارﺳﺎل ﺣﺪاﻛﺜﺮ 400ﻛﻴﻠﻮﺑﻴﺖ ﺑﺮ ﺛﺎﻧﻴـﻪ) .و 3,4ﻣﮕﺎﺑﻴـﺖ ﺑﺮ ﺛﺎﻧﻴﻪ در وﺿﻌﻴﺖ (High Speed .5ﺗﻮاﻧﺎﻳﻲ دراﻳﻮ ﻧﻤﻮدن ﺗﺎ 400ﭘﻴﻜﻮﻓﺎراد ﻇﺮﻓﻴﺖ ﺧﺎزﻧﻲ ﺗﺎ ﻓﺎﺻﻠﻪ ي ﺣﺪاﻛﺜﺮ 4ﻣﺘﺮ. .6ﺣﺬف Spikeﻫﺎي ﻧﺎﺧﻮاﺳﺘﻪ از ﺧﻂ SDAﺑﺎ اﺳﺘﻔﺎده از ﻓﻴﻠﺘﺮ ﻣﻮﺟﻮد در ﭼﻴﭗ ،ﺑـﻪ ﻃـﻮري ﻛـﻪ ﺳـﻴﮕﻨﺎل ﻫـﺎي ورودي ﻛﻪ ﻋﺮض آن ﻫﺎ ﻛﻤﺘﺮ از 50ﻧﺎﻧﻮﺛﺎﻧﻴﻪ ﺑﺎﺷﺪ ،ﺣﺬف ﻣﻲ ﺷﻮﻧﺪ. .7ﭘﻴﻦ ﻫﺎي SDAو SCLﻣﺠﻬﺰ ﺑﻪ ﻛﻨﺘﺮل ﻛﻨﻨﺪه ي Slew Rateﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻛﺎراﻳﻲ ﺑـﺎس I2Cرا در ﻓﺮﻛـﺎﻧﺲ ﻫﺎي ﺑﺎﻻ )ﻧﺰدﻳﻚ 400ﻛﻴﻠﻮﻫﺮﺗﺰ( ﺑﻬﺒﻮد ﻣﻲ ﺑﺨﺸﺪ .ﻋﻤﻠﻜﺮد ﻛﻨﺘﺮل ﻛﻨﻨﺪه ﺑﻪ اﻳـﻦ ﺻـﻮرت اﺳـﺖ ﻛـﻪ ﻟﺒـﻪ ﻫـﺎي ﺗﻴـﺰ ﺳﻴﮕﻨﺎل را ﺗﺎ ﺣﺪودي ﺻﺎف ﻛﺮده و در واﻗﻊ ﺑﺎ ﺣﺬف ﻫﺎرﻣﻮﻧﻴﻚ ﻫﺎي ﺑﺎﻻ ﺑﻪ ﻛﺎﻫﺶ EMIﻛﻤﻚ ﻣﻲ ﻛﻨﺪ. .8ﻋﺪم ﻧﻴﺎز ﺑﻪ ﻃﺮاﺣﻲ ﻣﺪار واﺳﻂ و راه اﻧﺪازي ﺑﺎس ﺗﻨﻬﺎ ﺑﺎ دو ﻣﻘﺎوﻣﺖ زﻳﺮا ﻛﻪ ﻣﺪار ﻛﻨﺘﺮل ﺑﺎس ﺑﻪ ﺻﻮرت ﻣﺠﺘﻤـﻊ ﺑﺮ روي وﺳﻴﻠﻪ ي I2Cﻗﺮار ﻣﻲ ﮔﻴﺮد.
اﺻﻄﻼﺣﺎﺗﻲ در اﻳﻦ اﺳﺘﺎﻧﺪارد
:Masterوﺳﻴﻠﻪ اي اﺳﺖ ﻛﻪ ﺷﺮوع ﻛﻨﻨﺪه ي ارﺳﺎل اﻃﻼﻋﺎت و ﺗﻮﻟﻴﺪ ﻛﻨﻨـﺪه ي ﭘـﺎﻟﺲ ﻛـﻼك و ﭘﺎﻳـﺎن دﻫﻨـﺪه ي ارﺳﺎل اﻃﻼﻋﺎت ﻣﻲ ﺑﺎﺷﺪ. :Slaveوﺳﻴﻠﻪ اي اﺳﺖ ﻛﻪ ﺗﻮﺳﻂ Masterآدرس دﻫﻲ ﺷﺪه اﺳﺖ. ﻓﺮﺳﺘﻨﺪه :وﺳﻴﻠﻪ اي ﻛﻪ اﻃﻼﻋﺎت را در ﺑﺎس داده ﻗﺮار ﻣﻲ دﻫﺪ. ﮔﻴﺮﻧﺪه :وﺳﻴﻠﻪ اي ﻛﻪ اﻃﻼﻋﺎت را از ﺑﺎس ﻣﻲ ﺧﻮاﻧﺪ.
- ١٤٠ -
P a g e | 141
www.eca.ir
:Arbitrationﻣﻜﺎﻧﻴﺴﻤﻲ ﻛﻪ اﻃﻤﻴﻨﺎن ﻣﻲ دﻫﺪ ﻛﻪ اﮔﺮ ﺑﻴﺶ از ﻳﻚ Masterﻫﻤﺰﻣﺎن ﺑﺨﻮاﻫﻨﺪ ﺑﺎس را ﺑﻪ ﻛﻨﺘﺮل ﺧﻮد درآورﻧﺪ ،ﺗﻨﻬﺎ ﻳﻜﻲ از آن ﻫﺎ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﻣﻮﻓﻖ ﺷﻮد.
ﺳﻄﻮح ﺳﻴﮕﻨﺎل در ﺑﺎس I2C
ﺑﻪ ﻃﻮر ﻛﻠﻲ دو ﺳﻄﺢ ﺳﻴﮕﻨﺎل در اﻳﻦ اﺳﺘﺎﻧﺪارد وﺟﻮد دارد:
Drive Low
- ١٤١ -
)Float High (Logic 1
1.
)Drive Low (Logic 0
2.
Float High
P a g e | 142
www.eca.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.eca.ir
وﻳﮋه اي ﻛﻪ ﺗﻮﺳﻂ ﺷﺮﻛﺖ ﻓﻴﻠﻴﭙﺲ اراﺋﻪ ﺷﺪه اﺳﺖ اﺳﺘﻔﺎده ﻧﻤﻮد .ﻛﺎﻫﺶ ﻣﻘﺎوﻣﺖ در ﺳـﻄﺢ Highﺑﻮﺳـﻴﻠﻪ ي ﻳـﻚ ﺳﻮﻳﻴﭻ ،ﺑﺎﻋﺚ ﺷﺎرژ ﺷﺮﻳﻊ ﺧﺎزن ﭘﺎرازﻳﺘﻲ ﺷﺪه و در ﻧﺘﻴﺠﻪ زﻣﺎن ﺻﻌﻮد و ﻧﺰول ﭘﺎﻟﺲ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ.
وﺿﻌﻴﺖ ﻫﺎي ﺑﺎس I2C
ﺑﺎس I2Cداراي ﺗﻌﺪادي وﺿﻌﻴﺖ ﻳﺎ ﻋﻨﺼﺮ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ وﺿﻌﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﭼﻪ زﻣﺎﻧﻲ ﻳﻚ اﻧﺘﻘﺎل آﻏﺎز ﺷﻮد ،ﺧﺎﺗﻤﻪ ﻳﺎﺑﺪ ،ﺗﺎﻳﻴﺪﻳﻪ ﮔﺮﻓﺘﻪ ﺷﻮد و ﻏﻴﺮه .ﺷﻤﺎي ﻛﻠﻲ اﻳﻦ ﻋﻨﺎﺻﺮ را در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ:
ACK/NACK
Data
Restart
Stop
Start
ﺷﺮاﻳﻂ آﻏﺎز ﻳﺎ :Start Conditionاز زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز اﻳﺠﺎد ﻣﻲ ﺷﻮد ﺗﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ،ﺑﺎس Busyﻣﺤﺴﻮب ﻣﻲ ﺷﻮد .ﻧﻤﻮدار زﻣﺎﻧﻲ اﻳﺠﺎد اﻳﻦ وﺿﻌﻴﺖ ﺑﻪ اﻳﻦ ﺻﻮرت ﻣﻲ ﺑﺎﺷﺪ:
- ١٤٣ -
P a g e | 144
www.eca.ir
ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ :Stop Conditionﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎس آزاد ﺷﺪه و ﻣﻲ ﺗﻮاﻧﺪ ﺗﻮﺳﻂ ﻳﻚ Device دﻳﮕﺮ ﺣﺎﻟﺖ آﻏﺎز دﻳﮕﺮي اﻳﺠﺎد ﺷﻮد:
ﺷﺮاﻳﻂ ﺷﺮوع ﻣﺠﺪد ﻳﺎ :Restart Conditionاﻳﻦ وﺿﻌﻴﺖ زﻣﺎﻧﻲ ﻛﺎرﺑﺮد دارد ﻛﻪ وﺳﻴﻠﻪ ﺑﺨﻮاﻫﺪ ﺑﺪون از دﺳﺖ دادن ﻛﻨﺘﺮل ﺑﺎس ،ﺷﺮاﻳﻂ آﻏﺎز دﻳﮕﺮي اﻳﺠﺎد ﻛﻨﺪ و ارﺗﺒﺎط ﺑﺎ Slaveدﻳﮕﺮي را آﻏﺎز ﻛﻨﺪ .ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد ﭼﻴﺰي ﺟﺰ ﻳﻚ ﺳﮕﻨﺎل ﺷﺮوع ﻛﻪ ﺑﻌﺪ از ﺳﻴﮕﻨﺎل ﭘﺎﻳﺎن آﻣﺪه اﺳﺖ ﻧﻤﻲ ﺑﺎﺷﺪ:
- ١٤٤ -
P a g e | 145
www.eca.ir
وﺿﻌﻴﺖ :Dataدر اﻳﻦ ﺣﺎﻟﺖ 8ﺑﻴﺖ اﻃﻼﻋﺎت ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد و ﻫﺮ ﺑﻴﺖ ﺑﺎ ﻳﻚ ﻛﻼك ﻫﻤﺮاﻫﻲ ﻣﻲ ﺷﻮد .ﺧﻂ SDAدر ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﻛﻼك ﻣﻮﺟﻮد در SCLﻧﻤﻮﻧﻪ ﺑﺮداري ﻣﻲ ﺷﻮد و ﻣﻘﺪار ﺻﻔﺮ ﻳﺎ ﻳﻚ ﻣﻨﻄﻘﻲ از SDA ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد .ﺑﻪ ﻣﻨﻈﻮر اﻳﻨﻜﻪ ﻣﻘﺪار ﺧﻮاﻧﺪه ﺷﺪه از SDAﻣﻌﺘﺒﺮ ﺑﺎﺷﺪ ﺑﺎﻳﺪ ﻣﻘﺪار SDAدر ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي SCLﺗﻐﻴﻴﺮ ﻧﻜﻨﺪ و ﺑﻪ ﻃﻮر ﻛﻠﻲ وﺿﻌﻴﺖ ﺧﻂ SDAﺗﻨﻬﺎ در ﺣﺎﻟﺘﻲ ﻛﻪ SCLﺻﻔﺮ اﺳﺖ ﻣﺠﺎز ﺑﻪ ﺗﻐﻴﻴﺮ اﺳﺖ ،ﺗﻨﻬﺎ اﺳﺘﺜﻨﺎ اﻳﻦ ﻗﻀﻴﻪ ﺷﺮاﻳﻂ آﻏﺎز و ﭘﺎﻳﺎن اﺳﺖ.
وﺿﻌﻴﺖ :ACK/NACKوﺳﻴﻠﻪ ي ﮔﻴﺮﻧﺪه ﭘﺲ از درﻳﺎﻓﺖ 8ﺑﻴﺖ داده در ﺳﻴﻜﻞ ﻧﻬﻢ ﻛﻼك ﺑﺎ زﻣﻴﻦ ﻛﺮدن ﺧﻂ SDAﺑﻪ ﻓﺮﺳﺘﻨﺪه ﭘﺎﺳﺦ ﻳﺎ Acknowledgeﻣﻲ دﻫﺪ .ﻳﻚ ﻣﺎﻧﺪن ﺧﻂ SDAدر ﻛﻼك ﻧﻬﻢ ﻧﻮﻋﻲ ﻋﺪم ﺗﺼﺪﻳﻖ Passiveﻣﻲ ﺑﺎﺷﺪ ﭼﺮا ﻛﻪ ﻣﻘﺎوﻣﺖ Pull-upﺧﻂ داده را ﻳﻚ ﻧﮕﺎه ﻣﻲ دارد.
- ١٤٥ -
P a g e | 146
www.eca.ir
ﻗﺎﻟﺐ آدرس 7ﺑﻴﺘﻲ ﭘﺲ از ﻫﺮ ﺷﺮاﻳﻂ آﻏﺎز 7ﺑﻴﺖ آدرس وﺳﻴﻠﻪ ي ﻣﻘﺼﺪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻌﺪ از ﺑﻴﺖ ﻫﻔﺘﻢ ﻳـﻚ ﺑﻴـﺖ ﺧﻮاﻧـﺪن ﻳـﺎ ﻧﻮﺷﺘﻦ وﺟﻮد دارد .ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ Masterﻗﺼﺪ ﻧﻮﺷﺘﻦ روي وﺳﻴﻠﻪ را دارد و ﻳﻚ ﺑﻮدن آن ﻧﺸﺎن دﻫﻨﺪه ي ﺧﻮاﻧﺪن از وﺳﻴﻠﻪ ي ﻣﻘﺼﺪ ﻣﻲ ﺑﺎﺷﺪ.
ﺑﻪ ﻃﻮر ﻛﻠﻲ وﺳﺎﻳﻞ I2Cداراي ﻳﻚ آدرس 7ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ اﻣﻜﺎن آدرس دﻫﻲ 128وﺳﻴﻠﻪ ي ﻣﺨﺘﻠﻒ را ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ .از اﻳﻦ ﺗﻌﺪاد 16آدرس رزرو ﺷﺪه ﻣﻲ ﺑﺎﺷﻨﺪ و در ﻧﺘﻴﺠﻪ ﺣﺪاﻛﺜﺮ 112وﺳﻴﻠﻪ ﺑﺮ روي ﻳﻚ ﺑﺎس ﻗﺎﺑﻞ آدرس دﻫﻲ ﻫﺴﺘﻨﺪ .آدرس ﺻﻔﺮ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺑﻮده و ﭘﺲ از ارﺳﺎل اﻳﻦ آدرس ﺗﻤﺎم ﻣﻴﻜﺮوﻫﺎﻳﻲ ﻛﻪ ﺑﺎ زﻣﻴﻦ ﻛﺮدن SDAﺑﻪ Masterﭘﺎﺳﺦ دﻫﻨﺪ ،داده ي 8ﺑﻴﺘﻲ را درﻳﺎﻓﺖ ﺧﻮاﻫﻨﺪ ﻛﺮد .ﭘﻴﻐﺎﻣﻲ ﻛﻪ ﺑﺮاي ﻫﻤﻪ Slaveﻫﺎ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد Broadcastﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد .اﻳﻦ ﻣﻲ ﺗﻮاﻧﺪ ﭘﻴﻐﺎﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺗﻮﺳﻂ Masterﺑﻪ ﺗﻤﺎﻣﻲ Slaveﻫﺎ دﺳﺘﻮر داده ﻣﻲ ﺷﻮد ﻛﻪ آن وﻇﻴﻔﻪ را اﻧﺠﺎم ﻣﻲ دﻫﻨﺪ. ﻋﻼوه ﺑﺮ ﻣﺤﺪودﻳﺖ 112آدرس ،ﺗﻌﺪاد وﺳﺎﻳﻞ ﻣﺠﺎز روي ﺑﺎس ﺑﻮﺳﻴﻠﻪ ي ﻇﺮﻓﻴﺖ ﺧﺎزﻧﻲ 400ﭘﻴﻜﻮﻓﺎراد ﻧﻴﺰ ﻣﺤﺪود ﻣﻲ ﺷﻮد.
- ١٤٦ -
P a g e | 147
www.eca.ir
ﻳﻚ اﻧﺘﻘﺎل ﺳﺎده
ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ Masterﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺧﻮاﻫﺪ اﻃﻼﻋﺎﺗﻲ را ﺑﻪ ﻳﻜﻲ از Slaveﻫﺎ ارﺳﺎل ﻛﻨﺪ:
در اﺑﺘﺪا ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻳﻚ وﺿﻌﻴﺖ ﺷﺮوع روي ﺑﺎس اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ،اﻳﻦ ﺳﻴﮕﻨﺎل ﻫﻤﻪ ي Slaveﻫﺎ را ﻣﺘﻮﺟﻪ ﺑﺎس ﻣﻲ ﻛﻨﺪ و ﭘﺲ از آن ،Masterآدرس Slaveاي را ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﺑﺎ آن ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﺪ را روي ﺑﺎس ﻣﻲ ﻓﺮﺳﺘﺪ و در ﺑﻴﺖ ﻫﺸﺘﻢ آن ﻣﺸﺨﺺ ﻣﻲ ﺳﺎزد ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ اﻃﻼﻋﺎت را از آن ﺑﺨﻮاﻧﺪ ﻳﺎ روي آن ﺑﻨﻮﻳﺴﺪ .ﺳﭙﺲ ﺗﻤﺎم Slaveﻫﺎ آدرس را درﻳﺎﻓﺖ ﻛﺮده و ﺑﺎ آدرس ﺧﻮد ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﻨﺪ و وﺳﻴﻠﻪ اي ﻛﻪ آدرس ﺑﻪ آن ﺗﻌﻠﻖ داﺷﺘﻪ ﺑﺎﺷﺪ ﺑﺎ زﻣﻴﻦ ﻛﺮدن SDAدر ﻛﻼك ﻧﻬﻢ ﻳﻚ ﺳﻴﮕﻨﺎل ACKاﻳﺠﺎد ﻛﺮده و ﺑﻪ Masterﭘﺎﺳﺦ ﻣﻲ دﻫﺪ .ﺑﻪ ﻣﺤﺾ درﻳﺎﻓﺖ ﺳﻴﮕﻨﺎل ﺗﺼﺪﻳﻖ ﺗﻮﺳﻂ Masterﺗﺒﺎدل اﻃﻼﻋﺎت ﺑﺎ Slaveآﻏﺎز ﺷﺪه و در ﻧﻬﺎﻳﺖ ،Masterﻳﻚ وﺿﻌﻴﺖ Stopاﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺑﻪ ﻣﻌﻨﻲ آزاد ﺷﺪن Busﻣﻲ ﺑﺎﺷﺪ.
- ١٤٧ -
P a g e | 148
www.eca.ir
درﮔﺎه TWIدر ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ AVR
واﺣﺪ ﺗﻮﻟﻴﺪ ﻧﺮخ ﺑﻴﺖ اﻳﻦ ﻣﺎژول دوره ي ﺗﻨﺎوب ﺧﻂ SCLرا در ﺣﺎﻟﺘﻲ ﻛﻪ ﺑﻪ ﺻﻮرت Masterﻋﻤﻞ ﻣﻲ ﻛﻨـﺪ ،ﻛﻨﺘـﺮل ﻣـﻲ ﻧﻤﺎﻳـﺪ .اﻳـﻦ ﻋﻤﻞ ﺑﻮﺳﻴﻠﻪ ي ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴﺘﺮ TWBRو ﺑﻴﺖ ﻫﺎي ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه در رﺟﻴﺴﺘﺮ TWSRاﻧﺠـﺎم ﻣـﻲ ﺷـﻮد. ﻋﻤﻠﻜﺮد Slaveﺑﺴﺘﮕﻲ ﺑﻪ ﺗﻨﻈﻴﻤﺎت ﻧﺮخ ﺑﻴﺖ و ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ﻧﺪارد اﻣﺎ ﻓﺮﻛﺎﻧﺲ CPUدر Slaveﺑﺎﻳﺪ ﺣﺪاﻗﻞ 16ﺑﺮاﺑﺮ ﻓﺮﻛﺎﻧﺲ SCLﺑﺎﺷﺪ ﻛﻪ از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:
CPU Clock Frequency 16 + 2(TWBR ) × 4TWPS
= f SCL
ﺗﻮﺟﻪ :در ﺣﺎﻟﺘﻲ ﻛﻪ TWIﺑﻪ ﺻﻮرت Masterﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ﺑﺎﻳﺪ ﻣﻘﺪار TWBRﺑﺰرﮔﺘﺮ و ﻳﺎ ﻣﺴﺎوي 10ﺑﺎﺷﺪ، در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻤﻜﻦ اﺳﺖ Masterﻛﻼك اﺷﺘﺒﺎه روي ﺧﻂ SCLﺗﻮﻟﻴﺪ ﻛﻨﺪ.
رﺟﻴﺴﺘﺮﻫﺎي TWI
ﺑﺨﺶ TWIداراي ﭘﻨﺞ رﺟﻴﺴﺘﺮ ﺑﻪ ﻧﺎم ﻫﺎي TWDR ،TWSR ،TWCR ،TWBRو TWARﻣﻲ ﺑﺎﺷﺪ.
- ١٤٨ -
P a g e | 149
www.eca.ir
:TWI Bit Rate Register
0
1
3
2
4
6
5
Bit
7
TWBR
]TWBR[7:0
اﻳﻦ رﺟﻴﺴﺘﺮ ﻓﺮﻛﺎﻧﺲ SCLرا ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ و ﻣﻘﺪار آن ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:
CPU Clock Frequency - 16 × f SCL 2 × f SCK × 4TWPS
= TWBR
ﻣﺜﺎل) :1ﺗﻌﻴﻴﻦ TWBRﺑﺎ ﻛﺮﻳﺴﺘﺎل 8ﻣﮕﺎﻫﺮﺗﺰ و ﻓﺮﻛﺎﻧﺲ SCKﺑﺮاﺑﺮ 100ﻛﻴﻠﻮﻫﺮﺗﺰ و (TWPS = 0
8000000 − 16 × 100000 = 32 2 × 100000 × 40
= TWBR
:TWI Control Register
0
1
2
3
4
5
6
7
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE
اﻳﻦ رﺟﻴﺴﺘﺮ وﻇﻴﻔﻪ ي ﻛﻨﺘﺮل TWIرا ﺑﺮ ﻋﻬﺪه دارد و ﻋﻤﻠﻜﺮد ﺑﻴﺖ ﻫﺎي آن ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:
- ١٤٩ -
TWCR ﻧﺎم ﺑﻴﺖ
P a g e | 150
www.eca.ir
:TWI Interrupt Enableﺑﺎ ﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤـﻮﻣﻲ وﻗﻔـﻪ ﻫـﺎ Setﺷـﺪه ﺑﺎﺷﺪ ،ﺑﺎ ﻓﻌﺎل ﺷﺪن ﭘﺮﭼﻢ TWINTﺑﺮﻧﺎﻣﻪ ﺑﻪ روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ ي TWIﭘﺮش ﺧﻮاﻫﺪ ﻛﺮد.
:TWI Enable Bitاﻳﻦ ﺑﻴﺖ TWIرا ﻓﻌﺎل ﻛﺮده و ﺑﺎ ﻳﻚ ﺷﺪن آن ،ﻣـﺎژول TWIﻛﻨﺘـﺮل ﭘـﻴﻦ ﻫـﺎي SCLو SDAرا ﺑﺮﻋﻬﺪه ﻣﻲ ﮔﻴﺮد .در اﻳﻦ ﺣﺎﻟﺖ واﺣﺪ ﻛﻨﺘﺮل Slew Rateو ﻓﻴﻠﺘﺮ ورودي ﻓﻌﺎل ﺷﺪه و ﺑﺎ ﺻﻔﺮ ﺷﺪن اﻳـﻦ ﺑﻴﺖ TWIﻏﻴﺮ ﻓﻌﺎل ﺷﺪه و ﻣﺠﺪدا ﺑﻪ ﺻﻮرت I/Oﻣﻌﻤﻮﻟﻲ در ﻣﻲ آﻳﺪ.
:TWI Write Collision Flagاﻳﻦ ﺑﻴﺖ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ زﻣـﺎﻧﻲ ﻳـﻚ ﻣـﻲ ﺷـﻮد ﻛـﻪ روي رﺟﻴﺴـﺘﺮ TWDR ﻣﻘﺪاري ﻧﻮﺷﺘﻪ ﺷﻮد و ﺑﻴﺖ TWINTﺻﻔﺮ ﺑﺎﺷﺪ .ﺑﺎ ﻧﻮﺷﺘﻦ روي رﺟﻴﺴﺘﺮ TWDRدر ﺷﺮاﻳﻄﻲ ﻛﻪ TWINTﻳﻚ ﺑﺎﺷﺪ ،اﻳﻦ ﭘﺮﭼﻢ ﭘﺎك ﻣﻲ ﺷﻮد.
:TWI STOP Condition Bitﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ در وﺿﻌﻴﺖ Masterﺑﺎﻋﺚ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن در ﺑﺎس I2Cﺧﻮاﻫﺪ ﺷﺪ و ﭘﺲ اﺟﺮا ﺷﺪن اﻳﻦ وﺿﻌﻴﺖ ﺑﻴﺖ TWSTOﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﭘﺎك ﺧﻮاﻫﺪ ﺷﺪ. در وﺿﻌﻴﺖ ،Slaveﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ وﺿﻌﻴﺖ ﭘﺎﻳﺎن اﻳﺠﺎد ﻧﺨﻮاﻫﺪ ﻛﺮد اﻣﺎ ﺧﻄﻮط SDAو SCLرﻫﺎ ﺷﺪه و ﺑﻪ ﺣﺎﻟﺖ ﺷﻨﺎور ﺑﺮ ﻣﻲ ﮔﺮدﻧﺪ ،ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮان از وﺿﻌﻴﺖ ﺧﻄﺎ ﺧﺎرج ﺷﺪ.
:TWI START Condition Bitﻧﺮم اﻓﺰار ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ ﺑﺎ ﻫﺪف Masterﺷﺪن ،اﻳﺠﺎد ﻳـﻚ ﺷﺮاﻳﻂ آﻏﺎز ﻣﻲ ﻛﻨﺪ .ﺳﺨﺖ اﻓﺰار ﺑﺎس را ﭼﻚ ﻛﺮده و در ﺻﻮرﺗﻲ ﻛﻪ آزاد ﺑﺎﺷﺪ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز ﻣﻲ ﻛﻨـﺪ ،در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﺎژول TWIﻣﻨﺘﻈﺮ ﺗﺸﺨﻴﺺ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن روي ﺑﺎس ﻣﻲ ﺷﻮد و ﭘﺲ از آن ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷـﺮاﻳﻂ آﻏﺎز ﻛﻨﺘﺮل ﺑﺎس را ﺑﻪ دﺳﺖ ﻣﻲ ﮔﻴﺮد .ﺑﻴﺖ TWSTAﺑﺎﻳﺪ ﺑﻌﺪ از اﻳﺠﺎد ﺷﺮاﻳﻂ آﻏﺎز ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﭘﺎك ﺷﻮد. - ١٥٠ -
P a g e | 151
www.eca.ir
TWEA :TWI Enable Acknowledge Bitاﻳﺠﺎد ﭘﺎﻟﺲ ﺗﺼﺪﻳﻖ ﻳﺎ Acknowledgeرا ﻛﻨﺘﺮل ﻣﻲ ﻛﻨـﺪ. اﮔﺮ روي اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻧﻮﺷﺘﻪ ﺷﻮد ﭘﺎﻟﺲ ACKدر ﺷﺮاﻳﻂ زﻳﺮ اﻳﺠﺎد ﻣﻲ ﺷﻮد:
.1
ﭘﺲ از اﻳﻨﻜﻪ Slaveآدرس ﻣﺮﺑﻮط ﺑﻪ ﺧﻮدش را درﻳﺎﻓﺖ ﻛﺮده ﺑﺎﺷﺪ.
.2
ﻣﺎداﻣﻴﻜﻪ ﺑﻴﺖ TWGCEدر TWARﻳﻚ ﺑﻮده و ﻳﻚ ﻓﺮاﺧﻮان ﻋﻤﻮﻣﻲ درﻳﺎﻓﺖ ﺷﺪه ﺑﺎﺷﺪ.
.3
ﻳﻚ ﺑﺎﻳﺖ داده در Masterﻳﺎ Slaveدرﻳﺎﻓﺖ ﺷﺪه ﺑﺎﺷﺪ.
:TWI Interrupt Flagاﻳﻦ ﺑﻴﺖ ﭘﺲ از اﺗﻤﺎم ﻫﺮ ﻳﻚ از وﻇﺎﻳﻒ TWIﻳﻚ ﺷﺪه و در ﺻـﻮرﺗﻲ ﻛـﻪ وﻗﻔـﻪ ي ﺳﺮاﺳﺮي و ﺑﻴﺖ TWIEﻳﻚ ﺑﺎﺷﻨﺪ ﺑﻪ ﺑﺮدار وﻗﻔﻪ ي TWIﭘﺮش ﻣـﻲ ﻛﻨـﺪ .اﻳـﻦ ﺑﻴـﺖ ﭘـﺲ از اﺟـﺮاي ISRﺑـﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﭘﺎك ﻧﻤﻲ ﺷﻮد و ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﭘﺎك ﺷﻮد. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﭘﺮﭼﻢ TWINTﻳﻚ ﺷﻮد ،ﻧﺮم اﻓﺰار ﺑﺎﻳﺪ ﻣﺤﺘﻮﻳﺎت ﺗﻤﺎم رﺟﻴﺴﺘﺮﻫﺎﻳﻲ را ﻛﻪ ﺑﺮاي وﻇﻴﻔﻪ ي ﺑﻌﺪي ﻧﻴـﺎز اﺳﺖ )ﻣﺜﻞ (TWDRﺗﻨﻈﻴﻢ ﻛﺮده و ﭘﺲ از آن ﻫﻤﺰﻣﺎن ﺑﺎ ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴـﺘﺮ ،TWCRﭘـﺮﭼﻢ TWINTرا ﭘـﺎك ﻛﻨﺪ ﺗﺎ ﻣﺎژول TWIﺷﺮوع ﺑﻪ اﻧﺠﺎم وﻇﻴﻔﻪ ي ﺑﻌﺪي ﻧﻤﺎﻳـﺪ .ﻣﺎداﻣﻴﻜـﻪ ﻛـﻪ ﭘـﺮﭼﻢ TWINTﻳـﻚ اﺳـﺖ SCLدر وﺿﻌﻴﺖ ﺻﻔﺮ ﺑﺎﻗﻲ ﻣﻲ ﻣﺎﻧﺪ و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﻧﺸﻮد TWIﻫﻴﭻ ﻋﻤﻠﻲ اﻧﺠﺎم ﻧﺨﻮاﻫﺪ داد.
:TWI Status Register
0
1
2
3
4
5
6
7
TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0
- ١٥١ -
TWSR ﻧﺎم ﺑﻴﺖ
P a g e | 152
www.eca.ir
] :TWI Prescaler Bits[1:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﻘﺪار ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:
ﻣﻘﺪار ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه
TWPS1 TWPS0
1
0
0
4
1
0
16
0
1
64
1
1
] :TWI Status[7:3اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻧﻤﺎﻳﺎﻧﮕﺮ وﺿﻌﻴﺖ TWIﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ در ﺑﺮرﺳﻲ Modeﻫﺎي ﻛﺎري ﻋﻤﻠﻜﺮد آن ﻫﺎ ﺑﺮرﺳﻲ ﺧﻮاﻫﺪ ﺷﺪ.
:TWI Data Register
0
1
2
3
4
]TWDR[7:0
5
6
7
Bit TWDR
در ﺣﺎﻟﺖ اﻧﺘﻘﺎل TWDR ،ﻣﺤﺘﻮي ﺑﺎﻳﺖ ﺑﻌﺪي اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ ارﺳﺎل ﺷﻮد و در ﺣﺎﻟﺖ درﻳﺎﻓﺖ ﺷﺎﻣﻞ آﺧﺮﻳﻦ ﺑﺎﻳﺖ درﻳﺎﻓﺘﻲ اﺳﺖ .اﻳﻦ رﺟﻴﺴﺘﺮ ﺗﻨﻬﺎ در ﺣﺎﻟﺘﻲ ﻛﻪ TWIدر ﺣﺎل اﻧﺘﻘﺎل اﻃﻼﻋﺎت ﻧﺒﺎﺷﺪ و ﭘﺮﭼﻢ TWINTﻳﻚ ﺷﺪه ﺑﺎﺷﺪ ،ﻗﺎﺑﻞ ﻧﻮﺷﺘﻦ اﺳﺖ. - ١٥٢ -
P a g e | 153
www.eca.ir
. ﻣﻲ ﺑﺎﺷﺪSR وST در وﺿﻌﻴﺖ ﻫﺎيSlave اﻳﻦ رﺟﻴﺴﺘﺮ آدرس:TWI (Slave) Address Register
TWAR ﻧﺎم ﺑﻴﺖ
7
6
5
4
3
2
1
0
TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE
ﻣﺮﺑﻮط ﺑﻪ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺑﻮده و ﺗﺸﺨﻴﺺ0x00 آدرس:TWI General Call Recognition Enable . ﻣﻲ ﺑﺎﺷﺪTWGCE آن ﺗﻮﺳﻂ ﺳﺨﺖ اﻓﺰار ﻣﻨﻮط ﺑﻪ ﻳﻚ ﺑﻮدن
. را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻨﺪSlave ﺑﻴﺖ آدرس7 اﻳﻦ:TWI (Slave) Address[7:1]
:ﻧﺎم ﮔﺬاري ﻫﺎي زﻳﺮ ﺑﻪ ﺻﻮرت ﻗﺮارداد در اداﻣﻪ اﺳﺘﻔﺎده ﺧﻮاﻫﻨﺪ ﺷﺪ S:
START condition
Rs:
REPEATED START condition
R:
Read bit (high level at SDA)
W:
Write bit (low level at SDA)
ACK:
Acknowledge bit (low level at SDA)
NACK: Not acknowledge bit (high level at SDA) Data:
8-bit data byte
P:
STOP condition
SLA:
Slave Address
- ١٥٣ -
P a g e | 154
www.eca.ir
Modeﻫﺎي ﻋﻤﻠﻜﺮد :TWI
)Master Transmitter (MT
1.
)Master Receiver (MR
2.
)Slave Transmitter (ST
3.
)Slave Receiver (SR
4.
(MT) Master Transmitter c در اﻳﻦ Modeاﺑﺘﺪا ﺗﻮﺳﻂ Masterﻳﻚ وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه و ﺑﻠﻮك آدرﺳﻲ ﻛﻪ در اداﻣﻪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷـﻮد ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ Masterﮔﻴﺮﻧﺪه ﻳﺎ ﻓﺮﺳﺘﻨﺪه اﺳﺖ .اﮔـﺮ ﭘـﺲ از اﻳﺠـﺎد ﺣﺎﻟـﺖ ﺷـﺮوع SLA+Wارﺳـﺎل ﮔـﺮدد Masterوارد ﺣﺎﻟﺖ ارﺳﺎل ﺷﺪه و در ﺻﻮرﺗﻲ ﻛﻪ SLA+Rارﺳﺎل ﺷﻮد وارد ﺣﺎﻟﺖ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮد. ﺷﺮاﻳﻂ آﻏﺎز ﺑﺎ ﻣﻘﺪار دﻫﻲ TWCRﺑﻪ ﺻﻮرت زﻳﺮ اﻳﺠﺎد ﻣﻲ ﮔﺮدد:
0
1
2
3
4
6
5
7
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE X
0
1
X
0
1
X
1
TWCR ﻧﺎم ﺑﻴﺖ ﻣﻘﺪار
TWIEﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ي TWIﺑﻮده و ﻣﻘﺪار آن اﺧﺘﻴﺎري ﻣﻲ ﺑﺎﺷﺪ. TWENﻓﻌﺎل ﺳﺎز TWIﺑﻮده و در ﻧﺘﻴﺠﻪ ﺑﺎﻳﺪ ﻣﻘﺪار ﻳﻚ داﺷﺘﻪ ﺑﺎﺷﺪ. TWWCﻛﻪ ﻳﻚ ﺑﻴﺖ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ در اﻳﻦ ﺣﺎﻟﺖ ﺻﻔﺮ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد زﻳﺮا ﻧﺮم اﻓﺰار ﻫﻨﻮز ﻣﻘـﺪاري را را روي TWDRﻧﻨﻮﻧﺸﺘﻪ اﺳﺖ و ﺑﻨﺎﺑﺮاﻳﻦ Collisionﻳﺎ ﺗﺼﺎدﻣﻲ ﻧﻴﺰ ﭘﻴﺶ ﻧﻴﺎﻣﺪه اﺳﺖ. TWSTOﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا در اﻳﻨﺠﺎ ﻧﻤﻲ ﺧﻮاﻫﻴﻢ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن اﻳﺠﺎد ﺷﻮد. - ١٥٤ -
P a g e | 155
www.eca.ir
TWSAﻳﻚ ﺑﻮده ﺗﺎ ﻣﺎژول TWIدر ﺻﻮرت آزاد ﺑﻮدن ﺑﺎس ،ﺷﺮاﻳﻂ آﻏـﺎز را اﻳﺠـﺎد ﻛـﺮده و در ﻏﻴـﺮ اﻳﻨﺼـﻮرت ﻣﻨﺘﻈﺮ ﺗﺸﺨﻴﺺ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎﺷﺪ. TWEAﻣﻘﺪاري ﺑﻲ اﻫﻤﻴﺖ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا ﺑﺎ ﻓﺮض Setﻛﺮدن آن در ﺷﺮاﻳﻂ آﻏﺎز ﻫﻴﭻ ﮔـﺎه ACKﻧﻴـﺎز ﻧﺒـﻮده و اﻳﺠﺎد ﻧﻴﺰ ﻧﻤﻲ ﺷﻮد. TWINTﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﭘﺎك ﻣﻲ ﺷﻮد ﺗﺎ TWIﺷﺮوع ﺑﻪ اﻧﺠﺎم ﻓﺮﻣﺎن داده ﺷﺪه ﺗﻮﺳﻂ رﺟﻴﺴﺘﺮ TWCRﻛﻨﺪ.
ﭘﺲ از اﺟﺮاي ﺗﻨﻈﻴﻤﺎت ﻓﻮق در ﺻـﻮرت آزاد ﺑـﻮدن ﺑـﺎس ﻣـﺎژول TWIﺷـﺮاﻳﻂ آﻏـﺎز را اﻳﺠـﺎد ﻛـﺮده و در ﻏﻴـﺮ اﻳﻨﺼﻮرت ﻣﻨﺘﻄﺮ آزاد ﺷﺪن ﺑﺎس ﺷﺪه و ﺑﻪ ﻣﺤﺾ ﺗﺸﺨﻴﺺ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻛﻨﺘﺮل ﺑﺎس را ﺑﻪ دﺳﺖ ﮔﺮﻓﺘﻪ و ﺷﺮاﻳﻂ آﻏﺎز را اﻳﺠﺎد ﻣﻲ ﻧﻤﺎﻳﺪ ،ﭘﺲ از آن ﭘﺮﭼﻢ TWINTﻳﻚ ﺷـﺪه و ﻛـﺪ وﺿـﻌﻴﺖ ﻣﻮﺟـﻮد در TWSRﺑﺮاﺑـﺮ 0x08 ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺮاي ورود ﺑﻪ وﺿﻌﻴﺖ MTﺑﺎﻳﺪ روي TWDRﻣﻘﺪار SLA+Wﻧﻮﺷﺘﻪ ﺷﺪه و ﭘﺲ از آن ﺑﺎ ﻧﻮﺷـﺘﻦ ﻳﻚ روي TWINTآن را ﭘﺎك ﻛﺮده ﺗـﺎ ﻣﺮﺣﻠـﻪ ي ﺑﻌـﺪ آﻏـﺎز ﺷـﻮد .ﭘـﺲ از ﻧﻮﺷـﺘﻦ SLA+Wروي TWDR ﺗﻨﻈﻴﻤﺎت TWCRﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
0
1
2
3
4
5
6
7
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE X
0
1
X
0
0
X
1
TWCR ﻧﺎم ﺑﻴﺖ ﻣﻘﺪار
ﺗﻔﺎوت ﺑﺎ ﻣﺮﺣﻠﻪ ي ﻗﺒﻞ اﻳﻦ اﺳﺖ ﻛﻪ از آﻧﺠﺎﻳﻲ ﻛﻪ ﻧﻴﺎز ﺑﻪ ﺷﺮاﻳﻂ آﻏﺎز وﺟﻮد ﻧﺪارد ﺑﻴﺖ TWSTAﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ. ﺑﺎ ﻓﺮﺳﺘﺎده ﺷﺪن SLA+Wو درﻳﺎﻓﺖ ACKﻣﺠﺪدا ﺑﻴﺖ TWINTﻳﻚ ﺷﺪه و در اﻳﻦ ﺷﺮاﻳﻂ ﻳﻜﻲ از ﭼﻨـﺪ ﻛـﺪ 0x18 ،0x20ﻳﺎ 0x38در TWSRﻗﺮار ﻣﻲ ﮔﻴﺮد .در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﻣﻘﺪار ﺑﺮاﺑﺮ 0x18ﺑﺎﺷﺪ ﺑﺪﻳﻦ ﻣﻌﻨﺎﺳﺖ ﻛﻪ آدرس ارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ .ﭘﺲ از اﻳﻦ ﺑﺎﻳﺪ ﺑﻠﻮك داده ارﺳﺎل ﺷﻮد .ﻫﻤﺎﻧﻨـﺪ ﺣﺎﻟـﺖ ﻗﺒـﻞ اﺑﺘـﺪا - ١٥٥ -
P a g e | 156
www.eca.ir
ﻣﻘﺪار ﻣﻮرد ﻧﻈﺮ در رﺟﻴﺴﺘﺮ TWDRﻧﻮﺷﺘﻪ ﺷﺪه و ﺑﺎ ﭘﺎك ﻛـﺮدن ﺑﻴـﺖ TWINTداده ي 8ﺑﻴﺘـﻲ ﺗﻮﺳـﻂ TWI ارﺳﺎل ﺧﻮاﻫﺪ ﺷﺪ .در ﺻﻮرﺗﻲ ﻛـﻪ رﺟﻴﺴـﺘﺮ TWDRﺑﻌـﺪ از ﭘـﺎك ﻛـﺮدن TWINTﻣﻘـﺪاردﻫﻲ ﺷـﻮد رﺟﻴﺴـﺘﺮ TWWCﻳﻚ ﺷﺪه و اﻋﻼم ﻳﻚ ﺣﺎﻟﺖ ﺗﺼﺎدم را ﻣﻲ ﻛﻨﺪ .ﺗﻨﻈﻴﻤﺎت TWCRﻫﻤﺎﻧﻨﺪ ﺣﺎﻟﺖ ﻗﺒﻞ ﺑـﻪ ﺻـﻮرت زﻳـﺮ ﺧﻮاﻫﺪ ﺑﻮد:
0
1
2
3
4
5
6
7
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE X
0
1
X
0
0
X
1
TWCR ﻧﺎم ﺑﻴﺖ ﻣﻘﺪار
اﻳﻦ ﻣﺮﺣﻠﻪ ﺗﺎ اﺗﻤﺎم ارﺳﺎل ﺗﻤﺎم ﺑﺎﻳﺖ ﻫﺎي داده ﺗﻜﺮار ﻣﻲ ﺷﻮد و ﺳﺮاﻧﺠﺎم ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ ﺷﺮوع ﻣﺠـﺪد ﭘﺎﻳﺎن ﻣﻲ ﻳﺎﺑﺪ .ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎ ﻣﻘﺪاردﻫﻲ رﺟﻴﺴﺘﺮ TWCRﺑﻪ ﺻﻮرت زﻳﺮ اﻳﺠﺎد ﻣﻲ ﺷﻮد:
0
1
2
3
4
5
6
7
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE X
0
1
X
1
0
X
1
TWCR ﻧﺎم ﺑﻴﺖ ﻣﻘﺪار
و ﺑﺮاي اﻳﺠﺎد ﺷﺮاﻳﻂ ﺷﺮوع ﻣﺠﺪد ﺟﺪول زﻳﺮ را ﺧﻮاﻫﻴﻢ داﺷﺖ:
0
1
2
3
4
5
6
7
TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE X
0
1
X
0 - ١٥٦ -
1
X
1
TWCR ﻧﺎم ﺑﻴﺖ ﻣﻘﺪار
P a g e | 157
www.eca.ir
9
ﭘﺲ از اﻳﺠﺎد ﺷﺮاﻳﻂ ﭘﺎﻳﺎن TWINT0ﻳﻚ ﻧﻤﻲ ﺷﻮد.
ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد ﻣﻘﺪار رﺟﻴﺴﺘﺮ TWSRﺑﺮاﺑﺮ 0x10ﺧﻮاﻫﺪ ﺑﻮد و اﻳﻦ ﻗﺎﺑﻠﻴﺖ ﺑﻪ Masterاﺟـﺎزه ﺗﻐﻴﻴﺮ Slaveرا ﺑﺪون از دﺳﺖ دادن ﻛﻨﺘﺮل ﺑﺎس ﻣﻲ دﻫﺪ.
ﻣﻘﺎدﻳﺮ رﺟﻴﺴﺘﺮ TWSRدر وﺿﻌﻴﺖ ﻫﺎي ﻣﺨﺘﻠﻒ ﺣﺎﻟﺖ Master Transmitterﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
وﺿﻌﻴﺖ ﺑﻌﺪي ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻮﺳﻴﻠﻪ ي TWIاﻧﺠﺎم ﺷﻮد ارﺳﺎل SLA+Wو درﻳﺎﻓﺖ ACKﻳﺎ NACK
ﻋﻤﻠﻜﺮد
ﻣﻘﺪار TWSR
وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه اﺳﺖ.
0x08
وﺿﻌﻴﺖ ﺷﺮوع دوﺑﺎره اﻳﺠﺎد ﺷﺪه اﺳﺖ.
0x10
ارﺳﺎل SLA+Wو درﻳﺎﻓﺖ ACKﻳﺎ NACK ارﺳﺎل SLA+Rو درﻳﺎﻓﺖ ACKﻳﺎ NACK ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
ﺑﺎﻳﺖ SLA+Wارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ.
0x18
اﻳﺠﺎد ﺣﺎﻟﺖ ﭘﺎﻳﺎن اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
ﺑﺎﻳﺖ SLA+Wارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﻧﺸﺪه اﺳﺖ.
0x20
اﻳﺠﺎد ﺣﺎﻟﺖ ﭘﺎﻳﺎن ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
ﺑﺎﻳﺖ داده ارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ.
0x28
اﻳﺠﺎد ﺣﺎﻟﺖ ﭘﺎﻳﺎن ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد
ﺑﺎﻳﺖ داده ارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﻧﺸﺪه اﺳﺖ.
0x30
اﻳﺠﺎد ﺣﺎﻟﺖ ﭘﺎﻳﺎن ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع و ﺗﻼش ﺑﺮاي ﻛﻨﺘﺮل ﻣﺠﺪد آن
ﻛﻨﺘﺮل ﺑﺎس از دﺳﺖ رﻓﺘﻪ اﺳﺖ.
- ١٥٧ -
0x38
P a g e | 158
www.eca.ir
( ﻛﻴﻠﻮﻫﺮﺗﺰ100 و ﺑﺎ ﻧﺮخ ﺑﻴﺖ0xA0 ﺑﺎ آدرسSlave ﺑﻪ0x77 )ارﺳﺎل ﻋﺪد:2ﻣﺜﺎل
#include <mega16.h> #define xtal 8000000 void main() { //--- Start Condition and Transmitting SLA+W ---TWBR = 32; // Bit rate = 100Khz TWCR = 0xA4; // Transmit Start Condition while(TWCR&0x80==0); // Waiting for TWINT flag if(TWSR&0xF8==0x08) // Start Condition Transmitted? { TWDR=0xA0; // SLA+W TWCR=0x84; // Enable TWI and Clear TWINT } else goto error; //--------------- Transmitting Data ------------while(TWCR&0x80==0); // Waiting for TWINT flag if(TWSR&0xF8==0x18) // SLA+W has been send with ACK? - ١٥٨ -
P a g e | 159
www.eca.ir
{ TWDR=0x77; // Data=0x77 TWCR=0x84; // Enable TWI and Clear TWINT } else goto error; //--------- Transmitting Stop Condition ---------while(TWCR&0x80==0); // Waiting for TWINT flag if(TWSR&0xF8==0x28) // Data has been send with ACK? TWCR=0x94; // Transmit Stop Condition //-----------------------------------------------error: while(1); }
(MR) Master Receiver d درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و ﺑﺮاي اﻳﺠﺎد آن ﺑﺎﻳﺪ ﭘﺲ از اﻳﺠﺎد ﺷـﺮاﻳﻂ آﻏـﺎزSlave اﻃﻼﻋﺎت را ازMaster در اﻳﻦ وﺿﻌﻴﺖ در ﺻﻮرﺗﻲ ﻛﻪ ﺷﺮاﻳﻂ آﻏﺎز ﺑﻪ درﺳـﺘﻲ اﻳﺠـﺎد ﺷـﺪه ﺑﺎﺷـﺪ. ﻓﺮﺳﺘﺎده ﺷﻮدSlave ﺑﻪSLA+R ﺑﺮ ﺧﻼف ﺣﺎﻟﺖ ﻗﺒﻞ ﺑﺎﻳـﺪ ﻣﻘـﺪار آن را درSLA+R ﺑـﺮاي ارﺳـﺎل، ﻣﻲ ﺷـﻮد0x08 ﺑﺮاﺑﺮTWSR ﻳﻚ ﺷﺪه و ﻣﻘﺪارTWINT ﺑﻴﺖ . آن را ارﺳﺎل ﻧﻤﻮدTWINT ﺑﺎرﮔﺬاري ﻛﺮده و ﺑﺎ ﭘﺎك ﻛﺮدنTWDR
- ١٥٩ -
P a g e | 160
www.eca.ir
زﻣﺎﻧﻲ ﻛﻪ SLA+Rﻓﺮﺳﺘﺎده ﺷﻮد و ACKدرﻳﺎﻓﺖ ﺷﻮد ﺑﻴـﺖ TWINTﻳـﻚ ﺷـﺪه و در اﻳـﻦ ﺷـﺮاﻳﻂ ﻳﻜـﻲ از ﻛﺪﻫﺎي 0x40 ،0x38ﻳﺎ 0x48ﻣﻤﻜﻦ اﺳﺖ در TWSRﻗﺮار ﮔﻴﺮد:
وﺿﻌﻴﺖ ﺑﻌﺪي ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻮﺳﻴﻠﻪ ي TWIاﻧﺠﺎم ﺷﻮد ارﺳﺎل SLA+Rو درﻳﺎﻓﺖ ACKﻳﺎ NACK
ﻣﻘﺪار TWSR
ﻋﻤﻠﻜﺮد وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه اﺳﺖ.
0x08
وﺿﻌﻴﺖ ﺷﺮوع دوﺑﺎره اﻳﺠﺎد ﺷﺪه اﺳﺖ.
0x10
ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع و ﺗﻼش ﺑﺮاي ﻛﻨﺘﺮل ﻣﺠﺪد آن
ﻛﻨﺘﺮل ﺑﺎس از دﺳﺖ رﻓﺘﻪ اﺳﺖ.
0x38
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
ﺑﺎﻳﺖ SLA+Rارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه اﺳﺖ.
0x40
ﺑﺎﻳﺖ SLA+Rارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﻧﺸﺪه اﺳﺖ.
0x48
ارﺳﺎل SLA+Rو درﻳﺎﻓﺖ ACKﻳﺎ NACK ارﺳﺎل SLA+Wو درﻳﺎﻓﺖ ACKﻳﺎ NACK
اﻳﺤﺎد وﺿﻌﻴﺖ ﺷﺮوع ﻣﺠﺪد اﻳﺠﺎد وﺿﻌﻴﺖ ﭘﺎﻳﺎن درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK اﻳﺤﺎد وﺿﻌﻴﺖ ﺷﺮوع ﻣﺠﺪد
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACK
0x50
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل NACK
0x58
اﻳﺠﺎد وﺿﻌﻴﺖ ﭘﺎﻳﺎن
در ﺻﻮرﺗﻲ ﻛﻪ SLA+Rارﺳﺎل ﺷﺪه و ACKدرﻳﺎﻓﺖ ﺷﺪه ﺑﺎﺷﺪ ﺑﻌﺪ از ﻳـﻚ ﺷـﺪن TWINTداده ي درﻳﺎﻓـﺖ ﺷﺪه در TWDRﻣﻲ ﺗﻮاﻧﺪ ﺧﻮاﻧﺪه ﺷﻮد .اﻳﻦ ﻛﺎر ﺗﺎ درﻳﺎﻓﺖ آﺧﺮﻳﻦ ﺑﺎﻳـﺖ ﺗﻜـﺮار ﺷـﺪه و ﺑﻌـﺪ از آن Masterﺑـﺎ ﻓﺮﺳﺘﺎدن NACKﺑﻪ Slaveاﻋﻼم ﻣﻲ ﻛﻨﺪ ﻛﻪ دﻳﮕﺮ ﻗﺼﺪ ﺧﻮاﻧﺪن از آن را ﻧـﺪارد و در ﻧﺘﻴﺠـﻪ ﻣـﻲ ﺗـﻮان ﻋﻤﻠﻴـﺎت ﺧﻮاﻧﺪن را ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﺷﺮوع ﻣﺠﺪد ﻳﺎ ﭘﺎﻳﺎن ﻣﺘﻮﻗﻒ ﻧﻤﻮد.
ﻣﺜﺎل ) :3ﺧﻮاﻧﺪن 2ﺑﺎﻳﺖ داده از Slaveﺑﺎ آدرس 0xA0و ﻧﺮخ ﺑﻴﺖ 100ﻛﻴﻠﻮﻫﺮﺗﺰ(
>#include <mega16.h #define xtal 8000000 - ١٦٠ -
P a g e | 161
www.eca.ir
char incoming_data; void main() { //----------- Sending Start Condition ----------TWBR = 32; // Bit rate = 100Khz TWCR = 0xA4; // Transmit Start Condition while(TWCR&0x80==0); // Waiting for TWINT flag //-------------- Sending SLA + R ---------------if(TWSR&0xF8==0x08) // Start Condition Transmitted? { TWDR=0xA1; // SLA+R TWCR=0xC4; // Enable TWI and Clear TWINT } else goto error; //-------- Enable Master Acknowledging ---------while(TWCR&0x80==0); // Waiting for TWINT flag if(TWSR&0xF8==0x40) // SLA+R has been send with ACK? TWCR=0xC4; // Master Acknowledging and clear TWINT //--------------- Reading 1st byte -------------- ١٦١ -
P a g e | 162
www.eca.ir
while(TWCR&0x80==0); // Waiting for TWINT flag if(TWSR&0xF8==0x50) // Master has been Received Data? { incoming_data = TWDR; // Reading Data TWCR=0xC4; // Master Acknowledging and clear TWINT } else goto error; //---- Reading 2nd byte and Stop Condition -----while(TWCR&0x80==0); // Waiting for TWINT flag if(TWSR&0xF8==0x50) // Master has been Received Data? { Incoming_data=TWDR; TWCR=0x94; // Master Not Acknowledging and clear TWINT } else goto error; TWCR=0x94; // Transmit Stop Condition //-----------------------------------------------error: while(1); - ١٦٢ -
P a g e | 163
www.eca.ir
} (SR) Slave Receiver e در اﻳﻦ وﺿﻌﻴﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﮔﻴﺮﻧﺪه Slave ،ﺑﻮده و اﻃﻼﻋـﺎت را از Master Transmitterدرﻳﺎﻓـﺖ ﻣـﻲ ﻛﻨـﺪ. ﺑﺮاي ﺷﺮوع ﺑﻪ ﻛﺎر ﺑﺎﻳﺪ آدرس Slaveدر 7ﺑﻴﺖ ﺑـﺎﻻي TWARﻗـﺮار ﮔﻴـﺮد .و ﭼﻨﺎﻧﭽـﻪ ﺑﻴـﺖ LSBﻳـﻚ ﺷـﻮد Masterﻗﺎدر ﺑﻪ ﭘﺎﺳﺨﮕﻮﻳﻲ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﻧﻴﺰ ﺧﻮاﻫﺪ ﺑﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت آن را ﻧﺎدﻳﺪه ﺧﻮاﻫﺪ ﮔﺮﻓﺖ.
1
0
2
3
X
4
5
6
TWAR
7
ﻧﺎم ﺑﻴﺖ
]TWAR[7:1
TWCRﻣﻄﺎﺑﻖ زﻳﺮ ﻣﻘﺪار دﻫﻲ ﺷﻮد:
0
1
TWIE
-
X
0
2
4
3
5
6
7
TWINT TWEA TWSTA TWSTO TWWC TWEN 1
0
0
0
1
1
TWCR ﻧﺎم ﺑﻴﺖ ﻣﻘﺪار
ﺑﻴﺖ TWIEﻳﻚ ﺷﺪه ﺗﺎ ﻣﺎژول TWIﻓﻌﺎل ﺷﻮد. ﺑﻴﺖ TWEAﻳﻚ ﺷﺪه ﺗﺎ ارﺳﺎل ACKﻓﻌﺎل ﺷﻮد. ﺑﻴﺖ ﻫﺎي TWSTAو TWSTOﺻﻔﺮ ﻣﻲ ﺑﺎﺷﻨﺪ زﻳﺮا اﻳﺠﺎد ﺷﺮاﻳﻂ آﻏﺎز و ﭘﺎﻳﺎن ﺑﺮ ﻋﻬﺪه ي Masterﻣﻲ ﺑﺎﺷﺪ.
- ١٦٣ -
P a g e | 164
www.eca.ir
ﺑﻌﺪ از ﭘﻴﻜﺮﺑﻨﺪي ،Slaveﻣﻨﺘﻈﺮ ﺷﺪه ﺗﺎ ﺗﻮﺳﻂ Masterآدرس دﻫﻲ ﺷﺪه و ﻳﺎ ﻳﻚ ﻓﺮاﺧﻮان ﻋﻤﻮﻣﻲ درﻳﺎﻓـﺖ ﻛﻨـﺪ. اﮔﺮ در آدرس درﻳﺎﻓﺖ ﺷﺪه ﺑﻴﺖ ﺟﻬﺖ ) (W/Rﺻﻔﺮ ﺑﺎﺷﺪ ﻧﺸﺎن دﻫﻨـﺪه ي اﻳـﻦ اﺳـﺖ ﻛـﻪ Masterﻣـﻲ ﺧﻮاﻫـﺪ ﻣﻘـﺪاري را ﺑـﻪ Slaveﺑﻔﺮﺳـﺘﺪ ﻛـﻪ در اﻳﻨﺼـﻮرت Slaveوارد وﺿـﻌﻴﺖ ) Slave Read (SRﺷـﺪه و در ﻏﻴـﺮ اﻳﻨﺼﻮرت در ﺣﺎﻟﺖ ) Slave Transmiter (STﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ .ﭘﺲ از درﻳﺎﻓﺖ SLA+Wﺑﻴﺖ TWINT ﻳﻚ ﺷﺪه و وﺿﻌﻴﺖ ﺟﺎري در رﺟﻴﺴﺘﺮ TWSRوﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ:
وﺿﻌﻴﺖ ﺑﻌﺪي ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻮﺳﻴﻠﻪ ي TWIاﻧﺠﺎم ﺷﻮد درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
ﻋﻤﻠﻜﺮد ﺑﺎﻳﺖ SLA+Wدرﻳﺎﻓﺖ ﺷﺪه و ACKارﺳﺎل ﺷﺪه اﺳﺖ.
ﻣﻘﺪار TWSR 0x60
ﻛﻨﺘﺮل ﺑﺎس در ﺣﻴﻦ ارﺳﺎل SLA + Wﺗﻮﺳﻂ Masterاز 0x68 دﺳﺖ رﻓﺘﻪ اﺳﺖ.
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK
ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ رﻳﺎﻓﺖ ﺷﺪه و ACKارﺳﺎل ﺷﺪه اﺳﺖ.
0x70
ﻛﻨﺘﺮل ﺑﺎس در ﺣﻴﻦ ارﺳﺎل ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺗﻮﺳﻂ Master 0x78 از دﺳﺖ رﻓﺘﻪ اﺳﺖ.
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از Slaveﺑﻪ Master درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKﻳﺎ NACK ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از Slaveﺑﻪ Master
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKدر ﻓﺮاﺧﻮاﻧﻲ اﺧﺘﺼﺎﺻﻲ
0x80
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل NACKدر ﻓﺮاﺧﻮاﻧﻲ اﺧﺘﺼﺎﺻﻲ
0x88
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ACKدر ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ
0x90
درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل NACKدر ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ
0x98
درﻳﺎﻓﺖ ﺣﺎﻟﺖ ﭘﺎﻳﺎن و ﻳﺎ ﺷﺮوع دوﺑﺎره
0xA0
ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از Slaveﺑﻪ Master
در ﺻﻮرﺗﻲ ﻛﻪ ﻛﺪ ﺧﻮاﻧﺪه ﺷﺪه 0x60ﺑﺎﺷﺪ آدرس ﺑﺪرﺳﺘﻲ ﺗﻮﺳﻂ Slaveدرﻳﺎﻓﺖ ﺷﺪه و ﺑﺮاي Masterﺗﺼـﺪﻳﻖ ) (ACKﻧﻴﺰ ارﺳﺎل ﺷﺪه اﺳﺖ .ﭘﺲ از اﻳﻦ Slaveﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻳﺖ ﻫﺎي داده را درﻳﺎﻓﺖ ﻛﺮده و ﺗـﺎ زﻣـﺎﻧﻲ ﻛـﻪ ﻳـﻚ - ١٦٤ -
P a g e | 165
www.eca.ir
TWSR ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ ﺷﺮوع ﻣﺠﺪد اﻳﺠﺎد ﺷﻮد اﻳﻦ روﻧﺪ اداﻣﻪ ﺧﻮاﻫﺪ داﺷﺖ ﻛﻪ در اﻳﻦ ﺻـﻮرت ﻣﻘـﺪار رﺟﻴﺴـﺘﺮ . ﻣﻲ ﺑﺎﺷﺪ0xA0 ﺑﺮاﺑﺮ
( ﻛﻴﻠﻮﻫﺮﺗﺰ100 و ﻧﺮخ ﺑﻴﺖ0x01 ﺑﺎ آدرسSlave )درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ داده ﺗﻮﺳﻂ:4 ﻣﺜﺎل
#include <mega16.h> #define xtal 8000000 char incoming_data; void main() { //-------------- Initial Setting --------------TWAR = 0x01; // Slave Address TWBR = 32; // Bit rate = 100Khz TWCR = 0xC4; // Clear Int, Set TWEA and TWEN while(TWCR&0x80==0); // Waiting for TWINT flag //--------- Transmit a Byte to Master ---------if(TWSR&0xF8==0x60) // SLA+W Received? { TWCR = 0xC4; // Clear Int, Set TWEA and TWEN } else - ١٦٥ -
P a g e | 166
www.eca.ir
goto error; //------------ Slave Receive a Byte -----------while(TWCR&0x80==0); // Waiting for TWINT flag if(TWSR&0xF8==0x80) // Slave has been Receive Byte? { incoming_data=TWDR; //Receive incoming data TWCR=0x84; // Clear TWINT } else goto error; //---------- Receiving Stop Condition ---------while(TWCR&0x80==0); // Waiting for TWINT flag if ((TWSR & 0xF8)== 0x0A0) //Stop Condition Received? TWCR=0x84; // Clear TWINT error: while(1); }
- ١٦٦ -
P a g e | 167
www.eca.ir
(ST) Slave Transmitter f اﻳﻦ وﺿﻌﻴﺖ ﻣﺸﺎﺑﻪ SRﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺑﻌﺪ از درﻳﺎﻓﺖ آدرس ﺑﻴﺖ W/Rﻳﻚ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ Masterاﻋﻼم ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﻣﻘﺪاري را از Slaveﺑﺨﻮاﻧﺪ و در ﻧﺘﻴﺠﻪ Slaveﻓﺮﺳﺘﻨﺪه ﺧﻮاﻫﺪ ﺑﻮد. ﭘﺲ از درﻳﺎﻓﺖ آدرس ﺑﻴﺖ TWINTﻳﻚ ﺷﺪه و ﻣﻲ ﺗﻮان ﻛﺪ وﺿﻌﻴﺖ ﺟﺎري را از TWSRﺑﺪﺳﺖ آورد ،ﺑﻌﺪ ار ارﺳﺎل ﻫﺮ ﺑﺎﻳﺖ داده از Master ،Slaveﺑﺎ ﻓﺮﺳﺘﺎدن ACKآن را ﺗﺼﺪﻳﻖ ﻣﻲ ﻛﻨﺪ و ﭼﻨﺎﻧﭽﻪ Masterﺑﺨﻮاﻫﺪ آﺧﺮﻳﻦ ﺑﺎﻳﺖ را در درﻳﺎﻓﺖ ﻛﻨﺪ NACKارﺳﺎل ﺧﻮاﻫﺪ ﻧﻤﻮد ).(TWSR=0xC0
وﺿﻌﻴﺖ ﺑﻌﺪي ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻮﺳﻴﻠﻪ ي TWIاﻧﺠﺎم ﺷﻮد ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK
ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK
ﻣﻘﺪار TWSR
ﻋﻤﻠﻜﺮد ﺑﺎﻳﺖ SLA+Rدرﻳﺎﻓﺖ ﺷﺪه و ACKارﺳﺎل ﺷﺪه اﺳﺖ.
0xA8
ﻛﻨﺘﺮل ﺑﺎس در ﺣﻴﻦ ارﺳﺎل SLA + Wﺗﻮﺳﻂ Masterاز 0xB0 دﺳﺖ رﻓﺘﻪ اﺳﺖ.
ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACKﻳﺎ NACK ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از Slaveﺑﻪ Master ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از Slaveﺑﻪ Master
ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ACK
0xB8
ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ NACK
0xC0
ارﺳﺎل آﺧﺮﻳﻦ ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ (TWEA=0) ACK
0xC8
ﻣﺜﺎل ) :5ﺧﻮاﻧﺪن ﻳﻚ ﺑﺎﻳﺖ داده از Slaveﺑﺎ آدرس 0x01و ﻧﺮخ ﺑﻴﺖ 100ﻛﻴﻠﻮﻫﺮﺗﺰ(
>#include <mega16.h #define xtal 8000000 )(void main { - ١٦٧ -
P a g e | 168
www.eca.ir
//-------------- Initial Setting --------------TWAR = 0x01 // Slave Address TWBR = 32; // Bit rate = 100Khz TWCR = 0xC4; // Clear Int, Set TWEA and TWEN while(TWCR&0x80==0); // Waiting for TWINT flag //--------- Transmit a Byte to Master ---------if(TWSR&0xF8==0xA8) // SLA+R Received? { TWDR=0x77; // Transmitt 0x77 TWCR = 0xC4; // Clear Int, Set TWEA and TWEN } else goto error; //------------- Wait for ACK or NACK ----------while(TWCR&0x80==0); // Waiting for TWINT flag if(TWSR&0xF8!=0xC0) // Slave has been send NACK? goto error; //-----------------Error Sub ------------------error: while(1); - ١٦٨ -
P a g e | 169
www.eca.ir
} ﻫﻤﺰﻣﺎن ﺳﺎزي ﭘﺎﻟﺲ ﺳﺎﻋﺖ: ﭘﺎﻟﺲ ﺳﺎﻋﺖ ﺗﻮﺳﻂ Masterﻫﺎ ﺗﻮﻟﻴﺪ ﻣﻲ ﮔﺮدد .ﻫﺮ Masterﭘﺎﻟﺲ ﺳﺎﻋﺖ ﺧﻮد را ﺑﺮ روي SCLﻗﺮار ﻣﻲ دﻫﺪ و ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺧﺎﺻﻴﺖ wired-ANDدر ﺑﺎس I2Cﭘﺎﻟﺲ ﺳﺎﻋﺖ ﻫﺎ ﺑﺎ ﻫﻢ ANDﺷـﺪه و ﺑﺎﻋـﺚ ﺗﻮﻟﻴـﺪ ﻳـﻚ ﭘـﺎﻟﺲ ﺳﺎﻋﺖ ﻣﺸﺘﺮك ﻣﻲ ﮔﺮدد.
Arbitrationدر ﺳﻴﺴﺘﻢ ﻫﺎي داراي ﭼﻨﺪ Master ﻫﺮ Masterﺗﻨﻬﺎ در زﻣﺎﻧﻲ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺑﺎس دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﺪ ﻛـﻪ ﺧـﻂ SDAآزاد ﺑﺎﺷـﺪ .اﻣـﺎ ﭘﺮوﺗﻜـﻞ I2Cﺑـﻪ ﺷﻜﻠﻲ ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ ﻛﻪ در ﺻﻮرﺗﻴﻜﻪ در ﺷﺮاﻳﻂ آزاد ﺑـﻮدن ﺑـﺎس دو ﻳـﺎ ﭼﻨـﺪ Masterﻫﻤﺰﻣـﺎن درﺧﻮاﺳـﺖ دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﺎس را داﺷﺘﻪ ﺑﺎﺷﻨﺪ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ارﺗﺒﺎط ﺣﻔـﻆ ﺷـﻮد .در اﻳﻨﺠـﺎ ﻧﻴـﺰ وﺟـﻮد ﺧﺎﺻـﻴﺖ Wired-ANDﺑﺎﻋﺚ ﺣﻞ ﻣﺸﻜﻞ ﻣﻲ ﮔﺮدد ﻳﻌﻨﻲ ﭼﻨﺪ Masterﺑﻄﻮر ﻫﻤﺰﻣﺎن داده ﻫﺎﻳﺸﺎن را ﺑﺮ روي ﺧﻂ SDA ﺑﻪ ﺻﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ دارﻧﺪ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺑﺎ ﻫﻢ ANDﺷﺪه و ﺑﺮ روي ﺑﺎس ﻳﻚ دﻳﺘﺎي واﺣﺪ را اﻳﺠﺎد ﻣـﻲ - ١٦٩ -
P a g e | 170
www.eca.ir
ﻛﻨﺪ ،در اوﻟﻴﻦ ﻣﻜﺎﻧﻲ ﻛﻪ ﺧﻂ SDAﺑﺎ ﺧﻂ داده ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ Masterﻣﻄﺎﺑﻘـﺖ ﻧﺪاﺷـﺖ آن Masterﺧـﻂ داده ﺳﺮﻳﺎل را در ﺳﻄﺢ ﻳﻚ ﻣﻨﻄﻘﻲ رﻫﺎ ﻣﻲ ﻛﻨﺪ )ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ وﺟﻮد Pull-upﺳﻄﺢ ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ( ﺗـﺎ ﺑﺮ روي ﻛﺎر دﻳﮕﺮ Masterﻫﺎ اﺧﻼﻟﻲ اﻳﺠﺎد ﻧﻜﻨﺪ.
ﻫﻤﺎن ﻃﻮر ﻛﻪ دﻳﺪه ﻣﻲ ﺷﻮد ﻣﺴﺎﻟﻪ Arbitrationﺗﻨﻬﺎ در ﻣﻮرد ﺣﺎﻟﺘﻲ ﻣﻌﻨﻲ دارد ﻛﻪ ﭼﻨـﺪ Masterداﺷـﺘﻪ ﺑﺎﺷـﻴﻢ زﻳﺮا: .١
در ﻣﻮرد Slaveﻫﺎ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ در ﻫﺮ زﻣﺎن ﻳـﻚ Slaveآدرس دﻫـﻲ ﻣـﻲ ﺷـﻮد و ﺣـﻖ دﺳﺘﺮﺳـﻲ ﺑـﻪ
SDAرا دارد ﻣﻌﻨﻲ ﻧﺨﻮاﻫﺪ داﺷﺖ. .٢
ﻳﻚ Masterدﻳﮕﺮ رﻗﻴﺒﻲ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺧﻂ SDAﻧﺪارد.
- ١٧٠ -
P a g e | 171
www.eca.ir
دﺳﺘﺮﺳﻲ ﻧﺮم اﻓﺰاري ﺑﻪ I2Cدر CodeVision ﻛﺎﻣﭙﺎﻳﻠﺮ CodeVisionﺑﺎ اراﺋﻪ ي ﻳﻚ ﺳﺮي ﺗﻮاﺑﻊ ﻣﺮﺑﻮط ﺑﻪ ﺑﺎس ،I2Cاﻣﻜﺎن اﻳﺠﺎد اﻳﻦ ﭘﺮوﺗﻜﻞ را ﺑﻪ ﺻﻮرت ﻧﺮم اﻓﺰاري ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ دﻫﺪ .ﭘﻴﻦ ﻫﺎي SDAو SCLﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﻴﻴﻦ ﺷﻮﻧﺪ: #asm .equ __i2c_port=0x18 .equ __sda_bit=3 .equ __scl_bit=4 #endasm در اﻳﻦ ﻗﻄﻌﻪ ﻛﺪ ﭘﻴﻦ ﻫﺎي 3و 4از PORTBﺑﻪ ﻋﻨﻮان SDAو SCLﺗﻌﻴﻴﻦ ﺷﺪه اﻧﺪ.
ﺗﻮاﺑﻊ I2Cدر ﻛﺎﻣﭙﺎﻳﻠﺮ CodeVision
)(:i2c_init اﻳﻦ ﺗﺎﺑﻊ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ ي ﺑﺎس I2Cرا اﻧﺠﺎم داده و ﺑﺎﻳﺪ ﻗﺒﻞ از اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ دﻳﮕﺮ ﺑﻪ ﺑﻪ ﻛﺎر ﺑﺮده ﺷﻮد.
)(:i2c_start اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ و در ﺻﻮرﺗﻲ ﻛﻪ ﺑﺎس آزاد ﺑﺎﺷﺪ ﻣﻘﺪار ﻳﻚ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و در ﻏﺮ اﻳﻦ ﺻﻮرت ﺧﺮوﺟﻲ اﻳﻦ ﺗﺎﺑﻊ ﺻﻔﺮ ﺧﻮاﻫﺪ ﺑﻮد.
- ١٧١ -
P a g e | 172
www.eca.ir
)(:i2c_stop اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺮ روي ﺑﺎس I2Cاﻳﺠﺎد ﻣﻲ ﻛﻨﺪ.
)(:i2c_read اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺑﺎﻳﺖ را از ﺑﺎس I2Cﺧﻮاﻧﺪه و ﺷﻜﻞ ﻛﻠﻲ آن ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
)unsigned char i2c_read(unsigned char ack ﭘﺎراﻣﺘﺮ ackﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﭘﺲ از درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ acknowledgementارﺳﺎل ﺷﻮد ﻳﺎ ﺧﻴﺮ .در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﭘﺎراﻣﺘﺮ ﻳﻚ ﺑﺎﺷﺪ ACKارﺳﺎل ﺧﻮاﻫﺪ و در ﻏﻴـﺮ اﻳﻨﺼـﻮرت ﺑـﺎ اﻳﺠـﺎد ﻧﻜـﺮدن ACKﺑـﻪ ﺻـﻮرت ﭘﺴـﻴﻮ NACKاﻳﺠﺎد ﺧﻮاﻫﺪ ﺷﺪ.
)(:i2c_write اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺑﺎﻳﺖ را ﺑﻪ ﺑﺎس I2Cارﺳﺎل ﻛﺮده و ﺷﻜﻞ ﻛﻠﻲ آن ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
)unsigned char i2c_write(unsigned char data ﻣﺘﻐﻴﺮ dataﻣﻘﺪار ارﺳﺎﻟﻲ ﺑﻪ ﺑﺎس ﺑﻮده و در ﺻﻮرﺗﻲ ﻛﻪ ACK ،Slaveاﻳﺠﺎد ﻛﻨﺪ اﻳﻦ ﺗﺎﺑﻊ ﻣﻘـﺪار ﻳـﻚ و در ﻏﻴـﺮ اﻳﻨﺼﻮرت ﻣﻘﺪار ﺻﻔﺮ ﺑﺎز ﻣﻲ ﮔﺮداﻧﺪ.
- ١٧٢ -
P a g e | 173
www.eca.ir
I2C ﻫﺎيEEPROM ارﺗﺒﺎط ﺑﺎ:12 ﭘﺮوژه
:ﺷﻤﺎﺗﻴﻚ
:ﻧﺮم اﻓﺰار
#include<mega16.h> #define xtal 1000000 /* the I2C bus is connected to PORTB */ /* the SDA signal is bit 3 */ /* the SCL signal is bit 4 */
- ١٧٣ -
P a g e | 174
www.eca.ir
#asm .equ __i2c_port=0x18 .equ __sda_bit=3 .equ __scl_bit=4 #endasm /* now you can include the I2C Functions */ #include /* function declaration for delay_ms */ #include <delay.h> #define EEPROM_BUS_ADDRESS 0xa0 /* read a byte from the EEPROM */ unsigned char eeprom_read(unsigned char address) { unsigned char data; i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address); i2c_start(); i2c_write(EEPROM_BUS_ADDRESS | 1); data=i2c_read(0); i2c_stop(); return data; }
- ١٧٤ -
P a g e | 175
www.eca.ir
/* write a byte to the EEPROM */ void eeprom_write(unsigned char address, unsigned char data) { i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address); i2c_write(data); i2c_stop(); /* 10ms delay to complete the write operation */ delay_ms(10); } void main(void) { unsigned char i; DDRD=0xFF; /* initialize the I2C bus */ i2c_init(); /* write the byte 55h at address 10h */ eeprom_write(0x10,0x55); /* read the byte from address AAh */ i=eeprom_read(0x10); PORTD=i; while (1); /* loop forever */ } - ١٧٥ -
P a g e | 176
www.eca.ir
ﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل
ﻋﻤﺪه روش ﻫﺎﻳﻲ ﻛﻪ ﺑﺮاي ﺗﺒﺪﻳﻞ آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل وﺟﻮد دارﻧﺪ ﻋﺒﺎرﺗﻨﺪ از :ﺗﺒﺪﻳﻞ آﻧـﻲ ﻳـﺎ ،Flashروش ﺗﻘﺮﻳـﺐ ﻫــﺎي ﻣﺘــﻮاﻟﻲ ﻳــﺎ ،Successive Approximationﻣﺒــﺪل ﻫــﺎي ،Ramp-Compare ،Delta-Encoded Sigma-Delta ،Pipeline ADCو ﻏﻴﺮه ﻛﻪ از اﻳﻦ ﻣﻴﺎن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎي AVRاز روش ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘـﻮاﻟﻲ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ.
اﺻﻮل ﺗﺒﺪﻳﻞ ﺑﺎ روش ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘﻮاﻟﻲ
ﺑﻠﻮك دﻳﺎﮔﺮام ﺳﺎده ﺷﺪه ي اﻳﻦ ﻣﺒﺪل ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:
- ١٧٦ -
P a g e | 177
www.eca.ir
:Sample and Holdﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻧﻤﻮﻧﻪ ي آﻧﺎﻟﻮگ ﺑﻪ ﻣﻘﺪار ﺑـﺎﻳﻨﺮي ﻣﺘﻨـﺎﻇﺮ ﺑـﺎ آن ﻧﻴﺎز ﺑﻪ ﻳﻚ ورودي Stableدارد ﻛﻪ اﻳﻦ ﻃﺮﻳﻖ ﻣﺪار Sample and Holdاﻳﺠﺎد ﻣـﻲ ﺷـﻮد .در ﺷـﻜﻞ زﻳـﺮ ﻳـﻚ ﻧﻤﻮﻧﻪ ي ﺑﺴﻴﺎر ﺳﺎده از آن را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﻛﻠﻴﺪ ،ﺳﻴﮕﻨﺎل ورودي را ﺑﺎ ﻫﺮ ﻧﻤﻮﻧﻪ ي ﺑﺮداﺷﺘﻪ ﺷﺪه ﺑﻪ ﺧﺎزن وﺻﻞ ﻣﻲ ﻛﻨﺪ و ﺧﺎزن ﻧﻴﺰ ﻣﻘﺪار وﻟﺘﺎژ را ﺗﺎ ﻧﻤﻮﻧﻪ ي ﺑﻌﺪي ﺛﺎﺑﺖ ﻧﮕﺎه ﻣﻲ دارد.
:Successive Approximation Registerاﻳﻦ رﺟﻴﺴﺘﺮ ﻣﻘﺪار ﺗﻘﺮﻳﺐ زده ﺷﺪه ي دﻳﺠﻴﺘﺎل را ﺑﺮاي ﻣﻘﺎﻳﺴﻪ ﺑﻪ DACﻣﻲ دﻫﺪ.
اﻟﮕﻮرﻳﺘﻢ ﺗﺒﺪﻳﻞ: اﺑﺘﺪا رﺟﻴﺴﺘﺮ SARﺑﺎ ﻋﺪد ﺑﺎﻳﻨﺮي 10000000ﺑﺎرﮔﺬاري ﻣﻲ ﺷﻮد و اﻳﻦ ﻋـﺪد ﺗﻮﺳـﻂ DACﺑـﺎ ﻣﻘـﺪار آﻧـﺎﻟﻮگ ورودي ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد ﻣﻘﺎﻳﺴﻪ ﺷﺪه ﺑﺰرﮔﺘﺮ ﺑﺎﺷﺪ و ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨـﺪه ﺑﺎﻋـﺚ ﻣـﻲ ﺷـﻮد، SARﺑﻴﺖ MSBرا ﭘﺎك ﻛﺮده و ﺑﻴﺖ ﻗﺒﻞ از آن را ﻳﻚ ﻛﻨﺪ و در ﻧﺘﻴﺠﻪ ﻋـﺪد 01000000در DACﺑﺎرﮔـﺬاري ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد ﻣﻘﺎﻳﺴﻪ ﺷﺪه ﻛﻮﭼﻜﺘﺮ ﺑﺎﺷﺪ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺑﺎﻋﺚ ﻣﻲ ﺷـﻮد ﺑﻴـﺖ ﻛـﻮﭼﻜﺘﺮ ﻧﻴـﺰ ﻳﻚ ﺷﺪه و در ﻧﺘﻴﺠﻪ ﻋﺪد 11000000در ورودي DACﺑﺎرﮔﺬاري ﺷﻮد .اﻳﻦ ﻋﻤﻞ ﺗﺎ ﭘﻴـﺪا ﺷـﺪن ﻣﻘـﺪار آﻧـﺎﻟﻮگ اداﻣﻪ داﺷﺘﻪ و در اﻳﻦ زﻣﺎن ﺑﻴﺖ End of Conversionﺑﻪ ﻧﺸﺎﻧﻪ ي ﭘﺎﻳﺎن ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻲ ﺷﻮد.
- ١٧٧ -
P a g e | 178
www.eca.ir
:ATmega16 ﻗﻄﻌﻪ يADC ﺑﺮﺧﻲ از ﻣﺸﺨﺼﺎت • 10-bit Resolution • ±2 LSB Absolute Accuracy • 65 - 260 μs Conversion Time • Up to 15 kSPS at Maximum Resolution • 8 Multiplexed Single Ended Input Channels • 7 Differential Input Channels • 2 Differential Input Channels with Optional Gain of 10x and 200x • 0 - VCC ADC Input Voltage Range • Selectable 2.56V ADC Reference Voltage • Free Running or Single Conversion Mode • ADC Start Conversion by Auto Triggering on Interrupt Sources • Interrupt on ADC Conversion Complete • Sleep Mode Noise Canceler
اﻋﻤﺎلADC ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﺑﻪ ﺻﻮرت ﻣﺎﻟﺘﻲ ﭘﻠﻜﺲ ﺷﺪه ﺑﻪPORA ﻋﻤﻠﻜﺮد دومADC ﭘﻴﻦ ﻫﺎي ورودي و وﻟﺘﺎژAREF ﭘﻴﻦ،AVCC وﻟﺘﺎژ ورودي ﺑﻴﻦ ﺻﻔﺮ ﺗﺎ وﻟﺘﺎژ ﻣﺮﺟﻊ ﺑﻮده و وﻟﺘﺎژ ﻣﺮﺟﻊ از ﺳﻪ ﻣﻨﺒﻊ.ﻣﻲ ﺷﻮﻧﺪ ﺗﻐﺬﻳﻪ ي آن ﺑﻪ ﺻﻮرتADC ﺟﻬﺖ ﻛﺎﻫﺶ ﻧﻮﻳﺰ ﻣﻮﺛﺮ ﺑﺮ روي واﺣﺪ. وﻟﺖ ﻗﺎﺑﻞ ﺗﺎﻣﻴﻦ ﻣﻲ ﺑﺎﺷﺪ2,56 داﺧﻠﻲ در. ﺗﻔﺎوت داﺷﺘﻪ ﺑﺎﺷﺪVCC وﻟﺖ ﺑﺎ0,3 وﻟﺘﺎژ اﻳﻦ ﭘﻴﻦ ﻧﺒﺎﻳﺪ ﺑﻴﺸﺘﺮ از. ﺗﺎﻣﻴﻦ ﻣﻲ ﺷﻮدAVCC ﺟﺪاﮔﺎﻧﻪ از ﭘﻴﻦ VCC اﻳﻦ ﭘﺎﻳﻪ ﺑﻪLC ﻣﻲ ﺗﻮان ﺑﻮﺳﻴﻠﻪ ي ﻳﻚ ﻓﻴﻠﺘﺮ، اﺳﺘﻔﺎده ﻣﻲ ﺷﻮدAVCC ﺑﻪ ﻋﻨﻮانVCC ﺻﻮرﺗﻲ ﻛﻪ از .ﻣﺘﺼﻞ ﻧﻤﻮد
- ١٧٨ -
P a g e | 179
www.eca.ir
رﺟﻴﺴﺘﺮﻫﺎي واﺣﺪ ADC
ADC Multiplexer Selection Register 0
1
2
4
3
5
6
7
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
ADMUX ﻧﺎم ﺑﻴﺖ
] :Analog Channel and Gain Selection Bits[4:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛـﻪ ﭼـﻪ ﺗﺮﻛﻴﺒـﻲ از 8 ﻛﺎﻧﺎل ورودي ﺑﻪ واﺣﺪ ADCﻣﺘﺼﻞ ﺷﺪه و ﻫﻤﭽﻨﻴﻦ ﺑﻬﺮه ورودي ﺗﻔﺎﺿﻠﻲ را ﻧﻴﺰ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ .در ﺣﺎﻟـﺖ ﻫـﺎي Single-endedدﻗﺖ 10 ADCﺑﻴﺘﻲ ﺑﻮده ﻛﻪ در ﺣﺎﻟﺖ ورودي دﻳﻔﺮاﻧﺴﻴﻞ ﺑﺎ ﺑﻬﺮه ي 1xو 10xاﻳﻦ ﻣﻘﺪار ﺑﻪ 8 ﺑﻴﺖ و ﺑﺎ ﺑﻬﺮه ي 200xﺑﻪ 7ﺑﻴﺖ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ. در ﺻﻮرﺗﻲ ﻛﻪ ADCﻣﺸﻐﻮل اﻧﺠﺎم ﻳﻚ ﺗﺒﺪﻳﻞ ﺑﻮده و اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ ﺗﺎ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ﺟﺎري اﻳﻦ ﺗﻐﻴﻴﺮ اﻧﺠـﺎم ﻧﺨﻮاﻫﺪ ﺷﺪ.ﺗﻨﻈﻴﻤﺎت اﻳﻦ 4ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ) :ﻋﻤﻠﻜﺮد ﺗﻔﺎﺿـﻠﻲ ﻓﻘـﻂ ﺑـﺮ روي Packageﻫـﺎي TQFPو MLFآزﻣﺎﻳﺶ ﺷﺪه اﺳﺖ(. - ١٧٩ -
P a g e | 180
www.eca.ir
- ١٨٠ -
P a g e | 181
www.eca.ir
:ADC Left Adjust Resultﺑﻴﺖ ADLRﺑﺮ ﻧﺤﻮه ﻧﻤﺎﻳﺶ ﻧﺘﻴﺠﻪ ي ﺗﺒﺪﻳﻞ در رﺟﻴﺴﺘﺮ داده ي ADCﺗـﺎﺛﻴﺮ ﻣﻲ ﮔﺬارد .ﻧﻮﺷﺘﻦ ﻳﻚ در اﻳﻦ ﺑﻴﺖ آن را ﺑﻪ ﺻﻮرت Left Adjustﺗﻨﻈﻴﻢ ﻣﻲ ﻛﻨﺪ و در ﻏﻴـﺮ اﻳﻨﺼـﻮرت ﻧﺘﻴﺠـﻪ ﺑـﻪ ﺻﻮرت Right Adjustﺧﻮاﻫﺪ ﺑﻮد .ﺗﻐﻴﻴﺮ اﻳﻦ ﺑﻴﺖ ﺑﻪ ﺻﻮرت آﻧﻲ ﺑﺮ روي رﺟﻴﺴﺘﺮ داده ﺗﺎﺛﻴﺮ ﻣﻲ ﮔﺬارد.
] :Reference Selection Bits[1:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﺮﺟﻊ وﻟﺘﺎژ ADCرا ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ .در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﻫﺎ در ﺣﻴﻦ ﺗﺒﺪﻳﻞ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ ﺗﺎ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ﺗﻐﻴﻴﺮ اﻋﻤﺎل ﻧﺨﻮاﻫﺪ ﺷﺪ .در ﺻﻮرﺗﻲ ﻛـﻪ از ﻣﺮﺟـﻊ وﻟﺘﺎژ داﺧﻠﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﻧﺒﺎﻳﺪ وﻟﺘﺎژ ﺧﺎرﺟﻲ ﺑﻪ ﭘﻴﻦ AREFاﻋﻤﺎل ﺷﻮد .زﻣﺎﻧﻲ ﻛﻪ ﻳﻜﻲ از دو وﻟﺘﺎژ AREFﻳﺎ 2,56وﻟﺖ ﺑﻪ ﻋﻨﻮان ﻣﺮﺟﻊ اﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﻨﺪ ﺑﺎ اﺗﺼﺎل ﻳﻚ ﺧﺎزن 100ﻧﺎﻧﻮ ﺑـﻴﻦ ﭘـﻴﻦ AREFو زﻣـﻴﻦ ﻣـﻲ ﺗـﻮان ﻣﻘﺪار ﻧﻮﻳﺰ را ﻛﺎﻫﺶ داد.
وﻟﺘﺎژ ﻣﺮﺟﻊ
REFS1 REFS0
وﻟﺘﺎژ ﭘﺎﻳﻪ ي AREF
0
0
وﻟﺘﺎژ ﭘﺎﻳﻪ ي AVCC
1
0
رزرو ﺷﺪه
0
1
وﻟﺘﺎژ داﺧﻠﻲ 2,56وﻟﺖ
1
1
- ١٨١ -
P a g e | 182
www.eca.ir
ADC Control and Status Register A
0
2
1
4
3
5
7
6
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
ADCSRA ﻧﺎم ﺑﻴﺖ
] :ADC Prescaler Select Bits[2:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺿﺮﻳﺐ ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه اي را ﻛﻪ از ﻛﻼك ﺳﻴﺴﺘﻢ ﺑـﺮاي واﺣﺪ ADCﻛﻼك ﺗﺎﻣﻴﻦ ﻣﻲ ﻛﻨﺪ را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.
ﺿﺮﻳﺐ ﺗﻘﺴﻴﻢ
ADPS0
ADPS1
ADPS2
2
0
0
0
2
1
0
0
4
0
1
0
8
1
1
0
16
0
0
1
32
1
0
1
64
0
1
1
128
1
1
1
:ADC Interrupt Enableدر ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ) (Iو ﻳﻚ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ،اﺗﻤﺎم ﻳﻚ ﺗﺒﺪﻳﻞ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد.
- ١٨٢ -
P a g e | 183
www.eca.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ﻣﺸﻐﻮل ﺗﺒﺪﻳﻞ اﺳﺖ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﻧﻴﻤﻪ ﻛﺎره رﻫﺎ ﺷﻮد.
The ADC Data Register
ﺑﺎ ﭘﺎﻳﺎن ﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﻧﺘﻴﺠﻪ در اﻳﻦ رﺟﻴﺴﺘﺮ ﻗﺮار ﻣﻲ ﮔﻴﺮد و در ﺻﻮرﺗﻲ ﻛﻪ ورودي ADCﺑﻪ ﺻـﻮرت دﻳﻔﺮاﻧﺴـﻴﻞ ﺑﺎﺷﺪ ﻧﺘﻴﺠﻪ ﺑﻪ ﻓﺮم ﻣﻜﻤﻞ 2ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
- ١٨٣ -
P a g e | 184
www.eca.ir
ﻣﻄﺎﺑﻖ ﺑﻴﺖ ADLRدر رﺟﻴﺴﺘﺮ ADMUXﺑﻪ دو ﺻﻮرت LAو RAﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد:
ADLR=0 0
2
1
3
5
4
7
6
Bit
ADCL ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 ADC9 ADC8
-
-
-
-
-
2
3
4
5
6
-
ADCH
ADLR=1 1
0
7
Bit
ADCL ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 -
-
-
-
-
-
ADCH ADC1 ADC0
Special FunctionIO Register
0
1
2
3
4
5
6
7
ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10
SFIOR ﻧﺎم ﺑﻴﺖ
:ADC Auto Trigger Sourceدر ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ADATEاز رﺟﻴﺴـﺘﺮ ADCSRAﻣﻘـﺪار ﻳـﻚ داﺷـﺘﻪ ﺑﺎﺷﺪ ﺑﻴﺖ ﻫﺎي ADTSﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻛﺪام ﻣﻨﺒﻊ ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ADCرا راه اﻧﺪازي ﻛﻨـﺪ .ﻣﻨﺒـﻊ اﻳـﻦ راه اﻧﺪازي ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺮﭼﻢ وﻗﻔﻪ ي آن ﻣﻨﺒﻊ ﻣﻲ ﺑﺎﺷﺪ و در ﺻﻮرﺗﻲ ﻛـﻪ ﺑﺨـﻮاﻫﻴﻢ اﺗﻤـﺎم ﺗﺒـﺪﻳﻞ ﺧـﻮد ADC ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﺑﻌﺪي ﺑﺎﺷﺪ و ADCﺑﻪ ﺻﻮرت ﭘﻴﻮﺳـﺘﻪ ﻋﻤﻠﻴـﺎت ﺗﺒـﺪﻳﻞ را اﻧﺠـﺎم دﻫـﺪ از ﺣﺎﻟـﺖ Free Running اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ. - ١٨٤ -
P a g e | 185
www.eca.ir
ﻣﻨﺒﻊ راه اﻧﺪازي
ADTS2 ADTS1 ADTS0
Free Running
0
0
0
ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ
1
0
0
وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﺻﻔﺮ
0
1
0
ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ي ﺗﺎﻳﻤﺮ ﺻﻔﺮ
1
1
0
ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﺻﻔﺮ
0
0
1
ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ي Bﺗﺎﻳﻤﺮ ﻳﻚ
1
0
1
ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻳﻚ
0
1
1
Captureﺗﺎﻳﻤﺮ ﻳﻚ
1
1
1
راه اﻧﺪازي ADCﺑﻪ ﺻﻮرت ﺗﻚ ﺗﺒﺪﻳﻞ و ﺗﺒﺪﻳﻞ ﺧﻮدﻛﺎر
ﭘﺲ از اﻧﺘﺨﺎب ﻛﺎﻧﺎل ﻣﻮرد ﻧﻈﺮ و وﻟﺘﺎژ ﻣﺮﺟﻊ ﺑﻮﺳﻴﻠﻪ رﺟﻴﺴﺘﺮ ،ADMUXﺑﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜـﻪ ﺑﻴـﺖ ADEN ﻳﻚ ﺑﻮده ﺑﺎﺷﺪ ،ﻧﻮﺷﺘﻦ ﻳﻚ ﻣﻨﻄﻘﻲ ﺑﺮ روي ﺑﻴﺖ ADSCﺷﺮوع ﻳﻚ ﺗﺒﺪﻳﻞ را ﻣﻮﺟﺐ ﺧﻮاﻫﺪ ﺷﺪ .اﻳﻦ ﺑﻴﺖ در ﺣﻴﻦ اﻧﺠﺎم ﺗﺒﺪﻳﻞ ﻳﻚ ﺑﻮده و ﺑﺎ ﭘﺎﻳﺎن آن ﺑﻮﺳﻴﻠﻪ ي ﺳﺨﺖ اﻓﺰار ﭘﺎك ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻗﺒﻞ از اﺗﻤﺎم ﺗﺒـﺪﻳﻞ ،ﻛﺎﻧـﺎل ADCﺗﻐﻴﻴﺮ ﻛﻨﺪ ﺗﺎ ﭘﺎﻳﺎن ﺗﺒﺪﻳﻞ ﺟﺎري اﻳﻦ ﺗﻐﻴﻴﺮ ﺗﺎﺛﻴﺮ ﻧﺨﻮاﻫﺪ ﮔﺬاﺷﺖ. راه دﻳﮕﺮ ﺑﺮاي راه اﻧﺪازي ADCوﺿﻌﻴﺖ ﺗﺤﺮﻳﻚ ﺧﻮدﻛﺎر ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ ﺣﺎﻟﺖ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ADATEاز رﺟﻴﺴﺘﺮ ADCSRAآﻏﺎز ﻣﻲ ﺷﻮد .ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي ADTSدر رﺟﻴﺴﺘﺮ SFIORاﻧﺘﺨـﺎب ﻣـﻲ
- ١٨٥ -
P a g e | 186
www.eca.ir
ﺷﻮﻧﺪ .زﻣﺎﻧﻲ ﻛﻪ ﭘﺮﭼﻢ ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﻳﻚ ﻣﻲ ﺷﻮد ،ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه Resetﺷـﺪه و ADCﺷـﺮوع ﺑـﻪ اﻧﺠـﺎم ﻳـﻚ ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ ،ﺑﺪﻳﻦ وﺳﻴﻠﻪ ﻣﻲ ﺗﻮان در ﺑﺎزه ﻫﺎي زﻣﺎﻧﻲ ﺛﺎﺑﺖ ADCرا ﺗﺮﻳﮕﺮ ﻧﻤﻮد. ﭘﺮﭼﻢ اﺗﻤﺎم ﻳﻚ ﺗﺒﺪﻳﻞ ﺑﻴﺖ ADIFﻣﻲ ﺑﺎﺷﺪ ،در ﺻﻮرﺗﻲ ﻛﻪ ADCدر وﺿﻌﻴﺖ ﺗﺤﺮﻳـﻚ ﺧﻮدﻛـﺎر ﻗـﺮار ﮔﺮﻓﺘـﻪ و اﻳﻦ ﺑﻴﺖ ﺑﻪ ﻋﻨﻮان ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ اﻧﺘﺨﺎب ﺷﻮد ،ﭘﺲ از اﺗﻤﺎم ﻳﻚ ﺗﻴﺪﻳﻞ ،ﺗﺒﺪﻳﻞ ﺟﺪﻳﺪي ﺷﺮوع ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺮاي رﺳﻴﺪن ﺑﻪ اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻳﺪ ﺑﻴﺖ ﻫﺎي ADTSدر ﺣﺎﻟﺖ Free Runningﻗﺮار ﮔﻴﺮﻧﺪ و ﺑﺮاي ﺷﺮوع ﺗﺒﺪﻳﻞ ﺗﻨﻬﺎ ﻳـﻚ ﺑـﺎر ﻳﻚ ﻛﺮدن ADSCآﻏﺎز ﺷﺪه و ﭘﺲ از آن ﺗﺒﺪﻳﻼت ﻣﺘﻮاﻟﻲ اﻧﺠﺎم ﺧﻮاﻫﺪ ﺷﺪ. ﻫﻤﺎن ﻃﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ADIEﺑﺎﻻ رﻓﺘﻦ ﭘﺮﭼﻢ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ) (ADIFﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﺪه و ﺑﺎ اﺟﺮاي ISRاﻳﻦ ﺑﻴﺖ ﺗﻮﺳﻂ ﺳـﺨﺖ اﻓـﺰار ﭘـﺎك ﺷـﻮد .در ﺻـﻮرﺗﻲ ﻛـﻪ ADCدر وﺿـﻌﻴﺖ Single Conversionﻳﺎ ﺗﻚ ﺗﺒﺪﻳﻞ ﺑﺎﺷﺪ ﺑﺮاي ﺷﺮوع ﺗﺒﺪﻳﻞ ﺑﻌﺪي ﺑﺎﻳﺪ ﭘﺮﭼﻢ ADIFﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑـﺮ روي آن ﭘﺎك ﺷﻮد ،در ﺣﺎﻟﻴﻜﻪ وﺿﻌﻴﺖ Free Runningاﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﺪ ﺑﺪون در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜﻪ ﭘﺮﭼﻢ ADIFﭘـﺎك ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ ﺗﺒﺪﻳﻼت ﻣﺘﻮاﻟﻲ اﻧﺠﺎم ﺧﻮاﻫﺪ ﺷﺪ.
- ١٨٦ -
P a g e | 187
www.eca.ir
ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه و زﻣﺎن ﺑﻨﺪي ﺗﺒﺪﻳﻞ
ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ،ﻣﺪاري ﻛﻪ ﺑﺮ اﺳﺎس ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘﻮاﻟﻲ ﺗﺒﺪﻳﻞ آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل را اﻧﺠﺎم ﻣﻲ دﻫﺪ ﺑﺮاي رﺳﻴﺪن ﺑﻪ ﻣﺎﻛﺰﻳﻤﻢ ،Resolutionﻧﻴﺎز ﺑﻪ ﻳﻚ ﻛﻼك ورودي ﺑﺎ ﻓﺮﻛﺎﻧﺴﻲ ﺑﻴﻦ 50ﺗﺎ 200ﻛﻴﻠﻮﻫﺮﺗﺰ دارد .ﻣﺎژول ADCﺑﺮاي ﺗﺎﻣﻴﻦ ﻛﻼك ﻣﻮرد ﻧﻴﺎز داراي ﻳﻚ ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻣﻘﺪار آن ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي ADPSاز رﺟﻴﺴﺘﺮ ADCSRAﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد .واﺣﺪ ADCﺑﺮاي ﻋﻤﻠﻜﺮد ﺻﺤﻴﺢ ﺑﻪ ﻓﺮﻛﺎﻧﺲ ﻛﻼﻛﻲ ﺑﻴﻦ 50ﺗﺎ 200ﻛﻴﻠﻮﻫﺮﺗﺰ ﻧﻴﺎز دارد و در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻘﺪار آن ﺧﺎرج از اﻳﻦ ﻣﺤﺪوده ﺗﻌﺮﻳﻒ ﺷﻮد ﻣﻤﻜﻦ اﺳﺖ ﻋﻤﻠﻜﺮد ﺻﺤﻴﺤﻲ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ.
- ١٨٧ -
P a g e | 188
www.eca.ir
در ﺻﻮرت اﺳﺘﻔﺎده از Modeﺗﻚ ﺗﺒﺪﻳﻞ ﺑﻪ دﻟﻴﻞ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ ي ADCﻫﺮ ﺗﺒﺪﻳﻞ ﺣﺪود 25ﺳﻴﻜﻞ ﻛﻼك ﻃـﻮل ﻣﻲ ﻛﺸﺪ ،درﺣﺎﻟﻴﻜﻪ در وﺿﻌﻴﺖ Free Runningﻫﺮ ﺗﺒﺪﻳﻞ ﺑﺮاي ﻛﺎﻣﻞ ﺷﺪن ﺣﺪود 13ﻛﻼك زﻣﺎن ﻧﻴﺎز دارد.
ﻓﻴﻠﺘﺮ ﻛﺎﻫﺶ ﻧﻮﻳﺰ ورودي ﻣﺪارات داﺧﻠﻲ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺑﺎ اﻳﺠﺎد ﻧﻮﻳﺰ ﺑﺎﻋﺚ ﻛﺎﻫﺶ دﻗﺖ ﻣﻘﺪار ﺧﻮاﻧﺪه ﺷـﺪه ﺗﻮﺳـﻂ ADCﻣـﻲ ﺷـﻮﻧﺪ ،ﺑـﺮاي ﺑﻬﺒﻮد اﻳﻦ ﻣﺸﻜﻞ ﻣﻲ ﺗﻮان در زﻣـﺎن ﺗﺒـﺪﻳﻞ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟـﺮ را ﺑـﻪ ﻳﻜـﻲ از Modeﻫـﺎي ﻛـﻢ ﺗـﻮان ADC Noise Reductionﻳﺎ Idleﺑﺮد ﺗﺎ ﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﺑﻌﺪ از ﺧﺎﻣﻮش ﺷﺪن CPUاﻧﺠﺎم ﺷﻮد.
ﭘﺮوژه :13اﻧﺪازه ﮔﻴﺮي دﻣﺎ ﺑﺎ ﺳﻨﺴﻮر LM35
*****************************************************/ Project : Temprature Measurement with LM35 : Reza Sepas Yar
Author
Company : Pishro Noavaran Kavosh : ATmega16
Chip type
: 1.000000 MHz
Clock frequency
*****************************************************/ >#include <mega16.h >#include <delay.h >#include <stdio.h #define xtal 8000000 // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x12 ;PORTD - ١٨٨ -
P a g e | 189
www.eca.ir
#endasm #include #define ADC_VREF_TYPE 0xC0 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void main(void) { char lcd_buff[10]; int adc_in; float temp; PORTA=0x00; DDRA=0x00; // ADC initialization // ADC Clock frequency: 45 kHz // ADC Voltage Reference: Int., cap. on AREF - ١٨٩ -
P a g e | 190
www.eca.ir
// ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE; ADCSRA=0x86; // LCD module initialization lcd_init(16); while (1) { adc_in=read_adc(0); temp=adc_in/4; sprintf(lcd_buff,"Temp=%5.1f C",temp); lcd_clear(); lcd_gotoxy(0,0); lcd_puts(lcd_buff); delay_ms(1000); }; }
- ١٩٠ -
P a g e | 191
www.eca.ir
:ﺷﻤﺎﺗﻴﻚ
- ١٩١ -
P a g e | 192
www.eca.ir
ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ
ﻣﺎژول ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ داراي دو ورودي AIN0و AIN1ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ دو ﺑﻪ ﺗﺮﺗﻴﺐ ورودي ﻣﺜﺒـﺖ و ﻣﻨﻔﻲ واﺣﺪ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺑﻮده ﻛﻪ ﻫﻤﺎﻧﻨﺪ ﻳﻚ ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي ﻋﻤﻠﻴﺎﺗﻲ وﻟﺘﺎژ روي اﻳـﻦ دو ﭘﺎﻳـﻪ را ﻣﻘﺎﻳﺴـﻪ ﻛـﺮده و ﻫﻨﮕﺎﻣﻲ ﻛﻪ وﻟﺘﺎژ روي ﭘﺎﻳﻪ ي AIN0ﺑﻴﺸﺘﺮ از وﻟﺘﺎژ AIN1ﺑﺎﺷﺪ ﺧﺮوﺟﻲ آن ﻳﻌﻨﻲ ﺑﻴﺖ ACOﻳﻚ ﻣﻲ ﺷﻮد .اﻳﻦ ﺧﺮوﺟﻲ ﻋﻼوه ﺑﺮ ﻛﺎرﺑﺮدﻫﺎي ﻋﺎدي ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﺗﺮﻳﮕﺮ ﻛﺮدن ورودي Captureﺗﺎﻳﻤﺮ ﻳﻚ ﻧﻴﺰ ﺑﻪ ﻛﺎر رود.
- ١٩٢ -
P a g e | 193
www.eca.ir
رﺟﻴﺴﺘﺮﻫﺎي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ
Special Function IO Register
1
0
3
2
5
4
7
6
ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10
SFIOR ﻧﺎم ﺑﻴﺖ
:Analog Comparator Multiplexer Enableﻣﺎژول ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ اﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﺗـﺎ ورودي ﻣﻨﻔﻲ از ﻃﺮﻳﻖ ﭘﺎﻳﻪ ﻫﺎي ADC0ﺗﺎ ADC7اﻧﺘﺨﺎب ﺷﻮد .در ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ACMEو ﺧـﺎﻣﻮش ﺑﻮدن ) ADCﺑﻴﺖ ADENدر ADCSRAﺻﻔﺮ ﺑﺎﺷﺪ( ،ﺧﺮوﺟﻲ ﻣﺎﻟﺘﻲ ﭘﻠﻜﺴﺮ ADCﺑـﻪ ﻋﻨـﻮان ورودي ﻣﻨﻔـﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه اﻧﺘﺨﺎب ﻣﻲ ﺷﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﭘﺎﻳﻪ AIN1ورودي ﻣﻨﻔﻲ ﺧﻮاﻫﺪ ﺑﻮد.
Analog Comparator Control and Status Register
0
1
2
3
4
5
6
7
ACSR
ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0ﻧﺎم ﺑﻴﺖ
] :Analog Comparator Interrupt Mode Select[1:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ ﻛـﻪ ﻛـﺪاﻣﻴﻚ از روﻳﺪادﻫﺎي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ وﻗﻔﻪ ي آن را ﺗﺮﻳﮕﺮ ﻣﻲ ﻛﻨﺪ.
- ١٩٣ -
P a g e | 194
www.eca.ir
وﺿﻌﻴﺖ وﻗﻔﻪ
ACIS0
ACIS1
وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه در Toggleﺧﺮوﺟﻲ
0
0
رزرو ﺷﺪه
1
0
0
1
وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه در ﻟﺒـﻪ ي ﭘـﺎﻳﻴﻦ روﻧـﺪه ي ﺧﺮوﺟﻲ وﻗﻔﻪ ي ﻣﻘﺎﻳﺴـﻪ ﻛﻨﻨـﺪه در ﻟﺒـﻪ ي ﺑـﺎﻻ روﻧـﺪه ي 1
1
ﺧﺮوﺟﻲ
: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 | 195
www.eca.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ﻳـﻚ ﺑﺎﺷـﺪ ﭘﻴﻦ AIN1ورودي ﻣﻨﻔﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﺧﻮاﻫﺪ ﺑﻮد.
ورودي ﻣﻨﻔﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ]ACME ADEN MUX[2:0 AIN1
xxx
x
0
AIN1
xxx
1
x
- ١٩٥ -
P a g e | 196
www.eca.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> // Analog Comparator interrupt service routine interrupt [ANA_COMP] void ana_comp_isr(void) { PORTA=PORTA^0x01; } // Declare your global variables here void main(void) { // Declare your local variables here
- ١٩٦ -
P a g e | 197
www.eca.ir
PORTA=0x00; DDRA=0x01; // Analog Comparator initialization // Analog Comparator: On // Interrupt on Output Toggle // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x08; SFIOR=0x00; // Global enable interrupts #asm("sei") while (1); }
:ﺷﻤﺎﺗﻴﻚ
- ١٩٧ -
P a g e | 198
www.eca.ir
- ١٩٨ -
P a g e | 199
www.eca.ir
SPI Bus
ﺑﻮده و ﺑﻮﺳـﻴﻠﻪ ﺷـﺮﻛﺖSerial Peripheral Interface ﻛﻪ ﻳﻚ اﺳﺘﺎﻧﺪارد ﺳﺮﻳﺎل ﺳﻨﻜﺮون ﻣﻲ ﺑﺎﺷﺪ ﺳﺮﻧﺎمSPI اﻳﻦ اﺳﺘﺎﻧﺪارد ﺑﻪ ﻟﺤﺎظ ﭘﺸﺘﻴﺒﺎﻧﻲ از ﺳﺮﻋﺖ ﻫﺎي ﺑﺎﻻ ﻧﻪ ﺗﻨﻬﺎ در ﻛﺎرﺑﺮدﻫﺎي اﻧﺪازه ﮔﻴـﺮي.ﻣﻮﺗﻮروﻻ ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ ﻧﻴـﺰ ﻣـﻮرد... ﻛﺎﻧـﺎل ﻫـﺎي ارﺗﺒـﺎﻃﻲ و، ﭘﺮدازش ﺳﻴﮕﻨﺎل دﻳﺠﻴﺘﺎل،ﺑﻠﻜﻪ در ﻣﻮاردي ﻧﻈﻴﺮ اﻧﺘﻘﺎل ﺣﺠﻢ ﺑﺎﻻي اﻃﻼﻋﺎت ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳـﺖ و در ﻧﺘﻴﺠـﻪ اﻣﻜـﺎنSPI ﺳﺮﻋﺖ ﭼﻨﺪ ﻣﮕﺎﺑﻴﺖ ﺑﺮ ﺛﺎﻧﻴﻪ ﺑﻪ راﺣﺘﻲ ﺗﻮﺳﻂ.اﺳﺘﻔﺎده واﻗﻊ ﻣﻲ ﺷﻮد .اﻧﺘﻘﺎل ﺻﻮت ﻓﺸﺮده ﻧﺸﺪه و ﺗﺼﻮﻳﺮ ﻓﺸﺮده ﺷﺪه وﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ : آورده ﺷﺪه اﺳﺖSPI در زﻳﺮ ﻟﻴﺴﺖ ﺑﺮﺧﻲ از وﺳﺎﻳﻞ
ﻗﻄﻌﻪ
ﻋﻤﻠﻜﺮد
SSM2163
8x2 Audio Mixer
63dB attenuation in 1dB steps
Analog Devices
AD7303
DAC
8Bit clock rate up to 30MHz
Analog Devices
AD7811
ADC
10Bit 4/8 channel 300ksps
Analog Devices
AD7816
ﻣﺸﺨﺼﺎت
ADC + Temperature Sensor 10Bit
AD7858
ADC
AD8400
Digital Pot
ﺷﺮﻛﺖ ﺳﺎزﻧﺪه
Analog Devices
12Bit, 8 channel 200ksps 1/2/4 channel 256 positions 1, 10, 50 100kOhm 10MHz update rate
Analog Devices Analog Devices
Low voltage operation 1.8V/2.7V/5.0V AT25010
EEPROM
block write protection 100 years data
ATMEL
retention AT45D011
FLASH
5V 1MBit 5MHz clock rate
ATMEL
AT45D021
FLASH
5V 2MBit 10MHz
ATMEL
AT45DB021
FLASH
2.7V 2MBit 5MHz clock rate
ATMEL
- ١٩٩ -
P a g e | 200
www.eca.ir AT45DB041
FLASH
5V 4MBit 10MHz
ATMEL
AT45D081
FLASH
5V 8MBit 10MHz
ATMEL
AT45DB161
FLASH
2.7V 16MBit 13MHz
ATMEL
ADS1210
ADC
24Bit
BURR-BROWN
ADS7835
ADC
12Bit low power 500ksps
BURR-BROWN
ADS7846
Touch-screen controller
2.2V to 5.25V
BURR-BROWN
DS1267
Digital potentiometer
DS1305
Dual 10k, 50k and 100k
DALLAS
RTC
96-byte User-RAM
DALLAS
DS1306
RTC
96-byte User-RAM
DALLAS
DS1722
Digital Thermometer
-55 °C to 120 °C accuracy +/- 2°C
DALLAS
DS1844
Digital Pot
4 channel, linear 64 positions
DALLAS
NM25C020
EEPROM
KP100
Pressure Sensor
Range 60 ... 130kPa
82527
CAN Controller
Flexible CPU-interface CAN 2.0
MAX349
MUX
8-to-1 dual 4-to-1
Maxim
MAX504
DAC
10Bit low power internal reference
Maxim
MAX522
DAC
8Bit 5MHz
Maxim
MAX535
DAC
13Bit Schmitt-trigger inputs
Maxim
MAX3100
UART
Up to 230kBaud Schmitt-trigger inputs
Maxim
MAX4548
Switch
Triple 3x2-crosspoint switch
Maxim
MAX4550
Switch
Dual 4x2 cross point switch
Maxim
MAX4562
Switch
Clickless Audio/Video Switch
Maxim
MAX4571
Switch
Audio/Video
Maxim
MAX4588
MUX
Dual 4 channel 180MHz bandwidth
Maxim
MAX7219
LED display driver
25AA040
EEPROM
data retention >40 years hard- and software write protection
8-digit 10MHz clock rate digital/analog brightness control 4k max. 3MHz clock data retention >200
- ٢٠٠ -
Fairchild Infineon Intel
Maxim Microchip
P a g e | 201
www.eca.ir years MCP3001
ADC
MCP2510
CAN Controller
MC68HC86T1
RTC + RAM
CLC5506
10Bit, 2.7V to 5V 200ksps @ 5V low power
LCD Controller
LM74
Temperature Sensor
MM5483
LCD Controller
USBN9602
0... 8 Bytes message frame 32x8Bit static-RAM
GTA (Gain Trim Amplifier) 600MHz bandwidth control range 16dB
COP472-3
MM58342
Programmable Bit rate up tp 1MHz
High Voltage Display Driver USB Controller
Keine SDO-Leitung
12Bit + sign 3V to 5V -55 °C to +150 °C
31 segment outputs cascadeable
35V max cascadeable
DMA-Support Several FIFOs
Microchip Microchip Motorola National Semiconductor National Semiconductor National Semiconductor National Semiconductor National Semiconductor National Semiconductor
SPI ﻧﺤﻮه ﻋﻤﻠﻜﺮد
:اﻳﻦ اﺳﺘﺎﻧﺪارد ﺑﺮاي اﻳﺠﺎد ﻳﻚ ارﺗﺒﺎط ﺑﻪ ﭼﻬﺎر ﺧﻂ ارﺗﺒﺎﻃﻲ ﻧﻴﺎز دارد Master
Slave
SCK
SCK
MOSI MISO
MOSI MISO
SS
SS
- ٢٠١ -
P a g e | 202
www.eca.ir
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻼﺣﻈﻪ ﻣﻲ ﺷﻮد اﻳﻦ ﭼﻬﺎر ﺧﻂ MISO ،MOSI ،SCKو SSﺑـﻮده ﻛـﻪ ﺑـﻪ ﺗﺮﺗﻴـﺐ ﺧـﻂ ﻛـﻼك، .Master in slave out ،Master out slave inو Slave Selectﻣـﻲ ﺑﺎﺷـﻨﺪ .ﻧﺤـﻮه ي ﺗﻌﺎﻣـﻞ Masterو Slaveدر ﺷﻜﻞ زﻳﺮ ﻧﺸﺎن داده ﺷﺪه اﺳﺖ:
ﺳﻴﺴﺘﻢ ﺷﺎﻣﻞ دو Shift Registerو ﻳﻚ ﻣﻮﻟﺪ ﻛﻼك ﻣﻲ ﺑﺎﺷﺪ Master .ﺑﺎ ﺻﻔﺮ ﻛﺮدن ﺧﻂ SSاز Slaveﻣـﻮرد ﻧﻈـﺮ ،ﭼﺮﺧـﻪ ي ارﺗﺒـﺎﻃﻲ را آﻣـﺎده ﻣـﻲ ﻛﻨـﺪ Master .و Slaveداده ي ﻣـﻮرد ﻧﻈـﺮ ﺑـﺮاي ارﺳـﺎل را در Shift Registerﻗﺮار داده و Masterﺑﺎ اﻳﺠﺎد ﻛﻼك در ﺧﻂ SCKﻣﺒﺎدﻟﻪ ي داده را آﻏـﺎز ﻣـﻲ ﻛﻨـﺪ .اﻃﻼﻋـﺎت از ﭘـﻴﻦ MOSIدر Masterﺧﺎرج ﺷـﺪه و وارد ﭘـﻴﻦ MOSIاز Slaveﻣـﻲ ﺷـﻮد .در ﻃـﺮف Slaveﻧﻴـﺰ داده از ﭘـﻴﻦ MISOﺧﺎرج ﺷﺪه و وارد MISOاز Masterﻣﻲ ﺷﻮد .ﺑﻌﺪ از اﺗﻤـﺎم ارﺳـﺎل ﻳـﻚ ،Packetﻣﺠـﺪدا ﺧـﻂ SS
ﺗﻮﺳﻂ Masterﻳﻚ ﺷﺪه و ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ Slaveﺑﺎ Masterﺳﻨﻜﺮون
- ٢٠٢ -
ﻣﻲ ﺷﻮد.
P a g e | 203
www.eca.ir
رﺟﻴﺴﺘﺮﻫﺎي SPI
ﻣﺎژول SPIداراي ﺳﻪ رﺟﻴﺴﺘﺮ SPSR ،SPDRو SPCRﺑﻮده ﻛﻪ ﺑﻪ ﺗﺮﺗﻴﺐ رﺟﻴﺴﺘﺮﻫﺎي داده ،وﺿﻌﻴﺖ و ﻛﻨﺘﺮل ﻣﻲ ﺑﺎﺷﻨﺪ.
SPI Data Register
0
1
2
3
5
4
6
LSB
7
SPDR
MSB
ﻧﺎم ﺑﻴﺖ
ﻧﻮﺷﺘﻦ ﺑﺮ روي اﻳﻦ رﺟﻴﺴﺘﺮ ﺷﺮوع اﻧﺘﻘﺎل داده را ﻣﻮﺟﺐ ﺧﻮاﻫﺪ ﺷﺪ و ﺧﻮاﻧﺪن آن ﻣﻮﺟﺐ ﺧﻮاﻧـﺪن داده ي ﻣﻮﺟـﻮد در ﺑﺎﻓﺮ درﻳﺎﻓﺖ ﺧﻮاﻫﺪ ﺷﺪ.
SPI Status Register
0
1
2
3
4
5
SPI2X
-
-
-
-
-
6
7
SPIF WCOL
SPSR ﻧﺎم ﺑﻴﺖ
:Double SPI Speed Bitﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي اﻳﻦ ﺑﻴﺖ در ﺻـﻮرﺗﻴﻜﻪ ﻣـﺎژول SPIدر وﺿـﻌﻴﺖ Master ﺑﺎﺷﺪ ﻓﺮﻛﺎﻧﺲ ﻛﻼك ﻣﻮﺟﻮد روي ﭘﻴﻦ SCKدو ﺑﺮاﺑﺮ ﺧﻮاﻫﺪ ﺷﺪ. - ٢٠٣ -
P a g e | 204
www.eca.ir
:Write COLlision Flagاﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻳﻚ ﺧﻮاﻫﺪ ﺷﺪ ﻛﻪ در ﺣﻴﻦ اﻧﺘﻘﺎل ﻳـﻚ ﺑﺎﻳـﺖ ﺑـﺮ روي رﺟﻴﺴـﺘﺮ SPDRﻣﻘﺪاري ﻧﻮﺷﺘﻪ ﺷﻮد .ﺑﺎ اوﻟﻴﻦ ﺧﻮاﻧﺪن رﺟﻴﺴﺘﺮ SPSRاﻳﻦ ﺑﻴﺖ ﭘﺎك ﻣﻲ ﺷﻮد.
:SPI Interrupt Flagاﻳﻦ ﺑﻴﺖ در دو ﺣﺎﻟﺖ ﻳﻚ ﻣﻲ ﺷﻮد .1 :ﺑﺎ اﺗﻤﺎم ارﺳﺎل ﻳﻚ ﺑﺎﻳﺖ اﻳﻦ ﭘﺮﭼﻢ ﻳﻚ ﺷـﺪه و در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ SPIEو ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ ﻳﻚ ﺑﺎﺷﻨﺪ اﺗﻤﺎم ﻋﻤﻠﻴﺎت ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠـﺎد ﻳـﻚ وﻗﻔـﻪ ﺷﻮد .2 .ﭘﻴﻦ SSاز ﺧﺎرج ﺗﻮﺳﻂ ﻳﻚ وﺳﻴﻠﻪ ي دﻳﮕﺮ زﻣﻴﻦ ﺷﻮد ،اﻳﻦ ﺑﻪ ﻣﻌﻨﺎي از دﺳﺖ دادن ﺣﺎﻛﻤﺖ ﺑﺎس ﺑـﻮده و اﻳﻦ وﺿﻌﻴﺖ ﺑﺎ ﻳﻚ ﺷﺪن ﺑﻴﺖ SPIFاﻋﻼم ﻣﻲ ﺷﻮد .ﺑﺎ اﺟﺮاي ISRﻳﺎ ﺧﻮاﻧﺪن رﺟﻴﺴﺘﺮ وﺿﻌﻴﺖ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﻣﻲ ﺷﻮد.
SPI Control Register
0
1
2
4
3
5
6
7
SPCR
SPIE SPE DORD MSTR CPOL SPHA SPR1 SPR0ﻧﺎم ﺑﻴﺖ
:SPI Clock Rate Select 1 and 0اﻳﻦ دو ﺑﻴﺖ ﻧﺮخ ﻛﻼك SCKرا ﻛﻪ Masterاﻳﺠـﺎد ﻣـﻲ ﻛﻨـﺪ ﻣﻄـﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ.
- ٢٠٤ -
P a g e | 205
www.eca.ir
ﻓﺮﻛﺎﻧﺲ SPI2X SPR1 SPR0 SCK f osc /4
0
0
0
f osc /16
1
0
0
f osc /64
0
1
0
f osc /128
1
1
0
f osc /2
0
0
1
f osc /8
1
0
1
f osc /32
0
1
1
f osc /64
1
1
1
Clock Phaseو :Clock Polarityاﻳﻦ دو ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ زﻣـﺎن ﺑﻨـﺪي اﻧﺘﻘـﺎل و درﻳﺎﻓـﺖ داده روي ﺑﺎس SPIرا ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ:
ﻟﺒﻪ ي ﻧﻤﻮﻧﻪ ﺑﺮداري ﻟﺒﻪ ي ﺷﻴﻔﺖ CPOL CPHA ﺑﺎﻻ روﻧﺪه
ﭘﺎﻳﻴﻦ روﻧﺪه
0
0
ﭘﺎﻳﻴﻦ روﻧﺪه
ﺑﺎﻻ روﻧﺪه
1
0
ﭘﺎﻳﻴﻦ روﻧﺪه
ﺑﺎﻻ روﻧﺪه
0
1
ﺑﺎﻻ روﻧﺪه
ﭘﺎﻳﻴﻦ روﻧﺪه
1
1
- ٢٠٥ -
P a g e | 206
www.eca.ir
:Master/Slave Selectﺑﺎ ﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﻣﺎژول SPIدر وﺿﻌﻴﺖ Masterﻗﺮار ﻣﻲ ﮔﻴﺮد. :Data Orderﺑﺎ ﻳﻚ ﺑﻮدن اﻳﻦ ﺑﻴﺖ اﺑﺘﺪا MSBروي ﺑﺎس ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد و در ﺻﻮرت ﺻﻔﺮ ﺑﻮدن اﺑﺘﺪا .LSB :SPI Enableﺑﻴﺖ ﻓﻌﺎل ﺳﺎز SPI :SPI Interrupt Enableﺑﻴﺖ ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ي SPI
ﻧﺤﻮه ي اﻧﺘﻘﺎل داده در SPI
وﻗﺘﻲ ﻣﺎژول SPIﺑﻪ ﻋﻨﻮان Masterﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه اﺳﺖ ﺧﻂ SSرا ﺑﺼﻮرت ﺧﻮدﻛـﺎر ﻛﻨﺘـﺮل ﻧﻤـﻲ ﻛﻨـﺪ و اﻳـﻦ وﻇﻴﻔﻪ ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ،ﻗﺒﻞ از آﻏﺎز ﻳﻚ ﭼﺮﺧﻪ ي ارﺗﺒﺎﻃﻲ اﻧﺠﺎم ﺷﻮد .ﭘﺲ از ﺻـﻔﺮ ﻛـﺮدن ، SSﻧﻮﺷـﺘﻦ ﻳـﻚ ﺑﺎﻳﺖ در رﺟﻴﺴﺘﺮ داده ) (SPDRﺑﺎﻋﺚ اﻳﺠﺎد ﻛﻼك ﺗﻮﺳﻂ واﺣﺪ ﺗﻮﻟﻴﺪ ﻛﻼك ﺧﻮاﻫﺪ ﺷـﺪ و ﺑـﺎ ﻫـﺮ ﭘـﺎﻟﺲ ،داده ي ﻣﻮﺟﻮد در Shift Registerﻫﺎي Masterو Slaveﻳﻚ ﺑﻴﺖ ﺷﻴﻔﺖ داده ﺷﺪه و ﭘﺲ از 8ﭘﺎﻟﺲ ﺳـﺎﻋﺖ ﭘـﺮﭼﻢ SPIFﺑﻪ ﻧﺸﺎﻧﻪ ي اﺗﻤﺎم ارﺳﺎل ﻳﻚ ﻣﻲ ﺷﻮد .ﭘﺲ از اﻳﻦ Masterﻣﻲ ﺗﻮاﻧـﺪ ﺑـﺮاي ارﺳـﺎل ﺑﺎﻳـﺖ ﺑﻌـﺪي آن را در SPDRﻧﻮﺷﺘﻪ و ﻳﺎ ﺑﻪ ﻧﺸﺎﻧﻪ ي اﺗﻤﺎم ارﺳﺎل ﺧﻂ SSرا ﻳﻚ ﻧﮕﺎه دارد.
- ٢٠٦ -
P a g e | 207
www.eca.ir
در ﻧﻘﻄﻪ ي ﻣﻘﺎﺑﻞ زﻣﺎﻧﻴﻜﻪ ﻣﺎژول SPIدر ﻧﻘﺶ Slaveﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه اﺳﺖ ،ﻣﺎداﻣﻴﻜـﻪ ﺧـﻂ SSﻳـﻚ اﺳـﺖ ﭘـﻴﻦ MISOدر وﺿﻌﻴﺖ tri-statedﻣﻲ ﺑﺎﺷﺪ .در اﻳﻦ ﺷﺮاﻳﻂ ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ رﺟﻴﺴﺘﺮ SPDRﺗﻮﺳـﻂ Slaveﺑـﺮوز ﺷﻮد اﻣﺎ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺧﻂ SSﺗﻮﺳﻂ Masterﺻﻔﺮ ﻧﺸﻮد اﻧﺘﻘﺎل اﻧﺠـﺎم ﻧﺨﻮاﻫـﺪ ﺷـﺪ .ﭘـﺲ از Lowﺷـﺪن SSو اﺗﻤﺎم درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ ﭘﺮﭼﻢ SPIFﻳﻚ ﺷﺪه و در ﺻﻮرت ﻳﻚ ﺑﻮدن SPIEو ﺑﻴـﺖ ،Iاﻳـﻦ روﻳـﺪاد ﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد .ﭘﺲ از اﻳﻦ ﻣﻤﻜﻦ اﺳﺖ Slaveداده ي ﺟﺪﻳﺪي را در SPDRﻗﺮار دﻫﺪ ﻣﻨﺘﻬﺎ ﺑﺎﻳـﺪ ﻗﺒـﻞ از آن داده ي درﻳﺎﻓﺘﻲ را ﺑﺨﻮاﻧﺪ.
ارﺗﺒﺎط ﺷﺒﻜﻪ اي در SPI ﻣﻄﺎﺑﻖ ﺗﺼﻮﻳﺮ زﻳﺮ ﺑﺎ اﺳﺘﻔﺎده از ﭘﻴﻦ SSﻣﻲ ﺗـﻮان ﺗﻌـﺪادي Slaveرا ﻛﻨﺘـﺮل ﻧﻤـﻮد Master .ﺑﺎﻳـﺪ ﺗﻨﻬـﺎ ﭘـﻴﻦ SS
Slaveاي را ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﺑﺎ آن ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﺪ ﺻﻔﺮ ﻛﻨﺪ و ﺑﻘﻴﻪ را ﻳﻚ ﻧﮕﻪ دارد.
- ٢٠٧ -
P a g e | 208
www.eca.ir
ﺗﺎﺑﻊ )( spiدر CodeVision اﻋﻼن اﻳﻦ ﺗﺎﺑﻊ در ﻓﺎﻳﻞ spi.hﺑﻮده و ﻧﺤﻮه ي ﻋﻤﻠﻜﺮد آن در ﻓﺎﻳﻞ spi.libﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
)unsigned char spi(unsigned char data { ;SPDR=data ;)while ((SPSR & (1<<SPIF))==0 ;return SPDR } ﺑﻨﺎﺑﺮاﻳﻦ آﻧﭽﻪ اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ ﻋﻨﻮان آرﮔﻮﻣﺎن درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ روي ﺑﺎس SPIﻗﺮار ﻣﻲ دﻫﺪ و ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ آن ﻣﻘـﺪار ﺧﻮاﻧﺪه ﺷﺪه از ﺑﺎس اﺳﺖ .ﻗﺒﻞ از اﺳﺘﻔﺎده از اﻳﻦ ﺗﺎﺑﻊ ﺑﺎﻳﺪ SPIﺑﻮﺳﻴﻠﻪ ي رﺟﻴﺴﺘﺮﻫﺎي ﻛﻨﺘﺮل و وﺿﻌﻴﺖ ﺗﻨﻈﻴﻢ ﺷﺪه ﺑﺎﺷﺪ. ﻣﺜﺎل) :ارﺗﺒﺎط دو ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ از ﻃﺮﻳﻖ (SPI ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو :Master >#include <mega16.h >#include <delay.h
// SPI functions >#include <spi.h
)void main(void {
- ٢٠٨ -
P a g e | 209
www.eca.ir
unsigned char incoming;
// SCK=Out MISO=In MOSI=Out SS=Out PORTB=0b00000000; DDRB=0b10110000;
// 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); } } :Slave ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو
#include <mega16.h> #include <delay.h> - ٢٠٩ -
P a g e | 210
www.eca.ir
// SPI functions #include <spi.h>
void main(void) {
unsigned char incoming;
// SCK=In MISO=Out MOSI=In SS=In DDRB=0b01000000;
// SPI initialization // SPI Type: Slave // SPI Clock Rate: 500.000 kHz // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: MSB First // SPI Enable: True SPCR=0x61;
while(1) { incoming=spi(0x33); delay_ms(50); } } - ٢١٠ -
P a g e | 211
www.eca.ir
Modeﻫﺎي Sleepو ﺗﺎﻳﻤﺮ Watchdog
ﺑﻪ ﻣﻨﻈﻮر ﻣﺪﻳﺮﻳﺖ ﻳﻬﻴﻨﻪ ي ﺗﻮان ﻣﺼﺮﻓﻲ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎي AVRداراي ﺣﺪاﻛﺜﺮ Mode 6ﺧﻮاب ﻣﻲ ﺑﺎﺷﻨﺪ .ﺑـﺮاي ورود ﺑﻪ ﻫﺮﻳﻚ از 6وﺿﻌﻴﺖ ﺧﻮاب ﺑﺎﻳﺪ ﺑﻴﺖ SEاز رﺟﻴﺴﺘﺮ MCUCEﻳﻚ ﺷﺪه و دﺳﺘﻮراﻟﻌﻤﻞ SLEEPاﺟﺮا ﺷﻮد .ﺑﻴﺖ ﻫﺎي ] SM[2:0از اﻳﻦ رﺟﻴﺴﺘﺮ ﺗﻌﻴﻴﻦ ﻣـﻲ ﻛﻨﻨـﺪ ﻛـﻪ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟـﺮ وارد ﻛـﺪاﻣﻴﻚ از Modeﻫـﺎي ﻛـﻢ ﻣﺼﺮف ﺷﻮد .در ﺣﻴﻦ ﺧﻮاب اﮔﺮ وﻗﻔﻪ اي روي دﻫﺪ ﻣﻴﻜﺮو از اﻳﻦ وﺿﻌﻴﺖ ﺧﺎرج ﺷﺪه و ﺑﻌﺪ از ﮔﺬﺷـﺖ 4ﺳـﻴﻜﻞ ﺑﻪ ﻋﻼوه ي زﻣﺎن ،Startupروﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ را اﺟﺮا ﻛﺮده و ﭘﺲ از آن دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪ از SLEEPرا اﺟـﺮا ﺧﻮاﻫﺪ ﻛﺮد.
MCU Control Register 0
1
2
3
4
5
6
7
SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00
MCUCR ﻧﺎم ﺑﻴﺖ
] :Sleep Mode Select Bits[2:0اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻳﻜﻲ از 6وﺿﻌﻴﺖ SLEEPرا اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﻨﺪ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ Modeﻫﺎي Standbyو Extended Standbyﻓﻘﻂ ﺑﺎ ﻣﻨﺒﻊ ﻛﻼك ﻛﺮﻳﺴﺘﺎل ﻳﺎ رزوﻧﺎﺗﻮر ﺧﺎرﺟﻲ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻣﻲ ﺑﺎﻧﺪ.
- ٢١١ -
P a g e | 212
www.eca.ir
وﺿﻌﻴﺖ ﺧﻮاب
SM2 SM1 SM0 Idle
0
0
0
ADC Noise Reduction
1
0
0
Power-down
0
1
0
Power-save
1
1
0
رزرو ﺷﺪه
0
0
1
رزرو ﺷﺪه
1
0
1
Standby
0
1
1
Extende Standby
1
1
1
:Sleep Enableﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮر SLEEPﺑﺎﻳﺪ اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺷﺪه ﺑﺎﺷﺪ.
Modeﻫﺎي ﺧﻮاب
•
:Idle Modeدر اﻳﻦ وﺿﻌﻴﺖ CPUﻣﺘﻮﻗـﻒ ﺷـﺪه اﻣـﺎ ,SPI, USARTﻣﻘﺎﻳﺴـﻪ ﻛﻨﻨـﺪه ي آﻧـﺎﻟﻮگ،
,ADC, TWIﺗﺎﻳﻤﺮﻫﺎ Watchdog ،و ﺳﻴﺴﺘﻢ وﻗﻔﻪ ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ دﻫﻨﺪ .اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻋﺚ ﻣﻲ ﺷـﻮد ﻛـﻼك CPUو ﻛﻼك Flashﻣﺘﻮﻗﻒ ﺷﺪه اﻣﺎ ﺑﻘﻴﻪ ي ﻣﻨﺎﺑﻊ ﻛﻼك ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ دﻫﻨﺪ .ﻣﻨﺎﺑﻊ وﻗﻔﻪ ي داﺧﻠﻲ و ﺧﺎرﺟﻲ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺎﻋﺚ ﺧﺮوج ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ از وﺿﻌﻴﺖ ﺧﻮاب ﺷﻮﻧﺪ.
- ٢١٢ -
P a g e | 213
www.eca.ir
•
CPU :ADC Noise Reduction Modeﻣﺘﻮﻗﻒ ﺷﺪه اﻣﺎ ﻣﺎژول ﻫﺎي ,ADCوﻗﻔﻪ ﻫﺎي ﺧـﺎرﺟﻲ،
ﺗﺸﺨﻴﺺ آدرس ,TWIﺗﺎﻳﻤﺮ 2و Wathdogﺑﻪ ﻛﺎر ﺧﻮد اداﻣـﻪ ﻣـﻲ دﻫﻨـﺪ .در ﺻـﻮرت ﻓﻌـﺎل ﺑـﻮدن ADCﺑـﻪ ﻣﺤﺾ ورود ﺑﻪ اﻳﻦ Modeاﻧﺠﺎم ﺗﺒﺪﻳﻞ ﺷﺮوع ﺷﺪه و ﺑﺎ اﺗﻤﺎم آن از اﻳﻦ وﺿﻌﻴﺖ ﺧﺎرج ﻣﻲ ﺷـﻮد .ﻣﻨـﺎﺑﻊ وﻗﻔـﻪ ي ﻣﺎژول ﻫﺎﻳﻲ ﻛﻪ در اﻳﻦ Modeﻓﻌﺎﻟﻨﺪ و ﻫﻤﭽﻨﻴﻦ Resetﺧـﺎرﺟﻲ Reset ,ﺗـﺎﻳﻤﺮ Wachdogو Brown-out Resetﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺎﻋﺚ ﺧﺮوج از اﻳﻦ Modeﺷﻮﻧﺪ.
•
: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 | 214
www.eca.ir
ﺗﻮاﺑﻊ ﻣﺪﻳﺮﻳﺖ ﺗﻮان در CodeVision
اﻋﻼن اﻳﻦ ﺗﻮاﺑﻊ در ﻓﺎﻳﻞ sleep.hﻣﻲ ﺑﺎﺷﺪ .ﺷﺎﻣﻞ ﻣﻮارد زﻳﺮ ﻣﻲ ﺑﺎﺷﻨﺪ. )( :sleep_enableاﻳﻦ ﺗﺎﺑﻊ ﻓﻌﺎل ﺳﺎز ورود ﺑﻪ Modeﻫﺎي ﺧﻮاب ﺑﻮده و ﻗﺒﻞ از اﺳﺘﻔﺎده از ﺳﺎﻳﺮ ﺗﻮاﺑﻊ ﻣﺪﻳﺮﻳﺖ ﺗﻮاﺑﻊ ﺑﺎﻳﺪ اﺟﺮا ﺷﻮد. )( :sleep_disableاﻳﻦ ﺗﺎﺑﻊ ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن Modeﻫﺎي ﺧﻮاب ﺑﻪ ﻛﺎر ﻣﻲ رود. )( standby() ،powersave() ،powerdown() ،idleو )( :extended_standbyﺑﺎ اﺟﺮاي ﻫﺮﻳﻚ از اﻳﻦ ﺗﻮاﺑﻊ ﻣﻴﻜﺮو وارد Modeﻛﻢ ﺗﻮان ﻣﺮﺑﻮﻃﻪ ﺧﻮاﻫﺪ ﺷﺪ.
ﺗﺎﻳﻤﺮ Watchdog
ﺗﺎﻳﻤﺮ Watchdogاز ﻳﻚ اﺳﻴﻼﺗﻮر داﺧﻠﻲ ﻣﺠﺰا ﺑﺎ ﻓﺮﻛﺎﻧﺲ 1ﻣﮕﺎﻫﺮﺗﺰ ﻛﻼك درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺑـﺎ ﺗﻨﻈـﻴﻢ ﭘـﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ي ﺗﺎﻳﻤﺮ ،Watchdogﻓﻮاﺻﻞ ﺑﻴﻦ ﻫﺮ Resetﺑـﺎ ﺑﻴـﺖ ﻫـﺎي ] WDP[0:2ﻗﺎﺑـﻞ ﺗﻨﻈـﻴﻢ اﺳـﺖ .ﺑـﺎ دﺳﺘﻮراﻟﻌﻤﻞ WDRﻳﺎ Resetﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺗﺎﻳﻤﺮ Reset ,Watchdogﺷﺪه و ﻧﺮم اﻓﺰار ﺑﺎﻳـﺪ در ﻓﻮاﺻـﻞ ﻣﻨﺎﺳﺐ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺗﺎﻳﻤﺮ را Resetﻛﺮده ﺗﺎ ﻣﺎﻧﻊ Resetﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺷﻮد .ﺑﻠـﻮك دﻳـﺎﮔﺮام ﺗﺎﻳﻤﺮ Watchdogدر ﺗﺼﻮﻳﺮ زﻳﺮ دﻳﺪه ﻣﻲ ﺷﻮد.
- ٢١٤ -
P a g e | 215
www.eca.ir
Watchdog Timer Control Register
WDTCR 7 6 5 ﻧﺎم ﺑﻴﺖ
4
3
2
1
0
- - - WDTOE WDE WDP2 WDP1 WDP0
ﻓﻌﺎل اﺳﺖ اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺿﺮﻳﺐ ﺗﻘﺴﻴﻢWatchdog زﻣﺎﻧﻲ ﻛﻪ ﺗﺎﻳﻤﺮ:Watchdog Timer Prescaler[2:0] .ﺗﺎﻳﻤﺮ را ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ
- ٢١٥ -
P a g e | 216
www.eca.ir
Watchdog Turn-off Enableو :Watchdog Enableﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي ﺑﻴﺖ WDEﺗﺎﻳﻤﺮ Watchdogﻓﻌﺎل ﺷﺪه و ﺑﺎ ﭘﺎك ﻛﺮدن آن ﺗﺎﻳﻤﺮ ﻏﻴﺮ ﻓﻌﺎل ﻣﻲ ﺷﻮد .اﮔﺮﭼﻪ ﻓﻌﺎل ﻛﺮدن ﺗﺎﻳﻤﺮ ﺑﻪ ﺳﺎدﮔﻲ و ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي WDEاﻧﺠﺎم ﻣﻲ ﺷﻮد اﻣﺎ ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن آن ﺑﺎﻳﺪ ﻣﺮاﺣﻞ زﻳﺮ ﺑﻪ ﺗﺮﺗﻴﺐ اﻧﺠﺎم ﺷﻮد: .1ﻫﻤﺰﻣﺎن ﺑﻴﺖ ﻫﺎي WDTOEو WDEرا ﻳﻚ ﻛﻨﻴﺪ) .ﺑﻴﺖ WDEﻋﻠﻴﺮﻏﻢ اﻳﻨﻜﻪ ﻗﺒﻼ ﻳﻚ ﺑﻮده ﺑﺎﺷﺪ ﺑﺎﻳﺪ ﻣﺠﺪدا ﻳﻚ ﺷﻮد(. .2ﺗﺎ ﭼﻬﺎر ﺳﻴﻜﻞ ﺑﻌﺪ ﻧﺮم اﻓﺰار ﻓﺮﺻﺖ دارد ﺗﺎ WDEرا ﭘﺎك ﻛﻨﺪ.
- ٢١٦ -
P a g e | 217
www.eca.ir
ﭘﻴﻮﺳﺖ :1ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴﺘﺮﻫﺎي I/O
ﻫﺮ ﻳﻚ از ﭼﻬﺎر ﭘﻮرت C ،B ،Aو Dﻗﻄﻌﻪ ي ATmega16داراي ﺳﻪ رﺟﻴﺴﺘﺮ PORTx ،DDRxو PINx ﺑﻮده ﻛﻪ xﺣﺮف ﻣﺮﺑﻮط ﺑﻪ ﭘﻮرت ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل رﺟﻴﺴﺘﺮﻫﺎي اوﻟﻴﻦ ﭘﻮرت PORTA ،DDRA ،و PINAﺑﻮده ﻛﻪ وﻇﺎﻳﻒ ﻫﺮ ﻳﻚ در ذﻳﻞ آﻣﺪه اﺳﺖ:
رﺟﻴﺴﺘﺮ :Data Direction اﻳﻦ رﺟﻴﺴﺘﺮ ﻫﻤﺎﻧﻄﻮر ﻛﻪ از ﻧﺎم اش ﻣﺸﺨﺺ اﺳﺖ رﺟﻴﺴﺘﺮ ﺟﻬﺖ داده ي ﭘﻮرت ﺑﻮده و ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﭘﻮرت ورودي اﺳﺖ ﻳﺎ ﺧﺮوﺟﻲ .ﺑﺪﻳﻦ ﺻﻮرت ﻛﻪ اﮔﺮ روي ﻫﺮﻛﺪام از ﺑﻴﺖ ﻫﺎي اﻳﻦ رﺟﻴﺴﺘﺮ ﻳﻚ ﻧﻮﺷﺘﻪ ﺷﻮد ﭘﻴﻦ ﻣﺘﻨﺎﻇﺮ آن ﭘﻮرت ﺧﺮوﺟﻲ ﺑﻮده و در ﻏﻴﺮ اﻳﻨﺼﻮرت ورودي ﻣﻲ ﺑﺎﺷﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﺑﺎ اﺟﺮاي ﻋﺒﺎرت = DDRA 0b10111101وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي اﻳﻦ رﺟﻴﺴﺘﺮ و ﭘﻴﻦ ﻫﺎي ﻣﺮﺑﻮﻃﻪ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ.
0
1
2
3
4
5
6
7
DDRA
1
0
1
1
1
1
0
1
ﻧﺎم ﺑﻴﺖ
ﺧﺮوﺟﻲ
ورودي
ﺧﺮوﺟﻲ
ﺧﺮوﺟﻲ
ﺧﺮوﺟﻲ
ﺧﺮوﺟﻲ
ورودي
ﺧﺮوﺟﻲ
ﺟﻬﺖ داده
رﺟﻴﺴﺘﺮ :PORTx ﻋﻤﻠﻜﺮد اﻳﻦ رﺟﻴﺴﺘﺮ ﺑﺴﺘﮕﻲ ﺑﻪ ﺟﻬﺖ داده ي ﭘﻮرت دارد .در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه ﺑﺎﺷﺪ. آﻧﭽﻪ روي ﭘﻮرت ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد ﺳﻄﺢ ﻣﻨﻄﻘﻲ آن را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ و در ﺻﻮرﺗﻲ ﻛﻪ ورودي ﺑﺎﺷﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﻫﺮ
- ٢١٧ -
P a g e | 218
www.eca.ir
ﺑﻴﺖ ﻣﻘﺎوﻣﺖ Pull-upداﺧﻠﻲ ﻣﺮﺑﻮط ﺑﻪ آن ﭘﻴﻦ ﻓﻌﺎل ﻣﻲ ﺷﻮد .ﺑﻪ ﻋﻨﻮان ﻧﻤﻮﻧﻪ در اداﻣﻪ ي ﻣﺜﺎل ﻗﺒﻞ در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺒﺎرت PORTA = 0b11010100اﺟﺮا ﺷﻮد ،وﺿﻌﻴﺖ ﭘﻮرت ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد.
0
1
2
3
4
5
6
7
ﺷﻤﺎره ﺑﻴﺖ
1
0
1
1
1
1
0
1
DDRA
0
0
1
0
1
0
1
1
PORTA
ﺧﺮوﺟﻲ
ورودي
ﺧﺮوﺟﻲ
ﺧﺮوﺟﻲ
ﺧﺮوﺟﻲ
ﺧﺮوﺟﻲ
ورودي
ﺧﺮوﺟﻲ
ﺑﺎ ﺳﻄﺢ
ﺑﺪون
ﺑﺎ ﺳﻄﺢ
ﺑﺎ ﺳﻄﺢ
ﺑﺎ ﺳﻄﺢ
ﺑﺎ ﺳﻄﺢ
ﺑﺎ
ﺑﺎ ﺳﻄﺢ
ﻣﻨﻄﻘﻲ
ﻣﻘﺎوﻣﺖ
ﻣﻨﻄﻘﻲ
ﻣﻨﻄﻘﻲ
ﻣﻨﻄﻘﻲ
ﻣﻨﻄﻘﻲ
ﻣﻘﺎوﻣﺖ
ﻣﻨﻄﻘﻲ
ﺻﻔﺮ
Pull-up
ﻳﻚ
ﺻﻔﺮ
ﻳﻚ
ﺻﻔﺮ
Pull-up
ﻳﻚ
ﺟﻬﺖ داده
رﺟﻴﺴﺘﺮ :PINx ﺑﺮاي ﺧﻮاﻧﺪن ﻣﻘﺪار ﻫﺮ ﭘﻴﻦ ﺑﺎﻳﺪ ﻣﺤﺘﻮﻳﺎت اﻳﻦ رﺟﻴﺴﺘﺮ ﺧﻮاﻧﺪه ﺷﻮد .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﭼﻨﺎﻧﭽﻪ PORCرا ﻗﺒﻼ ﺑﻪ ﺻﻮرت ورودي ﭘﻴﻜﺮﺑﻨﺪي ﻛﺮده ﺑﺎﺷﻴﻢ و ﻣﻘﺪار رﺟﻴﺴﺘﺮ PINCﺑﺮاﺑﺮ 0b11010000ﺑﺎﺷﺪ ،ﺳﻄﺢ ﻣﻨﻄﻘﻲ اﻋﻤﺎل ﺷﺪه ﺑﻪ ﭘﻴﻦ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
0
1
2
3
4
5
6
7
PINC
0
0
0
0
1
0
1
1
ﻧﺎم ﺑﻴﺖ
ﺻﻔﺮ
ﺻﻔﺮ
ﺻﻔﺮ
ﺻﻔﺮ
ﻳﻚ
ﺻﻔﺮ
ﻳﻚ
ﻳﻚ
ﺟﻬﺖ داده
- ٢١٨ -
P a g e | 219
www.eca.ir
ﭘﻴﻮﺳﺖ :2ﻧﺤﻮه ي ارﺗﺒﺎط دﻫﻲ ورودي وﺧﺮوﺟﻲ ﻫﺎي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ
- ٢١٩ -
P a g e | 220
www.eca.ir
AVR ﻣﺸﺨﺼﺎت ﺑﺮﺧﻲ ﻗﻄﻌﺎت:3 ﭘﻴﻮﺳﺖ
Flash
EEPROM
SRAM
Max
F.max
(Kbytes)
(Kbytes)
(Bytes)
I/O
(MHz)
16-bit
8-bit
PWM
Timers
Timer
(channels)
AT90PWM1
8
0.5
512
19
16
2.7-5.5
1
1
AT90PWM2
8
0.5
512
19
16
2.7-5.5
1
AT90PWM3
8
0.5
512
27
16
2.7-5.5
ATmega128
128
4
4096
53
16
ATmega1280
128
4
8192
86
ATmega1281
128
4
8192
ATmega16
16
0.5
ATmega162
16
ATmega164P
Devices
Vcc (V)
10-bit
UART
TWI
7
1
No
--
8
--
4
1
7
1
Yes
--
8
--
4
1
1
10
1
Yes
--
11
--
4
2.7-5.5
2
2
8
1
2
Yes
8
34
8
16
1.8-5.5
4
2
16
1
4
Yes
16
57
32
54
16
1.8-5.5
4
2
9
1
2
Yes
8
48
17
1024
32
16
2.7-5.5
1
2
4
1
1
Yes
8
20
3
0.5
1024
35
16
1.8-5.5
2
2
6
1
2
--
--
28
3
16
0.512
1024
32
20
1.8-5.5
1
2
6
1
2
Yes
8
31
32
ATmega165
16
0.5
1024
54
16
1.8-5.5
1
2
4
1
1
USI
8
23
17
ATmega165P
16
0.5
1024
54
16
1.8-5.5
1
2
4
1
1
USI
8
23
17
ATmega168
16
0.5
1024
23
20
1.8-5.5
1
2
6
1
1
Yes
8
26
26
ATmega169
16
0.5
1024
54
16
1.8-5.5
1
2
4
1
1
USI
8
23
17
ATmega169P
16
0.5
1024
54
16
1.8-5.5
1
2
4
1
1
USI
8
23
17
ATmega2560
256
4
8192
86
16
1.8-5.5
4
2
16
1
4
Yes
16
57
32
ATmega2561
256
4
8192
54
16
1.8-5.5
4
2
9
1
2
Yes
8
48
17
ATmega32
32
1
2048
32
16
2.7-5.5
1
2
4
1
1
Yes
8
19
3
ATmega324P
32
1
2048
32
20
1.8-5.5
1
2
6
1
2
Yes
8
31
32
ATmega325
32
1
2048
54
16
1.8-5.5
1
2
4
1
1
USI
8
23
17
ATmega3250
32
1
2048
69
16
1.8-5.5
1
2
4
1
1
USI
8
32
17
ATmega3250P
32
1
2048
69
20
1.8-5.5
1
2
4
1
1
USI
8
32
17
ATmega325P
32
1
2048
54
20
1.8-5.5
1
2
4
1
1
USI
8
23
17
ATmega329
32
1
2048
54
16
1.8-5.5
1
2
4
1
1
USI
8
25
17
ATmega3290
32
1
2048
69
16
1.8-5.5
1
2
4
1
1
USI
8
25
32
ATmega3290P
32
1
2048
69
20
1.8-5.5
1
2
4
1
1
USI
8
25
32
ATmega329P
32
1
2048
54
20
1.8-5.5
1
2
4
1
1
USI
8
25
17
ATmega406
40
0.512
2048
18
1
4-25
1
1
1
--
--
Yes
--
23
4
ATmega48
4
0.256
512
23
20
1.8-5.5
1
2
6
1
1
Yes
8
26
26
ATmega64
64
2
4096
54
16
2.7-5.5
2
2
8
1
2
Yes
8
34
8
ATmega640
64
4
8192
86
16
1.8-5.5
4
2
16
1
4
Yes
16
57
32
ATmega644
64
2
4096
32
20
1.8-5.5
1
2
6
1
1
Yes
8
31
32
ATmega644P
64
2
4096
32
20
1.8-5.5
1
2
6
1
2
Yes
8
31
32
ATmega645
64
2
4096
54
16
1.8-5.5
1
2
4
1
1
USI
8
23
17
- ٢٢٠ -
A/D
Interrupts
Ext
SPI
Interrupts
P a g e | 221
www.eca.ir ATmega6450
64
2
4096
69
16
1.8-5.5
1
2
4
1
1
USI
8
32
17
ATmega649
64
2
4096
54
16
1.8-5.5
1
2
4
1
1
USI
8
25
17
ATmega6490
64
2
4096
69
16
1.8-5.5
1
2
4
1
1
USI
8
25
32
ATmega8
8
0.5
1024
23
16
2.7-5.5
1
2
3
1
1
Yes
8
18
2
ATmega8515
8
0.5
512
35
16
2.7-5.5
1
1
3
1
1
--
--
16
3
ATmega8535
8
0.5
512
32
16
2.7-5.5
1
2
4
1
1
Yes
8
20
3
ATmega88
8
0.5
1024
23
20
1.8-5.5
1
2
6
1
1
Yes
8
26
26
ATtiny11
1
--
--
6
6
2.7-5.5
--
1
--
--
--
--
--
4
1
ATtiny12
1
0.064
--
6
8
1.8-5.5
--
1
--
--
--
--
--
5
1
ATtiny13
1
0.064
64B
6
20
1.8-5.5
--
1
2
--
--
--
4
9
6
ATtiny15L
1
0.0625
--
6
1.6
2.7-5.5
--
2
1
--
--
--
4
8
1(+5)
ATtiny2313
2
0.128
128
18
20
1.8-5.5
1
1
4
USI
1
USI
--
8
2
ATtiny24
2
0.128
128
12
20
1.8-5.5
1
1
4
USI
--
USI
8
17
12
ATtiny25
2
0.128
128
6
20
1.8-5.5
--
2
4
USI
--
USI
4
15
7
ATtiny26
2
0.125
128
16
16
2.7-5.5
--
2
2
USI
--
USI
11
11
1
ATtiny261
2
0.128
128
16
20
1.8-5.5
1
2
2
Yes
--
USI
11
19
2
ATtiny28L
2
--
32
11
4
1.8-5.5
--
1
--
--
--
--
--
5
2(+8)
ATtiny44
4
0.256
256
12
20
1.8-5.5
1
1
4
USI
--
USI
8
17
12
ATtiny45
4
0.256
256
6
20
1.8-5.5
--
2
4
USI
--
USI
4
15
7
ATtiny461
4
0.256
256
16
20
1.8-5.5
1
2
2
Yes
--
USI
11
19
2
ATtiny84
8
0.512
512
12
20
1.8-5.5
1
1
4
USI
--
USI
8
17
12
ATtiny85
8
0.512
512
6
20
1.8-5.5
--
2
4
USI
--
USI
4
15
7
ATtiny861
8
0.512
512
16
20
1.8-5.5
1
2
2
Yes
--
USI
11
19
2
- ٢٢١ -
P a g e | 222
www.eca.ir
AVR ﺑﺮﺧﻲ ﻗﻄﻌﺎتPinout :4 ﭘﻴﻮﺳﺖ ATmega64,ATmega128
ATmega16, ATmega32
ATmega8
ATiny26
- ٢٢٢ -
P a g e | 223
www.eca.ir
ﭘﻴﻮﺳﺖ :5ﺧﻼﺻﻪ ي رﺟﻴﺴﺘﺮﻫﺎي ATmega16
- ٢٢٣ -