PLP_C
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
Can you post your program ? That would help us help you.
Bean.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Uhhhm, that was on fire when I got here...
www.iElectronicDesigns.com
·
'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.
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
·