Basic Stamp II Language Quick Tutorial Lexical Aspects
Basic. Stamp 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 – Hex – Binary – Chars – Strings 123 $FF %10101110 “A” “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>: bit nib byte word • 1, 4, 8, 16 bits values • E. g. , counter var byte • Arrays <name> var <type>(<size>) e. g. , table var byte(5) (nib=nibble=4 bits)
Variables (cont. ) • Aliases (two names for the same variable) <name 1> var <name 2>. <part>: bit 0 bit 1 bit 2 … bit 15 highbit lowbit nib 0 … nib 3 highnib lownib byte 0 byte 1 highbyte lowbyte – Example: LED_pin var outs. bit 5
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. . 360 deg – Output: – 127… 127
More Operators • DCD 1 bit set “decode” – creates bit mask w/ (DCD 2) == %00000100 • NCD “encode” – find highest bit set (NCD %01001000) == 7 (NCD %0000) == 0 • REV [bits numbered 0. . 7] [bits numbered 1. . 8 (!)] 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> Next Note: 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>, … • <constname> Data <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 ~1 A) – Typical low power strategy: sleep most of the time Sleep <seconds> Nap <code> – Timing is not extremely accurate NAP Codes 0 18 msec 1 36 msec 2 72 msec 3 144 msec 4 288 msec 5 576 msec 6 1. 152 sec 7 2. 304 sec
Accurate Delays (Full Power) Pause <msec> – Do nothing for given number of milliseconds – Example: pause 500 ‘ ½ second delay
Misc. Statements Lookup <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. Statements Lookdown <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 – I 2 Cin, Ser. In, 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 2 sec (0 for too long / never) Pulseout <pin>, <time> – Emit measured pulse in units of 2 sec – 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 • 2 sec 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 • Freq. Out <pin>, <on_msec>, <freq 1>, <freq 2> – Output sine wave(s) at given frequency – Use filter capacitors for reasonable sound
Analog and Audio I/O • DTMFOut <pin>, [ <v 1>, <v 2>, …] • DTMFOut <pin>, <onms>, <offms>, [ <v 1>, <v 2>, …] – Output telephone touch tones (DTMF) • Generated with Freq. Out • 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>, …
About Serial Output • RS 232 C is standard for serial communications • EIA “recommended standard” from the early 60 s – Designed for modems • Uses odd voltages (from modern perspective) • Logical 1 (mark) – 15. . -3 v • Logical 0 (space) 3. . 15 v • Stamps can put out 0 and +5 v …. so we have a problem
Level conversion for RS 232 • Maxim makes a single chip (powered by only 5 v) – Built into BS II (used for Debug only) • Can buy HW that fits inside connector case ($15) • http: //www. sxlist. com/techref/io/serial/RCL 1. 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 = 0 v; 0 = +5 v) it turns out that most PC serial ports will accept it as RS 232! – Special modes for Serin (e. g. , N 9600) to do this • PICs have over/under voltage protection on pins – Negative voltage clamped and read as logic 0 – Voltage > +5 V 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 1 msec • Some allow dual trace – Allows comparisons
- Slides: 40