FORTH on ARDUINO

published: 5 November 2024 / updated 5 November 2024

Lire cette page en français

 

article: 11 mai 2019 / mis à jour 07 nov. 2019


ARDUINO is also a development environment that favors the C language. But this environment requires constant compilations and uploads to the ARDUINO card in development. The development of complex applications can quickly become a real calvary that can discourage the most valiant.

Advantages and disadvantages of the C language

With Arduino, we must use a minimal code when creating a program in C language. code allows to divide the program that we will create in two big parts:

void setup() //fonction d'initialisation de la carte
{
    //contenu de l'initialisation
}
void loop() //fonction principale qui se répète (s’exécute) à l'infini
{
    //contenu du programme
}

A program for ARDUINO written in C language must be nested at loop() to test and exploit it.

Among the advantages of the C language: it has an impressive bibliography, it is used by many developers, the application libraries are numerous ...

Among the disadvantages of the C language: it remains verbose, there is no mastery of the compiled code, it is difficult to develop subprogrammes independently from the general program ...

For us, the main disadvantage of programs written in C language for ARDUINO is the difficulty to diagnose the bugs and dysfunctions of the programs. This involves developing layer by layer and testing each function individually before nesting them in the general program. If a function in C language modifies a variable, the only way to know the value taken by this variable is to ask the function to display its contents.

This phase of design and development requires frequent compilations and uploads of the source code written in C language.

The ideal would be to have a real alternative programming language, preferably implanted directly on the ARDUINO board. There is one: FORTH. A very compact language, powerful, fast.

What is the FORTH language?

FORTH can be installed on an ARDUINO board, both for development and operation for all your applications, without loss of performance.

A program written in FORTH runs almost as fast as its language counterpart pure machine. And compiled FORTH programs are more compact than those written in C language.

You type a list of FORTH commands. FORTH executes these commands in sequence and wait for the following list of commands. Example:

123 dup * .  \ affiche 15129 ok 

New orders are compiled to extend existing order lists.

:   ; 

Example:

: carre dup * ; 
123 carre .   \ affiche 15129 

FORTH is the simplest man-machine interface

The most advanced controls can be tested and debugged interactively, thanks to the intrepretor integrated into the FORTH language.

Bottom programming makes it possible to create and test reliable applications. All defined or pre-defined words can be tested via the interpreter except for a few words that can only be used in compilation (IF..ELSE..THEN for example)

Memory and I/O devices can be examined and programmed interactively, thanks to the interpreter. Access to any register is totally transparent: PORTA c @ retrieves via the interpreter the contents of the PORTA register of PORT A.

The unique features of Forth:

The advantages of FORTH:

The text interpreter analyzes a list of commands in textual form. Examples:

13 DUP * . 
WORDS 
HEX 
0 100 DUMP 

Some FORTH commands:

 + - * / mod
 and or xor not
 key emit type dump
 @ ! c@ c! cmove fill erase
 dup drop swap over rot
 If-else-then, begin-while-repeat,
 for-next

The FORTH compiler

The FORTH compiler is the text interpreter running in compile mode.

The FORTH compiler creates new commands. These combine lists of existing orders.

Examples:

: CARRE DUP * ; 
: SALUT CR ." BONJOUR LES AMIS!" ; 
: FIBONACCI ( n --) 
    0 1 ROT 
    FOR SWAP OVER + NEXT 
    DROP ; 

FORTH for Arduino

Some versions of the FORTH language for Arduino:

Running FORTH for Arduino

example works with AmForth

Ignition and extinction LED:

HEX 
20 24 C! \ positionne Pin 13 en sortie 
20 23 C! \ bascule Pin 13 

example works with Flash FORTH

Most examples are compatible between the AmForth version and Flash Forth , the latter being case-sensitive, it will sometimes be necessary to adapt the available source codes on the net.

Ignition and extinction LED connected to pin 13:

hex 
20 24 c! \ positionne Pin 13 en sortie 
20 23 c! \ bascule Pin 13 

This example is executable directly in interfered mode from a terminal connected to the ARDUINO board, without compilation or uploading as it would be the case in C!

example works with AmForth

Ignition and extinction beeper:

40 2A C! \ positionne Pin 6 en sortie 
42 44 C! \ positionne Timer0 en mode CTC 
FF 47 C! \ comptage maximum pour Timer0 
3 45 C!  \ prescaler=3, démarrage beeper 
0 45 C!  \ prescaler=0, arrêt beeper 

The example can be entered line by line from the terminal or by copying / pasting between this page and the terminal connected to the ARDUINO board (voir: Communiquer avec Flash Forth)