atlast.html and atlast.pdf is included and is an extensive atlast-forth manual. Read it online [http://www.fourmilab.ch/atlast/] and read about Forth itself here [http://www.forth.com/starting-forth/sf0/sf0.html] and here [http://home.iae.nl/users/mhx/sf.html] (Beware that the Forth dialect in the book Starting Forth is a bit outdated compared to Atlast Forth). Leo Brodie wrote another book, Thinking Forth, read it here [http://www.dnd.utwente.nl/~tim/colorforth/Leo-Brodie/thinking-forth.pdf]

+

atlast.html and atlast.pdf is included and is an extensive ATLAST Forth manual. Read it online [http://www.fourmilab.ch/atlast/] and read about Forth itself here [http://www.forth.com/starting-forth/sf0/sf0.html] and here [http://home.iae.nl/users/mhx/sf.html] (Beware that the Forth dialect in the book Starting Forth is a bit outdated compared to ATLAST Forth). Leo Brodie wrote another book, Thinking Forth, read it here [http://www.dnd.utwente.nl/~tim/colorforth/Leo-Brodie/thinking-forth.pdf]

== Adding new words ==

== Adding new words ==

−

Most of the power of Atlast Forth derives from the ease with which C coded primitives can be added to the language. In my case I will add some words for controlling my [[RPi Gertboard | Gertboard]].

+

Most of the power of ATLAST Forth derives from the ease with which C coded primitives can be added to the language. In my case I will add some words for controlling my [[RPi Gertboard | Gertboard]].

−

There is a detailed description on how to do this in the atlast-forth manual. And you can copy much of the word implementations from the gertboard_sw directory if you have downloaded the gertboard demo files.

+

There is a detailed description on how to do this in the ATLAST Forth manual. And you can copy much of the word implementations from the gertboard_sw directory if you have downloaded the gertboard demo files.

It is easy to add your own words, just add a "define GERTBOARD" to atlast.c around line 56.

It is easy to add your own words, just add a "define GERTBOARD" to atlast.c around line 56.

<code><pre>

<code><pre>

Line 47:

Line 47:

}

}

−

prim P_gert_setport() // channel state ---

+

prim P_gert_setport() // Channel state ---

