New approach to Rotary Encoder


Closed Thread
Results 1 to 40 of 91

Hybrid View

  1. #1
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,612


    Did you find this post helpful? Yes | No

    Default Re: New approach to Rotary Encoder

    Don't know what to tell you but the code works just fine here.
    Code:
    HSEROUT ["Program start",13]
    
    Main:
        PortB.5 = 0
        newState = PortA & %00000111
        PortB.5 = 1
        
        If newState <> 7 THEN
            If newState <> oldState THEN
                  
                Select Case oldState
                    Case 3
                    If NewState = 6 THEN dir=up         
                    If NewState = 5 THEN dir=dn
      
                    Case 5
                    If NewState = 3 THEN dir=up        
                    If NewState = 6 THEN dir=dn
      
                    Case 6
                    If NewState = 5 THEN dir=up        
                    If NewState = 3 THEN dir=dn
                END SELECT
    
                HSEROUT["oldState: ", DEC oldState, "   newState: ", DEC newState, "   DIR: ", DEC DIR, 13]        
            
            oldState = newState
            Pause 1000
            ENDIF
        ENDIF
        
    Goto Main
    This was executed on an AMICUS18 board with a PIC18F25K20. A wire from RB5 to the pulled up inputs was used to simulate the "encoder", the results are here:

    Name:  Fratello_encoder.jpg
Views: 8814
Size:  69.7 KB

    As you can see, it works.

    Have you verified that PortB.5 does go LOW?
    Have you verified that you DO get a LOW on RA0,1 and 2 as you rotate the encoder?
    Have you checked the datasheet to see if any other peripherals are multiplexed onto the pins you're trying to use? ADC? Comparator?

  2. #2
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default Re: New approach to Rotary Encoder

    Been said before and I will say it again.

    NEVER TRUST A SIM!
    Dave
    Always wear safety glasses while programming.

  3. #3
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Re: New approach to Rotary Encoder

    ... ok, so work, despite the "non-working" of simulator !
    Next step is to try to make the two coexist (keypad.bas & encoder.bas) .
    First I will build the schematic and making some tests. Thanks again for the huge support !

  4. #4
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Re: New approach to Rotary Encoder

    It's this a viable options of reading encoder AND the others buttons ?
    Code:
    Main:
    ;==============
    ;reading buttons on line 0 (pseudo-encoder)
        PortB.5 = 0
        newState = PortA & %00000111
        PortB.5 = 1
        If newState <> 7 THEN
            If newState <> oldState THEN
                  
                Select Case oldState
                    Case 3
                    If NewState = 6 THEN 
                    dir=up         
                    portb.0 = 1
                    endif
                    If NewState = 5 THEN 
                    dir=dn
                    portb.1 = 1
                    endif
                    
                    Case 5
                    If NewState = 3 THEN 
                    dir=up         
                    portb.0 = 1
                    endif      
                    If NewState = 6 THEN 
                    dir=dn
                    portb.1 = 1
                    endif
                    
                    Case 6
                    If NewState = 5 THEN 
                    dir=up
                    portb.0 = 1
                    endif        
                    If NewState = 3 THEN 
                    dir=dn
                    portb.1 = 1
                    endif
                END SELECT      
                oldState = newState
              Pause 100
            ENDIF
        ENDIF
    ;==============
    ;reading buttons on line 1
        Porta.4 = 0
        status_2 = PortA & %00000111
        Porta.4 = 1
        select case status_2
                    case 3
                    gosub trackDn
                    case 5
                    gosub mute
                    case 6
                    gosub trackUp
        end select
    ;==============
    ;reading buttons on line 2    
        Porta.3 = 0
        status_3 = PortA & %00000111
        Porta.3 = 1
        select case status_3
                    case 3
                    gosub volDn
                    case 5
                    gosub volUp
                    case 6
                    gosub Sursa
        end select                           
    Goto Main

  5. #5
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Re: New approach to Rotary Encoder

    So far, so god ... Now another problem : how can I separates signals?
    If rotary switch is Up, can't read if TK- or V- are pressed ..
    If rotary switch is in middle position, can't read if MUTE or V+ are pressed ...
    If rotary switch is down, can't read if TK+ or S are pressed...


    LE - I think this work :
    Code:
    ;reading buttons on line 1
        Porta.4 = 0
        trisb.5 = 1
        pause 50
        status_2 = PortA & %00000111
        Porta.4 = 1
        trisb.5 = 0
    Attached Images Attached Images  
    Last edited by fratello; - 14th April 2012 at 21:38.

  6. #6
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Re: New approach to Rotary Encoder

    New code works pretty well ... But, how can I avoid false roller codes ? If I turn up, not always the the code "see" up ; if I turn down, not always the code "see" down ...Sometimes, the commands (Up/Down) are inversed !
    I try to add some "pause" between different commands, but the problem remains.

  7. #7
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,612


    Did you find this post helpful? Yes | No

    Default Re: New approach to Rotary Encoder

    No, don't try to slow it down...speed it up. If you have any pauses in there try removing those. If your program is going to do 'other' things as well (which I'm sure it is) then you may need to sample the encoder several times thru out the main loop.

    The reason is because if you are at one state and then turn forward two states but you do it fast enough so that the code doesn't detect the "middle" state, then it looks like you turned one state backwards instead of two forward.

    So, you want to sample the encoder as fast as you can possibly turn it - and then some.

    /Henrik.

Members who have read this thread : 3

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts