Could someone send me a formula of sorts...and some code in the Parallax
instruction set.....on how to figure out delays depending on the
frequency your running at.....the delays should at least be in milli
seconds.......since I had my Basic Stamp 2...the pause command spoiled
me....:)

Delays can be implemented by software or by software & timerdepending on the PIC you are using (timer & interrupts available).

If there is interrupt capability (PIC16CXX and not PIC16C5XX), you can enable TIMER0 interrupt and the interval which the timer interrupts atwill become time quantum for delays. In ISR you can implement a counter (RTClock)which will increment. And delays will be measured in this counter units.If you want smaller units, ISR can write to TIMER0 a value that is closer to 0xff.

Instead of TIMER0 you may use TIMER1 and CCP1 in 1010 compare mode thatgenerates interrupt. CCPR1H:CCPR1L will contain interval measured in 1/(CLOCKIN/4).ISR should set TMR1L and TMR1H to an appropriate value closer to 0.

A routine performing delay can be defined asvoid Delay (char ticks);and it will count _ticks_ changes of above RTClockbefore return to the caller.

If there is no interrupts it is still possible to call (very) often a procedure that will check if timer0 overflow is occured and if it is to increment RTClock. Here is good idea to havea guard value, smaller than 0xff and check if timer0 has got above it. It is importantto call this procedure at intervals smaller than the time that TIMER0 needs to pass fromthis guard value to 0xff and 0x00.

The delay procedure will have loop with call to timer0 check routine and check for RTClock changeand this will repeat until _ticks_changes happen.

These PICs are just too fast, we often need a way to have the
processor wait around for a while. A series of NOP (no operation)
instructions is straightforward, but wasteful of instruction memory.
A counted loop is the next common trick, because that lets us tune it.

I feel that many applications (real-time control, clocks) resolve to a
fundamental "tick" or hierarchy thereof, often around a millisecond,
which method {7} provides. Counting a thousand of these gives a second,
at which point a train of countdowns (semaphores) can lead to various
housekeeping actions i.e., if T1 then { T1--; if T1 == 0 then action1 };

On the 1 ms "ticks" also, a debounce uses a counter which counts down
from 20 (20 ms) to verify a keypress/ release. Other countdowns in ms
are used for playing tunes or "tick", "Click" or "blip" noises.

It is highly undesirable to pre-load or fiddle with the TMR0 when you
are using it this way, firstly because it interferes with the prescaler
in a very inconvenient fashion, and secondly as the 1 ms countdowns can
be used for a 500 Hz tone while the TMR0 MSB can be copied to a port for
a 1 kHz tone, bit 6 for a 2 kHz tone, etc., controlled as above in even
numbers of milliseconds.

You can similarly, wait on those individual bits by polling, for sub-
delays. A sub-delay on bit 3 toggling could be used to time a phase
accumulator (32 kHz clock) to generate quite a complete range of square
wave tones.

So, you may say that method "uses" a timer-counter, but I submit that
in a well-designed application, you get an awful lot of "use" out of it!
--
Cheers,
Paul B.