{ // Set a digital io port to a specified state

{ // Set a digital io port to a specified state

int rev;

int rev;

Sl(2);

Sl(2);

if (S1 == 21)

if (S1 == 21)

−

{ // find out which rev of RPi we have

+

{ // Find out which revision of Raspberry Pi we have

rev = pi_revision();

rev = pi_revision();

if (rev != 1)

if (rev != 1)

Line 71:

Line 71:

Sl(1);

Sl(1);

if (S0 == 21)

if (S0 == 21)

−

{ // find out which rev of RPi we have

+

{ // Find out which revision of Raspberry Pi we have

rev = pi_revision();

rev = pi_revision();

if (rev != 1)

if (rev != 1)

Line 138:

Line 138:

I have a kWh meter that I would like to read with the RPi. On the meter there is a small light that blinks once per 3.6 sec at 1 kW. So I need a way to detect time between pulses. I mounted a simple LDR (2k - 20k) for around €2 over the blinking light and connected it to Gertboard Buf1 and ground. Set B1 as an input with a jumper on the board and connect GP25 to B1.

I have a kWh meter that I would like to read with the RPi. On the meter there is a small light that blinks once per 3.6 sec at 1 kW. So I need a way to detect time between pulses. I mounted a simple LDR (2k - 20k) for around €2 over the blinking light and connected it to Gertboard Buf1 and ground. Set B1 as an input with a jumper on the board and connect GP25 to B1.

−

Now that you know how to add a primitive word to atlast I just list the code for the word:

+

Now that you know how to add a primitive word to ATLAST, I just list the code for the word:

<code><pre>

<code><pre>

prim P_gert_getkwh() // channel --- clocks clocks_per_sec

prim P_gert_getkwh() // channel --- clocks clocks_per_sec

Line 196:

Line 196:

Result: Jolly good, or as they say in USA, Awesome! Tests shows an accuracy down to a single watt.

Result: Jolly good, or as they say in USA, Awesome! Tests shows an accuracy down to a single watt.

−

However, having the kW load on the command line in a terminal is not good enough, I want it online on the web or as a mobile app. If you are interested, follow me over to the [[Erlang | Erlang]] page where I vill use this Atlast Forth application as an Erlang Port to access Gertboard from a web page.

+

However, having the kW load on the command line in a terminal is not good enough, I want it online on the web or as a mobile app. If you are interested, follow me over to the [[Erlang | Erlang]] page where I vill use this ATLAST Forth application as an Erlang Port to access Gertboard from a web page.

== More Fun ==

== More Fun ==

Line 280:

Line 280:

</pre></code>

</pre></code>

−

When that installation is done you can copy two files over to the Atlast Forth directory:

+

When that installation is done you can copy two files over to the ATLAST Forth directory:

<code><pre>

<code><pre>

cd /home/pi/atlast-1.2

cd /home/pi/atlast-1.2

Line 346:

Line 346:

Save atlast.c and re-run make to compile and you can try your new words. Remember to configure /etc/tellstick.conf according to the brands of hardware you are using, read the tellstick documentation.

Save atlast.c and re-run make to compile and you can try your new words. Remember to configure /etc/tellstick.conf according to the brands of hardware you are using, read the tellstick documentation.

−

First, start telldusd and then atlast.

+

First, start telldusd and then ATLAST.

<code><pre>

<code><pre>

telldusd

telldusd

./atlast

./atlast

</pre></code>

</pre></code>

−

In the atlast console, type your new forth words

+

In the ATLAST console, type your new Forth words

<code><pre>

<code><pre>

tellinit

tellinit

Line 388:

Line 388:

</pre></code>

</pre></code>

−

Now, to try it out, save and re-compile with make and then start telldusd and ./atlast. Type the following in the atlast console:

+

Now, to try it out, save and re-compile with make and then start telldusd and ./atlast. Type the following in the ATLAST console:

<code><pre>

<code><pre>

127 string raw

127 string raw

Line 396:

Line 396:

The word rawevent is executed by the callback function, you can re-define it and it will use the latest definition. With this definition it will just type the incoming data in the console. If you take a Nexa remote controll and press a few buttons, the incoming data should print as a string, eg "class:command;protocol:waveman;model:codeswitch;house:A;unit:1;method:turnoff;"

The word rawevent is executed by the callback function, you can re-define it and it will use the latest definition. With this definition it will just type the incoming data in the console. If you take a Nexa remote controll and press a few buttons, the incoming data should print as a string, eg "class:command;protocol:waveman;model:codeswitch;house:A;unit:1;method:turnoff;"

−

You can even put the three lines of forth code in a file, e.g. telldus.atl and start atlast like this

+

You can even put the three lines of forth code in a file, e.g. telldus.atl and start ATLAST like this

atlast.html and atlast.pdf is included and is an extensive ATLAST Forth manual. Read it online [1] and read about Forth itself here [2] and here [3] (Beware that the Forth dialect in the book Starting Forth is a bit outdated compared to ATLAST Forth). Leo Brodie wrote another book, Thinking Forth, read it here [4]

Contents

Adding new words

Most of the power of ATLAST Forth derives from the ease with which C coded primitives can be added to the language. In my case I will add some words for controlling my Gertboard.
There is a detailed description on how to do this in the ATLAST Forth manual. And you can copy much of the word implementations from the gertboard_sw directory if you have downloaded the gertboard demo files.
It is easy to add your own words, just add a "define GERTBOARD" to atlast.c around line 56.

As we are using code from the Gertboard demos, copy the files gb_common.o and gb_common.h from the gertboard_sw directory to atlast-1.2 directory (it's there if you have run make in this directory as well).

Add gb_common.o to the file Makefile in atlast-1.2.

ATLOBJ = atlast.o gb_common.o atlmain.o

Now, save and run "make" again to recompile atlast.c.

Test the new words

Wire up the Gertboard according to the information you get when you run the command sudo ./leds in the Gertboard demo directory.

Run sudo ./atlast in the atlast-1.2 directory.

Type 1 gertboard

Type 22 1 setio and press enter, the corresponding LED will go on.

Type 22 0 setio and the LED will go off.

Type 0 gertboard

Play with it

Define your own LED demo, start the interpreter with sudo ./atlast. Define these words:

A real Use Case

I have a kWh meter that I would like to read with the RPi. On the meter there is a small light that blinks once per 3.6 sec at 1 kW. So I need a way to detect time between pulses. I mounted a simple LDR (2k - 20k) for around €2 over the blinking light and connected it to Gertboard Buf1 and ground. Set B1 as an input with a jumper on the board and connect GP25 to B1.

Now that you know how to add a primitive word to ATLAST, I just list the code for the word:

Result: Jolly good, or as they say in USA, Awesome! Tests shows an accuracy down to a single watt.

However, having the kW load on the command line in a terminal is not good enough, I want it online on the web or as a mobile app. If you are interested, follow me over to the Erlang page where I vill use this ATLAST Forth application as an Erlang Port to access Gertboard from a web page.

More Fun

To play a little more with the demo I need another primary word: SLEEP that takes one item on the stack, sleep time in microseconds. This very simple word should have been the word to start with, it actually shows three fundamental things for a primary word in three lines of code. Sl(1) to make sure there is at least one item on the stack. usleep(S0) is using the top stack item S0. Pop; pops the S0 stack item off the stack when it has been used.

Add this primary word to atlast.c. Put it right after the function prim P_quit()

prim P_sleep() // microsec ---
{
Sl(1);
usleep(S0);
Pop;
}

Remember to wire up the Gertboard according to the information you get when you run the command sudo ./leds in the Gertboard demo directory. Now we can do:

: leddemo use gertboard leds on leds off leds on leds off free gertboard ;
( and try it )
leddemo

Reflective Sensor

The edge trigger word can be used for other sensors as well, I tried it with this Reflective Sensor [5] and it works right out of the box. Connect VCC to a digital output and the "Out" to a digital input. Gnd to Gnd. I found it more convenient to look for positive edges so here is the word for that:

Tellstick

In order to have a safe way to handle mains switching, a Tellstick [6] is an excellent choice. It can control many consumer brands of wireless controlled sockets and dimmers. Implementing some words in Forth for switching mains on and off leaves the safe voltages for sensing thru the Gertboard interface.

Save atlast.c and re-run make to compile and you can try your new words. Remember to configure /etc/tellstick.conf according to the brands of hardware you are using, read the tellstick documentation.
First, start telldusd and then ATLAST.

telldusd
./atlast

In the ATLAST console, type your new Forth words

tellinit
1 tellon
1 telloff
tellclose

Tellstick duo

If you are fortunate enough to have a Tellstick Duo [7], you probably want to listen for incoming 433 Mhz signals so here we go. But first follow the Tellstick instructions above, and test that they work as expected.

Add this primitive word to atlast.c. We will use it to register a callback. (A callback is an ordinary function, nothing strange, but it will be called not by you but by the Tellstick Duo when there is data coming in).

Now, to try it out, save and re-compile with make and then start telldusd and ./atlast. Type the following in the ATLAST console:

127 string raw
: rawevent raw type cr ;
raw tellrawcallback

The word rawevent is executed by the callback function, you can re-define it and it will use the latest definition. With this definition it will just type the incoming data in the console. If you take a Nexa remote controll and press a few buttons, the incoming data should print as a string, eg "class:command;protocol:waveman;model:codeswitch;house:A;unit:1;method:turnoff;"

You can even put the three lines of forth code in a file, e.g. telldus.atl and start ATLAST like this