Darrels interrupts and multiple SOUND statements, will it work?


Closed Thread
Results 1 to 32 of 32
  1. #1
    Join Date
    Feb 2013
    Posts
    1,078

    Default Darrels interrupts and multiple SOUND statements, will it work?

    As it's known, you can have several interrupts with Darrels interrupts. What if I use say 4 interrupts, and use SOUND statement in each to output sound on separate pin, then connect the pins via resistors to same speaker, so I can get polyphonic music, or say music and drumkit line? will it work? are there any limits for specific statements vs interrupts?

  2. #2
    Join Date
    May 2013
    Location
    australia
    Posts
    2,388


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    a sound command will lock the interrupt that its in until it completes . interrupts aren't interruptible (except on pic18 hi/lo priority) . sound commands will be sequential no matter how you go about it
    you would need a pic multi tasking os like RTOS to get anywhere close to that

  3. #3
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,520


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    The processor can only do one thing at the time. It can't exectute two SOUND commands simultanously no matter where you place them.
    If you put a SOUND command in ONE interrupt handler that SOUND command will block all other interrupts while executing unless one of the other interrupts have a higher priority* than the one currently executing, in which case the one currently executing will be "halted" untill the ISR with higher priority is finished.

    * PIC18 have two interrupt priorities.

    You could use a PIC with multiple PWM modules and something like a 1ms background tick to turn them on/off.

    EDIT: Richard beat me to it....

  4. #4
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Yes I already use 16F876's PWM channels to have 2 note polyphony, but I'd like to have more on simpler chips (say 12F683).

    Here's 16F628A doing not only stereo polyphony, but color graphics too:

    http://www.quinapalus.com/picsi.html

  5. #5
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,520


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Out of curiosity, how many channels do you need?
    8 channels for 4 * 2 note polyphony? Highest/lowest output frequency?
    What frequency resolution would be considered good enough?

  6. #6
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Actually, capabilities of AY-3-8910 will be enough (3 channels). Since I want to incorporate famous NES game tunes into my project as easter egg. If it was dedicated project, I can use that chip, which I have used on ZX Spectrum quite long time ago, but I'm space and hardware resources limited, so this is why I'm asking for software solution.

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


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Hi,
    I fooled around with this a bit yesterday. I've got a software solution for generating three tones but there is (and won't be) any noise, mixer, envelope, shape and whatever else the AY-3-8910 can do - just three tone generators. I have no idea if it'll work in practice or how good it'll "sound" but scope and frequency counter shows correct values for, at this point, three octaves.

    With 3 channels it will NOT work at 4MHz, it MIGHT just work at 8MHz but there won't be much left do anything else. I'm currently running it on a 18F25K20 @64MHz so I need to breadboard something with a less capable chip and see what gives. Obviously the lower the maximum output frequency needs to be the more can be achieved with a low clock frequency so I'll ask again: What's the maximum output frequency you NEED?

    Is the 12F683 the desried target chip and will you able to run it with external clock (to get 16MHz or 20MHz)? As it's written it relies on the prescense of a TMR2 module and uses interrupts at the ASM level, though the actual ISR is written in PBP with manual system register save/restore.

    Are you aiming to do other things as well with this same chip?

    It's not ready for public viewing yet, I'll post it when it is (or not if the answers to the above questions shows it's a dead end....)

    /Henrik.

  8. #8
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Here is the sample (intro music)



    You can see, it uses only 3 channels, no SFX or sophisticated envelope/shaping.

    For the hardware, main MCU is 16F877A @ 20mhz. I want code to run on it, or if it'll be better to have separate chip, I have space for SOIC-8 case, this is why I said 12F683, but it can be say 12F1840 or whatsoever (no space for extra xtal, but I can use CLKOOUT from main chip).

  9. #9
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,520


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Hi,

    > You can see, it uses only 3 channels, no SFX or sophisticated envelope/shaping
    No, *I* can definitely not see (or hear) it. I know nothing about composing music of any kind so I'll take your word for it ;-)

    Are you using interrupt on the main CPU already and if so is it DT-INTS?

    The code should run on a 16F877 at 20MHz but it'll absorb a fair bit of the available CPU cycles meaning everthing else will run slow(ish). I'll get some data on it when I get a chance to work on it again. The 12F1840 has an internal 32MHz oscillator - that should work pretty well.

    /Henrik.

  10. #10
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    3,803


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    16F877 made that video game??

    Ioannis

  11. #11
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    No, that video game runs on 6502 or similar CPU. It is possible to emulate NES using PIC, using various models, check this link as example:


    For the my intended music playback, 877A uses DT-INTs, and for the easter egg moment, which will be achieved when user presses certain combo of keys, ther will be a small animation on 1602 display, and music should be playing, MCU won't be doing anything sophisticated that time.

  12. #12
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,520


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Hi,
    So, I've played around some more.....
    It won't run at anything below 16MHz. Even at 16MHz the interrupt routine, executing at 10kHz cosumes 70% of the available CPU cycles.
    I've only tried it on an 18F25K20 @64MHz, you try it on a 16F or 12F1840 and see if it works.

    You can not cut'n'paste this into a program using DT-Ints. Try it stand-alone first and we'll see about DT-ints later - if needed.

    /Henrik.

    Code:
    '****************************************************************
    '*  Name    : 3xSound generator.pbp                             *
    '*  Author  : Henrik Olsson                                     *
    '*  Notice  : Written by Henrik Olsson 2015                     *
    '*          : Free software, use as you wish.                   *
    '*  Date    : 2015-01-14                                        *
    '*  Version : 1.0                                               *
    '*  Notes   : Written in response to a thread on the PBP forum: *
    '*          : www.picbasic.co.uk/forum/showthread.php?t=19684   *
    '*                                                              *
    '*          : Tones are generated using the DDS tecnique with a *
    '*            simple 16bit accumulator to which a value gets    *
    '*            added once every interrupt (100us). When the      *
    '*            accumulator overflows the output is toggled.      *
    '*            Three generators are incorporated since that was  *
    '*            the request. More could be added if the PIC is    *
    '*            clocked fast enough. With three generators 16MHz  *
    '*            is the lowest you want to use. The interrupts     *
    '*            then uses ~70% of the available CPU cycles when   *
    '*            three tones are generated.                        *
    '*                                                              *
    '*            Version history:                                  *
    '*              v1.0 2015-01-14 - Initial version               *
    '*                                                              *
    '****************************************************************
    
    ' CONFIG's, TRIS's, ANSEL's CMCON's and anything device specific is not shown
    
    DEFINE OSC 64
    DEFINE INTHAND Generate         ' We're treating the interrupt as an ASM routine (see notes!)
    
    '-------------------------------------------------------------------------------------------
    ' These variables and alises are needed by the sound generator and needs to be
    ' accessed by the user.
    Channel_1       VAR PortC.0     ' Output for sound channel 1
    Channel_2       VAR PortC.1     ' Output for sound channel 2
    Channel_3       VAR PortC.2     ' Output for sound channel 3
    
    TMR2IF          VAR PIR1.1      ' Alias to TMR2 Interrupt Request Flag - verify against datasheet.
    
    Output_1        VAR WORD        ' Desired output frequency, Channel 1, 13.107 units per Hz
    Output_2        VAR WORD        ' Desired output frequency, Channel 2, 13.107 units per Hz
    Output_3        VAR WORD        ' Desired output frequency, Channel 3, 13.107 units per Hz
    
    Duration_1      VAR WORD        ' Duration of tone, Channel 1, 100us units.
    Duration_2      VAR WORD        ' Duration of tone, Channel 2, 100us units.
    Duration_3      VAR WORD        ' Duration of tone, Channel 3, 100us units.
    
    '-------------------------------------------------------------------------------------------
    ' These are variables used by the interrupt service routine.
    ' No user servicable parts inside......
    R0_SHADOW       VAR WORD        ' Variable used for saving PBP system variables in the ISR
    R1_SHADOW       VAR WORD        ' Variable used for saving PBP system variables in the ISR
    R4_SHADOW       VAR WORD        ' Variable used for saving PBP system variables in the ISR
    
    Accumulator_1   VAR WORD        ' DDS accumulator for sound generator 1
    Accumulator_2   VAR WORD        ' DDS accumulator for sound generator 2
    Accumulator_3   VAR WORD        ' DDS accumulator for sound generator 3
    
    old_1           VAR WORD        ' Used to detect overflow of accumulator 1
    old_2           VAR WORD        ' Used to detect overflow of accumulator 2
    old_3           VAR WORD        ' Used to detect overflow of accumulator 3
    '--------------------------------------------------------------------------------------------
    
    ' We want 10kHz interrupt rate, that's 100us between interrupts.
    ' The interrupt routine needs around ~280 instruction cycles when
    ' outputting on three channels.
    '
    ' At 16MHz that would be  400 instructions - 70% used by the generator. 
    ' At 20MHz that would be  500 instructions - 56% used by the generator
    ' At 40MHz that would be 1000 instructions - 28% used by the generator
    ' At 64MHz that would be 1600 instructions - 17.5% used by the generator
    '
    ' T2CON and PR2 needs to be setup so that an interrupt is triggered every 100us
    ' Use one of the follwing:
    ' PR2 =  99 : T2CON = %00000110   ' For 64MHz - 1:16 prescaler
    ' PR2 =  49 : T2CON = %00000110   ' For 32MHz - 1:16 prescaler
    ' PR2 = 124 : T2CON = %00000101   ' For 20MHz - 1:4 prescaler
    ' PR2 =  99 : T2CON = %00000101   ' For 16MHz - 1:4 prescaler
     
    PR2 = 99 : T2CON = %00000110  'TMR2 on, postscaler 1:1, prescaler 1:4
    
    IPR1.1   = 1        ' TMR2 high priority
    PIE1.1   = 1        ' TMR2 IE
    INTCON.6 = 1        ' PIE
    INTCON.7 = 1        ' GIE
    
    
    Main:
        ' All three notes will play simultanously for the specified duration.
        ' The sound is generated in the background so the PAUSE 1000 will
        ' execute at the same time as the notes are played. Remember though that
        ' the interrupt "steals" time so the PAUSE isn't correct. The slower the
        ' PIC clock is the more inacurate it gets.
    
        Output_1 = 857   : Duration_1 = 500    'Play C2 (65.4Hz) for 50ms
        Output_2 = 5767  : Duration_2 = 2500   'Play A4 (440.0Hz)for 250ms 
        Output_3 = 25893 : Duration_3 = 1000   'Play B6 (1975.5Hz) for 100ms
    
        Pause 1000
    
    Goto Main
    
    
    '-------------------------------------------------------------------------------
    ' Actual interrupt routine here. Please note that this is written in PBP but
    ' the interrupt is handled as if it were a ASM interrupt. As far as I can see
    ' it uses PBP system variables R0, R1, R4 so I'm saving/restoring those.
    ' If ANY code gets added here then the ASM-listning needs to be checked to 
    ' see of the added PBP code uses any more system variables and if so
    ' those needs to saved/restored as well.
    ' When all three channels produces output it needs ~280 instructions cycles.
    @ Generate:
    
    @ MOVE?WW R0, _R0_SHADOW                  ; Save PBP system variable R0 
    @ MOVE?WW R1, _R1_SHADOW                  ; Save PBP system variable R1 
    @ MOVE?WW R4, _R4_SHADOW                  ; Save PBP system variable R4   
        TMR2IF = 0
    
        IF Duration_1 > 0 THEN
            Accumulator_1 = Accumulator_1 + Output_1
            If Accumulator_1 < old_1 THEN Toggle Channel_1
            old_1 = Accumulator_1
            Duration_1 = Duration_1 - 1
        ELSE
            Channel_1 = 0
        ENDIF
        
        IF Duration_2 > 0 THEN
            Accumulator_2 = Accumulator_2 + Output_2
            If Accumulator_2 < old_2 THEN Toggle Channel_2
            old_2 = Accumulator_2
            Duration_2 = Duration_2 - 1
        ELSE
            Channel_2 = 0
        ENDIF
        
        If Duration_3 > 0 THEN
            Accumulator_3 = Accumulator_3 + Output_3
            If Accumulator_3 < old_3 THEN Toggle Channel_3
            old_3 = Accumulator_3
            Duration_3 = Duration_3 - 1
        ELSE
            Channel_3 = 0
        ENDIF
    
    
    @ MOVE?WW _R0_SHADOW, R0                    ; Restore PBP system variable R0
    @ MOVE?WW _R1_SHADOW, R1                    ; Restore PBP system variable R1 
    @ MOVE?WW _R4_SHADOW, R4                    ; Restore PBP system variable R4    
     
    @ retfie FAST
    '-------------------------------------------------------------------------------
    END

  13. #13
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    WOW, so fast!

    It's my fault, I forgot to mention, we only need high frequencies for SFX synthesis, for music playback, 5 octave range is enough, which means roughly 440*5=2.2khz

  14. #14
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,520


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Hi,
    2.2kHz (Output_x = 28835) should work. The higher you go the more jittery the output becomes.

    If you want to calculate the value to put in the Output_x variables at runtime (instead of using a lookup table or whatever) you can do it with Output_x = ( Frequency + ( Frequency ** 20353 ) ) where Frequency is a WORD containing the desired output frequency * 10, (4400 = 440.0Hz)

    It's not perfect but may be good enough.

    Let me know if you get around to trying it.

    /Henrik.

  15. #15
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    What happens if I run this code say at 4mhz 16F870 ? there will be no output, frequency wont match, or sound will be breaking up?

  16. #16
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    on 16F876A, gives error during compile on this:

    IPR1.1 = 1 ' TMR2 high priority

  17. #17
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Gives same error on 12F1840.

  18. #18
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,520


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Hi,

    > What happens if I run this code say at 4mhz 16F870 ? there will be no output, frequency wont match, or sound will be breaking up?

    There's not enough time to actually execute the interrupt service routine before the timer fires another interrupt. The CPU will spend all of its time in the ISR, no time left for you to set the desired frequencies etc and the output frequenices will be wrong and...... Simply - It just won't work. You need 16MHz.

    > on 16F876A, gives error during compile on this:
    > IPR1.1 = 1 ' TMR2 high priority


    The 16F series doesn't have interrupt priorities, remove the line.

    > Gives same error on 12F1840.

    The 12F series doesn't have interrupt priorities, remove the line.

    /Henrik.

  19. #19
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Still does not compile on 16F876A -

    ASM ERROR:
    Symbol not previously defined (wsave), (ssave), (psave).

    Compile OK on 12F1840, but ASM warning - Found label after column 1. (Generate), Extraneous arguments on the line

  20. #20
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    added this for 16F876A:

    Code:
    wsave VAR BYTE $20 SYSTEM
    ssave VAR BYTE $22 SYSTEM
    psave var byte $24 SYSTEM
    Have no idea why, but no more errors in compile, will try runtime shortly.

  21. #21
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    It works, sort of (20mhz crystal 16F876A).

    If any channel duration has same value, these channels won't play.
    Also, playback duration is different each time, it might play 4 or 5 times same duration, then 2 times shorter duration, then again normal.
    It works properly only when value of output timings is first is the shortest, 2nd medium and 3rd - longest. If in reverse, it will only play last, short one.

  22. #22
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,520


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Hi,

    > Still does not compile on 16F876A -
    > ASM ERROR:
    > Symbol not previously defined (wsave), (ssave), (psave).


    Do you have DT-Ints in the program? I thought I said:
    You can not cut'n'paste this into a program using DT-Ints. Try it stand-alone first and we'll see about DT-ints later - if needed.
    > Compile OK on 12F1840, but ASM warning - Found label after column 1. (Generate), Extraneous arguments on the line
    That's a warning, have you edited the source in any way? I don't get that here.....

    > If any channel duration has same value, these channels won't play.
    > Also, playback duration is different each time, it might play 4 or 5 times same duration, then 2 times shorter duration, then again normal.
    > It works properly only when value of output timings is first is the shortest, 2nd medium and 3rd - longest. If in reverse, it will only play last, short one.


    Are you running the program, by itself, on the 16F877 at 20MHz or are you, despite my warning, trying to run it together with the rest of your program AND DT-INTS?

    /Henrik.

  23. #23
    Join Date
    May 2013
    Location
    australia
    Posts
    2,388


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    any pic without auto context save will need the wsave psave vars added


    this compiles ok for a 12f1822 watch the define OSC not sure how fast a 12f1822 is

    Code:
    '****************************************************************
    '*  Name    : 3xSound generator.pbp                             *
    '*  Author  : Henrik Olsson                                     *
    '*  Notice  : Written by Henrik Olsson 2015                     *
    '*          : Free software, use as you wish.                   *
    '*  Date    : 2015-01-14                                        *
    '*  Version : 1.0                                               *
    '*  Notes   : Written in response to a thread on the PBP forum: *
    '*          : www.picbasic.co.uk/forum/showthread.php?t=19684   *
    '*                                                              *
    '*          : Tones are generated using the DDS tecnique with a *
    '*            simple 16bit accumulator to which a value gets    *
    '*            added once every interrupt (100us). When the      *
    '*            accumulator overflows the output is toggled.      *
    '*            Three generators are incorporated since that was  *
    '*            the request. More could be added if the PIC is    *
    '*            clocked fast enough. With three generators 16MHz  *
    '*            is the lowest you want to use. The interrupts     *
    '*            then uses ~70% of the available CPU cycles when   *
    '*            three tones are generated.                        *
    '*                                                              *
    '*            Version history:                                  *
    '*              v1.0 2015-01-14 - Initial version               *
    '*                                                              *
    '****************************************************************
    ' CONFIG's, TRIS's, ANSEL's CMCON's and anything device specific is not shown
    DEFINE OSC 20
    DEFINE INTHAND _Generate         ' We're treating the interrupt as an ASM routine (see notes!)   did not like asm label not sure why
    '-------------------------------------------------------------------------------------------
    ' These variables and alises are needed by the sound generator and needs to be
    ' accessed by the user.
    Channel_1       VAR Porta.0     ' Output for sound channel 1
    Channel_2       VAR Porta.1     ' Output for sound channel 2
    Channel_3       VAR Porta.2     ' Output for sound channel 3
    TMR2IF          VAR PIR1.1      ' Alias to TMR2 Interrupt Request Flag - verify against datasheet.
    Output_1        VAR WORD        ' Desired output frequency, Channel 1, 13.107 units per Hz
    Output_2        VAR WORD        ' Desired output frequency, Channel 2, 13.107 units per Hz
    Output_3        VAR WORD        ' Desired output frequency, Channel 3, 13.107 units per Hz
    Duration_1      VAR WORD        ' Duration of tone, Channel 1, 100us units.
    Duration_2      VAR WORD        ' Duration of tone, Channel 2, 100us units.
    Duration_3      VAR WORD        ' Duration of tone, Channel 3, 100us units.
    '-------------------------------------------------------------------------------------------
    ' These are variables used by the interrupt service routine.
    ' No user servicable parts inside......
    R0_SHADOW       VAR WORD        ' Variable used for saving PBP system variables in the ISR
    R1_SHADOW       VAR WORD        ' Variable used for saving PBP system variables in the ISR
    R4_SHADOW       VAR WORD        ' Variable used for saving PBP system variables in the ISR
    Accumulator_1   VAR WORD        ' DDS accumulator for sound generator 1
    Accumulator_2   VAR WORD        ' DDS accumulator for sound generator 2
    Accumulator_3   VAR WORD        ' DDS accumulator for sound generator 3
    old_1           VAR WORD        ' Used to detect overflow of accumulator 1
    old_2           VAR WORD        ' Used to detect overflow of accumulator 2
    old_3           VAR WORD        ' Used to detect overflow of accumulator 3
    '--------------------------------------------------------------------------------------------
    ' We want 10kHz interrupt rate, that's 100us between interrupts.
    ' The interrupt routine needs around ~280 instruction cycles when
    ' outputting on three channels.
    '
    ' At 16MHz that would be  400 instructions - 70% used by the generator. 
    ' At 20MHz that would be  500 instructions - 56% used by the generator
    ' At 40MHz that would be 1000 instructions - 28% used by the generator
    ' At 64MHz that would be 1600 instructions - 17.5% used by the generator
    '
    ' T2CON and PR2 needs to be setup so that an interrupt is triggered every 100us
    ' Use one of the follwing:
    ' PR2 =  99 : T2CON = %00000110   ' For 64MHz - 1:16 prescaler
    ' PR2 =  49 : T2CON = %00000110   ' For 32MHz - 1:16 prescaler
    ' PR2 = 124 : T2CON = %00000101   ' For 20MHz - 1:4 prescaler
    ' PR2 =  99 : T2CON = %00000101   ' For 16MHz - 1:4 prescaler
     
    PR2 = 99 : T2CON = %00000110  'TMR2 on, postscaler 1:1, prescaler 1:4
    'IPR1.1   = 1        ' TMR2 high priority
    PIE1.1   = 1        ' TMR2 IE
    INTCON.6 = 1        ' PIE
    INTCON.7 = 1        ' GIE
    
    Main:
        ' All three notes will play simultanously for the specified duration.
        ' The sound is generated in the background so the PAUSE 1000 will
        ' execute at the same time as the notes are played. Remember though that
        ' the interrupt "steals" time so the PAUSE isn't correct. The slower the
        ' PIC clock is the more inacurate it gets.
        Output_1 = 857   : Duration_1 = 500    'Play C2 (65.4Hz) for 50ms
        Output_2 = 5767  : Duration_2 = 2500   'Play A4 (440.0Hz)for 250ms 
        Output_3 = 25893 : Duration_3 = 1000   'Play B6 (1975.5Hz) for 100ms
        Pause 1000
    Goto Main
    
    '-------------------------------------------------------------------------------
    ' Actual interrupt routine here. Please note that this is written in PBP but
    ' the interrupt is handled as if it were a ASM interrupt. As far as I can see
    ' it uses PBP system variables R0, R1, R4 so I'm saving/restoring those.
    ' If ANY code gets added here then the ASM-listning needs to be checked to 
    ' see of the added PBP code uses any more system variables and if so
    ' those needs to saved/restored as well.
    ' When all three channels produces output it needs ~280 instructions cycles.
    Generate :                       made this a pbp label
    @ MOVE?WW R0, _R0_SHADOW                  ; Save PBP system variable R0 
    @ MOVE?WW R1, _R1_SHADOW                  ; Save PBP system variable R1 
    @ MOVE?WW R4, _R4_SHADOW                  ; Save PBP system variable R4   
        TMR2IF = 0
        IF Duration_1 > 0 THEN
            Accumulator_1 = Accumulator_1 + Output_1
            If Accumulator_1 < old_1 THEN Toggle Channel_1
            old_1 = Accumulator_1
            Duration_1 = Duration_1 - 1
        ELSE
            Channel_1 = 0
        ENDIF
        
        IF Duration_2 > 0 THEN
            Accumulator_2 = Accumulator_2 + Output_2
            If Accumulator_2 < old_2 THEN Toggle Channel_2
            old_2 = Accumulator_2
            Duration_2 = Duration_2 - 1
        ELSE
            Channel_2 = 0
        ENDIF
        
        If Duration_3 > 0 THEN
            Accumulator_3 = Accumulator_3 + Output_3
            If Accumulator_3 < old_3 THEN Toggle Channel_3
            old_3 = Accumulator_3
            Duration_3 = Duration_3 - 1
        ELSE
            Channel_3 = 0
        ENDIF
    
    @ MOVE?WW _R0_SHADOW, R0                    ; Restore PBP system variable R0
    @ MOVE?WW _R1_SHADOW, R1                    ; Restore PBP system variable R1 
    @ MOVE?WW _R4_SHADOW, R4                    ; Restore PBP system variable R4    
     
    @ retfie                           ; '    no fast
    
    Last edited by richard; - 15th January 2015 at 10:06. Reason: osc

  24. #24
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,520


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    Thanks Richard!
    Didn't think about the lack of auto context save on the 16F parts, thanks for picking that up!

    Yes, the 12F1822 can run at up to 32MHz from its internal oscillator and it has the auto context save - it would be a good choice for this, as said before.

    CuriousOne,
    Please try Richards edited version on your 12F1822 and see if it works.

    /Henrik.

  25. #25
    Join Date
    May 2013
    Location
    australia
    Posts
    2,388


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    you might save a few cycles if you clear the tris bit for the outputs and


    replace the If Accumulator_x < old_x THEN Toggle Channel_x lines

    with If Accumulator_x < old_x THEN Channel_x=! Channel_x

  26. #26
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    I'm running it separately, without any interrupts or code involved.

  27. #27
    Join Date
    May 2013
    Location
    australia
    Posts
    2,388


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    the label problem is resolved with

    @Generate
    instead of
    @ Generate

  28. #28
    Join Date
    May 2013
    Location
    australia
    Posts
    2,388


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    wsave psave etc can't just go anywhere

    try this

    wsave VAR BYTE $70 SYSTEM ;wsave in access RAM
    ssave VAR BYTE BANK0 SYSTEM
    psave VAR BYTE BANK0 SYSTEM

    not sure when to use wsave VAR BYTE $20 SYSTEM
    Last edited by richard; - 15th January 2015 at 10:54. Reason: typo

  29. #29
    Join Date
    Feb 2013
    Posts
    1,078


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    OK, will try later, my programmer engulfed in smokes right now

  30. #30
    Join Date
    Feb 2012
    Location
    PERTH AUSTRALIA
    Posts
    838


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    here is somthing i was impressed with for sound from apic
    http://www.pic24.ru/doku.php/en/osa/.../pk2_osa_piano

  31. #31
    Join Date
    Feb 2012
    Location
    PERTH AUSTRALIA
    Posts
    838


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    also has interesting approch to matrix touch sensor array , and 8ch polymorphic generation using 1 pwm pin

  32. #32
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    3,803


    Did you find this post helpful? Yes | No

    Default Re: Darrels interrupts and multiple SOUND statements, will it work?

    I saw this before and was very impressed by the speed of touch sensors, sound quality and simplicity of the design. Great job.

    Ioannis

Similar Threads

  1. Multiple IF THEN Statements: PIC16F84A
    By bob425 in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 10th August 2012, 06:01
  2. Problem with multiple interrupts
    By aratti in forum General
    Replies: 7
    Last Post: - 2nd June 2009, 08:18
  3. Multiple IF-THEN statements
    By DavidK in forum mel PIC BASIC Pro
    Replies: 11
    Last Post: - 20th June 2007, 18:28
  4. Handeling multiple Interrupts
    By BobSpencerr in forum General
    Replies: 15
    Last Post: - 1st March 2007, 01:12
  5. Multiple HW Interrupts
    By Radiance in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 13th August 2003, 22:35

Members who have read this thread : 1

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