View Full Version : Im new to this, gotta simple problem:

04-24-2007, 11:36 AM
I am new to microcontrollers. I have a BS2p40. I can't seem to get any of the I/O pins to work properly. Here is a program stub:

' {$STAMP BS2p}
' {$PBASIC 2.5}
ex· VAR Bit

This piece of code loads fine, but comes back as a zero, and the pin reads low with my meter. In fact, none of the pins read high. Am i just making a simple error here?


Mike Green
04-24-2007, 11:50 AM
Make sure you've connected to the main set of I/O pins. You may be using the AUXIO pins.

INH (like all the input pins names) is functionally a read-only value and you really shouldn't
use it on the left hand side of an assignment.

The DIRS statement you've written sets pins 8-15 as inputs and pins 0-7 as outputs which
by default are low logic levels (near 0V). If you want to set the output pins as a group, use
"OUTL = 1" to set pin 0 to high and pins 1-7 to low.

What do you have connected to pin 15?

04-24-2007, 12:15 PM
Nothing, just can't get anything happening. I did write a piece of code to see if the stamp worked at all, just a loop printing numbers back to me, and it works

04-24-2007, 12:23 PM
Mike, I posted the wrong piece of code, its more like this:

ex· var· bit





debug bin ex

Mike Green
04-24-2007, 12:30 PM
Your directions register setting is opposite of what your pin usage would need.

You're setting the upper half of the output register to 7 zeros and a one (pins 15-8),
but you're setting the direction of those bits to input mode. You're trying to sample
I/O pin 1's state and display it, but you've set the direction of I/O pins 7-0 to output.

You can either change the value assigned to dirs to %1111111100000000 or you
can change the OUTH to OUTL and the IN1 to IN9 (or whatever) and leave the dirs
assignment the same.

04-24-2007, 12:42 PM
Thanks, Mike!

04-24-2007, 01:25 PM
perhaps a picture will make it clear

DIRS is 15 bits of memory space, same as 2 Bytes of memory same as one WORD of memory
DIRH AND DIRL are two more names that share the same memory address only one byte at a time
OUTS,OUTB,OUTC,OUTD are four more names that point to the same memory only 4 bits at a time
bit0 through bit15 are sixteen names that point to the same memory only one bit at a time

to set a pin HIGH you need to set the data direction bit in DIRS or DIRH or DIRL or any of the above names that point to the bit you want to set.

Setting a data direction register bit to 1 sets one of the pins to OUTPUT

There are two things the pin can be at this point, HIGH or LOW

There is a second register called the OUTS. You set the same bit position to a 1 in this register to make the pin HIGH or set it to 0 to make it low.

The default condition is LOW or 0

When setting bits it is easier to use the binary form of the number using the % sign. You used it for the DIRS register, use the same for the OUTS register and you will be able to read your code better.

To set pin 0 and 15 to output HIGH you could use

DIRS= %1000000000000001


DIR15= 1


DIRA= %0001
DIRD= %1000

DIRL= %00000001
DIRH= %10000000

remember in all of the cases above except for the DIR1,DIR15,OUT1,OUT15 statements will set the other bits to 0
That is why there are the different forms, or names to refer to a group of bits or just one bit.

You can also use the Binary operators OR "|" and AND "&" to set the bits or mask out (clear a bit) a single bit from a register.

for example. To set bit 15 but not change any of the other bits in DIRS you can use

DIRS = DIRS | %1000000000000000 only bit 15 is set.

to clear bit 15 to 0 you can mask the bit using the following binary operator AND

DIRS = DIRS AND %0111111111111111 this masks out bit 15 ad allows all other 1 bits to stay the same.

Now you can start twiddling bits.

Think Inside the box first and if that doesn't work..
Re-arrange what's inside the box then...
Think outside the BOX!

Post Edited (metron9) : 4/24/2007 6:40:15 AM GMT