Control a Radio PLL with a PIC


Closed Thread
Results 1 to 40 of 54

Hybrid View

  1. #1
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    That's funny. I just ordered 2 pic18f4431 s on Thursday for this specific purpose. I found even using asm interrupts the 16f690 too slow to track the encoder without losing steps, (either that or it was switch bounce). So I figure to use a PIC with QEI Hardware inputs and a 40mhz clock. Failing that I will try using flip flops to buffer the inputs. In any event there is plenty to learn.
    Now off to Costco for a box of Corn Nuts, and 3 pounds of coffee . . .
    Edit:
    I also want to display the count from 0 to 255 in decimal on a 3 digit 7 segment LED display.
    PIC is an 18F6680.
    Or you can use a lookup table and display channels or frequency.
    Last edited by Archangel; - 11th June 2011 at 03:41. Reason: add
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  2. #2
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    Joe, How fast are you spinning the encoder? How many CPR? I have been using 500 line (2000 CPR) encoder for a gate position applacation for about 6-7 years now. No bounce because they are optical. never lose any pulses, but they are going pretty slow. (30RPM) 1000 cps. I am doing this with 16F676, no interrupts just checking the A-B states in my main. It is a fast main loop but never the less. Oh and running on 4Mhz internal OSC
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  3. #3
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    Quote Originally Posted by cncmachineguy View Post
    Joe, How fast are you spinning the encoder? How many CPR? I have been using 500 line (2000 CPR) encoder for a gate position applacation for about 6-7 years now. No bounce because they are optical. never lose any pulses, but they are going pretty slow. (30RPM) 1000 cps. I am doing this with 16F676, no interrupts just checking the A-B states in my main. It is a fast main loop but never the less. Oh and running on 4Mhz internal OSC
    Hi, I am using the "El Cheapo" mechanical encoders similar to a rotory switch, just 3 terminals A com B tried both kinds gray scale and quatdradture. I think it is losing counts during the serout routine, it should not but it does, again it could be noisy encoder too, I will know better when I get those PICs next week. I have some optical encoders here, but they have a bizillion steps per rev. These switch type have 24.
    Here is the code:
    Code:
    @ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_OFF  & _CP_OFF & _FCMEN_OFF & _BOR_OFF
    
    '************************ DEFINES HERE *************************************
    DEFINE OSC 20               ' set to 20mhz
    INCLUDE "MODEDEFS.BAS"
    clear                       ' clear out variables
     DEFINE DEBUG_REG PORTC
     DEFINE DEBUG_BIT 6
     DEFINE DEBUG_BAUD 19200
     DEFINE DEBUG_MODE 0
    
    '********************** PIC16F690 setup ************************************
    ADCON0  = 0
    ADCON1  = 0
    ANSEL   = 0
    ANSELH  = 0
    CM1CON0 = 0
    CM2CON0 = 0
    
    TrisA = %00000000
    TrisB = %11000000 
    TrisC = %00000000
    
    '*********************** ASSEMBLY INTERUPT VARIABLES ***********************
    wsave   var     byte $20   system
    wsave1  var     byte $a0   system    ' Necessary for devices with RAM in bank1
    wsave2  var     byte $120  system    ' Necessary for devices with RAM in bank2
    ssave   var     byte bank0 system
    psave   var     byte bank0 system     
    
    '***************************************************************************
    enc_old         VAR BYTE
    enc_new         VAR BYTE
    enc_tmp         var byte
    enc_counter     VAR BYTE
    enc_counter_old VAR BYTE
    enc_scaler      var BYTE
    Display         Var Byte
    
    INTCON = %10001000      ' Enable PortB Change Interupts  
    IOCB   = %11000000
    pause 5500            ' wait for LCD to start 
    
    goto start            'skip over interupt handler
    '*********************** ASSEMBLY INTERUPT HANDLER *************************
    
    define  INTHAND myint
    Asm
           
    myint 
        
    
    
    
        ;====== BEGINNING OF THE ROTARY ENCODER CODE ========
        ;The Rotary Encoder is connected to PORTB  
        ;The A signal of the encoder connected to the PIN portB.7
        ;The B signal of the encoder connected to the PIN portB.6
        ;
        ;The 4 variables used are declared in the PicBasic code.
        ;
        ;    enc_new VAR BYTE
        ;    enc_old VAR BYTE
        ;   enc_tmp VAR BYTE
        ;    enc_counter VAR WORD
        ;
        ;================================================
            
           ;Read latest input from PORTB & put the value in enc_new.
             movf    PORTB,W
             movwf  _enc_new
    
             ;Strip off all but the 2 MSBs in enc_new.
             movlw    0xc0             ;Create bit mask (bits 7 & 6). b'11000000' ?
             andwf   _enc_new,F       ;Zero bits 5 thru 0.
    
            ;check to see if encoder has moved
            movf    _enc_old,W         ;move enc_old to W
            movwf   _enc_tmp           ;put W to enc_tmp
            movf    _enc_new,W         ;move enc_new to W for XOR
            xorwf   _enc_tmp,F         ;XOR enc_tmp to detect encoder movement
            btfsc   _enc_tmp,7         ;if bit is clear, encoder moved.
            goto    Continue           ;no movement exit isr
    
             ;Determine the direction of the Rotary encoder.  
             rlf     _enc_old,F          ;left shift it into _enc_old to align bit 6 of 
                                     ;_enc_old with bit 7 of enc_new.
    
             movf    _enc_new,W          ;Move the contents of enc_new to W in order to XOR.
             xorwf   _enc_old,F         ;XOR previous inputs (in _enc_old) with latest
                                     ;inputs (in W) to determine CW or CCW.
     
              btfsc   _enc_old,7          ;Test bit 7 of result (in _enc_old).  Skip next line
                                       ;if it is 0 (direction is CCW).
             goto    Up               ;Bit is 1 (direction is CW).  Go around Down
                                     ;and increment counter.
    
    Down
             ;Decrements enc_counter because the rotary encoder moved CCW.
            ;Decrements enc_counter (16 bit value), sets Z on exit.
                  
            decf    _enc_counter,F      ; Decrement low byte
            incfsz  _enc_counter,W      ; Check for underflow
            incf    _enc_counter+1,F    ; Update
            decf    _enc_counter+1,F    ; Fixup
            movf    _enc_counter,W
            iorwf   _enc_counter+1,W    ; Set Z bit
    
            
            ;Add here code for the CCW LED if needed.
             ;bsf     _led            ;turn on led
             
             goto    Continue          ;Branch around UP.
    
    Up
            ;Increments enc_counter because the rotary encoder moved CW.
            ;Increments enc_counter (16 bit value), sets Z on exit.
    
            incfsz  _enc_counter,W      ; Add one to low byte
            decf    _enc_counter+1,F    ; No carry (negates next step)
            incf    _enc_counter+1,F    ; Add one to high byte
            movwf   _enc_counter        ; Store updated low byte back.
            iorwf   _enc_counter+1,W    ; Set Z flag
    
            
           ;Add here code for the CW LED if needed.
           ;bsf     _led2                ; turn on led
        
    Continue         
    ;       Assign the latest encoder inputs (in enc_new) to _enc_old.
             movf     _enc_new,W
             movwf   _enc_old
    
    ;       Restore saved registers
            movf    psave, W
            movwf   PCLATH
            swapf   ssave, W
            movwf   STATUS
            swapf   wsave, F
            swapf   wsave, W
            bcf     INTCON, RABIF          ; Clear the Interupt Flag
            RETFIE                             ; Return from interrupt
    endasm
    
    '***************************************************************************
    '************************* PROGRAM STARTS HERE *****************************
    '***************************************************************************
    
    START:              ' Main Program starts here
    
    
    
    
    enc_counter     = 0    ' set default encoder value
    enc_counter_old = 0
       ' DEBUG 254,2,  "ENCODER             "  ' change display
       ' DEBUG 254,192,#Display,"                 "
       ' DEBUG 254,148,"                    "  ' clear display
       ' DEBUG 254,212,"                    "    
        
    MAIN:  'see if value has changed
        if  enc_counter <> enc_counter_old then enc_counter_old = enc_counter
        Display = (enc_counter/2)
        
    
       
                     
        DEBUG 254,2,"ENCODER             "          ' change display
        DEBUG 254,192,#Display,"                  "
        DEBUG 254,148,"                    "  ' clear display
        DEBUG 254,212,"                    "      ' display enc_counter value
        sound portC.7,[display,1]           
                    
    goto MAIN
    Got it here, more or less: http://www.picbasic.co.uk/forum/showthread.php?t=9700

    It actually works a bit better using serout instead of debug, at least as far as the display goes, but is faster using debug, in terms of how fast the loop cycles.
    I really have not invested that much time into it.
    Last edited by Archangel; - 11th June 2011 at 07:13.
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  4. #4
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,132


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    For the Rotary Encoder have a look at this approach.

    I wanted to do it also with interrupts, but I got interrupted many times!

    http://www.picbasic.co.uk/forum/cont...er#new_comment

    Ioannis

  5. #5
    Join Date
    Jun 2011
    Posts
    37


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    Quote Originally Posted by Ioannis View Post
    For the Rotary Encoder have a look at this approach.

    I wanted to do it also with interrupts, but I got interrupted many times!

    http://www.picbasic.co.uk/forum/cont...er#new_comment

    Ioannis
    Now that's more my speed!
    Simple but elegant. And all I would need to do is change the "if portb.1=0 then" to "if porta.2=1 then" , etc. right?

  6. #6
    Join Date
    Jun 2011
    Posts
    37


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    Quote Originally Posted by Archangel View Post
    That's funny. I just ordered 2 pic18f4431 s on Thursday for this specific purpose. I found even using asm interrupts the 16f690 too slow to track the encoder without losing steps, (either that or it was switch bounce). So I figure to use a PIC with QEI Hardware inputs and a 40mhz clock. Failing that I will try using flip flops to buffer the inputs. In any event there is plenty to learn.
    Now off to Costco for a box of Corn Nuts, and 3 pounds of coffee . . .
    Edit:

    Or you can use a lookup table and display channels or frequency.
    Do you have an old Knight Kit radio as well?
    Display channels or frequency? This sounds great. How would I do that?
    My displays are only 3 digits.

  7. #7
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Exclamation Re: Control a Radio PLL with a PIC

    Quote Originally Posted by RayL113 View Post
    Do you have an old Knight Kit radio as well?
    Display channels or frequency? This sounds great. How would I do that?
    My displays are only 3 digits.
    Nope no Knight kit, I was thinking of a retrofit for old 23 ch CB radios make them useful, other freqs, 10M . . . set a couple of vars
    Code:
     temp var byte
    Code:
     i var byte
    Code:
     lookup i[010,020,030 . . .500],temp
    this aliases your count to the numbers in the lookup table . . . You could set a freq switch with static displays like 142, 143, 144 . . . and follow with the displays driven by the lookup table displaying the fine freqs. Or change up to a word var and you have up to 65535 values you could step through, or use 2 encoders (old Henry 2m used 2 switches ganged) sorry about the code formats, crazy forum software glitch killed formatting for me, so I had to do it this way.
    Last edited by Archangel; - 11th June 2011 at 08:53.
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  8. #8
    Join Date
    Jun 2011
    Posts
    37


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    Var, I take to mean variable. Remember I'm new to Pics and PBP. So a word var? Is this an extended table?

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


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    From the manual
    4.3. Variables

    Variables are where temporary data is stored in a PICBASIC PRO™ program. They are created using the VAR keyword. Variables may be bits, bytes or words. Space for each variable is automatically allocated in the microcontroller=s RAM by PBP. The format for creating a variable is as follows:
    There are basically four sizes a VAR can be while using PicBasicPro 2.6x
    BIT = number of BITs - 1
    BYTE = number of BITs - 8
    WORD = number of BITs -16
    LONG = number of BITs - 32
    Dave
    Always wear safety glasses while programming.

  10. #10
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    Yes, var= variable
    bit is one of the placeholders in the larger variable, example
    say you want a variable to hold a value as a flag for an event, you could make a bit variable, called . . . FLAGBIT this way FLAGBIT VAR BIT
    or you might need several flag bits and do it this way
    FLAGBIT VAR BYTE which gives you an 8 bit byte full of FLAGBITS as follows
    FLAGBIT.0 lowest bit in the byte
    FLAGBIT.1 second bit in the byte
    FLAGBIT.2 third " " " "
    FLAGBIT.3 . . .
    FLAGBIT.4 . . . all the way to FLAGBIT.7 , FLAGBIT.7 being the highest order bit in the byte variable
    which is to say you can address every bit of your variable individually.
    Byte = %00000000 will hold 0 to 255 in decimal
    word = %00000000 00000000 will hold 0 to 65535 in decimal
    LONG = %00000000 00000000 00000000 00000000 which is 4294967295 but I think (I am not sure of this) only allows 1/2 that much on each side of zero -2147483647 0 2147483647

    Notice the way I have written the binary expression %00000000 this is the appropriate syntax for P Basic Pro, other compilers may use different "punctuation" and you will see "BIG ENDIAN" and LITTLE ENDIAN" usage and all that means is which end of the group of zeros is the least significant bit, the Left or the Right.

    You will see different ways of displaying hex as well, in PBP we use $00 whereas in C you might see something like 0h00
    Last edited by Archangel; - 12th June 2011 at 01:15.
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  11. #11
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    in PBP we use $00 whereas in C you might see something like 0h00
    high likely 0x00
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  12. #12
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    This may not be it, but the only thing I notice is: you have OSC_HS selected, but you are using an oscillator at 4 mhz. If you are using an oscillator instead of a resonator, this should be set to XT for 4 mhz. If you are using a resonator, did you see the note with the data sheet?

    Note: When using resonators with frequencies
    above 3.5 MHz, the use of HS mode,
    rather than XT mode, is recommended.
    HS mode may be used at any VDD for
    which the controller is rated. If HS is
    selected, it is possible that the gain of the
    oscillator will overdrive the resonator.
    Therefore, a series resistor should be
    placed between the OSC2 pin and the
    resonator. As a good starting point, the
    recommended value of RS is 330Ω.
    http://www.scalerobotics.com

  13. #13
    Join Date
    Jun 2011
    Posts
    37


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    Quote Originally Posted by Archangel View Post
    Yes, var= variable
    bit is one of the placeholders in the larger variable, example
    say you want a variable to hold a value as a flag for an event, you could make a bit variable, called . . . FLAGBIT this way FLAGBIT VAR BIT
    or you might need several flag bits and do it this way
    FLAGBIT VAR BYTE which gives you an 8 bit byte full of FLAGBITS as follows
    FLAGBIT.0 lowest bit in the byte
    FLAGBIT.1 second bit in the byte
    FLAGBIT.2 third " " " "
    FLAGBIT.3 . . .
    FLAGBIT.4 . . . all the way to FLAGBIT.7 , FLAGBIT.7 being the highest order bit in the byte variable
    which is to say you can address every bit of your variable individually.
    Byte = %00000000 will hold 0 to 255 in decimal
    word = %00000000 00000000 will hold 0 to 65535 in decimal
    LONG = %00000000 00000000 00000000 00000000 which is 4294967295 but I think (I am not sure of this) only allows 1/2 that much on each side of zero -2147483647 0 2147483647

    Notice the way I have written the binary expression %00000000 this is the appropriate syntax for P Basic Pro, other compilers may use different "punctuation" and you will see "BIG ENDIAN" and LITTLE ENDIAN" usage and all that means is which end of the group of zeros is the least significant bit, the Left or the Right.

    You will see different ways of displaying hex as well, in PBP we use $00 whereas in C you might see something like 0h00
    Thanks that helps alot. Yes I had noticed the % in front of what looked like binary expressions but hadn't noticed the $ in front of hex expressions. Can you still use the "b and h" in PCB? In case I forget and use the asm expression?

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


    Did you find this post helpful? Yes | No

    Default Re: Control a Radio PLL with a PIC

    Can you still use the "b and h" in PCB?
    Nope.
    From the manual.
    4.8. Numeric Constants
    PBP allows numeric constants to be defined in the three bases: decimal, binary and hexadecimal. Binary values are defined using the prefix '%' and hexadecimal values using the prefix '$'. Decimal values are the default and require no prefix.

    100 ' Decimal value 100
    %100 ' Binary value for decimal 4
    $100 ' Hexadecimal value for decimal 256
    Dave
    Always wear safety glasses while programming.

Members who have read this thread : 0

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