PDA

View Full Version : Overthinking what must be simple



ChrisHelvey
- 8th July 2008, 01:06
Hi experts,
I would like to create a physically changable but otherwise static byte variable by using an 8 pin DIP switch for a 16f877a to "read." (Apply 5V from a common rail to the pins for "ON")

So, I'd like to set the DIP before power-on to, say, 01111111 to represent the number 127, which will be a critical element but not change for the remainder of the program unless I reset or do some other interrupt. (A hidden away "field changeable" property without the need for displays, etc.)

Such that the pins on/off will create a variable in the range from 0-255.

Assuming I have all the pins set to digital, et al, I can't think of how to place the bits from the pins into place.

This has to be so simple I'll be embarrased, but can anyone clue me in?

Thanks

Chris

Archangel
- 8th July 2008, 02:45
Hi experts,
I would like to create a physically changable but otherwise static byte variable by using an 8 pin DIP switch for a 16f877a to "read." (Apply 5V from a common rail to the pins for "ON")

So, I'd like to set the DIP before power-on to, say, 01111111 to represent the number 127, which will be a critical element but not change for the remainder of the program unless I reset or do some other interrupt. (A hidden away "field changeable" property without the need for displays, etc.)

Such that the pins on/off will create a variable in the range from 0-255.

Assuming I have all the pins set to digital, et al, I can't think of how to place the bits from the pins into place.

This has to be so simple I'll be embarrased, but can anyone clue me in?

Thanks

Chris
Hi Chris,
This is a fairly well traveled rod from noobieville :) , what you are diong is BCD and you are correct re: 127. http://melabs.com/resources/articles/bcdnumbers.htm
http://www.picbasic.co.uk/forum/archive/index.php/t-66.html
Here is a program that varies an output time according to BCD input.


ASM
ifndef __12F675
error "12F675 not selected"
endif
ENDASM
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF

PCON = %00000011 ' BOD off, No POR flag set
DEFINE NO_CLRWDT 1
DEFINE OSC 4

OSCCAL = %1111100 ' SET OSC TO MAXIMUM SET OSC TO 4 MHZ INTERNAL
CMCON = 7 ' Disable Analog Comparators
ANSEL = 0 ' Disable A/D module, all digital
WPU.4 = 0 ' Disable weak pull up on GPIO.4

B0 VAR word ' Byte holds 0 - 255 Word 0 - 65535
X VAR WORD

Index VAR BYTE ' Byte variable only has to hold 0 - 15

LED VAR GPIO.5 ' Alias GPIO.5 as LED will wire to
' transister base to control device

TRISIO = %00011111 ' RA0 to RA3 inputs for DIP switch

OPTION_REG = %11111111 ' Dis/Enable internal pull-ups Bit 7
' Bits 0-2 prescaler
' Bit 3 prescaler assignment 1 = WDT 0 = TMR0
' Bit 4 TMR0 source edge select bit
' 1 trigger on High to Low
' 0 trigger on Low to High
' Bit 5 TOCS TMR0 clock source select
' 1 = transition on GP2
' 0 = internal clock (CLKOUT)
' Bit 6 INTEDG Interrupt Edge Select
' 1 = Interrupt on rising edge GP2
' 0 = Interrupt on falling edge GP2
' Bit 7 Pullup resistor enable bit
' 1 = disabled 0 = enabled by individual port
' latch values.





Main:
IF (GPIO.4 = 1) THEN
B0 = 2500 ' Must be a word variable to hold this value
else ' HE HE else it,"ain't gonna work!"
B0 = 250 ' and it will always default to this value!
endif

Index = GPIO & $0F ' Read DIP switch AND mask result
LOOKUP2 Index,[200,300,400,500,600,700,800,900,1000,2000,_
3000,4000,5000,6000,7000,8000],X ' notice the X variable


HIGH LED
PAUSE b0
LOW LED
PAUSE X ' X is a WORD variable so it can store 300 to 8000

GOTO Main

END
POKECODE @$3FF, $50 ' reintroduces osscal correction data
' $3FF tells it where to code, $50 is the
' Cal value unique to each individual chip.


JS

BobK
- 8th July 2008, 03:10
Hi Chris,

So you have 8 dip switches with one switch on each pin of a port. You want the switch being set to ON to be a high or 5vdc. You would have 8- 4.7K or 10K resistors, again one resistor on each pin with the other side of each resistor going to Gnd. These are called "pull down" resistors.

Now to read the value set by the switches simply read the "PortValue".
An example would be:
PortValue VAR BYTE
PortC = PortValue
If PortValue = 127 Then

You can also use "Select Case" instead of the multiple IF .. Then 's
You control when the switches get read with your program. I used this setup once a couple of years ago reading the value of a PC card in a card cage from a dip switch setting.

HTH,

BobK

ChrisHelvey
- 8th July 2008, 03:48
Ah yes, I have my residence in NoobieVille and am traversing the road to dangerous and wild lands more frequently than I am comfortable with. He He..

I knew it had to be simple. So, basically, the whole port is just assigned to a variable.

....of course....

Overthinking the obvious I was!

If I wanted 16 bits, and thus a word variable, would I simply add them together?
PortValue VAR WORD
PortValue = PortB + PortC ???

Thank you for your reply. Now I can try things I REALLY don't understand. "Heading deep into the mountain canyon."

Chris

ChrisHelvey
- 8th July 2008, 03:50
No, wait a minute. Adding won't do it, will it? 01111111 + 01111111 = 11111110

Hmm....

Archangel
- 8th July 2008, 03:53
Check out the lookup table in the program I listed, maybe you dont need so many settings . . .

Archangel
- 8th July 2008, 03:58
No, wait a minute. Adding won't do it, will it? 01111111 + 01111111 = 11111110

Hmm....

Not sure how you would do it but 2 ports probably make a word something like
MyVar VAR WORD
PortB myvar.lowbyte:
PortC myvar.HiByte . . .

ChrisHelvey
- 8th July 2008, 04:01
Yeah, that makes sense. I forgot about the lowbyte, HiByte reference.
No, I don't need that many settings. I was just curious.

Thanks a lot. I think I can get it done now.


Chris

mackrackit
- 8th July 2008, 04:42
No, wait a minute. Adding won't do it, will it? 01111111 + 01111111 = 11111110

Hmm....
Yep,
127 + 127 = 254
As long as you only use seven bits on each port and add those you will stay below the 255 limit.

How many combos can you come up with using two 7 bit numbers like that. One heck of a comination lock.

rwskinner
- 8th July 2008, 14:55
And, if you wanted to do this with 3 pins instead of 8 add a 165 PISO shift register.