Sunday, November 27, 2011

Teensy Clock Fixed

Paul - the creator of the Teensy has provided a software update (Rev 1.04), that fixes the clock problem that I observed (see previous post) After a 24 hour test, my Teensy has only gained about 1 second (as compared to a wall clock) that is only about 11 ppm error, which is good considering ambient temp and generic 16mHz cpu crystal.

Another test with a known good reference clock is necessary for more resolution.

Thanks Paul, for your efforts to provide a fix.

--

Thursday, November 24, 2011

Teensy Programming Shield

I had some time this morning to install the headers on the Teensy Programming Shield which I just received from the FAB Shop (see previous post). With plated through holes, soldering of parts (headers) is much easier than experienced with Homebrew double sided boards.

Headers Installed
Bottom
Top


--

Wednesday, November 23, 2011

DorkBotPDX in Portland

Monday night Jeff - KO7M and I attended the 7-11pm  DorkBotPDX meeting in Portland, there were many projects available to review and interesting people to meet.

An unexpected pleasurable encounter was with Paul - the creator of the "Teensy", which is the cpu board that I have mentioned in previous posts (see search label: Teensy). Paul also, video taped some of the high lights of the meeting. My GUI Development Board and 9 Volt Micro Transmitters can be seen.

http://youtu.be/seyTMkTGZ3E

It was a great meeting, even thought I did not get back to Seattle and home until 3:30am, I plan to attend often.

--

Sunday, November 20, 2011

Teenys Clock Trouble

The only time I have had to work on other projects was late a night. My Teensy (an Arduino work-a-like, see previous posts) has been giving me fits. The clock is FAST by about 24 seconds per 6 hours. All previous efforts to correct the problem resulted in No Change.  Jeff - KO7M and I had some time to review my progress (or lack there of) and found that the Teensy does not use the same Clock file (wiring.c) as used by the Arduino (I was modifying the wrong file), in fact it not even named the same under the Teensy directory structure (pins_teensy.c).


void TIMER0_OVF_vect()
{
        asm volatile(
                "push   r24"                            "\n\t"
                "in     r24, __SREG__"                  "\n\t"
                "push   r24"                            "\n\t"

                "lds    r24, timer0_fract_count"        "\n\t"
                "subi   r24, 256 - %0"                  "\n\t"
                "cpi    r24, 125"                       "\n\t"
                "brsh   L_%=_fract_roll"                "\n\t"

        "L_%=_fract_noroll:"                            "\n\t"
                "sts    timer0_fract_count, r24"        "\n\t"
                "lds    r24, timer0_millis_count"       "\n\t"
                "subi   r24, 256 - %1"                  "\n\t"
                "sts    timer0_millis_count, r24"       "\n\t"
                "brcs   L_%=_ovcount"                   "\n\t"

        "L_%=_millis_inc_sext:"
                "lds    r24, timer0_millis_count+1"     "\n\t"
                "sbci   r24, 255"                       "\n\t"
                "sts    timer0_millis_count+1, r24"     "\n\t"
                "brcs   L_%=_ovcount"                   "\n\t"
                "lds    r24, timer0_millis_count+2"     "\n\t"
                "sbci   r24, 255"                       "\n\t"
                "sts    timer0_millis_count+2, r24"     "\n\t"
                "brcs   L_%=_ovcount"                   "\n\t"
                "lds    r24, timer0_millis_count+3"     "\n\t"
                "sbci   r24, 255"                       "\n\t"
                "sts    timer0_millis_count+3, r24"     "\n\t"
                "rjmp   L_%=_ovcount"                   "\n\t"

        "L_%=_fract_roll:"                              "\n\t"
                "subi   r24, 125 - %0"                  "\n\t"
                "sts    timer0_fract_count, r24"        "\n\t"
                "lds    r24, timer0_millis_count"       "\n\t"
                "subi   r24, 256 - %1 - 1"              "\n\t"
                "sts    timer0_millis_count, r24"       "\n\t"
                "brcc   L_%=_millis_inc_sext"           "\n\t"

        "L_%=_ovcount:"
                "lds    r24, timer0_micros_count"       "\n\t"
                "subi   r24, 256 - %2"                  "\n\t"
                "sts    timer0_micros_count, r24"       "\n\t"
                "brcs   L_%=_end"                       "\n\t"
                "lds    r24, timer0_micros_count+1"     "\n\t"
                "sbci   r24, 255"                       "\n\t"
                "sts    timer0_micros_count+1, r24"     "\n\t"
                "brcs   L_%=_end"                       "\n\t"
                "lds    r24, timer0_micros_count+2"     "\n\t"
                "sbci   r24, 255"                       "\n\t"
                "sts    timer0_micros_count+2, r24"     "\n\t"

        "L_%=_end:"
                "pop    r24"                            "\n\t"
                "out    __SREG__, r24"                  "\n\t"
                "pop    r24"                            "\n\t"
                "reti"
                : 
                : "M" (TIMER0_FRACT_INC), "M" (TIMER0_MILLIS_INC),
                  "M" (TIMER0_MICROS_INC)
        );
}
Teensy Clock Code from Original File

