Avr

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Avr as PDF for free.

More details

  • Words: 28,923
  • Pages: 223
‫آﻣﻮزش ﺳﺮﻳﻊ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ‪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‬‬

‫‪- ٢٢٣ -‬‬

Related Documents

Avr
November 2019 38
Avr
June 2020 22
Avr
November 2019 37
Avr Lecture5
November 2019 34
Avr 321mx.pdf
April 2020 25
Avr Lecture2
November 2019 13