Frequency detection (audio)


Closed Thread
Results 1 to 23 of 23

Hybrid View

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


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audo)

    Hank,, how bout toggling a pin in your ISR to show when the PIC thinks it should start and stop counting.
    EDIT : OK I see youo have done that already DOH!!

    The numbers should be linear IMHO. so 330 HZ is about half of 600, but your numbers are *4. 330 = 7300 and 600 = 1800. Now between 600 and 650, we have a difference of 600. So that would say the count shoud be 600 per 50hz. so to get to 100hz, we would expect the count to be 10*600=6000 difference. or 7800 (ish). but you are at 49,000 for 82.4. either I am way off on my linear assumption (most likely) or something is really amiss.
    Last edited by cncmachineguy; - 7th June 2012 at 17:00.
    -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!

  2. #2
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audo)

    Quote Originally Posted by cncmachineguy View Post
    Hank,, how bout toggling a pin in your ISR to show when the PIC thinks it should start and stop counting.
    EDIT : OK I see youo have done that already DOH!!
    No...I hadn't so put a toggle in my ISR (top tip - tks!)

    I've scoped the ISR 'toggled' pin & I'm seeing 250hz on there?!! (therefore 2 x 250hz = an interrupt rate of 500Hz ....this for a 1kHz audio signal?!)

    I confirmed my input to the comparator was 1Khz...and also the output from the PIC comparator is definitely 1khz (since I've brought it out on a PIC external pin & scoped it).

    So it looks like my comparator interrupt isn't working properly and my interrupt is only happening at half the rate it should???

    Any ideas?!!
    Last edited by HankMcSpank; - 7th June 2012 at 17:13.

  3. #3
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Ok, so I took the HSEROUT command out of the ISR ...... & then my ISR 'toggle pin' frequency scoped correct up to around 900hz audio input ....however, above that 900Hz audio input, even with just a basic 'toggle pin' in the ISR, the toggle pin frequency as seen on a scope starts going awry again....so the conclusion here ...it seems that DT's interrupts are taking a bit too long to get in & out for anything above 800hz comparator interrupt rate (this is with a 16Mhz oscillator).

    Anyone know of another way of approaching this? (I'd like to be able to to detect up to 1.5Khz)
    Last edited by HankMcSpank; - 7th June 2012 at 18:16.

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


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Here I go out on a limb that has been broken already, change the type to ASM instead of PBP. The only thig I see in your ISR using PBP is HSEROUT and TMR=0 since you removed the hser, now its only TMR=0 Now keep in mind - YOU ARE NOT SUPPOSED to do this, but for the simple setting of TMR I think you can get away with it. Add BSR=0 as your first line in the ISR. That will stop all the system variables from getting saved and restored everytime you enter the ISR. Sound familiar?

    This may be enough to make it happen just as you want. The next approach I can think of is to use the comparitor as the gate for the timer, but that may be how you are doing it now

    Also, does the CMP fire an int twice or 4 times per cycle? or just 1 time?
    Last edited by cncmachineguy; - 7th June 2012 at 18:25.
    -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!

  5. #5
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Thanks for the input Bert, I changed the interrupt to ASM...
    Code:
    ASM
    INT_LIST  macro ; IntSource,    Label,         Type, ResetFlag?
        INT_Handler  CMP2_INT,  _CMP2_Interrupt,  ASM,  YES 
        endm
        INT_CREATE       ; Creates the interrupt processor
    ENDASM
    and modified my ISR...

    Code:
    CMP2_Interrupt:   ' COMPARATOR2 INTERRUPT.
    BSR=0 
    toggle portc.7
    TMR1=0
    @ INT_RETURN
    but I still can't my audio input above 900Hz, without the ISR toggle pin scoping wrong :-(

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


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Hank do the numbers below 900 seem to make sense? We should be able to predict the TMR output based on some simple math. You are running 4MIPS (16Mhz OSC). so that would be .25uS per instruction. If the timer is running from Fosc, a 1 K signal would have a count of 4000? 1/1000 = 1mS. 1mS/.25uS=4000. Assuming the ISR fires 1 time per cycle. Likewise we would expect a count of around 8000 for a 500Hz signal. But either you don't have it set up as I assume, or something is wrong that will require seeing more of your code.

    BTW, using my assumptions, 82.4Hz is 48,543.
    330Hz = 12,121
    600Hz = 6666
    650Hz = 6153

    I can't decide if that looks linear, but it should.

    Also try clearing the TMR1 high byte and low byte seperatly in the ISR. I don't think this should help, but it can't hurt
    Last edited by cncmachineguy; - 7th June 2012 at 20:36.
    -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!

  7. #7
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Frequency detection (audio)

    Hi Bert,

    I re-enabled hserout out in the ISR again, and these are the TMR1 counts I'm getting for successive comparator2 interrupts with an audio input of 82.4Hz (the lowest note/frequency on a standard tuning electric guitar)...

    42947
    42995
    42946
    42998
    42944
    43003
    42960
    43012
    42964
    43022
    42974
    43032
    42991
    42948
    18932
    18559
    42953
    43012
    42955
    43005
    42957
    43001
    42943


    A couple of dodgy ones in there, but those aside, the TMR1 counts are coming in lower at about 43,000?

    Code:
    @ __CONFIG _CONFIG1, _FCMEN_OFF & _FOSC_INTOSC & _WDTE_OFF & _MCLRE_OFF & _CP_ON & _IESO_OFF & _BOREN_OFF & _PWRTE_OFF
    @ __CONFIG _CONFIG2, _PLLEN_OFF & _STVREN_OFF & _LVP_OFF 
    DEFINE  OSC 16
    INCLUDE "DT_INTS-14.bas"     
    INCLUDE "ReEnterPBP.bas"     ' Include if using PBP interrupts
    DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
    DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
    DEFINE HSER_CLROERR 1 ' Clear overflow automatically
    DEFINE HSER_SPBRG 25  ' 38400 Baud @ 16MHz, 0.16%
    SPBRGH = 0
    BAUDCON.3 = 1         ' Enable 16 bit baudrate generator
    '16F1828 Pin settings....
    ' PIN# NAME     USE & CONNECTION
               '  1   Vdd      +5VDC power supply
    TRISA.5 = 0'  2   RA5      
    TRISA.4 = 1'  3   RA4      
    TRISA.3 = 1'  4   RA3      
    TRISC.5 = 0'  5   RC5      
    TRISC.4 = 0'  6   RC4      C2OUT 
    TRISC.3 = 1'  7   RC3         
    TRISC.6 = 0'  8   RC6           
    TRISC.7 = 0'  9   RC7      
    TRISB.7 = 0'  10  RB7       
    TRISB.6 = 1'  11  RB6       
    TRISB.5 = 1'  12  RB5       
    TRISB.4 = 1'  13  RB4       
    TRISC.2 = 1'  14  RC2      
    TRISC.1 = 1'  15  RC1      C12IN1- (FREQ DETECT)
    TRISC.0 = 1'  16  RC0      
    TRISA.2 = 0'  17  RA2               
    TRISA.1 = 0'  18  RA1      
    TRISA.0 = 0'  19  RA0      
    '             20  Vss      Ground
    ANSELA     = 0 
    ANSELC     = 0   
              
    APFCON0.2 = 0  'put hserout onto RB7 pin 10 (Pickit 2 RX pin)
      
    '-------------------------------------------------------------------------
    Osccon = %01111010   'sets the internal oscillator 
    CPSCON0 = 0    ' capacitive sense module off
    CM1CON0 = 0     ' comparator1 module off
    CM2CON0.7 = 1 ' comparator2 on.
    CM2CON0.5 = 1   'enable the output on a pin
    CM2CON0.4 = 1 'invert the polarity
    CM2CON0.1 = 1   'ENABLE HYSTERISIS
    CM2CON1.7 = 1' enable interrupts on _+ve going transition
    CM2CON1.5 = 0   ' set comparator comparison input pin to the DAC
    CM2CON1.4 = 1   ' set comparator comparison input pin to the DAC
    CM2CON1.1 = 0   'SELECT C12IN1- (PIN 15, RC1)
    CM2CON1.0 = 1   'SELECT C12IN1- (PIN 15, RC1)
    
    DACCON0.7 = 1 ' DAC ON
    DACCON0.6 = 1 ' DAC ON
    DACCON0.5 = 0  'put the output of the DAC o the DAC out pin
    DACCON0.3 = 0   'SET DAC +VE REFERENCE REFERENCE TO VCC
    DACCON0.2 = 0   'SET DAC +VE REFERENCE REFERENCE TO VCC
    DACCON1 = %00000001   'sets the DAC voltage output to be very low (to use for the comparator to compare against.
    OPTION_REG.7 = 0
    ASM
    INT_LIST  macro ; IntSource,    Label,         Type, ResetFlag?
        INT_Handler  CMP2_INT,  _CMP2_Interrupt,  ASM,  YES 
        endm
        INT_CREATE       ; Creates the interrupt processor
    ENDASM
    TMR1 = 0
    T1CON = %00000111
    @ INT_ENABLE CMP2_INT   ; Enable 'Int On Change' interrupts
    loop1:
    PAUSE 1
    GOTO loop1
    
    'Interrupt+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
    CMP2_Interrupt:   ' COMPARATOR2 INTERRUPT.
    @ INT_DISABLE CMP2_INT
    BSR=0
    hserout [dec tmr1,13,10] 
    toggle portc.7
    TMR1=0
    @ INT_ENABLE CMP2_INT
    @ INT_RETURN
    Last edited by HankMcSpank; - 7th June 2012 at 21:32.

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