اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    موفق باشید
    دروود مهندس
    مرسی از تاپیک خوبتون
    بسیار عالی بود

    مهندس یه نکته رو من متوجه نشدم
    چرا باید حتما بررسی کنیم که 11 بود یا 10 یا 01 یا 00 یا ... ؟!

    آیا نمیشه بیایم بررسی کنیم اگه اول سطح a یک شد بعدش سطح b اون وقت چپ گرده مثلا اما اگه برعکس شد راست گرد ؟؟؟

    طبق عکس ها دارم میگم

    نظرتون چیه با این روش ؟؟
    اگه ایراد داره ایراداش چیه ؟؟

    جدیدترین ویرایش توسط farshad_1372; 2023/03/26, 13:48.

    یک دیدگاه بنویسید:


  • Ehsan.Khorrami
    replied
    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

    سلام سلاام.
    برای این ولوم هرزگردها شیه ساز پروتئوس هست؟
    من خیلی گشتم ولی نتونستم پیدا کنم ، اگر کسی داره لطف کنه برام بفرسته خیلی ممنون میشم.
    حتی هزینه ای هم داشته باشه در خدمتم.

    یک دیدگاه بنویسید:


  • Rabrabey
    replied
    پاسخ : چگونه با Rotary Encoders کار کنیم؟ [آموزشی]

    سلام لطفا کد رو کاملتر قرار بدید،متشکرم

    یک دیدگاه بنویسید:


  • Rabrabey
    replied
    پاسخ : چگونه با Rotary Encoders کار کنیم؟ [آموزشی]

    #include <mega32a.h>
    #include <alcd.h>
    #include <stdio.h>
    #include <delay.h>


    int pe_save;
    char rotary;
    char str[16];


    void main (void)
    {
    lcd_init(16);
    DDRB = 0x00;
    DDRD = 0xFF;
    lcd_clear();


    MCUCR = 0x03;
    GICR = 0x40;
    GIFR = 0x40;
    #asm ("sei")

    while(1)
    {
    sprintf(str,"rotary = %d",rotary);
    lcd_gotoxy(0,0);
    lcd_puts(str);
    }
    }

    interrupt [2] void ext_int0_isr(void)
    {
    pe_save = PINA.0;
    pe_save &=0x90;
    if(pe_save == 0x80 || pe_save == 0x10)
    {
    rotary ++;
    return;
    }

    if(pe_save == 0x90 || pe_save == 0x00)
    {
    rotary --;
    return;
    }


    }
    سلام بر شما
    من برنامه شما رو برای مگا32 تغییر دادم اما فقط به صورت کاهشی کار میکنه و متغییر به صورت نزولی کم میشه ولی زیاد نمیشه

    یک دیدگاه بنویسید:


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

    اساتید محترم
    من میخوام از این روتاری جهت ولوم دیجیتال استفاده کنم
    به این صورت که پایه مشترک به منفی باشه و پایه A به مقاوت a و پایه B به مقاومت b .
    اگر به سمت راست بچرخونم منفی رو از مقاومت a و اگر به سمت چپ بچرخونم منفی رو از مقاومت b بگذرونه!.
    دوستان لطفا یه مدار سخت افزاری ساده بگید که بتونه این کار رو واسم انجام بده
    ??????

    یک دیدگاه بنویسید:


  • mjes
    replied
    پاسخ : چگونه با 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:
    موفق و کامیاب باشید

    یک دیدگاه بنویسید:


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

    سلام.

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

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

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

    یک دیدگاه بنویسید:


  • MM320
    replied
    پاسخ : چگونه با ولوم 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);
    }

    یک دیدگاه بنویسید:


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

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

    یک دیدگاه بنویسید:


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

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

    یک دیدگاه بنویسید:


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

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

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

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

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

    Deflcdchar 4 , 32 , 14 , 14 , 14 , 14 , 14 , 14 , 32 &#039; replace [x] with number (0-7)

    Const Ptw = &amp;H88
    Const Ptr = &amp;H89

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


    Config Pind.4 = Input &#039;A
    Config Pind.5 = Input &#039;B
    &#039; Portd.4 = 1

    &#039;Portd.5 = 1
    &#039;=====================================

    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

    &#039;******************************************** ***********************************
    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
    &#039;Dim L As Byte


    &#039;Dim W As Byte
    &#039;Dim Q As Byte

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

    &#039;******************************************** ***********************************

    Portc = 255
    Bass = 104
    Treble = 120
    Vol = 13
    &#039;******************************************** ***********************************
    I2cstart
    I2cwbyte Ptw
    I2cwbyte 92
    I2cwbyte 224
    I2cwbyte 192
    I2cwbyte 160
    I2cwbyte 128
    I2cwbyte 120
    I2cwbyte 104
    I2cwbyte Vol
    I2cstop
    &#039;******************************************** ***********************************



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

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




    Locate 1 , 2
    Lcd &quot;mojtaba &quot;

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



    If Pinc.0 = 0 Then
    Incr _time
    If _time &gt; 20 Then Gosub Loudset
    End If

    If Pinc.0 = 1 And _time &gt; 1 Then
    _time = 0
    Gosub Setting
    End If


    Loop
    End
    &#039;******************************************** ***********************************
    Setting:



    Cls
    _time = 0
    While _time &lt; 25
    Locate 1 , 1
    Select Case Selector

    Case 0
    Lcd &quot;BASS &quot; ; 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
    &#039;Lcd &quot; &quot;
    Lcd Chr(3)
    Next
    Locate 2 , 1
    Lcd Chr(2)
    &#039;------------------
    If Bass &lt; 10 Then
    Locate 1 , 16

    Lcd &quot; &quot;

    End If

    &#039;------------------------

    Case 1
    Lcd &quot;TREBLE&quot; ; 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

    &#039;Lcd &quot; &quot;
    Lcd Chr(3)
    Next
    Locate 2 , 1
    Lcd Chr(2)
    &#039;--------------------------
    If Treble &lt; 10 Then
    Locate 1 , 16
    Lcd &quot; &quot;

    End If
    &#039;-------------------------

    Case 2
    Lcd &quot;SPEAKER LR &quot; ; C &#039;&quot;BAL &quot;
    Locate 2 , 1
    Lcd &quot;L + R&quot;
    Lcd &quot; &quot;
    &#039;-----------------------
    If C &lt; 10 Then
    Locate 1 , 16
    Lcd &quot; &quot;
    End If
    &#039;----------------------------------------------

    Case 3
    Lcd &quot;SPEAKER RF &quot; ; F &#039;&quot;FAD &quot;
    Locate 2 , 1
    Lcd &quot;F + R&quot;
    Lcd &quot;&quot;
    &#039;----------------------------
    If F &lt; 10 Then
    Locate 1 , 16
    Lcd &quot; &quot;
    End If
    &#039;-------------------------------------------------

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

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

    If E &lt; 10 Then
    Locate 1 , 16
    Lcd &quot; &quot;
    End If
    Case 6
    Locate 1 , 1
    Lcd &quot;selector &quot; ; G ; &quot; &quot;


    Case 7
    Locate 1 , 2
    Lcd &quot;VOLUME &quot;
    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 &gt; 63 Then Vol = 63
    I2cstart
    I2cwbyte Ptw
    I2cwbyte Vol
    I2cstop
    Waitms 50

    End If
    Test = 63 - Vol
    Locate 1 , 12
    Lcd Chr(2) ; Test ; &quot; &quot;
    &#039;Locate 2 , 1
    &#039;For B = 2 To Test
    &#039;Locate 2 , B
    &#039;Lcd Chr(4)
    &#039;Next
    &#039;For B = Test To 20
    &#039;Locate 2 , B

    &#039;Lcd &quot; &quot;

    &#039;Lcd Chr(3)
    &#039;Next
    &#039;Locate 2 , 1
    &#039;Lcd Chr(2)

    End Select

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

    Wend
    _time = 0
    Return
    &#039;******************************************** ***********************************

    Up:


    _time = 0
    Select Case Selector

    Case 0
    Decr Bass

    If Bass &lt; 104 Then Bass = 104
    I2cstart
    I2cwbyte Ptw
    I2cwbyte Bass
    I2cstop
    &#039;----------------------------------------

    &#039;------------------------------------------------------
    Case 1
    Decr Treble
    If Treble &lt; 120 Then Treble = 120
    I2cstart
    I2cwbyte Ptw
    I2cwbyte Treble
    I2cstop

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

    Case 5
    Decr Lf
    Decr E
    If E = 255 Then E = 0
    If Lf &lt; 128 Then Lf = 128
    I2cstart
    I2cwbyte Ptw
    I2cwbyte Lf
    I2cstop

    Case 6



    End Select
    Print &quot;Up&quot;
    Return
    &#039;******************************************** ***********************************
    Down:
    _time = 0

    Select Case Selector

    Case 0
    Incr Bass
    If Bass &gt; 111 Then Bass = 111
    I2cstart
    I2cwbyte Ptw
    I2cwbyte Bass
    I2cstop

    Case 1
    Incr Treble
    If Treble &gt; 127 Then Treble = 127
    I2cstart
    I2cwbyte Ptw
    I2cwbyte Treble
    I2cstop

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


    End Select
    Print &quot;Down&quot;
    Return
    &#039;******************************************** ***********************************
    Loudset:
    Locate 1 , 1

    Lcd &quot;LOUD &quot;
    _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 &quot;OFF &quot;
    Else
    Test = 88
    If G = 1 Then Test = 64
    If G = 2 Then Test = 65
    If G = 3 Then Test = 66

    Lcd &quot;ON &quot;
    End If

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

    یک دیدگاه بنویسید:


  • raya2017
    replied
    پاسخ : چگونه با ولوم 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&gt;=100)rotary=100;
    if(rotary&lt;=1)rotary=1;



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

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

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

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

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

    یک دیدگاه بنویسید:


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

    سلام
    تو حالت فشاری آیا سیگنال خروجی تغییر خواهد کرد یا پینی اضافه داره؟

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

    نوشته اصلی توسط dellfogostar
    سلام این رو تاری های تو بازار کلید وسط فشاری داره؟
    من همین تابستونی رفتم تهران ...
    از پاساژ امجد چندین نمونه خریدم ...
    ژاپنی ... چینی ...
    تا اونجایی که من دیدم همه داشتند ...
    موارد خاص هستند که نداشته باشد ...
    موفق باشید

    یک دیدگاه بنویسید:

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