BasicStamp II Language(Quick) Tutorial
Lexical Aspects
• Line oriented language (one stmt per line)– Multiple statements separated by “:”– Lines limited to 256 chars, extended with trailing “_”– Each line may have a label at start (“label:”)
• Comments start with single quote “'” (to EOL)• Identifiers like other languages
– Including underscore– Not case sensitive
Lexical Aspects
• Literals– Decimal 123– Hex $FF– Binary %10101110– Chars “A”– Strings “string”
• Only useful in parameters to certain built in statements
• Means: “s”, “t”, “r”, “i”, “n”, “g”
Variables
• Flat global name space
• Variable declaration:<name> var <type>
<type>: bit nib byte word (nib=nibble=4 bits)• 1, 4, 8, 16 bits values• E.g., counter var byte
• Arrays<name> var <type>(<size>)
e.g., table var byte(5)
Variables (cont.)
• Aliases (two names for the same variable)<name1> var <name2><name1> var <name2>.<part><part>: bit0 bit1 bit2 … bit15
highbit lowbitnib0 … nib3 highnib lownibbyte0 byte1 highbyte lowbyte
– Example: LED_pin var outs.bit5
Constants
• Declaration
<name> con <constant expr>– Limits on <constant expr>– Evaluated left to right, no parens
Example: sw_time con 41 + 1
Expressions
• 8 and 16 bit unsigned integers
• Operators: +-*/ << >> &|^~ (all as in C or Java)
** top 16 bits of multiplication
*/ mult top 8 as in, low 8 as fraction
// remainder (mod)
• Evaluated left-to-right (wrong precedence!)
• Parens allowed to change order of eval
More Operators• ABS absolute value
• MIN, MAX min and max “(5 MIN 3)”
• SQR integer square root
• SIN, COS sine & cosine– Input: 0..255 for 0..360deg – Output: –127…127
More Operators• DCD “decode” – creates bit mask w/ 1 bit
set(DCD 2) == %00000100 [bits numbered 0..7]
• NCD “encode” – find highest bit set (NCD %01001000) == 7 [bits numbered 1..8 (!)]
(NCD %00000000) == 0
• REV reverse some low order bits(%10101000 REV 4) == %10100001
Comparison and Logical Operators
• The usual comparison operators= <> < > <= >=
• Logical operators:not and or xor
• Zero is false, non-zero is true
Assignment & Conditionals
<name> = <expr>
<name>(<expr>) = <expr>
<name>.<part> = <expr>
If <expr> Then <label>
Control Statements
For <var> = <expr> To <expr> Step <val><stmt-list>
NextNote: always executes at least once through loop!
Goto <label>Branch <expr>, [<label>, …]
– Labels numbered from 0– If index is larger than label set no jump is made
Control Statements (cont.)
Gosub <label>– call basic subroutine at label (ending at return)– no parameters
Return– return from most recently called subroutine
Control Statements (cont.)
End– stop execution and enter low power mode– I/O pins retain state
Stop– stop execution but don’t enter low power mode– I/O pins retain state
• Control starts at the first statement in your code• It is possible to “run off the bottom” of your
program (apparently starts back at the top??)
Placing Data in EEPROM Memory
• Non-volatile memory – keeps values w/o power
• Data <const>, <const>, …• <constname> Data <const>, <const>, …
– Fill EEPROM with values • Optionally defining constant to starting address
– Values are placed at program download time not run-time
Placing Data in EEPROM Memory
Read <addr>, <var>
Write <addr>, <val>– Read / write a value from / to given EEPROM
address
Sleeping and Low Power Mode
• PIC has low power mode (draws ~1A)– Typical low power strategy: sleep most of
the time
Sleep <seconds>
Nap <code>– Timing is not extremely accurate
NAP Codes0 18msec1 36msec2 72msec3 144msec4 288msec5 576msec6 1.152sec7 2.304sec
Accurate Delays (Full Power)
Pause <msec>– Do nothing for given number of milliseconds– Example: pause 500 ‘ ½ second delay
Misc. StatementsLookup <index>,[<const>, …], <var>
– Table lookup for 8 or 16 bit values– Constant from Nth position (from 0) goes in
<var>– Strings count as multiple single character
entries– Out of range index causes no action
Misc. StatementsLookdown <val> [<const>, …], <var>
– Search for a value in an 8-bit constant table– Strings equivalent to list of single characters– Var gets index of matching value (0 based indexing)– If not found then no action taken
Lookdown <val> <compop> [<const>, …], <var>– First that given comparison succeeds– = <> < > <= >=
Random <var>– Generate 16-bit random number using var as seed (and
result)
I/O Related Statements
• Both low level , simple functions– Input, Output, High, Low
• And high level, complex functions– I2Cin, SerIn, etc.
Statements for Low Level I/O
Input <pin>, Output <pin>– Establish direction of single pin
Reverse <pin>– Reverse direction of a single pin
High <pin>, Low <pin>– Implies output (most I/O commands imply input/output)
• Same as “Output <pin> : <pin> = <val>”
Toggle <pin>– Invert value of pin
<var> = <pin>– To read input value
Additional I/O
Button <pin>, <down>, <delay>, <rate>, <bvar>, <action>, <label>
– Wait for debounced & repeated button press/release on pin
– Have a look at the manual…
Additional I/O
Pulsein <pin>, <state>, <var>– Measure width of high/low pulse on pin– <state> = 0 low pulse, = 1 high pulse– Returns in units of 2sec (0 for too long / never)
Pulseout <pin>, <time>– Emit measured pulse in units of 2sec– High/low depends on prior state (toggles pin twice)
Count <pin>, <time>, <var>– Count pulses occurring within given time (in msec)
Analog I/O
• RCTime <pin>, <state>, <var>– Measure time pin stays in current state
• 2sec units
– Typical use charge pin then measure time it takes RC circuit to drain
• See example from last slides
Analog and Audio I/O
• PWM <pin>, <duty>, <time>– Pulse width modulation output on pin– PWM signal is used to efficiently drive e.g., DC
motor at fractional speed– High only some percentage (duty cycle)
• <duty> 0 = 0% on, 255 = 100% on
– Delivers % of full power • note: not clean square wave
– <time> in msec units
Analog and Audio I/O• FreqOut <pin>, <on_msec>, <freq1> • FreqOut <pin>, <on_msec>, <freq1>, <freq2>
– Output sine wave(s) at given frequency – Use filter capacitors for reasonable sound
Analog and Audio I/O
• DTMFOut <pin>, [ <v1>, <v2>, …]
• DTMFOut <pin>, <onms>, <offms>, [ <v1>, <v2>, …]
– Output telephone touch tones (DTMF)• Generated with FreqOut• Needs low pass filter (freqout)
– Values 0..15• 10 is *• 11 is #• 12..15 are defined, but not on the phone
Serial I/O
Shiftin <datapin>, <clkpin>, <mode>, [ <var>, <var>\<bits>, … ]Shiftout <datapin>, <clkpin>, <mode>, [ <var>, <var>\
<bits>, … ]Serin <pin>, <mode>, [ <item>, …]Serout <pin>, <mode>, <item>, …
– items can be qualified with formatting information• e.g. “dec” for ascii decimal encoding
– Also can do flow control and timeouts (see manual)
Debug <item>, <item>, …
About Serial Output
• RS232C is standard for serial communications• EIA “recommended standard” from the early 60s
– Designed for modems
• Uses odd voltages (from modern perspective)• Logical 1 (mark) –15..-3v• Logical 0 (space) 3..15v
• Stamps can put out 0 and +5v…. so we have a problem
Level conversion for RS232
• Maxim makes a single chip (powered by only 5v)– Built into BS II (used for Debug only)
• Can buy HW that fits inside connector case ($15)
• http://www.sxlist.com/techref/io/serial/RCL1.htm
Or you can cheat for about $.04
• It turns out that most PC serial ports have a wide margin of things they will accept– If you invert the signal (1 = 0v; 0 = +5v) it turns out that
most PC serial ports will accept it as RS232!– Special modes for Serin (e.g., N9600) to do this
• PICs have over/under voltage protection on pins– Negative voltage clamped and read as logic 0– Voltage > +5V also clamped and read as 1– Because of details, need current limiting resistors in
series
Serial “cheater” cable
• Has worked on all (both) PCs I’ve tried
• Failed on 1 Mac I tried
Debugging Strategies• When programming you don’t really spend
your time/effort writing code, you spend it debugging the code when you get it wrong (which is pretty much always)…
• Embedded systems are particularly hard– Is it hardware or software?– Impoverished debug environment
• Few tools• Low visibility
– Timing may be an issue
Software Debugging in PBP
• Have the equivalent of “printf” (debug)– If you have the code space – And you are not timing dependent
• Can get small serial driven LCD displays
• Can also do things like flash LED on Pin– E.g., unique patterns indicating that certain
pieces of code are being executed
Hardware debugging
• “Preemptive debugging” (AKA testing)• Seriously test your circuits before you use them
– Start with ensuring power doesn’t conduct to ground– Check that connections actually conduct– Check that adjacent soldered holes aren’t shorted
• Multimeter for basic continuity checks
– Double check that you have connected everything– Double check that you have connected it right
• Polarity, etc.
– Check that you have power (battery ok)
Hardware debugging
• Logic probe– Very useful to checking that basic signals you
expect are showing up on the pin you expect– Clipped to power and
ground, “needle” touches point to probe
– Indicates 0/1– Also shows fast pulses
long enough to see
Hardware Debugging
• Oscilloscope– Shows graph of actual voltages over time
Hardware Debugging
• Can scale time (horiz) or voltage (vert)• Can typically trigger
– Start graph at point of some event– E.g., first rise
• Graph allows time measurements– E.g., see at right that
pulse lasts just under 1msec
• Some allow dual trace– Allows comparisons