Shop OBEX P1 Docs P2 Docs Learn Events
Need help on my project, repeat & If/Else statement not working correctly — Parallax Forums

Need help on my project, repeat & If/Else statement not working correctly

jknightandkarrjknightandkarr Posts: 234
edited 2010-02-17 04:10 in Propeller 1
I need help with my project. Under the "PUB Speed(dLow, digits, s0, enabled)" area is where my problem is. Not sure why.

First problem:
If ina[noparse][[/noparse]13]==0                                       'Look for Pin23 for 1 or 0
       Mph:=vss*9                                       'Calibrate for 4000ppm sender if pin 13=Low
    else
       Mph:=vss*9/2                                     'Calibrate for 8000ppm Sensor if pin 13=High



When I put pin 13 high & hit reset, the display doesn't change, should go from 0603 to 0301, but doesn't. I tried ina[noparse][[/noparse]13]:=0 & the display stays 0301 wether pin 13 is high or grounded. So why isn't my code working as it's suppose to?

Second Problem:
PUB Speed(dLow, digits, s0, enabled)
'' Start the display
'' Parameters:
''   dLow - the pin number of the least significant digit
''   digits - the number of digits to display  (up to 8)
''   s0 - the pin number of segment 0
''   enabled - the initial enabled state
  dira[noparse][[/noparse]13]:=0                                           'Set pin 23 as input
  repeat
    vss:=67
    If ina[noparse][[/noparse]13]==0                                       'Look for Pin23 for 1 or 0
       Mph:=vss*9                                       'Calibrate for 4000ppm sender if pin 13=Low
    else
       Mph:=vss*9/2                                     'Calibrate for 8000ppm Sensor if pin 13=High
    myValue := Mph                                      'Copy Mph to myValue
    LowDigitPin := 8
    HighDigitPin := 8 + ((4 - 1) <# 7)                  'Limit to eight digits
    Seg0Pin := 0
    Seg8Pin := 0 + 7
    dira[noparse][[/noparse]Seg0Pin..Seg8Pin]~~                            'Set segment pins to outputs
    dira[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                   'Set digit pins to outputs
    outa[noparse][[/noparse]Seg0Pin..Seg8Pin]~                             'Turn off all segments
    dira[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                   'Turn off all digits
  '  if enabled                                         'Set initial enabled state
    flags |= isEnabled
    'else
    'flags~
    stop
    runningCogID := cognew(ShowValue, @myStack) + 1


When I remove the ' from 'repeat, the display fails to function entirely? I need the section too loop so I can have a constantly updated speed reading as well as adding
Pub Start
  cognew (Signal, @stack0)          'Vehical Speed Sensor Input/disable till display is working & calibrated
  cognew (Speed, @stack1)          'Speedometer display
  cognew (Odometer, @stack2)     'Odometer display/program not written yet.

Pri Signal
  'Calibrate for 4000 & 8000 pulses per mile 
  'Use switch to switch between 4K & 8K inputs
  Repeat
    Dira[noparse][[/noparse]12]~
    ctra:=0
    ctra:=(%01010<<26)|(%001<<23)|(0<<9)|(12)
    frqa:=1
    phsa:=0
    waitcnt(80_000_000+cnt)
    vss:=phsa
    ctra:=0


when the first part of the code is funtioning

What is wrong with these code lines? Thanks.

Here's my whole project code thus far....
{{General purpose Seven-segment display object. Can control from one to eight digits.

   Author: Steve Nicholson
   Version: 1.0 (4 Jan 2007)
   Email: ssteve@mac.com
   Copyright: none
   Modified:Joe R.

}}

CON
  _clkmode =xtal1+pll16x                                'system clock
  _xinfreq=5_000_000                                    'set 80 Mhz
  isEnabled = %0001  
  
VAR
  long LowDigitPin, HighDigitPin                        'The pins for specifying digits.
                                                        'Must be contiguous
                                                        'HighDigitPin can be from 0 to 7 more than LowDigitPin
  long Seg0Pin, Seg8Pin                                 'The pins for the segments.
                                                        'Must be contiguous
                                                        'Segment 8 is the decimal point
  long flags
  long myStack[noparse][[/noparse]10]
  long runningCogID
  long myValue                                          'Value to be displayed
  long vss                                              'Vehical Speed Sensor Input
  long Mph                                              'Display In Miles Per Hour

PUB Speed(dLow, digits, s0, enabled)
'' Start the display
'' Parameters:
''   dLow - the pin number of the least significant digit
''   digits - the number of digits to display  (up to 8)
''   s0 - the pin number of segment 0
''   enabled - the initial enabled state
  dira[noparse][[/noparse]13]:=0                                           'Set pin 23 as input
  'repeat
    vss:=67
    If ina[noparse][[/noparse]13]==0                                       'Look for Pin23 for 1 or 0
       Mph:=vss*9                                       'Calibrate for 4000ppm sender if pin 13=Low
    else
       Mph:=vss*9/2                                     'Calibrate for 8000ppm Sensor if pin 13=High
    myValue := Mph                                      'Copy Mph to myValue
    LowDigitPin := 8
    HighDigitPin := 8 + ((4 - 1) <# 7)                  'Limit to eight digits
    Seg0Pin := 0
    Seg8Pin := 0 + 7
    dira[noparse][[/noparse]Seg0Pin..Seg8Pin]~~                            'Set segment pins to outputs
    dira[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                   'Set digit pins to outputs
    outa[noparse][[/noparse]Seg0Pin..Seg8Pin]~                             'Turn off all segments
    dira[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                   'Turn off all digits
  '  if enabled                                         'Set initial enabled state
    flags |= isEnabled
    'else
    'flags~
    stop
    runningCogID := cognew(ShowValue, @myStack) + 1

PUB Stop
'' Stop the display
  if runningCogID
    cogstop(runningCogID~ - 1)

PUB Enable
'' Enable the display
  flags |= isEnabled

PUB Disable
'' Disable the display
  flags &= !isEnabled
  
PUB SetValue(theValue)
'' Set the value to display
  myValue := theValue

PRI ShowValue | digPos, divisor, displayValue
' ShowValue runs in its own cog and continually updates the display
  dira[noparse][[/noparse]Seg0Pin..Seg8Pin]~~                              'Set segment pins to outputs
  dira[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                     'Set digit pins to outputs
  repeat
    if flags & isEnabled
      displayValue := myValue                           'take snapshot of myValue so it can't be changed
                                                        ' while it is being displayed
      divisor := 1                                      'divisor is used to isolate a digit to display
      repeat digPos from 0 to HighDigitPin - LowDigitPin 'only display as many digits as there are pins
        outa[noparse][[/noparse]Seg0Pin..Seg8Pin]~                         'clear the segments to avoid flicker
        outa[noparse][[/noparse]LowDigitPin..HighDigitPin] := byte[noparse][[/noparse]@DigSel + digPos] 'enable the next digit
        outa[noparse][[/noparse]Seg0Pin..Seg8Pin] := byte[noparse][[/noparse]@Digit0 + displayValue / divisor // 10] 'display the digit
        waitcnt (clkfreq / 10_000 + cnt)                'the delay value can be tweaked to adjust
                                                        ' display brightness
        divisor *= 10
    else
      outa[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                 'disable all digits
      waitcnt (clkfreq / 10 + cnt)                      'wait 1/10 second before checking again
     
DAT
        'Common cathode 7-segment displays are activated by bringing the cathode to ground
        DigSel          byte    %11111110
                        byte    %11111101
                        byte    %11111011
                        byte    %11110111
                        byte    %11101111
                        byte    %11011111
                        byte    %10111111
                        byte    %01111111
        
        Digit0          byte    %00111111
        Digit1          byte    %00000110
        Digit2          byte    %01011011
        Digit3          byte    %01001111
        Digit4          byte    %01100110
        Digit5          byte    %01101101
        Digit6          byte    %01111101
        Digit7          byte    %00000111
        Digit8          byte    %01111111
        Digit9          byte    %01100111



Joe

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
I'm going insaine. It's SOOOOOO much fun. lol

Comments

  • BeanBean Posts: 8,129
    edited 2010-02-16 18:37
    Your code says pin 13, but your comment say pin 23 ???
    Is it just a typo ?

    Bean

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Use BASIC on the Propeller with the speed of assembly language.

    PropBASIC thread http://forums.parallax.com/showthread.php?p=867134

    March 2010 Nuts and Volts article·http://www.parallax.com/Portals/0/Downloads/docs/cols/nv/prop/col/nvp5.pdf
    ·
  • Graham StablerGraham Stabler Posts: 2,510
    edited 2010-02-16 18:40
    It's good if you can attach the code with the stuff calling the functions if possible, I spotted this possible error:

        dira[noparse][[/noparse]Seg0Pin..Seg8Pin]~~                            'Set segment pins to outputs
        dira[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                   'Set digit pins to outputs
        outa[noparse][[/noparse]Seg0Pin..Seg8Pin]~                             'Turn off all segments
        dira[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                   'Turn off all digits
    
    



    should the last dira be an outa.

    Graham
  • jknightandkarrjknightandkarr Posts: 234
    edited 2010-02-16 18:57
    Bean said...
    Your code says pin 13, but your comment say pin 23 ???
    Is it just a typo ?

    Bean

    Yeah, it's just a typo, it was 23, but I changed it due to the design of the PropRPM, figured the Pin23 having 3.3V+ all the time I thought that might have been my problem.
    Graham Stabler said...
    It's good if you can attach the code with the stuff calling the functions if possible, I spotted this possible error:

        dira[noparse][[/noparse]Seg0Pin..Seg8Pin]~~                            'Set segment pins to outputs
        dira[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                   'Set digit pins to outputs
        outa[noparse][[/noparse]Seg0Pin..Seg8Pin]~                             'Turn off all segments
        dira[noparse][[/noparse]LowDigitPin..HighDigitPin]~~                   'Turn off all digits
    
    



    should the last dira be an outa.

    Graham

    I'll see if that makes any difference. Thanks.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    I'm going insaine. It's SOOOOOO much fun. lol
  • jknightandkarrjknightandkarr Posts: 234
    edited 2010-02-16 19:03
    Grahm,
    Just changed that dira to outa, made no difference.

    Joe

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    I'm going insaine. It's SOOOOOO much fun. lol
  • lonesocklonesock Posts: 917
    edited 2010-02-16 19:21
    Inside the propeller tool Edit->Properties->[noparse][[/noparse]Appearance], do you have "Show Block Group Indicators" checked? Sometimes the visual indicator of how the indentation is parsed helps me catch some formatting errors.

    Jonathan

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    lonesock
    Piranha are people too.
  • jknightandkarrjknightandkarr Posts: 234
    edited 2010-02-16 19:58
    lonesock said...
    Inside the propeller tool Edit->Properties->[noparse][[/noparse]Appearance], do you have "Show Block Group Indicators" checked? Sometimes the visual indicator of how the indentation is parsed helps me catch some formatting errors.

    Jonathan

    All ready is enabled.

    I disabled the stop with 'stop & got my 3 back, but 060 still to go. with repeat the display program is apperently freezing. Maybe I"ll hook ny bs2 up & use it to generate a signal & see if I even need the repeat loop.

    Joe

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    I'm going insaine. It's SOOOOOO much fun. lol
  • Graham StablerGraham Stabler Posts: 2,510
    edited 2010-02-16 20:08
    Please attach the code you are now using as a zip.

    Graham
  • jknightandkarrjknightandkarr Posts: 234
    edited 2010-02-16 20:42
    Here is my file. I got the program somewhat working, so I added my counting program.

    I used my basic stamp 2 to generate a frequency, that should have displayed 0603 on the propeller, but now displays random numbers when they are connected togeather instead of my desired speed reading. When I have the Basic Stamp 2's signal disconnected, the propeller gives me 0000 as it should, but why am I getting random numbers?.
    ' {$STAMP BS2}
    ' {$PBASIC 2.5}
    
    DO
    FREQOUT 15, 1000, 67
    LOOP
    



    www.newarkknights.net/mycode.zip

    Joe

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    I'm going insaine. It's SOOOOOO much fun. lol
  • Phil Pilgrim (PhiPi)Phil Pilgrim (PhiPi) Posts: 23,514
    edited 2010-02-16 20:58
    You're getting the numbers you do, because the BASIC Stamp doesn't put out a square wave of the chosen frequency but, rather, a duty-modulated sine wave. The transistions are at a much higher rate than the chosen frequency but, when low-pass filtered, produce the programmed sine wave.

    -Phil
  • jknightandkarrjknightandkarr Posts: 234
    edited 2010-02-16 21:03
    ok, how can I fix that? Speaking of which, will Gm compatable speed sensors have the same effect?

    Joe

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    I'm going insaine. It's SOOOOOO much fun. lol

    Post Edited (jknightandkarr) : 2/16/2010 10:22:01 PM GMT
  • Phil Pilgrim (PhiPi)Phil Pilgrim (PhiPi) Posts: 23,514
    edited 2010-02-16 22:37
    To "fix" it you can low-pass filter the Stamp's duty-mode output and run it through a comparator with a little hysteresis. But why go through all that? For testing, you can either spawn a new Prop cog to output the square wave on an unused pin (or even the input pin, for that matter), or just program a counter to do it.

    The speed sensors should have a square-wave output; but I've never used one, so that's just a reaonable guess.

    -Phil
  • jknightandkarrjknightandkarr Posts: 234
    edited 2010-02-17 04:10
    Phil Pilgrim (PhiPi) said...
    To "fix" it you can low-pass filter the Stamp's duty-mode output and run it through a comparator with a little hysteresis. But why go through all that? For testing, you can either spawn a new Prop cog to output the square wave on an unused pin (or even the input pin, for that matter), or just program a counter to do it.

    The speed sensors should have a square-wave output; but I've never used one, so that's just a reaonable guess.

    -Phil

    I was using the basic stamp 2, so I could see the change on the propeller, just like if I was using a vehical speed sensor

    Joe

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    I'm going insaine. It's SOOOOOO much fun. lol
Sign In or Register to comment.