Shop OBEX P1 Docs P2 Docs Learn Events
PLP_C — Parallax Forums

PLP_C

ERIC THE GREATERIC THE GREAT Posts: 19
edited 2008-06-24 18:50 in General Discussion
I have made a DC voltmeter using an sx 28 and an ADC654. I use a ground connected rotary switch to distribute a ground signal to RC 3,2 and 1 for changing scale for the meter to 3 different scales. I have used the command PLP_C = %11110001 to activate pullups on RC3,2, and 1. The program seems to be ignoring this command as I am having to physically externally pull up these registers using resistors·for the scale changing to work properly. The PLP_C command is directly after program start. What am I doing wrong? Eric feeling "not so great"

Comments

  • BeanBean Posts: 8,129
    edited 2008-06-24 01:26
    Eric,
    Can you post your program ? That would help us help you.

    Bean.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Uhhhm, that was on fire when I got here...

    www.iElectronicDesigns.com

    ·
  • JonnyMacJonnyMac Posts: 9,216
    edited 2008-06-24 01:37
    How do you know that's being ignored? Have you put the program into a simple loop that just monitors and displays those bits? Chances are that it's something else in your program that's the issue; I use the PLP_x instructions all the time without problems.
  • ERIC THE GREATERIC THE GREAT Posts: 19
    edited 2008-06-24 10:41
    ' DC VOLTMETER

    'USES AD654 TO CONVERT VOLTAGE INTO FREQUENCY. AD654 IS CONFIGURED FOR 1 VOLT FULL SCALE = 10KHZ SIGNAL.
    'SX COUNTS PULSES FOR TIME PERIOD "DURATION". USING A SCALE FACTOR, A POWER OF 10, TENTH VOLTS ARE
    'CALCULATED AND DISPLAYED ON A 3 DIGIT MULTIPLEXED LED DISPLAY. AUTOMATION MODE IS FOR THE CONTROL OF PERIPHERALS BY
    'THE SX BASED ON VOLTAGE READINGS. IN AUTOMATION MODE, THE LED DISPLAYIS OPTIONAL, AND IS MOST ACCURATE WITH
    'DURATION OF 100MS, AND ADJ = PULSES * 1. IN AUTOMATION MODE, THE COUNT COMMAND WILL INTERFERE WITH SMOOTH LED
    'DISPLAY OPERATION. THE LED DISPLAY MAY BE MORE LEGIBLE WITH LEDNUM = %00000000 REMARKED.

    DEVICE SX28, OSCHS2, TURBO, STACKX, OPTIONX
    FREQ 50_000_000

    LEDNUM PIN RA OUTPUT 'CONNECTION POINT FOR LED CONTROLLER BUS.
    SEGMENTS PIN RB OUTPUT 'CONNECTION POINT FOR LED SEGMENT BUS.
    SIGIN PIN RC.0 INPUT 'CONNECTION POINT FOR AD654 CIRCUIT.
    PIN_SC1 PIN RC.1 INPUT 'CONNECTION POINT FOR 1 VOLT SCALE SWITCH INPUT, GROUND ACTIVATED.
    PIN_SC10 PIN RC.2 INPUT 'CONNECTION POINT FOR 10 VOLT SCALE SWITCH INPUT, GROUND ACTIVATED.
    PIN_SC100 PIN RC.3 INPUT 'CONNECTION POINT FOR 100 VOLT SCALE INPUT SWITCH, GROUND ACTIVATED.



    PULSES VAR WORD 'VARIABLE HOLDING PERCEIVED AD654 PULSES.
    TV VAR WORD 'VARIABLE HOLDING TENTH VOLTS.
    SCALE VAR BYTE 'VARIABLE HOLDING SCALE FORMULA RESULT.
    DIGIT VAR WORD 'VARIABLE HOLDING CALCULATED LED DIGIT.
    REMAINDER VAR WORD 'VARIABLE HOLDING REMAINDER OF DIGIT CALCULATIONS.
    NUM VAR WORD 'VARIABLE HOLDING DIGIT VALUE IN 100s, 10s, OR 1s.
    ADJ VAR WORD 'VARIABLE HOLDING PULSE COUNT ADJUSTMENT FOR CONVERSION FROM
    '.001 MFD CAPACITOR TO .01 MFD CAPACITOR IN AD654 CIRCUIT.
    SFACTOR VAR BYTE 'VARIABLE HOLDING VOLTAGE SCALE FACTOR 1, 10, OR 100.
    NUM1 VAR BYTE 'VARIABLE HOLDING LOGIC VALUE OF RC.3, RC.2 AND RC.1.
    OVER_SCALE VAR WORD 'VARIABLE HOLDING MAXIMUM TENTH VOLTS PER SCALE.

    _LOW CON 0
    DURATION CON 10 'COUNT COMMAND DURATION CONSTANT, NUMBER IN MS. A 10 MS. DURATION MAKES
    '100 SAMPLES PER SECOND.




    PROGRAM START

    PLP_C = %11110001 'ACTIVATE PULLUP RESISTORS ON INPUTS RC.3, RC.2, AND RC.1.

    START:
    IF PIN_SC1 = _LOW THEN 'ROUTINE FOR CONTROLLING SCALE FACTOR BASED ON CONTROL SWITCH POSITION.
    SFACTOR = 1
    ENDIF
    IF PIN_SC10 = _LOW THEN
    SFACTOR = 10
    ENDIF
    IF PIN_SC100 = _LOW THEN
    SFACTOR = 100
    ENDIF
    NUM1 = RC AND %00001110
    IF NUM1 = %00001110 THEN
    SFACTOR = 100
    ENDIF


    COUNT SIGIN, DURATION, PULSES 'COUNT PULSES.
    ADJ = PULSES * 1 'CALCULATE TV = 10 * PULSES / SCALE.

    CALCULATE:
    SCALE = 100 / SFACTOR
    TV = ADJ / SCALE
    OVER_SCALE = SFACTOR * 10
    IF TV > OVER_SCALE THEN 'CHECK TO SEE IF TENTH VOLTS ARE OVER SCALE.
    GOTO OVERFLOW
    ENDIF

    DISPALY_100s: 'DISPLAY_100s AND READY_100 ARE ROUTINES TO DISPLAY THE HUNDREDS DIGIT.

    IF TV < 100 THEN
    GOTO READY_100
    ENDIF
    DIGIT = TV / 100
    READ SEG_MAP + DIGIT, SEGMENTS
    LEDNUM = %00000100
    PAUSE 10
    LEDNUM = %00000000
    NUM = 100 * DIGIT
    REMAINDER = TV - NUM
    GOTO DISPLAY_10s

    READY_100:

    READ SEG_MAP + 0, SEGMENTS
    LEDNUM = %00000100
    PAUSE 10
    LEDNUM = %00000000
    REMAINDER = TV

    DISPLAY_10s: 'DISPLAY_10s AND READY_10 ARE ROUTINES TO DISPLAY THE TENS DIGIT.

    IF REMAINDER < 10 THEN
    GOTO READY_10
    ENDIF
    DIGIT = REMAINDER / 10
    READ SEG_MAP + DIGIT, SEGMENTS
    LEDNUM = %00000010
    PAUSE 10
    LEDNUM = %00000000
    NUM = 10 * DIGIT
    REMAINDER = REMAINDER - NUM
    GOTO DISPLAY_1s

    READY_10:

    READ SEG_MAP + 0, SEGMENTS
    LEDNUM = %00000010
    PAUSE 10
    LEDNUM = %00000000

    DISPLAY_1s: 'DISPLAY_1s IS A ROUTINE TO DISPLAY THE ONES DIGIT.

    DIGIT = REMAINDER
    READ SEG_MAP + DIGIT, SEGMENTS
    LEDNUM = %00000001
    PAUSE 10
    LEDNUM = %00000000
    GOTO START 'GO TO BEGINNING AND COUNT MORE PULSES.

    OVERFLOW: 'IF TENTH VOLTS OVERSCALE THEN OUTPUT "A S C" ON LED PANEL.

    READ SEG_MAP + 10, SEGMENTS
    LEDNUM = %00000100
    PAUSE 10
    LEDNUM = %00000000

    READ SEG_MAP + 5, SEGMENTS
    LEDNUM = %00000010
    PAUSE 10
    LEDNUM = %00000000

    READ SEG_MAP + 11, SEGMENTS
    LEDNUM = %00000001
    PAUSE 10
    LEDNUM = %00000000
    GOTO START




    SEG_MAP:
    ' abcdefg. DIGIT 'DATA TO MAKE NUMERALS ON A 7 SEGMENT LED.
    DATA %00000011 '0
    DATA %10011111 '1
    DATA %00100101 '2
    DATA %00001101 '3
    DATA %10011001 '4
    DATA %01001001 '5
    DATA %01000001 '6
    DATA %00011111 '7
    DATA %00000001 '8
    DATA %00001001 '9
    DATA %00010001 'A
    DATA %01100011 'C




    Keep in mind while reading this is one of my first SXB programs. When I wrote this I did not understand __REMAINDER, and figured out another way to do the same. Some of the remarks no longer apply as this design is going through many changes. I am also aware that I would have a lot to gain by using an interrupt routine to operate the led display.
  • BeanBean Posts: 8,129
    edited 2008-06-24 11:43
    Eric,
    I don't see anything wrong with the code (at least for reading the pins).
    I suspect (with Jon) that it is some kind of hardware problem. The pullups are pretty weak (about 20K @ 5V).

    Just a couple comments on your code:
    1) You can enable the pullups by just adding PULLUP to the pin definition "PIN_SC1 PIN RC.1 INPUT PULLUP"
    2) When you want to a an "IF" with a "GOTO" just use "IF IF TV > OVER_SCALE GOTO OVERFLOW"

    Other than those things it looks pretty good to me...

    Bean.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Uhhhm, that was on fire when I got here...

    www.iElectronicDesigns.com

    ·
  • JonnyMacJonnyMac Posts: 9,216
    edited 2008-06-24 18:50
    As you're building projects it's a good idea to test section by section, hardware first, then software. This very simple test code will check your pullups -- I just ran it and got the expected results. Note that you need an SX-Key (Blitz won't do debugging). Use Debug --> Poll.

    Start:
      PLP_C = %1111_0001
    
    Main:
      \ WATCH RC, 8, UBIN
      \ BREAK
      PAUSE 50
      GOTO Main
    
Sign In or Register to comment.