Docstoc

Avr chipset learning

Document Sample
Avr chipset learning Powered By Docstoc
					           AVR ‫آﻣﻮزش ﺳﺮﻳﻊ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ‬




                                    (info@avr.ir) ‫ﻣﻮﻟﻒ: رﺿﺎ ﺳﭙﺎس ﻳﺎر‬

                                                                    
    www.avr.ir                                  
    www.pnkavosh.com                   
                  ‫ﻋﻨﻮان ﻣﻄﺎﻟﺐ‬


       ‫ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ، ﻣﻨﺎﺑﻊ ﻛﻼك و ‪Reset‬‬

                        ‫آﺷﻨﺎﻳﻲ ﺑﺎ زﺑﺎن ‪C‬‬

                     ‫ﭘﺮوژه 1 :ﻓﻼﺷﺮ ﺳﺎده‬

  ‫ﭘﺮوژه 2: ﻛﺎﻧﺘﺮ ﻳﻚ رﻗﻤﻲ ﺑﺎ ‪7-Segment‬‬

  ‫ﭘﺮوژه 3 :ﻧﻤﺎﻳﺸﮕﺮ ﻛﺮﻳﺴﺘﺎل ﻣﺎﻳﻊ )‪(LCD‬‬

       ‫ﭘﺮوژه 4: اﺳﻜﻦ ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻣﺎﺗﺮﻳﺴﻲ‬

‫ﭘﺮوژه 5: ﻧﻤﺎﻳﺸﮕﺮﻫﺎي ‪LED Dot Matrix‬‬

                        ‫وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ‬

           ‫ﭘﺮوژه 6: آﺷﻜﺎر ﺳﺎز ﻋﺒﻮر از ﺻﻔﺮ‬

                          ‫ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﺻﻔﺮ‬

           ‫ﭘﺮوژه 7 : ﻓﺮﻛﺎﻧﺲ ﻣﺘﺮ دﻳﺠﻴﺘﺎل‬

     ‫ﭘﺮوژه 8: ﻛﻨﺘﺮل ﻣﻮﺗﻮر ‪ DC‬ﺑﺎ ‪PWM‬‬

                         ‫ﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ دو‬

      ‫ﭘﺮوژه 9: ﺳﺎﻋﺖ ﺑﺎ ‪ RTC‬ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ‬

                          ‫ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻳﻚ‬

               ‫ﭘﺮوژه 01: ﻛﻨﺘﺮل ﺳﺮو‪ ‬ﻣﻮﺗﻮر‬
                               ‫ﭘﺮوژه 11: ﺗﻮﻟﻴﺪ ﻣﻮج ﺳﻴﻨﻮﺳﻲ‬

                                 ‫ﭘﻮرت ﺳﺮﻳﺎل )232-‪(RS‬‬

                     ‫ﭘﺮوژه 21: ﭘﻮرت ﺳﺮﻳﺎل در وﻳﮋوال ﺑﻴﺴﻴﻚ‬

                    ‫ﭘﺮوژه 31: ارﺗﺒﺎط دﻫﻲ ‪ USB‬ﺑﺎ 232‪RS‬‬

                                     ‫)‪I2C Bus (TWI‬‬
                  ‫ﭘﺮوژه 21: ارﺗﺒﺎط ﺑﺎ ‪ EEPROM‬ﻫﺎي ‪I2C‬‬

                                   ‫ﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل‬

                 ‫ﭘﺮوژه 31: اﻧﺪازه ﮔﻴﺮي دﻣﺎ ﺑﺎ ﺳﻨﺴﻮر 53‪LM‬‬

                                    ‫ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ‬

                                             ‫‪SPI Bus‬‬
                ‫‪Mode‬ﻫﺎي ‪ Sleep‬و ﺗﺎﻳﻤﺮ ‪Watchdog‬‬




                        ‫ﭘﻴﻮﺳﺖ 1: ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴﺘﺮﻫﺎي ‪I/O‬‬

‫ﭘﻴﻮﺳﺖ 2: ﻧﺤﻮه ي ارﺗﺒﺎط دﻫﻲ ورودي وﺧﺮوﺟﻲ ﻫﺎي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ‬

                   ‫ﭘﻴﻮﺳﺖ 3: ﻣﺸﺨﺼﺎت ﺑﺮﺧﻲ ﻗﻄﻌﺎت ‪AVR‬‬

                   ‫ﭘﻴﻮﺳﺖ 4: ‪ Pinout‬ﺑﺮﺧﻲ ﻗﻄﻌﺎت ‪AVR‬‬

              ‫ﭘﻴﻮﺳﺖ 5: ﺧﻼﺻﻪ ي رﺟﻴﺴﺘﺮﻫﺎي61‪ATmega‬‬
‫4| ‪Page‬‬
      ‫    ‪www.avr.ir‬‬                             ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




                          ‫ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ، ﻣﻨﺎﺑﻊ ﻛﻼك و ‪Reset‬‬



                                                                                 ‫ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ‬      ‫•‬

 ‫ﻓﻴﻮز ﺑﻴﺖ ﻫﺎ ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ ي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ‪ AVR‬ﻫﺴﺘﻨﺪ ﻛﻪ اﻣﻜﺎﻧﺎﺗﻲ را در اﺧﺘﻴﺎر ﻛﺎرﺑﺮ ﻗﺮار ﻣﻲ دﻫﻨﺪ و ﺑﺎ‬

‫‪ Erase‬ﺷﺪن ﻣﻴﻜﺮو ﻣﻘﺪار آن ﻫﺎ ﺗﻐﻴﻴﺮ ﻧﻤﻲ ﻛﻨﺪ. ﻳﻚ ﺑﻪ ﻣﻌﻨﻲ ﻏﻴﺮ ﻓﻌﺎل ﺑﻮدن و ﺻﻔﺮ ﻓﻌﺎل ﺑﻮدن ﻫﺮ ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ.‬

                                      ‫ﻗﻄﻌﻪ ي 61‪ Mega‬داراي 2 ﺑﺎﻳﺖ ﻓﻴﻮز ﺑﻴﺖ ﻃﺒﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬




            ‫‪ High Byte‬ﺷﻤﺎره ﺑﻴﺖ‬                       ‫ﻋﻤﻠﻜﺮد‬                 ‫ﭘﻴﺶ ﻓﺮض‬

                ‫0‬      ‫‪BOOTRST‬‬               ‫اﻧﺘﺨﺎب ﺑﺮدار ‪ Reset‬ﺑﺨﺶ ‪Boot‬‬         ‫1‬

                ‫1‬       ‫0‪BOOTSZ‬‬                                                  ‫0‬
                                               ‫اﻧﺘﺨﺎب اﻧﺪازه ي ‪Bootloader‬‬
                ‫2‬       ‫1‪BOOTSZ‬‬                                                  ‫0‬

                ‫3‬       ‫‪EESAVE‬‬         ‫ﺣﻔﺎﻃﺖ از ‪ EEPROM‬در زﻣﺎن ‪Erase‬‬             ‫1‬

                ‫4‬        ‫‪CKOPT‬‬                          ‫اﻧﺘﺨﺎب ﻋﻤﻠﻜﺮد ﻛﻼك‬        ‫1‬

                ‫5‬         ‫‪SPIEN‬‬           ‫ﻓﻌﺎل ﺳﺎز ﭘﺮوﮔﺮام ﺷﺪن از ﻃﺮﻳﻖ ‪SPI‬‬       ‫0‬

                ‫6‬        ‫‪JTAGEN‬‬                      ‫ﻓﻌﺎل ﺳﺎز ﭘﻮرت ‪JTAG‬‬          ‫0‬

                ‫7‬        ‫‪OCDEN‬‬          ‫ﻓﻌﺎل ﺳﺎز اﺷﻜﺎل زداﻳﻲ از ﻃﺮﻳﻖ ‪JTAG‬‬        ‫1‬




                                                     ‫-٤-‬
‫5| ‪Page‬‬
      ‫    ‪www.avr.ir‬‬                        ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
            ‫ﺷﻤﺎره ﺑﻴﺖ‬    ‫‪Low Byte‬‬                ‫ﻋﻤﻠﻜﺮد‬                  ‫ﭘﻴﺶ ﻓﺮض‬

                 ‫0‬        ‫0‪CKSEL‬‬                                               ‫1‬

                 ‫1‬        ‫1‪CKSEL‬‬                                               ‫0‬
                                                      ‫اﻧﺘﺨﺎب ﻣﻨﺒﻊ ﻛﻼك‬
                 ‫2‬        ‫2‪CKSEL‬‬                                               ‫0‬

                 ‫3‬        ‫3‪CKSEL‬‬                                               ‫0‬

                 ‫4‬         ‫0‪SUT‬‬                                                ‫0‬
                                                ‫اﻧﺘﺨﺎب زﻣﺎن ‪Startup‬‬
                 ‫5‬         ‫1‪SUT‬‬                                                ‫1‬

                 ‫6‬        ‫‪BODEN‬‬       ‫ﻓﻌﺎل ﺳﺎز آﺷﻜﺎر ﺳﺎز ‪Brown-out‬‬             ‫1‬

                 ‫7‬       ‫‪BODLEVEL‬‬        ‫ﺗﻨﻈﻴﻢ ﺳﻄﺢ وﻟﺘﺎژ ‪Brown-out‬‬             ‫1‬




‫‪ :BOOTRST‬اﻧﺘﺨﺎب ﺑﺮدار ري ﺳﺖ ‪ BOOT‬ﻛﻪ در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﺑﺮﻧﺎﻣﻪ رﻳﺰي ﻧﺸﺪه اﺳﺖ و آدرس‬

‫ﺑﺮدار ري ﺳﺖ 0000 اﺳﺖ و در ﺻﻮرت ﺑﺮﻧﺎﻣﻪ رﻳﺰي آدرس ﺑﺮدار ‪ Reset‬ﻃﺒﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد. )ﺑﺮ‬

                                                                         ‫اﺳﺎس ]0:1[‪(BOOTSZ‬‬




            ‫آدرس ﺑﺮدار ‪ Pages Reset‬اﻧﺪازه ي ‪BOOTSZ1 BOOTSZ0 Boot‬‬

                     ‫1‬         ‫1‬        ‫821 ‪Word‬‬          ‫2‬         ‫08‪$1F‬‬

                     ‫1‬         ‫0‬        ‫652 ‪Word‬‬          ‫4‬             ‫00‪$F‬‬

                     ‫0‬         ‫1‬        ‫215 ‪Word‬‬          ‫8‬             ‫00‪$E‬‬

                     ‫0‬         ‫0‬       ‫4201 ‪Word‬‬         ‫61‬         ‫00‪$C‬‬




                                                ‫-٥-‬
‫6| ‪Page‬‬
      ‫    ‪www.avr.ir‬‬                              ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬


‫‪ :BODEN‬اﻳﻦ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ‪ Brown-out Detector‬ﺑﻮده و در ﺻﻮرت ﭘﺮوﮔﺮام ﺷﺪن ﻣﻄﺎﺑﻖ وﺿﻌﻴﺖ ﺟﺪول‬

                                                            ‫زﻳﺮ ﺳﻄﺢ وﻟﺘﺎژ ‪ Brown-out‬ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد.‬




                       ‫ﺳﻄﺢ وﻟﺘﺎژ ‪BODEN BODLEVEL Brown-out‬‬

                           ‫1‬               ‫1‬                 ‫ﻏﻴﺮ ﻓﻌﺎل‬

                           ‫1‬               ‫0‬                 ‫ﻏﻴﺮ ﻓﻌﺎل‬

                           ‫0‬               ‫1‬                ‫‪Vcc=2.7v‬‬

                           ‫0‬               ‫0‬                ‫‪Vcc=4.0v‬‬




                                                                                  ‫ﻣﻨﺎﺑﻊ ﻛﻼك‬         ‫•‬

‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ در دﻳﺎﮔﺮام زﻳﺮ دﻳﺪه ﻣﻲ ﺷﻮد، اﻳﻦ ﻣﻨﺎﺑﻊ ﺷﺎﻣﻞ: اﺳﻴﻼﺗﻮر ‪ RC‬ﻛﺎﻟﻴﺒﺮه ﺷﺪه، اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ﻓﺮﻛﺎﻧﺲ‬

              ‫ﭘﺎﻳﻴﻦ، اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ، ﻛﻼك ﺧﺎرﺟﻲ، اﺳﻴﻼﺗﻮر ‪ RC‬ﺧﺎرﺟﻲ و اﺳﻴﻼﺗﻮر ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻣﻲ ﺑﺎﺷﻨﺪ.‬




                                                      ‫-٦-‬
‫7| ‪Page‬‬
     ‫    ‪www.avr.ir‬‬                          ‫ ‬                ‫ ‪       www.pnkavosh.com‬‬




 ‫اﻧﺘﺨﺎب ﻣﻨﺒﻊ ﻛﻼك ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي ‪ CKSEL‬ﺑﻮده و ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ. ﻣﻘﺪار ﭘﻴﺶ ﻓﺮض ﺑﻴﺖ‬

                      ‫ﻫﺎي ‪ ،CKSEL‬ﻳﻚ ﺑﻮده و در ﻧﺘﻴﺠﻪ ﻣﻨﺒﻊ ﭘﻴﺶ ﻓﺮض، اﺳﻴﻼﺗﻮر ‪ RC‬داﺧﻠﻲ ﻣﻲ ﺑﺎﺷﺪ.‬




                                                 ‫-٧-‬
‫8| ‪Page‬‬
      ‫    ‪www.avr.ir‬‬                             ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫ﻛﻼك ﺧﺎرﺟﻲ: ﺑﺮاي راه اﻧﺪازي وﺳﻴﻠﻪ ﺑﻮﺳﻴﻠﻪ ي ﻣﻨﺒﻊ ﻛﻼك ﺧﺎرﺟﻲ ﺑﺎﻳﺪ ﻣﻄﺎﺑﻖ ﺷـﻜﻞ زﻳـﺮ ﻳـﻚ ﭘـﺎﻟﺲ ﺑـﻪ ﭘـﻴﻦ‬

‫1‪ XTAL‬اﻋﻤﺎل ﺷﻮد. ﺑﺮاي ﻗﺮار ﮔﺮﻓﺘﻦ در اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻳﺪ ﺗﻤﺎم ﺑﻴﺖ ﻫﺎي ‪ CKSEL‬ﭘﺮوﮔﺮام ﺷﺪه )ﺻﻔﺮ ﺷﻮﻧﺪ(‬

‫و ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﭘﺮوﮔﺮام ﻛﺮدن ﻓﻴﻮزﺑﻴﺖ ‪ CKOPT‬ﻳﻚ ﺧﺎزن داﺧﻠﻲ ﺑﻪ ﻇﺮﻓﻴﺖ 63 ﭘﻴﻜﻮﻓﺎراد را ﺑـﻴﻦ ورودي و‬

                                                                                     ‫زﻣﻴﻦ ﻗﺮار دﻫﺪ.‬




                                   ‫1‪XTAL‬‬
                       ‫ﻛﻼك ﺧﺎرﺟﻲ‬


                                                     ‫‪CKOPT‬‬

                                   ‫2‪XTAL‬‬             ‫‪36 pF‬‬




‫اﺳﻴﻼﺗﻮر ‪ RC‬ﻛﺎﻟﻴﺒﺮه ﺷﺪه ي داﺧﻠﻲ: اﻳﻦ ﻣﻨﺒﻊ در ﻓﺮﻛﺎﻧﺲ ﻫﺎي 1، 2، 4 و 8 ﻣﮕﺎﻫﺮﺗﺰ ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷـﺪ و ﻣﻘـﺪار‬

‫آن در دﻣﺎي 52 درﺟﻪ و وﻟﺘﺎژ 5 وﻟﺖ ﻛﺎﻟﻴﺒﺮه ﺷﺪه اﺳﺖ ﻛﻪ در اﻳﻦ وﺿﻌﻴﺖ ﻣﻤﻜﻦ اﺳﺖ ﺗﺎ 3 درﺻﺪ در ﻛﻼك اﻳﺠﺎد‬

‫ﺷﺪه وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ. ﻓﺮﻛﺎﻧﺲ ﻧﻮﺳﺎن ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي ‪ CKSEL‬ﺗﻌﻴﻴﻦ ﺷﺪه و ﻣﻄـﺎﺑﻖ ﺟـﺪول زﻳـﺮ ﻣـﻲ‬

                                                      ‫ﺑﺎﺷﺪ. در اﻳﻦ وﺿﻌﻴﺖ ‪ CKOPT‬ﻧﺒﺎﻳﺪ ﭘﺮوﮔﺮام ﺷﻮد.‬




                                                     ‫-٨-‬
‫9| ‪Page‬‬
      ‫    ‪www.avr.ir‬‬                               ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫اﺳﻴﻼﺗﻮر ‪ RC‬ﺧﺎرﺟﻲ: در ﻛﺎرﺑﺮدﻫﺎﻳﻲ ﻛﻪ دﻗﺖ ﻛﻼك اﻫﻤﻴﺖ زﻳﺎدي ﻧﺪارد ﻣـﻲ ﺗـﻮان از اﻳـﻦ ﻣﻨﺒـﻊ اﺳـﺘﻔﺎده ﻛـﺮد.‬

                                             ‫1‬
‫= ‪ f‬ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ. ﺣﺪاﻗﻞ ﻣﻘﺪار ‪ C‬ﺑﺮاﺑـﺮ 22‬        ‫ﭘﻴﻜﺮﺑﻨﺪي ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﺑﻮده و ﻓﺮﻛﺎﻧﺲ ﻧﻮﺳﺎن از راﺑﻄﻪ ي‬
                                           ‫‪3 RC‬‬

      ‫ﭘﻴﻜﻮﻓﺎراد ﺑﻮده و در ﺻﻮرﺗﻲ ﻛﻪ ‪ CKOPT‬ﭘﺮوﮔﺮام ﺷﻮد ﻣﻲ ﺗﻮان ﻣﻘﺪار 63 ﭘﻴﻜﻮﻓﺎراد را ﻧﻴﺰ ﻟﺤﺎظ ﻧﻤﻮد.‬




                   ‫‪R‬‬
                              ‫1‪XTAL‬‬


                   ‫‪C‬‬
                                                  ‫‪CKOPT‬‬

                              ‫2‪XTAL‬‬               ‫‪36 pF‬‬




 ‫اﻳﻦ ﻣﻨﺒﻊ ﻧﻮﺳﺎن ﻣﻲ ﺗﻮاﻧﺪ در ﭼﻬﺎر ‪ Mode‬ﻛﺎري ﻋﻤﻞ ﻛﻨﺪ ﻛﻪ ﻫﺮ ﻛﺪام ﺑﺮاي ﻳﻚ ﺑﺎزه ي ﻓﺮﻛﺎﻧﺴﻲ ﺑﻬﻴﻨﻪ ﺷﺪه اﺳﺖ‬

                                    ‫و ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي ‪ CKSEL‬ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﻧﺘﺨﺎب ﻣﻲ ﺷﻮد.‬




 ‫اﺳﻴﻼﺗﻮر ﻛﺮﻳﺴﺘﺎﻟﻲ ﻓﺮﻛﺎﻧﺲ ﭘﺎﻳﻴﻦ: اﻳﻦ ﻣﻨﺒﻊ ﻛﻼك ﻣﻲ ﺗﻮاﻧﺪ ﻛﺮﻳﺴﺘﺎل ﻫﺎي ﻓﺮﻛﺎﻧﺲ ﭘﺎﻳﻴﻦ ﻣﺜﻞ ﻛﺮﻳﺴﺘﺎل ﺳﺎﻋﺖ ﺑﺎ‬

‫ﻓﺮﻛﺎﻧﺲ 86723 ﻫﺮﺗﺰ ﺑﺎﺷﺪ. ﺑﺎ دادن ﻣﻘﺪار 1001 ﺑﻪ ﻓﻴﻮزﺑﻴﺖ ﻫﺎي ‪ CKSEL‬ﻣﻨﺒﻊ ﻛﻼك ﻛﺮﻳﺴﺘﺎل ﺧﺎرﺟﻲ ﻓﺮﻛﺎﻧﺲ‬




                                                       ‫-٩-‬
‫01 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
  ‫ﭘﺎﻳﻴﻦ اﻧﺘﺨﺎب ﺷﺪه و در اﻳﻦ وﺿﻌﻴﺖ ﭘﻴﻜﺮﺑﻨﺪي ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ. در ﺻﻮرت ﭘﺮوﮔﺮام ﻧﻤﻮدن ‪CKOPT‬‬

                                                                 ‫ﻣﻲ ﺗﻮان از ﺧﺎزن ﺧﺎرﺟﻲ ﺻﺮﻓﻨﻈﺮ ﻧﻤﻮد.‬




                                                         ‫‪36 pF‬‬


                                                         ‫‪CKOPT‬‬
                         ‫1‪C‬‬
                                   ‫1‪XTAL‬‬



                     ‫‪XTAL‬‬                      ‫‪Rf‬‬

                                   ‫2‪XTAL‬‬

                         ‫2‪C‬‬
                                                        ‫‪CKOPT‬‬

                                                        ‫‪36 pF‬‬




‫ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ ﻳﺎ رزوﻧﺎﺗﻮر ﺳﺮاﻣﻴﻜﻲ: ﭘـﺒﻦ ﻫـﺎي 1‪ XTAL‬و 2‪ XTAL‬ﺑـﻪ ﺗﺮﺗﻴـﺐ ورودي و ﺧﺮوﺟـﻲ ﻳـﻚ‬

 ‫ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي واروﻧﮕﺮ ﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﻋﻨﻮان ﻳﻚ اﺳﻴﻼﺗﻮر ‪ On-chip‬ﻣﻄﺎﺑﻖ ﺷﻜﻞ زﻳﺮ ﭘﻴﻜﺮﺑﻨﺪي ﺷﻮﻧﺪ.‬




                                                     ‫- ٠١ -‬
‫11 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬



                          ‫1‪C‬‬
                                     ‫1‪XTAL‬‬



                         ‫‪XTAL‬‬                      ‫‪Rf‬‬

                                     ‫2‪XTAL‬‬

                          ‫2‪C‬‬




‫• ﺑﻪ ﺟﺎي ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ ﻣﻲ ﺗﻮان از رزوﻧﺎﺗﻮر ﺳﺮاﻣﻴﻜﻲ اﺳﺘﻔﺎده ﻧﻤـﻮد ﻛـﻪ از دوام ﺑﻴﺸـﺘﺮي در ﻣﻘﺎﺑـﻞ ﺿـﺮﺑﻪ ﺑـﺮ‬

‫ﺧﻮردار اﺳﺖ و زﻣﺎن ‪ Startup‬ﻛﻤﺘﺮي ﻧﻴﺰ دارد و اﻟﺒﺘﻪ ﻧﺴﺒﺖ ﺑﻪ ﻛﺮﻳﺴﺘﺎل ﻛﻮارﺗﺰ دﻗـﺖ ﻛﻤﺘـﺮي داﺷـﺘﻪ و ﭘﺎﻳـﺪاري‬

                                                                                  ‫دﻣﺎﻳﻲ آن ﻧﻴﺰ ﻛﻤﺘﺮ اﺳﺖ.‬




‫• در اﻳﻦ وﺿﻌﻴﺖ ﺧﺎزن ﻫﺎي 63 ﭘﻴﻜﻮ ﻓﺎراد ﺣﺬف ﺷﺪه و ﻋﻤﻠﻜﺮد ﻓﻴﻮزﺑﻴﺖ ‪ CKOPT‬ﻧﻴﺰ ﺗﻐﻴﻴﺮ ﻣـﻲ ﻛﻨـﺪ. ﺑـﺪﻳﻦ‬

‫ﺗﺮﺗﻴﺐ ﻛﻪ ﺑﺎ ﭘﺮوﮔﺮام ﺷﺪن اﻳﻦ ﺑﻴﺖ داﻣﻨﻪ ي ﺧﺮوﺟﻲ ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي واروﻧﮕﺮ اﻓـﺰاﻳﺶ ﻳﺎﻓﺘـﻪ و ﻣـﻲ ﺗـﻮان از ﭘـﻴﻦ‬

‫2‪ XTAL‬ﺑﻪ ﻋﻨﻮان ﻛﻼك ﺑﺮاي ﻳﻚ وﺳﻴﻠﻪ ي دﻳﮕﺮ اﺳﺘﻔﺎده ﻧﻤﻮد. ﻫﻤﭽﻨﻴﻦ ﺑﺎ ﻓﻌﺎل ﻛﺮدن ‪ CKOPT‬در ﻣﺤﻴﻂ ﻫﺎي‬

                                                                     ‫ﻧﻮﻳﺰي ﻋﻤﻠﻜﺮد اﺳﻴﻼﺗﻮر ﺑﻬﺒﻮد ﻣﻲ ﻳﺎﺑﺪ.‬




      ‫• ﭼﻨﺎﻧﭽﻪ از رزوﻧﺎﺗﻮر اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﺑﺮاي ﻓﺮﻛﺎﻧﺲ ﻫﺎي ﺑﺎﻻﺗﺮ از 8 ﻣﮕﺎﻫﺮﺗﺰ ﺑﺎﻳﺪ ‪ CKOPT‬ﭘﺮوﮔﺮام ﺷﻮد.‬




‫اﺳﻴﻼﺗﻮر ﻣﻲ ﺗﻮاﻧﺪ در ﺳﻪ وﺿﻌﻴﺖ ﻣﺘﻔﺎوت ﻧﻮﺳﺎن ﻛﻨﺪ ﻛﻪ ﻫﺮﻛﺪام ﺑﺮاي ﻳﻚ ﻣﺤﺪوده ي ﻓﺮﻛﺎﻧﺴﻲ ﺑﻬﻴﻨﻪ ﺷﺪه اﺳﺖ و‬

                                    ‫آن را ﻣﻲ ﺗﻮان ﺑﺎ ﻓﻴﻮز ﺑﻴﺖ ﻫﺎي ‪ CKSEL‬ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﻧﺘﺨﺎب ﻧﻤﻮد.‬




                                                        ‫- ١١ -‬
‫21 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




‫ﺑﺎ ﻫﺮ ﻳﻚ از ﻣﻨﺎﺑﻊ ﻛﻼك اﻧﺘﺨﺎب ﺷﺪه ﺑﻮﺳﻴﻠﻪ ي ﻓﻴﻮزﺑﻴﺖ ﻫﺎي ‪ ،CKSEL‬دو ﺑﻴﺖ ﺑﻪ ﻧﺎم ﻫﺎي ]0:1[‪ SUT‬ﻧﻴﺰ‬

‫وﺟﻮد دارد ﻛﻪ از ﻃﺮﻳﻖ آن ﻣﻲ ﺗﻮان ﺣﺪاﻛﺜﺮ زﻣﺎن ‪ Start-up‬ﻣﻨﺒﻊ ﻛﻼك را ﺑﻪ ﻣﻴﻜﺮو اﻋﻼم ﻧﻤﻮد. ﻣﻘﺪار اﻳﻦ ﺑﻴﺖ ﻫﺎ‬

‫ﺑﻪ ﻃﻮر ﭘﻴﺶ ﻓﺮض ﻣﺎﻛﺰﻳﻤﻢ زﻣﺎن ‪ Start-up‬را در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮد و در ﺻﻮرﺗﻲ ﻛـﻪ ﻧﻴـﺎز اﺳـﺖ ﻣﻘـﺪار آن را ﺗﻐﻴﻴـﺮ‬

     ‫دﻫﻴﺪ ﻣﻄﺎﺑﻖ ﺟﺪاول ﻣﺮﺑﻮﻃﻪ در ﻓﺼﻞ ‪ System Clock and Clock Options‬در ‪ Datatsheet‬ﻋﻤﻞ ﻛﻨﻴﺪ.‬




                                                                                    ‫ﻣﻨﺎﺑﻊ ‪Reset‬‬     ‫•‬

     ‫ﺑﺎ ‪ Reset‬ﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ، ﺗﻤﺎم رﺟﻴﺴﺘﺮﻫﺎي ‪ I/O‬ﺑﻪ ﻣﻘﺪار اوﻟﻴﻪ ﺷﺎن ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﻨﺪ و ‪ CPU‬ﺷﺮوع ﺑﻪ اﺟﺮاي‬

       ‫دﺳﺘﻮراﻟﻌﻤﻞ ﻫﺎ از ﺑﺮدار ‪ Reset‬ﺧﻮاﻫﺪ ﻛﺮد. در ﻗﻄﻌﻪ ي 61‪ 5 Mega‬ﻣﻨﺒﻊ ‪ Reset‬وﺟﻮد دارد ﻛﻪ ﻋﺒﺎرﺗﻨﺪ از:‬



‫.1‬              ‫‪Power-on Reset‬‬
‫.2‬              ‫‪External Reset‬‬
‫.3‬              ‫‪Brown-out Reset‬‬
‫.4‬              ‫‪Watchdog Reset‬‬
‫.5‬              ‫‪JTAG AVR Reset‬‬




                                                       ‫- ٢١ -‬
‫31 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬             ‫ ‬                ‫ ‪       www.pnkavosh.com‬‬
                                                ‫ﻣﻨﻄﻖ ‪ Reset‬ﻣﻄﺎﺑﻖ دﻳﺎﮔﺮام زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬




                         ‫ﻣﺸﺨﺼﺎت ﻫﺮ ﻳﻚ از ﻣﻨﺎﺑﻊ ‪ Reset‬را در ﺟﺪول زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ:‬




                                       ‫- ٣١ -‬
‫41 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




‫‪ :Power-on Reset‬زﻣﺎﻧﻲ ﻓﻌﺎل ﺧﻮاﻫﺪ ﻛﻪ وﻟﺘﺎژ ‪ Vcc‬ﻛﻤﺘﺮ از ﺣﺪ ﺗﻌﻴﻴﻦ ﺷﺪه ﺑﺎﺷﺪ. اﻳﻦ ﻣﻨﺒـﻊ ﺗﻀـﻤﻴﻦ‬              ‫1.‬

‫ﻣﻲ ﻛﻨﺪ ﻛﻪ وﺳﻴﻠﻪ در زﻣﺎن راه اﻧﺪازي ‪ Reset‬ﻣﻲ ﺷﻮد. ﺑﺎ رﺳﻴﺪن وﻟﺘﺎژ ﺑﻪ ﺣﺪ آﺳﺘﺎﻧﻪ، ﺷﻤﺎرﻧﺪه ي ﺗﺎﺧﻴﺮ راه اﻧـﺪازي‬

‫ﺷﺪه ﻛﻪ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﭼﻪ ﻣﺪت وﺳﻴﻠﻪ در وﺿﻌﻴﺖ ‪ Reset‬ﺑﻤﺎﻧﺪ. دﻳﺎﮔﺮام زﻣﺎﻧﻲ زﻳﺮ ﺷﺮاﻳﻄﻲ را ﻧﺸﺎن ﻣﻲ دﻫـﺪ ﻛـﻪ‬

               ‫ﭘﻴﻦ ‪ RESET‬ﺑﻪ ‪ Vcc‬وﺻﻞ ﺷﺪه اﺳﺖ. )و ﻳﺎ آزاد ﺑﺎﺷﺪ ﭼﻮن اﻳﻦ ﭘﻴﻦ از داﺧﻞ ‪ Pull-up‬ﺷﺪه اﺳﺖ.(‬




                            ‫و ﻧﻤﻮدار زﻳﺮ ﺷﺮاﻳﻄﻲ اﺳﺖ ﻛﻪ ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﭘﻴﻦ ‪ Reset‬ﺗﺎﺑﻊ ‪ Vcc‬ﻧﻤﻲ ﺑﺎﺷﺪ:‬




                                                        ‫- ٤١ -‬
‫51 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




‫2. ‪ :External Reset‬اﻳﻦ ‪ Reset‬ﺑﻮﺳﻴﻠﻪ ي ﻳﻚ ﭘﺎﻟﺲ ﺑﺎ ﺳﻄﺢ ﺻﻔﺮ ﻣﻨﻄﻘﻲ روي ﭘﻴﻦ ‪ RESET‬اﻳﺠﺎد ﺷﺪه و‬

‫ﺣﺪاﻗﻞ ﻋﺮض آن 5.1 ﻣﻴﻜﺮو ﺛﺎﻧﻴﻪ ﻣﻲ ﺑﺎﺷﺪ. ﺑﺎ رﺳﻴﺪن وﻟﺘﺎژ اﻳﻦ ﭘﻴﻦ ﺑﻪ ﻣﻘﺪار آﺳﺘﺎﻧﻪ در ﻟﺒﻪ ﺑﺎﻻ روﻧـﺪه، ﺷـﻤﺎرﻧﺪه ي‬

               ‫ﺗﺎﺧﻴﺮ ﺷﺮوع ﺑﻪ ﻛﺎر ﻛﺮده و ﭘﺲ از اﺗﻤﺎم زﻣﺎن ‪ Time-out‬ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻛﺎر ﺧﻮد را ﺷﺮوع ﺧﻮاﻫﺪ ﻛﺮد.‬




‫‪ :Brown-out Detection‬ﻗﻄﻌـﻪ ي 61‪ ATmega‬داراي ﻳـﻚ ﻣـﺪار ‪Brown-out Detection‬‬                               ‫3.‬

‫داﺧﻠﻲ ﺑﻮده ﻛﻪ ﭘﻴﻮﺳﺘﻪ ﻣﻘﺪار وﻟﺘﺎژ ‪ Vcc‬را ﺑﺎ ﻳﻚ ﻣﻘﺪار ﺛﺎﺑﺖ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﺪ. اﻳﻦ ﻣﻘﺪار ﺛﺎﺑﺖ ﺑﺮاﺑﺮ 7.2 وﻟﺖ ﺑـﻮده‬

‫و در ﺻﻮرﺗﻲ ﻛﻪ ﻓﻴﻮزﺑﻴﺖ ‪ BODLEVEL‬ﭘﺮوﮔﺮام ﺷﻮد ﺑﻪ 0.4 وﻟﺖ اﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ. ﺑﺎ ﻛﻤﺘﺮ ﺷﺪن وﻟﺘـﺎژ ﺗﻐﺬﻳـﻪ‬

‫از اﻳﻦ ﻣﻘﺪار ﺛﺎﺑﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ وارد ﺣﺎﻟﺖ ‪ Reset‬ﺷﺪه و ﺑﺎ ﻋﺎدي ﺷﺪن وﻟﺘﺎژ، ﭘـﺲ از اﺗﻤـﺎم ﺗـﺎﺧﻴﺮ ﺑـﻪ وﺿـﻌﻴﺖ‬

‫ﻋﺎدي ﺑﺎز ﻣﻲ ﮔﺮدد. ﺑﺮاي ﺣﻔﺎﻇﺖ در ﺑﺮاﺑﺮ ‪ Spike‬ﻣﻘﺪار آﺳﺘﺎﻧﻪ داراي ﭘﺴـﻤﺎﻧﺪ ﺑـﻮده و در ﻧﺘﻴﺠـﻪ داراي دو ﻣﻘـﺪار‬




                                                          ‫- ٥١ -‬
‫61 | ‪P a g e‬‬
      ‫    ‪www.avr.ir‬‬                             ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬
‫ﻣﺜﺒﺖ و ﻣﻨﻔﻲ ﻣﻲ ﺑﺎﺷـﺪ ﻛـﻪ ﺑـﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﻣﻘـﺎدﻳﺮ ﻣﻮﺟـﻮد در ﺟـﺪول از راﺑﻄـﻪ ي 2 / ‪ VBOT+ = VBOT + VHYST‬و‬

                                                                 ‫2 / ‪ VBOT− = VBOT − VHYST‬ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ.‬




‫ﻣـﺪار ‪ Brown-out Detection‬در ﺣﺎﻟـﺖ ﻋـﺎدي ﻏﻴـﺮ ﻓﻌـﺎل ﺑـﻮده و ﺑـﺮاي راه اﻧـﺪازي آن ﺑﺎﻳـﺪ ﻓﻴﻮزﺑﻴـﺖ‬

                                                                            ‫‪ BODEN‬ﭘﺮوﮔﺮام )ﺻﻔﺮ( ﺷﻮد.‬




‫4. ‪ :Watchdog Reset‬ﺑﺎ اﺗﻤﺎم زﻣﺎن ﺗﺎﻳﻤﺮ ‪ ،Watchdog‬اﻳﻦ ﺗﺎﻳﻤﺮ ﻳﻚ ﭘﺎﻟﺲ ﺑـﻪ ﻋـﺮض ﻳـﻚ ﺳـﻴﻜﻞ اﻳﺠـﺎد‬

‫ﺧﻮاﻫﺪ ﻛﺮد. در ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي اﻳﻦ ﭘﺎﻟﺲ، ﺗﺎﻳﻤﺮ ﺗﺎﺧﻴﺮ ﺷﺮوع ﺑﻪ ﺷﻤﺎرش زﻣﺎن ﺗﺎﺧﻴﺮ ﻛﺮده و ﭘـﺲ ازاﺗﻤـﺎم آن‬

                                                               ‫ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻛﺎر ﻋﺎدي ﺧﻮد را اداﻣﻪ ﺧﻮاﻫﺪ داد.‬




                                                      ‫- ٦١ -‬
P a g e | 17
        www.avr.ir                                                             www.pnkavosh.com 



                                                               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




                                                      - ١٧ -
‫81 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




                                    ‫آﺷﻨﺎﻳﻲ ﺑﺎ زﺑﺎن ‪C‬‬


                                ‫• ﻫﺮ ﺑﺮﻧﺎﻣﻪ ي ‪ C‬ﺣﺪاﻗﻞ ﻳﻚ ﺗﺎﺑﻊ )(‪ main‬دارد. )اﻳﻦ اوﻟﻴﻦ ﺗﺎﺑﻊ اﺟﺮاﻳﻲ اﺳﺖ.(‬

                                    ‫• ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮي در ﺳﺎده ﺗﺮﻳﻦ ﺣﺎﻟﺖ ﺧﻮد ﺑﻪ ﺷﻜﻞ زﻳﺮ اﺳﺖ:‬

‫ﺗﻌﺎرﻳﻒ ﻛﻠﻲ‬

‫اﻟﮕﻮي ﺗﻮاﺑﻊ‬



‫)(‪void main‬‬
‫{‬
               ‫{)1(‪while‬‬
                         ‫.‬
                         ‫.‬
                         ‫.‬
               ‫}‬
‫}‬


‫ﺗﻮاﺑﻊ ﺗﻌﺮﻳﻒ ﺷﺪه‬



                         ‫• ﺑﺮﻧﺎﻣﻪ ي ﺳﺎده ي زﻳﺮ رﺷﺘﻪ ي ‪ Hello World‬را ﺑﻪ ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد ارﺳﺎل ﻣﻲ ﻛﻨﺪ.‬




                                                        ‫- ٨١ -‬
‫91 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬


‫>‪#include<stdio.h‬‬


‫)(‪void main‬‬
‫{‬
       ‫;)"!‪printf("Hello World‬‬
       ‫;)1(‪while‬‬
‫}‬


                                                              ‫• ﺧﻂ اول از رﻫﻨﻤﻮد ﻫﺎي ﭘﻴﺶ ﭘﺮدازﻧﺪه اﺳﺖ.‬

                                                       ‫• )1(‪ while‬اﻳﺠﺎد ﻳﻚ ﺣﻠﻘﻪ ي ﻧﺎﻣﺘﻨﺎﻫﻲ ﻣﻲ ﻛﻨﺪ.‬

                                                              ‫• در اﻧﺘﻬﺎي ﻫﺮ ﻋﺒﺎرت ﻳﻚ ﺳﻤﻲ ﻛﺎﻟﻦ ﻣﻲ آﻳﺪ.‬

                                 ‫• ‪ Brace‬اﺑﺘﺪا و اﻧﺘﻬﺎي ﻳﻚ ﺗﺎﺑﻊ و ﻫﻤﭽﻨﻴﻦ ﻳﻚ ﺑﻠﻮك را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.‬

                              ‫• از " " ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن اﺑﺘﺪا و اﻧﺘﻬﺎي ﻳﻚ رﺷﺘﻪ ي ﻣﺘﻨﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.‬

                                             ‫• از // ﻳﺎ /* … */ ﺑﺮاي ﻧﻮﺷﺘﻦ ﺗﻮﺿﻴﺤﺎت اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.‬

                                                      ‫• ﺷﻨﺎﺳﻪ ﻫﺎ اﺳﺎﻣﻲ ﻣﺘﻐﻴﺮﻫﺎ، ﺛﻮاﺑﺖ و ﻳﺎ ﺗﻮاﺑﻊ ﻫﺴﺘﻨﺪ.‬

‫• ﺷﻨﺎﺳﻪ ﻫﺎ ﻧﻤﻲ ﺗﻮاﻧﺪ از ﻛﻠﻤﺎت رزرو ﺷﺪه ﺑﺎﺷﻨﺪ و ﻫﻤﭽﻨﻴﻦ ﻧﻤﻲ ﺗﻮاﻧﻨﺪ ﺑﺎ ﻳﻚ ﻛﺎراﻛﺘﺮ ﻋﺪدي ﺷﺮوع ﺷﻮد و ﻃﻮل‬

                                                                        ‫آن ﻫﺎ ﺑﺎﻳﺪ ﻛﻤﺘﺮ از 13 ﻛﺎراﻛﺘﺮ ﺑﺎﺷﺪ.‬

                   ‫• ‪ C‬ﻳﻚ زﺑﺎن ‪ Case Sensitive‬اﺳﺖ و ﺑﻴﻦ ﺣﺮوف ﻛﻮﭼﻚ و ﺑﺰرگ ﺗﻔﺎوت ﻗﺎﺋﻞ ﻣﻲ ﺷﻮد.‬

                    ‫• ﻛﻠﻤﺎت رزرو ﺷﺪه ﺣﺘﻤﺎ ﺑﺎﻳﺪ ﺑﺎ ﺣﺮف ﻛﻮﭼﻚ اﺳﺘﻔﺎده ﺷﻮﻧﺪ. )ﻣﺜﻞ …,‪(if, char, while‬‬




                                                     ‫- ٩١ -‬
P a g e | 20
        www.avr.ir                                                                                    www.pnkavosh.com 



                                                                                                           ‫ﻣﺘﻐﻴﺮ ﻫﺎ و ﺛﻮاﺑﺖ‬

                                                               ‫• ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ ﻳﻌﻨﻲ اﻧﺘﺨﺎب ﻧﺎم ﻣﺴﺘﻌﺎر ﺑﺮاي ﻣﻜﺎﻧﻲ از ﺣﺎﻓﻈﻪ‬

               char a ;                          :‫ﻣﺜﺎل‬                    ‫; ﻧﺎم ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮ‬              :‫• ﻓﺮم ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ‬



                                                                                                           :‫اﻧﻮاع داده ﻫﺎ‬


                     Type                        Size (Bits)            Range

                     bit                         1                               0,1

                     char                        8                               -128 to 127

                     unsigned char               8                               0 to 255

                     signed char                 8                               -128 to 127

                     int                         16                              -32768 to 32767

                     short int                   16                              -32768 to 32767

                     unsigned int                16                              0 to 65535

                     signed int                  16                              -32768 to 32767

                     long int                    32                              -2147483648 to 2147483647

                     unsigned long int           32                              0 to 4294967295

                     signed long int             32                              -2147483648 to 2147483647

                     float                       32                              ±1.175e-38 to ±3.402e38

                     double                      32                              ±1.175e-38 to ±3.402e38




int b@0xA3;                              :‫ﻣﺜﺎل‬           .‫• ﺑﺮاي ﺗﻌﻴﻴﻦ ﻣﺤﻞ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ از ﻋﻤﻠﮕﺮ @ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ‬




 .‫ ﻗﺒﻞ از ﻧﺎم ﻣﺘﻐﻴﺮ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ‬eeprom ‫ از ﻛﻠﻤﻪ ي ﻛﻠﻴﺪي‬EEPROM ‫• ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ در ﺣﺎﻓﻈﻪ ي‬

                                                                         eeprom int code;                           :‫ﻣﺜﺎل‬




                                                                        - ٢٠ -
‫12 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                  ‫ ‬                        ‫ ‪       www.pnkavosh.com‬‬
       ‫;'‪char s = 'a‬‬                         ‫ﻣﺜﺎل:‬          ‫• ﻣﻲ ﺗﻮان در زﻣﺎن ﺗﻌﺮﻳﻒ ﺑﻪ ﻣﺘﻐﻴﺮ ﻣﻘﺪار اوﻟﻴﻪ داد.‬

         ‫; 41.3 = ‪const float pi‬‬       ‫• ﺗﻌﺮﻳﻒ ﺛﺎﺑﺖ ﺑﺎ ﻛﻠﻤﻪ ي ﻛﻠﻴﺪي ‪ const‬ﻳﺎ ‪ flash‬اﻧﺠﺎم ﻣﻲ ﺷﻮد. ﻣﺜﺎل:‬

  ‫• ﺑﺎ رﻫﻨﻤﻮد ‪ #define‬ﻣﻲ ﺗﻮان ﻣﺎﻛﺮو ﺗﻌﺮﻳﻒ ﻧﻤﻮد، در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘﺪاري ﻛﻪ ﺑﺮاي ﺛﺎﺑﺖ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد ﻧﻮع‬

                 ‫داده را ﺗﻌﻴﻴﻦ ﻛﺮده و ﻣﻘﺎدﻳﺮ ﺗﻌﺮﻳﻒ ﺷﺪه، ﺗﻮﺳﻂ ﭘﻴﺶ ﭘﺮدازﻧﺪه ﺑﺎ ﻣﻘﺪار ﺛﺎﺑﺖ ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲ ﺷﻮد.‬

                                                        ‫; 001 ‪#define code‬‬                           ‫ﻣﺜﺎل:‬




                                                                                   ‫ﻋﻤﻠﮕﺮﻫﺎي ﺣﺴﺎﺑﻲ و ﺑﻴﺘﻲ‬



                               ‫ﻧﺘﻴﺠﻪ‬          ‫ﻣﺜﺎل‬             ‫ﻋﻤﻠﻜﺮد‬      ‫ﻋﻤﻠﮕﺮ‬


                                ‫6‬             ‫2*3‬              ‫ﺿﺮب‬           ‫*‬


                                ‫5.2‬           ‫2/ 5‬             ‫ﺗﻘﺴﻴﻢ‬         ‫/‬


                                ‫9‬             ‫6+ 3‬              ‫ﺟﻤﻊ‬         ‫+‬


                                ‫5‬             ‫3-8‬              ‫ﺗﻔﺮﻳﻖ‬         ‫-‬


                                ‫1‬            ‫3%01‬             ‫ﺑﺎﻗﻴﻤﺎﻧﺪه‬     ‫%‬

                               ‫00‪0x‬‬       ‫‪0xF0 & 0x0F‬‬          ‫‪AND‬‬          ‫&‬

                               ‫30‪0x‬‬       ‫30‪0x00 | 0x‬‬           ‫‪OR‬‬           ‫|‬

                               ‫0‪0xF‬‬       ‫‪0x0F ^ 0xFF‬‬          ‫‪XOR‬‬          ‫^‬

                               ‫‪0x0F‬‬         ‫)0‪~(0xF‬‬           ‫ﻣﻜﻤﻞ ﻳﻚ‬       ‫~‬


                               ‫‪0x0F‬‬        ‫4 >> 0‪0xF‬‬        ‫ﺷﻴﻔﺖ ﺑﻪ راﺳﺖ‬    ‫>>‬


                               ‫0‪0xF‬‬        ‫4 << ‪0x0F‬‬        ‫ﺷﻴﻔﺖ ﺑﻪ ﭼﭗ‬      ‫<<‬




                                                            ‫- ١٢ -‬
‫22 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                            ‫ ‪       www.pnkavosh.com‬‬



                                                                                        ‫ﻋﻤﻠﮕﺮﻫﺎي ﻳﻜﺎﻧﻲ‬




                            ‫ﻧﺘﻴﺠﻪ‬        ‫ﻣﺜﺎل‬            ‫ﻋﻤﻠﻜﺮد‬          ‫ﻋﻤﻠﮕﺮ‬


                         ‫1- × ‪a = a‬‬      ‫‪-a‬‬                ‫ﻗﺮﻳﻨﻪ‬           ‫-‬


                         ‫1+‪a=a‬‬          ‫++‪a‬‬           ‫اﻓﺰاﻳﺶ ﻳﻚ واﺣﺪ‬      ‫++‬


                         ‫1-‪a=a‬‬           ‫--‪a‬‬          ‫ﻛﺎﻫﺶ ﻳﻚ واﺣﺪ‬        ‫--‬




                                                                                     ‫ﻋﻤﻠﮕﺮﻫﺎي ﻣﻘﺎﻳﺴﻪ اي‬



                           ‫ﻧﺘﻴﺠﻪ‬        ‫ﻣﺜﺎل‬               ‫ﻋﻤﻠﻜﺮد‬        ‫ﻋﻤﻠﮕﺮ‬


                          ‫‪False‬‬         ‫3>2‬                ‫ﺑﺰرﮔﺘﺮ‬          ‫>‬


                          ‫‪True‬‬         ‫'‪'m'>'e‬‬            ‫ﻛﻮﭼﻜﺘﺮ‬           ‫<‬


                          ‫‪True‬‬         ‫5=>5‬            ‫ﺑﺰرﮔﺘﺮ ﻳﺎ ﻣﺴﺎوي‬    ‫=>‬


                          ‫‪True‬‬        ‫4=<5.2‬          ‫ﻛﻮﭼﻜﺘﺮ ﻳﺎ ﻣﺴﺎوي‬     ‫=<‬


                          ‫‪False‬‬       ‫'‪'A' =='B‬‬            ‫ﺗﺴﺎوي‬          ‫==‬


                          ‫‪True‬‬         ‫3=!2‬               ‫ﻧﺎﻣﺴﺎوي‬          ‫=!‬




                                                        ‫- ٢٢ -‬
‫32 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                       ‫ ‬                          ‫ ‪       www.pnkavosh.com‬‬




                                                                                                 ‫ﻋﻤﻠﮕﺮﻫﺎي ﻣﻨﻄﻘﻲ‬



                             ‫ﻧﺘﻴﺠﻪ‬               ‫ﻣﺜﺎل‬                  ‫ﻋﻤﻠﻜﺮد‬      ‫ﻋﻤﻠﮕﺮ‬


                             ‫‪False‬‬     ‫)3=!1(&&)3>2(‬                ‫‪ AND‬ﻣﻨﻄﻘﻲ‬         ‫&&‬


                             ‫‪True‬‬        ‫)01(||)3<'‪('a‬‬              ‫‪ OR‬ﻣﻨﻄﻘﻲ‬            ‫||‬


                             ‫‪False‬‬             ‫)5>7(!‬                    ‫ﻧﻘﻴﺾ‬           ‫!‬




                                                                                                 ‫ﻋﻤﻠﮕﺮﻫﺎي اﻧﺘﺴﺎب‬



                          ‫ﻧﺘﻴﺠﻪ‬         ‫ﻣﺜﺎل‬               ‫ﻋﻤﻠﻜﺮد‬               ‫ﻋﻤﻠﮕﺮ‬


                         ‫‪a‬‬     ‫‪b‬‬       ‫‪a=b‬‬                 ‫اﻧﺘﺴﺎب‬                ‫=‬


                         ‫‪a=a*b‬‬         ‫‪a*=b‬‬             ‫ﺿﺮب و اﻧﺘﺴﺎب‬             ‫=*‬


                         ‫‪a=a/b‬‬         ‫‪a/=b‬‬             ‫ﺗﻘﺴﻴﻢ و اﻧﺘﺴﺎب‬           ‫=/‬


                         ‫‪a=a+b‬‬        ‫‪a+= b‬‬             ‫ﺟﻤﻊ و اﻧﺘﺴﺎب‬            ‫=+‬


                         ‫‪a=a-b‬‬         ‫‪a-=b‬‬             ‫ﺗﻔﺮﻳﻖ و اﻧﺘﺴﺎب‬           ‫=-‬

                              ‫اﮔﺮ ‪ value‬ﻣﻘﺪار‬

                         ‫ﺻﺤﻴﺢ ﺑﺎﺷﺪ ‪ a‬ﺑﺮاﺑﺮ ‪x‬‬
                                                        ‫اﻧﺘﺴﺎب ﺷﺮﻃﻲ‬        ‫‪a=(value)?x:y‬‬
                         ‫و در ﻏﻴﺮاﻳﻨﺼﻮرت ﺑﺮاﺑﺮ‬

                                     ‫‪ y‬ﻣﻲ ﺷﻮد.‬




                                                                 ‫- ٣٢ -‬
‫42 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                       ‫ ‪       www.pnkavosh.com‬‬



                                                                                                   ‫آراﻳﻪ ﻫﺎ‬

                                                                ‫آراﻳﻪ ﻫﺎ ﻣﺠﻤﻮﻋﻪ اي از ﻣﺘﻐﻴﺮﻫﺎي ﻫﻤﻨﻮع ﻫﺴﺘﻨﺪ.‬

                                        ‫; ]ﺗﻌﺪاد ﻋﻨﺎﺻﺮ[اﺳﻢ ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮﻫﺎي آراﻳﻪ‬          ‫• ﻓﺮم ﺗﻌﺮﻳﻒ:‬

                                                        ‫;]5[‪int a‬‬                                   ‫• ﻣﺜﺎل:‬

                                                       ‫;}5,4,3,2,1{ = ]5[‪int a‬‬                 ‫ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ:‬

       ‫ﻓﺮم ﺗﻌﺮﻳﻒ آراﻳﻪ ﻫﺎي دو ﺑﻌﺪي: ;]ﻋﺪاد ﻋﻨﺎﺻﺮ ﺳﺘﻮن[]ﺗﻌﺪاد ﻋﻨﺎﺻﺮ ﺳﻄﺮ[اﺳﻢ ﻣﺘﻐﻴﺮ ﻧﻮع ﻣﺘﻐﻴﺮﻫﺎ‬                 ‫•‬

                                                       ‫;}}6,5,4{,}3,2,1{{=]3[]2[‪int a‬‬                ‫ﻣﺜﺎل:‬

                                                ‫در زﺑﺎن ‪ C‬اﻧﺪﻳﺲ آراﻳﻪ ﻫﺎ از ﺻﻔﺮ ﺷﺮوع ﻣﻲ ﺷﻮد.‬                 ‫•‬



                                                                                                    ‫رﺷﺘﻪ ﻫﺎ‬

                                                                            ‫رﺷﺘﻪ ﻫﺎ آراﻳﻪ اي ﻛﺎراﻛﺘﺮﻫﺎ ﻫﺴﺘﻨﺪ.‬

                                                       ‫;"‪char name[ ] = "Test‬‬                      ‫ﻣﺜﺎل:‬     ‫•‬

                                                      ‫;}'0\','‪char name[5]={'T','e','s','t‬‬         ‫ﻳﺎ:‬

                                                  ‫• رﺷﺘﻪ ﻫﺎ ﻫﻤﻮاره ﺑﻪ ﻳﻚ ﻛﺎراﻛﺘﺮ ‪ Null‬ﺧﺘﻢ ﻣﻲ ﺷﻮﻧﺪ.‬




                                                       ‫- ٤٢ -‬
‫52 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                      ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬


                               ‫ﺗﺼﻤﻴﻢ ﮔﻴﺮي و اﻧﺘﺨﺎب‬



                                                                                ‫دﺳﺘﻮر ‪:goto‬‬

                                                     ‫ﭘﺮش ﺑﺪون ﺷﺮط ﺑﻪ ﻳﻚ ﺑﺮﭼﺴﺐ اﻧﺠﺎم ﻣﻲ ﺷﻮد.‬




                                                                           ‫ﺳﺎﺧﺘﺎر ‪:if - else‬‬

‫)ﺷﺮط(‪if‬‬
‫{‬
        ‫;دﺳﺘﻮرات1‬

‫}‬
‫‪else‬‬
‫{‬
        ‫;دﺳﺘﻮرات 2‬

‫}‬
                         ‫در ﺻﻮرﺗﻲ ﻛﻪ دﺳﺘﻮرات ﻳﻚ ﺧﻄﻲ ﺑﺎﺷﻨﺪ ﻣﻲ ﺗﻮان ‪ brace‬را ﺣﺬف ﻧﻤﻮد.‬

                                                         ‫اﺳﺘﻔﺎده از ﺑﻼك ‪ else‬اﺧﺘﻴﺎري اﺳﺖ.‬



                                                                                            ‫ﻣﺜﺎل:‬




‫>‪#include<stdio.h‬‬



‫{)(‪void main‬‬

                                                ‫- ٥٢ -‬
P a g e | 26
        www.avr.ir                                                      www.pnkavosh.com 



        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 ‫ﺳﺎﺧﺘﺎر‬

switch(‫)ﻣﻘﺪار‬

{
       case       1‫:ﻣﻘﺪار‬

       1‫;دﺳﺘﻮرات‬

       break;
       case       2‫:ﻣﻘﺪار‬

       2‫;دﺳﺘﻮرات‬

       break;
                                                    - ٢٦ -
P a g e | 27
        www.avr.ir                                  www.pnkavosh.com 
       .
       .
       default:
       n ‫;دﺳﺘﻮرات‬

}
                                                                        :‫ﻣﺜﺎل‬

#include<stdio.h>


void main(){


       int a;
       printf("Enter Month of your birth: ");
       scanf("%d",&a);


       switch(a){


        case 1:
        case 2:
        case 3: printf("You've born is spring\n");
        break;


        case 4:
        case 5:
        case 6: printf("You've born is summer\n");
        break;


        case 7:
        case 8:
        case 9: printf("You've born is autumn\n");

                                    - ٢٧ -
P a g e | 28
        www.avr.ir                                    www.pnkavosh.com 
        break;


        case 10:
        case 11:
        case 12: printf("You've born is winter\n");
        break;


        default: printf("Error! Enter a number between 1-
       12\n");


       }


}


                            ‫ﺣﻠﻘﻪ ﻫﺎي ﺗﻜﺮار‬




                                                           :While ‫ﺳﺎﺧﺘﺎر‬

while(‫)ﺷﺮط‬

{
       ‫;دﺳﺘﻮرات‬

}


                                                                          :‫ﻣﺜﺎل‬

#include<stdio.h>


void main(){


                                      - ٢٨ -
‫92 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                          ‫ ‬               ‫ ‪       www.pnkavosh.com‬‬


       ‫;‪char a‬‬


       ‫;)"‪printf("Enter E to exit\n‬‬
       ‫;)(‪while(a != 'E') a=getchar‬‬


‫}‬




                                                                         ‫ﺳﺎﺧﺘﺎر ‪:Do/While‬‬

‫{‪do‬‬
       ‫;دﺳﺘﻮرات‬

‫)ﺷﺮط(‪} while‬‬



    ‫در ﺳﺎﺧﺘﺎر ‪ Do/While‬ﺑﺮ ﺧﻼف ‪ While‬ﺷﺮط در اﻧﺘﻬﺎي ﺣﻠﻘﻪ آزﻣﺎﻳﺶ ﻣﻲ ﺷﻮد، ﺑﻨﺎﺑﺮاﻳﻦ دﺳﺘﻮرات داﺧﻞ‬

                                                                  ‫ﺣﻠﻘﻪ، ﺣﺪاﻗﻞ ﻳﻜﺒﺎر اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ.‬




                                                                              ‫ﺣﻠﻘﻪ ﻫﺎي ‪:For‬‬

‫)ﮔﺎم ; ﺷﺮط ﭘﺎﻳﺎن ; ﻣﻘﺪار اﺑﺘﺪاي ﺣﻠﻘﻪ(‪for‬‬

       ‫{‬
       ‫;دﺳﺘﻮرات‬

       ‫}‬




                                                    ‫- ٩٢ -‬
P a g e | 30
        www.avr.ir                                  www.pnkavosh.com 


                                                                        :‫ﻣﺜﺎل‬




#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);
       }
}




                                    - ٣٠ -
‫13 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                 ‫ ‬              ‫ ‪       www.pnkavosh.com‬‬
                                       ‫دﺳﺘﻮر ‪ break‬ﺑﺎﻋﺚ ﺧﺮوج ﺑﺪون ﺷﺮط از ﻫﺮ ﺣﻠﻘﻪ اي ﻣﻲ ﺷﻮد.‬

           ‫دﺳﺘﻮر ‪ continue‬ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد اﺟﺮاي اداﻣﻪ دﺳﺘﻮرات ﻣﺘﻮﻗﻒ ﺷﺪه و ﺣﻠﻘﻪ از اﺑﺘﺪا آﻏﺎز ﺷﻮد.‬


                                                     ‫ﺗﻮاﺑﻊ‬


                                                                      ‫ﺗﻌﺮﻳﻒ ﺗﻮاﺑﻊ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬




‫ﻧﻮع داده ﺧﺮوﺟﻲ‬        ‫)آرﮔﻮﻣﺎﻧﻬﺎي ﺗﺎﺑﻊ( ﻧﺎم ﺗﺎﺑﻊ‬

                  ‫{‬
                                      ‫ﻣﺘﻐﻴﺮﻫﺎي ﻣﺤﻠﻲ‬

                                      ‫دﺳﺘﻮرات ﺗﺎﺑﻊ‬

                  ‫}‬




                          ‫ﺗﻮاﺑﻊ داﺧﻞ ﻳﻜﺪﻳﮕﺮ ﻗﺎﺑﻞ ﺗﻌﺮﻳﻒ ﻧﻤﻲ ﺑﺎﺷﻨﺪ و ﺟﺪا از ﻫﻢ ﺑﺎﻳﺪ ﺗﻌﺮﻳﻒ ﮔﺮدﻧﺪ.‬


                                                                                                 ‫ﻣﺜﺎل:‬




‫>‪#include <stdio.h‬‬



‫;)‪long int cube(int x‬‬



‫{)(‪void main‬‬

                                                           ‫- ١٣ -‬
P a g e | 32
        www.avr.ir                                    www.pnkavosh.com 



           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.avr.ir                              www.pnkavosh.com 
}


int _max(int a,int b){
        if(a>b)
                return a;
        else
                return b;
}




                                - ٣٣ -
P a g e | 34
        www.avr.ir                                                www.pnkavosh.com 


                                                                        ‫ﭘﺮوژه 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.avr.ir                                   www.pnkavosh.com 


        for(i = 64; i > 1; i = i/2)
        {
                PORTD = i;
                delay_ms(100);
        }


       }


}




                                     - ٣٥ -
P a g e | 36
        www.avr.ir                                         www.pnkavosh.com 


                                                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.avr.ir                                                  www.pnkavosh.com 
        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;
       }


}




                                                    - ٣٧ -
‫83 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                          ‫ ‬                    ‫ ‪       www.pnkavosh.com‬‬




   ‫ﺟﺪول زﻳﺮ وﺿﻌﻴﺖ ﺳﮕﻤﻨﺖ ﻫﺎي ‪ 7-Seg‬ﻛﺎﺗﺪ ﻣﺸﺘﺮك را ﻧﺸﺎن ﻣﻲ دﻫﺪ. )ﺑﺮاي ﻧﻮع آﻧﺪ ﻣﺸﺘﺮك اﻋﺪادرا ﻣﻜﻤﻞ‬

                                                                                        ‫ﻛﻨﻴﺪ.(‬


                  ‫ﻛﺎراﻛﺘﺮ‬   ‫‪Dp‬‬   ‫‪g‬‬     ‫‪f‬‬    ‫‪e‬‬       ‫‪d‬‬        ‫‪c‬‬   ‫‪b‬‬      ‫‪a‬‬    ‫‪HEX‬‬


                    ‫0‬       ‫0‬    ‫0‬    ‫1‬     ‫1‬       ‫1‬        ‫1‬   ‫1‬      ‫1‬    ‫‪0x3F‬‬

                    ‫1‬       ‫0‬    ‫0‬    ‫0‬     ‫0‬       ‫0‬        ‫1‬   ‫1‬      ‫0‬    ‫60‪0x‬‬

                    ‫2‬       ‫0‬    ‫1‬    ‫0‬     ‫1‬       ‫1‬        ‫0‬   ‫1‬      ‫1‬    ‫‪0x5B‬‬

                    ‫3‬       ‫0‬    ‫1‬    ‫0‬     ‫0‬       ‫1‬        ‫1‬   ‫1‬      ‫1‬    ‫‪0x4F‬‬

                    ‫4‬       ‫0‬    ‫1‬    ‫1‬     ‫0‬       ‫0‬        ‫1‬   ‫1‬      ‫0‬    ‫66‪0x‬‬

                    ‫5‬       ‫0‬    ‫1‬    ‫1‬     ‫0‬       ‫1‬        ‫1‬   ‫0‬      ‫1‬    ‫‪0x6D‬‬

                    ‫6‬       ‫0‬    ‫1‬    ‫1‬     ‫1‬       ‫1‬        ‫1‬   ‫0‬      ‫1‬    ‫‪0x7D‬‬

                    ‫7‬       ‫0‬    ‫0‬    ‫0‬     ‫0‬       ‫0‬        ‫1‬   ‫1‬      ‫1‬    ‫70‪0x‬‬

                    ‫8‬       ‫0‬    ‫1‬    ‫1‬     ‫1‬       ‫1‬        ‫1‬   ‫1‬      ‫1‬    ‫‪0x7F‬‬

                    ‫9‬       ‫0‬    ‫1‬    ‫1‬     ‫0‬       ‫1‬        ‫1‬   ‫1‬      ‫1‬    ‫‪0x6F‬‬

                    ‫‪A‬‬       ‫0‬    ‫1‬    ‫1‬     ‫1‬       ‫0‬        ‫1‬   ‫1‬      ‫1‬    ‫77‪0x‬‬

                    ‫‪b‬‬       ‫0‬    ‫1‬    ‫1‬     ‫1‬       ‫1‬        ‫1‬   ‫0‬      ‫0‬    ‫‪0x7C‬‬


                                                    ‫- ٨٣ -‬
P a g e | 39
        www.avr.ir                                                   www.pnkavosh.com 
                    C    0   0   1   1       1        0   0      1    0x39

                    d    0   1   0   1       1        1   1      0    0x5E

                    E    0   1   1   1       1        0   0      1    0x79

                    F    0   1   1   1       0        0   0      1    0x71




                                             - ٣٩ -
P a g e | 40
        www.avr.ir                                       www.pnkavosh.com 



                                               (LCD) ‫ﭘﺮوژه 3: ﻧﻤﺎﻳﺸﮕﺮ ﻛﺮﻳﺴﺘﺎل ﻣﺎﻳﻊ‬




/*****************************************************
Project : LCD Interfacing
Author         : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/


#include <stdio.h>
#include <mega16.h>
#include <delay.h>
#include <lcd.h>
#define xtal 4000000




#asm
      .equ __lcd_port=0x1B ;PORTA
#endasm


void main(void)
{
        char buffer[10];
        unsigned char w;


        PORTB=0xFF;
        DDRB=0x00;



                                      - ٤٠ -
P a g e | 41
        www.avr.ir                                              www.pnkavosh.com 
        lcd_init(16);
        lcd_clear();


        while (1){


               w = ~PINB;


               if(w!=0x00)
               {
                         lcd_clear();
                         lcd_gotoxy(0,0);
                         sprintf(buffer,"Number=%d",w);
                         lcd_puts(buffer);
                         delay_ms(100);
                   }
                   else
                   {
                         lcd_clear();
                         lcd_putsf("Number=0");
                         delay_ms(100);
                   }
        }
}




                                                - ٤١ -
P a g e | 42
        www.avr.ir                           www.pnkavosh.com 




                             - ٤٢ -
P a g e | 43
        www.avr.ir                                    www.pnkavosh.com 



                                               ‫ﭘﺮوژه 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.avr.ir                                             www.pnkavosh.com 
            PORTC = 0xf0;
            delay_us(5);
            key = PINC;


            DDRC = 0xf0;
            PORTC = 0x0f;
            delay_us(5);
            key = key | PINC;


            delay_ms(10);


            if (key != 0xff)
            {
                for (butnum=0; butnum<16; butnum++)
                {
                     if (keytbl[butnum]==key)          break;
                }
                if (butnum==16) butnum=0;
                         else butnum++;
            }
            else butnum=0;


            PORTB = ~ butnum ;


        }
    }




                                              - ٤٤ -
P a g e | 45
        www.avr.ir                           www.pnkavosh.com 




                             - ٤٥ -
P a g e | 46
        www.avr.ir                                              www.pnkavosh.com 



                                                   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<<k);
                                  delay_us(100);

                                          - ٤٦ -
P a g e | 47
        www.avr.ir                                   www.pnkavosh.com 
                             PORTB=0xFF;
                         }
               }
}




                                     - ٤٧ -
P a g e | 48
        www.avr.ir                                                                         www.pnkavosh.com 



                                            ‫وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ‬



        .‫ داراي 12 ﻣﻨﺒﻊ وﻗﻔﻪ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ 3 ﻣﻮرد از آن ﻫﺎ وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﻣﻲ ﺑﺎﺷﻨﺪ‬ATmega16 ‫ﻗﻄﻌﻪ ي‬                       •



                          ‫ﻧﺎم در‬
           ‫ﺷﻤﺎره‬                   ‫آدرس‬          ‫ﻣﻨﺒﻊ وﻗﻔﻪ‬                             ‫ﺗﻮﺿﻴﺢ‬
                    CodeVision
                                                                  External Pin, Power-on Reset, Brown-out Reset,
               1                   $000   RESET
                                                                  Watchdog Reset, and JTAG AVR Reset
               2    EXT_INT0       $002   INT0                   External Interrupt Request 0

               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




                                                                 - ٤٨ -
‫94 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                               ‫ ‬                          ‫ ‪       www.pnkavosh.com‬‬
               ‫91‬   ‫2‪EXT_INT‬‬          ‫420$‬       ‫2‪INT‬‬                        ‫2 ‪External Interrupt Request‬‬

               ‫02‬   ‫‪TIM0_COMP‬‬         ‫620$‬       ‫‪TIMER0 COMP‬‬                 ‫‪Timer/Counter0 Compare Match‬‬

               ‫12‬   ‫‪SPM_READY‬‬         ‫820$‬       ‫‪SPM_RDY‬‬                     ‫‪Store Program Memory Ready‬‬




‫• آدرس ﻫﺎي ﭘﺎﻳﻴﻦ ﺗﺮ داراي اوﻟﻮﻳﺖ ﺑﺎﻻﺗﺮي ﻣﻲ ﺑﺎﺷﻨﺪ و در ﺻﻮرت درﺧﻮاﺳﺖ ﻫﻤﺰﻣﺎن دو ﻳﺎ ﭼﻨﺪ وﻗﻔﻪ اﺑﺘﺪا ﺑﻪ‬

               ‫اوﻟﻮﻳﺖ ﺑﺎﻻﺗﺮ ﭘﺎﺳﺦ داده ﻣﻲ ﺷﻮد و ﭘﺲ از آن ﺑﻪ ﺑﻘﻴﻪ ي وﻗﻔﻪ ﻫﺎ ﺑﺮ ﺣﺴﺐ اوﻟﻮﻳﺖ رﺳﻴﺪﮔﻲ ﻣﻲ ﺷﻮد.‬




‫ﺑﺮاي ﻓﻌﺎل ﻛﺮدن ﻫﺮ ﻳﻚ از وﻗﻔﻪ ﻫﺎ ﺑﺎﻳﺪ اﺑﺘﺪا ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ را ﺑﺎ دﺳﺘﻮر اﺳﻤﺒﻠﺮ ‪ SEI‬ﻳﺎ ﻣﻘﺪار دﻫﻲ‬

                                                                                                           ‫رﺟﻴﺴﺘﺮ ‪ SREG‬ﻓﻌﺎل ﻧﻤﻮد:‬



                               ‫‪Bit‬‬           ‫7‬          ‫6‬        ‫5‬       ‫4‬        ‫3‬       ‫2‬        ‫1‬       ‫0‬

                           ‫‪SREG‬‬              ‫‪I‬‬



‫• ﺑﺎ روﻳﺪاد ﻫﺮ وﻗﻔﻪ ي ﺧﺎرﺟﻲ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﺷﺪه و در ﻧﺘﻴﺠﻪ ﺗﻤﺎم وﻗﻔﻪ ﻫﺎي دﻳﮕﺮ ﻏﻴﺮ ﻓﻌﺎل ﻣـﻲ ﺷـﻮﻧﺪ در‬

‫اﻳﻦ ﺣﺎﻟﺖ ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ آن را ﻣﺠﺪدا ﻓﻌﺎل ﻛﻨﺪ و ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﻫـﺎي‬

                                                 ‫ﺗﻮ در ﺗﻮ ﺷﻮد. ﺑﺎ ﺑﺎزﮔﺸﺖ از ‪ ISR‬اﻳﻦ ﺑﻴﺖ ﻣﺠﺪدا ﻳﻚ ﻣﻲ ﺷﻮد.‬




   ‫ﺑﺮاي اﺳﺘﻔﺎده از ﻫﺮﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ ﺑﺎﻳﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ﻣﺮﺑﻮﻃﻪ در رﺟﻴﺴﺘﺮ ‪ GICR‬آن را ﻓﻌﺎل ﻧﻤﻮد:‬



                               ‫‪Bit‬‬           ‫7‬               ‫6‬               ‫5‬        ‫4‬   ‫3‬    ‫2‬       ‫1‬    ‫0‬

                               ‫‪GICR‬‬      ‫1‪INT‬‬               ‫0‪INT‬‬         ‫2‪INT‬‬




                                                                         ‫- ٩٤ -‬
‫05 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                     ‫ ‬                              ‫ ‪       www.pnkavosh.com‬‬
                ‫• وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ 0،1 و 2 ﺑﻪ ﺗﺮﺗﻴﺐ از ﭘﻴﻦ ﻫﺎي 2‪ PD3 ،PD‬و 2‪ PB‬ﺗﺮﻳﮕﺮ ﻣﻲ ﺷﻮﻧﺪ.‬



 ‫ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن ﻫﺮﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ 0 و 1 ﺑﻮﺳﻴﻠﻪ ي ﭼﻬﺎرﺑﻴﺖ اول رﺟﻴﺴﺘﺮ ‪ MCUCR‬ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:‬



                               ‫‪Bit‬‬         ‫7‬   ‫6‬   ‫5‬   ‫4‬        ‫3‬             ‫2‬          ‫1‬          ‫0‬

                         ‫‪MCUCSR‬‬                            ‫11‪ISC‬‬         ‫01‪ISC‬‬        ‫10‪ICS‬‬      ‫00‪ISC‬‬




                                                                         ‫ﺣﺎﻟﺖ ﻫﺎي ﻣﺨﺘﻠﻒ ﺑﻴﺖ ﻫﺎي ]0:3[‪:MCUCR‬‬




                         ‫10‪ISC‬‬       ‫00‪ISC‬‬                 ‫ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن وﻗﻔﻪ ي ﺻﻔﺮ‬


                           ‫0‬           ‫0‬                                     ‫ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﺻﻔﺮ در ﭘﻴﻦ 0‪INT‬‬


                           ‫0‬           ‫1‬                                     ‫ﺗﻐﻴﻴﺮ در ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﭘﻴﻦ 0‪INT‬‬


                           ‫1‬           ‫0‬                                     ‫ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه در ﭘﻴﻦ 0‪INT‬‬


                           ‫1‬           ‫1‬                                      ‫ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه در ﭘﻴﻦ 0‪INT‬‬




                         ‫11‪ISC‬‬       ‫01‪ISC‬‬                     ‫ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن وﻗﻔﻪ ي ﻳﻚ‬


                           ‫0‬           ‫0‬                                     ‫ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﺻﻔﺮ در ﭘﻴﻦ 1‪INT‬‬


                           ‫0‬           ‫1‬                                     ‫ﺗﻐﻴﻴﺮ در ﺳﻄﺢ ﻣﻨﻄﻘﻲ ﭘﻴﻦ 1‪INT‬‬


                           ‫1‬           ‫0‬                                     ‫ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه در ﭘﻴﻦ 1‪INT‬‬


                           ‫1‬           ‫1‬                                      ‫ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه در ﭘﻴﻦ 1‪INT‬‬




                                                                    ‫- ٠٥ -‬
‫15 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                           ‫ ‬                            ‫ ‪       www.pnkavosh.com‬‬



                     ‫ﻧﻮع ﺗﺮﻳﮕﺮ ﺷﺪن وﻗﻔﻪ ي 2 ﺧﺎرﺟﻲ ﺑﻮﺳﻴﻠﻪ ﺑﻴﺖ 6 از رﺟﻴﺴﺘﺮ ‪ MCUCSR‬ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:‬



                               ‫‪Bit‬‬           ‫7‬         ‫6‬    ‫5‬        ‫4‬        ‫3‬       ‫2‬         ‫1‬       ‫0‬

                          ‫‪MCUCSR‬‬                   ‫2‪ISC‬‬




‫• وﻗﻔﻪ ي2 ﺧﺎرﺟﻲ ﺑﺮ ﺧﻼف وﻗﻔـﻪ ي 0 و 1 ﺗﻨﻬـﺎ در دو ﺣﺎﻟـﺖ ﻟﺒـﻪ ي ﺑـﺎﻻ روﻧـﺪه و ﭘـﺎﻳﻴﻦ روﻧـﺪه ﻗﺎﺑـﻞ‬

‫ﭘﻴﻜﺮﺑﻨﺪي اﺳﺖ. ﻧﻮﺷﺘﻦ ﺻﻔﺮ در 2‪ ISC‬ﺑﺎﻋﺚ ﺗﺮﻳﮕﺮ ﺷﺪن اﻳﻦ وﻗﻔﻪ ﺑﺎ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧـﺪه و ﻧﻮﺷـﺘﻦ ﻳـﻚ‬

                                                                 ‫ﺑﺎﻋﺚ ﺗﺮﻳﮕﺮ ﺷﺪن آن ﺑﺎ ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ﻣﻲ ﺷﻮد.‬




‫ﻫﺮ ﻳﻚ از وﻗﻔﻪ ﻫﺎي ﺧﺎرﺟﻲ داراي ﻳﻚ ﺑﻴﺖ ﭘﺮﭼﻢ ﻫﺴﺘﻨﺪ ﻛﻪ در ﺻﻮرت ﺗﺮﻳﮕﺮ ﺷﺪن از ﭘـﻴﻦ وﻗﻔـﻪ ي ﺧـﺎرﺟﻲ و‬

‫ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻣﺮﺑﻮﻃﻪ در رﺟﻴﺴﺘﺮ ‪ GICR‬و ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ )‪ ،(I‬ﻋﻼوه ﺑﺮ ﻳﻚ ﺷﺪن ﭘـﺮﭼﻢ، ﻣـﻲ‬

‫ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد. در اﻳﻦ ﺣﺎﻟﺖ ﭘﺲ از اﺟﺮاي ‪ ISR‬ﭘﺮﭼﻢ آن وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﭘﺎك ﻣـﻲ‬

                                                                                                                         ‫ﺷﻮد.‬



                         ‫‪Bit‬‬          ‫7‬            ‫6‬         ‫5‬           ‫4‬        ‫3‬       ‫2‬         ‫1‬       ‫0‬

                     ‫‪GIFR‬‬            ‫1‪INTF‬‬       ‫0‪INTF‬‬     ‫2‪INTF‬‬




                                          ‫روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ ﻫﺎ در ‪ CodeVision‬ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد:‬




                                                                     ‫- ١٥ -‬
P a g e | 52
        www.avr.ir                                                    www.pnkavosh.com 
interrupt [‫ ]ﺷﻤﺎره ي ﺑﺮدار وﻗﻔﻪ‬void   ‫( ﻧﺎم روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ‬void)

{
               ‫ﺑﺮﻧﺎﻣﻪ ي ﺳﺮوﻳﺲ وﻗﻔﻪ‬

}


‫ ﻋﺪدي ﺑﻴﻦ 2 ﺗﺎ 12 ﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺗﻮان از ﻧﺎم ﻣﻌﺎدل آن )ﺟﺪول‬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.avr.ir                                          www.pnkavosh.com 
               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);
               };
}




                                            - ٥٣ -
‫45 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
 ‫• اﮔﺮ وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﺑﻪ ﺻﻮرت ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ ﺗﻨﻈﻴﻢ ﺷﺪه ﺑﺎﺷﺪ و در ﺣﺎل اﺟﺮاي ﻳﻜﻲ از وﻗﻔﻪ ﻫﺎ، وﻗﻔﻪ ي‬

 ‫دﻳﮕﺮي اﺗﻔﺎق ﺑﻴﻔﺘﺪ، ﭘﺲ از ﺧﺮوج از ‪ ISR‬وﻗﻔﻪ ي ﺟﺎري ﺑﻪ آن وﻗﻔﻪ ﻫﺎ ﺑﺮﺣﺴﺐ اوﻟﻮﻳﺖ ﺷﺎن ﭘﺎﺳﺦ داده‬

                                                                                      ‫ﺧﻮاﻫﺪ ﺷﺪ.‬



      ‫• در ﺻﻮرﺗﻲ ﻛﻪ ﭘﻴﻦ وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ ﺗﻌﺮﻳﻒ ﺷﻮد، آﻧﭽﻪ روي ﭘﻮرت ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد ﻣﻲ ﺗﻮاﻧﺪ‬

                           ‫ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد، ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮان وﻗﻔﻪ ي ﻧﺮم اﻓﺰاري اﻳﺠﺎد ﻛﺮد.‬



‫• وﻗﻔﻪ ﻫﺎي ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ در ﭘﻴﻦ 0‪ INT‬و 1‪ INT‬و ﻫﻤﭽﻨﻴﻦ وﻗﻔـﻪ ي ﺣﺴـﺎس ﺑـﻪ ﻟﺒـﻪ در 2‪ INT‬ﺑـﻪ‬

‫ﺻﻮرت آﺳﻨﻜﺮون ﺗﺸﺨﻴﺺ داده ﻣﻲ ﺷﻮﻧﺪ، ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮان از آن ﻫﺎ ﺑﺮاي ﺧﺎرج ﻛﺮدن ﻣﻴﻜـﺮو از ﻫﻤـﻪ ي‬

‫‪ Mode‬ﻫﺎي ﻛﻢ ﻣﺼﺮف اﺳﺘﻔﺎده ﻧﻤﻮد. ﺣﺪاﻗﻞ ﻋﺮض ﭘﺎﻟﺲ در اﻳﻦ ﺣﺎﻟﺖ 05 ﻧﺎﻧﻮ ﺛﺎﻧﻴﻪ ﻣـﻲ ﺑﺎﺷـﺪ و ﺑـﺮاي‬

                                           ‫ﻣﻘﺎدﻳﺮ ﻛﻤﺘﺮ ﺗﺸﺨﻴﺺ وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﺗﻀﻤﻴﻦ ﻧﺸﺪه اﺳﺖ.‬




‫• ﻛﺎﻣﭙﺎﻳﻠﺮ ‪ CodeVision‬ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓـﺮض ‪ SREG‬و رﺟﻴﺴـﺘﺮﻫﺎﻳﻲ ‪ CPU‬را ﻛـﻪ ﻣﻤﻜـﻦ اﺳـﺖ در‬

‫‪ ISR‬ﺗﻐﻴﻴﺮ ﭘﻴﺪا ﻛﻨﻨﺪ، ﻗﺒﻞ از اﺟﺮاي روﺗﻴﻦ ﺳـﺮوﻳﺲ وﻗﻔـﻪ در ‪ Stack‬ذﺧﻴـﺮه )‪ (PUSH‬ﻛـﺮده و ﭘـﺲ از‬

‫ﺑﺎزﮔﺸﺖ از ‪ ISR‬آن ﻫﺎ را ﺑﺎزﻳﺎﺑﻲ )‪ (POP‬ﻣﻲ ﻛﻨﺪ. ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن اﻳـﻦ ﻗﺎﺑﻠﻴـﺖ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻗﺒـﻞ از‬

                     ‫‪ #-pragma savereg‬اﺳﺘﻔﺎده ﻛﻨﻴﺪ.‬                  ‫روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ از رﻫﻨﻮد‬




                                                        ‫- ٤٥ -‬
P a g e | 55
        www.avr.ir                                      www.pnkavosh.com 




                                                   ‫ﭘﺮوژه 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.avr.ir                                     www.pnkavosh.com 


               #asm("sei")   // Global enable interrupts


               while (1);
}


Output vs. Input:




                                       - ٥٦ -
P a g e | 57
        www.avr.ir                           www.pnkavosh.com 




                             - ٥٧ -
‫85 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬




                                        ‫ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﺻﻔﺮ‬



‫ﺗﺎﻳﻤﺮ/ ﻛﺎﻧﺘﺮ ﺻﻔﺮ ﻳﻚ ﺗﺎﻳﻤﺮ 8 ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﺪ ﻛـﻪ داراي ﭼﻬـﺎر ‪ Mode‬ﻛـﺎري ‪ Fast PWM ،CTC ،Normal‬و‬

‫‪ Correct PWM Phase‬ﻣﻲ ﺑﺎﺷﺪ. ﭘﻴﻦ 0‪ T‬ﺑﻪ ﻋﻨﻮان ورودي ﻛﺎﻧﺘﺮ و ﭘـﻴﻦ 0‪ OC‬ﺧﺮوﺟـﻲ ﺑﺨـﺶ ﻣﻘﺎﻳﺴـﻪ ي‬

‫ﺗﺎﻳﻤﺮ ﻣﻲ ﺑﺎﺷﺪ. اﻳﻦ ﺗﺎﻳﻤﺮ داراي ﺳﻪ رﺟﻴﺴﺘﺮ ﺑﻪ ﻧﺎم ﻫﺎي 0‪ TCNT0 ،TCCR‬و 0‪ OCR‬ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻪ ﺗﺮﺗﻴـﺐ‬

‫ﺟﻬﺖ ﭘﻴﻜﺮﺑﻨﺪي ﺗﺎﻳﻤﺮ، ﻣﻘﺪار ﺷﻤﺎرﻧﺪه و ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ اﺳﺘﻔﺎده ﻣـﻲ ﺷـﻮﻧﺪ. ﻫﻤﭽﻨـﻴﻦ اﻳـﻦ ﺗـﺎﻳﻤﺮ در رﺟﻴﺴـﺘﺮﻫﺎي‬

  ‫‪ TIFR‬و ‪ TIMSK‬ﻛﻪ ﺑﻪ ﺗﺮﺗﻴﺐ رﺟﻴﺴﺘﺮﻫﺎي ﭘﺮﭼﻢ و وﻗﻔﻪ ﺗﺎﻳﻤﺮ ﻣﻲ ﺑﺎﺷﻨﺪ ﺑﺎ دﻳﮕﺮ ﺗﺎﻳﻤﺮﻫﺎ ﻣﺸﺘﺮك ﻣﻲ ﺑﺎﺷﺪ.‬




‫ﻣﻬﻢ ﺗﺮﻳﻦ رﺟﻴﺴﺘﺮ ﺗﺎﻳﻤﺮ 0‪ TTCR‬ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻴﺖ ﻫﺎي ‪ Clock Select‬ﺟﻬﺖ اﻧﺘﺨﺎب ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ و ﺑﻴﺖ‬

‫ﻫﺎي ‪ Wave Generation Mode‬ﺑﺮاي ﺗﻨﻈﻴﻢ ‪ Mode‬ﻛﺎري ﺗﺎﻳﻤﺮ و ﺑﻴﺖ ﻫﺎي ‪Compare Match Output‬‬

                   ‫‪ Mode‬ﭘﻴﻜﺮﺑﻨﺪي ﭘﻴﻦ 0‪ OC‬را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ. ﻋﻤﻠﻜﺮد ﺑﻴﺖ 0‪ FOC‬ﻧﻴﺰ ﺑﺮرﺳﻲ ﺧﻮاﻫﺪ ﺷﺪ.‬



    ‫0‪TCCR‬‬          ‫7‬        ‫6‬            ‫5‬            ‫4‬          ‫3‬          ‫2‬        ‫1‬        ‫0‬
     ‫ﻧﺎم ﺑﻴﺖ‬    ‫00‪FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS‬‬



               ‫‪ Mode‬ﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺑﻴﺖ ﻫﺎي 10‪ WGM‬و 00‪ WGM‬ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:‬




                                                      ‫- ٨٥ -‬
P a g e | 59
        www.avr.ir                                                                  www.pnkavosh.com 



               Mode        WGM01 WGM00                               ‫ ﻋﻤﻠﻜﺮد‬Mode

                 0              0           0                              Normal
                 1              0           1                   PWM, Phase Correct
                                                        Clear Timer on Compare Match
                 2              1           0
                                                                             (CTC)
                 3              1           1                         Fast PWM



                                                                                         Noramal Mode



                                                                             ‫ﺗﺎﻳﻤﺮ/ ﻛﺎﻧﺘﺮ ﺳﺎده ي 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




                                                            - ٥٩ -
‫06 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                            ‫ ‬                            ‫ ‪       www.pnkavosh.com‬‬



               ‫20‪CS‬‬        ‫10‪CS‬‬       ‫00‪CS‬‬                                ‫وﺿﻌﻴﺖ ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ‬

                 ‫0‬          ‫0‬          ‫0‬                                                                ‫ﺑﺪون ﻛﻼك )ﻣﺘﻮﻗﻒ(‬

                 ‫0‬          ‫0‬          ‫1‬                                                          ‫ﻛﻼك ﺳﻴﺴﺘﻢ )ﺑﺪون ﺗﻘﺴﻴﻢ(‬

                 ‫0‬          ‫1‬          ‫0‬                                                                     ‫8/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                 ‫0‬          ‫1‬          ‫1‬                                                                   ‫46/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                 ‫1‬          ‫0‬          ‫0‬                                                                  ‫652/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                 ‫1‬          ‫0‬          ‫1‬                                                                 ‫4201/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                 ‫1‬          ‫1‬          ‫0‬                                             ‫ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ ﺧﺎرﺟﻲ )0‪(T‬‬

                 ‫1‬          ‫1‬          ‫1‬                                                 ‫ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ ﺧﺎرﺟﻲ )0‪(T‬‬




                                       ‫ﻣﻘﺪار ﺗﺎﻳﻤﺮ در ﻫﺮ ﻟﺤﻈﻪ از ﻃﺮﻳﻖ رﺟﻴﺴﺘﺮ ‪ TCNT‬ﻗﺎﺑﻞ ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ اﺳﺖ:‬



                      ‫‪Bit‬‬                  ‫7‬       ‫6‬          ‫5‬             ‫4‬            ‫3‬        ‫2‬         ‫1‬         ‫0‬
                     ‫0‪TCNT‬‬                                                ‫]0:7[0‪TCNT‬‬




                                                   ‫در زﻣﺎن ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ، ﺑﻴﺖ 0‪ TOV‬از رﺟﻴﺴﺘﺮ ‪ TIFR‬ﻳﻚ ﻣﻲ ﺷﻮد.‬



                ‫‪TIFR‬‬              ‫7‬            ‫6‬        ‫5‬             ‫4‬              ‫3‬            ‫2‬        ‫1‬         ‫0‬
                ‫ﻧﺎم ﺑﻴﺖ‬      ‫2‪OCF‬‬          ‫2‪TOV‬‬        ‫1‪ICF‬‬       ‫‪OCF1A‬‬            ‫‪OCF1B‬‬       ‫1‪TOV‬‬      ‫0‪OCF‬‬     ‫0‪TOV‬‬

               ‫ﺳﻄﺢ ﻣﻨﻄﻘﻲ‬          ‫0‬            ‫0‬        ‫0‬             ‫0‬              ‫0‬            ‫0‬        ‫0‬         ‫‪X‬‬




                                                                          ‫- ٠٦ -‬
P a g e | 61
        www.avr.ir                                              www.pnkavosh.com 



                                                   :( μs T = 512 ‫ﻣﺜﺎل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.avr.ir                                                                       www.pnkavosh.com 


                                                                              ( 400μs ‫ﻣﺜﺎل2: )ﻛﺎﻫﺶ دوره ي ﺗﻨﺎوب ﺑﻪ‬

void delay()
{
                 TCNT0=0x38;                                             //TCNT=55
                 TCCR0=0B00000010;
                 while(!TIFR&0x01);
                 TIFR=TIFR|0B00000001;
                 TCCR0=0x00;
}




    ‫ در رﺟﻴﺴﺘﺮ‬TOIE2 ‫ ﻳﺎ‬TOIE0 ‫( ﻓﻌﺎل ﺑﻮده و ﺑﻴﺖ ﻫﺎي‬I) ‫در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ‬

           :‫ ﻳﻚ ﺑﺎﺷﻨﺪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از وﻗﻔﻪ، از ﺳﺮرﻳﺰ ﺷﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻋﻨﻮان وﻗﻔﻪ اﺳﺘﻔﺎده ﻛﺮد‬TIMSK



               TIMSK         7       6         5            4             3        2       1       0
                ‫ﻧﺎم ﺑﻴﺖ‬    OCIE2   TOIE2    TICIE1    OCIE1A         OCIE1B     TOIE1   OCIE0   TOIE0

               ‫ﺳﻄﺢ ﻣﻨﻄﻘﻲ‬     0       0         0            0             0        0       0      X




                                         (‫ ﺑﺎ اﺳﺘﻔﺎده از وﻗﻔﻪ ي ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﺻﻔﺮ‬T = 400μs ‫ﻣﺜﺎل3: )ﻣﻮج ﻣﺮﺑﻌﻲ‬

#include <mega16.h>
#define xtal 8000000


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTA^=0xFF;
TCNT0=0x38;                                          //TCNT=55


                                                                - ٦٢ -
‫36 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                          ‫ ‪       www.pnkavosh.com‬‬
‫}‬


‫)‪void main(void‬‬
‫{‬
                ‫;‪DDRA=0xFF‬‬
                ‫;00‪PORTA=0x‬‬
                ‫;01000000‪TCCR0=0B‬‬               ‫8/‪// Timer Clock = CLK‬‬
                ‫;10‪TIMSK=0x‬‬                     ‫‪//Enable TIMER0 Overflow‬‬
       ‫‪Interrupt‬‬
                ‫)"‪#asm("sei‬‬                     ‫‪// Global enable interrupts‬‬
               ‫;83‪TCNT0=0x‬‬


                ‫;)1( ‪while‬‬
‫}‬




                                                                              ‫• ﺗﺎﻳﻤﺮ/ ﻛﺎﻧﺘﺮ ﺑﺎ ﻋﻤﻠﻜﺮد ﻣﻘﺎﻳﺴﻪ‬



                   ‫‪Bit‬‬         ‫7‬       ‫6‬         ‫5‬             ‫4‬          ‫3‬       ‫2‬       ‫1‬        ‫0‬
                 ‫2/0‪OCR‬‬                                  ‫]0:7[0‪OCR‬‬


‫• ﻣﺤﺘﻮاي رﺟﻴﺴﺘﺮ 0‪ OCR‬ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ ﺑﺎ ﻣﻘﺪار 0‪ TCNT‬ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮد و در ﺻﻮرت ﺑﺮاﺑـﺮي ﺑﺎﻋـﺚ‬

‫ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ 0‪ OC‬و ﻳﺎ وﻗﻔﻪ ي ﺗﻄﺎﺑﻖ ﻣﻲ ﺷﻮد. در ﺣﺎﻟﺖ ﺑﺮاﺑﺮي ﺑﻴﺖ 0‪ OCF‬ﻳﺎ 1‪ OCF‬ﻳﻚ ﺷﺪه‬

‫و ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺳﺎﺑﺮوﺗﻴﻦ وﻗﻔﻪ ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﺻﻔﺮ ﻣﻲ ﺷﻮد. در ﺻـﻮرت ﻋـﺪم اﺳـﺘﻔﺎده از وﻗﻔـﻪ‬

                                           ‫ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ آن را ﭘﺎك ﻛﻨﺪ.‬



                ‫‪TIFR‬‬      ‫7‬        ‫6‬        ‫5‬            ‫4‬            ‫3‬           ‫2‬       ‫1‬       ‫0‬

                                                             ‫- ٣٦ -‬
‫46 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                            ‫ ‪       www.pnkavosh.com‬‬
                ‫ﻧﺎم ﺑﻴﺖ‬    ‫2‪OCF‬‬     ‫2‪TOV‬‬    ‫1‪ICF‬‬     ‫‪OCF1A‬‬            ‫‪OCF1B‬‬       ‫1‪TOV‬‬      ‫0‪OCF‬‬    ‫0‪TOV‬‬

               ‫ﺳﻄﺢ ﻣﻨﻄﻘﻲ‬    ‫0‬        ‫0‬       ‫0‬           ‫0‬              ‫0‬           ‫0‬        ‫‪X‬‬       ‫‪X‬‬




                                    ‫ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ 0‪ OC‬ﺑﻮﺳﻴﻠﻪ ﺑﻴﺖ ﻫﺎي 00‪ COM‬و 10‪ COM‬ﻣﻲ ﺑﺎﺷﺪ:‬



               ‫0‪TCCR‬‬        ‫7‬         ‫6‬          ‫5‬           ‫4‬              ‫3‬           ‫2‬     ‫1‬      ‫0‬
                ‫ﻧﺎم ﺑﻴﺖ‬    ‫0‪FOC‬‬     ‫00‪WGM‬‬   ‫10‪COM‬‬     ‫00‪COM‬‬            ‫10‪WGM‬‬        ‫20‪CS‬‬     ‫10‪CS‬‬   ‫00‪CS‬‬

               ‫ﺳﻄﺢ ﻣﻨﻄﻘﻲ‬    ‫‪X‬‬         ‫0‬       ‫‪X‬‬              ‫‪X‬‬              ‫0‬           ‫‪X‬‬     ‫‪X‬‬      ‫‪X‬‬




               ‫00‪COM01 COM‬‬                                    ‫وﺿﻌﻴﺖ ﭘﻴﻦ 0‪OC‬‬

                   ‫0‬            ‫0‬                                                ‫ﻏﻴﺮ ﻓﻌﺎل )‪ I/O‬ﻣﻌﻤﻮﻟﻲ(‬

                   ‫0‬            ‫1‬                                           ‫‪ Toggle‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ‬

                   ‫1‬            ‫0‬                                               ‫‪ Clear‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ‬

                   ‫1‬            ‫1‬                                                 ‫‪ Set‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ‬




‫• در ﺻﻮرت ﻳﻚ ﻛﺮدن ﺑﻴﺖ 0‪ FOC‬ﻳﺎ 1‪ FOC‬ﺑﻪ ﺻﻮرت آﻧـﻲ ﻣﻘـﺪار رﺟﻴﺴـﺘﺮ 0‪ TCNT‬ﺑـﺎ ﻣﻘـﺪار 0‪OCR‬‬

‫ﻣﻘﺎﻳﺴﻪ ﺷﺪه و در ﺻﻮرت ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ﻳﻚ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ روي ﭘﻴﻦ 0‪ OC‬اﻳﺠﺎد ﻣﻲ ﺷﻮد. در اﻳﻦ وﺿـﻌﻴﺖ ﺑﻴـﺖ‬

                                             ‫0‪ OCF‬ﻳﺎ 1‪ OCF‬ﻳﻚ ﻧﺸﺪه و ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﻧﻴﺰ ﻧﺨﻮاﻫﺪ ﺷﺪ.‬

‫• در ﺗﻤﺎم ﺣﺎﻟﺖ ﻫﺎﻳﻲ ﻛﻪ روي ﭘﻴﻦ ﻫﺎي ‪ OC‬ﺷﻜﻞ ﻣﻮج اﻳﺠﺎد ﻣﻲ ﺷﻮد ﺑﺎﻳﺪ اﻳﻦ ﭘﻴﻦ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ ﺗﻌﺮﻳﻒ‬

                                                                                                           ‫ﺷﺪه ﺑﺎﺷﺪ.‬




                                                             ‫- ٤٦ -‬
P a g e | 65
        www.avr.ir                                                                   www.pnkavosh.com 




                                                    (OC0 ‫ روي ﭘﻴﻦ‬μs T = 512 ‫ﻣﺜﺎل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




                                                               - ٦٥ -
‫66 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                   ‫ ‬                       ‫ ‪       www.pnkavosh.com‬‬
                                                                  ‫در اﻳﻦ ﺣﺎﻟﺖ ‪ ISR‬ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد:‬



‫)‪interrupt [TIM0_COMP] void timer0_comp_isr(void‬‬
‫{‬
‫زﻳﺮ ﺑﺮﻧﺎﻣﻪ ي ﺳﺮوﻳﺲ وﻗﻔﻪ‬

‫}‬



                                                                                                ‫‪CTC Mode‬‬


‫در اﻳﻦ ‪ Mode‬ﺗﺎﻳﻤﺮ ﻫﻤﺎﻧﻨﺪ وﺿﻌﻴﺖ ﻧﺮﻣﺎل ﺑﺎ ﻋﻤﻠﻜﺮد ﻣﻘﺎﻳﺴﻪ ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ﺑـﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ در زﻣـﺎن ﺗﻄـﺎﺑﻖ‬

‫رﺟﻴﺴﺘﺮﻫﺎي 0‪ OCR‬و 0‪ TCNT‬ﻣﻘﺪار رﺟﻴﺴﺘﺮ 0‪ TCNT‬ﺻﻔﺮ ﺷﺪه و در واﻗﻊ ﺑـﺮ ﺧـﻼف ﺣﺎﻟـﺖ ﻗﺒـﻞ ﻣﻘـﺪار‬

‫ﻣﺎﻛﺰﻳﻤﻢ 0‪ TCNT‬ﻋﺪد ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ 0‪ OCR‬ﻣﻲ ﺑﺎﺷﺪ. ﻣﻘﺪار ﺑﻴﺖ ﻫﺎي 00‪ WGM‬و 10‪ WGM‬در اﻳﻦ‬

                                                                               ‫‪ Mode‬ﺑﻪ ﺗﺮﺗﻴﺐ ﺑﺮاﺑﺮ 0 و 1 ﻣﻲ ﺑﺎﺷﺪ.‬



               ‫0‪TCCR‬‬        ‫7‬       ‫6‬           ‫5‬             ‫4‬            ‫3‬        ‫2‬      ‫1‬      ‫0‬
                ‫ﻧﺎم ﺑﻴﺖ‬    ‫0‪FOC‬‬   ‫00‪WGM‬‬     ‫10‪COM‬‬        ‫00‪COM‬‬           ‫10‪WGM‬‬    ‫20‪CS‬‬   ‫10‪CS‬‬   ‫00‪CS‬‬

               ‫ﺳﻄﺢ ﻣﻨﻄﻘﻲ‬    ‫‪X‬‬       ‫0‬           ‫‪X‬‬             ‫‪X‬‬            ‫1‬        ‫‪X‬‬     ‫‪X‬‬      ‫‪X‬‬




                 ‫در اﻳﻦ ﺣﺎﻟﺖ ﻓﺮﻛﺎﻧﺲ ﻣﻮج اﻳﺠﺎد ﺷﺪه روي ﭘﻴﻦ 0‪ OC‬از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:‬                      ‫•‬



                                                         ‫‪f CLK _ I / O‬‬
                                          ‫= 0 ‪f OC‬‬
                                                     ‫)0 ‪2.N .(1 + OCR‬‬




                                                              ‫- ٦٦ -‬
‫76 | ‪P a g e‬‬
          ‫    ‪www.avr.ir‬‬                        ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬



                                     ‫ﻣﺜﺎل5: )اﻳﺠﺎد ﻣﻮج ﻣﺮﺑﻌﻲ ﺑﺎ ﻓﺮﻛﺎﻧﺲ ‪ 5KHz‬روي ﭘﻴﻦ 0‪:(OC‬‬

‫>‪#include<mega16.h‬‬
‫0000008 ‪#define xtal‬‬


‫)(‪void main‬‬
‫{‬
                 ‫;‪DDRB=0xFF‬‬
                 ‫;00‪PORTB=0x‬‬
                 ‫;00‪TCNT0=0x‬‬
                 ‫99=0‪OCR0=0x63; //OCR‬‬
                 ‫‪TCCR0=0B00011010; //toggle OC0 on compare match‬‬


                 ‫;)1(‪while‬‬
‫}‬


            ‫0000008‬
‫= 0‪f OC‬‬                ‫‪= 5000Hz‬‬
          ‫)99 + 1(.8.2‬



‫وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ي ﺳﺮرﻳﺰ و وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ در ‪ CTC Mode‬ﻫﻤﺎﻧﻨﺪ وﺿﻌﻴﺖ ﻧﺮﻣﺎل ﻣﻲ ﺑﺎﺷـﺪ.‬

‫ﺑﺎ ﻳﻚ ﺑﻮدن ﺑﻴﺖ 0‪ OCIE‬وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻓﻌﺎل ﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺗﻮان در ‪ ISR‬اﻳﻦ وﻗﻔـﻪ ﻣﻘـﺪار 0‪ OCR‬را ﺗﻐﻴﻴـﺮ‬

                                                                                              ‫داد.‬




‫• ﻣﻘﺪار دﻫﻲ ﺑﻪ رﺟﻴﺴﺘﺮ 0‪ OCR‬ﺑﺎﻳﺪ ﺑﺎ دﻗﺖ اﻧﺠﺎم ﺷﻮد زﻳﺮا در ‪ Mode‬ﻫﺎي ﻏﻴﺮ ‪ PWM‬اﻳـﻦ رﺟﻴﺴـﺘﺮ داراي‬

‫ﺑﺎﻓﺮ دوﺑﻞ ﻧﻤﻲ ﺑﺎﺷﺪ. وﺟﻮد ﺑﺎﻓﺰ دوﺑﻞ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ اﮔﺮ 0‪ OCR‬ﺑﻪ ﻣﻘـﺪاري ﻛﻤﺘـﺮ از 0‪ TCNT‬ﺗﻐﻴﻴـﺮ ﻛﻨـﺪ،‬




                                                    ‫- ٧٦ -‬
P a g e | 68
        www.avr.ir                                                       www.pnkavosh.com 
‫ﺑﺮاي از دﺳﺖ ﻧﺮﻓﺘﻦ ﻣﻘﺎﻳﺴﻪ ي ﻓﻌﻠﻲ ﻣﻘﺪار ﺟﺪﻳﺪ در ﺑﺎﻓﺮ دوﺑﻞ ذﺧﻴﺮه ﺷﺪه و ﭘﺲ از ﺳﺮرﻳﺰ اﻳﻦ ﻣﻘﺪار ﺟﺪﻳـﺪ در‬

                                                                             .‫ ﺑﺎرﮔﺬاري ﺷﻮد‬OCR0




                                                                        ‫ﭘﺮوژه 7: ﻓﺮﻛﺎﻧﺲ ﻣﺘﺮ دﻳﺠﻴﺘﺎل‬




/*****************************************************
Project : Frequency Meter
Author         : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
*****************************************************/


#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#include <lcd.h>
#define xtal 8000000


#asm
      .equ __lcd_port=0x1B ;PORTA
#endasm


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.avr.ir                                          www.pnkavosh.com 
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;        // Start Timer T0 pin Falling Edge


    #asm("sei")              // Global enable interrupts


               delay_ms(1000);


               #asm("cli");       // Global disable interrupts



                                            - ٦٩ -
P a g e | 70
        www.avr.ir                                       www.pnkavosh.com 
               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
               };
}




                                         - ٧٠ -
‫17 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬




                                                                              ‫‪Fast PWM Mode‬‬



  ‫اﻳﻦ ﺣﺎﻟﺖ ﻣﺸﺎﺑﻪ ‪ Mode‬ﻧﺮﻣﺎل ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ ﭘـﻴﻦ 0‪ OC‬ﻓﻘـﻂ در ﺣﺎﻟـﺖ ﺑﺮاﺑـﺮي رﺟﻴﺴـﺘﺮﻫﺎي‬

‫0‪TCNT‬و 0‪ OCR‬ﺗﻐﻴﻴﺮ ﺣﺎﻟﺖ ﻧﻤﻲ دﻫﺪ، ﺑﻠﻜﻪ در زﻣﺎن ﺳﺮرﻳﺰ رﺟﻴﺴﺘﺮ 0‪ TCNT‬ﻧﻴﺰ ﻣﻘﺪار اﻳﻦ ﭘﻴﻦ ﺗﻐﻴﻴﺮ ﻣـﻲ‬

                                                                                                     ‫ﻛﻨﺪ.‬




                         ‫ﻣﻘﺪار 0‪TCNT‬‬                            ‫ﻣﻘﺪار 0‪OCR‬‬




                                ‫ﺧﺮوﺟﻲ ‪PWM‬‬




                                ‫ﻣﻘﺪار ﺑﻴﺖ ﻫﺎي 00‪ WGM‬و 10‪ WGM‬در اﻳﻦ ‪ Mode‬ﺑﺮاﺑﺮ 1 ﻣﻲ ﺑﺎﺷﺪ.‬



                   ‫‪Bit‬‬    ‫7‬     ‫6‬        ‫5‬       ‫4‬       ‫3‬     ‫2‬        ‫1‬        ‫0‬
                 ‫0‪TCCR‬‬    ‫0‬     ‫1‬      ‫10‪COM‬‬   ‫00‪COM‬‬     ‫1‬    ‫20‪CS‬‬     ‫10‪CS‬‬    ‫00‪CS‬‬




‫در ‪ Mode‬ﻫﺎي ‪ PWM‬ﻋﻤﻠﻜﺮد ﺑﻴﺖ ﻫﺎي 00‪ COM‬و 10‪ COM‬ﻣﺘﻔﺎوت از دو وﺿﻌﻴﺖ ﻗﺒﻠـﻲ و ﺑـﻪ ﺻـﻮرت‬

                                                                                      ‫زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬




                 ‫10‪COM‬‬   ‫00‪COM‬‬                         ‫وﺿﻌﻴﺖ ﭘﻴﻦ 0‪OC‬‬



                                                     ‫- ١٧ -‬
‫27 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                       ‫ ‬                         ‫ ‪       www.pnkavosh.com‬‬
                          ‫0‬          ‫0‬                                                  ‫ﻏﻴﺮ ﻓﻌﺎل )‪ I/O‬ﻣﻌﻤﻮﻟﻲ(‬

                          ‫0‬          ‫1‬                                                              ‫رزرو ﺷﺪه‬

                          ‫1‬          ‫0‬           ‫‪ Clear‬دروﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ، ‪ Set‬در زﻣﺎن ﺳﺮرﻳﺰ )‪ PWM‬ﻏﻴﺮ ﻣﻌﻜﻮس(‬

                          ‫1‬          ‫1‬             ‫‪ Set‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ، ‪ Clear‬در زﻣﺎن ﺳﺮرﻳﺰ )‪ PWM‬ﻣﻌﻜﻮس(‬




                                 ‫ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ي ﻓﺮﻛﺎﻧﺲ ﻣﻮج ‪ PWM‬ﺗﻮﻟﻴﺪ ﺷﺪه ﻣﻲ ﺗﻮان از ﻓﺮﻣﻮل زﻳﺮ اﺳﺘﻔﺎد ﻧﻤﻮد:‬

          ‫‪f clk _ I / O‬‬
‫= ‪f PWM‬‬                       ‫4201 ,652 ,46 ,8 ,1 = ‪N = Prescale‬‬      ‫ﻣﻘﺪار ﺑﺎرﮔﺬاري ﺷﺪه در ﺗﺎﻳﻤﺮ – 652 = ‪X‬‬
           ‫‪N .X‬‬



‫از وﻗﻔﻪ ي ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻣﻲ ﺗﻮان ﺑﺮاي ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ 0‪ TCNT‬و ﻳـﺎ ﺗﻐﻴﻴـﺮ ﻣﻘـﺪار 0‪ OCR‬اﺳـﺘﻔﺎده‬

                              ‫ﻧﻤﻮد، اﮔﺮﭼﻪ ﺑﻬﺘﺮ اﺳﺖ ﻣﻘﺪار 0‪ OCR‬در روﺗﻴﻦ وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﺗﻐﻴﻴﺮ داده ﺷﻮد.‬

                                ‫ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ 0‪ TCNT‬ﻣﻲ ﺗﻮان ﻓﺮﻛﺎﻧﺲ ﻣﻮج ‪ PWM‬را ﺗﻐﻴﻴﺮ داد.(‬




                                          ‫ﻣﺜﺎل6: )ﺗﻮﻟﻴﺪ ﻣﻮج ‪ PWM‬ﺑﺎ ﻓﺮﻛﺎﻧﺲ ‪ 4KHz‬و زﻣﺎن وﻇﻴﻔﻪ ي 02 درﺻﺪ(‬



‫>‪#include <mega16.h‬‬
‫0000008 ‪#define xtal‬‬




‫)‪interrupt [TIM0_OVF] void timer0_ovf_isr(void‬‬
‫{‬
‫;60‪TCNT0=0x‬‬
‫}‬


‫)‪void main(void‬‬
‫{‬


                                                                   ‫- ٢٧ -‬
P a g e | 73
        www.avr.ir                                                  www.pnkavosh.com 
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);


}




           8000000
f PWM =              = 4000Hz
          8(256 − 6)


               OCR0          50
DutyCycle =         × 100% =     × 100% = 20%
                250          250




                                                    - ٧٣ -
‫47 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫• ﺑﺎ ﻛﻤﺘﺮ ﺷﺪن 0‪ OCR‬زﻣﺎن وﻇﻴﻔﻪ ﻛﻤﺘﺮ ﺷﺪه و ﺗﺎ ﺣﺪي ﻛﻪ ﻣﻘﺪار ﺻﻔﺮ ﻳﻚ ﭘﺎﻟﺲ ﺳﻮزﻧﻲ ﺑﻪ ﻋﺮض ﻳﻚ ﺳﻴﻜﻞ‬

                                                                                      ‫اﻳﺠﺎد ﺧﻮاﻫﺪ ﻛﺮد.‬

  ‫• ﺑﺎ ﻣﻘﺪاردﻫﻲ 652 ﺑﻪ 0‪ OCR‬ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﺑﺮاﺑﺮ ﺷﺪه و ﭘﺎﻟﺲ ﺧﺮوﺟﻲ ﺑﺴﺘﻪ ﺑﻪ ﻣﻘﺪار 00‪ COM‬و‬

                                                                  ‫10‪ COM‬ﻫﻤﻮاره ﺻﻔﺮ ﻳﺎ ﻳﻚ ﺧﻮاﻫﺪ ﺑﻮد.‬



                                                                  ‫‪Phase Correct PWM Mode‬‬


‫اﻳﻦ ‪ Mode‬ﺷﺒﻴﻪ ﺣﺎﻟﺖ ‪ Fast PWM‬ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ ﺑﻪ ﺻﻮرت دو ﺷﻴﺒﻪ )‪ (Dual Slope‬ﻋﻤﻞ‬

‫ﺷﻤﺎرش را اﻧﺠﺎم ﻣﻲ دﻫﺪ. ﺑﻪ اﻳﻨﺼﻮرت ﻛﻪ ﺗﺎﻳﻤﺮ از ﻋﺪد ﺻﻔﺮ ﺷﺮوع ﺑﻪ ﺷﻤﺎرش ﻛﺮده و ﺑﻪ ﺻﻮرت اﻓﺰاﻳﺸﻲ ﺗﺎ ﻋﺪد‬

‫‪ 0xFF‬اﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ و ﺑﻌﺪ از رﺳﻴﺪن ﺑﻪ اﻳﻦ ﻣﻘﺪار ﻋﺪد ﻣﻮﺟﻮد در ﺑﺎﻓﺮ 0‪ OCR‬در رﺟﻴﺴﺘﺮ 0‪ OCR‬ﺑﺎرﮔﺬاري‬

‫ﻣﻲ ﺷﻮد. ﺑﻌﺪ از اﻳﻦ ﻟﺤﻈﻪ ﺟﻬﺖ ﺷﻤﺎرش ﺗﺎﻳﻤﺮ ﻋﻮض ﺷﺪه و ﺑﻪ ﺻﻮرت ﻛﺎﻫﺸﻲ ﺗﺎ ﻋﺪد ﺻﻔﺮ ﻣﻲ ﺷﻤﺎرد ﺑﺎ رﺳﻴﺪن‬

‫ﺑﻪ اﻳﻦ ﻋﺪد ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ، ﺑﺮﻧﺎﻣﻪ ﺑﻪ ‪ ISR‬ﺳـﺮرﻳﺰ ﺗـﺎﻳﻤﺮ‬

‫ﻣﻨﺸﻌﺐ ﺷﺪه و ﺑﻴﺖ ﭘﺮﭼﻢ وﻗﻔﻪ ﺑﻮﺳﻴﻠﻪ ﺳﺨﺖ اﻓﺰار ﺻﻔﺮ ﻣﻲ ﺷﻮد. ﻣﺴﺌﻠﻪ ي ﻣﻬﻢ اﻳﻦ اﺳـﺖ ﻛـﻪ در ﻫـﺮ دو ﺣﺎﻟـﺖ‬

‫ﺷﻤﺎرش اﻓﺰاﻳﺸﻲ و ﻛﺎﻫﺸﻲ ﻋﻤﻞ ﻣﻘﺎﻳﺴﻪ ﺑﻴﻦ رﺟﻴﺴـﺘﺮﻫﺎي 0‪ TCNT‬و 0‪ OCR‬اﻧﺠـﺎم ﻣـﻲ ﮔﻴـﺮد و در ﺻـﻮرت‬

                                        ‫ﺑﺮاﺑﺮي ﭘﺮﭼﻢ 0‪ OCF‬ﻳﻚ ﺷﺪه و ﺑﺎﻋﺚ ﺗﻐﻴﻴﺮ در ﭘﻴﻦ 0‪ OC‬ﻣﻲ ﺷﻮد.‬




                                                                   ‫ﻣﻘﺪار 0‪OCR‬‬
                                       ‫ﻣﻘﺪار 0‪TCNT‬‬




                         ‫ﺧﺮوﺟﻲ ‪ PWM‬در ﺣﺎﻟﺖ ﻏﻴﺮ ﻣﻌﻜﻮس‬




                                                         ‫- ٤٧ -‬
‫57 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                           ‫ ‬                        ‫ ‪       www.pnkavosh.com‬‬



                                                                                 ‫ﺗﻐﻴﻴﺮ ﭘﻴﻦ 0‪ OC‬ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬




                 ‫10‪COM‬‬      ‫00‪COM‬‬                                       ‫وﺿﻌﻴﺖ ﭘﻴﻦ 0‪OC‬‬

                    ‫0‬          ‫0‬                                                           ‫ﻏﻴﺮ ﻓﻌﺎل )‪ I/O‬ﻣﻌﻤﻮﻟﻲ(‬

                    ‫0‬          ‫1‬                                                                       ‫رزرو ﺷﺪه‬

                                           ‫‪ Clear‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ، در زﻣﺎن ﺷﻤﺎرش اﻓﺰاﻳﺸﻲ )‪ PWM‬ﻏﻴﺮ ﻣﻌﻜﻮس(‬
                    ‫1‬          ‫0‬
                                                                       ‫‪ Set‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ، در زﻣﺎن ﺷﻤﺎرش ﻛﺎﻫﺸﻲ‬

                                                     ‫‪ Set‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ، در زﻣﺎن ﺷﻤﺎرش اﻓﺰاﻳﺸﻲ )‪ PWM‬ﻣﻌﻜﻮس(‬
                    ‫1‬          ‫1‬
                                                                     ‫‪ Clear‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ، در زﻣﺎن ﺷﻤﺎرش ﻛﺎﻫﺸﻲ‬




‫• در ﺻﻮرت ﺗﻐﻴﻴﺮ ﻣﻘﺪار رﺟﻴﺴﺘﺮ 0‪ OCR‬ﻣﻘﺪار ﺟﺪﻳﺪ در ﺑﺎﻓﺮ اﻳـﻦ رﺟﻴﺴـﺘﺮ ﻧﻮﺷـﺘﻪ ﻣـﻲ ﺷـﻮد و در زﻣـﺎن‬

                                                             ‫رﺳﻴﺪن ﺑﻪ ‪ 0xFF‬رﺟﻴﺴﺘﺮ 0‪ OCR‬ﺑﻪ روز ﻣﻲ ﺷﻮد.‬

‫• ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﺻﻔﺮ زﻣﺎﻧﻲ ﻓﻌﺎل ﻣﻲ ﺷﻮد ﻛﻪ ﻛـﻪ رﺟﻴﺴـﺘﺮ 0‪ TCNT‬ﺑﺮاﺑـﺮ ﺻـﻔﺮ ﺷـﻮد و ﻧـﻪ ‪،0xFF‬‬

‫ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎﻳﺪ دﻗﺖ داﺷﺖ ﻛﻪ اﮔﺮ در زﻣﺎن ﺷﺮوع ﺑﻪ ﻛﺎر ﻣﻘﺪار اﻳﻦ رﺟﻴﺴﺘﺮ ﺻﻔﺮ ﺑﺎﺷﺪ ﭘـﺮﭼﻢ ﺳـﺮرﻳﺰ ﻓﻌـﺎل‬

                                                                                                             ‫ﺧﻮاﻫﺪ ﺷﺪ.‬

                         ‫• ﻓﺮﻛﺎﻧﺲ ‪ PWM‬در ﺣﺎﻟﺖ ‪ Phase Correct‬از راﺑﻄﻪ ي زﻳﺮ ﻗﺎﺑﻞ ﻣﺤﺎﺳﺒﻪ اﺳﺖ:‬



                                     ‫‪f clk _ I / O‬‬
                           ‫= ‪f PWM‬‬                             ‫4201 ,652 ,46 ,8 ,1 = ‪N‬‬
                                     ‫015 × ‪N‬‬




        ‫• راﺑﻄﻪ ي ﺑﺎﻻ ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻓﺮﻛﺎﻧﺲ ﻣﻮج ‪ PWM‬ﺛﺎﺑﺖ اﺳﺖ و ارﺗﺒﺎﻃﻲ ﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي 0‪ OCR‬و‬

                                                                                                       ‫0‪ TCNT‬ﻧﺪارد.‬



                                                                       ‫- ٥٧ -‬
P a g e | 76
        www.avr.ir                                                 www.pnkavosh.com 
    ‫ اﻓﺰاﻳﺶ ﻳﺎﻓﺘﻪ و ﺑﺎ‬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.avr.ir                                            www.pnkavosh.com 
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;
                     };
       }

                                              - ٧٧ -
‫87 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                       ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
       ‫‪else‬‬
                     ‫;‪p_state=0xFF‬‬


               ‫;}‬
‫}‬




                             ‫ﺗﻮﺿﻴﺢ: ﺑﺮاي آزﻣﺎﻳﺶ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺟﺎي ﻣﻮﺗﻮر ﻣﻲ ﺗﻮان از ‪ LED‬اﺳﺘﻔﺎده ﻧﻤﻮد.‬




                                                 ‫- ٨٧ -‬
‫97 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬



                                       ‫ﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ دو‬



‫ﺑﻪ ﻃﻮر ﻛﻠﻲ ﻋﻤﻠﻜﺮد ﺗﺎﻳﻤﺮ 2 ﻣﺸﺎﺑﻪ ﺗﺎﻳﻤﺮ ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ و رﺟﻴﺴﺘﺮﻫﺎي ﻣﺮﺑﻮﻃﻪ ﺑﺎ ﻫﻤﺎن ﻧـﺎم و داراي ﭘﺴـﻮﻧﺪ 2 ﻣـﻲ‬

‫ﺑﺎﺷﻨﺪ، ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ2 ﺑﺮﺧﻼف ﺗﺎﻳﻤﺮﻫﺎي ﺻﻔﺮ و ﻳﻚ ﻧﻤﻲ ﺗﻮاﻧﺪ از ﭘﺎﻳﻪ ﺧﺎرﺟﻲ 0‪ T‬ﻳﺎ 1‪ T‬ﻛﻼك درﻳﺎﻓﺖ‬

‫ﻛﻨﺪ و در ﻋﻮض ﻣﻲ ﺗﻮان ﺑﺎ وﺻﻞ ﻛﺮدن ﻳﻚ ﻛﺮﻳﺴﺘﺎل 867.23 ﻛﻴﻠﻮﻫﺮﺗﺰ ﺑﻪ ﭘﻴﻦ ﻫـﺎي 1‪ TOSC‬و 2‪ TOSC‬از آن‬

‫در وﺿﻌﻴﺖ آﺳﻨﻜﺮون ﺟﻬﺖ ‪ RTC‬اﺳﺘﻔﺎده ﻧﻤﻮد. از آﻧﺠﺎﻳﻲ ﻛﻪ ﺗﺎﻳﻤﺮ2 داراي ‪ Prescaler‬ﻣﺠـﺰا از دو ﺗـﺎﻳﻤﺮ0 و1‬

‫ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ ﺗﻘﺴﻴﻢ ﻛﺮﻳﺴﺘﺎل 86723 ﻫﺮﺗﺰ ﺑﺮ 821 ﻣﻲ ﺗﻮان ﺑﻪ زﻣﺎن ﺳﺮرﻳﺰ 1 ﺛﺎﻧﻴﻪ ﻛﻪ ﻣﻨﺎﺳﺐ ﺑـﺮاي ﻋﻤﻠﻜـﺮد ﺳـﺎﻋﺖ‬

                             ‫اﺳﺖ دﺳﺖ ﭘﻴﺪا ﻛﺮد. ﺗﻨﻈﻴﻤﺎت ‪ Prescale‬ﺑﺮاي اﻳﻦ ﺗﺎﻳﻤﺮ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬




               ‫20‪CS‬‬   ‫10‪CS‬‬   ‫00‪CS‬‬                      ‫وﺿﻌﻴﺖ ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ‬

                ‫0‬        ‫0‬    ‫0‬                                                    ‫ﺑﺪون ﻛﻼك )ﻣﺘﻮﻗﻒ(‬

                ‫0‬        ‫0‬    ‫1‬                                               ‫ﻛﻼك ﺳﻴﺴﺘﻢ )ﺑﺪون ﺗﻘﺴﻴﻢ(‬

                ‫0‬        ‫1‬    ‫0‬                                                        ‫8/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                ‫0‬        ‫1‬    ‫1‬                                                       ‫23/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                ‫1‬        ‫0‬    ‫0‬                                                       ‫46/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                ‫1‬        ‫0‬    ‫1‬                                                      ‫821/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                ‫1‬        ‫1‬    ‫0‬                                                      ‫652/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                ‫1‬        ‫1‬    ‫1‬                                                     ‫4201/ﻛﻼك ﺳﻴﺴﺘﻢ‬




                                    ‫ﭘﻴﻜﺮ ﺑﻨﺪي ‪ RTC‬ﺑﺎ رﺟﻴﺴﺘﺮ وﺿﻌﻴﺖ آﺳﻨﻜﺮون ﻳﺎ ‪ ASSR‬اﻧﺠﺎم ﻣﻲ ﺷﻮد:‬




                                                       ‫- ٩٧ -‬
‫08 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                ‫ ‪       www.pnkavosh.com‬‬
                   ‫‪Bit‬‬   ‫7‬     ‫6‬   ‫5‬   ‫4‬     ‫3‬             ‫2‬        ‫1‬         ‫0‬

                  ‫‪ASSR‬‬                      ‫0‪AS‬‬        ‫‪TCN2UB‬‬   ‫‪OCR2UB‬‬     ‫‪TCR2UB‬‬




‫2‪ :Asynchronous Timer/Counter‬ﺑﺎ ‪ Set‬ﻛﺮدن اﻳﻦ ﺑﻴـﺖ ﻣﻨﺒـﻊ ﻛـﻼك ﺗـﺎﻳﻤﺮ 2 از ﻛـﻼك ﺳﻴﺴـﺘﻢ ﺑـﻪ‬

‫ﻛﺮﻳﺴﺘﺎل ﺧﺎرﺟﻲ در ﭘﺎﻳﻪ ﻫﺎي 1‪ TOSC‬و 2‪ TOSC‬ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ.ﺑﺎ ﺗﻐﻴﻴـﺮ دادن اﻳـﻦ ﺑﻴـﺖ ﻣﻤﻜـﻦ اﺳـﺖ ﻣﻘـﺪار‬

                                                  ‫رﺟﻴﺴﺘﺮﻫﺎي 2‪ OCR2 ،TCNT‬و 2‪ TCCR‬ﺧﺮاب ﺷﻮد.‬




‫‪ :Timer/Counter2 Update Busy‬ﺑﺮاي ﺗﻀـﻤﻴﻦ ﻋﻤﻠﻜـﺮد ﺻـﺤﻴﺢ در وﺿـﻌﻴﺖ آﺳـﻨﻜﺮون رﺟﻴﺴـﺘﺮﻫﺎي‬

‫ﺗﺎﻳﻤﺮ2 ﺑﺮﺧﻼف ﺗﺎﻳﻤﺮ 0 و 1 ﺑﻪ ﺻﻮرت ﺑﺎﻓﺮ ﺷﺪه ﺑﺮوز ﻣﻴﺸﻮﻧﺪ. ﺑﺪﻳﻦ ﺗﺮﺗﻴـﺐ ﻛـﻪ وﻗﺘـﻲ روي رﺟﻴﺴـﺘﺮ 2‪TCNT‬‬

‫ﻣﻘﺪاري ﻧﻮﺷﺘﻪ ﺷﻮد، ﺑﻴﺖ ‪ TCN2UB‬ﻳﻚ ﻣﻲ ﺷـﻮد و ﻣﻘـﺪاري ﻛـﻪ در رﺟﻴﺴـﺘﺮ ﻣـﻮﻗﺘﻲ ذﺧﻴـﺮه ﺷـﺪه اﺳـﺖ ﺑـﻪ‬

‫2‪ TCNT‬ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد. ﺑﺎ اﺗﻤﺎم ﺑﺮوز رﺳﺎﻧﻲ 2‪ TCNT‬اﻳﻦ ﺑﻴﺖ ﺗﻮﺳﻂ ﺳﺨﺖ اﻓﺰار ﺻﻔﺮ ﻣﻲ ﺷﻮد. ﺻـﻔﺮ ﺑـﻮدن‬

                              ‫‪ OCR2UB‬ﻧﺸﺎن دﻫﻨﺪه ي آﻣﺎدﮔﻲ 2‪ TCNT‬ﺑﺮاي ﭘﺬﻳﺮﻓﺘﻦ ﻣﻘﺪار ﺟﺪﻳﺪ اﺳﺖ.‬




‫‪ :Output Compare Register2 Update Busy‬اﻳﻦ ﺑﻴﺖ ﻫﻤﺎﻧﻨﺪ ‪ TCN2UB‬ﺑﻮده ﺑﺎ اﻳـﻦ ﺗﻔـﺎوت ﻛـﻪ‬

                                                                  ‫ﺑﺮ روي رﺟﻴﺴﺘﺮ 2‪ OCR‬ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ.‬




‫‪ :Timer/Counter Control Register2 Update Busy‬اﻳﻦ ﺑﻴﺖ ﻫﻤﺎﻧﻨـﺪ ‪ TCN2UB‬ﺑـﻮده ﺑـﺎ اﻳـﻦ‬

                                                         ‫ﺗﻔﺎوت ﻛﻪ ﺑﺮ روي رﺟﻴﺴﺘﺮ 2‪ TCCR‬ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ.‬




‫• در ﺣﺎﻟﺘﻲ ﻛﻪ ﭘﺮﭼﻢ ﻣﺸﻐﻮل ﺑﻮدن ﻳﻚ رﺟﻴﺴﺘﺮ ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ، ﻧﻮﺷﺘﻦ ﺑﺮ روي آن رﺟﻴﺴﺘﺮ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ‬

                             ‫ﻣﻘﺪار ﺑﺮوز ﺷﺪه ﺻﺤﻴﺢ ﻧﺒﺎﺷﺪ و ﻣﻤﻜﻦ اﺳﺖ ﺑﺎﻋﺚ وﻗﻔﻪ ي ﻧﺎﺧﻮاﺳﺘﻪ ﺷﻮد.‬


                                                       ‫- ٠٨ -‬
‫18 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                         ‫ ‬                ‫ ‪       www.pnkavosh.com‬‬
‫• ﻣﻜﺎﻧﻴﺴﻢ ﺧﻮاﻧﺪن اﻳﻦ ﺳﻪ رﺟﻴﺴﺘﺮ ﻣﺘﻔﺎوت ﻣﻲ ﺑﺎﺷﺪ، ﺑﺪﻳﻦ ﺻﻮرت ﻛﻪ زﻣﺎن ﺧﻮاﻧﺪن 2‪ TCNT‬ﻣﻘﺪار ﺧـﻮد‬

‫رﺟﻴﺴﺘﺮ ﺧﻮاﻧﺪه ﺷﺪه و ﺑﺎ ﺧﻮاﻧﺪن 2‪ OCR‬و 2‪ TCCR‬ﻣﻘﺪار ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ ﻣﻮﻗﺖ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد.‬

‫• ﺗﺎﻳﻤﺮ2 در وﺿﻌﻴﺖ آﺳﻨﻜﺮون در ﺣﺎﻟﺖ ‪ Power-Save‬ﻧﻴﺰ ﻓﻌـﺎل ﺑـﻮده و ﭘـﺲ از ﺳـﺮرﻳﺰ ﺷـﺪن ﺗـﺎﻳﻤﺮ از‬

‫وﺿﻌﻴﺖ ‪ Power-Save‬ﺧﺎرج ﺷﺪه و در وﺻﺮت ﻓﻌﺎل ﺑﻮدن وﻗﻔـﻪ، ‪ ISR‬را اﺟـﺮا ﻧﻤـﻮده و ﻣﺠـﺪدا وارد‬

                                                            ‫ﺣﺎﻟﺖ ‪ Power-Save‬ﻣﻲ ﺷﻮد.‬




                                                               ‫ﭘﺮوژه 9: ﺳﺎﻋﺖ ﺑﺎ ‪ RTC‬ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ‬




‫*****************************************************/‬
‫‪Project : Real Time Clock‬‬
‫‪Author‬‬         ‫‪: Reza Sepas Yar‬‬
‫‪Company : Pishro Noavaran Kavosh‬‬
‫/*****************************************************‬


‫>‪#include <mega16.h‬‬
‫>‪#include <lcd.h‬‬
‫>‪#include <stdio.h‬‬
‫0000008 ‪#define xtal‬‬


‫‪#asm‬‬
      ‫‪.equ __lcd_port=0x1B ;PORTA‬‬
‫‪#endasm‬‬


‫;‪unsigned char second, minute,hour‬‬
‫;]01[‪unsigned char lcd_buff‬‬

                                                   ‫- ١٨ -‬
P a g e | 82
        www.avr.ir                                          www.pnkavosh.com 


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.avr.ir                                www.pnkavosh.com 
// 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);
}




                                  - ٨٣ -
‫48 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




                                          ‫ﺗﺎﻳﻤﺮ/ﻛﺎﻧﺘﺮ ﻳﻚ‬



‫ﺗﺎﻳﻤﺮ ﻳﻚ ﺗﺎﻳﻤﺮي 61 ﺑﻴﺘﻲ اﺳﺖ و در آن ﻋﻼوه ﺑﺮ اﻣﻜﺎﻧﺎت ﺗﺎﻳﻤﺮ ﺻﻔﺮ، ﻳﻚ ﺑﺨﺶ دﻳﮕﺮ ﺑﻪ ﻧﺎم ﺑﺨﺶ ‪ Capture‬ﺑﻪ‬

‫آن اﻓﺰوده ﺷﺪه اﺳﺖ. اﻳﻦ ﺑﺨﺶ در زﻣﺎن ﻫﺎي ﺧﺎص، ﻋﺪد ﺷﻤﺎرش ﺷﺪه ﺗﻮﺳﻂ ﺗﺎﻳﻤﺮ ﻳﻚ و زﻣـﺎن ﺳـﭙﺮي ﺷـﺪه را‬

‫ﺛﺒﺖ ﻛﺮده و از ﻃﺮﻳﻖ آن اﻣﻜﺎن اﻧﺪازه ﮔﻴﺮي ﻫﺎي زﻣﺎﻧﻲ را ﻓﺮاﻫﻢ ﻣﻲ آورد. ﺗﺎﻳﻤﺮ ﻳﻚ داراي ﭘـﻨﺞ ‪ Mode‬ﻛـﺎري ﺑـﻪ‬

‫ﻧ ـﺎم ﻫ ـﺎي ‪ Phase Correct PWM Mode Fast PWM ،CTC ،Normal‬و ‪Phase and Mode‬‬
                                                                ‫ـ ـ‬

‫‪ Frequency Correct‬ﻣﻲ ﺑﺎﺷﺪ. ‪ Mode‬ﻫﺎي ‪ PWM‬در ﺗﺎﻳﻤﺮ 1 ﺑﺴﻴﺎر ﻣﺘﻨﻮع و داراي 21 ﺣﺎﻟـﺖ ‪ PWM‬ﻣـﻲ‬

‫ﺑﺎﺷﺪ. در اﻳﻦ ﺗﺎﻳﻤﺮ ﭘﻴﻦ 1‪ T‬ﺑﻪ ﻋﻨﻮان ورودي ﻛﺎﻧﺘﺮ و ﭘﻴﻦ ﻫﺎي ‪ OC1A‬و ‪ OC1B‬ﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴـﻪ ﮔـﺮ‬

                         ‫ﻋﻤﻞ ﻣﻲ ﻛﻨﻨﺪ. ﻫﻤﭽﻨﻴﻦ ﭘﻴﻦ 1‪ ICP‬ﺑﺮاي ورودي ﺑﺨﺶ ‪ Capture‬ﺗﺎﻳﻤﺮ ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ.‬

‫ﺑﻪ ﻋﻠﺖ 61 ﺑﻴﺘﻲ ﺑﻮدن ﺗﺎﻳﻤﺮ، رﺟﻴﺴﺘﺮﻫﺎي 1‪ TCNT‬و ‪ OCR1A‬و ‪ OCR1B‬ﺷﺎﻧﺰده ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻫﺮ ﻛﺪام‬

‫داراي دو ﺑﺎﻳﺖ ‪ L‬و ‪ H‬ﻫﺴﺘﻨﺪ. ﻫﻤﭽﻨﻴﻦ ﺗﺎﻳﻤﺮ ﻳﻚ داراي دو واﺣﺪ ﻣﻘﺎﻳﺴﻪ ي ﻣﺠﺰا ﻣﻲ ﺑﺎﺷﺪ ﻛـﻪ ﻣﻘـﺪار ﻣﻮﺟـﻮد در‬

‫رﺟﻴﺴﺘﺮﻫﺎي ‪ OCR1A‬و ‪ OCR1B‬را ﺑـﺎ 1‪ TCNT‬ﻣﻘﺎﻳﺴـﻪ ﻛـﺮده و در ﺻـﻮرت ﺑﺮاﺑـﺮي وﺿـﻌﻴﺖ ﭘـﻴﻦ ﻫـﺎي‬

‫‪ OC1A‬و ‪ OC1B‬را ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻨﺪ. ﻫﻤﭽﻨﻴﻦ رﺟﻴﺴﺘﺮ 1‪ ICR‬ﻧﻴﺰ ﻛﻪ رﺟﻴﺴﺘﺮ واﺣﺪ ‪ Capture‬اﺳﺖ رﺟﻴﺴـﺘﺮي‬

                                                                                      ‫61 ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﺪ.‬




               ‫رﺟﻴﺴﺘﺮﻫﺎي ﺷﺎﻧﺰده ﺑﻴﺘﻲ ﺗﺎﻳﻤﺮ1: 1‪ OCR1B ،OCR1A ،TCNT‬و 1‪ICR‬‬




                                                       ‫- ٤٨ -‬
P a g e | 85
        www.avr.ir                                                                            www.pnkavosh.com 
                                         :‫ ﻛﻨﺘﺮل ﺗﺎﻳﻤﺮ را ﺑﺮ ﻋﻬﺪه دارﻧﺪ‬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                     ‫ ﻛﺎري‬Mode             TOP     TOV=1

         0             0          0         0     0       Normal                               0xFFFF   0xFFFF

         1             0          0         0     1       PWM, Phase Correct, 8-bit            0x00FF        0

         2             0          0         1     0       PWM, Phase Correct, 9-bit            0x01FF        0

         3             0          0         1     1       PWM, Phase Correct, 10-bit           0x03FF        0

         4             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



                                                                      - ٨٥ -
‫68 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬
        ‫51‬      ‫1‬        ‫1‬        ‫1‬       ‫1‬     ‫‪Fast PWM‬‬                              ‫‪OCR1A‬‬       ‫‪TOP‬‬




‫• ﺗﻌﺮﻳﻒ ‪ :TOP‬ﺗﺎﻳﻤﺮ وﻗﺘﻲ ﺑﻪ ﻣﻘﺪار ‪ TOP‬ﻣﻲ رﺳﺪ ﻛﻪ ﺑﺮاﺑﺮ ﺑﺎ ﺑﺎﻻﺗﺮﻳﻦ ﻣﻘﺪار در رﺷـﺘﻪ ي ﺷـﻤﺎرش ﺧـﻮد‬

‫اﺳﺖ. اﻳﻦ ﻣﻘﺪار ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺘﻲ ﻣﺜﻞ‪ 0x01FF ,0x03FF‬و ﻳﺎ ‪ 0x00FF‬ﺑﻮده و ﻳﺎ ﻣﻘﺪار ﻧﮕﻬﺪاري‬

                                              ‫ﺷﺪه در ﻳﻜﻲ از رﺟﻴﺴﺘﺮﻫﺎي ‪ OCR1A‬ﻳﺎ 1‪ ICR‬ﺑﺎﺷﺪ.‬




‫‪ FOC1A‬و ‪ :FOC1B‬ﺑﻴﺖ ﻫﺎي ‪ Force‬ﺑﺨﺶ ﻣﻘﺎﻳﺴﻪ ﮔﺮ ﻛﻪ ﻋﻤﻠﻜﺮد آن ﻫﺎ ﻫﻤﺎﻧﻨﺪ 0‪ FOC‬در ﺗﺎﻳﻤﺮ ﺻـﻔﺮ و‬

‫دو ﻣﻲ ﺑﺎﺷﺪ. ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻪ در ‪ Mode‬ﻫﺎي ﻏﻴﺮ ‪ ،PWM‬ﻳﻚ ﻛﺮدن اﻳﻦ ﺑﻴﺖ ﺑﺪون اﻳﻨﻜﻪ وﻗﻔﻪ اي اﻳﺠﺎد ﻛﻨـﺪ در‬

‫ﺻﻮرت ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ، ﺑﺎﻋﺚ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي ‪ OC1A‬و ‪ OC1B‬ﻣﻄﺎﺑﻖ ﺑﺎ وﺿﻌﻴﺖ ﺑﻴﺖ ﻫـﺎي ‪ COM‬در‬

                                                                                              ‫1‪ TCCR‬ﻣﻲ ﺷﻮد.‬




‫ﺑﻴﺖ ﻫـﺎي 0‪ COM1B0 ,COM1A1 ,COM1A‬و 1‪ :COM1B‬ﺗﻐﻴﻴـﺮ وﺿـﻌﻴﺖ ﭘـﻴﻦ ﻫـﺎي ‪ OC1A‬و‬

‫‪ OC1B‬را در ﺣﺎﻟﺖ ﺗﻄﺒﻴﻖ ﻣﻌﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻣﻘﺪار آن ﻫﺎ ﺑﺴﺘﻪ ﺑﻪ ‪ Mode‬ﻛﺎري ﻋﻤﻠﻜـﺮد ﻣﺘﻔـﺎوﺗﻲ را اﻳﺠـﺎد ﻣـﻲ‬

                                       ‫ﻛﻨﺪ. ﺑﻨﺎﺑﺮاﻳﻦ در ﺑﺮرﺳﻲ ‪ Mode‬ﻫﺎي ﻣﺨﺘﻠﻒ آن را ﻣﻄﺎﻟﻌﻪ ﺧﻮاﻫﻴﻢ ﻛﺮد.‬




                                  ‫ﺑﻴﺖ ﻫﺎي 01‪ CS11 ،CS‬و 21‪ :CS‬ﺑﺮاي ﺗﻌﻴﻴﻦ ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ ﻣﻲ ﺑﺎﺷﻨﺪ:‬




               ‫20‪CS‬‬   ‫10‪CS‬‬   ‫00‪CS‬‬                      ‫وﺿﻌﻴﺖ ﻣﻨﺒﻊ ﻛﻼك ﺗﺎﻳﻤﺮ‬

                ‫0‬        ‫0‬    ‫0‬                                                    ‫ﺑﺪون ﻛﻼك )ﻣﺘﻮﻗﻒ(‬

                ‫0‬        ‫0‬    ‫1‬                                               ‫ﻛﻼك ﺳﻴﺴﺘﻢ )ﺑﺪون ﺗﻘﺴﻴﻢ(‬

                ‫0‬        ‫1‬    ‫0‬                                                        ‫8/ﻛﻼك ﺳﻴﺴﺘﻢ‬




                                                       ‫- ٦٨ -‬
‫78 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                 ‫ ‬                            ‫ ‪       www.pnkavosh.com‬‬
                 ‫0‬           ‫1‬       ‫1‬                                                          ‫46/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                 ‫1‬           ‫0‬       ‫0‬                                                         ‫652/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                 ‫1‬           ‫0‬       ‫1‬                                                        ‫4201/ﻛﻼك ﺳﻴﺴﺘﻢ‬

                 ‫1‬           ‫1‬       ‫0‬                                    ‫ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ ﺧﺎرﺟﻲ )1‪(T‬‬

                 ‫1‬           ‫1‬       ‫1‬                                        ‫ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ ﺧﺎرﺟﻲ )1‪(T‬‬




‫ﺑﻴﺖ 1‪ :ICES‬ﺑﻴﺖ ﺗﻌﻴﻴﻦ ﻟﺒﻪ ي ورودي ﺑﺨﺶ ‪ Capture‬از ﭘﻴﻦ 1‪ .ICP‬ﺑﺎ ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه‬

                                                           ‫و ﺑﺎ ﻳﻚ ﺑﻮدن آن ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ﺑﺎﻋﺚ ﺗﺮﻳﮕﺮ ﻣﻲ ﺷﻮد.‬




                                                 ‫ﺑﻴﺖ 1‪ :ICNC‬ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﺣﺬف ﻧﻮﻳﺰ در ورودي ﭘﻴﻦ 1‪ICP‬‬




‫ﻧﺘﺎﻳﺞ ﺣﺎﺻﻞ از ﻛﺎرﻛﺮد ﺗﺎﻳﻤﺮ1 در 4 ﺑﻴﺖ از رﺟﻴﺴﺘﺮ ‪ TIFR‬ﺑﻪ ﻧﺎم ﻫﺎي 1‪) TOV‬ﭘﺮﭼﻢ ﺳﺮرﻳﺰ( ‪) OCF1A‬ﭘﺮﭼﻢ‬

‫ﺗﻄﺎﺑﻖ ﻣﻘﺎﻳﺴﻪ ﮔﺮ ‪) OCF1B (A‬ﭘﺮﭼﻢ ﺗﻄﺎﺑﻖ ﻣﻘﺎﻳﺴﻪ ﮔﺮ ‪ (B‬و 1‪) ICF‬ﭘﺮﭼﻢ ﺑﺨﺶ ‪ Capture‬ﺗـﺎﻳﻤﺮ1( ﻣـﻨﻌﻜﺲ‬

                                                                                                                  ‫ﻣﻲ ﺷﻮﻧﺪ:‬



                ‫‪TIFR‬‬             ‫7‬        ‫6‬      ‫5‬         ‫4‬              ‫3‬            ‫2‬         ‫1‬         ‫0‬
                ‫ﻧﺎم ﺑﻴﺖ‬      ‫2‪OCF‬‬        ‫2‪TOV‬‬   ‫1‪ICF‬‬   ‫‪OCF1A‬‬            ‫‪OCF1B‬‬       ‫1‪TOV‬‬      ‫0‪OCF‬‬      ‫0‪TOV‬‬

               ‫ﺳﻄﺢ ﻣﻨﻄﻘﻲ‬         ‫0‬        ‫0‬      ‫‪X‬‬         ‫‪X‬‬             ‫‪X‬‬            ‫‪X‬‬          ‫0‬         ‫0‬




   ‫ﻳﻚ ﺷﺪن ﻫﺮ ﻳﻚ از اﻳﻦ ﭘﺮﭼﻢ ﻫﺎ در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ )‪ (I‬و ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ ي ﻣﺮﺑﻮﻃﻪ‬

                          ‫در رﺟﻴﺴﺘﺮ ‪ TIMSK‬ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻧﺸﻌﺎب ﺑﺮﻧﺎﻣﻪ ﺑﻪ ‪ ISR‬ﻣﺮﺑﻮط ﺑﻪ آن وﻗﻔﻪ ﺷﻮد:‬




                                                               ‫- ٧٨ -‬
‫88 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                ‫ ‬                       ‫ ‪       www.pnkavosh.com‬‬



               ‫‪TIMSK‬‬         ‫7‬       ‫6‬       ‫5‬            ‫4‬            ‫3‬        ‫2‬        ‫1‬         ‫0‬
                ‫ﻧﺎم ﺑﻴﺖ‬    ‫2‪OCIE‬‬   ‫2‪TOIE‬‬   ‫1‪TICIE‬‬   ‫‪OCIE1A‬‬         ‫‪OCIE1B‬‬    ‫1‪TOIE‬‬     ‫0‪OCIE‬‬    ‫0‪TOIE‬‬

               ‫ﺳﻄﺢ ﻣﻨﻄﻘﻲ‬     ‫0‬       ‫0‬       ‫‪X‬‬        ‫‪X‬‬                ‫‪X‬‬       ‫‪X‬‬         ‫0‬         ‫0‬




   ‫ﺑﺎ اﺟﺮا ﺷﺪن ‪ ISR‬ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﺑﻴﺖ ﭘﺮﭼﻢ وﻗﻔﻪ ﺻﻔﺮ ﺷﺪه و ﻳﺎ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي آن ﺑﻮﺳﻴﻠﻪ ي‬

                                                                                    ‫ﻧﺮم اﻓﺰار آن را ﭘﺎك ﻛﺮد.‬




                                                                                             ‫‪Normal Mode‬‬



‫اﻳﻦ ‪ Mode‬ﻫﻤﺎﻧﻨﺪ ﻣﺸﺎﺑﻪ آن در ﺗﺎﻳﻤﺮ ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺗﺎﻳﻤﺮ ﺗﺎ ﻋﺪد ‪ 0xFFFF‬ﺷﻤﺎرش ﻛﺮده و ﺑـﺎ‬

‫رﺳﻴﺪن ﺑﻪ آن ﺗﺎﻳﻤﺮ ﺳﺮرﻳﺰ ﻛﺮده و ﺑﻴﺖ 1‪ TOV‬ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ ﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋـﺚ اﺟـﺮاي‬

‫‪ ISR‬ﻣﺮﺑﻮﻃﻪ ﺷﻮد. در ‪ Mode‬ﻋﺎدي ﻫﺮ دو ﻣﻘﺎﻳﺴﻪ ﮔﺮ ‪ A‬و ‪ B‬ﻓﻌﺎل ﺑﻮده و ﻫﺮ ﻛﺪام ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻞ ﻋﻤـﻞ ﻣﻘﺎﻳﺴـﻪ‬

‫را روي رﺟﻴﺴﺘﺮ 1‪ TCNT‬و ‪ OCR1A‬و ‪ OCR1B‬اﻧﺠﺎم ﻣـﻲ دﻫﻨـﺪ. در ﺻـﻮرت ﺑﺮاﺑـﺮي ﺑﻴـﺖ ‪ OCF1A‬ﻳـﺎ‬

‫‪ OCF1B‬ﻳﻚ ﺷﺪه و ﺧﺮوﺟﻲ ‪ OC1A‬ﻳﺎ ‪ OC1B‬ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ داده و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن‬

                                                                            ‫وﻗﻔﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮﻧﺪ.‬




                                                              ‫- ٨٨ -‬
‫98 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬



               ‫1‪COM1A1/COM1B‬‬     ‫0‪COM1A0/COM1B‬‬                    ‫وﺿﻌﻴﺖ ﭘﻴﻦ ‪ OC1A‬ﻳﺎ ‪OC1B‬‬

                     ‫0‬                    ‫0‬                                     ‫ﻏﻴﺮ ﻓﻌﺎل )‪ I/O‬ﻣﻌﻤﻮﻟﻲ(‬

                     ‫0‬                    ‫1‬                                  ‫‪ Toggle‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ‬

                     ‫1‬                    ‫0‬                                   ‫‪ Clear‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ‬

                     ‫1‬                    ‫1‬                                     ‫‪ Set‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ‬




    ‫• در ﺻﻮرت اﺳﺘﻔﺎده از ‪ OC1A‬ﻳﺎ ‪ OC1B‬ﺑﺮاي ﺗﻮﻟﻴﺪ ﺷﻜﻞ ﻣﻮج، ﺑﺎﻳﺪ اﻳﻦ ﭘﻴﻦ ﻫﺎ ﺑﻪ ﺻﻮرت ﺧﺮوﺟﻲ‬

                                                                                        ‫ﭘﻴﻜﺮﺑﻨﺪي ﺷﻮﻧﺪ.‬




                         ‫ﻣﺜﺎل 7: )ﺗﻮﻟﻴﺪ دو ﺷﻜﻞ ﻣﻮج ﺑﺎ دوره ﺗﻨﺎوب 131 ﻣﻴﻠﻲ ﺛﺎﻧﻴﻪ و اﺧﺘﻼف ﻓﺎز 01 ﻣﻴﻠﻲ ﺛﺎﻧﻴﻪ(‬



‫>‪#include <mega16.h‬‬
‫0000008 ‪#define xtal‬‬


‫)‪void main(void‬‬
‫{‬


‫;00‪PORTD=0x‬‬
‫;03‪DDRD=0x‬‬


‫‪// Mode: Normal top=FFFFh‬‬
‫;05‪TCCR1A=0x‬‬              ‫‪//toggle OC1A & OC1B‬‬
‫;20‪TCCR1B=0x‬‬              ‫8/‪//Clock‬‬
‫;00‪OCR1AH=0x‬‬
‫;‪OCR1AL=0xFF‬‬              ‫552=‪//OCR1A‬‬


                                                         ‫- ٩٨ -‬
‫09 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                ‫ ‬                ‫ ‪       www.pnkavosh.com‬‬
‫;82‪OCR1BH=0x‬‬
‫;‪OCR1BL=0x0F‬‬              ‫55201=‪//OCR1B‬‬


‫;)1( ‪while‬‬


‫}‬


‫‪T = 2 × 216 × 1μs = 131072μs = 131ms‬‬

‫‪ = OCR1B − OCR1A = 10255 − 255 = 10000μs = 10ms‬اﺧﺘﻼف ﻓﺎز‬




                                                                                     ‫‪CTC Mode‬‬



‫در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘﺪار رﺟﻴﺴﺘﺮ 1‪ TCNT‬ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ ﺑﺎ ﻣﻘﺪار رﺟﻴﺴﺘﺮ ‪ OCR1A‬ﻳﺎ 1‪ ICR‬ﻣﻘﺎﻳﺴﻪ ﻣـﻲ ﺷـﻮد و‬

‫در ﺻﻮرت ﺑﺮاﺑﺮي ﻣﻘﺪار رﺟﻴﺴﺘﺮ 1‪ TCNT‬ﺑﺮاﺑﺮ ﺻﻔﺮ ﻣﻲ ﺷﻮد. ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﺣﺎﻟـﺖ ﻣﻘـﺪار ‪ TOP‬ﺗـﺎﻳﻤﺮ را ﺑـﺎ‬

               ‫ﺗﻮﺟﻪ ﺑﻪ ﻣﻘﺪار ﻣﻮﺟﻮد در ﺑﻴﺖ ﻫﺎي ‪ WGM‬ﻣﻘﺪار رﺟﻴﺴﺘﺮﻫﺎي ‪ OCR1A‬ﻳﺎ 1‪ ICR‬ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ.‬

‫ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار ‪ TOP‬ﺧﻮد ﺑﺮ ﺣﺴﺐ اﻳﻨﻜﻪ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ ‪ OCR1A‬ﻳﺎ 1‪ ICR‬اﻧﺘﺨﺎب ﺷـﺪه ﺑﺎﺷـﺪ ﺑـﻪ‬

‫ﺗﺮﺗﻴﺐ ﭘﺮﭼﻢ ﻫﺎي ‪ OCF1A‬ﻳﺎ 1‪ ICF‬ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔﻪ از آن ﻣـﻲ ﺗـﻮان ﺑـﺮاي ﺗﻐﻴﻴـﺮ دادن‬

‫ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ اﺳﺘﻔﺎده ﻛﺮد. اﻳﻦ ﻋﻤﻞ ﺑﺎﻳﺪ ﺑﺎ دﻗﺖ ﺻﻮرت ﮔﻴﺮد زﻳﺮا رﺟﻴﺴـﺘﺮ ﻣﻘﺎﻳﺴـﻪ ي ﺗﺎﻳﻤﺮﻫـﺎ ﻓﻘـﻂ در ‪Mode‬‬

‫ﻫﺎي ‪ PWM‬داراي ﺑﺎﻓﺮ دوﺑﻞ ﻣﻲ ﺑﺎﺷﻨﺪ. در اﻳﻦ ﺣﺎﻟـﺖ ﻓﺮﻛـﺎﻧﺲ ﻣـﻮج اﻳﺠـﺎد ﺷـﺪه روي ﭘﺎﻳـﻪ ﻫـﺎي ‪ OC1A‬ﻳـﺎ‬

                                                                      ‫‪ OC1B‬ﻣﻄﺎﺑﻖ راﺑﻄﻪ ي زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬



                                                      ‫‪f CLK _ I / O‬‬
                                       ‫= ‪f OC1x‬‬
                                                  ‫)‪2.N .(1 + OCR1A‬‬


                                                          ‫- ٠٩ -‬
P a g e | 91
        www.avr.ir                                                      www.pnkavosh.com 



                                    (OC1A ‫ﻣﺜﺎل8: )ﺗﻮﻟﻴﺪ ﻣﻮج ﻣﺮﺑﻌﻲ ﺑﺎ ﻓﺮﻛﺎﻧﺲ 1 ﻛﻴﻠﻮﻫﺮﺗﺰ روي ﭘﺎﻳﻪ ي‬



#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);
}


        8000000
f=                  = 1000 = 1KHz
     2 × 8(1 + 499)




                                                    - ٩١ -
‫29 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬



                                                                            ‫‪Fast PWM Mode‬‬



‫ﺑﺮ ﺧﻼف ﺗﺎﻳﻤﺮﻫﺎي ﺻﻔﺮ و دو ﻛﻪ در آن ﻣﻮج ﻫﺎي ‪ PWM‬ﺗﻮﻟﻴﺪ ﺷﺪه داراي دﻗﺖ ﺛﺎﺑـﺖ 8 ﺑﻴﺘـﻲ ﻫﺴـﺘﻨﺪ، ﺗـﺎﻳﻤﺮ 1‬

‫ﻗﺎدر اﺳﺖ ﺳﻴﮕﻨﺎل ﻫﺎي ‪ PWM‬اي ﺑﺎ دﻗﺖ ﻣﺘﻐﻴﺮ را اراﺋﻪ ﻛﻨﺪ، اﻳﻦ ﻣﺴﺌﻠﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﻋـﻼوه ﺑـﺮ‬

   ‫ﺗﻐﻴﻴﺮ ‪ Duty Cycle‬ﻓﺮﻛﺎﻧﺲ ﻣﻮج را ﺑﻪ ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﻛﻨﺘﺮل ﻛﻨﺪ )ﺑﺪون ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ 1‪(TCNT‬‬




                           ‫‪ PWM‬ﺳﺮﻳﻊ داراي ﭘﻨﺞ ‪ Mode‬ﻣﻲ ﺑﺎﺷﺪ: )5، 6، 7، 41، 51 = ]0:3[1‪(WGM‬‬




                                                           ‫‪ PWM‬ﺳﺮﻳﻊ 8 ﺑﻴﺘﻲ )‪(0xFF = TOP‬‬            ‫1.‬

                                                         ‫‪ PWM‬ﺳﺮﻳﻊ 9 ﺑﻴﺘﻲ )‪(0x1FF = TOP‬‬             ‫2.‬

                                                      ‫‪ PWM‬ﺳﺮﻳﻊ 01 ﺑﻴﺘﻲ )‪(0x03FF = TOP‬‬              ‫3.‬

                                                                 ‫‪ PWM‬ﺳﺮﻳﻊ ﺑﺎ ‪ICR1 = TOP‬‬            ‫4.‬

                                                               ‫‪ PWM‬ﺳﺮﻳﻊ ﺑﺎ ‪OCR1A = TOP‬‬             ‫5.‬




‫در اﻳﻦ ‪ Mode‬ﺗﺎﻳﻤﺮ از ﺻﻔﺮ ﺗﺎ ﻣﻘﺪار ‪ TOP‬ﺧﻮد ﺷﺮوع ﺑﻪ ﺷﻤﺎرش ﻛﺮده و ﭘﺲ از از ﺳﺮرﻳﺰ ﻣﺠﺪدا از ﺻﻔﺮ ﺷﺮوع‬

‫ﺑﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ. در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻘﺎﻳﺴﻪ ي ﺧﺮوﺟﻲ در ﺣﺎﻟﺖ ‪ PWM‬ﻏﻴﺮ ﻣﻌﻜﻮس ﺑﺎﺷـﺪ در ﺣﺎﻟـﺖ ﺗﻄﺒﻴـﻖ ﻣﻘﺎﻳﺴـﻪ‬

‫ﭘﻴﻦ ‪ OC1x‬ﻳﻚ ﺷﺪه و ﺑﺎ رﺳﻴﺪن ﺑﻪ ﻣﻘﺪار ‪ TOP‬ﭘﺎك ﻣﻲ ﺷﻮد. در‬            ‫ﺑﻴﻦ رﺟﻴﺴﺘﺮﻫﺎي 1‪ TCNT‬و ‪OCR1x‬‬

‫ﺻﻮرﺗﻲ ﻛﻪ ﺧﺮوﺟﻲ ‪ PWM‬ﻣﻌﻜﻮس ﺑﺎﺷﺪ وﺿﻌﻴﺘﻲ ﻋﻜﺲ وﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ. دﻗﺖ ﻣﻮج ‪ PWM‬ﺧﺮوﺟﻲ ﻣـﻲ‬

‫ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺖ 8، 9 ﻳﺎ 01 ﺑﻴﺘﻲ داﺷﺘﻪ وﻳﺎ ﺑﻮﺳﻴﻠﻪ ي رﺟﻴﺴﺘﺮﻫﺎي 1‪ ICR‬ﻳﺎ ‪ OCR1A‬ﺑﻪ ﻣﻘـﺪار دﻟﺨـﻮاه ﺗﻨﻈـﻴﻢ‬



                                                      ‫- ٢٩ -‬
‫39 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬
‫ﺷﻮد. در اﻳﻦ ﺣﺎﻟﺖ ﺣﺪاﻗﻞ ﻣﻘﺪار ﻣﺠﺎز 2 ﺑﻴﺖ )ﺑﺎ دادن ﻣﻘﺪار 3000‪ 0x‬ﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي 1‪ ICR‬ﻳـﺎ ‪ (OCR1x‬و‬

                   ‫ﺣﺪاﻛﺜﺮ آن 61 ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ )ﺑﺎ دادن ﻣﻘﺪار ‪ 0xFFFF‬ﺑﻪ رﺟﻴﺴﺘﺮﻫﺎي 1‪ ICR‬ﻳﺎ ‪.(OCR1x‬‬




                                  ‫دﻗﺖ ﻣﻮج ‪ PWM‬ﺑﺮ ﺣﺴﺐ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ از راﺑﻄﻪ ي زﻳﺮ ﺑﻪ دﺳﺖ ﻣﻲ آﻳﺪ:‬



                                                      ‫)1 + ‪log(TOP‬‬
                                       ‫= ‪resolution‬‬
                                                         ‫)2(‪log‬‬




‫ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار ‪ TOP‬ﭘﺮﭼﻢ ﺳـﺮرﻳﺰ 1‪ TOV‬ﻓﻌـﺎل ﺷـﺪه و ﺑـﺎ ﺗﻄﺒﻴـﻖ ﻣﻘﺎﻳﺴـﻪ ﻧﻴـﺰ ﺑﻴـﺖ ‪ OCF1A‬ﻳـﺎ‬

‫‪ OCF1B‬ﻳﻚ ﻣﻲ ﺷﻮد. در اﻳﻦ ﺣﺎﻟﺖ ﻫﺎ اﮔﺮ وﻗﻔﻪ ي ﻣﺮﺑﻮﻃﻪ ﻓﻌﺎل ﺷﺪه ﺑﺎﺷﺪ ﻣـﻲ ﺗـﻮان در ‪ ISR‬آن وﻗﻔـﻪ ﻣﻘـﺪار‬

‫ﻣﻘﺎﻳﺴﻪ را ﺗﻐﻴﻴﺮ داد. ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻣﻘـﺪار رﺟﻴﺴـﺘﺮﻫﺎي ﻣﻘﺎﻳﺴـﻪ ﺑﺎﻳـﺪ از ﻣﻘـﺪار ‪ TOP‬ﻛﻤﺘـﺮ ﺑﺎﺷـﺪ در ﻏﻴـﺮ‬

                                                                   ‫اﻳﻨﺼﻮرت ﻫﻴﭽﮕﺎه ﻣﻘﺎﻳﺴﻪ اي ﺻﻮرت ﻧﻤﻲ ﮔﻴﺮد.‬




       ‫ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي ‪ OC1A‬و ‪ OC1B‬در ﺣﺎﻟﺖ ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:‬



       ‫1‪COM1A‬‬     ‫0‪COM1A‬‬
                                                       ‫وﺿﻌﻴﺖ ﭘﻴﻦ ‪ OC1A‬ﻳﺎ ‪OC1B‬‬
       ‫1‪/COM1B‬‬    ‫0‪/COM1B‬‬

           ‫0‬             ‫0‬                                                                ‫ﻏﻴﺮ ﻓﻌﺎل )‪ I/O‬ﻣﻌﻤﻮﻟﻲ(‬

                             ‫اﮔﺮ 51 = ]0:3[1‪ WGM‬ﺑﺎﺷﺪ: ‪ Toggle‬ﭘﻴﻦ ‪ OC1A‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ‪ OC1B‬ﭘﻴﻦ ‪ I/O‬ﻣﻌﻤﻮﻟﻲ‬
           ‫0‬             ‫1‬
                                                          ‫ﺑﺮاي دﻳﮕﺮ ﺣﺎﻟﺖ ﻫﺎي ]0:3[1‪ :WGM‬ﻏﻴﺮ ﻓﻌﺎل )‪ I/O‬ﻣﻌﻤﻮﻟﻲ(‬

           ‫1‬             ‫0‬                       ‫‪ Clear‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ‪ Set‬در وﺿﻌﻴﺖ ‪ PWM) TOP‬ﻏﻴﺮ ﻣﻌﻜﻮس(‬

           ‫1‬             ‫1‬                          ‫‪ Set‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ‪ Clear‬در وﺿﻌﻴﺖ ‪ PWM) TOP‬ﻣﻌﻜﻮس(‬




                                                          ‫- ٣٩ -‬
P a g e | 94
        www.avr.ir                                                                www.pnkavosh.com 
                                                     :‫ ﺣﺎﺻﻞ از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ‬PWM ‫ﻓﺮﻛﺎﻧﺲ ﻣﻮج‬

                                                       f Clk _ I / O
                                           f PWM =
                                                     N.(1 + TOP )




                                       (‫ ﺑﺎ ﻓﺮﻛﺎﻧﺲ 1 ﻛﻴﻠﻮ ﻫﺮﺗﺰ و زﻣﺎن وﻇﻴﻔﻪ ي 52 درﺻﺪ‬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);
}


            8000000                                                       256
f PWM =                 = 976 ≈ 1KHz                       DutyCycle =        × 100% = 25%
          8.(1 + 1023 )                                                  1024



                                                            - ٩٤ -
P a g e | 95
        www.avr.ir                                                          www.pnkavosh.com 


      :‫ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ، ﻣﻲ ﺗﻮان ﺑﻪ ﻓﺮﻛﺎﻧﺲ دﻗﻴﻖ 1 ﻛﻴﻠﻮﻫﺮﺗﺰ رﺳﻴﺪ‬ISR ‫ در‬TCNT1 ‫• ﺑﺎ ﻣﻘﺪار اوﻟﻴﻪ دادن ﺑﻪ‬



interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1=24;
}


TIMSK=0x04; //Enable TOV1
#asm("sei") //Enable Interrupts




                                                                        Phase Correct Mode



                  (WGM1[3:0] = 11 ،10 ،3 ،2 ،1) :‫ ﻛﺎري ﻣﻲ ﺑﺎﺷﺪ‬Mode ‫ ﺗﺼﺤﻴﺢ ﻓﺎز داراي ﭘﻨﺞ‬PWM




                                                     (0xFF = TOP) ‫ ﺗﺼﺤﻴﺢ ﻓﺎز 8 ﺑﻴﺘﻲ‬PWM             .1

                                                  (0x1FF = TOP) ‫ ﺗﺼﺤﻴﺢ ﻓﺎز 9 ﺑﻴﺘﻲ‬PWM               .2

                                               (0x03FF = TOP) ‫ ﺗﺼﺤﻴﺢ ﻓﺎز 01 ﺑﻴﺘﻲ‬PWM                .3

                                                              ICR1 = TOP ‫ ﺗﺼﺤﻴﺢ ﻓﺎز ﺑﺎ‬PWM          .4

                                                       OCR1A = TOP ‫ ﺗﺼﺤﻴﺢ ﻓﺎز ﺑﺎ‬PWM                .5




                                                     - ٩٥ -
‫69 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                    ‫ ‪       www.pnkavosh.com‬‬
‫در اﻳﻦ ‪ Mode‬ﺗﺎﻳﻤﺮ ﺑﻪ ﻃﻮر ﭘﻴﻮﺳﺘﻪ از ﻣﻘﺪار ﺻﻔﺮ ﺗﺎ ‪ TOP‬و از ‪ TOP‬ﺗﺎ ﺻﻔﺮ ﻣﻲ ﺷﻤﺎرد. در ﺣﺎﻟﺖ ‪ PWM‬ﻏﻴﺮ‬

‫ﻣﻌﻜﻮس در ﺣﺎﻟﻲ ﻛـﻪ ﺗـﺎﻳﻤﺮ ﺑـﻪ ﺻـﻮرت ﺻـﻌﻮدي ﻣـﻲ ﺷـﻤﺎرد در ﻟﺤﻈـﻪ ي ﺑﺮاﺑـﺮي رﺟﻴﺴـﺘﺮﻫﺎي 1‪ TCNT‬و‬

‫‪ OCR1x‬ﭘﻴﻦ ‪ OC1x‬ﺻﻔﺮ ﺷﺪه و در ﺣﺎﻟﺖ ﺷﻤﺎرش ﻧﺰوﻟﻲ ﺑﺎ ﺗﻄﺎﺑﻖ دو رﺟﻴﺴﺘﺮ اﻳﻦ ﭘﻴﻦ ﻳﻚ ﻣﻲ ﺷﻮد. در ﺣﺎﻟﺖ‬

                                                                  ‫‪ PWM‬ﻣﻌﻜﻮس، ﻋﻜﺲ اﻳﻦ ﻗﻀﻴﻪ ﺑﺮﻗﺮار اﺳﺖ.‬

‫دﻗﺖ ﻣﻮج ‪ PWM‬ﺧﺮوﺟﻲ ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺖ 8، 9 ﻳﺎ 01 ﺑﻴﺘﻲ داﺷﺘﻪ وﻳـﺎ ﺑﻮﺳـﻴﻠﻪ ي رﺟﻴﺴـﺘﺮﻫﺎي 1‪ ICR‬ﻳـﺎ‬

‫‪ OCR1A‬ﺑﻪ ﻣﻘﺪار دﻟﺨﻮاه ﺗﻨﻈﻴﻢ ﺷﻮد. در اﻳﻦ ﺣﺎﻟﺖ ﺣﺪاﻗﻞ ﻣﻘـﺪار ﻣﺠـﺎز 2 ﺑﻴـﺖ )ﺑـﺎ دادن ﻣﻘـﺪار 3000‪ 0x‬ﺑـﻪ‬

  ‫رﺟﻴﺴﺘﺮﻫﺎي 1‪ ICR‬ﻳﺎ ‪ (OCR1x‬و ﺣﺪاﻛﺜﺮ آن 61 ﺑﻴﺖ ﻣﻲ ﺑﺎﺷﺪ )ﺑﺎ دادن ﻣﻘﺪار ‪ 0xFFFF‬ﺑـﻪ رﺟﻴﺴـﺘﺮﻫﺎي‬

                                                                                      ‫1‪ICR‬ﻳﺎ ‪.(OCR1x‬‬




                                  ‫دﻗﺖ ﻣﻮج ‪ PWM‬ﺑﺮ ﺣﺴﺐ ﻣﻘﺪار ﻣﺎﻛﺰﻳﻤﻢ از راﺑﻄﻪ ي زﻳﺮ ﺑﻪ دﺳﺖ ﻣﻲ آﻳﺪ:‬



                                                     ‫)1 + ‪log(TOP‬‬
                                      ‫= ‪resolution‬‬
                                                        ‫)2(‪log‬‬



‫ﭘﺮﭼﻢ ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ 1‪ TOV‬ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار ﺻﻔﺮ ﻳﻚ ﺧﻮاﻫﺪ ﺷﺪ و ﺑﺎ ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ﻧﻴـﺰ ﺑﻴـﺖ ‪OCF1A‬‬

‫ﻳﺎ ‪ OCF1B‬ﻳﻚ ﻣﻲ ﺷﻮد. در اﻳﻦ ﺣﺎﻟﺖ ﻫﺎ اﮔﺮ وﻗﻔﻪ ي ﻣﺮﺑﻮﻃﻪ ﻓﻌﺎل ﺷﺪه ﺑﺎﺷﺪ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ‪ ISR‬آن وﻗﻔـﻪ‬

‫ﻣﻨﺸﻌﺐ ﺷﻮد. ﻣﻘﺪار ﻣﻘﺎﻳﺴﻪ )‪ (OCRx‬را در ‪ ISR‬ﻳﺎ ﻫﺮ زﻣﺎن دﻳﮕـﺮ ﻣـﻲ ﺗـﻮان ﺗﻐﻴﻴـﺮ داد اﻣـﺎ اﻳـﻦ ﻣﻘـﺪار در ﺑـﺎﻓﺮ‬

‫رﺟﻴﺴﺘﺮﻫﺎي ‪ OCR1A‬و ‪ OCR1B‬ذﺧﻴﺮه ﺷﺪه و ﺑﺎ رﺳﻴﺪن ﺗﺎﻳﻤﺮ ﺑﻪ ﻣﻘﺪار ‪ TOP‬در ﺧـﻮد رﺟﻴﺴـﺘﺮ ‪ Load‬ﻣـﻲ‬

‫ﺷﻮد ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻐﻴﻴﺮ دادن ﻣﻘﺪار رﺟﻴﺴﺘﺮﻫﺎي ‪ OCR1x‬ﺑﻪ دﻟﻴـﻞ ﺗﻐﻴﻴـﺮ آن ﺑـﺎ رﺳـﻴﺪن ﺑـﻪ ‪ TOP‬ﻣـﻲ ﺗﻮاﻧـﺪ ﺑﺎﻋـﺚ‬

                                                                             ‫ﺧﺮوﺟﻲ ‪ PWM‬ﻧﺎ ﻣﺘﻘﺎرن ﺷﻮد:‬




                                                         ‫- ٦٩ -‬
‫79 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                    ‫ ‬                      ‫ ‪       www.pnkavosh.com‬‬

                                                 ‫‪TOP‬‬           ‫011=‪OCR1A‬‬

                             ‫081=‪OCR1A‬‬




    ‫ﻣﺸﻜﻞ ﺑﺎﻻ در ‪ PWM‬ﺗﺼﺤﻴﺢ ﻓﺎز و ﻓﺮﻛﺎﻧﺲ ﺑﺎ ﺑﺮوز ﻛﺮدن رﺟﻴﺴﺘﺮﻫﺎي ‪ OCR1x‬در زﻣﺎن رﺳﻴﺪن ﺑﻪ‬

                                                                                            ‫ﺻﻔﺮ، ﺣﻞ ﻣﻲ ﺷﻮد.‬




       ‫ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ ﭘﻴﻦ ﻫﺎي ‪ OC1A‬و ‪ OC1B‬در ﺣﺎﻟﺖ ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ و ﺳﺮرﻳﺰ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:‬



       ‫1‪COM1A‬‬     ‫0‪COM1A‬‬
                                                           ‫وﺿﻌﻴﺖ ﭘﻴﻦ ‪ OC1A‬ﻳﺎ ‪OC1B‬‬
       ‫1‪/COM1B‬‬    ‫0‪/COM1B‬‬

           ‫0‬             ‫0‬                                                                    ‫ﻏﻴﺮ ﻓﻌﺎل )‪ I/O‬ﻣﻌﻤﻮﻟﻲ(‬

                                    ‫اﮔﺮ 41 ,9 = ]0:3[1‪ WGM‬ﺑﺎﺷﺪ: ‪ Toggle‬ﭘﻴﻦ ‪ OC1A‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ‪ OC1B‬ﭘﻴﻦ ‪I/O‬‬
           ‫0‬             ‫1‬
                                                ‫ﻣﻌﻤﻮﻟﻲ ﺑﺮاي دﻳﮕﺮ ﺣﺎﻟﺖ ﻫﺎي ]0:3[1‪ :WGM‬ﻏﻴﺮ ﻓﻌﺎل )‪ I/O‬ﻣﻌﻤﻮﻟﻲ(‬

           ‫1‬             ‫0‬                  ‫‪ Clear‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﺻﻌﻮدي. ‪ Set‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﻧﺰوﻟﻲ‬

           ‫1‬             ‫1‬                  ‫‪ Set‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﺻﻌﻮدي. ‪ Clear‬در وﺿﻌﻴﺖ ﺗﻄﺎﺑﻖ و ﺷﻤﺎرش ﻧﺰوﻟﻲ‬




   ‫ﻓﺮﻛﺎﻧﺲ ﻣﻮج ‪ PWM‬در ﺣﺎﻟﺖ ﺗﺼﺤﻴﺢ ﻓﺎز ﻧﺼﻒ ﺣﺎﻟﺖ ‪ Fast PWM‬ﺑﻮده و از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:‬

                                                           ‫‪f Clk _ I / O‬‬
                                             ‫= ‪f PWM‬‬
                                                       ‫) ‪2.N.(1 + TOP‬‬




                                                                ‫- ٧٩ -‬
‫89 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                    ‫ ‪       www.pnkavosh.com‬‬
‫ﻣﺜﺎل 01: در ﺑﺮﻧﺎﻣﻪ ي ﻣﺜﺎل ﻗﺒﻞ ‪ Mode‬ﺗﺎﻳﻤﺮ را از ‪ Fast PWM‬ﺑﻪ ‪ Phase Correct PWM‬ﺗﻐﻴﻴﺮ داده و ﻧﺼﻒ‬

                                                               ‫ﺷﺪن ﻓﺮﻛﺎﻧﺲ ‪ PWM‬ﺧﺮوﺟﻲ را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ:‬

‫;38‪TCCR1A=0x‬‬
‫;20‪TCCR1B=0x‬‬
‫;‪OCR1AL=0xFF‬‬




                                                      ‫‪Phase and Frequency Correct Mode‬‬



‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﻪ دﻟﻴﻞ ﺑﺮوز ﻛﺮدن رﺟﻴﺴﺘﺮ ‪ OCR1x‬ﺑﺎ رﺳﻴﺪن ﺑﻪ ‪ TOP‬ﻣﻤﻜﻦ اﺳﺖ ﺷﻜﻞ ﻣـﻮج ﺧﺮوﺟـﻲ‬

‫ﻧﺎﻣﺘﻘﺎرن ﺷﻮد ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي ﺣﻞ اﻳﻦ ﻣﺸﻜﻞ ‪ Mode‬ﭘﻨﺠﻢ ﺗﺎﻳﻤﺮ ﻳﻚ اﻳﻦ رﺟﻴﺴﺘﺮ را ﺑﺎ رﺳﻴﺪن ﺑﻪ ﺻﻔﺮ ﺑﺮوز ﻣﻲ ﻛﻨﺪ.‬

‫ﺗﻔﺎوت دﻳﮕﺮ اﻳﻦ ‪ Mode‬و ﻋﻤﻠﻜﺮد ﻗﺒﻠﻲ در اﻳﻦ اﺳﺖ ﻛـﻪ ﺗـﺎﻳﻤﺮ ﺗﻨﻬـﺎ در دو ﺣﺎﻟـﺖ زﻳـﺮ ﻛـﺎر ﻣـﻲ ﻛﻨـﺪ: )8، 9 =‬

                                                                                      ‫]0:3[1‪(WGM‬‬




                                                  ‫‪ PWM‬ﺗﺼﺤﻴﺢ ﻓﺎز و ﻓﺮﻛﺎﻧﺲ ﺑﺎ ‪ICR1 = TOP‬‬            ‫1.‬

                                              ‫‪ PWM‬ﺗﺼﺤﻴﺢ ﻓﺎز و ﻓﺮﻛﺎﻧﺲ ﺑﺎ ‪OCR1A = TOP‬‬               ‫2.‬




                                                      ‫- ٨٩ -‬
‫99 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬



                                      ‫واﺣﺪ ‪ Capture‬ﺗﺎﻳﻤﺮ ﻳﻚ‬




‫ﻋﻤﻠﻜﺮد اﻳﻦ واﺣﺪ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ در اﺛﺮ ﺗﺮﻳﮕﺮ ﺷﺪن ورودي ‪ Capture‬از ﭘﻴﻦ 1‪ ICP‬ﻳﺎ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ‬

‫ﮔﺮ آﻧﺎﻟﻮگ ﻣﻘﺪار ﻣﻮﺟﻮد در رﺟﻴﺴﺘﺮ 1‪ TCNT‬در رﺟﻴﺴﺘﺮ 1‪ ICR‬ﻧﻮﺷﺘﻪ ﺷﺪه و ﻫﻤﺰﻣﺎن ﭘﺮﭼﻢ ‪ Capture‬ﺗـﺎﻳﻤﺮ‬

‫ﻳﻚ )1‪ (ICF‬ﻳﻚ ﻣﻲ ﺷﻮد. در اﻳﻦ زﻣﺎن در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴـﺖ ﭘـﺮﭼﻢ ورودي ‪ (TICIE1) Capture‬اﻳـﻦ‬

‫ﺗﺮﻳﮕﺮ ﺷﺪن ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد. ﺑﺎ اﺟﺮا ﺷﺪن ‪ ISR‬ﺑﻪ ﻃﻮر ﺧﻮدﻛﺎر ﺑﻴـﺖ 1‪ ICF‬ﺻـﻔﺮ ﺷـﺪه و ﻳـﺎ در‬

                                       ‫ﺻﻮرت ﻓﻌﺎل ﻧﺒﻮدن وﻗﻔﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي آن ﭘﺎك ﺷﻮد.‬



                ‫‪Bit‬‬      ‫7‬        ‫6‬         ‫5‬         ‫4‬          ‫3‬       ‫2‬      ‫1‬     ‫0‬
               ‫‪ICR1H‬‬                             ‫]8:51[1‪ICR‬‬
               ‫‪ICR1L‬‬                              ‫]0:7[1‪ICR‬‬



   ‫• رﺟﻴﺴﺘﺮ 1‪ ICR‬ﺑﻪ ﺟﺰ در ﺣﺎﻟﺘﻲ ﻛﻪ ﺑﻪ ﻋﻨﻮان ‪ TOP‬ﺟﻬﺖ ﻣﻘﺎﻳﺴﻪ ﺑﻪ ﻛﺎر ﻣﻲ رود )‪ Mode‬ﻫﺎي 8، 01،‬

                                                          ‫21 و 41( ﻳﻚ رﺟﻴﺴﺘﺮ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ.‬




‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺗﺮﻳﮕﺮ ﺷﺪن واﺣﺪ ‪ Capture‬ﻣﻲ ﺗﻮاﻧﺪ از دو ﻣﻨﺒﻊ ﻣﺨﺘﻠﻒ ﺻﻮرت ﮔﻴﺮد ﻛﻪ اﻳﻦ از ﻃﺮﻳﻖ ﺑﻴﺖ‬

‫‪ ACIC‬در رﺟﻴﺴﺘﺮ ‪ ACSR‬ﺻﻮرت ﻣﻲ ﮔﻴﺮد. ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﭘﻴﻦ 1‪ ICP‬و ﻳﻚ ﺑـﻮدن آن ﺧﺮوﺟـﻲ ﻣﻘﺎﻳﺴـﻪ‬

‫ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ را اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﺪ. ﻫﻤﭽﻨﻴﻦ ﻧﻮع ﺳﻴﮕﻨﺎل ورودي از ﭘﻴﻦ 1‪ ICP‬ﺑﻮﺳﻴﻠﻪ ﺑﻴـﺖ 1‪ ICES‬از رﺟﻴﺴـﺘﺮ‬

‫‪ TCCR1B‬ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد، ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻪ ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه و ﻳـﻚ ﺑـﻮدن آن ﻟﺒـﻪ ي ﺑـﺎﻻ‬

                                                                ‫روﻧﺪه ي ﺳﻴﮕﻨﺎل ورودي را اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﺪ.‬


                                                      ‫- ٩٩ -‬
P a g e | 100
        www.avr.ir                                                          www.pnkavosh.com 



       TCCR1B            7         6      5       4              3       2        1         0
         ‫ﻧﺎم ﺑﻴﺖ‬    ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10



‫ داراي ﻳﻚ واﺣﺪ ﻛﺎﻫﺶ ﻧﻮﻳﺰ ﻧﻴﺰ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﻓﻴﻠﺘﺮ دﻳﺠﻴﺘـﺎل اﻳﻤﻨـﻲ ورودي را‬Capture ‫ورودي‬

‫ ﻓﻌﺎل ﻣﻲ ﺷﻮد. ﺑﺎ ﻓﻌـﺎل ﺷـﺪن اﻳـﻦ‬TCCR1B ‫ از رﺟﻴﺴﺘﺮ‬ICNC1 ‫ﺑﻬﺒﻮد ﻣﻲ ﺑﺨﺸﺪ. اﻳﻦ واﺣﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ‬

                    .‫ ﺑﺮاي ﭼﻬﺎر ﺳﻴﻜﻞ ﻛﻼك ﻣﻌﺘﺒﺮ ﺑﺎﺷﺪ‬ICP1 ‫ﻓﻴﻠﺘﺮ ﺑﺎﻳﺪ ﺳﻴﮕﻨﺎل ﻧﻤﻮﻧﻪ ﺑﺮداري ﺷﺪه روي ﭘﺎﻳﻪ ي‬




                                                                             ‫ ﻣﻮﺗﻮر‬‫ﭘﺮوژه 01: ﻛﻨﺘﺮل ﺳﺮو‬



/*****************************************************
Project : Servo Motor Controller
Author          : Reza Sepas Yar
Company : Pishro Noavaran Kavosh
Chip type                          : ATmega16
Clock frequency                    : 16.000000 MHz
*****************************************************/


#include <mega16.h>
#include <delay.h>
#define xtal 16000000


void main(void)
{


PORTD=0x00;

                                                       - ١٠٠ -
P a g e | 101
        www.avr.ir                                          www.pnkavosh.com 
DDRD=0x20;


// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000.000 kHz
// Mode: Ph. & fr. cor. PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x80;
TCCR1B=0x12;
ICR1H=0x4E;
ICR1L=0x20;              //ICR=20000
OCR1AH=0x03;
OCR1AL=0xE8; //1000


while (1)
        {


        for(OCR1A=1000;OCR1A<2000;OCR1A++)
                delay_ms(1);


        for(OCR1A=2000;OCR1A>1000;OCR1A--)
                delay_ms(1);


        };
}




                                           - ١٠١ -
P a g e | 102
        www.avr.ir                                           www.pnkavosh.com 




                                                           ‫ﭘﺮوژه 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.avr.ir                                           www.pnkavosh.com 
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.avr.ir                               www.pnkavosh.com 
TIMSK=0x10;


//enable global interrups
#asm("sei");


        while (1);
}




                                - ١٠٤ -
‫501 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬



                                   ‫ﭘﻮرت ﺳﺮﻳﺎل )232-‪(RS‬‬



‫‪ RS-232c‬در اواﺧﺮ دﻫﻪ 06 ﻣﻴﻼدي ﺑﻪ ﺻﻮرت اﺳﺘﺎﻧﺪارد ﺗﻌﺮﻳﻒ ﺷﺪ و ﻫﻤﭽﻨﺎن ﻳﻜﻲ از اﺳـﺘﺎﻧﺪاردﻫﺎي ﭘﺮﻛـﺎرﺑﺮد‬

‫در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ و ﻛﺎرﺑﺮدﻫﺎي ﺻﻨﻌﺘﻲ اﺳﺖ. اﻳﻦ اﺳﺘﺎﻧﺪارد ﻫﻢ ارﺗﺒﺎط ﺳﺮﻳﺎل ﺳـﻨﻜﺮون و ﻫـﻢ آﺳـﻨﻜﺮون را‬

‫ﭘﺸﺘﻴﺒﺎﻧﻲ ﻛﺮده و ﺑﻪ ﺻﻮرت ‪ Full Duplex‬ﻋﻤﻞ ﻣﻲ ﻧﻤﺎﻳﺪ. ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ ﺗﻨﻬﺎ ارﺗﺒﺎط آﺳﻨﻜﺮون را ﭘﺸﺘﻴﺒﺎﻧﻲ‬

‫ﻣﻲ ﻛﻨﻨﺪ و از ﻃﺮﻳﻖ ﭼﻴﭗ ‪ UART‬ﻣﻮﺟﻮد در ﺑﺮد اﺻﻠﻲ، اﻃﻼﻋﺎت را از ﺣﺎﻟﺖ ﻣﻮازي ﺑﻪ ﺳـﺮﻳﺎل ﻳـﺎ از ﺳـﺮﻳﺎل ﺑـﻪ‬

                   ‫ﻣﻮازي ﺗﺒﺪﻳﻞ ﻛﺮده و ﺑﺎ ﺗﻨﻈﻴﻤﺎت زﻣﺎﻧﻲ آن را از ﻃﺮﻳﻖ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻳﺎ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ.‬




‫ﭘﻮرت ﺳﺮﻳﺎل داراي ﻳﻚ ﻛﺎﻧﻜﺘﻮر 9 ﭘﻴﻦ ﻣﻲ ﺑﺎﺷﺪ و از آﻧﺠﺎﻳﻲ ﻛﻪ اﻳﻦ اﺳﺘﺎﻧﺪارد در اﺑﺘﺪا ﺑﺮاي ارﺗﺒﺎط ﺑﺎ ﻣﻮدم ﻃﺮاﺣـﻲ‬

‫ﺷﺪه ﺑﻮد، داراي ﭘﻴﻦ ﻫﺎي ‪ Handshaking‬و وﺿﻌﻴﺖ ﻣﻲ ﺑﺎﺷﺪ. اﻣﺎ ﻧـﻮع ﺧﺎﺻـﻲ از ارﺗﺒـﺎط ﺑـﺎ 232-‪ RS‬ﺑـﻪ ﻧـﺎم‬

‫‪ Null-Modem‬ﻛﻪ ﺗﻨﻬﺎ ﺷﺎﻣﻞ ﭘﻴﻦ ﻫﺎي ارﺳﺎل و درﻳﺎﻓﺖ اﺳﺖ ﺑﺮاي ارﺗﺒﺎط ﺑـﺎ ﻏﻴـﺮ از ﻣـﻮدم اﺳـﺘﻔﺎده ﻣـﻲ ﺷـﻮد.‬

‫ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻨﻬﺎ دو ﭘﻴﻦ ‪ Rx‬و ‪) Tx‬و اﻟﺒﺘﻪ زﻣﻴﻦ( ﻣﻮرد ﻧﻴﺎز اﺳﺖ. در ﺷﻜﻞ زﻳﺮ ﻛﺎﻧﻜﺘﻮر ﭘﻮرت ﺳـﺮﻳﺎل را ﻛـﻪ 9‪ D‬ﻧـﺎم‬

                                                                                     ‫دارد ﻣﻼﺣﻈﻪ ﻣﻲ ﻛﻨﻴﺪ:‬




                                                        ‫- ٥٠١ -‬
‫601 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                 ‫ ‬                          ‫ ‪       www.pnkavosh.com‬‬
                                                                     ‫در ﺟﺪول زﻳﺮ ﻋﻤﻠﻜﺮد ﻫﺮ ﭘﻴﻦ آورده ﺷﺪه اﺳﺖ:‬




                             ‫‪Pin‬‬                                      ‫ﻋﻤﻠﻜﺮد‬


                 ‫1‬        ‫‪Carrier Detect‬‬                              ‫آﻳﺎ ﻣﻮدم ﺑﻪ ﻳﻚ ﺧﻂ ﺗﻠﻔﻦ ﻣﺘﺼﻞ اﺳﺖ ؟‬


                 ‫2‬        ‫‪Receive Data‬‬          ‫ﻛﺎﻣﭙﻴﻮﺗﺮ اﻃﻼﻋﺎت ارﺳﺎل ﺷﺪه ﺗﻮﺳﻂ ﻣﻮدم را درﻳﺎﻓﺖ ﻣﻲ ﻧﻤﺎﻳﺪ.‬


                 ‫3‬        ‫‪Transmit Data‬‬                        ‫ﻛﺎﻣﭙﻴﻮﺗﺮ اﻃﻼﻋﺎﺗﻲ را ﺑﺮاي ﻣﻮدم ارﺳﺎل ﻣﻲ دارد.‬


                 ‫4‬   ‫‪Data Terminal Ready‬‬            ‫ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻪ ﻣﻮدم آﻣﺎدﮔﻲ ﺧﻮد را ﺑﺮاي ارﺗﺒﺎط اﻋﻼم ﻣﻲ دارد.‬


                 ‫5‬        ‫‪Signal Ground‬‬                                                        ‫زﻣﻴﻦ ﺳﻴﮕﻨﺎل‬


                 ‫6‬       ‫‪Data Set Ready‬‬            ‫ﻣﻮدم آﻣﺎدﮔﻲ ﺧﻮد را ﺑﺮاي ارﺗﺒﺎط ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ اﻋﻼم ﻣﻲ دارد.‬


                 ‫7‬       ‫‪Request To Send‬‬           ‫ﻛﺎﻣﭙﻴﻮﺗﺮ از ﻣﻮدم در راﺑﻄﻪ ﺑﺎ ارﺳﺎل اﻃﻼﻋﺎت ﺳﻮال ﻣﻲ ﻧﻤﺎﻳﺪ.‬


                 ‫8‬        ‫‪Clear To Send‬‬    ‫ﻣﻮدم ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ اﻋﻼم ﻣﻲ ﻧﻤﺎﻳﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ اﻃﻼﻋﺎﺗﻲ را ارﺳﺎل دارد.‬


                 ‫9‬        ‫‪Ring Indicator‬‬                                 ‫زﻧﮓ ﺗﻠﻔﻦ ﺗﺸﺨﻴﺺ داده ﺧﻮاﻫﺪ ﺷﺪ.‬




                                                                                                               ‫ﺳﻄﺢ ﺳﻴﮕﻨﺎل:‬

‫در اﺳﺘﺎﻧﺪارد 232-‪ RS‬ﺳﻄﺢ وﻟﺘﺎژ 3+ ﺗﺎ 21+ ﻧﻤﺎﻳﺎﻧﮕﺮ وﺿﻌﻴﺖ ‪ Space‬ﻳﺎ ﺻﻔﺮ ﻣﻨﻄﻘﻲ و ﺑﺎزه ي 3- ﺗﺎ 21- وﻟﺖ‬

                                                                 ‫ﻧﻤﺎﻳﺸﮕﺮ وﺿﻌﻴﺖ ‪ Mark‬ﻳﺎ ﻳﻚ ﻣﻨﻄﻘﻲ ﻣﻲ ﺑﺎﺷﺪ:‬




                                                           ‫- ٦٠١ -‬
‫701 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




‫اﮔﺮﭼﻪ ﺗﺠﻬﻴﺰات اﺳﺘﺎﻧﺪارد ‪ TTL‬ﺑﺎ ﺳﻄﻮح ﻣﻨﻄﻘﻲ 0 و 5 وﻟﺖ ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ اﻣـﺎ ﻗﺎﻟـﺐ اﻃﻼﻋـﺎت ارﺳـﺎﻟﻲ ﺗﻔـﺎوﺗﻲ‬

‫ﻧﺪارد و ﺑﺎ ﻳﻚ ﻣﺪار ﺗﻐﻴﻴﺮ ﺳﻄﺢ وﻟﺘﺎژ، ‪ PC‬ﻣﻲ ﺗﻮاﻧﺪ ﺑـﺎ ادوات ‪ TTL‬ارﺗﺒـﺎط ﺑﺮﻗـﺮار ﻧﻤﺎﻳـﺪ. ﻳﻜـﻲ از ﻣﺒـﺪل ﻫـﺎي‬

‫ﻣﺘﺪاول ﺳﻄﺢ 232-‪ RS‬ﺑﻪ ‪ TTL‬ﻣﺪار ﻣﺠﺘﻤﻊ 232‪ MAX‬و ﻳﺎ 232‪ HIN‬ﻣﻲ ﺑﺎﺷﺪ. 232‪ MAX‬ﻳﻚ ﺗﺮاﺷـﻪ ي‬

‫61 ﭘﺎﻳﻪ اﺳﺖ ﻛﻪ ﺷﺎﻣﻞ 2 ﻓﺮﺳﺘﻨﺪه و 2 ﻣﺒﺪل ﻣﺠﺰا اﺳﺖ. در زﻳﺮ ﻳﻚ ﻣﺪار ﻧﻤﻮﻧﻪ را ﺑﺮاي ﻛﺎر ﺑﺎ اﻳﻦ ‪ IC‬ﻣﺸﺎﻫﺪه ﻣـﻲ‬

                                                                                                   ‫ﻛﻨﻴﺪ:‬




                                                        ‫- ٧٠١ -‬
‫801 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬




                                                                                       ‫ﻗﺎﻟﺐ اﻃﻼﻋﺎت:‬


‫در ﻳﻚ ‪ Frame‬اﻃﻼﻋﺎﺗﻲ ﻛﻪ ﺗﻮﺳﻂ ﺑﻴﺖ ﺷﺮوع و ﺑﻴﺖ ﭘﺎﻳﺎن ﻣﺤﺼﻮر ﺷﺪه اﺳﺖ ﻣﻌﻤﻮﻻ 5 ﺗﺎ 8 ﺑﻴﺖ دﻳﺘـﺎ ﻗـﺮار ﻣـﻲ‬

‫ﮔﻴﺮد و ﻳﻚ ﺑﻴﺖ ﺗﻮازن ﻧﻴﺰ ﺑﻪ ﺻﻮرت اﺧﺘﻴﺎري ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد. ﺑﻴﺖ ﺷﺮوع ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﺻﻔﺮ ﻣﻨﻄﻘﻲ اﺳﺖ و ﺑﻴﺖ ﭘﺎﻳﺎن‬

‫)ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ 1 ﻳﺎ 2 ﺑﻴﺖ ﺑﺎﺷﺪ.( ﺗﻮﺳﻂ ﻳﻚ ﺷﻨﺎﺳﺎﻳﻲ ﻣﻲ ﺷﻮد. ﻣﺜﻼ در ﻧﻤﻮدار زﻣﺎﻧﻲ زﻳﺮ ﻳﻚ ‪ Frame‬ﺷﺎﻣﻞ 01‬

‫ﺑﻴﺖ اﺳﺖ ﻛﻪ ﻫﻔﺖ ﺑﻴﺖ آن ﺷﺎﻣﻞ ‪ Data‬ﻳﻚ ﺑﻴﺖ آﻏﺎزﻳﻦ و ﻳﻚ ﺑﻴﺖ ﭘﺎﻳﺎﻧﻲ و ﻳﻚ ﺑﻴﺖ ﺗﻮازن ﻗﺒﻞ از ﺑﻴﺖ ﭘﺎﻳﺎن ﻣﻲ‬

                                                                                                 ‫ﺑﺎﺷﺪ:‬




                                ‫ﻋﻤﻠﻜﺮد ‪ USART‬ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ‪AVR‬‬




‫ﻗﻄﻌﻪ ي 61‪ ATmega‬داراي ﻳﻚ ﻣﺎژول ‪ USART‬ﺑﻮده ﻛـﻪ از اﺳـﺘﺎﻧﺪارد 232-‪ RS‬در دو ﺣﺎﻟـﺖ آﺳـﻨﻜﺮون و‬

‫ﺳﻨﻜﺮون ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﺪ. دﺳﺘﺮﺳﻲ ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ‪ AVR‬از ﻃﺮﻳـﻖ ﺳـﻪ ﭘـﻴﻦ ‪ RXD ،TXD‬و ‪ XCK‬ﻛـﻪ ﺑـﻪ‬

‫ﺗﺮﺗﻴﺐ ﭘﻴﻦ ارﺳﺎل، درﻳﺎﻓﺖ وﻛﻼك ﻣﻲ ﺑﺎﺷﻨﺪ اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ. )ﭘﻴﻦ ‪ XCK‬ﻓﻘﻂ در ‪ Mode‬ﺳﻨﻜﺮون ﻛﺎرﺑﺮد دارد.(‬


‫ﻗﺎﻟﺐ اﻃﻼﻋﺎت در ‪ USART‬ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ‪ AVR‬ﻫﻤﺎﻧﻨﺪ ‪ UART‬ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ ﺷﺎﻣﻞ ﻳﻚ ﺑﻴـﺖ ﺷـﺮوع،‬

‫ﺑﻴﺖ ﻫﺎي داده، ﺑﻴﺖ اﺧﺘﻴﺎري ﺗﻮازن و ﻳﻚ ﻳﺎ دو ﺑﻴﺖ ﭘﺎﻳﺎن اﺳﺖ، ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ در ‪ AVR‬ﻣﻲ ﺗﻮاﻧﺪ 5 ﺗـﺎ 9 ﺑﻴـﺖ‬




                                                      ‫- ٨٠١ -‬
‫901 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬
‫‪ Data‬ﺗﻌﺮﻳﻒ ﺷﻮد. ﺑﻴﺖ ﺗـﻮازن ﻣـﻲ ﺗﻮاﻧـﺪ ﻓـﺮد ﻳـﺎ زوج ﺑﺎﺷـﺪ و از ﻃﺮﻳـﻖ ﺑﻴـﺖ ﻫـﺎي ]0:1[‪ UPM‬از رﺟﻴﺴـﺘﺮ‬

                                                                                        ‫‪ UCSRC‬ﺗﻨﻈﻴﻢ ﻣﻲ ﺷﻮد.‬


                                                                                            ‫رﺟﻴﺴﺘﺮﻫﺎي ‪USART‬‬


                                                             ‫‪(UDR) USART Data Register‬‬                   ‫1.‬




                     ‫‪Bit‬‬        ‫7‬        ‫6‬       ‫5‬           ‫4‬         ‫3‬       ‫2‬        ‫1‬         ‫0‬
                ‫)‪UDR (Read‬‬                                ‫]0:7[‪RXB‬‬
                ‫)‪UDR (Write‬‬                               ‫]0:7[‪TXB‬‬


‫ﺑﺎﻓﺮ درﻳﺎﻓﺖ و ارﺳﺎل ﭘﻮرت ﺳﺮﻳﺎل داراي ﻳﻚ آدرس ﻣﺸﺘﺮك ﺑﻪ ﻧﺎم ‪ UDR‬در ﻓﻀﺎي ‪ I/O Registers‬ﻣﻲ ﺑﺎﺷﻨﺪ.‬

‫ﺑﺎﻓﺮ ارﺳﺎل، ﻣﻘﺼﺪ داده ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در رﺟﻴﺴﺘﺮ‪ UDR‬ﺑﻮده و ﺧﻮاﻧﺪن اﻳﻦ رﺟﻴﺴﺘﺮ ﻣﺤﺘﻮﻳـﺎت ﺑـﺎﻓﺮ درﻳﺎﻓـﺖ را‬

‫ﺑﻪ دﺳﺖ ﻣﻲ دﻫﺪ. ﺗﻨﻬﺎ زﻣﺎﻧﻲ ﻣـﻲ ﺗـﻮان روي رﺟﻴﺴـﺘﺮ ‪ UDR‬ﻣﻘـﺪاري را ﻧﻮﺷـﺖ ﻛـﻪ ﺑﻴـﺖ ‪ UDRE‬از رﺟﻴﺴـﺘﺮ‬

‫‪ UCSRA‬ﻳﻚ ﺷﺪه ﺑﺎﺷﺪ و در ﻏﻴﺮ اﻳﻨﺼﻮرت دﻳﺘﺎي ارﺳﺎﻟﻲ ﺗﻮﺳﻂ ‪ USART‬ﻧﺎدﻳﺪه ﮔﺮﻓﺘﻪ ﻣـﻲ ﺷـﻮد. ﺑـﺎ ارﺳـﺎل‬

‫اﻃﻼﻋﺎت ﺑﻪ ﺑﺎﻓﺮ ارﺳﺎل ‪ USART‬در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴـﺖ ‪ TXEN‬از رﺟﻴﺴـﺘﺮ ‪ UCSRB‬ﻳـﻚ ﺑﺎﺷـﺪ اﻃﻼﻋـﺎت در‬

                                    ‫ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ﺑﺎرﮔﺬاري ﺷﺪه و ﺑﻴﺖ ﺑﻪ ﺑﻴﺖ از ﭘﻴﻦ ‪ TXD‬ارﺳﺎل ﻣﻲ ﺷﻮد.‬




                                             ‫‪USART Control and Status Register A‬‬                         ‫٢.‬




                ‫‪UCSR‬‬
                           ‫7‬        ‫6‬        ‫5‬           ‫4‬         ‫3‬       ‫2‬       ‫1‬          ‫0‬
                   ‫‪A‬‬
                 ‫ﻧﺎم ﺑﻴﺖ‬   ‫‪RX‬‬   ‫‪TXC‬‬       ‫‪UDR‬‬            ‫‪FE DOR PE‬‬                 ‫2‪U‬‬       ‫‪MPC‬‬

                                                         ‫- ٩٠١ -‬
‫011 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                    ‫ ‪       www.pnkavosh.com‬‬
                          ‫‪C‬‬                ‫‪E‬‬                                ‫‪X‬‬        ‫‪M‬‬


    ‫‪ :Multi-processor Communication Mode‬ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ را ﺑﻪ ﺣﺎﻟﺖ ارﺗﺒﺎﻃﺎت‬

                                                                                 ‫ﭼﻨﺪ ﭘﺮدازﻧﺪه اي ﻣﻲ ﺑﺮد.‬


‫‪ :Double the USART Transmission Speed‬ﺑﺎ ﻳﻚ ﻛـﺮدن اﻳـﻦ ﺑﻴـﺖ در ‪ Mode‬آﺳـﻨﻜﺮون ‪Baud‬‬

                                     ‫‪ Rate‬دو ﺑﺮاﺑﺮ ﺧﻮاﻫﺪ ﺷﺪ. در ‪ Mode‬ﺳﻨﻜﺮون اﻳﻦ ﺑﻴﺖ ﺑﺎﻳﺪ ﺻﻔﺮ ﺑﺎﺷﺪ.‬


‫‪ :Parity Error‬در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺗﻮﻟﻴﺪ ﺑﻴﺖ ﺗﻮازن از ﻃﺮﻳﻖ ﺑﻴﺖ ﻫﺎي ]0:1[‪ ،UPM‬ﺑﺎ روي دادن ﺧﻄـﺎي‬

                                                                ‫ﺗﻮازن در ﺑﺎﻓﺮ درﻳﺎﻓﺖ، اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻣﻲ ﺷﻮد.‬


‫‪ :Data Overrun‬ﺑﺎ ﺑﺮوز ‪ Overrun‬اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻣﻲ ﺷﻮد. ﺷﺮاﻳﻂ ‪ Overrun‬ﻳﺎ ﻟﺒﺮﻳﺰ وﻗﺘـﻲ روي ﻣـﻲ دﻫـﺪ‬

‫ﻛﻪ ﺑﺎﻓﺮ درﻳﺎﻓﺖ ﭘﺮ ﺑﺎﺷﺪ و ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ﻧﻴﺰ ﻣﺤﺘﻮي داده ي ﺟﺪﻳـﺪي ﺑﺎﺷـﺪ و داده ي ﺟﺪﻳـﺪي ﻧﻴـﺰ از راه ﺑﺮﺳـﺪ،‬

‫ﻳﻌﻨﻲ ﻳﻚ ﺑﺎﻳﺖ در ﺑﺎﻓﺮ ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ﻣﻨﺘﻈﺮ ﺑﺎﺷﺪ و ﺑﻴﺖ ﺷﺮوع ﺟﺪﻳﺪي درﻳﺎﻓﺖ ﺷـﻮد. در اﻳـﻦ ﺣﺎﻟـﺖ اﻃﻼﻋـﺎت‬

                                    ‫ﺟﺪﻳﺪ از ﺑﻴﻦ ﻣﻲ رود و ﺑﺎ ﻳﻚ ﺷﺪن ﺑﻴﺖ ‪ DOR‬ﺑﺮوز ﺧﻄﺎ اﻋﻼم ﻣﻲ ﺷﻮد.‬


‫‪ :Frame Error‬اﮔﺮ در ‪ Frame‬درﻳﺎﻓﺖ ﺷﺪه ﺑﻴﺖ ﭘﺎﻳﺎن ﺻﻔﺮ ﺑﺎﺷﺪ اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺷﺪه و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﺻﻔﺮ‬

                                                                                             ‫ﺧﻮاﻫﺪ ﺑﻮد.‬


‫‪ :USART Data Register Empty‬ﻳﻚ ﺑﻮدن اﻳﻦ ﭘﺮﭼﻢ ﻧﺸﺎن دﻫﻨﺪه ي اﻳﻦ اﺳﺖ ﻛﻪ اﻃﻼﻋـﺎت ﻣﻮﺟـﻮد در‬

‫ﺑﺎﻓﺮ ارﺳﺎل ﺑﺮاي ﺷﻴﻔﺖ رﺟﻴﺴﺘﺮ ارﺳﺎل ﺷﺪه و ﺑﺎﻓﺮ ارﺳﺎل آﻣﺎده ي درﻳﺎﻓﺖ ﻛﺎراﻛﺘﺮ ﺟﺪﻳﺪ اﺳﺖ. ﻫﻤﭽﻨﻴﻦ در ﺻﻮرﺗﻲ‬

‫ﻛﻪ ﺑﻴﺖ ‪ UDRIE‬از رﺟﻴﺴﺘﺮ ‪ UCSRB‬ﻳﻚ ﺑﺎﺷﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﺪه و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺑﻴﺖ ‪ UDRE‬ﻳـﻚ اﺳـﺖ‬

‫ﺑﺎ ﺧﺎرج ﺷﺪن از ‪ ISR‬دوﺑﺎره آن را اﺟﺮا ﻣﻲ ﻛﻨﺪ ﺑﺎ ﻧﻮﺷﺘﻦ داده ي ﺟﺪﻳﺪ در ‪ UDR‬ﭘـﺮﭼﻢ ‪ UDRE‬ﺻـﻔﺮ ﻣـﻲ‬

        ‫ﺷﻮد. ﺑﻌﺪ از رﻳﺴﺖ ﺷﺪن ﻣﻴﻜﺮو اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻪ ﻣﻌﻨﺎي آﻣﺎده ﺑﻮدن درﻳﺎﻓﺖ ﻛﺎراﻛﺘﺮ ﺟﺪﻳﺪ اﺳﺖ.‬


                                                      ‫- ٠١١ -‬
‫111 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
        ‫‪ :USART Transmit Complete‬اﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻳﻚ ﻣﻲ ﺷﻮد ﻛﻪ ﺗﻤﺎم اﻃﻼﻋﺎت ﻣﻮﺟﻮد در ﺷﻴﻔﺖ‬

          ‫رﺟﻴﺴﺘﺮ ﺑﻪ ﺑﻴﺮون ﺷﻴﻔﺖ داده ﺷﺪه و داده ي ﺟﺪﻳﺪي در ﺑﺎﻓﺮ ارﺳﺎل وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ. ﺑﺎ ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ‬

   ‫‪ TXCIE‬اﻳﻦ ﭘﺮﭼﻢ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ي ﻛﺎﻣﻞ ﺷﺪن ارﺳﺎل ﺷﻮد و ﺑﺎ اﺟﺮاي ‪ ISR‬ﺑﻴﺖ ‪ TXC‬ﺗﻮﺳﻂ‬

       ‫ﺳﺨﺖ اﻓﺰار ﭘﺎك ﺷﺪه و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي آن، آن را ﭘﺎك ﻛﻨﺪ.‬


 ‫‪ :USART Receive Complete‬اﻳﻦ ﺑﻴﺖ ﺑﺎ ﻛﺎﻣﻞ ﺷﺪن درﻳﺎﻓﺖ ﻳﻚ ‪ Frame‬در ‪ UDR‬ﻳﻚ ﺷﺪه و ﭘﺲ از‬

                                                                           ‫ﺧﻮاﻧﺪن ‪ UDR‬ﺻﻔﺮ ﻣﻲ ﺷﻮد.‬


                                              ‫‪USART Control and Status Register B‬‬                    ‫٣.‬




    ‫‪UCSRB‬‬           ‫7‬          ‫6‬          ‫5‬            ‫4‬         ‫3‬        ‫2‬          ‫1‬        ‫0‬
     ‫ﻧﺎم ﺑﻴﺖ‬    ‫8‪RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB‬‬


‫8 ‪ :Transmit Data Bit‬در ﺣﺎﻟﺘﻲ ﻛﻪ از ﭘﻮرت ﺳﺮﻳﺎل در ‪ 9 Mode‬ﺑﻴﺘﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷـﻮد اﻳـﻦ ﺑﻴـﺖ ﻧﻬﻤـﻴﻦ‬

‫ﺑﻴﺖ ﻛﺎراﻛﺘﺮ ارﺳﺎﻟﻲ ﺧﻮاﻫﺪ ﺑﻮد. ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻗﺒﻞ از ﻧﻮﺷﺘﻦ در ‪ UDR‬ﺑﺎﻳﺪ وﺿﻌﻴﺖ اﻳـﻦ ﺑﻴـﺖ را ﻣﺸـﺨﺺ‬

                                                                                                   ‫ﻛﺮد.‬


‫8 ‪ :Receive Data Bit‬در ﺣﺎﻟﺘﻲ ﻛﻪ از ﭘﻮرت ﺳﺮﻳﺎل در ‪ 9 Mode‬ﺑﻴﺘﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد اﻳﻦ ﺑﻴﺖ ﻧﻬﻤﻴﻦ ﺑﻴـﺖ‬

                  ‫ﻛﺎراﻛﺘﺮ درﻳﺎﻓﺘﻲ ﺧﻮاﻫﺪ ﺑﻮد. ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ ﻗﺒﻞ از ﺧﻮاﻧﺪن ‪ UDR‬ﺑﺎﻳﺪ اﻳﻦ ﺑﻴﺖ را ﺧﻮاﻧﺪ.‬




‫‪ :Character Size‬ﺑﺎ ﺗﺮﻛﻴﺐ اﻳﻦ ﺑﻴﺖ و ﺑﻴﺖ ﻫﺎي ]0:1[‪ UCSZ‬در رﺟﻴﺴﺘﺮ ‪ UCSRC‬ﺗﻌﺪاد ﺑﻴـﺖ ﻫـﺎي داده‬

                                                       ‫)اﻧﺪازه ي ﻛﺎراﻛﺘﺮ( را در ﻳﻚ ‪ Frame‬ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.‬


                                                       ‫- ١١١ -‬
‫211 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
‫‪ :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‬‬                  ‫٤.‬




  ‫‪UCSRC‬‬           ‫7‬          ‫6‬          ‫5‬         ‫4‬             ‫3‬     ‫2‬          ‫1‬          ‫0‬
   ‫ﻧﺎم ﺑﻴﺖ‬      ‫‪URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL‬‬




                                                      ‫- ٢١١ -‬
‫311 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬
‫رﺟﻴﺴﺘﺮﻫﺎي ‪ UCSRC‬و ‪ UBRRH‬داراي آدرس ﻣﺸﺘﺮﻛﻲ در ﻓﻀﺎي ‪ I/O‬ﻫﺴﺘﻨﺪ، ﻛﻪ ﺑﺮاي اﻧﺘﺨﺎب اﻳﻦ دو از‬

                                                                     ‫ﺑﻴﺖ ‪ URSEL‬اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.‬




‫‪ :Clock Polarity‬اﻳﻦ ﺑﻴﺖ ﻓﻘﻂ در ‪ Mode‬ﺳﻨﻜﺮون ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲ ﺷﻮد و در ‪ Mode‬آﺳﻨﻜﺮون ﺑﺎﻳﺪ روي آن‬

                                            ‫ﺻﻔﺮ ﻧﻮﺷﺘﻪ ﺷﻮد. ﻋﻤﻠﻜﺮد اﻳﻦ ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﺳﺖ:‬




 ‫ﻧﻤﻮﻧﻪ ﺑﺮداري از داده ي درﻳﺎﻓﺘﻲ روي ﭘﻴﻦ ‪ RxD‬ﺗﻐﻴﻴﺮ داده ي ارﺳﺎﻟﻲ روي ﭘﻴﻦ ‪UCPOL TxD‬‬

      ‫٠‬         ‫ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ ‪XCK‬‬                ‫ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ ‪XCK‬‬

      ‫١‬         ‫ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ي ﭘﺎﻟﺲ ‪XCK‬‬              ‫ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺎﻟﺲ ‪XCK‬‬




   ‫]0:1[‪ :Character Size‬اﻳﻦ ﺑﻴﺖ ﺑﻪ ﻫﻤﺮاه ﺑﻴﺖ 2‪ UCSZ‬ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﺪاد ﺑﻴﺖ ﻫﺎي ﻳﻚ ﻛﺎراﻛﺘﺮ را‬

                           ‫ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ، در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض اﻳﻦ ﺑﻴﺖ ﻫﺎ اﻧﺪازه ي 8 ﺑﻴﺖ را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ.‬




                           ‫2‪UCSZ‬‬    ‫1‪UCSZ‬‬        ‫0‪UCSZ‬‬          ‫اﻧﺪازه ي ﻛﺎراﻛﺘﺮ‬

                              ‫٠‬         ‫٠‬             ‫٠‬                    ‫5 ﺑﻴﺖ‬

                              ‫٠‬         ‫٠‬             ‫١‬                    ‫6 ﺑﻴﺖ‬

                              ‫٠‬         ‫١‬             ‫٠‬                    ‫7 ﺑﻴﺖ‬

                              ‫٠‬         ‫١‬             ‫١‬                    ‫8 ﺑﻴﺖ‬

                              ‫١‬         ‫٠‬             ‫٠‬                ‫رزرو ﺷﺪه‬



                                                      ‫- ٣١١ -‬
‫411 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                      ‫ ‪       www.pnkavosh.com‬‬
                               ‫١‬          ‫٠‬             ‫١‬                 ‫رزرو ﺷﺪه‬

                               ‫١‬          ‫١‬             ‫٠‬                 ‫رزرو ﺷﺪه‬

                               ‫١‬          ‫١‬             ‫١‬               ‫ﺣﺎﻟﺖ 9 ﺑﻴﺘﻲ‬




 ‫‪ :Stop Bit Select‬اﻳﻦ ﺑﻴﺖ، ﺗﻌﺪاد ﺑﻴﺖ ﻫﺎي ﭘﺎﻳﺎن را ﻣﻌﻴﻦ ﻣﻲ ﻛﻨﺪ. در ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﻛﻪ اﻳﻦ ﺑﻴﺖ ﺻﻔﺮ ﻣﻲ‬

                                   ‫ﺑﺎﺷﺪ ﻳﻚ ﺑﻴﺖ ﭘﺎﻳﺎن و در ﺻﻮرت 1 ﺷﺪن 2 ﺑﻴﺖ ﭘﺎﻳﺎن در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد.‬




‫]0:1[‪ :Parity Mode‬اﻳﻦ دو ﺑﻴﺖ ﺗﻨﻈﻴﻤﺎت ﻣﺮﺑﻮط ﺑﻪ ﺑﻴﺖ ﺗﻮازن را ﻣﻄـﺎﺑﻖ ﺟـﺪول زﻳـﺮ اﻧﺠـﺎم ﻣـﻲ دﻫﻨـﺪ. در‬

‫ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ﺗﻮازن ﻫﻤﺮاه ﻫﺮ ‪ Frame‬اﻳﻦ ﺑﻴﺖ اﻳﺠﺎد ﺷﺪه و در ﮔﻴﺮﻧﺪه ﺑﺮ ﺣﺴﺐ ﻫﻤـﺎن ﺗﻨﻈﻴﻤـﺎت )ﻛـﻪ‬

‫ﺑﺎﻳﺪ در آﻧﺠﺎ ﻧﻴﺰ ﻣﻄﺎﺑﻖ ﺗﻨﻈﻴﻤﺎت ﻓﺮﺳﺘﻨﺪه اﻧﺠﺎم ﺷﻮد.( ﻣﻘﺪار ﺑﻴﺖ ﺗﻮازن ﺑﺎ ﻣﻘﺪار درﻳﺎﻓـﺖ ﺷـﺪه ﻣﻘﺎﻳﺴـﻪ ﺷـﺪه و در‬

                                              ‫ﺻﻮرت ﺑﺮوز ﺧﻄﺎ ﭘﺮﭼﻢ ‪ PE‬از رﺟﻴﺴﺘﺮ ‪ UCSRA‬ﻳﻚ ﻣﻲ ﺷﻮد.‬



                                   ‫وﺿﻌﻴﺖ ﺑﻴﺖ ﺗﻮازن 0‪UPM1 UPM‬‬

                                     ‫0‬         ‫0‬            ‫ﻏﻴﺮ ﻓﻌﺎل‬

                                     ‫0‬         ‫1‬            ‫رزرو ﺷﺪه‬

                                     ‫1‬         ‫0‬            ‫ﺗﻮازن زوج‬

                                     ‫1‬         ‫1‬            ‫ﺗﻮازن ﻓﺮد‬



‫‪ UMSEL :USART Mode Select‬ﺣﺎﻟﺖ ﻛﺎر ‪ UART‬را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ. در ﺻﻮرﺗﻲ اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺑﺎﺷﺪ در‬

                                           ‫ﺣﺎﻟﺖ آﺳﻨﻜﺮون و ﺑﺎ ﻳﻚ ﻛﺮدن آن در وﺿﻌﻴﺖ ﺳﻨﻜﺮون ﻛﺎر ﻣﻲ ﻛﻨﺪ.‬




                                                        ‫- ٤١١ -‬
‫511 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
 ‫‪ :Register Select‬ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ دو رﺟﻴﺴﺘﺮ ‪ UCSRC‬و ‪ UBRRH‬داراي آدرس ﻣﺸﺘﺮﻛﻲ )04‪(0x‬‬

‫ﻫﺴﺘﻨﺪ و اﻳﻦ ﺑﻴﺖ ﺑﺮاي اﻧﺘﺨﺎب ﻧﻮﺷﺘﻦ روي ﻳﻜﻲ از اﻳﻦ دو رﺟﻴﺴﺘﺮ ﻣﻲ ﺑﺎﺷﺪ. ﺑﻪ اﻳﻦ ﺻﻮرت ﻛﻪ اﮔﺮ ﺑﺨﻮاﻫﻴﻢ روي‬

 ‫‪ UCSRC‬ﻣﻘﺪاري را ﺑﻨﻮﻳﺴﻴﻢ ﺑﺎﻳﺪ در ﻫﻤﺎن ﺑﺎﻳﺖ ‪ MSB‬ﻳﻚ ﺑﺎﺷﺪ و ﭼﻨﺎﻧﭽﻪ ﺑﺨﻮاﻫﻴﻢ روي ‪ UBRRH‬ﻣﻘﺪاري‬

        ‫را ﺑﻨﻮﻳﺴﻴﻢ ﺑﺎﻳﺪ ‪ MSB‬ﺻﻔﺮ ﺑﺎﺷﺪ. ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل دﺳﺘﻮرات زﻳﺮ ﻣﻘﺪار ﺑﻴﺖ 1 از ﻫﺮ رﺟﻴﺴﺘﺮ را ﻳﻚ ﻣﻲ ﻛﻨﺪ:‬

‫;20‪UBRRH = 0x‬‬
‫;28‪UCSRC = 0x‬‬


‫روش ﺧﻮاﻧﺪن اﻳﻦ دو رﺟﻴﺴﺘﺮ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ در ﺻﻮرت ﺧﻮاﻧـﺪن ﻣﻘـﺪار آدرس 04‪ 0x‬و ﻳـﺎ ﻫـﺮ ﻳـﻚ از‬

                ‫اﺳﺎﻣﻲ ﻣﺴﺘﻌﺎر اﻳﻦ آدرس )‪ UCSRC‬ﻳﺎ ‪ (UBRRH‬ﻣﻘﺪار رﺟﻴﺴﺘﺮ ‪ UBRRH‬ﺑﻪ دﺳﺖ ﺧﻮاﻫﺪ آﻣﺪ:‬

‫;‪a = UBRRH‬‬
‫ﭼﻨﺎﻧﭽﻪ ﺑﺨﻮاﻫﻴﻢ ﻣﻘﺪار رﺟﻴﺴﺘﺮ ‪ UCSRC‬را ﺑﺪﺳﺖ آورﻳﻢ ﺑﺎﻳﺪ در ﺳﻴﻜﻞ ﻛﻼك ﺑﻌﺪي ﻣﻘﺪار ﺧﻮاﻧـﺪه ﺷـﺪه را ﺑـﻪ‬

                                                 ‫ﻋﻨﻮان ﻣﻘﺪار واﻗﻌﻲ ‪ UCSRC‬در ﻧﻈﺮ ﺑﮕﻴﺮﻳﻢ، ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل:‬

‫;‪b = UBRRH‬‬
‫;‪b = UCSRC‬‬


‫ﺑﻬﺘﺮ اﺳﺖ در ﺻﻮرت اﺳـﺘﻔﺎده از وﻗﻔـﻪ، ﻗﺒـﻞ از ﭘﺮوﺳـﻪ ي ﺑـﺎﻻ ﺑﻴـﺖ ﻓﻌـﺎل ﺳـﺎز وﻗﻔـﻪ ﻫـﺎ را ﺑـﺎ دﺳـﺘﻮر‬

                                                                  ‫)"‪ #asm("cli‬ﻏﻴﺮ ﻓﻌﺎل ﻛﻨﻴﻢ.‬

 ‫ﺑﺎ ﺧﻮاﻧﺪن ‪ UBRRH‬ﺑﻴﺖ ‪ URSEL‬ﺻﻔﺮ ﺧﻮاﻧﺪه ﺷﺪه و ﺑﺎ ﺧﻮاﻧﺪن ‪ UCSRC‬اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺧﻮاﻧﺪه ﻣﻲ‬

                                                                                              ‫ﺷﻮد.‬




                                                             ‫‪USART Baud Rate Registers‬‬               ‫٥.‬




                                                        ‫- ٥١١ -‬
‫611 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                       ‫ ‬                       ‫ ‪       www.pnkavosh.com‬‬
                       ‫‪Bit‬‬           ‫7‬         ‫6‬         ‫5‬           ‫4‬        ‫3‬        ‫2‬       ‫1‬        ‫0‬

                     ‫‪UBRRH‬‬         ‫‪URSEL‬‬       ‫-‬         ‫-‬           ‫-‬                ‫]8:11[‪UBRR‬‬

                     ‫‪UBRRL‬‬                                         ‫]0:7[‪UBRR‬‬




                     ‫‪ :URSEL‬ﻫﻤﺎن ﻃﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﺮاي اﻧﺘﺨﺎب ﺑﻴﻦ ‪ UBRRH‬و ‪ UCSRC‬اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.‬




‫]4:7[‪ :UBRRH‬ﺑﺮاي ﻛﺎرﺑﺮدﻫﺎي آﻳﻨﺪه رزرو ﺷﺪه ﻫﺴﺘﻨﺪ و ﺑﺮاي ﺳﺎزﮔﺎري ﺑﺎ ﻗﻄﻌﺎت آﺗﻲ ﺑﺎﻳﺪ روي آن ﻫﺎ ﺻﻔﺮ‬

                                                                                                       ‫ﻧﻮﺷﺘﻪ ﺷﻮد.‬




‫]0:11[‪ :UBRR‬اﻳﻦ دوازده ﺑﻴﺖ ﺑﺮاي ﺗﻌﻴﻴﻦ ‪ Baud Rate‬راﺑﻂ ‪ USART‬ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ. ﺑﻪ اﻳﻦ‬

                                                                         ‫ﻣﻨﻈﻮر ﻣﻲ ﺗﻮان از رواﺑﻂ زﻳﺮ اﺳﺘﻔﺎده ﻧﻤﻮد:‬



                 ‫‪ Mode‬ﻛﺎري‬           ‫ﻣﺤﺎﺳﺒﻪ ‪ Baud Rate‬از روي ‪UBRR‬‬                 ‫ﻣﺤﺎﺳﺒﻪ ‪ UBRR‬از روي ‪Baud Rate‬‬

                                                         ‫‪f osc‬‬                                    ‫‪f osc‬‬
           ‫آﺳﻨﻜﺮون )0=‪(U2X‬‬               ‫= ‪Baud‬‬                                    ‫= ‪UBRR‬‬               ‫1−‬
                                                   ‫)1 + ‪16 ( UBRR‬‬                             ‫‪16 × Baud‬‬
         ‫آﺳﻨﻜﺮون ﺑﺎ ﺳﺮﻋﺖ دوﺑﺮاﺑﺮ‬
                                                        ‫‪f osc‬‬                                     ‫‪f osc‬‬
                                         ‫= ‪Baud‬‬                                     ‫= ‪UBRR‬‬              ‫1−‬
           ‫)1=‪(U2X‬‬                                  ‫)1 + ‪8( UBRR‬‬                               ‫‪8 × Baud‬‬

                                                         ‫‪f osc‬‬                                    ‫‪f osc‬‬
                ‫ﻋﻤﻠﻜﺮد ﺳﻨﻜﺮون‬            ‫= ‪Baud‬‬                                     ‫= ‪UBRR‬‬              ‫1−‬
                                                    ‫)1 + ‪2( UBRR‬‬                               ‫‪2 × Baud‬‬




                                                                 ‫ﻣﻘﺪار ﺧﻄﺎي ﺑﻮﺟﻮد آﻣﺪه از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:‬

                 ‫‪BaudRate ClosestMatch‬‬
‫( = ]%[‪Error‬‬                           ‫%001× )1 −‬
                    ‫‪BaudRate‬‬




                                                                  ‫- ٦١١ -‬
‫711 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬
‫ﻣﺜﺎل1: ﺑﺎ ﻛﻼك 8 ﻣﮕﺎﻫﺮﺗﺰ و 0042 = ‪ Baud Rate‬در ‪ Mode‬آﺳﻨﻜﺮون ﻋﺎدي، ﻣﻘﺪار ‪ UBRR‬را ﺑﺪﺳﺖ آورﻳﺪ.‬



           ‫0000008‬
‫= ‪UBRR‬‬               ‫702 = ‪− 1 = 207.33 ⇒ UBRR‬‬
           ‫0042 × 61‬

                 ‫0000008‬
‫= ‪BaudRate‬‬                  ‫4042 =‬
                ‫)1 + 702(61‬

                ‫4042‬
‫( = ]%[‪Error‬‬         ‫%2.0 = %001 × )1 −‬
                ‫0042‬




   ‫ﺑﺮاي ﺻﻔﺮ ﺷﺪن ﺧﻄﺎ ﻣﻲ ﺗﻮان از ﻛﺮﺳﻴﺘﺎل 8273.7 ﻣﮕﺎﻫﺮﺗﺰ اﺳﺘﻔﺎده ﻧﻤﻮد اﮔﺮﭼﻪ ﺣﺪاﻛﺜﺮ ﺧﻄﺎي ﻗﺎﺑﻞ ﻗﺒﻮل ﺑﺮاي‬

                                                                        ‫اﻳﻦ وﺿﻌﻴﺖ 2 درﺻﺪ ﻣﻲ ﺑﺎﺷﺪ.‬



      ‫ﻛﺮﻳﺴﺘﺎل ﻫﺎﻳﻲ ﻛﻪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از آن ﻫﺎ ﺑﻪ ﺧﻄﺎي ‪ Baud Rate‬ﺻﻔﺮ رﺳﻴﺪ 2348.1، 4686.3،‬

                                                                 ‫8273.7، 2950.11، 6547.41 ﻣﻲ ﺑﺎﺷﻨﺪ.‬

         ‫ﻣﻘﺪار ‪ UBRR‬و ﺧﻄﺎﻫﺎي ﺣﺎﺻﻞ در ﻛﻠﻴﻪ ﺣﺎﻟﺖ ﻫﺎ در ﺻﻔﺤﺎت 961- 661 از ﺑﺮﮔﻪ ي اﻃﻼﻋﺎﺗﻲ‬

                                                                       ‫61‪ ATmega‬ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ.‬




                                                                        ‫ﺗﻮاﺑﻊ ‪ USART‬در ‪CodeVision‬‬




  ‫اﻋﻼن اﻳﻦ ﺗﻮاﺑﻊ در ﻓﺎﻳﻞ ‪ stdio.h‬ﻗﺮار دارد و ﻗﺒﻞ از اﺳﺘﻔﺎده از آن ﻫﺎ ﺑﺎﻳﺪ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ ‪ USART‬اﻧﺠﺎم ﺷﻮد.‬




       ‫ﺗﺎﺑﻊ )(‪ :getchar‬اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ روش ‪ Polling‬ﻣﻨﺘﻈﺮ ﻣﻲ ﻣﺎﻧﺪ ﺗﺎ ﭘﺮﭼﻢ ‪ RXC‬ﻳﻚ ﺷﺪه و ﺑﻌﺪ از آن ﻣﻘﺪار‬

                                                                                       ‫‪ UDR‬را ﻣﻲ ﺧﻮاﻧﺪ.‬

                                                       ‫- ٧١١ -‬
P a g e | 118
        www.avr.ir                                                             www.pnkavosh.com 
‫ ﻳـﻚ ﺷـﺪه و ﺑﻌـﺪ از آن ﻳـﻚ‬UDRE ‫ ﻣﻨﺘﻈﺮ ﻣﻲ ﻣﺎﻧﺪ ﺗـﺎ ﭘـﺮﭼﻢ‬Polling ‫: اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ روش‬putchar() ‫ﺗﺎﺑﻊ‬

                                                                          .‫ ﻛﭙﻲ ﻣﻲ ﻛﻨﺪ‬UDR ‫ﻛﺎراﻛﺘﺮ را در‬




‫ﻣﺜﺎل2: )ﻣﻴﻜﺮو اول ﺑﻌﺪ از 3 ﺛﺎﻧﻴﻪ ﻋﺪد 7 را ﺑﺮاي ﻣﻴﻜﺮو دوم ارﺳﺎل ﻣﻲ ﻛﻨﺪ و در ﻣﺪت اﻳﻦ ﺳﻪ ﺛﺎﻧﻴﻪ ﻣﻴﻜـﺮو دوم ﺑـﻪ‬

                (.‫ ﻣﻲ رﻳﺰد‬PORTA ‫ ﻣﻨﺘﻈﺮ درﻳﺎﻓﺖ ﻳﻚ ﻛﺎراﻛﺘﺮ ﻣﻲ ﻣﺎﻧﺪ و ﭘﺲ از درﻳﺎﻓﺖ آن را در‬Polling ‫روش‬

                                                                                       :‫ﺑﺮﻧﺎﻣﻪ ي ﻣﻴﻜﺮو اول‬

#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#define xtal 8000000



void main(void)
{



UCSRA=0x00;
UCSRB=0x08; // USART Transmitter: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
UBRRH=0x00;
UBRRL=0x33; // USART Baud rate: 9600



            delay_ms(3000);
            putchar(7);
            while (1);
}
                                                                                         :‫ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو دوم‬

#include <mega16.h>
#include <stdio.h>

                                                         - ١١٨ -
P a g e | 119
        www.avr.ir                                                         www.pnkavosh.com 
#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);



}


‫ ﺗﻨﻬﺎ ﺑﺮاي ﺻﺮﻓﻪ ﺟﻮﻳﻲ در وﻗﺖ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ ﺑﺎﺷﻨﺪ. در ﺻﻮرت ﻧﻴـﺎز ﻣـﻲ ﺗـﻮان ﺑـﻪ‬USART ‫ﺗﻮاﺑﻊ ﺳﻄﺢ ﺑﺎﻻي‬

‫ﺻﻮرت ﻣﺴﺘﻘﻴﻢ ﺑﺎ رﺟﻴﺴﺘﺮﻫﺎ ﻛﺎر ﻛﺮد. ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﺣﻠﻘﻪ ي اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ي ﻣﻴﻜﺮو دوم را ﺑﻪ ﺻﻮرت زﻳﺮ ﻧﻴـﺰ ﻣـﻲ‬

                                                                                          :‫ﺗﻮان ﻧﻮﺷﺖ‬

            while(!(UCSRA&0x80));
            PORTA=UDR;
            while (1);



                                                      - ١١٩ -
‫021 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬




‫ﺗﻮاﺑﻊ )(‪ puts‬و )(‪ :putsf‬اﻳﻦ ﺗﻮاﺑﻊ ﻳﻚ رﺷﺘﻪ را ﺗﻮﺳـﻂ ‪ USART‬ﺑـﻪ ﭘـﻮرت ﺳـﺮﻳﺎل ارﺳـﺎل ﻣـﻲ ﻛﻨﻨـﺪ. ﺗـﺎﺑﻊ‬

‫)(‪ puts‬رﺷﺘﻪ اي را ﻛﻪ در ‪ SRAM‬اﺳﺖ و ﺗﺎﺑﻊ )(‪ putsf‬رﺷﺘﻪ اي را ﻛﻪ در ‪ Flash‬اﺳﺖ ﺑﻪ ﺧﺮوﺟﻲ ارﺳﺎل ﻣـﻲ‬

‫ﻛﻨﺪ. اﺳﺎس ﺗﻤﺎم ﺗﻮاﺑﻊ ﺳﻄﺢ ﺑﺎﻻي ‪ USART‬ﺗﻮاﺑﻊ )(‪ putchar‬و )(‪ getchar‬ﻣﻲ ﺑﺎﺷﻨﺪ و در اﻳﻨﺠﺎ ﻧﻴﺰ ﺑﺎ اﺳـﺘﻔﺎده‬

                                           ‫از اﺷ ـﺎره ـﺮ ‪ ،Y‬ﻛﺎراﻛﺘﺮﻫـ ـ ﺳـ ﻫـ ﺑﻮﺳـ‬
‫ـﺎ ﭘﺸ ـﺖ ـﺮ ـﻢ ـﻴﻠﻪ ي اﻳ ـﻦ ـﻊ ـﻪ رﺟﻴﺴ ـﺘﺮ ‪ UDR‬ـﺎل ـﻲ ـﻮﻧﺪ.‬
    ‫ارﺳـ ﻣـ ﺷـ‬     ‫ـ‬       ‫ـ ﺗﻮاﺑـ ﺑـ‬                                 ‫ـ ﮔـ‬




                                   ‫اﻳﻦ ﺗﻮاﺑﻊ ﺑﻪ اﻧﺘﻬﺎي رﺷﺘﻪ ﻛﺎراﻛﺘﺮ ‪ (0x10) LF‬را اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻨﺪ.‬




                              ‫ﻣﺜﺎل3: )رﺷﺘﻪ ﻫﺎي "‪ "Kavosh‬و "‪ "AVR‬ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﺷﻮﻧﺪ.(‬



‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬
‫>‪#include <stdio.h‬‬
‫0000008 ‪#define xtal‬‬


‫;"‪flash char string1[7]="Kavosh‬‬
‫;"‪char string2[7]="AVR‬‬


‫)‪void main(void‬‬
‫{‬


‫;00‪UCSRA=0x‬‬
‫‪UCSRB=0x08; // USART Transmitter: On‬‬
‫‪UCSRC=0x86; //8 Data, 1 Stop, No Parity‬‬

                                                     ‫- ٠٢١ -‬
‫121 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫;00‪UBRRH=0x‬‬
‫0069 :‪UBRRL=0x33; // USART Baud rate‬‬


            ‫;)1‪putsf(string‬‬
            ‫;)2‪puts(string‬‬
            ‫;)1( ‪while‬‬
‫}‬


     ‫ﺗﺎﺑﻊ )(‪ :gets‬اﻳﻦ ﺗﺎﺑﻊ داراي دو آرﮔﻮﻣﺎن ﻧﺎم ﻣﺘﻐﻴﺮ و ﻃﻮل اﺳﺖ ﻛﻪ ﻣﻨﺘﻈﺮ ﻣﻲ ﻣﺎﻧﺪ ﺗﺎ ﻛﺎراﻛﺘﺮﻫﺎي درﻳﺎﻓﺘﻲ ﺑﻪ‬

                                                    ‫اﻧﺪازه ي ﻃﻮل ﺷﺪه و ﺳﭙﺲ آن ﻫﺎ را داﺧﻞ ﻣﺘﻐﻴﺮ ﻣﻲ رﻳﺰد.‬




    ‫ﻣﺜﺎل 4: )ﻣﻴﻜﺮو اول ﺑﻌﺪ از 1 ﺛﺎﻧﻴﻪ ﻋﺪد رﺷﺘﻪ ي ‪ Kavosh‬را ﺑﺮاي ﻣﻴﻜﺮو دوم ارﺳﺎل ﻣﻲ ﻛﻨﺪ و در ﻣﺪت اﻳﻦ ﻳﻚ‬

    ‫ﺛﺎﻧﻴﻪ ﻣﻴﻜﺮو دوم ﺑﻪ روش ‪ Polling‬ﻣﻨﺘﻈﺮ درﻳﺎﻓﺖ رﺷﺘﻪ ﻣﻲ ﻣﺎﻧﺪ و ﭘﺲ از درﻳﺎﻓﺖ آن را در ‪ LCD‬ﻧﻤﺎﻳﺶ ﻣﻲ‬

                                                                                                    ‫دﻫﺪ.(‬

                                                                                           ‫ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو 1:‬

‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬
‫>‪#include <stdio.h‬‬
‫0000008 ‪#define xtal‬‬



‫)‪void main(void‬‬
‫{‬



‫;00‪UCSRA=0x‬‬
‫‪UCSRB=0x08; // USART Transmitter: On‬‬
‫‪UCSRC=0x86; //8 Data, 1 Stop, No Parity‬‬

                                                         ‫- ١٢١ -‬
P a g e | 122
        www.avr.ir                                    www.pnkavosh.com 
UBRRH=0x00;
UBRRL=0x33; // USART Baud rate: 9600



            delay_ms(1000);
            putsf(" Kavosh ");
            while (1);
}


                                                                :2 ‫ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو‬

#include <mega16.h>
#include <stdio.h>
#include <lcd.h>
#define xtal 8000000



#asm
      .equ __lcd_port=0x1B ;PORTA
#endasm



char a[10];



void main(void)
{



UCSRA=0x00;
UCSRB=0x10; // USART Receiver: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
UBRRH=0x00;

                                     - ١٢٢ -
‫321 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
‫0069 :‪UBRRL=0x33; // USART Baud rate‬‬



            ‫;)61(‪lcd_init‬‬
            ‫;)(‪lcd_clear‬‬
        ‫;)"...‪lcd_putsf("Waiting‬‬
            ‫;)01,‪gets(a‬‬
            ‫;)(‪lcd_clear‬‬
        ‫;)‪lcd_puts(a‬‬
            ‫;)1(‪while‬‬



‫}‬


 ‫ﺗﺎﺑﻊ )(‪ :printf‬اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ رﺷﺘﻪ ي ﻗﺎﻟﺐ ﺑﻨﺪي ﺷﺪه را ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﻛﻨﺪ. ﻛﺎراﻛﺘﺮ ﻓﺮﻣﺖ ﻣﻲ ﺗﻮاﻧﺪ‬

                                                                                ‫ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺑﺎﺷﺪ:‬




                                     ‫ﻧﻮع اﻃﻼﻋﺎت‬                 ‫ﻛﺎراﻛﺘﺮ ﻓﺮﻣﺖ‬

                                                   ‫ﻳﻚ ﻛﺎراﻛﺘﺮ‬       ‫‪%c‬‬

                              ‫ﻋﺪد ﺻﺤﻴﺢ ﻋﻼﻣﺘﺪار در ﻣﺒﻨﺎي 01‬       ‫‪ %d‬و ‪%i‬‬

                             ‫ﻋﺪد اﻋﺸﺎري ﺑﻪ ﺻﻮرت ﻧﻤﺎد ﻋﻠﻤﻲ‬       ‫‪ %e‬و ‪%E‬‬

                                                  ‫ﻋﺪد اﻋﺸﺎري‬        ‫‪%f‬‬

                             ‫رﺷﺘﻪ ي ﺧﺘﻢ ﺷﺪه ﺑﻪ ‪ Null‬واﻗﻊ در‬
                                                                    ‫‪%s‬‬
                                                      ‫‪SRAM‬‬
                             ‫رﺷﺘﻪ ي ﺧﺘﻢ ﺷﺪه ﺑﻪ ‪ Null‬واﻗﻊ در‬
                                                                    ‫‪%p‬‬
                                                        ‫‪Flash‬‬

                                                      ‫- ٣٢١ -‬
P a g e | 124
        www.avr.ir                                                       www.pnkavosh.com 
                         10 ‫ﻋﺪد ﺻﺤﻴﺢ ﺑﺪون ﻋﻼﻣﺖ در ﻣﺒﻨﺎي‬          %u

                         16 ‫ﻋﺪد ﺻﺤﻴﺢ ﺑﺪون ﻋﻼﻣﺖ در ﻣﺒﻨﺎي‬        %X ‫% و‬x

                                                   % ‫ﻛﺎراﻛﺘﺮ‬    %%



                                 (.‫ﻣﺜﺎل 5: )ﻳﻚ رﺷﺘﻪ ي ﻗﺎﻟﺐ ﺑﻨﺪي ﺷﺪه را ﺑﻪ ﭘﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ ﻛﻨﺪ‬



#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#define xtal 8000000



int a = 100;
char b = 'A';
float pi = 3.14;



void main(void)
{



UCSRA=0x00;
UCSRB=0x08; // USART Transmitter: On
UCSRC=0x86; //8 Data, 1 Stop, No Parity
UBRRH=0x00;
UBRRL=0x33; // USART Baud rate: 9600



            printf("a=%d b=%c pi=%f",a,b,pi);

                                                    - ١٢٤ -
‫521 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬



            ‫;)1( ‪while‬‬
‫}‬


‫ﺗﺎﺑﻊ )(‪ printf‬اﻳﻦ ﻗﺎﺑﻠﻴﺖ را دارد ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻃﻮل ﻣﻴﺪان و دﻗﺖ ﭘﺎراﻣﺘﺮ را ﺗﻌﻴﻴﻦ ﻛﻨﺪ ﻛﻪ اﻳﻦ اﻣﻜﺎن ﺑﻪ ﺻﻮرت‬

‫‪ %width.precision‬ﻗﺎﺑﻞ ﺗﻨﻈﻴﻢ ﻣﻲ ﺑﺎﺷﺪ. ‪ width‬ﻧﺸﺎن دﻫﻨﺪه ي ﻃﻮل ﻳﻚ ﻋﺪد اﺳﺖ ﻛﻪ در ﻣﻮرد اﻋﺪاد ﺻﺤﻴﺢ‬

‫اﮔﺮ ﺑﻴﺸﺘﺮ از ﺗﻌﺪاد ارﻗﺎم ﺑﺎﺷﺪ ﺑﻪ اﻧﺪازه ي اﺿﺎﻓﻪ ﺟﺎي ﺧﺎﻟﻲ در ﺳﻤﺖ ﭼﭗ ﻋﺪد در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷـﻮد و ﭼﻨﺎﻧﭽـﻪ‬

‫ﻋﺪد اﻋﺸﺎري ﺑﺎﺷﺪ اﻳﻦ ﻣﻘﺪار ﺑﻴﺎﻧﮕﺮ ﻗﺴﻤﺖ ﺻﺤﻴﺢ و "." و ﻗﺴﻤﺖ اﻋﺸﺎري ﻣـﻲ ﺑﺎﺷـﺪ. ‪ precision‬ﻣﻘـﺪار دﻗـﺖ‬

                ‫اﻋﺸﺎر را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ. ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل اﮔﺮ 541.3 = ‪ a‬ﺑﺎﺷﺪ دﺳﺘﻮر زﻳﺮ 41.3=‪ a‬را ﭼﺎپ ﻣﻲ ﻛﻨﺪ.‬

‫;)‪printf("a=%4.2",a‬‬


                                     ‫ﻣﺸﺨﺼﺎت ﺗﺎﺑﻊ )(‪ printf‬در ﻛﺎﻣﭙﺎﻳﻠﺮ ‪ CodeVision‬را ﻣﻲ ﺗﻮان از ﻃﺮﻳﻖ:‬

‫‪Project/Configure/C Compiler/(s)printf Features‬‬
                                                                                               ‫ﺗﻌﻴﻴﻦ ﻧﻤﻮد.‬




    ‫ﺗﺎﺑﻊ )(‪ :scanf‬ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﺗﺎﺑﻊ ﻣﻲ ﺗﻮاﻧﺪ ﻗﺎﻟﺐ اﻃﻼﻋﺎت درﻳﺎﻓﺘﻲ از ﭘﻮرت ﺳﺮﻳﺎل را ﺗﻌﻴﻴﻦ ﻧﻤﻮد. ﻃﺮز ﻛﺎر‬

                                                                               ‫اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ:‬

‫;)ﻋﺒﺎرت دوم,"ﻋﺒﺎرت اول"(‪scanf‬‬




                                                         ‫- ٥٢١ -‬
‫621 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬
‫ﻋﺒﺎرت دوم ﻧﺎم ﻣﺘﻐﻴﺮي اﺳﺖ ﻛﻪ رﺷﺘﻪ ي درﻳﺎﻓﺘﻲ در آن ﻗﺮار ﻣﻲ ﮔﻴﺮد و ﻋﺒﺎرت اول ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻗﺎﻟﺐ داده ي‬

‫درﻳﺎﻓﺘﻲ ﺑﻪ ﭼﻪ ﺻﻮرت ﺑﺎﺷﺪ. ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻃﻮل رﺷﺘﻪ ي درﻳﺎﻓﺘﻲ 652 ﻛﺎراﻛﺘﺮ اﺳﺖ اﻣﺎ ﺑـﺎ اﻓـﺰودن ﻃـﻮل‬

                                ‫ﻗﺒﻞ از ﻛﺎراﻛﺘﺮ ﻓﺮﻣﺖ ﻣﻲ ﺗﻮان آن را ﺑﻪ ﻣﻘﺪار دﻟﺨﻮاه ﻛﺎﻫﺶ داد. ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل:‬

‫)‪scanf("%10d",a‬‬
                                                ‫01 ﻛﺎراﻛﺘﺮ را از ورودي ﺧﻮاﻧﺪه و در ﻣﺘﻐﻴﺮ ‪ a‬ذﺧﻴﺮه ﻣﻲ ﻛﻨﺪ.‬




                                        ‫ﻣﺸﺨﺼﺎت ﺗﺎﺑﻊ )(‪ scanf‬را ﻫﻤﺎﻧﻨﺪ )(‪ printf‬ﻣﻲ ﺗﻮان از:‬



‫‪Project/Configure/C Compiler/(s)scanf Features‬‬
                                                                                              ‫ﺗﻨﻈﻴﻢ ﻧﻤﻮد.‬




 ‫ﺗﻮﺟﻪ: ﺗﻮاﺑﻊ )(‪ printf‬و )(‪ scanf‬ﺣﺠﻢ زﻳﺎدي از ﺣﺎﻓﻈﻪ ي ‪ Flash‬را ﻣﺼﺮف ﻛﺮده و ﺳﺮﻋﺖ اﺟﺮاي آن ﻫﺎ‬

‫ﭘﺎﻳﻴﻦ اﺳﺖ، ﺑﻨﺎﺑﺮاﻳﻦ ﺗﺎ ﺣﺪ اﻣﻜﺎن از آن ﻫﺎ اﺳﺘﻔﺎده ﻧﻜﺮده و در ﺻﻮرت ﻟﺰوم ﻣﺸﺨﺼﺎت آن ﻫﺎ را ﺑﻪ ﺳﺎده ﺗﺮﻳﻦ‬

                                                                   ‫ﺣﺎﻟﺖ )‪ int‬و ‪ (int, width‬ﺗﻨﻈﻴﻢ ﻧﻤﺎﻳﻴﺪ.‬




                                                                 ‫اﺳﺘﻔﺎده از ﭘﻮرت ﺳﺮﻳﺎل در وﺿﻌﻴﺖ ﺳﻨﻜﺮون‬




                                                       ‫- ٦٢١ -‬
‫721 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                       ‫ ‪       www.pnkavosh.com‬‬
   ‫ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ‪ UMSEL‬از رﺟﻴﺴﺘﺮ ‪ UCSRC‬ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ در اﻳﻦ ﺣﺎﻟﺖ ﻗﺮار ﻣﻲ ﮔﻴﺮد و اﺗﺼﺎﻻت ﺳﺨﺖ‬

                                                                                 ‫اﻓﺰاري ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬



                               ‫‪TxD‬‬                                ‫‪TxD‬‬
                              ‫‪RxD‬‬                                 ‫‪RxD‬‬
                              ‫‪XCK‬‬                                 ‫‪XCK‬‬




‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي ‪ UCPOL‬ﻣﻲ ﺗﻮان ﻟﺒﻪ ي ﻧﻤﻮﻧﻪ ﺑﺮداري و ﺗﻐﻴﻴﺮ ﺑﺮ اﺳﺎل ﻛﻼك را ﺗﻌﻴﻴﻦ‬

‫ﻧﻤﻮد. ﻣﺴﺌﻠﻪ اي ﻛﻪ ﺑﺎﻳﺪ در ‪ Mode‬ﺳﻨﻜﺮون رﻋﺎﻳﺖ ﺷﻮد اﻳﻦ اﺳﺖ ﻛﻪ داده ﺑﺎﻳﺪ در ﺧﻼف ﻟﺒـﻪ اي ﻛـﻪ در ﻓﺮﺳـﺘﻨﺪه‬

‫ارﺳﺎل ﺷﺪه اﺳﺖ، در ﮔﻴﺮﻧﺪه ﻧﻤﻮﻧﻪ ﺑﺮداري ﺷﻮد ﻳﻌﻨﻲ اﮔﺮ داده در ﻟﺒﻪ ي ﭘﺎﻳﻴﻦ روﻧﺪه ارﺳﺎل ﺷﺪه ﺑﺎﺷﺪ در ﻟﺒﻪ ي ﺑﺎﻻ‬

                                                                                            ‫روﻧﺪه درﻳﺎﻓﺖ ﺷﻮد.‬




                                                                                ‫وﺿﻌﻴﺖ ‪Multi-processor‬‬

‫ﺑﺮاي اﻳﺠﺎد ﺷﺒﻜﻪ ﺑﻴﻦ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎ از اﻳﻦ ‪ Mode‬اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد. ﻣﻌﻤﻮﻻ ﻳﻚ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺑﻪ ﻋﻨﻮان ‪ Master‬و‬

                                                                        ‫ﺑﻘﻴﻪ ﺑﻪ ﻋﻨﻮان ‪ Slave‬اﻳﻔﺎي ﻧﻘﺶ ﻣﻲ ﻛﻨﻨﺪ.‬




                                                        ‫- ٧٢١ -‬
‫821 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                 ‫ ‬             ‫ ‪       www.pnkavosh.com‬‬


                                               ‫‪TxD‬‬



                         ‫‪Master MCU‬‬
                                              ‫‪RxD‬‬



                                             ‫1 ‪Slave‬‬
                                                ‫2 ‪Slave‬‬
                                                   ‫3 ‪Slave‬‬
                                                           ‫4 ‪Slave‬‬




‫ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ‪ MPCM‬از رﺟﻴﺴﺘﺮ ‪ UCSRA‬ﻣﻴﻜﺮوﻛﻨﺘﺮﻟـﺮ وارد اﻳـﻦ ‪ Mode‬ﺧﻮاﻫـﺪ ﺷـﺪ. ﺑـﺮاي ﻣﺒﺎدﻟـﻪ ي‬

‫اﻃﻼﻋﺎت ﺑﻴﻦ ‪ Master‬و ‪ ،Slave‬ﺑﺎﻳﺪ ‪ Slave‬ﺗﻮﺳﻂ ‪ Master‬آدرس دﻫﻲ ﺷﻮد ﻛﻪ ﺑﺪﻳﻦ ﻣﻨﻈﻮر از ﺑﻴﻦ ﻧﻬـﻢ داده‬

‫)8‪(TXB‬اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد. آدرس ‪ Slave‬ﻫﺎ ﻗﺒﻼ ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺗﻌﻴﻴﻦ ﺷﺪه و ﺗﻤﺎم آن ﻫﺎ ﺑﺎﻳﺪ ﺑﺎ ﻳـﻚ ﺷـﺪن‬

‫ﺑﻴﺖ ‪ MPCM‬در ‪ Mode‬ﭼﻨﺪ ﭘﺮدازﻧﺪه اي ﻗﺮار ﺑﮕﻴﺮﻧﺪ و ﻣﻨﺘﻈﺮ درﻳﺎﻓﺖ آدرس از ‪ Master‬ﺑﻤﺎﻧﻨﺪ. ﺑـﺮاي ﺷـﺮوع‬

‫ارﺗﺒﺎط ‪ Master‬ﻳﻚ ﻓـﺮﻳﻢ اﻃﻼﻋـﺎﺗﻲ 9 ﺑﻴﺘـﻲ ﻛـﻪ ﻫﺸـﺖ ﺑﻴـﺖ آن ﺷـﺎﻣﻞ آدرس و ﺑﻴـﺖ ﻧﻬـﻢ آن ﻳـﻚ اﺳـﺖ ﺑـﻪ‬

‫ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎ ارﺳﺎل ﻣﻲ ﻛﻨﺪ. ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻧﻬﻢ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ رﻓﺘﺎر ‪ Slave‬ﻫﺎ ﺑﺎ داده ي درﻳﺎﻓﺘﻲ ﻫﻤﺎﻧﻨﺪ ﻳﻚ‬

‫آدرس ﺑﻮده و آن را ﺑﺎ آدرس ﺧﻮد ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪ. ‪ Slave‬اﻧﺘﺨﺎب ﺷﺪه ﺑﻴﺖ ‪ MPCM‬ﺧـﻮد را ﭘـﺎك ﻛـﺮده و ﻣﻨﺘﻈـﺮ‬

‫درﻳﺎﻓﺖ داده ﻣﻲ ﻣﺎﻧﺪ و ﺑﻘﻴﻪ ‪ Slave‬ﻫﺎ ﻛﻪ ﺑﻴﺖ ‪ MPCM‬آن ﻫﺎ ﻳﻚ اﺳﺖ ﻫﻤﭽﻨﺎن ﻣﻨﺘﻈﺮ درﻳﺎﻓﺖ آدرس ﻣﻲ ﻣﺎﻧﻨﺪ.‬

‫در اﻳﻦ زﻣﺎن ‪ Slave‬اﻧﺘﺨﺎب ﺷﺪه ﺑﺎ ارﺳﺎل ﭘﻴﺎﻣﻲ ﺑﺮاي ‪ Master‬ﺗﺼﺪﻳﻖ ﻣﻲ ﻓﺮﺳﺘﻨﺪ ﺗﺎ ﺑﻴﺖ ﻧﻬﻢ ﺧﻮد را ﺻـﻔﺮ ﻛﻨـﺪ‬

‫ﺗﺎ در در ارﺳﺎل ﺑﻌﺪي ﺑﻪ اﺷﺘﺒﺎه ‪ Slave‬دﻳﮕﺮي اﻧﺘﺨﺎب ﻧﺸﻮد. ﭘﺲ از اﺗﻤﺎم ارﺳﺎل داده ‪ Master‬ﻣﺠﺪدا ﺑﻪ ﻧﺸـﺎﻧﻪ ي‬

‫آدرس دﻫﻲ ﺑﻴﺖ ﻧﻬﻢ ﺧﻮد را ﻳﻚ ﻛﺮده و آدرس دﻳﮕﺮي را ارﺳﺎل ﻣﻲ ﻛﻨﺪ. ‪ Slave‬ﻗﺒﻞ ﻛﻪ ﺑﻴﺖ ‪ MPCM‬آن ﺻـﻔﺮ‬

                                     ‫ﺷﺪه ﺑﻮد ﻣﺠﺪدا اﻳﻦ ﺑﻴﺖ را ﻳﻚ ﻛﺮده و آﻣﺎده ي درﻳﺎﻓﺖ آدرس ﻣﻲ ﺷﻮد.‬




                                                           ‫- ٨٢١ -‬
‫921 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                    ‫ ‪       www.pnkavosh.com‬‬



                                                               ‫* ﭘﺮوژه 21: ﭘﻮرت ﺳﺮﻳﺎل در وﻳﮋوال ﺑﻴﺴﻴﻚ‬




     ‫ارﺗﺒﺎط ﺑﻴﻦ ﻛﺎﻣﭙﻴﻮﺗﺮ و ‪ PC‬ﺑﻪ ﺻﻮرت ‪ Null-Modem‬ﺑﻮده و ﻫﻤﺎﻧﻄﻮر ﻛﻪ اﺷﺎره ﺷﺪ ﺑﺮاي ﺗﻐﻴﻴﺮ ﺳﻄﺢ -‪RS‬‬

                           ‫232 ﺑﻪ ‪ TTL‬ﻣﻄﺎﺑﻖ ﺷﻤﺎﺗﻴﻚ اﺑﺘﺪاي ﻓﺼﻞ از ﻣﺒﺪل 232‪ MAX‬اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.‬




 ‫ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﭘﻮرت ﻫﺎي ‪ COM‬در وﻳﮋوال ﺑﻴﺴﻴﻚ ﻣﻲ ﺗﻮان از ﻛﻨﺘﺮل ‪ MSComm‬ﻛﻪ ﻫﻤﺮاه ﻛﺎﻣﭙﺎﻳﻠﺮ وﺟﻮد‬

  ‫دارد اﺳﺘﻔﺎده ﻧﻤﻮد. اﻳﻦ ﻛﻨﺘﺮل، ارﺗﺒﺎط دﻫﻲ ﭘﻮرت ﺳﺮﻳﺎل را از ﻃﺮﻳﻖ ﻓﺎﻳﻞ ‪ mscomm32.ocx‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ‬

                                        ‫ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ. ﺑﺮاي آﺷﻨﺎﻳﻲ ﺑﺎ اﻳﻦ ‪ OCX‬ﻣﺮاﺣﻞ زﻳﺮ را اﻧﺠﺎم دﻫﻴﺪ:‬


                                     ‫ﻳﻚ ﭘﺮوژه ي ﺟﺪﻳﺪ از ﻧﻮع ‪ Standard EXE‬ﺑﺴﺎزﻳﺪ:‬                   ‫1.‬




                                                     ‫- ٩٢١ -‬
‫031 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬               ‫ ‪       www.pnkavosh.com‬‬
‫از ﻃﺮﻳﻖ ﻣﻨﻮي اﺻﻠﻲ ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﮔﺰﻳﻨﻪ ي ‪ Project‬ﻣﻮرد ‪ Component‬را اﻧﺘﺨﺎب ﻛﻨﻴﺪ و در ﻛﺎدر‬     ‫2.‬

                ‫ﺣﺎﺻﻞ ﮔﺰﻳﻨﻪ ي 0.6 ‪ Microsoft Comm Control‬را ﻋﻼﻣﺖ زده و دﻛﻤﻪ ي ‪ OK‬را ﻛﻠﻴﻚ ﻛﻨﻴﺪ.‬




                               ‫آﻳﻜﻮن ﻛﻨﺘﺮل ‪ MScomm‬را از ‪ Toolbox‬روي ﻓﺮم ﻗﺮار دﻫﻴﺪ:‬           ‫3.‬




                                                      ‫- ٠٣١ -‬
P a g e | 131
        www.avr.ir                                                        www.pnkavosh.com 
                                           .‫ ﻓﺮم ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ را وارد ﻛﻨﻴﺪ‬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.avr.ir                               www.pnkavosh.com 



                                       RS232 ‫ ﺑﺎ‬USB ‫ﭘﺮوژه 31: ارﺗﺒﺎط دﻫﻲ‬




                                                                :‫ﺷﻤﺎﺗﻴﻚ‬




                             - ١٣٢ -
‫331 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬




                   ‫‪ Package‬ﭼﻴﭗ ‪ FT232BM‬از ﻧﻮع ‪ LQFP‬ﺑﻮده و ‪ Pin out‬آن ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬




          ‫ﭘﺲ از ﭘﻴﻜﺮﺑﻨﺪي ﺳﺨﺖ اﻓﺰاري ﻣﺪار ﻧﻴﺎز ﺑﻪ دراﻳﻮر دارد ﻛﻪ ﺗﻨﻈﻴﻢ آن در ‪ Win XP‬ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:‬




                                       ‫دراﻳﻮر ﺳﺨﺖ اﻓﺰار را ﻣﻲ ﺗﻮاﻧﻴﺪ از آدرس زﻳﺮ درﻳﺎﻓﺖ ﻧﻤﺎﻳﻴﺪ:‬   ‫1(‬



‫‪http://www.ftdichip.com/Drivers/VCP.htm‬‬




        ‫ﻓﺎﻳﻞ ﺑﺎرﮔﺬاري ﺷﺪه را در ﻳﻚ ﻣﺴﻴﺮ دﻟﺨﻮاه ‪ Unzip‬ﻛﻨﻴﺪ. )ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل: 00.00.2 ‪(E:\CDM‬‬        ‫2(‬




                                                      ‫- ٣٣١ -‬
‫431 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                         ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫ﺳﺨﺖ اﻓﺰار ﺧﻮد را ﺑﻪ ﻳﻜـﻲ از ﻛﺎﻧﻜﺘﻮرﻫـﺎي ‪ USB‬وﺻـﻞ ﻛﻨﻴـﺪ. در اﻳـﻦ ﺣﺎﻟـﺖ ﭘﻴـﺎم ‪Found New‬‬          ‫3(‬

‫‪ Hardware‬ﻇﺎﻫﺮ ﺷﺪه و ﭘﺲ از آن ﻛﺎدر ﻣﺤﺎوره ي ‪ Found New Hardware Wizard‬ﻧﻤﺎﻳﺶ داده ﻣﻲ‬

                                             ‫ﺷﻮد. ﮔﺰﻳﻨﻪ ي دوم را اﻧﺘﺨﺎب ﻛﺮده و ‪ Next‬را ﻛﻠﻴﻚ ﻛﻨﻴﺪ.‬




                          ‫در ﻛﺎدر ﺣﺎﺻﻞ ﻣﺴﻴﺮ دراﻳﻮر را وارد ﻛﺮده و ﺑﺮ روي ‪ Next‬ﻛﻠﻴﻚ ﻧﻤﺎﻳﻴﺪ.‬     ‫4(‬




                                                   ‫- ٤٣١ -‬
‫531 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                ‫ ‪       www.pnkavosh.com‬‬




‫در ﺻﻮرﺗﻲ ﻛﻪ وﻳﻨﺪوز ﺑﻪ ﻧﺤﻮي ﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه ﺑﺎﺷـﺪ ﻛـﻪ در ﺻـﻮرت ﻧﺼـﺐ دراﻳﻮرﻫـﺎي آزﻣـﺎﻳﺶ ﻧﺸـﺪه ﺗﻮﺳـﻂ‬

‫ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ، ﭘﻴﻐﺎﻣﻲ داده ﺷﻮد اﺧﻄﺎر زﻳﺮ اﻳﺠﺎد ﺷﺪه و در اﻳﻦ ﺣﺎﻟﺖ ﺑﺎ ﭼﺸﻢ ﭘﻮﺷﻲ از اﺧﻄﺎر ﺑﺮ روي ‪Continue‬‬

                                                                             ‫‪ Anyway‬ﻛﻠﻴﻚ ﻛﻨﻴﺪ.‬




                                                     ‫- ٥٣١ -‬
‫631 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




  ‫ﻛﺎدر زﻳﺮ ﻧﻤﺎﻳﺶ داده ﺷﺪه و ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻛﻪ وﻳﻨﺪوز در ﺣﺎل ﻛﭙﻲ ﻧﻤﻮدن ﻓﺎﻳﻞ ﻫﺎي ﻣﻮرد ﻧﻴﺎز ﻣﻲ ﺑﺎﺷﺪ.‬   ‫5(‬




                                                      ‫- ٦٣١ -‬
‫731 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
   ‫وﻳﻨﺪوز ﭘﻴﺎﻣﻲ ﻣﺒﻨﻲ ﺑﺮ اﺗﻤﺎم ﻣﻮﻓﻘﻴﺖ آﻣﻴﺰ ﻧﺼﺐ ﺳﺨﺖ اﻓﺰار داده و ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ‪ Finish‬اﻳﻦ ﭘﺮوﺳﻪ‬     ‫6(‬

                                                                                         ‫ﺗﻤﺎم ﻣﻲ ﺷﻮد.‬




‫‪) Device Manager‬در ﻣﺴﻴﺮ ‪ Control Panel\System‬ﺑﺮ روي زﺑﺎﻧﻪ ي ‪ (Hardware‬را ﺑﺎز ﻛﻨﻴـﺪ‬                 ‫7(‬

‫و درﺧﺖ ‪ Port‬را ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ]+[ ﻛﻨﺎر آن ﺑﺴﻂ دﻫﻴﺪ. ﻣﻼﺣﻈﻪ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ‪ COM‬ﻣﺠﺎزي ﺑﺎ ﻧﺎم ‪ COMx‬ﺑﻪ‬

‫ﻟﻴﺴﺖ اﻓﺰوده ﺷﺪه اﺳﺖ. از اﻳﻦ ﭘﺲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻄﺎﺑﻖ ﭘﺮوژه ي 21 اﻃﻼﻋﺎت را ﺑﻪ ‪ COMx‬ارﺳﺎل ﻳﺎ درﻳﺎﻓﺖ ﻛـﺮده‬

                                                   ‫و اﻃﻼﻋﺎت ارﺳﺎل ﺷﺪه را در ﺧﺮوﺟﻲ ﻣﺪار درﻳﺎﻓﺖ ﻛﻨﻴﺪ.‬




                                                      ‫- ٧٣١ -‬
P a g e | 138
        www.avr.ir                            www.pnkavosh.com 




                             - ١٣٨ -
‫931 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬



                                      ‫‪(TWI) I2C Bus‬‬



‫اﺳﺘﺎﻧﺪارد ‪ I2C‬در اواﻳﻞ دﻫﻪ 0891 ﺗﻮﺳﻂ ﺷﺮﻛﺖ ‪ Philips‬ﻃﺮاﺣﻲ ﺷﺪ. در اﺑﺘـﺪا اﻳـﻦ ﭘﺮوﺗﻜـﻞ ﺑـﻪ ﻣﻨﻈـﻮر اﻳﺠـﺎد‬

                  ‫روﺷﻲ ﺳﺎده ﺑﺮاي اﻳﺠﺎد ارﺗﺒﺎط ﭘﺮدازﻧﺪه ﺑﺎ ﺗﺮاﺷﻪ ﻫﺎي ﺟﺎﻧﺒﻲ در ﻳﻚ دﺳﺘﮕﺎه ﺗﻠﻮﻳﺰﻳﻮن اﺑﺪاع ﺷﺪ.‬

‫‪ I2C‬ﻃﺒﻖ ﺗﻌﺮﻳﻒ ﺷﺮﻛﺖ ﻓﻴﻠﻴﭙﺲ ﻣﺨﻔﻒ ‪ Inter-IC‬ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻴﺎﻧﮕﺮ ﻫﺪف آن ﻳﻌﻨﻲ ﻓـﺮاﻫﻢ آوردن ﻳـﻚ ﻟﻴﻨـﻚ‬

‫ارﺗﺒﺎﻃﻲ ﺑﻴﻦ ﻣﺪارات ﻣﺠﺘﻤﻊ ﻣﻲ ﺑﺎﺷﺪ. اﻣﺮوزه اﻳﻦ ﭘﺮوﺗﻜﻞ ﺑﻪ ﺻـﻮرت ﻋﻤـﻮﻣﻲ در ﺻـﻨﻌﺖ ﭘﺬﻳﺮﻓﺘـﻪ ﺷـﺪه اﺳـﺖ و‬

 ‫ﻛﺎرﺑﺮد آن از ﺳﻄﺢ ﺗﺠﻬﻴﺰات ﺻﻮﺗﻲ و ﺗﺼﻮﻳﺮي ﻧﻴﺰ ﻓﺮاﺗﺮ رﻓﺘﻪ اﺳﺖ. ﺑﻪ ﮔﻮﻧﻪ اي ﻛﻪ اﻣﺮوزه در ﺑـﻴﺶ از 0001 ﻧـﻮع‬

‫‪IC‬ﻣﺨﺘﻠﻒ ﺑﻪ ﻛﺎر ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ. ‪ I2C‬ﻓﻀﺎ را ﺣﻔﻆ ﻣﻲ ﻛﻨﺪ و ﺑﺎﻋﺚ ﻛﺎﻫﺶ ﭼﺸﻤﮕﻴﺮ ﻫﺰﻳﻨﻪ ي ﻧﻬﺎﻳﻲ ﻣﻲ ﺷـﻮد.‬

‫دو ﺧﻂ ارﺗﺒﺎﻃﻲ ﺑﻪ ﻣﻌﻨﻲ ‪ Track‬ﻫﺎي ﻣﺴﻲ ﻛﻤﺘﺮ و در ﻧﺘﻴﺠﻪ ﺑﺮد ﻣﺪار ﭼﺎﭘﻲ ﻛﻮﭼﻜﺘﺮ و ﺗﺴﺖ ﻋﻴﺐ ﻳﺎﺑﻲ ﺳـﺮﻳﻌﺘﺮ و‬

‫راﺣﺘﺘﺮ ﻣﻲ ﺑﺎﺷﺪ. ﻋﻼوه ﺑﺮ اﻳﻦ در اﻏﻠﺐ ﻣﻮارد ﺣﺴﺎﺳﻴﺖ ﻣﺪار اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻧﺴﺒﺖ ﺑﻪ ﺗﺪاﺧﻞ اﻣـﻮاج اﻟﻜﺘﺮوﻣﻐﻨﺎﻃﻴﺴـﻲ‬

                                                                  ‫و ﺗﺨﻠﻴﻪ ي اﻟﻜﺘﺮوﺳﺘﺎﺗﻴﻜﻲ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ.‬




                                                                          ‫ﺑﺮﺧﻲ از وﻳﮋﮔﻲ ﻫﺎي ﺑﺎس ‪I2C‬‬




      ‫1. ‪ I2C‬ﻳﻚ ﭘﺮوﺗﻜﻞ ﺳﺮﻳﺎل ﺳﻨﻜﺮون ﻣﻲ ﺑﺎﺷﺪ و ﻛﻼك آن ﻣﻲ ﺗﻮاﻧﺪ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﺗﻐﻴﻴﺮ ﻛﻨﺪ.‬

‫2. آدرس دﻫﻲ 7 ﺑﻴﺘﻲ )721 وﺳﻴﻠﻪ ي ﻣﺘﻔﺎوت ﺑﺮ روي ﺑﺎس( و ﻧﻴﺰ آدرس دﻫـﻲ 01 ﺑﻴﺘـﻲ در وﻳـﺮاﻳﺶ ﺟﺪﻳـﺪ اﻳـﻦ‬

                                                                     ‫اﺳﺘﺎﻧﺪارد )4201 وﺳﻴﻠﻪ ﺑﺮ روي ﺑﺎس(.‬




                                                        ‫- ٩٣١ -‬
‫041 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
‫3. ﺑﺎس ﺗﻨﻬﺎ ﺑﻪ دو ﺧﻂ ‪ SCL‬و ‪ SDA‬ﻧﻴﺎز دارد. ﺑﺮ روي ‪ SCL‬ﺗﻮﺳﻂ ‪ Master‬ﻛﻼك اﻳﺠﺎد ﻣـﻲ ﺷـﻮد و ‪SDA‬‬

                                ‫ﺧﻂ ‪ Data‬ي دو ﻃﺮﻓﻪ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺟﻬﺖ آن ﺗﻮﺳﻂ ‪ Master‬ﻛﻨﺘﺮل ﻣﻲ ﺷﻮد.‬

‫4. ﺑﺮ روي ﺑﺎس اﻃﻼﻋﺎت 8 ﺑﻴﺘﻲ ﺑﻪ ﺻﻮرت دو ﺟﻬﺘﻪ ﺑﺎ ﻧﺮخ ارﺳﺎل ﺣﺪاﻛﺜﺮ 004 ﻛﻴﻠﻮﺑﻴﺖ ﺑﺮ ﺛﺎﻧﻴـﻪ. )و 4.3 ﻣﮕﺎﺑﻴـﺖ‬

                                                                       ‫ﺑﺮ ﺛﺎﻧﻴﻪ در وﺿﻌﻴﺖ ‪(High Speed‬‬

                             ‫5. ﺗﻮاﻧﺎﻳﻲ دراﻳﻮ ﻧﻤﻮدن ﺗﺎ 004 ﭘﻴﻜﻮﻓﺎراد ﻇﺮﻓﻴﺖ ﺧﺎزﻧﻲ ﺗﺎ ﻓﺎﺻﻠﻪ ي ﺣﺪاﻛﺜﺮ 4 ﻣﺘﺮ.‬

‫6. ﺣﺬف ‪ Spike‬ﻫﺎي ﻧﺎﺧﻮاﺳﺘﻪ از ﺧﻂ ‪ SDA‬ﺑﺎ اﺳﺘﻔﺎده از ﻓﻴﻠﺘﺮ ﻣﻮﺟﻮد در ﭼﻴﭗ، ﺑـﻪ ﻃـﻮري ﻛـﻪ ﺳـﻴﮕﻨﺎل ﻫـﺎي‬

                                           ‫ورودي ﻛﻪ ﻋﺮض آن ﻫﺎ ﻛﻤﺘﺮ از 05 ﻧﺎﻧﻮﺛﺎﻧﻴﻪ ﺑﺎﺷﺪ، ﺣﺬف ﻣﻲ ﺷﻮﻧﺪ.‬

‫7. ﭘﻴﻦ ﻫﺎي ‪ SDA‬و ‪ SCL‬ﻣﺠﻬﺰ ﺑﻪ ﻛﻨﺘﺮل ﻛﻨﻨﺪه ي ‪ Slew Rate‬ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻛﺎراﻳﻲ ﺑـﺎس ‪ I2C‬را در ﻓﺮﻛـﺎﻧﺲ‬

‫ﻫﺎي ﺑﺎﻻ )ﻧﺰدﻳﻚ 004 ﻛﻴﻠﻮﻫﺮﺗﺰ( ﺑﻬﺒﻮد ﻣﻲ ﺑﺨﺸﺪ. ﻋﻤﻠﻜﺮد ﻛﻨﺘﺮل ﻛﻨﻨﺪه ﺑﻪ اﻳـﻦ ﺻـﻮرت اﺳـﺖ ﻛـﻪ ﻟﺒـﻪ ﻫـﺎي ﺗﻴـﺰ‬

           ‫ﺳﻴﮕﻨﺎل را ﺗﺎ ﺣﺪودي ﺻﺎف ﻛﺮده و در واﻗﻊ ﺑﺎ ﺣﺬف ﻫﺎرﻣﻮﻧﻴﻚ ﻫﺎي ﺑﺎﻻ ﺑﻪ ﻛﺎﻫﺶ ‪ EMI‬ﻛﻤﻚ ﻣﻲ ﻛﻨﺪ.‬

‫8. ﻋﺪم ﻧﻴﺎز ﺑﻪ ﻃﺮاﺣﻲ ﻣﺪار واﺳﻂ و راه اﻧﺪازي ﺑﺎس ﺗﻨﻬﺎ ﺑﺎ دو ﻣﻘﺎوﻣﺖ زﻳﺮا ﻛﻪ ﻣﺪار ﻛﻨﺘﺮل ﺑﺎس ﺑﻪ ﺻﻮرت ﻣﺠﺘﻤـﻊ‬

                                                                       ‫ﺑﺮ روي وﺳﻴﻠﻪ ي ‪ I2C‬ﻗﺮار ﻣﻲ ﮔﻴﺮد.‬




                                                                             ‫اﺻﻄﻼﺣﺎﺗﻲ در اﻳﻦ اﺳﺘﺎﻧﺪارد‬




‫‪ :Master‬وﺳﻴﻠﻪ اي اﺳﺖ ﻛﻪ ﺷﺮوع ﻛﻨﻨﺪه ي ارﺳﺎل اﻃﻼﻋﺎت و ﺗﻮﻟﻴﺪ ﻛﻨﻨـﺪه ي ﭘـﺎﻟﺲ ﻛـﻼك و ﭘﺎﻳـﺎن دﻫﻨـﺪه ي‬

                                                                                 ‫ارﺳﺎل اﻃﻼﻋﺎت ﻣﻲ ﺑﺎﺷﺪ.‬

                                          ‫‪ :Slave‬وﺳﻴﻠﻪ اي اﺳﺖ ﻛﻪ ﺗﻮﺳﻂ ‪ Master‬آدرس دﻫﻲ ﺷﺪه اﺳﺖ.‬

                                                ‫ﻓﺮﺳﺘﻨﺪه: وﺳﻴﻠﻪ اي ﻛﻪ اﻃﻼﻋﺎت را در ﺑﺎس داده ﻗﺮار ﻣﻲ دﻫﺪ.‬

                                                          ‫ﮔﻴﺮﻧﺪه: وﺳﻴﻠﻪ اي ﻛﻪ اﻃﻼﻋﺎت را از ﺑﺎس ﻣﻲ ﺧﻮاﻧﺪ.‬


                                                        ‫- ٠٤١ -‬
‫141 | ‪P a g e‬‬
         ‫    ‪www.avr.ir‬‬                           ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
     ‫‪ :Arbitration‬ﻣﻜﺎﻧﻴﺴﻤﻲ ﻛﻪ اﻃﻤﻴﻨﺎن ﻣﻲ دﻫﺪ ﻛﻪ اﮔﺮ ﺑﻴﺶ از ﻳﻚ ‪ Master‬ﻫﻤﺰﻣﺎن ﺑﺨﻮاﻫﻨﺪ ﺑﺎس را ﺑﻪ ﻛﻨﺘﺮل‬

                                    ‫ﺧﻮد درآورﻧﺪ، ﺗﻨﻬﺎ ﻳﻜﻲ از آن ﻫﺎ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﻣﻮﻓﻖ ﺷﻮد.‬




                                                                           ‫ﺳﻄﻮح ﺳﻴﮕﻨﺎل در ﺑﺎس ‪I2C‬‬



                                                  ‫ﺑﻪ ﻃﻮر ﻛﻠﻲ دو ﺳﻄﺢ ﺳﻴﮕﻨﺎل در اﻳﻦ اﺳﺘﺎﻧﺪارد وﺟﻮد دارد:‬

‫.1‬       ‫)1 ‪Float High (Logic‬‬
‫.2‬       ‫)0 ‪Drive Low (Logic‬‬




                ‫‪Float High‬‬                               ‫‪Drive Low‬‬




                                                      ‫- ١٤١ -‬
‫241 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                          ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫وﺿﻌﻴﺖ ‪ idle‬ﻳﺎ ﺑﻴﻜﺎري ﺑﺎس ﺑﺎ ﺳﻄﺢ ‪ Float High‬ﻣﺸﺨﺺ ﻣﻲ ﺷﻮد و ﺑﺎ ﺗﻮﺟﻪ ﺑﺎ اﻳﻦ ﻣﺴﺌﻠﻪ ﻧﻘﺶ ﻣﻘﺎوﻣﺖ ﻫﺎي‬

‫‪ Pull-up‬ﻣﺸﺨﺺ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻣﻘﺪار ﺗﻘﺮﻳﺒﻲ آن ﻫﺎ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺳﺮﻋﺖ ارﺗﺒﺎط ﺑﻪ ﻃﻮر ﺗﻘﺮﻳﺒﻲ از ﺷﻜﻞ زﻳـﺮ ﺑﺪﺳـﺖ‬

                                                                                           ‫ﻣﻲ آﻳﺪ:‬




‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ اﺳﺘﻔﺎده از ﻳﻚ ﻣﻘﺎوﻣـﺖ ‪ Pull-up‬ﻣﺸـﺘﺮك ﺑﺎﻋـﺚ اﻳﺠـﺎد ﻳـﻚ ﺑـﺎس‬

‫‪ Wired-AND‬ﻣﻲ ﺷﻮد، ﺑﺪﻳﻦ ﻣﻌﻨﺎ ﻛﻪ ﺑﺮاي ﺻﻔﺮ ﺷﺪن ﺑﺎس ﺗﻨﻬﺎ ﻻزم اﺳﺖ ﻛﻪ ﻳﻜﻲ از وﺳﺎﻳﻞ ﺧﻂ را ‪ Low‬ﻛﻨﺪ.‬




‫ﻫﺮ ﭼﻨﺪ ﺗﻜﻨﻴﻚ اراﺋـﻪ ﺷـﺪه در ﻣـﻮرد ‪ Open-collector‬ﺑـﻮدن و ﻣﻘﺎوﻣﺘﻬـﺎي ‪ Pull-up‬داراي ﻣﺰﻳـﺖ-‪Wired‬‬

‫‪ AND‬ﻣﻲ ﺑﺎﺷﺪ وﻟﻲ اﻳﻦ ﻣﻮﺿﻮع در ﻣﻮرد ﺧﻄﻮط ﻃﻮﻻﻧﻲ ﻛﻪ داراي ﻳﻚ ﻇﺮﻓﻴﺖ ﺧﺎزﻧﻲ ﻣـﻲ ﺑﺎﺷـﻨﺪ ﺑﺎﻋـﺚ اﻳﺠـﺎد‬

‫ﻳﻚ ﺛﺎﺑﺖ زﻣﺎﻧﻲ ‪ RC‬ﻣﻲ ﮔﺮدد ﻛﻪ ﺑﺮاي رﻓﻊ اﻳﻦ ﻣﻮﺿﻮع ﺑﻪ ﺟﺎي ﻣﻘﺎوﻣﺖ ﻣﻲ ﺗﻮان از ‪ Pull-up‬ﻓﻌﺎل و ﻳﺎ ﺑﺎﻓﺮﻫـﺎي‬




                                                    ‫- ٢٤١ -‬
‫341 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
‫وﻳﮋه اي ﻛﻪ ﺗﻮﺳﻂ ﺷﺮﻛﺖ ﻓﻴﻠﻴﭙﺲ اراﺋﻪ ﺷﺪه اﺳﺖ اﺳﺘﻔﺎده ﻧﻤﻮد. ﻛﺎﻫﺶ ﻣﻘﺎوﻣﺖ در ﺳـﻄﺢ ‪ High‬ﺑﻮﺳـﻴﻠﻪ ي ﻳـﻚ‬

                ‫ﺳﻮﻳﻴﭻ، ﺑﺎﻋﺚ ﺷﺎرژ ﺷﺮﻳﻊ ﺧﺎزن ﭘﺎرازﻳﺘﻲ ﺷﺪه و در ﻧﺘﻴﺠﻪ زﻣﺎن ﺻﻌﻮد و ﻧﺰول ﭘﺎﻟﺲ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ.‬




                                                                                  ‫وﺿﻌﻴﺖ ﻫﺎي ﺑﺎس ‪I2C‬‬




  ‫ﺑﺎس ‪ I2C‬داراي ﺗﻌﺪادي وﺿﻌﻴﺖ ﻳﺎ ﻋﻨﺼﺮ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ وﺿﻌﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﭼﻪ زﻣﺎﻧﻲ ﻳﻚ اﻧﺘﻘﺎل آﻏﺎز‬

            ‫ﺷﻮد، ﺧﺎﺗﻤﻪ ﻳﺎﺑﺪ، ﺗﺎﻳﻴﺪﻳﻪ ﮔﺮﻓﺘﻪ ﺷﻮد و ﻏﻴﺮه. ﺷﻤﺎي ﻛﻠﻲ اﻳﻦ ﻋﻨﺎﺻﺮ را در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ:‬




                ‫‪Start‬‬      ‫‪Stop‬‬       ‫‪Restart‬‬               ‫‪Data‬‬           ‫‪ACK/NACK‬‬




‫ﺷﺮاﻳﻂ آﻏﺎز ﻳﺎ ‪ :Start Condition‬از زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز اﻳﺠﺎد ﻣﻲ ﺷﻮد ﺗﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن، ﺑﺎس‬

                             ‫‪ Busy‬ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد. ﻧﻤﻮدار زﻣﺎﻧﻲ اﻳﺠﺎد اﻳﻦ وﺿﻌﻴﺖ ﺑﻪ اﻳﻦ ﺻﻮرت ﻣﻲ ﺑﺎﺷﺪ:‬




                                                        ‫- ٣٤١ -‬
‫441 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




  ‫ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ ‪ :Stop Condition‬ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎس آزاد ﺷﺪه و ﻣﻲ ﺗﻮاﻧﺪ ﺗﻮﺳﻂ ﻳﻚ ‪Device‬‬

                                                                   ‫دﻳﮕﺮ ﺣﺎﻟﺖ آﻏﺎز دﻳﮕﺮي اﻳﺠﺎد ﺷﻮد:‬




      ‫ﺷﺮاﻳﻂ ﺷﺮوع ﻣﺠﺪد ﻳﺎ ‪ :Restart Condition‬اﻳﻦ وﺿﻌﻴﺖ زﻣﺎﻧﻲ ﻛﺎرﺑﺮد دارد ﻛﻪ وﺳﻴﻠﻪ ﺑﺨﻮاﻫﺪ ﺑﺪون از‬

 ‫دﺳﺖ دادن ﻛﻨﺘﺮل ﺑﺎس، ﺷﺮاﻳﻂ آﻏﺎز دﻳﮕﺮي اﻳﺠﺎد ﻛﻨﺪ و ارﺗﺒﺎط ﺑﺎ ‪ Slave‬دﻳﮕﺮي را آﻏﺎز ﻛﻨﺪ. ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد‬

                                   ‫ﭼﻴﺰي ﺟﺰ ﻳﻚ ﺳﮕﻨﺎل ﺷﺮوع ﻛﻪ ﺑﻌﺪ از ﺳﻴﮕﻨﺎل ﭘﺎﻳﺎن آﻣﺪه اﺳﺖ ﻧﻤﻲ ﺑﺎﺷﺪ:‬




                                                     ‫- ٤٤١ -‬
‫541 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫وﺿﻌﻴﺖ ‪ :Data‬در اﻳﻦ ﺣﺎﻟﺖ 8 ﺑﻴﺖ اﻃﻼﻋﺎت ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد و ﻫﺮ ﺑﻴﺖ ﺑﺎ ﻳﻚ ﻛﻼك ﻫﻤﺮاﻫﻲ ﻣﻲ ﺷﻮد. ﺧﻂ‬

‫‪ SDA‬در ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﻛﻼك ﻣﻮﺟﻮد در ‪ SCL‬ﻧﻤﻮﻧﻪ ﺑﺮداري ﻣﻲ ﺷﻮد و ﻣﻘﺪار ﺻﻔﺮ ﻳﺎ ﻳﻚ ﻣﻨﻄﻘﻲ از ‪SDA‬‬

‫ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد. ﺑﻪ ﻣﻨﻈﻮر اﻳﻨﻜﻪ ﻣﻘﺪار ﺧﻮاﻧﺪه ﺷﺪه از ‪ SDA‬ﻣﻌﺘﺒﺮ ﺑﺎﺷﺪ ﺑﺎﻳﺪ ﻣﻘﺪار ‪ SDA‬در ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي‬

‫‪ SCL‬ﺗﻐﻴﻴﺮ ﻧﻜﻨﺪ و ﺑﻪ ﻃﻮر ﻛﻠﻲ وﺿﻌﻴﺖ ﺧﻂ ‪ SDA‬ﺗﻨﻬﺎ در ﺣﺎﻟﺘﻲ ﻛﻪ ‪ SCL‬ﺻﻔﺮ اﺳﺖ ﻣﺠﺎز ﺑﻪ ﺗﻐﻴﻴﺮ اﺳﺖ، ﺗﻨﻬﺎ‬

                                                               ‫اﺳﺘﺜﻨﺎ اﻳﻦ ﻗﻀﻴﻪ ﺷﺮاﻳﻂ آﻏﺎز و ﭘﺎﻳﺎن اﺳﺖ.‬




‫وﺿﻌﻴﺖ ‪ :ACK/NACK‬وﺳﻴﻠﻪ ي ﮔﻴﺮﻧﺪه ﭘﺲ از درﻳﺎﻓﺖ 8 ﺑﻴﺖ داده در ﺳﻴﻜﻞ ﻧﻬﻢ ﻛﻼك ﺑﺎ زﻣﻴﻦ ﻛﺮدن ﺧﻂ‬

‫‪ SDA‬ﺑﻪ ﻓﺮﺳﺘﻨﺪه ﭘﺎﺳﺦ ﻳﺎ ‪ Acknowledge‬ﻣﻲ دﻫﺪ. ﻳﻚ ﻣﺎﻧﺪن ﺧﻂ ‪ SDA‬در ﻛﻼك ﻧﻬﻢ ﻧﻮﻋﻲ ﻋﺪم ﺗﺼﺪﻳﻖ‬

                                ‫‪ Passive‬ﻣﻲ ﺑﺎﺷﺪ ﭼﺮا ﻛﻪ ﻣﻘﺎوﻣﺖ ‪ Pull-up‬ﺧﻂ داده را ﻳﻚ ﻧﮕﺎه ﻣﻲ دارد.‬




                                                     ‫- ٥٤١ -‬
‫641 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                    ‫ ‪       www.pnkavosh.com‬‬


                                                                                     ‫ﻗﺎﻟﺐ آدرس 7 ﺑﻴﺘﻲ‬

‫ﭘﺲ از ﻫﺮ ﺷﺮاﻳﻂ آﻏﺎز 7 ﺑﻴﺖ آدرس وﺳﻴﻠﻪ ي ﻣﻘﺼﺪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻌﺪ از ﺑﻴﺖ ﻫﻔﺘﻢ ﻳـﻚ ﺑﻴـﺖ ﺧﻮاﻧـﺪن ﻳـﺎ‬

‫ﻧﻮﺷﺘﻦ وﺟﻮد دارد. ﺻﻔﺮ ﺑﻮدن اﻳﻦ ﺑﻴﺖ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ‪ Master‬ﻗﺼﺪ ﻧﻮﺷﺘﻦ روي وﺳﻴﻠﻪ را دارد و ﻳﻚ ﺑﻮدن آن‬

                                                        ‫ﻧﺸﺎن دﻫﻨﺪه ي ﺧﻮاﻧﺪن از وﺳﻴﻠﻪ ي ﻣﻘﺼﺪ ﻣﻲ ﺑﺎﺷﺪ.‬




‫ﺑﻪ ﻃﻮر ﻛﻠﻲ وﺳﺎﻳﻞ ‪ I2C‬داراي ﻳﻚ آدرس 7 ﺑﻴﺘﻲ ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ اﻣﻜﺎن آدرس دﻫﻲ 821 وﺳﻴﻠﻪ ي ﻣﺨﺘﻠﻒ را ﻓﺮاﻫﻢ‬

‫ﻣﻲ ﻛﻨﺪ. از اﻳﻦ ﺗﻌﺪاد 61 آدرس رزرو ﺷﺪه ﻣﻲ ﺑﺎﺷﻨﺪ و در ﻧﺘﻴﺠﻪ ﺣﺪاﻛﺜﺮ 211 وﺳﻴﻠﻪ ﺑﺮ روي ﻳﻚ ﺑﺎس ﻗﺎﺑﻞ آدرس‬

‫دﻫﻲ ﻫﺴﺘﻨﺪ. آدرس ﺻﻔﺮ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺑﻮده و ﭘﺲ از ارﺳﺎل اﻳﻦ آدرس ﺗﻤﺎم ﻣﻴﻜﺮوﻫﺎﻳﻲ ﻛﻪ ﺑﺎ زﻣﻴﻦ ﻛﺮدن‬

‫‪ SDA‬ﺑﻪ ‪ Master‬ﭘﺎﺳﺦ دﻫﻨﺪ، داده ي 8 ﺑﻴﺘﻲ را درﻳﺎﻓﺖ ﺧﻮاﻫﻨﺪ ﻛﺮد. ﭘﻴﻐﺎﻣﻲ ﻛﻪ ﺑﺮاي ﻫﻤﻪ ‪ Slave‬ﻫﺎ ﻓﺮﺳﺘﺎده‬

‫ﻣﻲ ﺷﻮد ‪ Broadcast‬ﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد. اﻳﻦ ﻣﻲ ﺗﻮاﻧﺪ ﭘﻴﻐﺎﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺗﻮﺳﻂ ‪ Master‬ﺑﻪ ﺗﻤﺎﻣﻲ ‪ Slave‬ﻫﺎ دﺳﺘﻮر‬

                                                               ‫داده ﻣﻲ ﺷﻮد ﻛﻪ آن وﻇﻴﻔﻪ را اﻧﺠﺎم ﻣﻲ دﻫﻨﺪ.‬

‫ﻋﻼوه ﺑﺮ ﻣﺤﺪودﻳﺖ 211 آدرس، ﺗﻌﺪاد وﺳﺎﻳﻞ ﻣﺠﺎز روي ﺑﺎس ﺑﻮﺳﻴﻠﻪ ي ﻇﺮﻓﻴﺖ ﺧﺎزﻧﻲ 004 ﭘﻴﻜﻮﻓﺎراد ﻧﻴﺰ ﻣﺤﺪود‬

                                                                                               ‫ﻣﻲ ﺷﻮد.‬



                                                     ‫- ٦٤١ -‬
‫741 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                ‫ ‪       www.pnkavosh.com‬‬



                                                                                  ‫ﻳﻚ اﻧﺘﻘﺎل ﺳﺎده‬



      ‫ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ در ﺗﺼﻮﻳﺮ زﻳﺮ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ‪ Master‬ﻣﻲ ﺑﺎﺷﺪ و ﻣﻲ ﺧﻮاﻫﺪ اﻃﻼﻋﺎﺗﻲ را ﺑﻪ ﻳﻜﻲ از ‪ Slave‬ﻫﺎ‬

                                                                                        ‫ارﺳﺎل ﻛﻨﺪ:‬




‫در اﺑﺘﺪا ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﻳﻚ وﺿﻌﻴﺖ ﺷﺮوع روي ﺑﺎس اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ، اﻳﻦ ﺳﻴﮕﻨﺎل ﻫﻤﻪ ي ‪ Slave‬ﻫﺎ را ﻣﺘﻮﺟﻪ ﺑﺎس‬

‫ﻣﻲ ﻛﻨﺪ و ﭘﺲ از آن ‪ ،Master‬آدرس ‪ Slave‬اي را ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﺑﺎ آن ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﺪ را روي ﺑﺎس ﻣﻲ ﻓﺮﺳﺘﺪ‬

‫و در ﺑﻴﺖ ﻫﺸﺘﻢ آن ﻣﺸﺨﺺ ﻣﻲ ﺳﺎزد ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ اﻃﻼﻋﺎت را از آن ﺑﺨﻮاﻧﺪ ﻳﺎ روي آن ﺑﻨﻮﻳﺴﺪ. ﺳﭙﺲ ﺗﻤﺎم‬

‫‪ Slave‬ﻫﺎ آدرس را درﻳﺎﻓﺖ ﻛﺮده و ﺑﺎ آدرس ﺧﻮد ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﻨﺪ و وﺳﻴﻠﻪ اي ﻛﻪ آدرس ﺑﻪ آن ﺗﻌﻠﻖ داﺷﺘﻪ ﺑﺎﺷﺪ‬

‫ﺑﺎ زﻣﻴﻦ ﻛﺮدن ‪ SDA‬در ﻛﻼك ﻧﻬﻢ ﻳﻚ ﺳﻴﮕﻨﺎل ‪ ACK‬اﻳﺠﺎد ﻛﺮده و ﺑﻪ ‪ Master‬ﭘﺎﺳﺦ ﻣﻲ دﻫﺪ. ﺑﻪ ﻣﺤﺾ‬

‫درﻳﺎﻓﺖ ﺳﻴﮕﻨﺎل ﺗﺼﺪﻳﻖ ﺗﻮﺳﻂ ‪ Master‬ﺗﺒﺎدل اﻃﻼﻋﺎت ﺑﺎ ‪ Slave‬آﻏﺎز ﺷﺪه و در ﻧﻬﺎﻳﺖ ‪ ،Master‬ﻳﻚ وﺿﻌﻴﺖ‬

                                                ‫‪ Stop‬اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺑﻪ ﻣﻌﻨﻲ آزاد ﺷﺪن ‪ Bus‬ﻣﻲ ﺑﺎﺷﺪ.‬




                                                     ‫- ٧٤١ -‬
‫841 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬



                                                                   ‫درﮔﺎه ‪ TWI‬در ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ‪AVR‬‬




                                                                                 ‫واﺣﺪ ﺗﻮﻟﻴﺪ ﻧﺮخ ﺑﻴﺖ‬

‫اﻳﻦ ﻣﺎژول دوره ي ﺗﻨﺎوب ﺧﻂ ‪ SCL‬را در ﺣﺎﻟﺘﻲ ﻛﻪ ﺑﻪ ﺻﻮرت ‪ Master‬ﻋﻤﻞ ﻣﻲ ﻛﻨـﺪ، ﻛﻨﺘـﺮل ﻣـﻲ ﻧﻤﺎﻳـﺪ. اﻳـﻦ‬

‫ﻋﻤﻞ ﺑﻮﺳﻴﻠﻪ ي ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴﺘﺮ ‪ TWBR‬و ﺑﻴﺖ ﻫﺎي ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه در رﺟﻴﺴﺘﺮ ‪ TWSR‬اﻧﺠـﺎم ﻣـﻲ ﺷـﻮد.‬

‫ﻋﻤﻠﻜﺮد ‪ Slave‬ﺑﺴﺘﮕﻲ ﺑﻪ ﺗﻨﻈﻴﻤﺎت ﻧﺮخ ﺑﻴﺖ و ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ﻧﺪارد اﻣﺎ ﻓﺮﻛﺎﻧﺲ ‪ CPU‬در ‪ Slave‬ﺑﺎﻳﺪ ﺣﺪاﻗﻞ‬

                                             ‫61 ﺑﺮاﺑﺮ ﻓﺮﻛﺎﻧﺲ ‪ SCL‬ﺑﺎﺷﺪ ﻛﻪ از راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:‬




                                           ‫‪CPU Clock Frequency‬‬
                                 ‫= ‪f SCL‬‬
                                           ‫‪16 + 2(TWBR ) × 4TWPS‬‬




  ‫ﺗﻮﺟﻪ: در ﺣﺎﻟﺘﻲ ﻛﻪ ‪ TWI‬ﺑﻪ ﺻﻮرت ‪ Master‬ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ﺑﺎﻳﺪ ﻣﻘﺪار ‪ TWBR‬ﺑﺰرﮔﺘﺮ و ﻳﺎ ﻣﺴﺎوي 01 ﺑﺎﺷﺪ،‬

                            ‫در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻤﻜﻦ اﺳﺖ ‪ Master‬ﻛﻼك اﺷﺘﺒﺎه روي ﺧﻂ ‪ SCL‬ﺗﻮﻟﻴﺪ ﻛﻨﺪ.‬




                                                                                  ‫رﺟﻴﺴﺘﺮﻫﺎي ‪TWI‬‬




    ‫ﺑﺨﺶ ‪ TWI‬داراي ﭘﻨﺞ رﺟﻴﺴﺘﺮ ﺑﻪ ﻧﺎم ﻫﺎي ‪ TWDR ،TWSR ،TWCR ،TWBR‬و ‪ TWAR‬ﻣﻲ ﺑﺎﺷﺪ.‬




                                                      ‫- ٨٤١ -‬
‫941 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬



                                                                                ‫‪:TWI Bit Rate Register‬‬




                    ‫‪Bit‬‬          ‫7‬       ‫6‬       ‫5‬          ‫4‬      ‫3‬        ‫2‬       ‫1‬     ‫0‬
                 ‫‪TWBR‬‬                                    ‫]0:7[‪TWBR‬‬



                  ‫اﻳﻦ رﺟﻴﺴﺘﺮ ﻓﺮﻛﺎﻧﺲ ‪ SCL‬را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ و ﻣﻘﺪار آن ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ راﺑﻄﻪ ي زﻳﺮ ﺑﺪﺳﺖ ﻣﻲ آﻳﺪ:‬



                                        ‫‪CPU Clock Frequency - 16 × f SCL‬‬
                               ‫= ‪TWBR‬‬
                                               ‫‪2 × f SCK × 4TWPS‬‬




             ‫ﻣﺜﺎل1: )ﺗﻌﻴﻴﻦ ‪ TWBR‬ﺑﺎ ﻛﺮﻳﺴﺘﺎل 8 ﻣﮕﺎﻫﺮﺗﺰ و ﻓﺮﻛﺎﻧﺲ ‪ SCK‬ﺑﺮاﺑﺮ 001 ﻛﻴﻠﻮﻫﺮﺗﺰ و 0 = ‪(TWPS‬‬



                                             ‫000001 × 61 − 0000008‬
                                    ‫= ‪TWBR‬‬                         ‫23 =‬
                                                ‫04 × 000001 × 2‬



                                                                                ‫‪:TWI Control Register‬‬




      ‫‪TWC‬‬
                     ‫7‬          ‫6‬            ‫5‬             ‫4‬           ‫3‬            ‫2‬     ‫1‬     ‫0‬
         ‫‪R‬‬
                  ‫‪TWIN‬‬       ‫‪TWE‬‬        ‫‪TWST‬‬             ‫‪TWST‬‬      ‫‪TWW‬‬            ‫‪TWE‬‬         ‫‪TWI‬‬
      ‫ﻧﺎم ﺑﻴﺖ‬                                                                             ‫-‬
                     ‫‪T‬‬          ‫‪A‬‬            ‫‪A‬‬            ‫‪O‬‬            ‫‪C‬‬            ‫‪N‬‬           ‫‪E‬‬



                  ‫اﻳﻦ رﺟﻴﺴﺘﺮ وﻇﻴﻔﻪ ي ﻛﻨﺘﺮل ‪ TWI‬را ﺑﺮ ﻋﻬﺪه دارد و ﻋﻤﻠﻜﺮد ﺑﻴﺖ ﻫﺎي آن ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:‬

                                                         ‫- ٩٤١ -‬
‫051 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬



‫‪ :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‬ﺷﺪن، اﻳﺠﺎد ﻳـﻚ‬

‫ﺷﺮاﻳﻂ آﻏﺎز ﻣﻲ ﻛﻨﺪ. ﺳﺨﺖ اﻓﺰار ﺑﺎس را ﭼﻚ ﻛﺮده و در ﺻﻮرﺗﻲ ﻛﻪ آزاد ﺑﺎﺷﺪ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز ﻣﻲ ﻛﻨـﺪ، در‬




                                                     ‫- ٠٥١ -‬
‫151 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﺎژول ‪ TWI‬ﻣﻨﺘﻈﺮ ﺗﺸﺨﻴﺺ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن روي ﺑﺎس ﻣﻲ ﺷﻮد و ﭘﺲ از آن ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷـﺮاﻳﻂ‬

    ‫آﻏﺎز ﻛﻨﺘﺮل ﺑﺎس را ﺑﻪ دﺳﺖ ﻣﻲ ﮔﻴﺮد. ﺑﻴﺖ ‪ TWSTA‬ﺑﺎﻳﺪ ﺑﻌﺪ از اﻳﺠﺎد ﺷﺮاﻳﻂ آﻏﺎز ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﭘﺎك ﺷﻮد.‬




‫‪ TWEA :TWI Enable Acknowledge Bit‬اﻳﺠﺎد ﭘﺎﻟﺲ ﺗﺼﺪﻳﻖ ﻳﺎ ‪ Acknowledge‬را ﻛﻨﺘﺮل ﻣﻲ ﻛﻨـﺪ.‬

                                  ‫اﮔﺮ روي اﻳﻦ ﺑﻴﺖ ﻳﻚ ﻧﻮﺷﺘﻪ ﺷﻮد ﭘﺎﻟﺲ ‪ ACK‬در ﺷﺮاﻳﻂ زﻳﺮ اﻳﺠﺎد ﻣﻲ ﺷﻮد:‬




                                   ‫ﭘﺲ از اﻳﻨﻜﻪ ‪ Slave‬آدرس ﻣﺮﺑﻮط ﺑﻪ ﺧﻮدش را درﻳﺎﻓﺖ ﻛﺮده ﺑﺎﺷﺪ.‬       ‫1.‬

                ‫ﻣﺎداﻣﻴﻜﻪ ﺑﻴﺖ ‪ TWGCE‬در ‪ TWAR‬ﻳﻚ ﺑﻮده و ﻳﻚ ﻓﺮاﺧﻮان ﻋﻤﻮﻣﻲ درﻳﺎﻓﺖ ﺷﺪه ﺑﺎﺷﺪ.‬             ‫2.‬

                                            ‫ﻳﻚ ﺑﺎﻳﺖ داده در ‪ Master‬ﻳﺎ ‪ Slave‬درﻳﺎﻓﺖ ﺷﺪه ﺑﺎﺷﺪ.‬       ‫3.‬




‫‪ :TWI Interrupt Flag‬اﻳﻦ ﺑﻴﺖ ﭘﺲ از اﺗﻤﺎم ﻫﺮ ﻳﻚ از وﻇﺎﻳﻒ ‪ TWI‬ﻳﻚ ﺷﺪه و در ﺻـﻮرﺗﻲ ﻛـﻪ وﻗﻔـﻪ ي‬

‫ﺳﺮاﺳﺮي و ﺑﻴﺖ ‪ TWIE‬ﻳﻚ ﺑﺎﺷﻨﺪ ﺑﻪ ﺑﺮدار وﻗﻔﻪ ي ‪ TWI‬ﭘﺮش ﻣـﻲ ﻛﻨـﺪ. اﻳـﻦ ﺑﻴـﺖ ﭘـﺲ از اﺟـﺮاي ‪ ISR‬ﺑـﻪ‬

                            ‫ﺻﻮرت ﺳﺨﺖ اﻓﺰاري ﭘﺎك ﻧﻤﻲ ﺷﻮد و ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﭘﺎك ﺷﻮد.‬

‫ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﭘﺮﭼﻢ ‪ TWINT‬ﻳﻚ ﺷﻮد، ﻧﺮم اﻓﺰار ﺑﺎﻳﺪ ﻣﺤﺘﻮﻳﺎت ﺗﻤﺎم رﺟﻴﺴﺘﺮﻫﺎﻳﻲ را ﻛﻪ ﺑﺮاي وﻇﻴﻔﻪ ي ﺑﻌﺪي ﻧﻴـﺎز‬

‫اﺳﺖ )ﻣﺜﻞ ‪ (TWDR‬ﺗﻨﻈﻴﻢ ﻛﺮده و ﭘﺲ از آن ﻫﻤﺰﻣﺎن ﺑﺎ ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴـﺘﺮ ‪ ،TWCR‬ﭘـﺮﭼﻢ ‪ TWINT‬را ﭘـﺎك‬

‫ﻛﻨﺪ ﺗﺎ ﻣﺎژول ‪ TWI‬ﺷﺮوع ﺑﻪ اﻧﺠﺎم وﻇﻴﻔﻪ ي ﺑﻌﺪي ﻧﻤﺎﻳـﺪ. ﻣﺎداﻣﻴﻜـﻪ ﻛـﻪ ﭘـﺮﭼﻢ ‪ TWINT‬ﻳـﻚ اﺳـﺖ ‪ SCL‬در‬

                 ‫وﺿﻌﻴﺖ ﺻﻔﺮ ﺑﺎﻗﻲ ﻣﻲ ﻣﺎﻧﺪ و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﻧﺸﻮد ‪ TWI‬ﻫﻴﭻ ﻋﻤﻠﻲ اﻧﺠﺎم ﻧﺨﻮاﻫﺪ داد.‬




                                                                           ‫‪:TWI Status Register‬‬




                                                       ‫- ١٥١ -‬
‫251 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                       ‫ ‪       www.pnkavosh.com‬‬
          ‫‪TWS‬‬
                           ‫7‬     ‫6‬       ‫5‬              ‫4‬           ‫3‬       ‫2‬        ‫1‬             ‫0‬
                ‫‪R‬‬
                      ‫‪TWS‬‬      ‫‪TWS‬‬      ‫‪TWS‬‬     ‫‪TWS‬‬                ‫‪TWS‬‬              ‫‪TWPS‬‬      ‫‪TWPS‬‬
          ‫ﻧﺎم ﺑﻴﺖ‬                                                           ‫-‬
                           ‫7‬     ‫6‬       ‫5‬              ‫4‬           ‫3‬                ‫1‬             ‫0‬



   ‫]0:1[‪ :TWI Prescaler Bits‬اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﻘﺪار ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ‬

                                                                                                   ‫ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد:‬



                               ‫‪TWPS‬‬     ‫‪TWPS‬‬
                                                        ‫ﻣﻘﺪار ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه‬
                                ‫1‬           ‫0‬
                                ‫0‬           ‫0‬                       ‫1‬

                                ‫0‬           ‫1‬                       ‫4‬

                                ‫1‬           ‫0‬                      ‫61‬

                                ‫1‬           ‫1‬                      ‫46‬




  ‫]3:7[‪ :TWI Status‬اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻧﻤﺎﻳﺎﻧﮕﺮ وﺿﻌﻴﺖ ‪ TWI‬ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ در ﺑﺮرﺳﻲ ‪ Mode‬ﻫﺎي ﻛﺎري ﻋﻤﻠﻜﺮد‬

                                                                                         ‫آن ﻫﺎ ﺑﺮرﺳﻲ ﺧﻮاﻫﺪ ﺷﺪ.‬




                                                                                     ‫‪:TWI Data Register‬‬




                     ‫‪Bit‬‬            ‫7‬   ‫6‬       ‫5‬           ‫4‬           ‫3‬       ‫2‬        ‫1‬     ‫0‬
                    ‫‪TWDR‬‬                                ‫]0:7[‪TWDR‬‬


                                                         ‫- ٢٥١ -‬
‫351 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
 ‫در ﺣﺎﻟﺖ اﻧﺘﻘﺎل، ‪ TWDR‬ﻣﺤﺘﻮي ﺑﺎﻳﺖ ﺑﻌﺪي اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ ارﺳﺎل ﺷﻮد و در ﺣﺎﻟﺖ درﻳﺎﻓﺖ ﺷﺎﻣﻞ آﺧﺮﻳﻦ ﺑﺎﻳﺖ‬

     ‫درﻳﺎﻓﺘﻲ اﺳﺖ. اﻳﻦ رﺟﻴﺴﺘﺮ ﺗﻨﻬﺎ در ﺣﺎﻟﺘﻲ ﻛﻪ ‪ TWI‬در ﺣﺎل اﻧﺘﻘﺎل اﻃﻼﻋﺎت ﻧﺒﺎﺷﺪ و ﭘﺮﭼﻢ ‪ TWINT‬ﻳﻚ ﺷﺪه‬

                                                                               ‫ﺑﺎﺷﺪ، ﻗﺎﺑﻞ ﻧﻮﺷﺘﻦ اﺳﺖ.‬




     ‫‪ :TWI (Slave) Address Register‬اﻳﻦ رﺟﻴﺴﺘﺮ آدرس ‪ Slave‬در وﺿﻌﻴﺖ ﻫﺎي ‪ ST‬و ‪ SR‬ﻣﻲ ﺑﺎﺷﺪ.‬




      ‫‪TWA‬‬
                    ‫7‬        ‫6‬       ‫5‬         ‫4‬                 ‫3‬    ‫2‬        ‫1‬          ‫0‬
        ‫‪R‬‬
                  ‫‪TWA‬‬      ‫‪TWA‬‬     ‫‪TWA‬‬       ‫‪TWA‬‬           ‫‪TWA‬‬       ‫‪TWA‬‬     ‫‪TWA‬‬      ‫‪TWGC‬‬
      ‫ﻧﺎم ﺑﻴﺖ‬
                    ‫6‬        ‫5‬       ‫4‬         ‫3‬                 ‫2‬    ‫1‬        ‫0‬          ‫‪E‬‬



‫‪ :TWI General Call Recognition Enable‬آدرس 00‪ 0x‬ﻣﺮﺑﻮط ﺑﻪ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺑﻮده و ﺗﺸﺨﻴﺺ‬

                                            ‫آن ﺗﻮﺳﻂ ﺳﺨﺖ اﻓﺰار ﻣﻨﻮط ﺑﻪ ﻳﻚ ﺑﻮدن ‪ TWGCE‬ﻣﻲ ﺑﺎﺷﺪ.‬




                           ‫]1:7[‪ :TWI (Slave) Address‬اﻳﻦ 7 ﺑﻴﺖ آدرس ‪ Slave‬را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻨﺪ.‬




                                     ‫ﻧﺎم ﮔﺬاري ﻫﺎي زﻳﺮ ﺑﻪ ﺻﻮرت ﻗﺮارداد در اداﻣﻪ اﺳﺘﻔﺎده ﺧﻮاﻫﻨﺪ ﺷﺪ:‬

‫:‪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‬‬

                                                       ‫- ٣٥١ -‬
‫451 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
‫:‪Data‬‬        ‫‪8-bit data byte‬‬
‫:‪P‬‬           ‫‪STOP condition‬‬
‫:‪SLA‬‬         ‫‪Slave Address‬‬




                                                                          ‫‪ Mode‬ﻫﺎي ﻋﻤﻠﻜﺮد ‪:TWI‬‬



‫.1‬              ‫)‪Master Transmitter (MT‬‬
‫.2‬              ‫)‪Master Receiver (MR‬‬
‫.3‬              ‫)‪Slave Transmitter (ST‬‬
‫.4‬              ‫)‪Slave Receiver (SR‬‬



                                                               ‫‪(MT) Master Transmitter‬‬

‫در اﻳﻦ ‪ Mode‬اﺑﺘﺪا ﺗﻮﺳﻂ ‪ Master‬ﻳﻚ وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه و ﺑﻠﻮك آدرﺳﻲ ﻛﻪ در اداﻣﻪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷـﻮد‬

‫ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ‪ Master‬ﮔﻴﺮﻧﺪه ﻳﺎ ﻓﺮﺳﺘﻨﺪه اﺳﺖ. اﮔـﺮ ﭘـﺲ از اﻳﺠـﺎد ﺣﺎﻟـﺖ ﺷـﺮوع ‪ SLA+W‬ارﺳـﺎل ﮔـﺮدد‬

             ‫‪ Master‬وارد ﺣﺎﻟﺖ ارﺳﺎل ﺷﺪه و در ﺻﻮرﺗﻲ ﻛﻪ ‪ SLA+R‬ارﺳﺎل ﺷﻮد وارد ﺣﺎﻟﺖ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮد.‬

                                          ‫ﺷﺮاﻳﻂ آﻏﺎز ﺑﺎ ﻣﻘﺪار دﻫﻲ ‪ TWCR‬ﺑﻪ ﺻﻮرت زﻳﺮ اﻳﺠﺎد ﻣﻲ ﮔﺮدد:‬



      ‫‪TWC‬‬
                      ‫7‬         ‫6‬         ‫5‬            ‫4‬        ‫3‬           ‫2‬      ‫1‬     ‫0‬
         ‫‪R‬‬
                    ‫‪TWIN‬‬       ‫‪TWE‬‬       ‫‪TWST‬‬        ‫‪TWST‬‬      ‫‪TWW‬‬        ‫‪TWE‬‬          ‫‪TWI‬‬
      ‫ﻧﺎم ﺑﻴﺖ‬                                                                      ‫-‬
                      ‫‪T‬‬         ‫‪A‬‬         ‫‪A‬‬           ‫‪O‬‬         ‫‪C‬‬           ‫‪N‬‬            ‫‪E‬‬
        ‫ﻣﻘﺪار‬         ‫1‬        ‫‪X‬‬          ‫1‬            ‫0‬        ‫‪X‬‬           ‫1‬      ‫0‬    ‫‪X‬‬




                                                     ‫- ٤٥١ -‬
‫551 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                      ‫ ‪       www.pnkavosh.com‬‬
                                      ‫‪ TWIE‬ﻓﻌﺎل ﺳﺎز وﻗﻔﻪ ي ‪ TWI‬ﺑﻮده و ﻣﻘﺪار آن اﺧﺘﻴﺎري ﻣﻲ ﺑﺎﺷﺪ.‬

                                     ‫‪ TWEN‬ﻓﻌﺎل ﺳﺎز ‪ TWI‬ﺑﻮده و در ﻧﺘﻴﺠﻪ ﺑﺎﻳﺪ ﻣﻘﺪار ﻳﻚ داﺷﺘﻪ ﺑﺎﺷﺪ.‬

‫‪ TWWC‬ﻛﻪ ﻳﻚ ﺑﻴﺖ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ در اﻳﻦ ﺣﺎﻟﺖ ﺻﻔﺮ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد زﻳﺮا ﻧﺮم اﻓﺰار ﻫﻨﻮز ﻣﻘـﺪاري را را‬

                         ‫روي ‪ TWDR‬ﻧﻨﻮﻧﺸﺘﻪ اﺳﺖ و ﺑﻨﺎﺑﺮاﻳﻦ ‪ Collision‬ﻳﺎ ﺗﺼﺎدﻣﻲ ﻧﻴﺰ ﭘﻴﺶ ﻧﻴﺎﻣﺪه اﺳﺖ.‬

                               ‫‪ TWSTO‬ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا در اﻳﻨﺠﺎ ﻧﻤﻲ ﺧﻮاﻫﻴﻢ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن اﻳﺠﺎد ﺷﻮد.‬

‫‪ TWSA‬ﻳﻚ ﺑﻮده ﺗﺎ ﻣﺎژول ‪ TWI‬در ﺻﻮرت آزاد ﺑﻮدن ﺑﺎس، ﺷﺮاﻳﻂ آﻏـﺎز را اﻳﺠـﺎد ﻛـﺮده و در ﻏﻴـﺮ اﻳﻨﺼـﻮرت‬

                                                                    ‫ﻣﻨﺘﻈﺮ ﺗﺸﺨﻴﺺ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎﺷﺪ.‬

‫‪ TWEA‬ﻣﻘﺪاري ﺑﻲ اﻫﻤﻴﺖ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا ﺑﺎ ﻓﺮض ‪ Set‬ﻛﺮدن آن در ﺷﺮاﻳﻂ آﻏﺎز ﻫﻴﭻ ﮔـﺎه ‪ ACK‬ﻧﻴـﺎز ﻧﺒـﻮده و‬

                                                                                      ‫اﻳﺠﺎد ﻧﻴﺰ ﻧﻤﻲ ﺷﻮد.‬

    ‫‪ TWINT‬ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﭘﺎك ﻣﻲ ﺷﻮد ﺗﺎ ‪ TWI‬ﺷﺮوع ﺑﻪ اﻧﺠﺎم ﻓﺮﻣﺎن داده ﺷﺪه ﺗﻮﺳﻂ رﺟﻴﺴﺘﺮ ‪ TWCR‬ﻛﻨﺪ.‬




‫ﭘﺲ از اﺟﺮاي ﺗﻨﻈﻴﻤﺎت ﻓﻮق در ﺻـﻮرت آزاد ﺑـﻮدن ﺑـﺎس ﻣـﺎژول ‪ TWI‬ﺷـﺮاﻳﻂ آﻏـﺎز را اﻳﺠـﺎد ﻛـﺮده و در ﻏﻴـﺮ‬

‫اﻳﻨﺼﻮرت ﻣﻨﺘﻄﺮ آزاد ﺷﺪن ﺑﺎس ﺷﺪه و ﺑﻪ ﻣﺤﺾ ﺗﺸﺨﻴﺺ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻛﻨﺘﺮل ﺑﺎس را ﺑﻪ دﺳﺖ ﮔﺮﻓﺘﻪ و ﺷﺮاﻳﻂ‬

‫آﻏﺎز را اﻳﺠﺎد ﻣﻲ ﻧﻤﺎﻳﺪ، ﭘﺲ از آن ﭘﺮﭼﻢ ‪ TWINT‬ﻳﻚ ﺷـﺪه و ﻛـﺪ وﺿـﻌﻴﺖ ﻣﻮﺟـﻮد در ‪ TWSR‬ﺑﺮاﺑـﺮ 80‪0x‬‬

‫ﺧﻮاﻫﺪ ﺷﺪ. ﺑﺮاي ورود ﺑﻪ وﺿﻌﻴﺖ ‪ MT‬ﺑﺎﻳﺪ روي ‪ TWDR‬ﻣﻘﺪار ‪ SLA+W‬ﻧﻮﺷﺘﻪ ﺷﺪه و ﭘﺲ از آن ﺑﺎ ﻧﻮﺷـﺘﻦ‬

‫ﻳﻚ روي ‪ TWINT‬آن را ﭘﺎك ﻛﺮده ﺗـﺎ ﻣﺮﺣﻠـﻪ ي ﺑﻌـﺪ آﻏـﺎز ﺷـﻮد. ﭘـﺲ از ﻧﻮﺷـﺘﻦ ‪ SLA+W‬روي ‪TWDR‬‬

                                                               ‫ﺗﻨﻈﻴﻤﺎت ‪ TWCR‬ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:‬



      ‫‪TWC‬‬
                    ‫7‬        ‫6‬           ‫5‬             ‫4‬            ‫3‬           ‫2‬      ‫1‬     ‫0‬
         ‫‪R‬‬
      ‫ﻧﺎم ﺑﻴﺖ‬    ‫‪TWIN‬‬      ‫‪TWE‬‬       ‫‪TWST‬‬            ‫‪TWST‬‬        ‫‪TWW‬‬          ‫‪TWE‬‬      ‫-‬   ‫‪TWI‬‬

                                                     ‫- ٥٥١ -‬
‫651 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬
                    ‫‪T‬‬           ‫‪A‬‬          ‫‪A‬‬             ‫‪O‬‬          ‫‪C‬‬           ‫‪N‬‬             ‫‪E‬‬
       ‫ﻣﻘﺪار‬        ‫1‬           ‫‪X‬‬          ‫0‬              ‫0‬         ‫‪X‬‬           ‫1‬      ‫0‬      ‫‪X‬‬



‫ﺗﻔﺎوت ﺑﺎ ﻣﺮﺣﻠﻪ ي ﻗﺒﻞ اﻳﻦ اﺳﺖ ﻛﻪ از آﻧﺠﺎﻳﻲ ﻛﻪ ﻧﻴﺎز ﺑﻪ ﺷﺮاﻳﻂ آﻏﺎز وﺟﻮد ﻧﺪارد ﺑﻴﺖ ‪ TWSTA‬ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﺪ.‬

‫ﺑﺎ ﻓﺮﺳﺘﺎده ﺷﺪن ‪ SLA+W‬و درﻳﺎﻓﺖ ‪ ACK‬ﻣﺠﺪدا ﺑﻴﺖ ‪ TWINT‬ﻳﻚ ﺷﺪه و در اﻳﻦ ﺷﺮاﻳﻂ ﻳﻜﻲ از ﭼﻨـﺪ ﻛـﺪ‬

‫02‪ 0x18 ،0x‬ﻳﺎ 83‪ 0x‬در ‪ TWSR‬ﻗﺮار ﻣﻲ ﮔﻴﺮد. در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﻣﻘﺪار ﺑﺮاﺑﺮ 81‪ 0x‬ﺑﺎﺷﺪ ﺑﺪﻳﻦ ﻣﻌﻨﺎﺳﺖ ﻛﻪ‬

‫آدرس ارﺳﺎل ﺷﺪه و ‪ ACK‬درﻳﺎﻓﺖ ﺷﺪه اﺳﺖ. ﭘﺲ از اﻳﻦ ﺑﺎﻳﺪ ﺑﻠﻮك داده ارﺳﺎل ﺷﻮد. ﻫﻤﺎﻧﻨـﺪ ﺣﺎﻟـﺖ ﻗﺒـﻞ اﺑﺘـﺪا‬

‫ﻣﻘﺪار ﻣﻮرد ﻧﻈﺮ در رﺟﻴﺴﺘﺮ ‪ TWDR‬ﻧﻮﺷﺘﻪ ﺷﺪه و ﺑﺎ ﭘﺎك ﻛـﺮدن ﺑﻴـﺖ ‪ TWINT‬داده ي 8 ﺑﻴﺘـﻲ ﺗﻮﺳـﻂ ‪TWI‬‬

‫ارﺳﺎل ﺧﻮاﻫﺪ ﺷﺪ. در ﺻﻮرﺗﻲ ﻛـﻪ رﺟﻴﺴـﺘﺮ ‪ TWDR‬ﺑﻌـﺪ از ﭘـﺎك ﻛـﺮدن ‪ TWINT‬ﻣﻘـﺪاردﻫﻲ ﺷـﻮد رﺟﻴﺴـﺘﺮ‬

‫‪ TWWC‬ﻳﻚ ﺷﺪه و اﻋﻼم ﻳﻚ ﺣﺎﻟﺖ ﺗﺼﺎدم را ﻣﻲ ﻛﻨﺪ. ﺗﻨﻈﻴﻤﺎت ‪ TWCR‬ﻫﻤﺎﻧﻨﺪ ﺣﺎﻟﺖ ﻗﺒﻞ ﺑـﻪ ﺻـﻮرت زﻳـﺮ‬

                                                                                             ‫ﺧﻮاﻫﺪ ﺑﻮد:‬



      ‫‪TWC‬‬
                    ‫7‬           ‫6‬          ‫5‬              ‫4‬         ‫3‬           ‫2‬      ‫1‬      ‫0‬
         ‫‪R‬‬
                 ‫‪TWIN‬‬         ‫‪TWE‬‬       ‫‪TWST‬‬            ‫‪TWST‬‬      ‫‪TWW‬‬         ‫‪TWE‬‬           ‫‪TWI‬‬
      ‫ﻧﺎم ﺑﻴﺖ‬                                                                          ‫-‬
                    ‫‪T‬‬           ‫‪A‬‬          ‫‪A‬‬             ‫‪O‬‬          ‫‪C‬‬           ‫‪N‬‬             ‫‪E‬‬
       ‫ﻣﻘﺪار‬        ‫1‬           ‫‪X‬‬          ‫0‬              ‫0‬         ‫‪X‬‬           ‫1‬      ‫0‬      ‫‪X‬‬



‫اﻳﻦ ﻣﺮﺣﻠﻪ ﺗﺎ اﺗﻤﺎم ارﺳﺎل ﺗﻤﺎم ﺑﺎﻳﺖ ﻫﺎي داده ﺗﻜﺮار ﻣﻲ ﺷﻮد و ﺳﺮاﻧﺠﺎم ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ ﺷﺮوع ﻣﺠـﺪد‬

                         ‫ﭘﺎﻳﺎن ﻣﻲ ﻳﺎﺑﺪ. ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺎ ﻣﻘﺪاردﻫﻲ رﺟﻴﺴﺘﺮ ‪ TWCR‬ﺑﻪ ﺻﻮرت زﻳﺮ اﻳﺠﺎد ﻣﻲ ﺷﻮد:‬



      ‫‪TWC‬‬           ‫7‬           ‫6‬          ‫5‬              ‫4‬         ‫3‬           ‫2‬      ‫1‬      ‫0‬

                                                        ‫- ٦٥١ -‬
‫751 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                          ‫ ‪       www.pnkavosh.com‬‬
         ‫‪R‬‬
                     ‫‪TWIN‬‬   ‫‪TWE‬‬       ‫‪TWST‬‬               ‫‪TWST‬‬           ‫‪TWW‬‬            ‫‪TWE‬‬               ‫‪TWI‬‬
      ‫ﻧﺎم ﺑﻴﺖ‬                                                                                       ‫-‬
                      ‫‪T‬‬      ‫‪A‬‬             ‫‪A‬‬                ‫‪O‬‬              ‫‪C‬‬              ‫‪N‬‬                 ‫‪E‬‬
       ‫ﻣﻘﺪار‬          ‫1‬     ‫‪X‬‬              ‫0‬                ‫1‬              ‫‪X‬‬                ‫1‬      ‫0‬       ‫‪X‬‬



                                               ‫و ﺑﺮاي اﻳﺠﺎد ﺷﺮاﻳﻂ ﺷﺮوع ﻣﺠﺪد ﺟﺪول زﻳﺮ را ﺧﻮاﻫﻴﻢ داﺷﺖ:‬



      ‫‪TWC‬‬
                      ‫7‬      ‫6‬             ‫5‬                ‫4‬               ‫3‬               ‫2‬      ‫1‬        ‫0‬
         ‫‪R‬‬
                     ‫‪TWIN‬‬   ‫‪TWE‬‬       ‫‪TWST‬‬               ‫‪TWST‬‬           ‫‪TWW‬‬            ‫‪TWE‬‬               ‫‪TWI‬‬
      ‫ﻧﺎم ﺑﻴﺖ‬                                                                                       ‫-‬
                      ‫‪T‬‬      ‫‪A‬‬             ‫‪A‬‬                ‫‪O‬‬              ‫‪C‬‬              ‫‪N‬‬                 ‫‪E‬‬
       ‫ﻣﻘﺪار‬          ‫1‬     ‫‪X‬‬              ‫1‬                ‫0‬              ‫‪X‬‬                ‫1‬      ‫0‬       ‫‪X‬‬



                                                ‫ﭘﺲ از اﻳﺠﺎد ﺷﺮاﻳﻂ ﭘﺎﻳﺎن 0‪ TWINT‬ﻳﻚ ﻧﻤﻲ ﺷﻮد.‬

‫ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد ﻣﻘﺪار رﺟﻴﺴﺘﺮ ‪ TWSR‬ﺑﺮاﺑﺮ 01‪ 0x‬ﺧﻮاﻫﺪ ﺑﻮد و اﻳﻦ ﻗﺎﺑﻠﻴﺖ ﺑﻪ ‪ Master‬اﺟـﺎزه‬

                                                         ‫ﺗﻐﻴﻴﺮ ‪ Slave‬را ﺑﺪون از دﺳﺖ دادن ﻛﻨﺘﺮل ﺑﺎس ﻣﻲ دﻫﺪ.‬



   ‫ﻣﻘﺎدﻳﺮ رﺟﻴﺴﺘﺮ ‪ TWSR‬در وﺿﻌﻴﺖ ﻫﺎي ﻣﺨﺘﻠﻒ ﺣﺎﻟﺖ ‪ Master Transmitter‬ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬




             ‫ﻣﻘﺪار‬                                                  ‫وﺿﻌﻴﺖ ﺑﻌﺪي ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻮﺳﻴﻠﻪ ي ‪ TWI‬اﻧﺠﺎم‬
                                  ‫ﻋﻤﻠﻜﺮد‬
          ‫‪TWSR‬‬                                                                        ‫ﺷﻮد‬

           ‫80‪0x‬‬                   ‫وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه اﺳﺖ.‬            ‫ارﺳﺎل ‪ SLA+W‬و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬

                                                                       ‫ارﺳﺎل ‪ SLA+W‬و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬
           ‫01‪0x‬‬              ‫وﺿﻌﻴﺖ ﺷﺮوع دوﺑﺎره اﻳﺠﺎد ﺷﺪه اﺳﺖ.‬
                                                                        ‫ارﺳﺎل ‪ SLA+R‬و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬



                                                          ‫- ٧٥١ -‬
‫851 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                      ‫ ‬                    ‫ ‪       www.pnkavosh.com‬‬
                                                                           ‫ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬

           ‫81‪0x‬‬     ‫ﺑﺎﻳﺖ ‪ SLA+W‬ارﺳﺎل ﺷﺪه و ‪ ACK‬درﻳﺎﻓﺖ ﺷﺪه اﺳﺖ.‬                               ‫اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد‬

                                                                                                    ‫اﻳﺠﺎد ﺣﺎﻟﺖ ﭘﺎﻳﺎن‬

                         ‫ﺑﺎﻳﺖ ‪ SLA+W‬ارﺳﺎل ﺷﺪه و ‪ ACK‬درﻳﺎﻓﺖ ﻧﺸﺪه‬                              ‫اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد‬
           ‫02‪0x‬‬
                                                                ‫اﺳﺖ.‬                                ‫اﻳﺠﺎد ﺣﺎﻟﺖ ﭘﺎﻳﺎن‬

                                                                           ‫ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬

           ‫82‪0x‬‬           ‫ﺑﺎﻳﺖ داده ارﺳﺎل ﺷﺪه و ‪ ACK‬درﻳﺎﻓﺖ ﺷﺪه اﺳﺖ.‬                          ‫اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد‬

                                                                                                    ‫اﻳﺠﺎد ﺣﺎﻟﺖ ﭘﺎﻳﺎن‬

                                                                           ‫ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬

           ‫03‪0x‬‬          ‫ﺑﺎﻳﺖ داده ارﺳﺎل ﺷﺪه و ‪ ACK‬درﻳﺎﻓﺖ ﻧﺸﺪه اﺳﺖ.‬                          ‫اﻳﺤﺎد ﺣﺎﻟﺖ ﺷﺮوع ﻣﺠﺪد‬

                                                                                                    ‫اﻳﺠﺎد ﺣﺎﻟﺖ ﭘﺎﻳﺎن‬

           ‫83‪0x‬‬                           ‫ﻛﻨﺘﺮل ﺑﺎس از دﺳﺖ رﻓﺘﻪ اﺳﺖ.‬      ‫ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع و ﺗﻼش ﺑﺮاي ﻛﻨﺘﺮل ﻣﺠﺪد آن‬




                            ‫ﻣﺜﺎل2: )ارﺳﺎل ﻋﺪد 77‪ 0x‬ﺑﻪ ‪ Slave‬ﺑﺎ آدرس 0‪ 0xA‬و ﺑﺎ ﻧﺮخ ﺑﻴﺖ 001 ﻛﻴﻠﻮﻫﺮﺗﺰ(‬



‫>‪#include <mega16.h‬‬
‫0000008 ‪#define xtal‬‬


‫)(‪void main‬‬
‫{‬


‫---- ‪//--- Start Condition and Transmitting SLA+W‬‬


    ‫‪TWBR = 32; // Bit rate = 100Khz‬‬
    ‫‪TWCR = 0xA4; // Transmit Start Condition‬‬

                                                                ‫- ٨٥١ -‬
P a g e | 159
        www.avr.ir                                         www.pnkavosh.com 


    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?
    {
                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



                                          - ١٥٩ -
‫061 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                    ‫ ‬                        ‫ ‪       www.pnkavosh.com‬‬
‫------------------------------------------------//‬


‫:‪error‬‬
    ‫;)1(‪while‬‬


‫}‬




                                                                                    ‫‪(MR) Master Receiver‬‬

‫در اﻳﻦ وﺿﻌﻴﺖ ‪ Master‬اﻃﻼﻋﺎت را از ‪ Slave‬درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و ﺑﺮاي اﻳﺠﺎد آن ﺑﺎﻳﺪ ﭘﺲ از اﻳﺠﺎد ﺷـﺮاﻳﻂ آﻏـﺎز‬

‫ﺑﺮ ﺧﻼف ﺣﺎﻟﺖ ﻗﺒﻞ ‪ SLA+R‬ﺑﻪ ‪ Slave‬ﻓﺮﺳﺘﺎده ﺷﻮد. در ﺻﻮرﺗﻲ ﻛﻪ ﺷﺮاﻳﻂ آﻏﺎز ﺑﻪ درﺳـﺘﻲ اﻳﺠـﺎد ﺷـﺪه ﺑﺎﺷـﺪ‬

‫ﺑﻴﺖ ‪ TWINT‬ﻳﻚ ﺷﺪه و ﻣﻘﺪار ‪ TWSR‬ﺑﺮاﺑﺮ 80‪ 0x‬ﻣﻲ ﺷـﻮد، ﺑـﺮاي ارﺳـﺎل ‪ SLA+R‬ﺑﺎﻳـﺪ ﻣﻘـﺪار آن را در‬

                                           ‫‪ TWDR‬ﺑﺎرﮔﺬاري ﻛﺮده و ﺑﺎ ﭘﺎك ﻛﺮدن ‪ TWINT‬آن را ارﺳﺎل ﻧﻤﻮد.‬

‫زﻣﺎﻧﻲ ﻛﻪ ‪ SLA+R‬ﻓﺮﺳﺘﺎده ﺷﻮد و ‪ ACK‬درﻳﺎﻓﺖ ﺷﻮد ﺑﻴـﺖ ‪ TWINT‬ﻳـﻚ ﺷـﺪه و در اﻳـﻦ ﺷـﺮاﻳﻂ ﻳﻜـﻲ از‬

                                             ‫ﻛﺪﻫﺎي 83‪ 0x40 ،0x‬ﻳﺎ 84‪ 0x‬ﻣﻤﻜﻦ اﺳﺖ در ‪ TWSR‬ﻗﺮار ﮔﻴﺮد:‬




            ‫ﻣﻘﺪار‬                                                       ‫وﺿﻌﻴﺖ ﺑﻌﺪي ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻮﺳﻴﻠﻪ ي ‪ TWI‬اﻧﺠﺎم‬
                                       ‫ﻋﻤﻠﻜﺮد‬
          ‫‪TWSR‬‬                                                                            ‫ﺷﻮد‬

           ‫80‪0x‬‬                        ‫وﺿﻌﻴﺖ ﺷﺮوع اﻳﺠﺎد ﺷﺪه اﺳﺖ.‬            ‫ارﺳﺎل ‪ SLA+R‬و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬

                                                                            ‫ارﺳﺎل ‪ SLA+R‬و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬
           ‫01‪0x‬‬                   ‫وﺿﻌﻴﺖ ﺷﺮوع دوﺑﺎره اﻳﺠﺎد ﺷﺪه اﺳﺖ.‬
                                                                           ‫ارﺳﺎل ‪ SLA+W‬و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬

           ‫83‪0x‬‬                         ‫ﻛﻨﺘﺮل ﺑﺎس از دﺳﺖ رﻓﺘﻪ اﺳﺖ.‬        ‫ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع و ﺗﻼش ﺑﺮاي ﻛﻨﺘﺮل ﻣﺠﺪد آن‬

           ‫04‪0x‬‬     ‫ﺑﺎﻳﺖ ‪ SLA+R‬ارﺳﺎل ﺷﺪه و ‪ ACK‬درﻳﺎﻓﺖ ﺷﺪه اﺳﺖ.‬              ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬ﻳﺎ ‪NACK‬‬

                         ‫ﺑﺎﻳﺖ ‪ SLA+R‬ارﺳﺎل ﺷﺪه و ‪ ACK‬درﻳﺎﻓﺖ ﻧﺸﺪه‬                             ‫اﻳﺤﺎد وﺿﻌﻴﺖ ﺷﺮوع ﻣﺠﺪد‬
           ‫84‪0x‬‬
                                                              ‫اﺳﺖ.‬                                 ‫اﻳﺠﺎد وﺿﻌﻴﺖ ﭘﺎﻳﺎن‬




                                                              ‫- ٠٦١ -‬
‫161 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬
           ‫05‪0x‬‬                  ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ACK‬‬      ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬ﻳﺎ ‪NACK‬‬

                                                                                  ‫اﻳﺤﺎد وﺿﻌﻴﺖ ﺷﺮوع ﻣﺠﺪد‬
           ‫85‪0x‬‬                ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪NACK‬‬
                                                                                        ‫اﻳﺠﺎد وﺿﻌﻴﺖ ﭘﺎﻳﺎن‬




‫در ﺻﻮرﺗﻲ ﻛﻪ ‪ SLA+R‬ارﺳﺎل ﺷﺪه و ‪ ACK‬درﻳﺎﻓﺖ ﺷﺪه ﺑﺎﺷﺪ ﺑﻌﺪ از ﻳـﻚ ﺷـﺪن ‪ TWINT‬داده ي درﻳﺎﻓـﺖ‬

‫ﺷﺪه در ‪ TWDR‬ﻣﻲ ﺗﻮاﻧﺪ ﺧﻮاﻧﺪه ﺷﻮد. اﻳﻦ ﻛﺎر ﺗﺎ درﻳﺎﻓﺖ آﺧﺮﻳﻦ ﺑﺎﻳـﺖ ﺗﻜـﺮار ﺷـﺪه و ﺑﻌـﺪ از آن ‪ Master‬ﺑـﺎ‬

‫ﻓﺮﺳﺘﺎدن ‪ NACK‬ﺑﻪ ‪ Slave‬اﻋﻼم ﻣﻲ ﻛﻨﺪ ﻛﻪ دﻳﮕﺮ ﻗﺼﺪ ﺧﻮاﻧﺪن از آن را ﻧـﺪارد و در ﻧﺘﻴﺠـﻪ ﻣـﻲ ﺗـﻮان ﻋﻤﻠﻴـﺎت‬

                                             ‫ﺧﻮاﻧﺪن را ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺷﺮاﻳﻂ ﺷﺮوع ﻣﺠﺪد ﻳﺎ ﭘﺎﻳﺎن ﻣﺘﻮﻗﻒ ﻧﻤﻮد.‬




                         ‫ﻣﺜﺎل 3: )ﺧﻮاﻧﺪن 2 ﺑﺎﻳﺖ داده از ‪ Slave‬ﺑﺎ آدرس 0‪ 0xA‬و ﻧﺮخ ﺑﻴﺖ 001 ﻛﻴﻠﻮﻫﺮﺗﺰ(‬



‫>‪#include <mega16.h‬‬
‫0000008 ‪#define xtal‬‬


‫;‪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‬‬
                                                         ‫- ١٦١ -‬
P a g e | 162
        www.avr.ir                                         www.pnkavosh.com 


    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 --------------


    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 ------



                                          - ١٦٢ -
P a g e | 163
        www.avr.ir                                                            www.pnkavosh.com 
    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);


}


                                                                         (SR) Slave Receiver

.‫ درﻳﺎﻓـﺖ ﻣـﻲ ﻛﻨـﺪ‬Master Transmitter ‫ ﺑﻮده و اﻃﻼﻋـﺎت را از‬Slave ،‫در اﻳﻦ وﺿﻌﻴﺖ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﮔﻴﺮﻧﺪه‬

‫ ﻳـﻚ ﺷـﻮد‬LSB ‫ ﻗـﺮار ﮔﻴـﺮد. و ﭼﻨﺎﻧﭽـﻪ ﺑﻴـﺖ‬TWAR ‫ در 7 ﺑﻴﺖ ﺑـﺎﻻي‬Slave ‫ﺑﺮاي ﺷﺮوع ﺑﻪ ﻛﺎر ﺑﺎﻳﺪ آدرس‬

     .‫ ﻗﺎدر ﺑﻪ ﭘﺎﺳﺨﮕﻮﻳﻲ ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﻧﻴﺰ ﺧﻮاﻫﺪ ﺑﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت آن را ﻧﺎدﻳﺪه ﺧﻮاﻫﺪ ﮔﺮﻓﺖ‬Master



                TWAR       7       6       5         4         3   2        1       0
                ‫ﻧﺎم ﺑﻴﺖ‬                    TWAR[7:1]                                X


                                                     - ١٦٣ -
‫461 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                       ‫ ‬                        ‫ ‪       www.pnkavosh.com‬‬



                                                                                     ‫‪ TWCR‬ﻣﻄﺎﺑﻖ زﻳﺮ ﻣﻘﺪار دﻫﻲ ﺷﻮد:‬



            ‫‪TWC‬‬
                           ‫7‬           ‫6‬             ‫5‬            ‫4‬              ‫3‬           ‫2‬       ‫1‬       ‫0‬
                 ‫‪R‬‬
                        ‫‪TWIN‬‬         ‫‪TWE‬‬            ‫‪TWST‬‬         ‫‪TWST‬‬        ‫‪TWW‬‬           ‫‪TWE‬‬             ‫‪TWI‬‬
            ‫ﻧﺎم ﺑﻴﺖ‬                                                                                   ‫-‬
                           ‫‪T‬‬           ‫‪A‬‬             ‫‪A‬‬            ‫‪O‬‬             ‫‪C‬‬            ‫‪N‬‬               ‫‪E‬‬
                ‫ﻣﻘﺪار‬      ‫1‬           ‫1‬             ‫0‬            ‫0‬              ‫0‬           ‫1‬       ‫0‬       ‫‪X‬‬




                                                                      ‫ﺑﻴﺖ ‪ TWIE‬ﻳﻚ ﺷﺪه ﺗﺎ ﻣﺎژول ‪ TWI‬ﻓﻌﺎل ﺷﻮد.‬

                                                                   ‫ﺑﻴﺖ ‪ TWEA‬ﻳﻚ ﺷﺪه ﺗﺎ ارﺳﺎل ‪ ACK‬ﻓﻌﺎل ﺷﻮد.‬

 ‫ﺑﻴﺖ ﻫﺎي ‪ TWSTA‬و ‪ TWSTO‬ﺻﻔﺮ ﻣﻲ ﺑﺎﺷﻨﺪ زﻳﺮا اﻳﺠﺎد ﺷﺮاﻳﻂ آﻏﺎز و ﭘﺎﻳﺎن ﺑﺮ ﻋﻬﺪه ي ‪ Master‬ﻣﻲ ﺑﺎﺷﺪ.‬



‫ﺑﻌﺪ از ﭘﻴﻜﺮﺑﻨﺪي ‪ ،Slave‬ﻣﻨﺘﻈﺮ ﺷﺪه ﺗﺎ ﺗﻮﺳﻂ ‪ Master‬آدرس دﻫﻲ ﺷﺪه و ﻳﺎ ﻳﻚ ﻓﺮاﺧﻮان ﻋﻤﻮﻣﻲ درﻳﺎﻓـﺖ ﻛﻨـﺪ.‬

‫اﮔﺮ در آدرس درﻳﺎﻓﺖ ﺷﺪه ﺑﻴﺖ ﺟﻬﺖ )‪ (W/R‬ﺻﻔﺮ ﺑﺎﺷﺪ ﻧﺸﺎن دﻫﻨـﺪه ي اﻳـﻦ اﺳـﺖ ﻛـﻪ ‪ Master‬ﻣـﻲ ﺧﻮاﻫـﺪ‬

‫ﻣﻘـﺪاري را ﺑـﻪ ‪ Slave‬ﺑﻔﺮﺳـﺘﺪ ﻛـﻪ در اﻳﻨﺼـﻮرت ‪ Slave‬وارد وﺿـﻌﻴﺖ )‪ Slave Read (SR‬ﺷـﺪه و در ﻏﻴـﺮ‬

‫اﻳﻨﺼﻮرت در ﺣﺎﻟﺖ )‪ Slave Transmiter (ST‬ﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ. ﭘﺲ از درﻳﺎﻓﺖ ‪ SLA+W‬ﺑﻴﺖ ‪TWINT‬‬

                                               ‫ﻳﻚ ﺷﺪه و وﺿﻌﻴﺖ ﺟﺎري در رﺟﻴﺴﺘﺮ ‪ TWSR‬وﺟﻮد ﺧﻮاﻫﺪ داﺷﺖ:‬




      ‫ﻣﻘﺪار ‪TWSR‬‬                           ‫ﻋﻤﻠﻜﺮد‬                          ‫وﺿﻌﻴﺖ ﺑﻌﺪي ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻮﺳﻴﻠﻪ ي ‪ TWI‬اﻧﺠﺎم ﺷﻮد‬

          ‫06‪0x‬‬          ‫ﺑﺎﻳﺖ ‪ SLA+W‬درﻳﺎﻓﺖ ﺷﺪه و ‪ ACK‬ارﺳﺎل ﺷﺪه اﺳﺖ.‬                ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬ﻳﺎ ‪NACK‬‬

                        ‫ﻛﻨﺘﺮل ﺑﺎس در ﺣﻴﻦ ارﺳﺎل ‪ SLA + W‬ﺗﻮﺳﻂ ‪ Master‬از‬
          ‫86‪0x‬‬                                                                    ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬ﻳﺎ ‪NACK‬‬
                                                         ‫دﺳﺖ رﻓﺘﻪ اﺳﺖ.‬



                                                                 ‫- ٤٦١ -‬
‫561 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                          ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬
          ‫07‪0x‬‬           ‫ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ رﻳﺎﻓﺖ ﺷﺪه و ‪ ACK‬ارﺳﺎل ﺷﺪه اﺳﺖ.‬           ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬ﻳﺎ ‪NACK‬‬

                   ‫ﻛﻨﺘﺮل ﺑﺎس در ﺣﻴﻦ ارﺳﺎل ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ ﺗﻮﺳﻂ ‪Master‬‬
          ‫87‪0x‬‬                                                                   ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬ﻳﺎ ‪NACK‬‬
                                                        ‫از دﺳﺖ رﻓﺘﻪ اﺳﺖ.‬

          ‫08‪0x‬‬       ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬در ﻓﺮاﺧﻮاﻧﻲ اﺧﺘﺼﺎﺻﻲ‬            ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬ﻳﺎ ‪NACK‬‬

                                                                              ‫ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع‬
          ‫88‪0x‬‬     ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ NACK‬در ﻓﺮاﺧﻮاﻧﻲ اﺧﺘﺼﺎﺻﻲ‬
                                                                                     ‫ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از ‪ Slave‬ﺑﻪ ‪Master‬‬

          ‫09‪0x‬‬            ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬در ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ‬         ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ ACK‬ﻳﺎ ‪NACK‬‬

                                                                              ‫ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع‬
          ‫89‪0x‬‬       ‫درﻳﺎﻓﺖ ﺑﺎﻳﺖ داده و ارﺳﺎل ‪ NACK‬در ﻓﺮاﺧﻮاﻧﻲ ﻋﻤﻮﻣﻲ‬
                                                                                     ‫ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از ‪ Slave‬ﺑﻪ ‪Master‬‬

                                                                              ‫ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع‬
         ‫0‪0xA‬‬                           ‫درﻳﺎﻓﺖ ﺣﺎﻟﺖ ﭘﺎﻳﺎن و ﻳﺎ ﺷﺮوع دوﺑﺎره‬
                                                                                     ‫ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از ‪ Slave‬ﺑﻪ ‪Master‬‬




‫در ﺻﻮرﺗﻲ ﻛﻪ ﻛﺪ ﺧﻮاﻧﺪه ﺷﺪه 06‪ 0x‬ﺑﺎﺷﺪ آدرس ﺑﺪرﺳﺘﻲ ﺗﻮﺳﻂ ‪ Slave‬درﻳﺎﻓﺖ ﺷﺪه و ﺑﺮاي ‪ Master‬ﺗﺼـﺪﻳﻖ‬

‫)‪ (ACK‬ﻧﻴﺰ ارﺳﺎل ﺷﺪه اﺳﺖ. ﭘﺲ از اﻳﻦ ‪ Slave‬ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻳﺖ ﻫﺎي داده را درﻳﺎﻓﺖ ﻛﺮده و ﺗـﺎ زﻣـﺎﻧﻲ ﻛـﻪ ﻳـﻚ‬

‫ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﻳﺎ ﺷﺮوع ﻣﺠﺪد اﻳﺠﺎد ﺷﻮد اﻳﻦ روﻧﺪ اداﻣﻪ ﺧﻮاﻫﺪ داﺷﺖ ﻛﻪ در اﻳﻦ ﺻـﻮرت ﻣﻘـﺪار رﺟﻴﺴـﺘﺮ ‪TWSR‬‬

                                                                                                       ‫ﺑﺮاﺑﺮ 0‪ 0xA‬ﻣﻲ ﺑﺎﺷﺪ.‬




                         ‫ﻣﺜﺎل 4: )درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ داده ﺗﻮﺳﻂ ‪ Slave‬ﺑﺎ آدرس 10‪ 0x‬و ﻧﺮخ ﺑﻴﺖ 001 ﻛﻴﻠﻮﻫﺮﺗﺰ(‬



‫>‪#include <mega16.h‬‬
‫0000008 ‪#define xtal‬‬


‫;‪char incoming_data‬‬


‫)(‪void main‬‬
‫{‬

                                                                    ‫- ٥٦١ -‬
P a g e | 166
        www.avr.ir                                        www.pnkavosh.com 


//-------------- 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
                 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;



                                         - ١٦٦ -
‫761 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                    ‫ ‬                        ‫ ‪       www.pnkavosh.com‬‬
‫---------- ‪//---------- Receiving Stop Condition‬‬


    ‫‪while(TWCR&0x80==0); // Waiting for TWINT flag‬‬


    ‫?‪if ((TWSR & 0xF8)== 0x0A0) //Stop Condition Received‬‬
                ‫‪TWCR=0x84; // Clear TWINT‬‬


‫:‪error‬‬
    ‫;)1(‪while‬‬


‫}‬




                                                                                 ‫‪(ST) Slave Transmitter‬‬

‫اﻳﻦ وﺿﻌﻴﺖ ﻣﺸﺎﺑﻪ ‪ SR‬ﻣﻲ ﺑﺎﺷﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺑﻌﺪ از درﻳﺎﻓﺖ آدرس ﺑﻴﺖ ‪ W/R‬ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ. ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ‬

       ‫‪ Master‬اﻋﻼم ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﻣﻘﺪاري را از ‪ Slave‬ﺑﺨﻮاﻧﺪ و در ﻧﺘﻴﺠﻪ ‪ Slave‬ﻓﺮﺳﺘﻨﺪه ﺧﻮاﻫﺪ ﺑﻮد.‬

‫ﭘﺲ از درﻳﺎﻓﺖ آدرس ﺑﻴﺖ ‪ TWINT‬ﻳﻚ ﺷﺪه و ﻣﻲ ﺗﻮان ﻛﺪ وﺿﻌﻴﺖ ﺟﺎري را از ‪ TWSR‬ﺑﺪﺳﺖ آورد، ﺑﻌﺪ ار‬

‫ارﺳﺎل ﻫﺮ ﺑﺎﻳﺖ داده از ‪ Master ،Slave‬ﺑﺎ ﻓﺮﺳﺘﺎدن ‪ ACK‬آن را ﺗﺼﺪﻳﻖ ﻣﻲ ﻛﻨﺪ و ﭼﻨﺎﻧﭽﻪ ‪ Master‬ﺑﺨﻮاﻫﺪ‬

                                 ‫آﺧﺮﻳﻦ ﺑﺎﻳﺖ را در درﻳﺎﻓﺖ ﻛﻨﺪ ‪ NACK‬ارﺳﺎل ﺧﻮاﻫﺪ ﻧﻤﻮد )0‪.(TWSR=0xC‬‬



      ‫ﻣﻘﺪار ‪TWSR‬‬                         ‫ﻋﻤﻠﻜﺮد‬                         ‫وﺿﻌﻴﺖ ﺑﻌﺪي ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻮﺳﻴﻠﻪ ي ‪ TWI‬اﻧﺠﺎم ﺷﻮد‬

         ‫8‪0xA‬‬            ‫ﺑﺎﻳﺖ ‪ SLA+R‬درﻳﺎﻓﺖ ﺷﺪه و ‪ ACK‬ارﺳﺎل ﺷﺪه اﺳﺖ.‬            ‫ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬



                                                              ‫- ٧٦١ -‬
‫861 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                   ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬
                    ‫ﻛﻨﺘﺮل ﺑﺎس در ﺣﻴﻦ ارﺳﺎل ‪ SLA + W‬ﺗﻮﺳﻂ ‪ Master‬از‬
         ‫0‪0xB‬‬                                                             ‫ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬
                                                    ‫دﺳﺖ رﻓﺘﻪ اﺳﺖ.‬

         ‫8‪0xB‬‬                         ‫ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ‪ACK‬‬        ‫ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ‪ ACK‬ﻳﺎ ‪NACK‬‬

                                                                       ‫ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع‬
         ‫0‪0xC‬‬                        ‫ارﺳﺎل ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ‪NACK‬‬
                                                                              ‫ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از ‪ Slave‬ﺑﻪ ‪Master‬‬

                                                                       ‫ﺗﻐﻴﻴﺮ ﺑﻪ ﺣﺎﻟﺖ ﺑﺪون آدرس و ﻳﺎ ارﺳﺎل ﺣﺎﻟﺖ ﺷﺮوع‬
         ‫8‪0xC‬‬        ‫ارﺳﺎل آﺧﺮﻳﻦ ﺑﺎﻳﺖ داده و درﻳﺎﻓﺖ ‪(TWEA=0) ACK‬‬
                                                                              ‫ﺑﺮاي ﺗﻐﻴﻴﺮ وﺿﻌﻴﺖ از ‪ Slave‬ﺑﻪ ‪Master‬‬




                         ‫ﻣﺜﺎل 5: )ﺧﻮاﻧﺪن ﻳﻚ ﺑﺎﻳﺖ داده از ‪ Slave‬ﺑﺎ آدرس 10‪ 0x‬و ﻧﺮخ ﺑﻴﺖ 001 ﻛﻴﻠﻮﻫﺮﺗﺰ(‬



‫>‪#include <mega16.h‬‬
‫0000008 ‪#define xtal‬‬


‫)(‪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==0xA8) // SLA+R Received‬‬
    ‫{‬
                ‫77‪TWDR=0x77; // Transmitt 0x‬‬
                                                             ‫- ٨٦١ -‬
P a g e | 169
        www.avr.ir                                                  www.pnkavosh.com 
                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);


}
                                                                   :‫ﻫﻤﺰﻣﺎن ﺳﺎزي ﭘﺎﻟﺲ ﺳﺎﻋﺖ‬

‫ ﻗﺮار ﻣﻲ دﻫﺪ و‬SCL ‫ ﭘﺎﻟﺲ ﺳﺎﻋﺖ ﺧﻮد را ﺑﺮ روي‬Master ‫ ﻫﺎ ﺗﻮﻟﻴﺪ ﻣﻲ ﮔﺮدد. ﻫﺮ‬Master ‫ﭘﺎﻟﺲ ﺳﺎﻋﺖ ﺗﻮﺳﻂ‬

‫ ﺷـﺪه و ﺑﺎﻋـﺚ ﺗﻮﻟﻴـﺪ ﻳـﻚ ﭘـﺎﻟﺲ‬AND ‫ ﭘﺎﻟﺲ ﺳﺎﻋﺖ ﻫﺎ ﺑﺎ ﻫﻢ‬I2C ‫ در ﺑﺎس‬wired-AND ‫ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺧﺎﺻﻴﺖ‬

                                                                       .‫ﺳﺎﻋﺖ ﻣﺸﺘﺮك ﻣﻲ ﮔﺮدد‬




                                                 - ١٦٩ -
‫071 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬




                                                      ‫‪ Arbitration‬در ﺳﻴﺴﺘﻢ ﻫﺎي داراي ﭼﻨﺪ ‪Master‬‬

‫ﻫﺮ ‪ Master‬ﺗﻨﻬﺎ در زﻣﺎﻧﻲ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺑﺎس دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﺪ ﻛـﻪ ﺧـﻂ ‪ SDA‬آزاد ﺑﺎﺷـﺪ. اﻣـﺎ ﭘﺮوﺗﻜـﻞ ‪ I2C‬ﺑـﻪ‬

‫ﺷﻜﻠﻲ ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ ﻛﻪ در ﺻﻮرﺗﻴﻜﻪ در ﺷﺮاﻳﻂ آزاد ﺑـﻮدن ﺑـﺎس دو ﻳـﺎ ﭼﻨـﺪ ‪ Master‬ﻫﻤﺰﻣـﺎن درﺧﻮاﺳـﺖ‬

‫دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﺎس را داﺷﺘﻪ ﺑﺎﺷﻨﺪ ﺑﺪون از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ارﺗﺒﺎط ﺣﻔـﻆ ﺷـﻮد. در اﻳﻨﺠـﺎ ﻧﻴـﺰ وﺟـﻮد ﺧﺎﺻـﻴﺖ‬

‫‪ Wired-AND‬ﺑﺎﻋﺚ ﺣﻞ ﻣﺸﻜﻞ ﻣﻲ ﮔﺮدد ﻳﻌﻨﻲ ﭼﻨﺪ ‪ Master‬ﺑﻄﻮر ﻫﻤﺰﻣﺎن داده ﻫﺎﻳﺸﺎن را ﺑﺮ روي ﺧﻂ ‪SDA‬‬

‫ﺑﻪ ﺻﻮرت ﺳﺮﻳﺎل ارﺳﺎل ﻣﻲ دارﻧﺪ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺑﺎ ﻫﻢ ‪ AND‬ﺷﺪه و ﺑﺮ روي ﺑﺎس ﻳﻚ دﻳﺘﺎي واﺣﺪ را اﻳﺠﺎد ﻣـﻲ‬

‫ﻛﻨﺪ، در اوﻟﻴﻦ ﻣﻜﺎﻧﻲ ﻛﻪ ﺧﻂ ‪ SDA‬ﺑﺎ ﺧﻂ داده ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ ‪ Master‬ﻣﻄﺎﺑﻘـﺖ ﻧﺪاﺷـﺖ آن ‪ Master‬ﺧـﻂ داده‬

‫ﺳﺮﻳﺎل را در ﺳﻄﺢ ﻳﻚ ﻣﻨﻄﻘﻲ رﻫﺎ ﻣﻲ ﻛﻨﺪ )ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ وﺟﻮد ‪ Pull-up‬ﺳﻄﺢ ﻳﻚ ﻣﻲ ﺑﺎﺷﺪ( ﺗـﺎ‬

                                                           ‫ﺑﺮ روي ﻛﺎر دﻳﮕﺮ ‪ Master‬ﻫﺎ اﺧﻼﻟﻲ اﻳﺠﺎد ﻧﻜﻨﺪ.‬




                                                      ‫- ٠٧١ -‬
‫171 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




‫ﻫﻤﺎن ﻃﻮر ﻛﻪ دﻳﺪه ﻣﻲ ﺷﻮد ﻣﺴﺎﻟﻪ ‪ Arbitration‬ﺗﻨﻬﺎ در ﻣﻮرد ﺣﺎﻟﺘﻲ ﻣﻌﻨﻲ دارد ﻛﻪ ﭼﻨـﺪ ‪ Master‬داﺷـﺘﻪ ﺑﺎﺷـﻴﻢ‬

                                                                                               ‫زﻳﺮا:‬

‫در ﻣﻮرد ‪ Slave‬ﻫﺎ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ در ﻫﺮ زﻣﺎن ﻳـﻚ ‪ Slave‬آدرس دﻫـﻲ ﻣـﻲ ﺷـﻮد و ﺣـﻖ دﺳﺘﺮﺳـﻲ ﺑـﻪ‬     ‫١.‬

                                                                    ‫‪ SDA‬را دارد ﻣﻌﻨﻲ ﻧﺨﻮاﻫﺪ داﺷﺖ.‬

                                        ‫ﻳﻚ ‪ Master‬دﻳﮕﺮ رﻗﻴﺒﻲ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺧﻂ ‪ SDA‬ﻧﺪارد.‬       ‫٢.‬




                                                         ‫دﺳﺘﺮﺳﻲ ﻧﺮم اﻓﺰاري ﺑﻪ ‪ I2C‬در ‪CodeVision‬‬

‫ﻛﺎﻣﭙﺎﻳﻠﺮ ‪ CodeVision‬ﺑﺎ اراﺋﻪ ي ﻳﻚ ﺳﺮي ﺗﻮاﺑﻊ ﻣﺮﺑﻮط ﺑﻪ ﺑﺎس ‪ ،I2C‬اﻣﻜﺎن اﻳﺠﺎد اﻳﻦ ﭘﺮوﺗﻜﻞ را ﺑﻪ ﺻﻮرت ﻧﺮم‬

        ‫اﻓﺰاري ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ دﻫﺪ. ﭘﻴﻦ ﻫﺎي ‪ SDA‬و ‪ SCL‬ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻧﺮم اﻓﺰار ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﻴﻴﻦ ﺷﻮﻧﺪ:‬

‫‪#asm‬‬
                                                     ‫- ١٧١ -‬
‫271 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                 ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬


        ‫81‪.equ __i2c_port=0x‬‬
        ‫3=‪.equ __sda_bit‬‬
        ‫4=‪.equ __scl_bit‬‬


‫‪#endasm‬‬


                          ‫در اﻳﻦ ﻗﻄﻌﻪ ﻛﺪ ﭘﻴﻦ ﻫﺎي 3 و 4 از ‪ PORTB‬ﺑﻪ ﻋﻨﻮان ‪ SDA‬و ‪ SCL‬ﺗﻌﻴﻴﻦ ﺷﺪه اﻧﺪ.‬




                                                                        ‫ﺗﻮاﺑﻊ ‪ I2C‬در ﻛﺎﻣﭙﺎﻳﻠﺮ ‪CodeVision‬‬




                                                                                                  ‫)(‪:i2c_init‬‬
         ‫اﻳﻦ ﺗﺎﺑﻊ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ ي ﺑﺎس ‪ I2C‬را اﻧﺠﺎم داده و ﺑﺎﻳﺪ ﻗﺒﻞ از اﺳﺘﻔﺎده از ﺗﻮاﺑﻊ دﻳﮕﺮ ﺑﻪ ﺑﻪ ﻛﺎر ﺑﺮده ﺷﻮد.‬



                                                                                                ‫)(‪:i2c_start‬‬
   ‫اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺷﺮاﻳﻂ آﻏﺎز اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ و در ﺻﻮرﺗﻲ ﻛﻪ ﺑﺎس آزاد ﺑﺎﺷﺪ ﻣﻘﺪار ﻳﻚ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و در ﻏﺮ اﻳﻦ‬

                                                                      ‫ﺻﻮرت ﺧﺮوﺟﻲ اﻳﻦ ﺗﺎﺑﻊ ﺻﻔﺮ ﺧﻮاﻫﺪ ﺑﻮد.‬




                                                                                                 ‫)(‪:i2c_stop‬‬
                                                      ‫اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺷﺮاﻳﻂ ﭘﺎﻳﺎن ﺑﺮ روي ﺑﺎس ‪ I2C‬اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ.‬



                                                                                                ‫)(‪:i2c_read‬‬



                                                           ‫- ٢٧١ -‬
‫371 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬
                            ‫اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺑﺎﻳﺖ را از ﺑﺎس ‪ 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‬اﻳﺠﺎد ﻛﻨﺪ اﻳﻦ ﺗﺎﺑﻊ ﻣﻘـﺪار ﻳـﻚ و در ﻏﻴـﺮ‬

                                                                       ‫اﻳﻨﺼﻮرت ﻣﻘﺪار ﺻﻔﺮ ﺑﺎز ﻣﻲ ﮔﺮداﻧﺪ.‬




                                                                 ‫ﭘﺮوژه 21: ارﺗﺒﺎط ﺑﺎ ‪ EEPROM‬ﻫﺎي ‪I2C‬‬




                                                       ‫- ٣٧١ -‬
P a g e | 174
        www.avr.ir                                  www.pnkavosh.com 
                                                                   :‫ﺷﻤﺎﺗﻴﻚ‬




                                                                   :‫ﻧﺮم اﻓﺰار‬



#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 */


#asm


        .equ __i2c_port=0x18
        .equ __sda_bit=3


                                   - ١٧٤ -
P a g e | 175
        www.avr.ir                               www.pnkavosh.com 
        .equ __scl_bit=4


#endasm


/* now you can include the I2C Functions */


#include <i2c.h>


/* 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;
}


/* write a byte to the EEPROM */
void eeprom_write(unsigned char address, unsigned char
data) {



                                - ١٧٥ -
P a g e | 176
        www.avr.ir                                       www.pnkavosh.com 
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 */
}




                         ‫ﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل‬

                                       - ١٧٦ -
‫771 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬



‫ﻋﻤﺪه روش ﻫﺎﻳﻲ ﻛﻪ ﺑﺮاي ﺗﺒﺪﻳﻞ آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل وﺟﻮد دارﻧﺪ ﻋﺒﺎرﺗﻨﺪ از: ﺗﺒﺪﻳﻞ آﻧـﻲ ﻳـﺎ ‪ ،Flash‬روش ﺗﻘﺮﻳـﺐ‬

‫ﻫ ـﺎي ﻣﺘ ـﻮاﻟﻲ ﻳ ـﺎ ‪ ،Successive Approximation‬ﻣﺒ ـﺪل ﻫ ـﺎي ‪،Ramp-Compare ،Delta-Encoded‬‬
                               ‫ـ‬     ‫ـ‬                               ‫ـ‬       ‫ـ‬      ‫ـ‬

‫‪ Sigma-Delta ،Pipeline ADC‬و ﻏﻴﺮه ﻛﻪ از اﻳﻦ ﻣﻴﺎن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎي ‪ AVR‬از روش ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘـﻮاﻟﻲ‬

                                                                                      ‫اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ.‬




                                                                ‫اﺻﻮل ﺗﺒﺪﻳﻞ ﺑﺎ روش ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘﻮاﻟﻲ‬




                                                 ‫ﺑﻠﻮك دﻳﺎﮔﺮام ﺳﺎده ﺷﺪه ي اﻳﻦ ﻣﺒﺪل ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:‬




‫‪ :Sample and Hold‬ﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻧﻤﻮﻧﻪ ي آﻧﺎﻟﻮگ ﺑﻪ ﻣﻘﺪار ﺑـﺎﻳﻨﺮي ﻣﺘﻨـﺎﻇﺮ ﺑـﺎ آن‬

‫ﻧﻴﺎز ﺑﻪ ﻳﻚ ورودي ‪ Stable‬دارد ﻛﻪ اﻳﻦ ﻃﺮﻳﻖ ﻣﺪار ‪ Sample and Hold‬اﻳﺠﺎد ﻣـﻲ ﺷـﻮد. در ﺷـﻜﻞ زﻳـﺮ ﻳـﻚ‬


                                                      ‫- ٧٧١ -‬
‫871 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬
‫ﻧﻤﻮﻧﻪ ي ﺑﺴﻴﺎر ﺳﺎده از آن را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ، ﻛﻠﻴﺪ، ﺳﻴﮕﻨﺎل ورودي را ﺑﺎ ﻫﺮ ﻧﻤﻮﻧﻪ ي ﺑﺮداﺷﺘﻪ ﺷﺪه ﺑﻪ ﺧﺎزن وﺻﻞ‬

                                       ‫ﻣﻲ ﻛﻨﺪ و ﺧﺎزن ﻧﻴﺰ ﻣﻘﺪار وﻟﺘﺎژ را ﺗﺎ ﻧﻤﻮﻧﻪ ي ﺑﻌﺪي ﺛﺎﺑﺖ ﻧﮕﺎه ﻣﻲ دارد.‬




 ‫‪ :Successive Approximation Register‬اﻳﻦ رﺟﻴﺴﺘﺮ ﻣﻘﺪار ﺗﻘﺮﻳﺐ زده ﺷﺪه ي دﻳﺠﻴﺘﺎل را ﺑﺮاي ﻣﻘﺎﻳﺴﻪ‬

                                                                                       ‫ﺑﻪ ‪ DAC‬ﻣﻲ دﻫﺪ.‬



                                                                                          ‫اﻟﮕﻮرﻳﺘﻢ ﺗﺒﺪﻳﻞ:‬

‫اﺑﺘﺪا رﺟﻴﺴﺘﺮ ‪ SAR‬ﺑﺎ ﻋﺪد ﺑﺎﻳﻨﺮي 00000001 ﺑﺎرﮔﺬاري ﻣﻲ ﺷﻮد و اﻳﻦ ﻋـﺪد ﺗﻮﺳـﻂ ‪ DAC‬ﺑـﺎ ﻣﻘـﺪار آﻧـﺎﻟﻮگ‬

‫ورودي ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮد. در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد ﻣﻘﺎﻳﺴﻪ ﺷﺪه ﺑﺰرﮔﺘﺮ ﺑﺎﺷﺪ و ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨـﺪه ﺑﺎﻋـﺚ ﻣـﻲ ﺷـﻮد،‬

‫‪ SAR‬ﺑﻴﺖ ‪ MSB‬را ﭘﺎك ﻛﺮده و ﺑﻴﺖ ﻗﺒﻞ از آن را ﻳﻚ ﻛﻨﺪ و در ﻧﺘﻴﺠﻪ ﻋـﺪد 00000010 در ‪ DAC‬ﺑﺎرﮔـﺬاري‬

‫ﻣﻲ ﺷﻮد. در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد ﻣﻘﺎﻳﺴﻪ ﺷﺪه ﻛﻮﭼﻜﺘﺮ ﺑﺎﺷﺪ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺑﺎﻋﺚ ﻣﻲ ﺷـﻮد ﺑﻴـﺖ ﻛـﻮﭼﻜﺘﺮ ﻧﻴـﺰ‬

‫ﻳﻚ ﺷﺪه و در ﻧﺘﻴﺠﻪ ﻋﺪد 00000011 در ورودي ‪ DAC‬ﺑﺎرﮔﺬاري ﺷﻮد. اﻳﻦ ﻋﻤﻞ ﺗﺎ ﭘﻴـﺪا ﺷـﺪن ﻣﻘـﺪار آﻧـﺎﻟﻮگ‬

                   ‫اداﻣﻪ داﺷﺘﻪ و در اﻳﻦ زﻣﺎن ﺑﻴﺖ ‪ End of Conversion‬ﺑﻪ ﻧﺸﺎﻧﻪ ي ﭘﺎﻳﺎن ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻲ ﺷﻮد.‬




                                                       ‫ﺑﺮﺧﻲ از ﻣﺸﺨﺼﺎت ‪ ADC‬ﻗﻄﻌﻪ ي 61‪:ATmega‬‬

‫‪• 10-bit Resolution‬‬

                                                       ‫- ٨٧١ -‬
P a g e | 179
        www.avr.ir                                                       www.pnkavosh.com 
• ±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 ‫داﺧﻠﻲ 65.2 وﻟﺖ ﻗﺎﺑﻞ ﺗﺎﻣﻴﻦ ﻣﻲ ﺑﺎﺷﺪ. ﺟﻬﺖ ﻛﺎﻫﺶ ﻧﻮﻳﺰ ﻣﻮﺛﺮ ﺑﺮ روي واﺣﺪ‬

‫ ﺗﻔﺎوت داﺷﺘﻪ ﺑﺎﺷﺪ. در‬VCC ‫ ﺗﺎﻣﻴﻦ ﻣﻲ ﺷﻮد. وﻟﺘﺎژ اﻳﻦ ﭘﻴﻦ ﻧﺒﺎﻳﺪ ﺑﻴﺸﺘﺮ از 3.0 وﻟﺖ ﺑﺎ‬AVCC ‫ﺟﺪاﮔﺎﻧﻪ از ﭘﻴﻦ‬

 VCC ‫ اﻳﻦ ﭘﺎﻳﻪ ﺑﻪ‬LC ‫ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد، ﻣﻲ ﺗﻮان ﺑﻮﺳﻴﻠﻪ ي ﻳﻚ ﻓﻴﻠﺘﺮ‬AVCC ‫ ﺑﻪ ﻋﻨﻮان‬VCC ‫ﺻﻮرﺗﻲ ﻛﻪ از‬

                                                                                       .‫ﻣﺘﺼﻞ ﻧﻤﻮد‬




                                                     - ١٧٩ -
‫081 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬




                                                                                ‫رﺟﻴﺴﺘﺮﻫﺎي واﺣﺪ ‪ADC‬‬



                                                           ‫‪ADC Multiplexer Selection Register‬‬


 ‫‪ADMUX‬‬             ‫7‬         ‫6‬           ‫5‬             ‫4‬         ‫3‬          ‫2‬         ‫1‬           ‫0‬
   ‫ﻧﺎم ﺑﻴﺖ‬      ‫0‪REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX‬‬



‫]0:4[‪ :Analog Channel and Gain Selection Bits‬اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛـﻪ ﭼـﻪ ﺗﺮﻛﻴﺒـﻲ از 8‬

‫ﻛﺎﻧﺎل ورودي ﺑﻪ واﺣﺪ ‪ ADC‬ﻣﺘﺼﻞ ﺷﺪه و ﻫﻤﭽﻨﻴﻦ ﺑﻬﺮه ورودي ﺗﻔﺎﺿﻠﻲ را ﻧﻴﺰ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ. در ﺣﺎﻟـﺖ ﻫـﺎي‬

‫‪ Single-ended‬دﻗﺖ ‪ 10 ADC‬ﺑﻴﺘﻲ ﺑﻮده ﻛﻪ در ﺣﺎﻟﺖ ورودي دﻳﻔﺮاﻧﺴﻴﻞ ﺑﺎ ﺑﻬﺮه ي ‪ 1x‬و ‪ 10x‬اﻳﻦ ﻣﻘﺪار ﺑﻪ 8‬

                                                            ‫ﺑﻴﺖ و ﺑﺎ ﺑﻬﺮه ي ‪ 200x‬ﺑﻪ 7 ﺑﻴﺖ ﻛﺎﻫﺶ ﻣﻲ ﻳﺎﺑﺪ.‬

‫در ﺻﻮرﺗﻲ ﻛﻪ ‪ ADC‬ﻣﺸﻐﻮل اﻧﺠﺎم ﻳﻚ ﺗﺒﺪﻳﻞ ﺑﻮده و اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ ﺗﺎ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ﺟﺎري اﻳﻦ ﺗﻐﻴﻴﺮ اﻧﺠـﺎم‬

  ‫ﻧﺨﻮاﻫﺪ ﺷﺪ.ﺗﻨﻈﻴﻤﺎت اﻳﻦ 4 ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ: )ﻋﻤﻠﻜﺮد ﺗﻔﺎﺿـﻠﻲ ﻓﻘـﻂ ﺑـﺮ روي ‪ Package‬ﻫـﺎي‬

                                                                      ‫‪TQFP‬و ‪ MLF‬آزﻣﺎﻳﺶ ﺷﺪه اﺳﺖ.(‬

                                                       ‫- ٠٨١ -‬
P a g e | 181
        www.avr.ir                            www.pnkavosh.com 




                             - ١٨١ -
‫281 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬



‫‪ :ADC Left Adjust Result‬ﺑﻴﺖ ‪ ADLR‬ﺑﺮ ﻧﺤﻮه ﻧﻤﺎﻳﺶ ﻧﺘﻴﺠﻪ ي ﺗﺒﺪﻳﻞ در رﺟﻴﺴﺘﺮ داده ي ‪ ADC‬ﺗـﺎﺛﻴﺮ‬

‫ﻣﻲ ﮔﺬارد. ﻧﻮﺷﺘﻦ ﻳﻚ در اﻳﻦ ﺑﻴﺖ آن را ﺑﻪ ﺻﻮرت ‪ Left Adjust‬ﺗﻨﻈﻴﻢ ﻣﻲ ﻛﻨﺪ و در ﻏﻴـﺮ اﻳﻨﺼـﻮرت ﻧﺘﻴﺠـﻪ ﺑـﻪ‬

          ‫ﺻﻮرت ‪ Right Adjust‬ﺧﻮاﻫﺪ ﺑﻮد. ﺗﻐﻴﻴﺮ اﻳﻦ ﺑﻴﺖ ﺑﻪ ﺻﻮرت آﻧﻲ ﺑﺮ روي رﺟﻴﺴﺘﺮ داده ﺗﺎﺛﻴﺮ ﻣﻲ ﮔﺬارد.‬




‫]0:1[‪ :Reference Selection Bits‬اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﺮﺟﻊ وﻟﺘﺎژ ‪ ADC‬را ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ. در‬

‫ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ ﻫﺎ در ﺣﻴﻦ ﺗﺒﺪﻳﻞ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ ﺗﺎ اﺗﻤﺎم ﺗﺒﺪﻳﻞ ﺗﻐﻴﻴﺮ اﻋﻤﺎل ﻧﺨﻮاﻫﺪ ﺷﺪ. در ﺻﻮرﺗﻲ ﻛـﻪ از ﻣﺮﺟـﻊ‬

‫وﻟﺘﺎژ داﺧﻠﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﻧﺒﺎﻳﺪ وﻟﺘﺎژ ﺧﺎرﺟﻲ ﺑﻪ ﭘﻴﻦ ‪ AREF‬اﻋﻤﺎل ﺷﻮد. زﻣﺎﻧﻲ ﻛﻪ ﻳﻜﻲ از دو وﻟﺘﺎژ ‪ AREF‬ﻳﺎ‬

‫65.2 وﻟﺖ ﺑﻪ ﻋﻨﻮان ﻣﺮﺟﻊ اﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﻨﺪ ﺑﺎ اﺗﺼﺎل ﻳﻚ ﺧﺎزن 001 ﻧﺎﻧﻮ ﺑـﻴﻦ ﭘـﻴﻦ ‪ AREF‬و زﻣـﻴﻦ ﻣـﻲ ﺗـﻮان‬

                                                                                  ‫ﻣﻘﺪار ﻧﻮﻳﺰ را ﻛﺎﻫﺶ داد.‬




                   ‫0‪REFS1 REFS‬‬                              ‫وﻟﺘﺎژ ﻣﺮﺟﻊ‬

                         ‫0‬       ‫0‬                     ‫وﻟﺘﺎژ ﭘﺎﻳﻪ ي ‪AREF‬‬

                         ‫0‬       ‫1‬                     ‫وﻟﺘﺎژ ﭘﺎﻳﻪ ي ‪AVCC‬‬

                         ‫1‬       ‫0‬                           ‫رزرو ﺷﺪه‬

                         ‫1‬       ‫1‬                     ‫وﻟﺘﺎژ داﺧﻠﻲ 65.2 وﻟﺖ‬




                                                        ‫- ٢٨١ -‬
‫381 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                       ‫ ‬                       ‫ ‪       www.pnkavosh.com‬‬
                                                       ‫‪ADC Control and Status Register A‬‬



  ‫‪ADCSRA‬‬            ‫7‬          ‫6‬    ‫5‬            ‫4‬          ‫3‬           ‫2‬          ‫1‬          ‫0‬
     ‫ﻧﺎم ﺑﻴﺖ‬     ‫0‪ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS‬‬



‫]0:2[‪ :ADC Prescaler Select Bits‬اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺿﺮﻳﺐ ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه اي را ﻛﻪ از ﻛﻼك ﺳﻴﺴﺘﻢ ﺑـﺮاي‬

                                                     ‫واﺣﺪ ‪ ADC‬ﻛﻼك ﺗﺎﻣﻴﻦ ﻣﻲ ﻛﻨﺪ را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.‬




                         ‫2‪ADPS‬‬     ‫1‪ADPS‬‬             ‫0‪ADPS‬‬          ‫ﺿﺮﻳﺐ ﺗﻘﺴﻴﻢ‬

                           ‫0‬         ‫0‬                  ‫0‬                   ‫2‬

                           ‫0‬         ‫0‬                  ‫1‬                   ‫2‬

                           ‫0‬         ‫1‬                  ‫0‬                   ‫4‬

                           ‫0‬         ‫1‬                  ‫1‬                   ‫8‬

                           ‫1‬         ‫0‬                  ‫0‬                   ‫61‬

                           ‫1‬         ‫0‬                  ‫1‬                   ‫23‬

                           ‫1‬         ‫1‬                  ‫0‬                   ‫46‬

                           ‫1‬         ‫1‬                  ‫1‬                ‫821‬




‫‪ :ADC Interrupt Enable‬در ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ )‪ (I‬و ﻳﻚ ﺑﻮدن اﻳﻦ ﺑﻴﺖ، اﺗﻤﺎم‬

                                                                ‫ﻳﻚ ﺗﺒﺪﻳﻞ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد.‬



                                                 ‫- ٣٨١ -‬
‫481 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬



‫‪ :ADC Interrupt Flag‬ﺑﺎ اﺗﻤﺎم ﻳﻚ ﺗﺒﺪﻳﻞ اﻳﻦ ﭘﺮﭼﻢ ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن وﻗﻔـﻪ، اﺟـﺮاي ‪ISR‬‬

   ‫ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ ﭘﺎك ﺷﺪن آن ﺷﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ در ﻣﺤﻞ اﻳﻦ ﺑﻴﺖ ﻣﻲ ﺗﻮان آن را ﭘﺎك ﻧﻤﻮد.‬




‫‪ :ADC Auto Trigger Enable‬ﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﺑﻪ دو ﺻﻮرت ﻣﻲ ﺗﻮاﻧﺪ راه اﻧﺪازي ﺷـﻮد، ‪ Single‬و ‪Auto‬‬

‫‪ Trigger‬ﻛﻪ ﺣﺎﻟﺖ اول ﺑﺎ ﻫﺮ ﺑﺎر راه اﻧﺪازي ‪ ADC‬ﻳﻚ ﺗﺒﺪﻳﻞ اﻧﺠﺎم ﺷﺪه و در وﺿﻌﻴﺖ دوم ‪ ADC‬ﺑـﻪ ﺻـﻮرت‬

‫ﺧﻮدﻛﺎر از ﻃﺮﻳﻖ ﻳﻜﻲ ازﻣﻨﺎﺑﻊ داﺧﻠﻲ ﺗﺤﺮﻳﻚ ﻣﻲ ﺷﻮد. ﺑﺮاي ﻗﺮار دادن ‪ ADC‬در وﺿـﻌﻴﺖ ‪ Auto Trigger‬ﺑﺎﻳـﺪ‬

‫اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺷﻮد. ﻧﻮع ﻣﻨﺒﻊ ﺗﺮﻳﮕـﺮ ﻛﻨﻨـﺪه ﺑﻮﺳـﻴﻠﻪ ي ﺑﻴـﺖ ﻫـﺎي ]0:2[‪ ADTS‬از رﺟﻴﺴـﺘﺮ ‪ SFIOR‬اﻧﺘﺨـﺎب‬

                                                                                              ‫ﻣﻲ ﺷﻮد.‬




‫‪ :ADC Start Conversion‬در وﺿﻌﻴﺖ راه اﻧﺪازي ‪ ،Single‬ﺑﺮاي آﻏﺎز ﻫﺮ ﺗﺒﺪﻳﻞ ﺑﺎﻳﺪ اﻳﻦ ﺑﻴﺖ ﻳـﻚ ﺷـﻮد و‬

         ‫در وﺿﻌﻴﺖ ﺗﺒﺪﻳﻞ ﭘﻴﻮﺳﺘﻪ )‪ (Free Running‬ﻧﻮﺷﺘﻦ ﻳﻚ روي اﻳﻦ ﺑﻴﺖ اوﻟﻴﻦ ﺗﺒﺪﻳﻞ را ﻣﻮﺟﺐ ﻣﻲ ﺷﻮد.‬




‫‪ :ADC Enable‬اﻳﻦ ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻣﺎژول ‪ ADC‬ﺑﻮده و ﺑﺎ ﻳﻚ ﻛﺮدن آن ﻣﻲ ﺗﻮان ‪ ADC‬را ﻓﻌﺎل ﻧﻤﻮد. ﻧﻮﺷـﺘﻦ‬

 ‫ﺻﻔﺮ روي اﻳﻦ ﺑﻴﺖ در ﺣﺎﻟﻲ ﻛﻪ ‪ ADC‬ﻣﺸﻐﻮل ﺗﺒﺪﻳﻞ اﺳﺖ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﻧﻴﻤﻪ ﻛﺎره رﻫﺎ ﺷﻮد.‬



                                                                       ‫‪The ADC Data Register‬‬



‫ﺑﺎ ﭘﺎﻳﺎن ﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﻧﺘﻴﺠﻪ در اﻳﻦ رﺟﻴﺴﺘﺮ ﻗﺮار ﻣﻲ ﮔﻴﺮد و در ﺻﻮرﺗﻲ ﻛﻪ ورودي ‪ ADC‬ﺑﻪ ﺻـﻮرت دﻳﻔﺮاﻧﺴـﻴﻞ‬

                                                           ‫ﺑﺎﺷﺪ ﻧﺘﻴﺠﻪ ﺑﻪ ﻓﺮم ﻣﻜﻤﻞ 2 ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.‬


                                                     ‫- ٤٨١ -‬
‫581 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬



                    ‫ﻣﻄﺎﺑﻖ ﺑﻴﺖ ‪ ADLR‬در رﺟﻴﺴﺘﺮ ‪ ADMUX‬ﺑﻪ دو ﺻﻮرت ‪ LA‬و ‪ RA‬ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد:‬



                     ‫0=‪ADLR‬‬
         ‫‪Bit‬‬          ‫7‬       ‫6‬        ‫5‬         ‫4‬             ‫3‬      ‫2‬           ‫1‬        ‫0‬
       ‫0‪ADCL ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC‬‬

       ‫‪ADCH‬‬           ‫-‬       ‫-‬        ‫-‬         ‫-‬             ‫-‬      ‫-‬      ‫8‪ADC9 ADC‬‬



                     ‫1=‪ADLR‬‬
         ‫‪Bit‬‬          ‫7‬       ‫6‬        ‫5‬         ‫4‬             ‫3‬      ‫2‬           ‫1‬        ‫0‬
       ‫2‪ADCL ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC‬‬

       ‫0‪ADCH ADC1 ADC‬‬                  ‫-‬         ‫-‬             ‫-‬      ‫-‬           ‫-‬        ‫-‬



                                                                   ‫‪Special FunctionIO Register‬‬



         ‫‪SFIOR‬‬            ‫7‬       ‫6‬         ‫5‬        ‫4‬         ‫3‬      ‫2‬       ‫1‬        ‫0‬
          ‫ﻧﺎم ﺑﻴﺖ‬   ‫01‪ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR‬‬


‫‪ :ADC Auto Trigger Source‬در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ‪ ADATE‬از رﺟﻴﺴـﺘﺮ ‪ ADCSRA‬ﻣﻘـﺪار ﻳـﻚ داﺷـﺘﻪ‬

‫ﺑﺎﺷﺪ ﺑﻴﺖ ﻫﺎي ‪ ADTS‬ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻛﺪام ﻣﻨﺒﻊ ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ‪ ADC‬را راه اﻧﺪازي ﻛﻨـﺪ. ﻣﻨﺒـﻊ اﻳـﻦ راه‬

‫اﻧﺪازي ﻟﺒﻪ ي ﺑﺎﻻ روﻧﺪه ي ﭘﺮﭼﻢ وﻗﻔﻪ ي آن ﻣﻨﺒﻊ ﻣﻲ ﺑﺎﺷﺪ و در ﺻﻮرﺗﻲ ﻛـﻪ ﺑﺨـﻮاﻫﻴﻢ اﺗﻤـﺎم ﺗﺒـﺪﻳﻞ ﺧـﻮد ‪ADC‬‬

‫ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﺑﻌﺪي ﺑﺎﺷﺪ و ‪ ADC‬ﺑﻪ ﺻﻮرت ﭘﻴﻮﺳـﺘﻪ ﻋﻤﻠﻴـﺎت ﺗﺒـﺪﻳﻞ را اﻧﺠـﺎم دﻫـﺪ از ﺣﺎﻟـﺖ ‪Free Running‬‬

                                                                                      ‫اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.‬


                                                     ‫- ٥٨١ -‬
‫681 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                      ‫ ‪       www.pnkavosh.com‬‬



                    ‫0‪ADTS2 ADTS1 ADTS‬‬                               ‫ﻣﻨﺒﻊ راه اﻧﺪازي‬

                         ‫0‬         ‫0‬           ‫0‬                   ‫‪Free Running‬‬

                         ‫0‬         ‫0‬           ‫1‬              ‫ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ‬

                         ‫0‬         ‫1‬           ‫0‬               ‫وﻗﻔﻪ ي ﺧﺎرﺟﻲ ﺻﻔﺮ‬

                         ‫0‬         ‫1‬           ‫1‬            ‫ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ي ﺗﺎﻳﻤﺮ ﺻﻔﺮ‬

                         ‫1‬         ‫0‬           ‫0‬                   ‫ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﺻﻔﺮ‬

                         ‫1‬         ‫0‬           ‫1‬           ‫ﺗﻄﺒﻴﻖ ﻣﻘﺎﻳﺴﻪ ي ‪ B‬ﺗﺎﻳﻤﺮ ﻳﻚ‬

                         ‫1‬         ‫1‬           ‫0‬                   ‫ﺳﺮرﻳﺰ ﺗﺎﻳﻤﺮ ﻳﻚ‬

                         ‫1‬         ‫1‬           ‫1‬               ‫‪ Capture‬ﺗﺎﻳﻤﺮ ﻳﻚ‬




                                                   ‫راه اﻧﺪازي ‪ ADC‬ﺑﻪ ﺻﻮرت ﺗﻚ ﺗﺒﺪﻳﻞ و ﺗﺒﺪﻳﻞ ﺧﻮدﻛﺎر‬




‫ﭘﺲ از اﻧﺘﺨﺎب ﻛﺎﻧﺎل ﻣﻮرد ﻧﻈﺮ و وﻟﺘﺎژ ﻣﺮﺟﻊ ﺑﻮﺳﻴﻠﻪ رﺟﻴﺴﺘﺮ ‪ ،ADMUX‬ﺑﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜـﻪ ﺑﻴـﺖ ‪ADEN‬‬

‫ﻳﻚ ﺑﻮده ﺑﺎﺷﺪ، ﻧﻮﺷﺘﻦ ﻳﻚ ﻣﻨﻄﻘﻲ ﺑﺮ روي ﺑﻴﺖ ‪ ADSC‬ﺷﺮوع ﻳﻚ ﺗﺒﺪﻳﻞ را ﻣﻮﺟﺐ ﺧﻮاﻫﺪ ﺷﺪ. اﻳﻦ ﺑﻴﺖ در ﺣﻴﻦ‬

‫اﻧﺠﺎم ﺗﺒﺪﻳﻞ ﻳﻚ ﺑﻮده و ﺑﺎ ﭘﺎﻳﺎن آن ﺑﻮﺳﻴﻠﻪ ي ﺳﺨﺖ اﻓﺰار ﭘﺎك ﻣﻲ ﺷﻮد. در ﺻﻮرﺗﻲ ﻛﻪ ﻗﺒﻞ از اﺗﻤﺎم ﺗﺒـﺪﻳﻞ، ﻛﺎﻧـﺎل‬

                                        ‫‪ ADC‬ﺗﻐﻴﻴﺮ ﻛﻨﺪ ﺗﺎ ﭘﺎﻳﺎن ﺗﺒﺪﻳﻞ ﺟﺎري اﻳﻦ ﺗﻐﻴﻴﺮ ﺗﺎﺛﻴﺮ ﻧﺨﻮاﻫﺪ ﮔﺬاﺷﺖ.‬

‫راه دﻳﮕﺮ ﺑﺮاي راه اﻧﺪازي ‪ ADC‬وﺿﻌﻴﺖ ﺗﺤﺮﻳﻚ ﺧﻮدﻛﺎر ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ ﺣﺎﻟﺖ ﺑﺎ ﻳﻚ ﻛﺮدن ﺑﻴﺖ ‪ ADATE‬از‬

‫رﺟﻴﺴﺘﺮ ‪ ADCSRA‬آﻏﺎز ﻣﻲ ﺷﻮد. ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي ‪ ADTS‬در رﺟﻴﺴﺘﺮ ‪ SFIOR‬اﻧﺘﺨـﺎب ﻣـﻲ‬




                                                         ‫- ٦٨١ -‬
‫781 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                   ‫ ‪       www.pnkavosh.com‬‬
‫ﺷﻮﻧﺪ. زﻣﺎﻧﻲ ﻛﻪ ﭘﺮﭼﻢ ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ ﻳﻚ ﻣﻲ ﺷﻮد، ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ‪ Reset‬ﺷـﺪه و ‪ ADC‬ﺷـﺮوع ﺑـﻪ اﻧﺠـﺎم ﻳـﻚ‬

                          ‫ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ، ﺑﺪﻳﻦ وﺳﻴﻠﻪ ﻣﻲ ﺗﻮان در ﺑﺎزه ﻫﺎي زﻣﺎﻧﻲ ﺛﺎﺑﺖ ‪ ADC‬را ﺗﺮﻳﮕﺮ ﻧﻤﻮد.‬

‫ﭘﺮﭼﻢ اﺗﻤﺎم ﻳﻚ ﺗﺒﺪﻳﻞ ﺑﻴﺖ ‪ ADIF‬ﻣﻲ ﺑﺎﺷﺪ، در ﺻﻮرﺗﻲ ﻛﻪ ‪ ADC‬در وﺿﻌﻴﺖ ﺗﺤﺮﻳـﻚ ﺧﻮدﻛـﺎر ﻗـﺮار ﮔﺮﻓﺘـﻪ و‬

‫اﻳﻦ ﺑﻴﺖ ﺑﻪ ﻋﻨﻮان ﻣﻨﺒﻊ ﺗﺮﻳﮕﺮ اﻧﺘﺨﺎب ﺷﻮد، ﭘﺲ از اﺗﻤﺎم ﻳﻚ ﺗﻴﺪﻳﻞ، ﺗﺒﺪﻳﻞ ﺟﺪﻳﺪي ﺷﺮوع ﺧﻮاﻫﺪ ﺷﺪ. ﺑﺮاي رﺳﻴﺪن‬

‫ﺑﻪ اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻳﺪ ﺑﻴﺖ ﻫﺎي ‪ ADTS‬در ﺣﺎﻟﺖ ‪ Free Running‬ﻗﺮار ﮔﻴﺮﻧﺪ و ﺑﺮاي ﺷﺮوع ﺗﺒﺪﻳﻞ ﺗﻨﻬﺎ ﻳـﻚ ﺑـﺎر‬

                                ‫ﻳﻚ ﻛﺮدن ‪ ADSC‬آﻏﺎز ﺷﺪه و ﭘﺲ از آن ﺗﺒﺪﻳﻼت ﻣﺘﻮاﻟﻲ اﻧﺠﺎم ﺧﻮاﻫﺪ ﺷﺪ.‬

‫ﻫﻤﺎن ﻃﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ در ﺻﻮرت ﻓﻌﺎل ﺑﻮدن ﺑﻴﺖ ‪ ADIE‬ﺑﺎﻻ رﻓﺘﻦ ﭘﺮﭼﻢ اﺗﻤﺎم ﺗﺒﺪﻳﻞ )‪ (ADIF‬ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ‬

‫اﻳﺠﺎد وﻗﻔﻪ ﺷﺪه و ﺑﺎ اﺟﺮاي ‪ ISR‬اﻳﻦ ﺑﻴﺖ ﺗﻮﺳﻂ ﺳـﺨﺖ اﻓـﺰار ﭘـﺎك ﺷـﻮد. در ﺻـﻮرﺗﻲ ﻛـﻪ ‪ ADC‬در وﺿـﻌﻴﺖ‬

‫‪ Single Conversion‬ﻳﺎ ﺗﻚ ﺗﺒﺪﻳﻞ ﺑﺎﺷﺪ ﺑﺮاي ﺷﺮوع ﺗﺒﺪﻳﻞ ﺑﻌﺪي ﺑﺎﻳﺪ ﭘﺮﭼﻢ ‪ ADIF‬ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑـﺮ روي آن‬

‫ﭘﺎك ﺷﻮد، در ﺣﺎﻟﻴﻜﻪ وﺿﻌﻴﺖ ‪ Free Running‬اﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﺪ ﺑﺪون در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜﻪ ﭘﺮﭼﻢ ‪ ADIF‬ﭘـﺎك‬

                                                          ‫ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ ﺗﺒﺪﻳﻼت ﻣﺘﻮاﻟﻲ اﻧﺠﺎم ﺧﻮاﻫﺪ ﺷﺪ.‬




                                                     ‫- ٧٨١ -‬
‫881 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




                                                                  ‫ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه و زﻣﺎن ﺑﻨﺪي ﺗﺒﺪﻳﻞ‬




    ‫ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض، ﻣﺪاري ﻛﻪ ﺑﺮ اﺳﺎس ﺗﻘﺮﻳﺐ ﻫﺎي ﻣﺘﻮاﻟﻲ ﺗﺒﺪﻳﻞ آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل را اﻧﺠﺎم ﻣﻲ دﻫﺪ ﺑﺮاي‬

     ‫رﺳﻴﺪن ﺑﻪ ﻣﺎﻛﺰﻳﻤﻢ ‪ ،Resolution‬ﻧﻴﺎز ﺑﻪ ﻳﻚ ﻛﻼك ورودي ﺑﺎ ﻓﺮﻛﺎﻧﺴﻲ ﺑﻴﻦ 05 ﺗﺎ 002 ﻛﻴﻠﻮﻫﺮﺗﺰ دارد. ﻣﺎژول‬

        ‫‪ ADC‬ﺑﺮاي ﺗﺎﻣﻴﻦ ﻛﻼك ﻣﻮرد ﻧﻴﺎز داراي ﻳﻚ ﭘﻴﺶ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻣﻘﺪار آن ﺑﻮﺳﻴﻠﻪ ي ﺑﻴﺖ ﻫﺎي‬

‫‪ ADPS‬از رﺟﻴﺴﺘﺮ ‪ ADCSRA‬ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد. واﺣﺪ ‪ ADC‬ﺑﺮاي ﻋﻤﻠﻜﺮد ﺻﺤﻴﺢ ﺑﻪ ﻓﺮﻛﺎﻧﺲ ﻛﻼﻛﻲ ﺑﻴﻦ 05 ﺗﺎ‬

        ‫002 ﻛﻴﻠﻮﻫﺮﺗﺰ ﻧﻴﺎز دارد و در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻘﺪار آن ﺧﺎرج از اﻳﻦ ﻣﺤﺪوده ﺗﻌﺮﻳﻒ ﺷﻮد ﻣﻤﻜﻦ اﺳﺖ ﻋﻤﻠﻜﺮد‬

                                                                                ‫ﺻﺤﻴﺤﻲ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ.‬




                                                      ‫- ٨٨١ -‬
‫981 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                          ‫ ‬                    ‫ ‪       www.pnkavosh.com‬‬
‫در ﺻﻮرت اﺳﺘﻔﺎده از ‪ Mode‬ﺗﻚ ﺗﺒﺪﻳﻞ ﺑﻪ دﻟﻴﻞ ﺗﻨﻈﻴﻤﺎت اوﻟﻴﻪ ي ‪ ADC‬ﻫﺮ ﺗﺒﺪﻳﻞ ﺣﺪود 52 ﺳﻴﻜﻞ ﻛﻼك ﻃـﻮل‬

     ‫ﻣﻲ ﻛﺸﺪ، درﺣﺎﻟﻴﻜﻪ در وﺿﻌﻴﺖ ‪ Free Running‬ﻫﺮ ﺗﺒﺪﻳﻞ ﺑﺮاي ﻛﺎﻣﻞ ﺷﺪن ﺣﺪود 31 ﻛﻼك زﻣﺎن ﻧﻴﺎز دارد.‬




                                                                              ‫ﻓﻴﻠﺘﺮ ﻛﺎﻫﺶ ﻧﻮﻳﺰ ورودي‬

‫ﻣﺪارات داﺧﻠﻲ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺑﺎ اﻳﺠﺎد ﻧﻮﻳﺰ ﺑﺎﻋﺚ ﻛﺎﻫﺶ دﻗﺖ ﻣﻘﺪار ﺧﻮاﻧﺪه ﺷـﺪه ﺗﻮﺳـﻂ ‪ ADC‬ﻣـﻲ ﺷـﻮﻧﺪ، ﺑـﺮاي‬

‫ﺑﻬﺒﻮد اﻳﻦ ﻣﺸﻜﻞ ﻣﻲ ﺗﻮان در زﻣـﺎن ﺗﺒـﺪﻳﻞ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟـﺮ را ﺑـﻪ ﻳﻜـﻲ از ‪ Mode‬ﻫـﺎي ﻛـﻢ ﺗـﻮان ‪ADC Noise‬‬

                          ‫‪ Reduction‬ﻳﺎ ‪ Idle‬ﺑﺮد ﺗﺎ ﻋﻤﻠﻴﺎت ﺗﺒﺪﻳﻞ ﺑﻌﺪ از ﺧﺎﻣﻮش ﺷﺪن ‪ CPU‬اﻧﺠﺎم ﺷﻮد.‬




                                                              ‫ﭘﺮوژه 31: اﻧﺪازه ﮔﻴﺮي دﻣﺎ ﺑﺎ ﺳﻨﺴﻮر 53‪LM‬‬



‫*****************************************************/‬
‫53‪Project : Temprature Measurement with LM‬‬
‫‪Author‬‬          ‫‪: Reza Sepas Yar‬‬
‫‪Company : Pishro Noavaran Kavosh‬‬
‫‪Chip type‬‬                        ‫61‪: ATmega‬‬
‫‪Clock frequency‬‬                  ‫‪: 1.000000 MHz‬‬
‫/*****************************************************‬


‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬
‫>‪#include <stdio.h‬‬
‫0000008 ‪#define xtal‬‬


‫‪// Alphanumeric LCD Module functions‬‬
‫‪#asm‬‬
      ‫‪.equ __lcd_port=0x12 ;PORTD‬‬
                                                    ‫- ٩٨١ -‬
P a g e | 190
        www.avr.ir                                 www.pnkavosh.com 
#endasm


#include <lcd.h>


#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 | 191
        www.avr.ir                                     www.pnkavosh.com 
// 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 | 192
        www.avr.ir                            www.pnkavosh.com 


                                                             :‫ﺷﻤﺎﺗﻴﻚ‬




                             - ١٩٢ -
‫391 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬




                                    ‫ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ‬



‫ﻣﺎژول ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ داراي دو ورودي 0‪ AIN‬و 1‪ AIN‬ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ اﻳﻦ دو ﺑﻪ ﺗﺮﺗﻴﺐ ورودي ﻣﺜﺒـﺖ و‬

‫ﻣﻨﻔﻲ واﺣﺪ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺑﻮده ﻛﻪ ﻫﻤﺎﻧﻨﺪ ﻳﻚ ﺗﻘﻮﻳﺖ ﻛﻨﻨﺪه ي ﻋﻤﻠﻴﺎﺗﻲ وﻟﺘﺎژ روي اﻳـﻦ دو ﭘﺎﻳـﻪ را ﻣﻘﺎﻳﺴـﻪ ﻛـﺮده و‬

‫ﻫﻨﮕﺎﻣﻲ ﻛﻪ وﻟﺘﺎژ روي ﭘﺎﻳﻪ ي 0‪ AIN‬ﺑﻴﺸﺘﺮ از وﻟﺘﺎژ 1‪ AIN‬ﺑﺎﺷﺪ ﺧﺮوﺟﻲ آن ﻳﻌﻨﻲ ﺑﻴﺖ ‪ ACO‬ﻳﻚ ﻣﻲ ﺷﻮد. اﻳﻦ‬

       ‫ﺧﺮوﺟﻲ ﻋﻼوه ﺑﺮ ﻛﺎرﺑﺮدﻫﺎي ﻋﺎدي ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﺗﺮﻳﮕﺮ ﻛﺮدن ورودي ‪ Capture‬ﺗﺎﻳﻤﺮ ﻳﻚ ﻧﻴﺰ ﺑﻪ ﻛﺎر رود.‬




                                                        ‫- ٣٩١ -‬
‫491 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                ‫ ‬                      ‫ ‪       www.pnkavosh.com‬‬



                                                                             ‫رﺟﻴﺴﺘﺮﻫﺎي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ‬




                                                                        ‫‪Special Function IO Register‬‬



         ‫‪SFIOR‬‬           ‫7‬          ‫6‬         ‫5‬           ‫4‬         ‫3‬         ‫2‬         ‫1‬         ‫0‬
          ‫ﻧﺎم ﺑﻴﺖ‬   ‫01‪ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR‬‬



‫‪ :Analog Comparator Multiplexer Enable‬ﻣﺎژول ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ اﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﺗـﺎ‬

‫ورودي ﻣﻨﻔﻲ از ﻃﺮﻳﻖ ﭘﺎﻳﻪ ﻫﺎي 0‪ ADC‬ﺗﺎ7‪ ADC‬اﻧﺘﺨﺎب ﺷﻮد. در ﺻﻮرت ﻳﻚ ﺑﻮدن ﺑﻴﺖ ‪ ACME‬و ﺧـﺎﻣﻮش‬

‫ﺑﻮدن ‪) ADC‬ﺑﻴﺖ ‪ ADEN‬در ‪ ADCSRA‬ﺻﻔﺮ ﺑﺎﺷﺪ(، ﺧﺮوﺟﻲ ﻣﺎﻟﺘﻲ ﭘﻠﻜﺴﺮ ‪ ADC‬ﺑـﻪ ﻋﻨـﻮان ورودي ﻣﻨﻔـﻲ‬

                         ‫ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه اﻧﺘﺨﺎب ﻣﻲ ﺷﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﭘﺎﻳﻪ 1‪ AIN‬ورودي ﻣﻨﻔﻲ ﺧﻮاﻫﺪ ﺑﻮد.‬




                                         ‫‪Analog Comparator Control and Status Register‬‬




           ‫‪ACSR‬‬          ‫7‬      ‫6‬        ‫5‬        ‫4‬            ‫3‬         ‫2‬          ‫1‬         ‫0‬
           ‫0‪ ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS‬ﻧﺎم ﺑﻴﺖ‬




‫]0:1[‪ :Analog Comparator Interrupt Mode Select‬اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨـﺪ ﻛـﻪ ﻛـﺪاﻣﻴﻚ از‬

                             ‫روﻳﺪادﻫﺎي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ وﻗﻔﻪ ي آن را ﺗﺮﻳﮕﺮ ﻣﻲ ﻛﻨﺪ.‬


                                                          ‫- ٤٩١ -‬
‫591 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬


                         ‫1‪ACIS‬‬    ‫0‪ACIS‬‬                     ‫وﺿﻌﻴﺖ وﻗﻔﻪ‬

                           ‫0‬         ‫0‬           ‫وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه در ‪ Toggle‬ﺧﺮوﺟﻲ‬

                           ‫0‬         ‫1‬                                         ‫رزرو ﺷﺪه‬

                                            ‫وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه در ﻟﺒـﻪ ي ﭘـﺎﻳﻴﻦ روﻧـﺪه ي‬
                           ‫1‬         ‫0‬
                                                                                 ‫ﺧﺮوﺟﻲ‬

                                            ‫وﻗﻔﻪ ي ﻣﻘﺎﻳﺴـﻪ ﻛﻨﻨـﺪه در ﻟﺒـﻪ ي ﺑـﺎﻻ روﻧـﺪه ي‬
                           ‫1‬         ‫1‬
                                                                                 ‫ﺧﺮوﺟﻲ‬



‫‪ :Analog Comparator Input Capture Enable‬ﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ورودي ‪ Capture‬ﺗﺎﻳﻤﺮ ﻳـﻚ‬

                                                                    ‫از ﻃﺮﻳﻖ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺗﺮﻳﮕﺮ ﻣﻲ ﺷﻮد.‬



‫‪ :Analog Comparator Interrupt Enable‬در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ ﺑﻴﺖ و ﺑﻴﺖ ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔـﻪ ﻫـﺎ‬

                                                     ‫ﻳﻚ ﺑﺎﺷﺪ وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﻓﻌﺎل ﺧﻮاﻫﺪ ﺑﻮد.‬



‫‪ :Analog Comparator Interrupt Flag‬اﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻛﻪ ﻳﻜﻲ از روﻳﺪاد ﻫﺎي ﺗﻌﺮﻳﻒ ﺷـﺪه ﺑﻮﺳـﻴﻠﻪ‬

‫ي ﺑﻴﺖ ﻫﺎي 1‪ ACIS‬و 0‪ ACIS‬روي دﻫﺪ، ﺑﻮﺳﻴﻠﻪ ي ﺳﺨﺖ اﻓﺰار ﻳﻚ ﻣﻲ ﺷﻮد. در اﻳﻦ وﺿﻌﻴﺖ اﮔـﺮ ‪ ACIE‬و‬

‫ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ ﻳﻚ ﺑﺎﺷﺪ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ‪ ISR‬ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﻣﻨﺸﻌﺐ ﺧﻮاﻫﺪ ﺷﺪ و ﺑﻴـﺖ ‪ ACI‬ﺗﻮﺳـﻂ ﺳـﺨﺖ‬

                          ‫اﻓﺰار ﭘﺎك ﺧﻮاﻫﺪ ﺷﺪ، در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻧﺮم اﻓﺰار ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ آن را ﭘﺎك ﻛﻨﺪ.‬



‫‪ :Analog Comparator Output‬اﻳﻦ ﺑﻴﺖ ﺧﺮوﺟﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه آﻧﺎﻟﻮگ ﺑﻮده و ﺑﺎ ﺗﺎﺧﻴﺮي ﺑﻴﻦ ﻳـﻚ ﺗـﺎ دو‬

                                                                                            ‫ﺳﻴﻜﻞ ﺳﻨﻜﺮون ﻣﻲ ﺷﻮد.‬




                                                          ‫- ٥٩١ -‬
‫691 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬
‫‪ :Analog Comparator Bandgap Select‬ﺑﺎ ﻳﻚ ﺷﺪن اﻳـﻦ ﺑﻴـﺖ وﻟﺘـﺎژ ﻣﺮﺟـﻊ ‪ Bandgap‬ﺟـﺎﻳﮕﺰﻳﻦ‬

‫ورودي ﻣﺜﺒﺖ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ﺧﻮاﻫﺪ ﺷﺪ. در ﺻﻮرت ﺻﻔﺮ ﺑﻮدن ﺑﻴـﺖ ‪ ACGB‬ﭘـﻴﻦ 0‪ AIN‬ورودي ﻣﺜﺒـﺖ ﻣﻘﺎﻳﺴـﻪ‬

                                                                                          ‫ﻛﻨﻨﺪه ﺧﻮاﻫﺪ ﺑﻮد.‬



‫‪ :Analog Comparator Disable‬ﺑﺎ ﻳﻚ ﺷﺪن اﻳﻦ ﺑﻴﺖ ﺗﻐﺬﻳﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﻗﻄﻊ ﻣﻲ ﺷﻮد. اﻳﻦ‬

‫ﻣﺴﺌﻠﻪ ﺑﻪ ﻛﺎﻫﺶ ﺗﻮان ﻣﺼﺮﻓﻲ در ‪ Mode‬ﻫﺎي ﻓﻌﺎل و ﺑﻴﻜﺎري ﻛﻤﻚ ﺧﻮاﻫﺪ ﻛﺮد. ﻗﺒـﻞ از ﺗﻐﻴﻴـﺮ دادن ﺑﻴـﺖ ‪ACD‬‬

‫ﺑﺎﻳﺪ وﻗﻔﻪ ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﺑﺎ ﭘﺎك ﻛﺮدن ﺑﻴﺖ ‪ ACIE‬از ‪ ACSR‬ﻏﻴﺮ ﻓﻌـﺎل ﺷـﻮد در ﻏﻴـﺮ اﻳﻨﺼـﻮرت در‬

                                                                ‫زﻣﺎن ﺗﻐﻴﻴﺮ اﻳﻦ ﺑﻴﺖ ﻣﻲ ﺗﻮاﻧﺪ وﻗﻔﻪ ﺑﻮﺟﻮد آﻳﺪ.‬



                                                      ‫ورودي ﻣﺎﻟﺘﻲ ﭘﻠﻜﺲ ﺷﺪه ي ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ‬




‫اﻳﻦ اﻣﻜﺎن وﺟﻮد دارد ﻛﻪ ﻫﺮ ﻳﻚ از ورودي ﻫﺎي 0‪ ADC‬ﺗﺎ 7‪ ADC‬ﺑﻪ ﻋﻨﻮان ورودي ﻣﻨﻔﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه آﻧـﺎﻟﻮگ‬

‫اﻧﺘﺨﺎب ﺷﻮﻧﺪ. ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﻣﺴﺌﻠﻪ ﺑﺎﻳﺪ )ﺑﺎ ﺻﻔﺮ ﺑﻮدن ﺑﻴﺖ ‪ (ADEN‬ﻣﺒﺪل آﻧﺎﻟﻮگ ﺑﻪ دﻳﺠﻴﺘﺎل ﺧﺎﻣﻮش ﺑـﻮده‬

‫و ﺑﻴﺖ ‪ ACME‬از ‪ SFIOR‬ﻳﻚ ﺑﺎﺷﺪ. در اﻳﻦ وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي ]0:2[‪ MUX‬از رﺟﻴﺴﺘﺮ ‪ ADMUX‬ورودي‬

‫ﻣﻨﻔﻲ را ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﻨﺪ. ﻣﺴﻠﻤﺎ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ‪ ACME‬ﺻﻔﺮ ﺑﻮده ﻳﺎ ‪ ADEN‬ﻳـﻚ ﺑﺎﺷـﺪ‬

                                              ‫ﭘﻴﻦ 1‪ AIN‬ورودي ﻣﻨﻔﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ي آﻧﺎﻟﻮگ ﺧﻮاﻫﺪ ﺑﻮد.‬




                     ‫ورودي ﻣﻨﻔﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻨﺪه ]0:2[‪ACME ADEN MUX‬‬

                         ‫0‬         ‫‪x‬‬          ‫‪xxx‬‬                   ‫1‪AIN‬‬

                         ‫‪x‬‬         ‫1‬          ‫‪xxx‬‬                   ‫1‪AIN‬‬



                                                      ‫- ٦٩١ -‬
P a g e | 197
        www.avr.ir                                               www.pnkavosh.com 
                         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 | 198
        www.avr.ir                                 www.pnkavosh.com 
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 | 199
        www.avr.ir                            www.pnkavosh.com 




                             - ١٩٩ -
P a g e | 200
        www.avr.ir                                                               www.pnkavosh.com 




                                            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                                          Analog Devices

   AD7858                  ADC           12Bit, 8 channel 200ksps                       Analog Devices

                                         1/2/4 channel 256 positions
   AD8400                Digital Pot                                                    Analog Devices
                                         1, 10, 50 100kOhm 10MHz update rate

                                         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 | 201
        www.avr.ir                                                                    www.pnkavosh.com 
 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    Dual 10k, 50k and 100k                              DALLAS

   DS1305                   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

                                           data retention >40 years
 NM25C020                EEPROM                                                                 Fairchild
                                           hard- and software write protection

    KP100           Pressure Sensor        Range 60 ... 130kPa                                  Infineon

    82527           CAN Controller         Flexible CPU-interface CAN 2.0                         Intel

  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

                                           8-digit 10MHz clock rate
  MAX7219          LED display driver                                                           Maxim
                                           digital/analog brightness control

  25AA040                EEPROM            4k max. 3MHz clock data retention >200              Microchip



                                                           - ٢٠١ -
P a g e | 202
        www.avr.ir                                                                www.pnkavosh.com 
                                          years

  MCP3001                ADC              10Bit, 2.7V to 5V 200ksps @ 5V low power         Microchip

                                          Programmable Bit rate up tp 1MHz
  MCP2510            CAN Controller                                                        Microchip
                                          0... 8 Bytes message frame

MC68HC86T1            RTC + RAM           32x8Bit static-RAM                               Motorola

                                                                                            National
  CLC5506       GTA (Gain Trim Amplifier) 600MHz bandwidth control range 16dB
                                                                                         Semiconductor

                                                                                            National
  COP472-3           LCD Controller       Keine SDO-Leitung
                                                                                         Semiconductor

                                                                                            National
    LM74           Temperature Sensor     12Bit + sign 3V to 5V -55 °C to +150 °C
                                                                                         Semiconductor

                                                                                            National
  MM5483             LCD Controller       31 segment outputs cascadeable
                                                                                         Semiconductor

                  High Voltage Display                                                      National
  MM58342                                 35V max cascadeable
                         Driver                                                          Semiconductor

                                                                                            National
 USBN9602            USB Controller       DMA-Support Several FIFOs
                                                                                         Semiconductor




                                                                                        SPI ‫ﻧﺤﻮه ﻋﻤﻠﻜﺮد‬




                                           :‫اﻳﻦ اﺳﺘﺎﻧﺪارد ﺑﺮاي اﻳﺠﺎد ﻳﻚ ارﺗﺒﺎط ﺑﻪ ﭼﻬﺎر ﺧﻂ ارﺗﺒﺎﻃﻲ ﻧﻴﺎز دارد‬


                          Master                          Slave

                                  SCK                SCK
                              MOSI                   MOSI
                              MISO                   MISO

                                   SS                SS




                                                         - ٢٠٢ -
‫302 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻼﺣﻈﻪ ﻣﻲ ﺷﻮد اﻳﻦ ﭼﻬﺎر ﺧﻂ ‪ 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‬ﺳﻨﻜﺮون‬




                                                      ‫- ٣٠٢ -‬
‫402 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                     ‫ ‪       www.pnkavosh.com‬‬



                                        ‫رﺟﻴﺴﺘﺮﻫﺎي ‪SPI‬‬




‫ﻣﺎژول ‪ SPI‬داراي ﺳﻪ رﺟﻴﺴﺘﺮ ‪ SPSR ،SPDR‬و ‪ SPCR‬ﺑﻮده ﻛﻪ ﺑﻪ ﺗﺮﺗﻴﺐ رﺟﻴﺴﺘﺮﻫﺎي داده، وﺿﻌﻴﺖ و ﻛﻨﺘﺮل‬

                                                                                                ‫ﻣﻲ ﺑﺎﺷﻨﺪ.‬




                                                                                  ‫‪SPI Data Register‬‬



                ‫‪SPDR‬‬       ‫7‬       ‫6‬      ‫5‬           ‫4‬         ‫3‬   ‫2‬        ‫1‬        ‫0‬
                ‫ﻧﺎم ﺑﻴﺖ‬   ‫‪MSB‬‬                                                       ‫‪LSB‬‬


‫ﻧﻮﺷﺘﻦ ﺑﺮ روي اﻳﻦ رﺟﻴﺴﺘﺮ ﺷﺮوع اﻧﺘﻘﺎل داده را ﻣﻮﺟﺐ ﺧﻮاﻫﺪ ﺷﺪ و ﺧﻮاﻧﺪن آن ﻣﻮﺟﺐ ﺧﻮاﻧـﺪن داده ي ﻣﻮﺟـﻮد‬

                                                                                 ‫در ﺑﺎﻓﺮ درﻳﺎﻓﺖ ﺧﻮاﻫﺪ ﺷﺪ.‬



                                                                                 ‫‪SPI Status Register‬‬



                ‫‪SPSR‬‬       ‫7‬        ‫6‬         ‫5‬           ‫4‬     ‫3‬   ‫2‬       ‫1‬         ‫0‬
                ‫ﻧﺎم ﺑﻴﺖ‬   ‫‪SPIF WCOL‬‬           ‫-‬           ‫-‬     ‫-‬   ‫-‬       ‫-‬     ‫‪SPI2X‬‬



‫‪ :Double SPI Speed Bit‬ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮ روي اﻳﻦ ﺑﻴﺖ در ﺻـﻮرﺗﻴﻜﻪ ﻣـﺎژول ‪ SPI‬در وﺿـﻌﻴﺖ ‪Master‬‬

                                         ‫ﺑﺎﺷﺪ ﻓﺮﻛﺎﻧﺲ ﻛﻼك ﻣﻮﺟﻮد روي ﭘﻴﻦ ‪ SCK‬دو ﺑﺮاﺑﺮ ﺧﻮاﻫﺪ ﺷﺪ.‬


                                                      ‫- ٤٠٢ -‬
‫502 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬



‫‪ :Write COLlision Flag‬اﻳﻦ ﭘﺮﭼﻢ زﻣﺎﻧﻲ ﻳﻚ ﺧﻮاﻫﺪ ﺷﺪ ﻛﻪ در ﺣﻴﻦ اﻧﺘﻘﺎل ﻳـﻚ ﺑﺎﻳـﺖ ﺑـﺮ روي رﺟﻴﺴـﺘﺮ‬

                             ‫‪ SPDR‬ﻣﻘﺪاري ﻧﻮﺷﺘﻪ ﺷﻮد. ﺑﺎ اوﻟﻴﻦ ﺧﻮاﻧﺪن رﺟﻴﺴﺘﺮ ‪ SPSR‬اﻳﻦ ﺑﻴﺖ ﭘﺎك ﻣﻲ ﺷﻮد.‬




‫‪ :SPI Interrupt Flag‬اﻳﻦ ﺑﻴﺖ در دو ﺣﺎﻟﺖ ﻳﻚ ﻣﻲ ﺷﻮد: 1. ﺑﺎ اﺗﻤﺎم ارﺳﺎل ﻳﻚ ﺑﺎﻳﺖ اﻳﻦ ﭘﺮﭼﻢ ﻳﻚ ﺷـﺪه و‬

‫در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻴﺖ ‪ SPIE‬و ﻓﻌﺎل ﺳﺎز ﻋﻤﻮﻣﻲ وﻗﻔﻪ ﻫﺎ ﻳﻚ ﺑﺎﺷﻨﺪ اﺗﻤﺎم ﻋﻤﻠﻴﺎت ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻳﺠـﺎد ﻳـﻚ وﻗﻔـﻪ‬

‫ﺷﻮد. 2. ﭘﻴﻦ ‪ SS‬از ﺧﺎرج ﺗﻮﺳﻂ ﻳﻚ وﺳﻴﻠﻪ ي دﻳﮕﺮ زﻣﻴﻦ ﺷﻮد، اﻳﻦ ﺑﻪ ﻣﻌﻨﺎي از دﺳﺖ دادن ﺣﺎﻛﻤﺖ ﺑﺎس ﺑـﻮده و‬

‫اﻳﻦ وﺿﻌﻴﺖ ﺑﺎ ﻳﻚ ﺷﺪن ﺑﻴﺖ ‪ SPIF‬اﻋﻼم ﻣﻲ ﺷﻮد. ﺑﺎ اﺟﺮاي ‪ ISR‬ﻳﺎ ﺧﻮاﻧﺪن رﺟﻴﺴﺘﺮ وﺿﻌﻴﺖ اﻳﻦ ﺑﻴﺖ ﭘﺎك ﻣﻲ‬

                                                                                                   ‫ﺷﻮد.‬



                                                                             ‫‪SPI Control Register‬‬



           ‫‪SPCR‬‬          ‫7‬      ‫6‬        ‫5‬        ‫4‬                 ‫3‬   ‫2‬       ‫1‬        ‫0‬
           ‫0‪ SPIE SPE DORD MSTR CPOL SPHA SPR1 SPR‬ﻧﺎم ﺑﻴﺖ‬




‫0 ‪ :SPI Clock Rate Select 1 and‬اﻳﻦ دو ﺑﻴﺖ ﻧﺮخ ﻛﻼك ‪ SCK‬را ﻛﻪ ‪ Master‬اﻳﺠـﺎد ﻣـﻲ ﻛﻨـﺪ ﻣﻄـﺎﺑﻖ‬

                                                                                ‫ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ.‬




                                                          ‫- ٥٠٢ -‬
‫602 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                             ‫ ‪       www.pnkavosh.com‬‬




                               ‫ﻓﺮﻛﺎﻧﺲ ‪SPI2X SPR1 SPR0 SCK‬‬

                                 ‫0‬       ‫0‬           ‫0‬              ‫4/ ‪f osc‬‬

                                 ‫0‬       ‫0‬           ‫1‬             ‫61/ ‪f osc‬‬

                                 ‫0‬       ‫1‬           ‫0‬             ‫46/ ‪f osc‬‬

                                 ‫0‬       ‫1‬           ‫1‬             ‫821/ ‪f osc‬‬

                                 ‫1‬       ‫0‬           ‫0‬              ‫2/ ‪f osc‬‬

                                 ‫1‬       ‫0‬           ‫1‬              ‫8/ ‪f osc‬‬

                                 ‫1‬       ‫1‬           ‫0‬             ‫23/ ‪f osc‬‬

                                 ‫1‬       ‫1‬           ‫1‬             ‫46/ ‪f osc‬‬




‫‪ Clock Phase‬و ‪ :Clock Polarity‬اﻳﻦ دو ﺑﻴﺖ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ زﻣـﺎن ﺑﻨـﺪي اﻧﺘﻘـﺎل و درﻳﺎﻓـﺖ داده روي‬

                                                                                     ‫ﺑﺎس ‪ SPI‬را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ:‬




                         ‫ﻟﺒﻪ ي ﻧﻤﻮﻧﻪ ﺑﺮداري ﻟﺒﻪ ي ﺷﻴﻔﺖ ‪CPOL CPHA‬‬

                           ‫0‬         ‫0‬       ‫ﭘﺎﻳﻴﻦ روﻧﺪه‬             ‫ﺑﺎﻻ روﻧﺪه‬

                           ‫0‬         ‫1‬       ‫ﺑﺎﻻ روﻧﺪه‬              ‫ﭘﺎﻳﻴﻦ روﻧﺪه‬

                           ‫1‬         ‫0‬       ‫ﺑﺎﻻ روﻧﺪه‬              ‫ﭘﺎﻳﻴﻦ روﻧﺪه‬

                           ‫1‬         ‫1‬       ‫ﭘﺎﻳﻴﻦ روﻧﺪه‬             ‫ﺑﺎﻻ روﻧﺪه‬




                                                         ‫- ٦٠٢ -‬
‫702 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
                ‫‪ :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‬را ﻳﻚ ﻧﮕﺎه دارد.‬




                                                      ‫- ٧٠٢ -‬
‫802 | ‪P a g e‬‬
      ‫    ‪www.avr.ir‬‬                          ‫ ‬               ‫ ‪       www.pnkavosh.com‬‬
‫در ﻧﻘﻄﻪ ي ﻣﻘﺎﺑﻞ زﻣﺎﻧﻴﻜﻪ ﻣﺎژول ‪ SPI‬در ﻧﻘﺶ ‪ Slave‬ﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه اﺳﺖ، ﻣﺎداﻣﻴﻜـﻪ ﺧـﻂ ‪ SS‬ﻳـﻚ اﺳـﺖ ﭘـﻴﻦ‬

‫‪ MISO‬در وﺿﻌﻴﺖ ‪ tri-stated‬ﻣﻲ ﺑﺎﺷﺪ. در اﻳﻦ ﺷﺮاﻳﻂ ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ رﺟﻴﺴﺘﺮ ‪ SPDR‬ﺗﻮﺳـﻂ ‪ Slave‬ﺑـﺮوز‬

‫ﺷﻮد اﻣﺎ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺧﻂ ‪ SS‬ﺗﻮﺳﻂ ‪ Master‬ﺻﻔﺮ ﻧﺸﻮد اﻧﺘﻘﺎل اﻧﺠـﺎم ﻧﺨﻮاﻫـﺪ ﺷـﺪ. ﭘـﺲ از ‪ Low‬ﺷـﺪن ‪ SS‬و‬

‫اﺗﻤﺎم درﻳﺎﻓﺖ ﻳﻚ ﺑﺎﻳﺖ ﭘﺮﭼﻢ ‪ SPIF‬ﻳﻚ ﺷﺪه و در ﺻﻮرت ﻳﻚ ﺑﻮدن ‪ SPIE‬و ﺑﻴـﺖ ‪ ،I‬اﻳـﻦ روﻳـﺪاد ﻣـﻲ ﺗﻮاﻧـﺪ‬

‫ﺑﺎﻋﺚ اﻳﺠﺎد وﻗﻔﻪ ﺷﻮد. ﭘﺲ از اﻳﻦ ﻣﻤﻜﻦ اﺳﺖ ‪ Slave‬داده ي ﺟﺪﻳﺪي را در ‪ SPDR‬ﻗﺮار دﻫﺪ ﻣﻨﺘﻬﺎ ﺑﺎﻳـﺪ ﻗﺒـﻞ از‬

                                                                           ‫آن داده ي درﻳﺎﻓﺘﻲ را ﺑﺨﻮاﻧﺪ.‬




                                                                                ‫ارﺗﺒﺎط ﺷﺒﻜﻪ اي در ‪SPI‬‬

‫ﻣﻄﺎﺑﻖ ﺗﺼﻮﻳﺮ زﻳﺮ ﺑﺎ اﺳﺘﻔﺎده از ﭘﻴﻦ ‪ SS‬ﻣﻲ ﺗـﻮان ﺗﻌـﺪادي ‪ Slave‬را ﻛﻨﺘـﺮل ﻧﻤـﻮد. ‪ Master‬ﺑﺎﻳـﺪ ﺗﻨﻬـﺎ ﭘـﻴﻦ ‪SS‬‬

                          ‫‪ Slave‬اي را ﻛﻪ ﻣﻲ ﺧﻮاﻫﺪ ﺑﺎ آن ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﺪ ﺻﻔﺮ ﻛﻨﺪ و ﺑﻘﻴﻪ را ﻳﻚ ﻧﮕﻪ دارد.‬




                                                     ‫- ٨٠٢ -‬
‫902 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                               ‫ ‬                    ‫ ‪       www.pnkavosh.com‬‬



                                                                              ‫ﺗﺎﺑﻊ )(‪ spi‬در ‪CodeVision‬‬

                ‫اﻋﻼن اﻳﻦ ﺗﺎﺑﻊ در ﻓﺎﻳﻞ ‪ spi.h‬ﺑﻮده و ﻧﺤﻮه ي ﻋﻤﻠﻜﺮد آن در ﻓﺎﻳﻞ ‪ spi.lib‬ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬



‫)‪unsigned char spi(unsigned char data‬‬
‫{‬
‫;‪SPDR=data‬‬
‫;)0==))‪while ((SPSR & (1<<SPIF‬‬
‫;‪return SPDR‬‬
‫}‬


‫ﺑﻨﺎﺑﺮاﻳﻦ آﻧﭽﻪ اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ ﻋﻨﻮان آرﮔﻮﻣﺎن درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ روي ﺑﺎس ‪ SPI‬ﻗﺮار ﻣﻲ دﻫﺪ و ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ آن ﻣﻘـﺪار‬

‫ﺧﻮاﻧﺪه ﺷﺪه از ﺑﺎس اﺳﺖ. ﻗﺒﻞ از اﺳﺘﻔﺎده از اﻳﻦ ﺗﺎﺑﻊ ﺑﺎﻳﺪ ‪ SPI‬ﺑﻮﺳﻴﻠﻪ ي رﺟﻴﺴﺘﺮﻫﺎي ﻛﻨﺘﺮل و وﺿﻌﻴﺖ ﺗﻨﻈﻴﻢ ﺷﺪه‬

                                                                                                       ‫ﺑﺎﺷﺪ.‬

                                                                   ‫ﻣﺜﺎل: )ارﺗﺒﺎط دو ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ از ﻃﺮﻳﻖ ‪(SPI‬‬

                                                                                      ‫ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﺮو ‪:Master‬‬

‫>‪#include <mega16.h‬‬
‫>‪#include <delay.h‬‬



‫‪// SPI functions‬‬
‫>‪#include <spi.h‬‬



‫)‪void main(void‬‬
‫{‬


                                                         ‫- ٩٠٢ -‬
P a g e | 210
        www.avr.ir                                         www.pnkavosh.com 



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 | 211
        www.avr.ir                                         www.pnkavosh.com 



// 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);
}
}

                                          - ٢١١ -
‫212 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬




                          ‫‪ Mode‬ﻫﺎي ‪ Sleep‬و ﺗﺎﻳﻤﺮ ‪Watchdog‬‬



‫ﺑﻪ ﻣﻨﻈﻮر ﻣﺪﻳﺮﻳﺖ ﻳﻬﻴﻨﻪ ي ﺗﻮان ﻣﺼﺮﻓﻲ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮﻫﺎي ‪ AVR‬داراي ﺣﺪاﻛﺜﺮ 6 ‪ Mode‬ﺧﻮاب ﻣﻲ ﺑﺎﺷﻨﺪ. ﺑـﺮاي‬

‫ورود ﺑﻪ ﻫﺮﻳﻚ از 6 وﺿﻌﻴﺖ ﺧﻮاب ﺑﺎﻳﺪ ﺑﻴﺖ ‪ SE‬از رﺟﻴﺴﺘﺮ ‪ MCUCE‬ﻳﻚ ﺷﺪه و دﺳﺘﻮراﻟﻌﻤﻞ ‪ SLEEP‬اﺟﺮا‬

‫ﺷﻮد. ﺑﻴﺖ ﻫﺎي ]0:2[‪ SM‬از اﻳﻦ رﺟﻴﺴﺘﺮ ﺗﻌﻴﻴﻦ ﻣـﻲ ﻛﻨﻨـﺪ ﻛـﻪ ﻣﻴﻜﺮوﻛﻨﺘﺮﻟـﺮ وارد ﻛـﺪاﻣﻴﻚ از ‪ Mode‬ﻫـﺎي ﻛـﻢ‬

‫ﻣﺼﺮف ﺷﻮد. در ﺣﻴﻦ ﺧﻮاب اﮔﺮ وﻗﻔﻪ اي روي دﻫﺪ ﻣﻴﻜﺮو از اﻳﻦ وﺿﻌﻴﺖ ﺧﺎرج ﺷﺪه و ﺑﻌﺪ از ﮔﺬﺷـﺖ 4 ﺳـﻴﻜﻞ‬

‫ﺑﻪ ﻋﻼوه ي زﻣﺎن ‪ ،Startup‬روﺗﻴﻦ ﺳﺮوﻳﺲ وﻗﻔﻪ را اﺟﺮا ﻛﺮده و ﭘﺲ از آن دﺳﺘﻮراﻟﻌﻤﻞ ﺑﻌﺪ از ‪ SLEEP‬را اﺟـﺮا‬

                                                                                         ‫ﺧﻮاﻫﺪ ﻛﺮد.‬



                                                                        ‫‪MCU Control Register‬‬


            ‫‪MCUCR‬‬          ‫7‬   ‫6‬     ‫5‬       ‫4‬           ‫3‬     ‫2‬         ‫1‬          ‫0‬
                ‫ﻧﺎم ﺑﻴﺖ‬   ‫00‪SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC‬‬


‫]0:2[‪ :Sleep Mode Select Bits‬اﻳﻦ ﺑﻴﺖ ﻫﺎ ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﻳﻜﻲ از 6 وﺿﻌﻴﺖ ‪ SLEEP‬را اﻧﺘﺨﺎب ﻣﻲ‬

     ‫ﻛﻨﻨﺪ. ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ‪ Mode‬ﻫﺎي ‪ Standby‬و ‪ Extended Standby‬ﻓﻘﻂ ﺑﺎ ﻣﻨﺒﻊ ﻛﻼك ﻛﺮﻳﺴﺘﺎل ﻳﺎ‬

                                                                ‫رزوﻧﺎﺗﻮر ﺧﺎرﺟﻲ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻣﻲ ﺑﺎﻧﺪ.‬




                                                     ‫- ٢١٢ -‬
‫312 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                           ‫ ‬                ‫ ‪       www.pnkavosh.com‬‬



                         ‫0‪SM2 SM1 SM‬‬                    ‫وﺿﻌﻴﺖ ﺧﻮاب‬

                          ‫0‬       ‫0‬       ‫0‬     ‫‪Idle‬‬

                          ‫0‬       ‫0‬       ‫1‬     ‫‪ADC Noise Reduction‬‬

                          ‫0‬       ‫1‬       ‫0‬     ‫‪Power-down‬‬

                          ‫0‬       ‫1‬       ‫1‬     ‫‪Power-save‬‬

                          ‫1‬       ‫0‬       ‫0‬                      ‫رزرو ﺷﺪه‬

                          ‫1‬       ‫0‬       ‫1‬                      ‫رزرو ﺷﺪه‬

                          ‫1‬       ‫1‬       ‫0‬     ‫‪Standby‬‬

                          ‫1‬       ‫1‬       ‫1‬     ‫‪Extende Standby‬‬



                              ‫‪ :Sleep Enable‬ﻗﺒﻞ از اﺟﺮاي دﺳﺘﻮر ‪ SLEEP‬ﺑﺎﻳﺪ اﻳﻦ ﺑﻴﺖ ﻳﻚ ﺷﺪه ﺑﺎﺷﺪ.‬




                                                                               ‫‪ Mode‬ﻫﺎي ﺧﻮاب‬



‫‪ :Idle Mode‬در اﻳﻦ وﺿﻌﻴﺖ ‪ CPU‬ﻣﺘﻮﻗـﻒ ﺷـﺪه اﻣـﺎ ‪ ,SPI, USART‬ﻣﻘﺎﻳﺴـﻪ ﻛﻨﻨـﺪه ي آﻧـﺎﻟﻮگ،‬             ‫•‬

‫‪ ,ADC, TWI‬ﺗﺎﻳﻤﺮﻫﺎ، ‪ Watchdog‬و ﺳﻴﺴﺘﻢ وﻗﻔﻪ ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ دﻫﻨﺪ. اﻳﻦ وﺿﻌﻴﺖ ﺑﺎﻋﺚ ﻣﻲ ﺷـﻮد ﻛـﻼك‬

‫‪ CPU‬و ﻛﻼك ‪ Flash‬ﻣﺘﻮﻗﻒ ﺷﺪه اﻣﺎ ﺑﻘﻴﻪ ي ﻣﻨﺎﺑﻊ ﻛﻼك ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ دﻫﻨﺪ. ﻣﻨﺎﺑﻊ وﻗﻔﻪ ي داﺧﻠﻲ و ﺧﺎرﺟﻲ‬

                                              ‫ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺎﻋﺚ ﺧﺮوج ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ از وﺿﻌﻴﺖ ﺧﻮاب ﺷﻮﻧﺪ.‬




                                                     ‫- ٣١٢ -‬
‫412 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                             ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
‫‪ 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‬ﺑﻮده ﺑﺎ اﻳﻦ ﺗﻔـﺎوت ﻛـﻪ اﺳـﻴﻼﺗﻮر‬                    ‫•‬

                                                                             ‫ﺧﺎرﺟﻲ ﻣﺘﻮﻗﻒ ﻧﻤﻲ ﺷﻮد.‬

                                                       ‫- ٤١٢ -‬
‫512 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                              ‫ ‬                  ‫ ‪       www.pnkavosh.com‬‬




                                 ‫ﺗﻮاﺑﻊ ﻣﺪﻳﺮﻳﺖ ﺗﻮان در ‪CodeVision‬‬



                                       ‫اﻋﻼن اﻳﻦ ﺗﻮاﺑﻊ در ﻓﺎﻳﻞ ‪ sleep.h‬ﻣﻲ ﺑﺎﺷﺪ. ﺷﺎﻣﻞ ﻣﻮارد زﻳﺮ ﻣﻲ ﺑﺎﺷﻨﺪ.‬

  ‫)(‪ :sleep_enable‬اﻳﻦ ﺗﺎﺑﻊ ﻓﻌﺎل ﺳﺎز ورود ﺑﻪ ‪ Mode‬ﻫﺎي ﺧﻮاب ﺑﻮده و ﻗﺒﻞ از اﺳﺘﻔﺎده از ﺳﺎﻳﺮ ﺗﻮاﺑﻊ ﻣﺪﻳﺮﻳﺖ‬

                                                                                     ‫ﺗﻮاﺑﻊ ﺑﺎﻳﺪ اﺟﺮا ﺷﻮد.‬

                         ‫)(‪ :sleep_disable‬اﻳﻦ ﺗﺎﺑﻊ ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن ‪ Mode‬ﻫﺎي ﺧﻮاب ﺑﻪ ﻛﺎر ﻣﻲ رود.‬

  ‫)(‪ standby() ،powersave() ،powerdown() ،idle‬و )(‪ :extended_standby‬ﺑﺎ اﺟﺮاي ﻫﺮﻳﻚ از اﻳﻦ‬

                                                        ‫ﺗﻮاﺑﻊ ﻣﻴﻜﺮو وارد ‪ Mode‬ﻛﻢ ﺗﻮان ﻣﺮﺑﻮﻃﻪ ﺧﻮاﻫﺪ ﺷﺪ.‬




                                          ‫ﺗﺎﻳﻤﺮ ‪Watchdog‬‬




‫ﺗﺎﻳﻤﺮ ‪ Watchdog‬از ﻳﻚ اﺳﻴﻼﺗﻮر داﺧﻠﻲ ﻣﺠﺰا ﺑﺎ ﻓﺮﻛﺎﻧﺲ 1 ﻣﮕﺎﻫﺮﺗﺰ ﻛﻼك درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺑـﺎ ﺗﻨﻈـﻴﻢ ﭘـﻴﺶ‬

‫ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪه ي ﺗﺎﻳﻤﺮ ‪ ،Watchdog‬ﻓﻮاﺻﻞ ﺑﻴﻦ ﻫﺮ ‪ Reset‬ﺑـﺎ ﺑﻴـﺖ ﻫـﺎي ]2:0[‪ WDP‬ﻗﺎﺑـﻞ ﺗﻨﻈـﻴﻢ اﺳـﺖ. ﺑـﺎ‬

‫دﺳﺘﻮراﻟﻌﻤﻞ ‪ WDR‬ﻳﺎ ‪ Reset‬ﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺗﺎﻳﻤﺮ ‪ Reset ,Watchdog‬ﺷﺪه و ﻧﺮم اﻓﺰار ﺑﺎﻳـﺪ در ﻓﻮاﺻـﻞ‬

‫ﻣﻨﺎﺳﺐ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ دﺳﺘﻮراﻟﻌﻤﻞ ﺗﺎﻳﻤﺮ را ‪ Reset‬ﻛﺮده ﺗﺎ ﻣﺎﻧﻊ ‪ Reset‬ﺷﺪن ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ ﺷﻮد. ﺑﻠـﻮك دﻳـﺎﮔﺮام‬

                                                             ‫ﺗﺎﻳﻤﺮ ‪ Watchdog‬در ﺗﺼﻮﻳﺮ زﻳﺮ دﻳﺪه ﻣﻲ ﺷﻮد.‬




                                                        ‫- ٥١٢ -‬
P a g e | 216
        www.avr.ir                                                     www.pnkavosh.com 




                                                    Watchdog Timer Control Register



                WDTCR 7 6 5       4           3         2           1          0
                ‫ﻧﺎم ﺑﻴﺖ‬   - - - WDTOE WDE WDP2 WDP1 WDP0



‫ ﻓﻌﺎل اﺳﺖ اﻳﻦ ﺑﻴﺖ ﻫﺎ ﺿﺮﻳﺐ ﺗﻘﺴﻴﻢ‬Watchdog ‫: زﻣﺎﻧﻲ ﻛﻪ ﺗﺎﻳﻤﺮ‬Watchdog Timer Prescaler[2:0]

                                                            .‫ﺗﺎﻳﻤﺮ را ﻣﻄﺎﺑﻖ ﺟﺪول زﻳﺮ ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻨﺪ‬




                                              - ٢١٦ -
‫712 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                            ‫ ‬                 ‫ ‪       www.pnkavosh.com‬‬
        ‫‪ Watchdog Turn-off Enable‬و ‪ :Watchdog Enable‬ﺑﺎ ﻧﻮﺷﺘﻦ ﻳﻚ روي ﺑﻴﺖ ‪ WDE‬ﺗﺎﻳﻤﺮ‬

‫‪ Watchdog‬ﻓﻌﺎل ﺷﺪه و ﺑﺎ ﭘﺎك ﻛﺮدن آن ﺗﺎﻳﻤﺮ ﻏﻴﺮ ﻓﻌﺎل ﻣﻲ ﺷﻮد. اﮔﺮﭼﻪ ﻓﻌﺎل ﻛﺮدن ﺗﺎﻳﻤﺮ ﺑﻪ ﺳﺎدﮔﻲ و ﺑﺎ ﻧﻮﺷﺘﻦ‬

                ‫ﻳﻚ روي ‪ WDE‬اﻧﺠﺎم ﻣﻲ ﺷﻮد اﻣﺎ ﺑﺮاي ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن آن ﺑﺎﻳﺪ ﻣﺮاﺣﻞ زﻳﺮ ﺑﻪ ﺗﺮﺗﻴﺐ اﻧﺠﺎم ﺷﻮد:‬

      ‫1. ﻫﻤﺰﻣﺎن ﺑﻴﺖ ﻫﺎي ‪ WDTOE‬و ‪ WDE‬را ﻳﻚ ﻛﻨﻴﺪ. )ﺑﻴﺖ ‪ WDE‬ﻋﻠﻴﺮﻏﻢ اﻳﻨﻜﻪ ﻗﺒﻼ ﻳﻚ ﺑﻮده ﺑﺎﺷﺪ ﺑﺎﻳﺪ‬

                                                                                    ‫ﻣﺠﺪدا ﻳﻚ ﺷﻮد.(‬

                                          ‫2. ﺗﺎ ﭼﻬﺎر ﺳﻴﻜﻞ ﺑﻌﺪ ﻧﺮم اﻓﺰار ﻓﺮﺻﺖ دارد ﺗﺎ ‪ WDE‬را ﭘﺎك ﻛﻨﺪ.‬




                                                      ‫- ٧١٢ -‬
‫812 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                ‫ ‬                           ‫ ‪       www.pnkavosh.com‬‬



                                                                              ‫ﭘﻴﻮﺳﺖ 1: ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴﺘﺮﻫﺎي ‪I/O‬‬




 ‫ﻫﺮ ﻳﻚ از ﭼﻬﺎر ﭘﻮرت ‪ C ،B ،A‬و ‪ D‬ﻗﻄﻌﻪ ي 61‪ ATmega‬داراي ﺳﻪ رﺟﻴﺴﺘﺮ ‪ PORTx ،DDRx‬و ‪PINx‬‬

      ‫ﺑﻮده ﻛﻪ ‪ x‬ﺣﺮف ﻣﺮﺑﻮط ﺑﻪ ﭘﻮرت ﻣﻲ ﺑﺎﺷﺪ. ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل رﺟﻴﺴﺘﺮﻫﺎي اوﻟﻴﻦ ﭘﻮرت، ‪ PORTA ،DDRA‬و‬

                                                                 ‫‪ PINA‬ﺑﻮده ﻛﻪ وﻇﺎﻳﻒ ﻫﺮ ﻳﻚ در ذﻳﻞ آﻣﺪه اﺳﺖ:‬




                                                                                       ‫رﺟﻴﺴﺘﺮ ‪:Data Direction‬‬

   ‫اﻳﻦ رﺟﻴﺴﺘﺮ ﻫﻤﺎﻧﻄﻮر ﻛﻪ از ﻧﺎم اش ﻣﺸﺨﺺ اﺳﺖ رﺟﻴﺴﺘﺮ ﺟﻬﺖ داده ي ﭘﻮرت ﺑﻮده و ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﭘﻮرت‬

  ‫ورودي اﺳﺖ ﻳﺎ ﺧﺮوﺟﻲ. ﺑﺪﻳﻦ ﺻﻮرت ﻛﻪ اﮔﺮ روي ﻫﺮﻛﺪام از ﺑﻴﺖ ﻫﺎي اﻳﻦ رﺟﻴﺴﺘﺮ ﻳﻚ ﻧﻮﺷﺘﻪ ﺷﻮد ﭘﻴﻦ ﻣﺘﻨﺎﻇﺮ‬

        ‫آن ﭘﻮرت ﺧﺮوﺟﻲ ﺑﻮده و در ﻏﻴﺮ اﻳﻨﺼﻮرت ورودي ﻣﻲ ﺑﺎﺷﺪ. ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﺑﺎ اﺟﺮاي ﻋﺒﺎرت = ‪DDRA‬‬

                    ‫10111101‪ 0b‬وﺿﻌﻴﺖ ﺑﻴﺖ ﻫﺎي اﻳﻦ رﺟﻴﺴﺘﺮ و ﭘﻴﻦ ﻫﺎي ﻣﺮﺑﻮﻃﻪ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ.‬



                  ‫‪DDRA‬‬        ‫7‬       ‫6‬       ‫5‬           ‫4‬             ‫3‬    ‫2‬        ‫1‬       ‫0‬
                   ‫ﻧﺎم ﺑﻴﺖ‬     ‫1‬      ‫0‬        ‫1‬          ‫1‬             ‫1‬     ‫1‬       ‫0‬        ‫1‬

                  ‫ﺟﻬﺖ داده‬   ‫ﺧﺮوﺟﻲ‬   ‫ورودي‬   ‫ﺧﺮوﺟﻲ‬   ‫ﺧﺮوﺟﻲ‬        ‫ﺧﺮوﺟﻲ‬     ‫ﺧﺮوﺟﻲ‬    ‫ورودي‬   ‫ﺧﺮوﺟﻲ‬




                                                                                                   ‫رﺟﻴﺴﺘﺮ ‪:PORTx‬‬

  ‫ﻋﻤﻠﻜﺮد اﻳﻦ رﺟﻴﺴﺘﺮ ﺑﺴﺘﮕﻲ ﺑﻪ ﺟﻬﺖ داده ي ﭘﻮرت دارد. در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﭘﻴﻜﺮﺑﻨﺪي ﺷﺪه ﺑﺎﺷﺪ.‬

 ‫آﻧﭽﻪ روي ﭘﻮرت ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد ﺳﻄﺢ ﻣﻨﻄﻘﻲ آن را ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ و در ﺻﻮرﺗﻲ ﻛﻪ ورودي ﺑﺎﺷﺪ ﺑﺎ ﻳﻚ ﻛﺮدن ﻫﺮ‬




                                                              ‫- ٨١٢ -‬
‫912 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬                                                    ‫ ‬                        ‫ ‪       www.pnkavosh.com‬‬
‫ﺑﻴﺖ ﻣﻘﺎوﻣﺖ ‪ Pull-up‬داﺧﻠﻲ ﻣﺮﺑﻮط ﺑﻪ آن ﭘﻴﻦ ﻓﻌﺎل ﻣﻲ ﺷﻮد. ﺑﻪ ﻋﻨﻮان ﻧﻤﻮﻧﻪ در اداﻣﻪ ي ﻣﺜﺎل ﻗﺒﻞ در ﺻﻮرﺗﻲ ﻛﻪ‬

                            ‫ﻋﺒﺎرت 00101011‪ PORTA = 0b‬اﺟﺮا ﺷﻮد، وﺿﻌﻴﺖ ﭘﻮرت ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد.‬



                ‫ﺷﻤﺎره ﺑﻴﺖ‬            ‫7‬          ‫6‬             ‫5‬            ‫4‬             ‫3‬         ‫2‬          ‫1‬              ‫0‬

                ‫‪DDRA‬‬                 ‫1‬          ‫0‬             ‫1‬            ‫1‬             ‫1‬         ‫1‬          ‫0‬              ‫1‬
                ‫‪PORTA‬‬                ‫1‬          ‫1‬             ‫0‬            ‫1‬             ‫0‬         ‫1‬          ‫0‬              ‫0‬
                                ‫ﺧﺮوﺟﻲ‬          ‫ورودي‬        ‫ﺧﺮوﺟﻲ‬        ‫ﺧﺮوﺟﻲ‬      ‫ﺧﺮوﺟﻲ‬      ‫ﺧﺮوﺟﻲ‬         ‫ورودي‬         ‫ﺧﺮوﺟﻲ‬

                                 ‫ﺑﺎ ﺳﻄﺢ‬         ‫ﺑﺎ‬          ‫ﺑﺎ ﺳﻄﺢ‬       ‫ﺑﺎ ﺳﻄﺢ‬      ‫ﺑﺎ ﺳﻄﺢ‬    ‫ﺑﺎ ﺳﻄﺢ‬        ‫ﺑﺪون‬          ‫ﺑﺎ ﺳﻄﺢ‬
                ‫ﺟﻬﺖ داده‬
                                 ‫ﻣﻨﻄﻘﻲ‬        ‫ﻣﻘﺎوﻣﺖ‬        ‫ﻣﻨﻄﻘﻲ‬        ‫ﻣﻨﻄﻘﻲ‬       ‫ﻣﻨﻄﻘﻲ‬     ‫ﻣﻨﻄﻘﻲ‬      ‫ﻣﻘﺎوﻣﺖ‬           ‫ﻣﻨﻄﻘﻲ‬

                                     ‫ﻳﻚ‬    ‫‪Pull-up‬‬           ‫ﺻﻔﺮ‬          ‫ﻳﻚ‬             ‫ﺻﻔﺮ‬    ‫ﻳﻚ‬        ‫‪Pull-up‬‬           ‫ﺻﻔﺮ‬




                                                                                                                             ‫رﺟﻴﺴﺘﺮ ‪:PINx‬‬

     ‫ﺑﺮاي ﺧﻮاﻧﺪن ﻣﻘﺪار ﻫﺮ ﭘﻴﻦ ﺑﺎﻳﺪ ﻣﺤﺘﻮﻳﺎت اﻳﻦ رﺟﻴﺴﺘﺮ ﺧﻮاﻧﺪه ﺷﻮد. ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﭼﻨﺎﻧﭽﻪ ‪ PORC‬را ﻗﺒﻼ ﺑﻪ‬

   ‫ﺻﻮرت ورودي ﭘﻴﻜﺮﺑﻨﺪي ﻛﺮده ﺑﺎﺷﻴﻢ و ﻣﻘﺪار رﺟﻴﺴﺘﺮ ‪ PINC‬ﺑﺮاﺑﺮ 00001011‪ 0b‬ﺑﺎﺷﺪ، ﺳﻄﺢ ﻣﻨﻄﻘﻲ اﻋﻤﺎل‬

                                                                                                     ‫ﺷﺪه ﺑﻪ ﭘﻴﻦ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:‬



                        ‫‪PINC‬‬              ‫7‬            ‫6‬             ‫5‬         ‫4‬         ‫3‬     ‫2‬         ‫1‬           ‫0‬
                           ‫ﻧﺎم ﺑﻴﺖ‬        ‫1‬            ‫1‬             ‫0‬         ‫1‬         ‫0‬     ‫0‬         ‫0‬           ‫0‬

                       ‫ﺟﻬﺖ داده‬           ‫ﻳﻚ‬           ‫ﻳﻚ‬          ‫ﺻﻔﺮ‬        ‫ﻳﻚ‬         ‫ﺻﻔﺮ‬   ‫ﺻﻔﺮ‬      ‫ﺻﻔﺮ‬          ‫ﺻﻔﺮ‬




                                                                               ‫- ٩١٢ -‬
‫022 | ‪P a g e‬‬
        ‫    ‪www.avr.ir‬‬             ‫ ‬               ‫ ‪       www.pnkavosh.com‬‬



                         ‫ﭘﻴﻮﺳﺖ 2: ﻧﺤﻮه ي ارﺗﺒﺎط دﻫﻲ ورودي وﺧﺮوﺟﻲ ﻫﺎي ﻣﻴﻜﺮوﻛﻨﺘﺮﻟﺮ‬




                                       ‫- ٠٢٢ -‬
P a g e | 221
             www.avr.ir                                                                                         www.pnkavosh.com 



                                                                                            AVR ‫ﭘﻴﻮﺳﺖ 3: ﻣﺸﺨﺼﺎت ﺑﺮﺧﻲ ﻗﻄﻌﺎت‬




                 Flash     EEPROM     SRAM      Max   F.max             16-bit      8-bit     PWM                            10-bit                   Ext
   Devices                                                    Vcc (V)                                     SPI   UART   TWI            Interrupts
                (Kbytes)   (Kbytes)   (Bytes)   I/O   (MHz)             Timers      Timer   (channels)                        A/D                  Interrupts

 AT90PWM1          8         0.5       512      19     16     2.7-5.5     1          1          7         1      No    --      8          --           4

 AT90PWM2          8         0.5       512      19     16     2.7-5.5     1          1          7         1     Yes    --      8          --           4

 AT90PWM3          8         0.5       512      27     16     2.7-5.5     1          1         10         1     Yes    --     11          --           4

 ATmega128        128         4        4096     53     16     2.7-5.5     2          2          8         1      2     Yes     8         34            8

 ATmega1280       128         4        8192     86     16     1.8-5.5     4          2         16         1      4     Yes    16         57           32

 ATmega1281       128         4        8192     54     16     1.8-5.5     4          2          9         1      2     Yes     8         48           17

 ATmega16         16         0.5       1024     32     16     2.7-5.5     1          2          4         1      1     Yes     8         20            3

 ATmega162        16         0.5       1024     35     16     1.8-5.5     2          2          6         1      2     --      --        28            3

 ATmega164P       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




                                                                                 - ٢٢١ -
P a g e | 222
              www.avr.ir                                                                 www.pnkavosh.com 
 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 | 223
        www.avr.ir                                            www.pnkavosh.com 


                                                   AVR ‫ ﺑﺮﺧﻲ ﻗﻄﻌﺎت‬Pinout :4 ‫ﭘﻴﻮﺳﺖ‬

                ATmega64,ATmega128                    ATmega16, ATmega32




                   ATmega8                                  ATiny26




                                         - ٢٢٣ -
P a g e | 224
        www.avr.ir                              www.pnkavosh.com 



                                ATmega16 ‫ﭘﻴﻮﺳﺖ 5: ﺧﻼﺻﻪ ي رﺟﻴﺴﺘﺮﻫﺎي‬




                             - ٢٢٤ -

				
DOCUMENT INFO
Shared By:
Categories:
Tags: Atmel AVR
Stats:
views:729
posted:8/4/2010
language:Persian
pages:224