Monthly Archives: January 2015

To Boldy Go FORTH!

So, as mentioned earlier, I have installed FlashForth on an Arduino Nano.

In this blog I will tell you how I did it. There are some small things that make put you of on the track there.

Get the tools

To get the things going you will need:

  • Some Arduino board (Nano, Duemilanove, Mega 2560 R3 or Uno R3)
  • A way to get the hexfile on the board. I’m using a second Nano card with the ArduinoISP sketch and avrdude.
  • The code to burn. Can be found at Source Forge (Download link).

I am running Kubuntu, so the installation of avrdude is done by:

sudo apt-get install avrdude

Unpack the FastFoth archive and find the hex file needed. In my case

~/work/flashforth-code-537e623ec97a1f9c912eba7d6c7afaafbdd0c60d/avr/hex

Get a Programmer

If you allready have an ISP system, you can skip this part.

How to hook up two  Arduino Uno to use one as an ISP for the other is shown here.

For two Nano, it is more or less the same:

PENTAX DIGITAL CAMERA

Or as a Fritzing sketch:

NanoISP_bb

 Program!

So, looking in the file “A Tutorial Guide to Programming PIC18, PIC24
and ATmega Microcontrollers with FlashForth” (found here.) I found a avrdude command to use:

$ sudo avrdude -p m328p -B 8.0 -c jtag3isp -P usb -e \
-U efuse:w:0xff:m \
-U hfuse:w:0xda:m \
-U lfuse:w:0xff:m \
-U flash:w:ff_uno.hex:i

Now, this line contains some errors for my setup. The easy ones:

I don’t use jtag3isp, I use avrisp. I have the programmer on /dev/ttyUSB0, not only usb.

There is one more problem. I don’t know if it is board, processor or programmer related. When I enter the line:

sudo avrdude -P /dev/ttyUSB0 -b 19200 -c avrisp -p m328p -v -e -U efuse:w:0xff:m -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U flash:w:ff_uno.hex:i

I get an error:

avrdude: safemode: efuse changed! Was ff, and is now 7
Would you like this fuse to be changed back? [y/n] n

It seems my setup return unused bits in efuse as 0, but 1 is expected. Chaning the line to:

sudo avrdude -P /dev/ttyUSB0 -b 19200 -c avrisp -p m328p -v -e -U efuse:w:0x07:m -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U flash:w:ff_uno.hex:i

does the trick.

Start playing…

To hook up to the new toy to the computer, I use:

sudo gtkterm –port=/dev/ttyUSB0 –speed=38400 –delay=10 –flow=Xon

and now I have a Forth Arduino Nano.

More on FlashForth

SourceForge page

 

On the Matter of Size

When you write a more complex program that uses several libraries, you will sometimes run into a problem with that the sketch doesn’t fit in the Arduino. What to do?
You can find some ideas in the Arduino forum and elsewhere. Some ideas:

Your Own Code

Do you need all those libraries? Really? Check again.
Rewrite your code. Do you make the same 4 line code snippet in several places? Use a function. With some good comments, it will not be more difficult to read your code.
Also, try different approaches. Since the compiler uses a optimizer, the result might not be what you think.

Variable Types

Floats are often bloats… Do you really need floats? Or can you handle it with a integer that is 10 or 100 times the float value?
Remember that RAM is even more scarce than flash memory on the Arduino, and integers normally takes less memory than floats in Ram also.

 

Libraries Blues

Libraries are a good thing. You don’t have to care about the details how to handle a DHT11 or DHT21.
But they are also a bad thing for flash. There are a couple of DHT libraries out there. Some are specific DHT11, some handle DHT11 and DHT21. If you only have one of them, maybe you should go for the specific version.
To minimize the size of the code, you could be helped by reading the documentation and code. Some libraries (like uTFT library) have defines to remove unused parts.
If this is not enough, you might have to rewrite the library yourself. See this text about that.

For instance, the uTFT library uses floats and doubles to draw lines. This should be possible to work around, and save some 2kB of flash.

The Arduino Dev Kit

This is a part I didn’t expect would give me headache…
But look at these three outputs:
Binary sketch size: 27 526 bytes (of a 30 720 byte maximum)
Binary sketch size: 32 130 bytes (of a 30 720 byte maximum)
Binary sketch size: 32 150 bytes (of a 30 720 byte maximum)
This is the output from three versions of the dev kit. (1.0.5+dfsg2-2, 1.0.5, and 1.0.6).
Now, for this problem, I have so far not found a good solution. In other types of SDKs you normally can change the parameters sent to the compiler, but with the Arduino kit it isn’t that easy. I also suspect that one or more library has been ‘improved’, but this type of improvement is not needed by me.
As you can see, it is a quite big difference also, more than 4 kB.

Not using c/c++

I have an Arduino Nano with FlashForth installed. This might be a solution also. See more in an upcoming blog entry…