basicstamp ii language (quick) tutorial. lexical aspects line oriented language (one stmt per line)...

Post on 13-Jan-2016

220 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related