MOTOR_TASK BUILD
TIMER_TASK BUILD
SENSOR_TASK BUILD
DISPLAY_TASK BUILD
3. Next, you need to actually define what each task does. This is done with the ACTIVATE word, which can be used only inside a definition. Consider, for example, the MOTOR_TASK. Basically,
we want it to look like this:
BEGIN UPDATE_MOTORS PAUSE AGAIN
The real work of the task is in UPDATE_MOTORS, a word that examines some other values in the system and sets the state of the motors. The PAUSE word is the key to cooperative
multitasking-it passes control to the next task in the list. To associate this loop with MOTOR_TASK, we need another special word, ACTIVATE:
:NONAME MOTOR_TASK ACTIVATE BEGIN UPDATE_MOTORS PAUSE AGAIN ; EXECUTE
The ACTIVATE word associates MOTOR_TASK with the rest of the NONAME definition, which is simply the endless BEGIN AGAIN loop. To link the code into the task list, the NONAME
definition is executed. (The combination of NONAME and EXECUTE allows you to execute a defined word just one time. Because it doesn't have a name, you can't execute the defined word
again later.) The tortast.txt example sets up its other three tasks in the same way:
:NONAME TIMER_TASK ACTIVATE BEGIN UPDATE_TIMERS PAUSE AGAIN ; EXECUTE
:NONAME SENSOR_TASK ACTIVATE BEGIN UPDATE_SENSORS PAUSE AGAIN ; EXECUTE
:NONAME DISPLAY_TASK ACTIVATE BEGIN UPDATE_DISPLAY PAUSE AGAIN ; EXECUTE
4. To actually start the tasks running, use AWAKE, like this:
DISPLAY_TASK AWAKE
SENSOR_TASK AWAKE
TIMER_TASK AWAKE
MOTOR_TASK AWAKE
Page 137
To dive into this a little more, check out the whole tortask.txt example at the pbFORTH web site.
An Expensive Thermometer
This section contains an example that will help you get your feet wet with pbFORTH. We'll build a simple Celsius thermometer using a temperature sensor. Hook the sensor up to input 2 and enter
the following (I've omitted pbFORTH's ''ok" responses for clarity):
HEX
: buttonState RCX_BUTTON DUP BUTTON_GET @ ;
: isRunButtonPressed buttonState 1 AND ;
: showTemperature
3003 SWAP 3001 LCD_NUMBER
LCD_REFRESH
;
: clear LCD_CLEAR LCD_REFRESH ;
: thermometer
RCX_INIT
SENSOR_INIT
BUTTON_INIT
2 1 SENSOR_TYPE
A0 1 SENSOR_MODE