The Teensy Clock file is "pin_teensy.c", which is mostly written in Assembly Language. I unfortunately do not know Assembly Language well enough to make modification to attempt to correct the Clock. Jeff suggested we replace a section (the clock) with known working "C" code from Arduino.

The first attempt included a section to try to slow the Clock by an amount equal to the previously observed error. After 6 more hours, the clock was NOW slow by about the same amount as it was FAST before. Jeff suggested we remove the correction and obtain a new base line with just the "C" code installed.


SIGNAL(TIMER0_OVF_vect)
{
 // copy these to local variables so they can be stored in registers
 // (volatile variables must be read from memory on every access)
 unsigned long m = timer0_millis_count;
 unsigned char f = timer0_fract_count;

 m += MILLIS_INC;
 f += FRACT_INC;
 if (f >= FRACT_MAX) {
  f -= FRACT_MAX;
  m += 1;
 }
 
 timer0_fract_count = f;
 timer0_millis_count = m;
 timer0_overflow_count++;
}
Copied Arduino Clock Code

Due to the work in the Shop (listed above) I did not get back to the Clock project for 29 hours. After 29 hours, the base line results indicated that the Clock was spot-on, only less than a second difference could be observed when compared to a wall clock. Wow!

But, the "C" code replacement did something to the "Interrupts" for the Teensy, my push buttons no longer work as expected. We damaged something by removing the Assembly Language code. More investigation will be needed.

For now, I have reverted to the Assembly Language Clock routing, so that all of my GUI development environment works correctly, but with a Clock that runs a little fast.


UPDATE: The new release of Teensyduino 1.04 fixed the problem.

--

Saturday, November 19, 2011

Shop Work, While E Projects on Hold

The last few weeks I have not had much time for Ham Radio, Computers or Electronic projects. My Son and I have been working on building/Installing/updating new infrastructure for my Shop.
  • Low Bay door was insulated
  • Water Heater and Pressure Tank were relocated
  • New High Volume Compressed Air will be installed
  • Power Lines to the Compressor were installed
  • Air line will be install to all areas of the Shop
  • Major Shop Tools will be wired  and placed
  • High Volume Saw Dust Vacuum System will be installed
  • Freeze Relocated
  • A small Force Air Heater will be install in the High Bay (only to remove the chill while occupied)
  • Install New Cabinets in Kitchen and Laundry
  • Close Air Leaks at Window Step
--

Saturday, November 5, 2011

Teensy Programming Shield - To FAB Shop

After a little rework on the previous circuit board, we got it working. The +5V trace was broken at the header pin. This type of problem is always a concern with Homebrew Double Sided Boards as they are not through hole plated, and therefore must be soldered on the pads of the two sides. The pad and connecting trace are very fragile.
As Designed and Sent to DorkBotPDX

To make the board more useful (and rugged) we decided to have it sent to my favorite fab shop; DorkBotPDX. The boards should be back (in less than 2 weeks) by Thanksgiving.


The Back Side
The board has been changed a little, as the fab shop can do useful things, that are avoided when doing HB PCB's.


The board is .7'' x 1.8" with 8 mil traces, 6 mil ground grid, and the text font is 3pt.

 I enjoy building very small projects!

--