Problem with 16F688 and Hserout


Closed Thread
Results 1 to 14 of 14

Hybrid View

  1. #1
    Join Date
    Feb 2005
    Location
    Revelstoke BC Canada
    Posts
    14


    Did you find this post helpful? Yes | No

    Default

    I caught that one to Darrel, I originally had it set that way, but it made no difference. When I power up the chip, it sends a portamento on command,(I don't know why, it should not) so it seems that the serial port is working, but nothing else is.

    here is the code with the typo's corrected.

    ' PicBasic file for midi footpedal interface using a Pic16F688
    ' foot pedals must have TRS plugs
    ' will work with 5-50k linier pots
    ' set osc to HS when programming

    DEFINE OSC 20 ' tell program we are using a 20mhz oscillator
    DEFINE HSER_RCSTA 90h ' enable hardware serial port
    DEFINE HSER_TXSTA 24h ' enable high speed transmit
    DEFINE HSER_BAUD 31250 ' set the baud rate
    DEFINE ADC_BITS 10 ' set the number of bits in the sample
    DEFINE ADC_SAMPLEUS 50 ' set the sample time

    TRISA = %00111111 ' Set PORTA to inputs
    TRISC = %00101111 ' set PORTC to inputs
    ANSEL = %11110000 ' enable analog 4,5,6,7 the rest as digital
    ADCON0 = %1000001 ' set VREF to VDD and right justify result
    ADCON1 = %00100000 ' set conversion clock FOSC/32
    CMCON0 = 7 ' turn off comparitors
    OPTION_REG.7 = 0 ' enable internal pull-ups on porta

    C0 Var word ' create C0 to store result from Volume pot
    C1 Var word ' create C1 to store result from Expression pot
    C2 Var word ' create C2 to store result from Foot Controller pot
    C3 Var word ' create C3 to store result from Portamanto Time pot
    vol Var byte ' create variable for volume
    exp Var byte ' create variable for expression
    foo Var byte ' create variable for foot controller
    por Var byte ' create variable for portamento time
    volout Var byte ' create variable for volume output
    expout Var byte ' create variable for expression output
    fooout Var byte ' create variable for foot controller output
    porout Var byte ' create variable for portamento time output
    sw1 Var byte ' create variable to hold switch1 value (sustain on/off)
    sw2 Var byte ' create variable to hold switch2 value (portamento on/off)

    loop:
    ADCIN 4,C0 ' read Volume pot and place value in C0
    vol = C0 / 8 ' convert reading to a midi value from 1-127
    If vol <> volout Then ' check to see if the value has changed
    volout = vol
    HSEROUT [176,7,volout] ' send Volume out serial port as midi information
    Endif

    ADCIN 5,C1 ' read expression pot and place value in C1
    exp = C1 / 8 ' convert reading to a midi value from 0-127
    If exp <> expout Then ' check to see if the value has changed
    exp = C1
    HSEROUT [176,11,expout] ' send exptession out serial port as midi information
    Endif

    ADCIN 6,C2 ' read foot controller pot and place value in C2
    foo = C2 / 8 ' convert reading to a midi value from 0-127
    If foo <> fooout Then ' check to see if the value has changed
    fooout = foo
    HSEROUT [176,4,fooout] ' send foot controller out serial port as midi information
    Endif

    ADCIN 7,C3 ' read portamento time pot and place value in C3
    por = C3 / 8 ' convert reading to a midi value from 0-127
    If por <> porout Then ' check to see if the value has changed
    porout = por
    HSEROUT [176,5,porout] ' send portamento time out serial port as midi information
    Endif

    If porta.0 = 0 Then sw1on ' check sustain pedal
    If porta.0 = 1 Then sw1off
    If porta.1 = 0 Then sw2on ' check portamento pedal
    If porta.1 = 1 Then sw2off

    If porta.2 = 0 Then
    Hserout [255] ' reset all controllers
    Endif

    Goto Loop ' go back to continuous monitoring

    sw1on:
    If sw1 = 0 Then ' check to see if sustain is off
    sw1 = 127
    Hserout [176,64,sw1] ' turn on sustain
    Endif

    sw1off:
    If sw1 = 127 Then ' check to see if sustain is on
    sw1 = 0
    Hserout [176,64,sw1] ' turn off sustain
    Endif

    sw2on:
    If sw2 = 0 Then ' check to see if portamento is off
    sw2 = 127
    Hserout [176,65,sw2] ' turn on portamento
    Endif

    sw2off:
    If sw2 = 127 Then ' check to see if portamento is on
    sw2 = 0
    Hserout [176,65,sw2] ' turn off portamento
    Endif

    Dave
    Last edited by DWV; - 22nd February 2005 at 04:51. Reason: would not accept my file attachment

  2. #2
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Dave,

    There's a bit of a problem with this section
    Code:
    If porta.0 = 0 Then sw1on ' check sustain pedal
    If porta.0 = 1 Then sw1off 
    If porta.1 = 0 Then sw2on ' check portamento pedal
    If porta.1 = 1 Then sw2off
    
    If porta.2 = 0 Then 
    Hserout [255] ' reset all controllers
    Endif
    
    Goto Loop ' go back to continuous monitoring
    
    sw1on:
    If sw1 = 0 Then ' check to see if sustain is off
    sw1 = 127
    Hserout [176,64,sw1] ' turn on sustain
    Endif
    
    sw1off:
    If sw1 = 127 Then ' check to see if sustain is on
    sw1 = 0
    Hserout [176,64,sw1] ' turn off sustain
    Endif
    
    sw2on:
    If sw2 = 0 Then ' check to see if portamento is off
    sw2 = 127
    Hserout [176,65,sw2] ' turn on portamento
    Endif
    
    sw2off:
    If sw2 = 127 Then ' check to see if portamento is on
    sw2 = 0
    Hserout [176,65,sw2] ' turn off portamento
    Endif
    If porta.0 = 1 the program will GOTO sw1off. It will then proceed to sw2on, sw2off and finally go off into LaLa land as there's no way to go back to the main Loop. The last thing you'll see before it dies is the portamento command (assuming conditions are right)

    You could changed each of the sw1on: sw1off: sw2on: sw2off: sections to a subroutine ending with RETURN. Then, for the tests...

    If porta.0 = 0 Then GOSUB sw1on ' check sustain pedal


    Best regards,
    &nbsp;&nbsp;&nbsp;Darrel

  3. #3
    Join Date
    Feb 2005
    Location
    Revelstoke BC Canada
    Posts
    14


    Did you find this post helpful? Yes | No

    Default

    I tried it that way originally, and it made no difference, I also tried it with GOTO Loop at the end of each subroutine, with the same result.
    I have been doing this on two computers, I checked the version on my laptop and it has a RETURN at the end of each subroutine, I just missed it when I typed it into this computer.

    Dave

  4. #4
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Well, so far, 3 problems found, and all 3 were not really there, they were just typo's.

    Perhaps we can take another look when you come up with the Actual code that is not working.

    Regards,
    &nbsp;&nbsp;&nbsp;Darrel

    P.S. When you post the code. Please enclose it with [&#67;ode] ... [/&#67;ode] tags, it makes it easier to read when it's not all scrunched to the left.

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


    Did you find this post helpful? Yes | No

    Default

    i'll second Darrel on that. AND i'll still stick to say

    DEFINE HSER_BAUD 31250

    NOT A VALID BAUDRATE IMHO.


    BUT

    DEFINE HSER_TXSTA 90h
    DEFINE HSER_RCSTA 24h
    DEFINE HSER_SPBRG 39 'set baudrate to 31250
    Steve

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

  6. #6
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    I checked the version on my laptop and it has a RETURN at the end of each subroutine


    If you use RETURN then you need to use GOSUB to get to these routines instead of GOTO.

    DEFINE HSER_BAUD 31250

    NOT A VALID BAUDRATE IMHO.

    31250 is a common "MIDI" data rate.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  7. #7
    Join Date
    Feb 2005
    Location
    Revelstoke BC Canada
    Posts
    14


    Did you find this post helpful? Yes | No

    Default

    Actually, they where not just typos, the first two where legitimate mistakes, but I caught them myself (that's what happens when you do this stuff at 1:00am) on the last one I was using a return at the end of each subroutine, but as Darrel and Bruce pointed out, I needed to use Gosub instead of a Goto, so I fixed all the mistakes, but it still does not work, so then I tried Steve's suggestion and changed the DEFINE HSER_BAUD to DEFINE HSER_SPBRG 39, but it still made no difference, incidentally, DEFINE HSER_BAUD 31250 works fine on the 16F628, so I would think it should work on the 16F688 also.
    Here is the revised code, any other suggestions would be appreciated.

    Code:
    ' PicBasic file for midi footpedal interface using a Pic16F688
    ' set osc to HS when programming
    
    DEFINE OSC 20                   ' tell program we are using a 20mhz oscillator
    DEFINE HSER_RCSTA 90h           ' enable hardware serial port
    DEFINE HSER_TXSTA 24h           ' enable high speed transmit
    DEFINE HSER_BAUD 31250          ' set the baud rate for MIDI communications
    DEFINE ADC_BITS 10              ' set the number of bits in the sample
    DEFINE ADC_SAMPLEUS 50          ' set the sample time
    
    TRISA = %00111111               ' Set PORTA to inputs
    TRISC = %00101111               ' set PORTC to inputs
    ANSEL = %11110000               ' enable analog 4,5,6,7 the rest as digital
    ADCON0 = %10000001              ' set VREF to VDD and right justify result
    ADCON1 = %00100000              ' set conversion clock FOSC/32
    CMCON0 = 7                      ' turn off comparitors
    OPTION_REG.7 = 0                ' enable internal pull-ups on porta
    WPUA = %00000111                ' enable individual pull-ups on porta 0,1,2            
    
    C0 Var word	     	        ' create C0 to store result from Volume pot  
    C1 Var word                     ' create C1 to store result from Expression pot
    C2 Var word                     ' create C2 to store result from Foot Controller pot
    C3 Var word                     ' create C3 to store result from Portamanto Time pot
    vol Var byte                    ' create variable for volume 
    exp Var byte                    ' create variable for expression 
    foo Var byte                    ' create variable for foot controller 
    por Var byte                    ' create variable for portamento time 
    volout Var byte                 ' create variable for volume output
    expout Var byte                 ' create variable for expression output
    fooout Var byte                 ' create variable for foot controller output
    porout Var byte                 ' create variable for portamento time output
    sw1 Var byte                    ' create variable to hold switch1 value (sustain on/off)
    sw2 Var byte                    ' create variable to hold switch2 value (portamento on/off)
        
    loop:
    ADCIN 4,C0                      ' read Volume pot and place value in C0
    vol = C0 / 8                    ' convert reading to a midi value from 1-127
    If vol <> volout Then           ' check to see if the value has changed
       volout = vol
       HSEROUT [176,7,volout]       ' send Volume out serial port as midi information
    Endif
    
    ADCIN 5,C1                      ' read expression pot and place value in C1
    exp = C1 / 8                    ' convert reading to a midi value from 0-127
    If exp <> expout Then           ' check to see if the value has changed
       exp = C1
       HSEROUT [176,11,expout]      ' send exptession out serial port as midi information
    Endif
    
    ADCIN 6,C2                      ' read foot controller pot and place value in C2
    foo = C2 / 8                    ' convert reading to a midi value from 0-127
    If foo <> fooout Then           ' check to see if the value has changed
       fooout = foo
       HSEROUT [176,4,fooout]       ' send foot controller out serial port as midi information
    Endif
    
    ADCIN 7,C3                      ' read portamento time pot and place value in C3
    por = C3 / 8                    ' convert reading to a midi value from 0-127
    If por <> porout Then           ' check to see if the value has changed
       porout = por
       HSEROUT [176,5,porout]       ' send portamento time out serial port as midi information
    Endif
    
    If porta.0 = 0 Then gosub sw1on       ' check sustain pedal
    If porta.0 = 1 Then gosub sw1off       
    If porta.1 = 0 Then gosub sw2on       ' check portamento pedal
    If porta.1 = 1 Then gosub sw2off
    
    If porta.2 = 0 Then                
       Hserout [255]                ' reset all controllers
       Endif
    
    Goto Loop	                ' go back to continuous monitoring
    
    sw1on:
    If sw1 = 0 Then                 ' check to see if sustain is off
       sw1 = 127
       Hserout [176,64,sw1]         ' turn on sustain
    Endif
    return
    
    sw1off:
    If sw1 = 127 Then               ' check to see if sustain is on
       sw1 = 0
       Hserout [176,64,sw1]         ' turn off sustain
    Endif
    return
    
    sw2on:
    If sw2 = 0 Then                 ' check to see if portamento is off
       sw2 = 127
       Hserout [176,65,sw2]         ' turn on portamento
    Endif
    return
    
    sw2off:
    If sw2 = 127 Then               ' check to see if portamento is on
       sw2 = 0
       Hserout [176,65,sw2]         ' turn off portamento
    Endif
    return

Similar Threads

  1. Math problem on 16F688
    By PlantBob in forum mel PIC BASIC
    Replies: 4
    Last Post: - 14th June 2008, 22:51
  2. TX problem
    By Christopher4187 in forum General
    Replies: 5
    Last Post: - 19th October 2005, 00:48

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