اطلاعیه

Collapse
No announcement yet.

چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

    آقا خیلی شرمنده کردی، اینقد توجه لازم نبود به خدا راضی به زحمت نبودیم :biggrin: :biggrin: :biggrin:
    خیلی اطلاعات خوبی بود ،اون 3تا شکل از سه نوع روتاری خیلی خوب بود من نمیدونستم اینطوریه
    تاپیکم رو کامل بخونید متوجه می شوید که من در هیچ جای این تاپیک نگفته ام که این قطعات پالس درست میکنه ...
    من نگفتم پالس تولید میشه گفتم شکل مربعی نمیدن فقط تغییر لول دارن! :biggrin:
    اون مداری هم که میبینید به خاطر این هست که چون در پروتئوس این قطعه نداشتیم ، خواستم به صورت عملی تر شبیه سازی کنم ...
    تو پروتئوس libraryش رو گذاشتن بچه ها ولی از نوع 1 هست و باگ هم داره
    نه بابا ... این چه حرفیه ... اتفاقا" حال میکنم با این موج های منفی ... چون بادبادک وقتی بالا میره که با باد مخالف روبرو بشه !!!
    من اصلا قصد این کار رو نداشتم!!! موج منفی چرا؟؟؟
    دمت هم گرم میدونم کار پر زحمتی انجام دادی من قبلش هم تشکر کردم هم گفتم قصد جسارت ندارم :rolleyes:
    به هر حال مرسی از این توجه و مطالب مفیدی که گذاشتی :icon_razz:

    دیدگاه


      #17
      پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

      حالا چطوری از ظاهر بتونیم تشخیص بدیم که نوع اول یا دوم ؟؟؟؟ فروشنده ها هم که معمولا نمیشناسن قطعاتو


      دیدگاه


        #18
        پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

        نوشته اصلی توسط masoud_l66
        حالا چطوری از ظاهر بتونیم تشخیص بدیم که نوع اول یا دوم ؟؟؟؟ فروشنده ها هم که معمولا نمیشناسن قطعاتو
        درود
        اون رو دیگه باید از فرشنده سوال کنید ...
        اگر هم نمیدونست خودتون باید به فروشنده بگید که همونجا یه مالتی متر دیجیتالی بهتون بده و همون جا امتحانش کنید ...
        روش امتحان کردنش هم ساده است ...
        اگر پایه وسط به پایه 1 و 3 وصل نبود و در دندانه بعدی هم به همین شکل بود بدانید که نوع اول هست (دوره کامل در هر دندانه)
        اگر پایه وسط به هردو پایه دیگر وصل یا قطع بود و در دندانه بعدی مخالف این بود بدانید که نوع دوم است (نیم دوره در هر دندانه)
        نوع سوم هم بستگی داره به کدوم طرف بچرخونید ... ولی در کل این مراحل را دارا هستند:
        00 - 10 - 11 - 01 - 00
        حالا اگر به راست چرخش کنید اول 01 بعدش 11 و 10 و 00 ولی به چپ بروید برعکس این میشه ...

        موفق باشید
        [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
        معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
        معرفی نرم افزار Codewizard PWM
        با من بیشتر آشنا شوید

        دیدگاه


          #19
          پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

          سلام این رو تاری های تو بازار کلید وسط فشاری داره؟
          راه اندازی enc28j60 و enc424j600 برای RL-TCPnet

          راه اندازیks0108 با emwin

          راه اندازی lcd7 اینچ با داریور داخلی stm32f429

          دیدگاه


            #20
            پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

            با سلام
            بله. معمولا دارن.
            کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

            دیدگاه


              #21
              پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

              نوشته اصلی توسط dellfogostar
              سلام این رو تاری های تو بازار کلید وسط فشاری داره؟
              من همین تابستونی رفتم تهران ...
              از پاساژ امجد چندین نمونه خریدم ...
              ژاپنی ... چینی ...
              تا اونجایی که من دیدم همه داشتند ...
              موارد خاص هستند که نداشته باشد ...
              موفق باشید
              [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
              معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
              معرفی نرم افزار Codewizard PWM
              با من بیشتر آشنا شوید

              دیدگاه


                #22
                پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

                سلام
                تو حالت فشاری آیا سیگنال خروجی تغییر خواهد کرد یا پینی اضافه داره؟
                راه اندازی enc28j60 و enc424j600 برای RL-TCPnet

                راه اندازیks0108 با emwin

                راه اندازی lcd7 اینچ با داریور داخلی stm32f429

                دیدگاه


                  #23
                  پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

                  نوشته اصلی توسط dellfogostar
                  سلام
                  تو حالت فشاری آیا سیگنال خروجی تغییر خواهد کرد یا پینی اضافه داره؟
                  سلام
                  خیر ...
                  زمانی که خود سر ولوم را فشار دهیم هیچ تغییری در سیگنال خروجی نداریم ...
                  برای این کلید دو پایه جداگانه در نظر گرفته شده است ...
                  ولومهای روتاری انکدر معمولا 7 پایه دارد ...
                  قسمت 3 پایه که تشکیل شده اند از:
                  1- فاز A
                  2- پایه مشترک
                  3- فاز B
                  قسمت بدنه : که این قسمت دوپایه روبروی هم هستند
                  قسمت دوپایه روبروی سه پایه که مربوط به کلید است ...
                  موفق باشید
                  [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                  معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                  معرفی نرم افزار Codewizard PWM
                  با من بیشتر آشنا شوید

                  دیدگاه


                    #24
                    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]


                    #define pe_save1 PIND.1
                    #define pe_save2 PIND.2


                    // External Interrupt 0 service routine
                    interrupt [EXT_INT0] void ext_int0_isr(void)
                    {
                    if(rotary>=100)rotary=100;
                    if(rotary<=1)rotary=1;



                    if( pe_save2==1 && pe_save1==0 || pe_save2==0 && pe_save1==1)
                    {rotary++;
                    return;}
                    if( pe_save2==0 && pe_save1==0 || pe_save2==1 && pe_save1==1) {
                    rotary--;
                    return;
                    }

                    اضافه شده در تاریخ :
                    این مد مربوت به مگا32 میباشد و در پروتوس تست شده

                    اضافه شده در تاریخ :
                    تو پرو تعوس کار کرد ولی :angry: نمیدونم چرا دوتا دوتا میشموره

                    دیدگاه


                      #25
                      پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

                      با سلام من با روتاری نمی تونم کارکنم لطفا کمکم کنید تا راش بندازم
                      می خوام برای مدار بجای شاستی از روتاری استفاده کنم مثلا ولومو صدا رو کم و زیاد کنم
                      [code=vb]$regfile = "m8def.dat"
                      $crystal = 1000000
                      $hwstack = 34
                      $swstack = 32
                      $framesize = 34
                      '=====================================

                      $baud = 19200 ' استفاده از نرخ علامت در ثانیه
                      '$baud = 9600
                      '$baud = 115200

                      'Print "Encoder test"
                      '=====================================
                      'Deflcdchar 1 , 24 , 28 , 30 , 31 , 31 , 30 , 28 , 24
                      Deflcdchar 1 , 8 , 20 , 10 , 21 , 21 , 10 , 20 , 8
                      'Deflcdchar 2 , 2 , 6 , 26 , 26 , 26 , 26 , 6 , 2 ' replace [x] with number (0-7)

                      Deflcdchar 2 , 1 , 3 , 29 , 21 , 29 , 3 , 1 , 32 ' replace [x] with number (0-7)
                      Deflcdchar 3 , 32 , 32 , 32 , 31 , 31 , 32 , 32 , 32 ' _

                      Deflcdchar 4 , 32 , 14 , 14 , 14 , 14 , 14 , 14 , 32 ' replace [x] with number (0-7)

                      Const Ptw = &H88
                      Const Ptr = &H89

                      Config Sda = Portd.1
                      Config Scl = Portd.0
                      Config Portc = Input


                      Config Pind.4 = Input 'A
                      Config Pind.5 = Input 'B
                      ' Portd.4 = 1

                      'Portd.5 = 1
                      '=====================================

                      Config Lcdpin = Pin , Db4 = Pinb.3 , Db5 = Pinb.2 , Db6 = Pinb.1 , Db7 = Pinb.0 , Rs = Pinb.5 , E = Pinb.4
                      Config Lcd = 16 * 2
                      Cursor Off
                      Cls

                      '******************************************** ***********************************
                      Dim Vol As Byte
                      Dim Loud As Bit
                      Dim Selector As Byte
                      Dim Bass As Byte
                      Dim Treble As Byte
                      Dim Test As Byte
                      Dim Bar As Word
                      Dim _time As Byte
                      Dim A As Byte
                      Dim B As Byte
                      Dim C As Byte



                      Dim Lr As Byte
                      Dim Rr As Byte
                      Dim Lf As Byte
                      Dim Rf As Byte

                      Dim E As Byte
                      Dim F As Byte
                      Dim G As Byte
                      Dim H As Byte
                      Dim I As Byte
                      'Dim L As Byte


                      'Dim W As Byte
                      'Dim Q As Byte

                      Dim D As Byte
                      'ما یک بایت پوشیده چون ما نیاز به حفظ دولت از رمزگذار
                      '******************************************** ***********************************
                      Config Adc = Single , Prescaler = Auto , Reference = Internal
                      Start Adc

                      '******************************************** ***********************************

                      Portc = 255
                      Bass = 104
                      Treble = 120
                      Vol = 13
                      '******************************************** ***********************************
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte 92
                      I2cwbyte 224
                      I2cwbyte 192
                      I2cwbyte 160
                      I2cwbyte 128
                      I2cwbyte 120
                      I2cwbyte 104
                      I2cwbyte Vol
                      I2cstop
                      '******************************************** ***********************************



                      Home
                      Do
                      D = Encoder(pind.4 , Pind.5 , Up , Down , 0)

                      Bar = Getadc(0)
                      Bar = Bar - 350
                      C = Bar / 20




                      Locate 1 , 2
                      Lcd "mojtaba "

                      For B = 1 To C
                      Locate 2 , B
                      Lcd Chr(4)
                      Next
                      For B = C To 20
                      Locate 2 , B
                      Lcd " "
                      Next
                      Waitms 30



                      If Pinc.0 = 0 Then
                      Incr _time
                      If _time > 20 Then Gosub Loudset
                      End If

                      If Pinc.0 = 1 And _time > 1 Then
                      _time = 0
                      Gosub Setting
                      End If


                      Loop
                      End
                      '******************************************** ***********************************
                      Setting:



                      Cls
                      _time = 0
                      While _time < 25
                      Locate 1 , 1
                      Select Case Selector

                      Case 0
                      Lcd "BASS " ; Bass



                      Test = Bass - 104
                      Test = 7 - Test
                      Test = Test * 2
                      Locate 2 , 1
                      For B = 2 To Test
                      Locate 2 , B
                      Lcd Chr(4)
                      Next
                      For B = Test To 20
                      Locate 2 , B
                      'Lcd " "
                      Lcd Chr(3)
                      Next
                      Locate 2 , 1
                      Lcd Chr(2)
                      '------------------
                      If Bass < 10 Then
                      Locate 1 , 16

                      Lcd " "

                      End If

                      '------------------------

                      Case 1
                      Lcd "TREBLE" ; Treble
                      Test = Treble - 120
                      Test = 7 - Test
                      Test = Test * 2
                      Locate 2 , 1
                      For B = 2 To Test
                      Locate 2 , B
                      Lcd Chr(4)
                      Next
                      For B = Test To 20
                      Locate 2 , B

                      'Lcd " "
                      Lcd Chr(3)
                      Next
                      Locate 2 , 1
                      Lcd Chr(2)
                      '--------------------------
                      If Treble < 10 Then
                      Locate 1 , 16
                      Lcd " "

                      End If
                      '-------------------------

                      Case 2
                      Lcd "SPEAKER LR " ; C '"BAL "
                      Locate 2 , 1
                      Lcd "L + R"
                      Lcd " "
                      '-----------------------
                      If C < 10 Then
                      Locate 1 , 16
                      Lcd " "
                      End If
                      '----------------------------------------------

                      Case 3
                      Lcd "SPEAKER RF " ; F '"FAD "
                      Locate 2 , 1
                      Lcd "F + R"
                      Lcd ""
                      '----------------------------
                      If F < 10 Then
                      Locate 1 , 16
                      Lcd " "
                      End If
                      '-------------------------------------------------

                      Case 4
                      Lcd "SPEAKER RR " ; D
                      Locate 2 , 1
                      Lcd "R + R"
                      Lcd " "

                      If D < 10 Then
                      Locate 1 , 16
                      Lcd " "
                      End If
                      Case 5
                      Lcd "SPEAKER LF " ; E
                      Locate 2 , 1
                      Lcd "L + F"
                      Lcd " "

                      If E < 10 Then
                      Locate 1 , 16
                      Lcd " "
                      End If
                      Case 6
                      Locate 1 , 1
                      Lcd "selector " ; G ; " "


                      Case 7
                      Locate 1 , 2
                      Lcd "VOLUME "
                      If Pinc.1 = 0 Or Pinc.2 = 0 Then
                      If Pinc.1 = 0 Then Decr Vol
                      If Pinc.2 = 0 Then Incr Vol
                      If Vol = 255 Then Vol = 0
                      If Vol > 63 Then Vol = 63
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Vol
                      I2cstop
                      Waitms 50

                      End If
                      Test = 63 - Vol
                      Locate 1 , 12
                      Lcd Chr(2) ; Test ; " "
                      'Locate 2 , 1
                      'For B = 2 To Test
                      'Locate 2 , B
                      'Lcd Chr(4)
                      'Next
                      'For B = Test To 20
                      'Locate 2 , B

                      'Lcd " "

                      'Lcd Chr(3)
                      'Next
                      'Locate 2 , 1
                      'Lcd Chr(2)

                      End Select

                      Incr _time
                      Waitms 250
                      If Pinc.0 = 0 Then
                      Incr Selector
                      _time = 0
                      End If
                      If Selector > 7 Then Selector = 0
                      If Pinc.1 = 0 Then Gosub Up
                      If Pinc.2 = 0 Then Gosub Down

                      Wend
                      _time = 0
                      Return
                      '******************************************** ***********************************

                      Up:


                      _time = 0
                      Select Case Selector

                      Case 0
                      Decr Bass

                      If Bass < 104 Then Bass = 104
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Bass
                      I2cstop
                      '----------------------------------------

                      '------------------------------------------------------
                      Case 1
                      Decr Treble
                      If Treble < 120 Then Treble = 120
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Treble
                      I2cstop

                      Case 2
                      Decr Lr
                      Decr C
                      If C = 255 Then C = 0
                      If Lr < 192 Then Lr = 192
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Lr
                      I2cstop
                      Case 3
                      Decr Rf
                      Decr F
                      If F = 255 Then F = 0
                      If Rf < 160 Then Rf = 160
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Rf
                      I2cstop
                      Case 4
                      Decr Rr
                      Decr D
                      If D = 255 Then D = 0
                      If Rr < 224 Then Rr = 224
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Rr
                      I2cstop

                      Case 5
                      Decr Lf
                      Decr E
                      If E = 255 Then E = 0
                      If Lf < 128 Then Lf = 128
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Lf
                      I2cstop

                      Case 6



                      End Select
                      Print "Up"
                      Return
                      '******************************************** ***********************************
                      Down:
                      _time = 0

                      Select Case Selector

                      Case 0
                      Incr Bass
                      If Bass > 111 Then Bass = 111
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Bass
                      I2cstop

                      Case 1
                      Incr Treble
                      If Treble > 127 Then Treble = 127
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Treble
                      I2cstop

                      Case 2
                      Incr Lr
                      Incr C
                      If C > 31 Then C = 31
                      If Lr > 223 Then Lr = 223
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Lr
                      I2cstop
                      Case 3
                      Incr Rf
                      Incr F
                      If F > 31 Then F = 31
                      If Rf > 191 Then Rf = 191
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Rf
                      I2cstop
                      Case 4
                      Incr Rr
                      Incr D
                      If D > 30 Then D = 30
                      If Rr > 254 Then Rr = 254
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Rr
                      I2cstop
                      Case 5
                      Incr Lf
                      Incr E
                      If E > 31 Then E = 31
                      If Lf > 159 Then Lf = 159
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Lf
                      I2cstop
                      Case 6
                      Incr G
                      Incr H
                      If G > 3 Then G = 3
                      If H > 94 Then H = 94
                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte H
                      I2cstop
                      Waitms 50


                      End Select
                      Print "Down"
                      Return
                      '******************************************** ***********************************
                      Loudset:
                      Locate 1 , 1

                      Lcd "LOUD "
                      _time = 0

                      Locate 1 , 6
                      Toggle Loud
                      If Loud = 0 Then
                      Test = 92
                      If G = 1 Then Test = 92
                      If G = 2 Then Test = 93
                      If G = 3 Then Test = 94
                      Lcd "OFF "
                      Else
                      Test = 88
                      If G = 1 Then Test = 64
                      If G = 2 Then Test = 65
                      If G = 3 Then Test = 66

                      Lcd "ON "
                      End If

                      I2cstart
                      I2cwbyte Ptw
                      I2cwbyte Test
                      I2cstop
                      Wait 2
                      Return[/code]

                      دیدگاه


                        #26
                        پاسخ : پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

                        سلام . نمونه کد ها ی مربود به روتاری انکودر یک سری کراکتر اضافی دارد . اگر ممکن هس اصلاح بفرمائید.

                        دیدگاه


                          #27
                          پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

                          ممنون از دوستان برنامه برای بسکام
                          شو کسی نداره ؟

                          دیدگاه


                            #28
                            پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

                            سلام به دوستان و اساتید محترم.
                            من دارم روی یه پروژه کار می کنم که سه تا انکودر پالسی(ولوم پالسی) داره و توسط lpc1768 راه اندازیش کردم .مشکلی که هست ولوم اول خوبه ولی دو تا ولوم دیگه عملکرد خوبی نداره یعنی وقتی ولوم می چرخونم مثلا اگه باید زیاد کنه یک دفعه مقدار عجیب میده یا مقدار کم و زیاد می کنه.بنظر شما ممکنه انکودر(یا همون ولوم پالسی)کثیف باشه؟و اگه هست با اسپری چرپ میشه تمیزش کرد؟ممنونم از اینکه پاسخ میدید.

                            اینم قسمت زیر روال وقفه.(مد راه اندازی 1x)
                            کد:
                            void EINT3_IRQHandler(void)
                            
                            {
                            
                                //---------------
                                if(GPIO_GetIntStatus(2,s1_enc3,1)){
                                
                                    if ((GPIO_ReadValue(2) & (1<<s2_enc3))){
                                         
                                        r[0]=r[0]-1;
                                        if(r[0]<0) r[0]=0;
                                        buf[0]=1;
                                    
                                        buf[1]=r[0] & 0xff;
                                        buf[2]=(r[0]>>8)  & 0xff;
                                        GPIO_ClearInt(2,1<<s1_enc3);
                                        ff=1;
                                  coun=0;
                            //    buzzer();            
                                    }
                                        else{
                                
                                      r[0]=r[0]+1;
                                    if(r[0]>160) r[0]=160;
                                        
                                        buf[0]=1;
                                        buf[1]=r[0] & 0xff;
                                        buf[2]=(r[0]>>8)  & 0xff;
                                        ff=1;    
                                    coun=0;
                                            GPIO_ClearInt(2,1<<s1_enc3);
                            //buzzer();
                                        }
                                
                                }
                            
                                //---------------
                                if(GPIO_GetIntStatus(2,s1_enc2,1)){
                                
                                    if ((GPIO_ReadValue(2) & (1<<s2_enc2))){
                                         
                                        r[1]=r[1]-1;
                                        if(r[1]<0) r[1]=0;
                                        buf[0]=1;
                                    
                                        buf[3]=r[1] & 0xff;
                                        buf[4]=(r[1]>>8)  & 0xff;
                                        GPIO_ClearInt(2,1<<s1_enc2);
                                        ff=1;
                                  coun=0;
                            //    buzzer();            
                                    }
                                        else{
                                
                                      r[1]=r[1]+1;
                                    if(r[1]>5) r[1]=5;
                                        
                                        buf[0]=1;
                                        buf[3]=r[1] & 0xff;
                                        buf[4]=(r[1]>>8)  & 0xff;
                                        ff=1;    
                                    coun=0;
                                            GPIO_ClearInt(2,1<<s1_enc2);
                            //buzzer();
                                        }
                                
                                }
                                    //---------------
                                if(GPIO_GetIntStatus(2,s1_enc1,1)){
                                
                                    if ((GPIO_ReadValue(2) & (1<<s2_enc1))){
                                            clear_fre=1; 
                                        r[2]=r[2]-1;
                                        if(r[2]<0) r[2]=0;
                                        
                                        buf[0]=1;
                                    
                                        buf[5]=r[2] & 0xff;
                                        buf[6]=(r[2]>>8)  & 0xff;
                                        GPIO_ClearInt(2,1<<s1_enc1);
                                        ff=1;
                                  coun=0;
                            //    buzzer();            
                                    }
                                        else{
                                clear_fre=1;
                                      r[2]=r[2]+1;
                                    if(r[2]>13) r[2]=13;
                                        
                                        buf[0]=1;
                                        buf[5]=r[2] & 0xff;
                                        buf[6]=(r[2]>>8)  & 0xff;
                                        ff=1;    
                                    coun=0;
                                            GPIO_ClearInt(2,1<<s1_enc1);
                            //buzzer();
                                        }
                                
                                }
                                if(GPIO_GetIntStatus(2,key_enc2,1)){
                                
                                        r[3]++;
                                        if (r[3]>2) r[3]=1;
                                        ff=1;
                                        buf[0]=1;
                                        buf[7]=r[3] & 0xff;
                                      coun=0;
                                    
                                        GPIO_ClearInt(2,1<<key_enc2);
                                }
                                    if(GPIO_GetIntStatus(2,key_enc3,1)){
                                
                            if(HOLD==0)
                                HOLD=1;
                            else
                                HOLD=0;
                            
                                    
                                        GPIO_ClearInt(2,1<<key_enc3);
                                }
                            delay_us(100);
                            }

                            دیدگاه


                              #29
                              پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

                              سلام.

                              دوستان روتاری انکودری با همین سیستم وجود داره که مناسب محیط های پر نویز باشه؟
                              مثلا بدنه فلزی باشه و به*جای پین، سیم شیلد ازش بیرون بیاد؟

                              برای یه مکان پر نویز می*خواستم.. (جایی که تو فاصله حدود یک متری تخلیه الکتریکی وجود داره)

                              از روتاری های معمولی که استفاده می کنم گهگداری بدون دست زدن بهش، روتاری خود به خودبه میکرو سیگنال می فرسته.

                              دیدگاه


                                #30
                                پاسخ : چگونه با Rotary Encoders کار کنیم؟؟ (ادامه بخش چهارم)

                                سلام
                                ممنون از لطفتون لطفا کد ها رو به صورتی وارد کنید که در وقتی کپی میکنیم کارکترهای مثل <>& و.... مشخص باشن
                                سپاس

                                دلیل: ادغام دو پست برای جلوگیری از اسپم


                                سلام
                                ممنون از لطفتون لطفا کد ها رو به صورتی وارد کنید که در وقتی کپی میکنیم کارکترهای مثل <>& و.... مشخص باشن
                                سپاس

                                نوشته اصلی توسط SAMAN.ASADI نمایش پست ها
                                ادامه بخش چهارم :
                                استفاده از وقفه های PIN Change:
                                همونطور که تو شبیه سازی ملاحظه می کنید پایه های 4 و 5 میکروی ATmega48 پایه های وقفه PIN Change است که با نامهای PCINT18 و PCINT19 مشخص شده است . بنابراین ما باید وقفه های PCINT18 و PCINT19 را فعال کنیم . برای اینکار باید رجیستر های مربوطه را تغییر دهیم .
                                برنامه برای Atmel Studio 6.1 :
                                کد:
                                #include &lt;avr/io.h&gt;
                                #include &lt;avr/iom48.h&gt;
                                #include &lt;util/delay.h&gt;
                                #include &lt;avr/interrupt.h&gt;
                                
                                uint8_t RE=0 , Status , Counter;
                                
                                void USART_Transmit( uint8_t data )
                                {
                                    while ( !( UCSR0A &amp; (1&lt;&lt;UDRE0)) );
                                    UDR0 = data;
                                }
                                void USART_puts(char *str)
                                {
                                    uint8_t i=0;
                                    while(str[i])
                                    {
                                        USART_Transmit(str[i]);
                                        i++;
                                    }
                                }
                                void USART_put_uint8(uint8_t data)
                                {
                                    uint8_t a,b=0,c;
                                    c=data;
                                    for(a=0;a&lt;100;a++)
                                    {
                                        if(c==0)break;
                                        c/=10;
                                        if(b==0)b++;
                                        else b*=10;
                                    }
                                    if(b==0)USART_Transmit(&#039;0&#039;);
                                    for(a=b;a&gt;0;a/=10)
                                    {
                                        c = data/a;
                                        data = data - (c*a);
                                        USART_Transmit(c+48);
                                    }
                                }
                                #define Enter    \
                                {\
                                    USART_Transmit(0x0D);\
                                    USART_Transmit(0x0A);\
                                }
                                void Rotary_Encoder(uint8_t Input_PhaseA_PhaseB,uint8_t PIN,uint8_t *Var,uint8_t *Status,uint8_t *Counter)
                                {
                                    uint8_t bit_Right=0 , x ;
                                    x = PIN &amp; Input_PhaseA_PhaseB;
                                    for(uint8_t q = 1;q&lt;200;q &lt;&lt;= 1)
                                    if(Input_PhaseA_PhaseB &amp; q)
                                    {
                                        bit_Right = q;
                                        break;
                                    }
                                    if(x &lt; Input_PhaseA_PhaseB)
                                    {
                                        if(!(x &amp; bit_Right))*Counter += 1;
                                        *Status = x;
                                    }
                                    else if((x == Input_PhaseA_PhaseB) &amp;&amp; (*Counter == 2))
                                    {
                                        if    (*Status == bit_Right)    *Var += 1; // راستگرد
                                        else                        *Var -= 1; // چپگرد
                                        *Status = 0;
                                        *Counter= 0;
                                    }
                                    else
                                    {
                                        *Status = 0;
                                        *Counter = 0;
                                    }
                                }
                                
                                ISR(PCINT2_vect)
                                {
                                    Rotary_Encoder(0x0C,PIND,&amp;RE,&amp;Status,&amp;Counter);
                                }
                                
                                int main(void)
                                {
                                    // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity
                                    // USART Receiver: Off
                                    // USART Transmitter: On
                                    // USART0 Mode: Asynchronous
                                    // USART Baud Rate: 9600
                                    UCSR0A=0x00;
                                    UCSR0B=0x08;
                                    UCSR0C=0x06;
                                    UBRR0H=0x00;
                                    UBRR0L=0x33;
                                    // External Interrupt(s) initialization
                                    // PCINT18 : on
                                    // PCINT19 : on
                                    EICRA=0x00;
                                    EIMSK=0x00;
                                    PCICR=0x04;
                                    PCMSK2=0x0C;
                                    PCIFR=0x04;
                                    sei();
                                    uint8_t x=10;
                                    while(1)
                                    {
                                        if(RE!=x)
                                        {
                                            USART_puts(&quot;RE=&quot;);
                                            USART_put_uint8(RE);
                                            Enter;
                                            x=RE;
                                        }
                                        _delay_ms(50);
                                    }
                                }
                                برنامه برایCodeVision :
                                کد:
                                /*****************************************************
                                Project : Rotary Encoder
                                Version : 1.0
                                Date  : 4/19/2014
                                Author : Saman.Asadi
                                
                                Chip type        : ATmega48
                                AVR Core Clock frequency: 8.000000 MHz
                                Memory model      : Small
                                External RAM size    : 0
                                Data Stack size     : 128
                                *****************************************************/
                                
                                #include &lt;mega48.h&gt;
                                #include &lt;stdio.h&gt;
                                #include &lt;delay.h&gt;
                                
                                unsigned char RE=0 , Status , Counter;
                                #define Enter \
                                {\
                                  putchar(0x0D);\
                                  putchar(0x0A);\
                                }
                                void Rotary_Encoder(unsigned char Input_PhaseA_PhaseB,
                                          unsigned char PIN,
                                          unsigned char *Var,
                                          unsigned char *Status,
                                          unsigned char *Counter)
                                {
                                  unsigned char bit_Right=0 ,x ,q ;
                                  x = PIN &amp; Input_PhaseA_PhaseB;
                                  for(q = 1;q&lt;200;q &lt;&lt;= 1)
                                  if(Input_PhaseA_PhaseB &amp; q)
                                  {
                                    bit_Right = q;
                                    break;
                                  }
                                  if(x &lt; Input_PhaseA_PhaseB)
                                  {
                                    if(!(x &amp; bit_Right))*Counter += 1;
                                    *Status = x;
                                  }
                                  else if((x == Input_PhaseA_PhaseB) &amp;&amp; (*Counter == 2))
                                  {
                                    if  (*Status == bit_Right)*Var += 1; // راستگرد
                                    else            *Var -= 1; // چپگرد
                                    *Status = 0;
                                    *Counter= 0;
                                  }
                                  else
                                  {
                                    *Status = 0;
                                    *Counter = 0;
                                  }
                                }
                                interrupt [PC_INT2] void pin_change_isr2(void)
                                {
                                  Rotary_Encoder(0x0C,PIND,&amp;RE,&amp;Status,&amp;Counter);  
                                }
                                void main(void)
                                {
                                  unsigned char x=10;
                                  CLKPR=0x80;
                                  CLKPR=0x00;
                                  // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity
                                  // USART Receiver: Off
                                  // USART Transmitter: On
                                  // USART0 Mode: Asynchronous
                                  // USART Baud Rate: 9600
                                  UCSR0A=0x00;
                                  UCSR0B=0x08;
                                  UCSR0C=0x06;
                                  UBRR0H=0x00;
                                  UBRR0L=0x33;
                                  // External Interrupt(s) initialization
                                  //PCINT18 : on
                                  //PCINT19 : on
                                  EICRA=0x00;
                                  EIMSK=0x00;
                                  PCICR=0x04;
                                  PCMSK2=0x0C;
                                  PCIFR=0x04;
                                  #asm(&quot;sei&quot;)
                                    while(1)
                                  {
                                        if(RE!=x)
                                        {
                                            printf(&quot;RE=%u&quot;,RE);
                                            Enter;
                                            x=RE;
                                        }
                                        delay_ms(50);
                                  }
                                }
                                این هم مثل برنامه قبل امتحانش کنید و با آن کار کنید ...
                                --------------------------------------------------------------------
                                خوب عزیزان این بخش هم به پایان رسید :wow:
                                امیدوارم که خوب توضیح داده باشم ... :redface:
                                موفق و کامیاب باشید

                                دیدگاه

                                لطفا صبر کنید...
                                X