NXC (and NBC) NXC (Not eXactly C) is a language similar to NQC, which was the most popular way to program the RCX Built on NBC, the Next Byte Code ‘assembler’ Uses the built in firmware, and p-code system
Jan 03, 2016
NXC (and NBC)
NXC (Not eXactly C) is a language similar to NQC, which was the most popular way to program the RCXBuilt on NBC, the Next Byte Code ‘assembler’Uses the built in firmware, and p-code system
NXC uses BricxCC
Reasonably stable development environmentProvides support for all LEGO robotic platformsFree!
Programming with NXC
Assuming you are comfortable with C…
How to use the motorsHow to read the sensorsThreading model
NXC Programs
NXC is based on CRestrictions because it’s based on the built-in P-Code system There’s no stack Limited memory Limited number of tasks (256) And subroutines, which are also
‘tasks’
NXC Sensors
#include "NXCDefs.h"
task main() { SetSensorType( IN_1,
SENSOR_TYPE_TOUCH ); SetSensorMode( IN_1,
SENSOR_MODE_BOOL ); }
NXC Sample program#include "NXCDefs.h“task main() { SetSensor( IN_1, SENSOR_TOUCH ); while( true ) { if( Sensor( IN_1 ) ) { PlayToneEx(440, 100, 3, false); TextOut( 0, LCD_LINE1, "TOUCHING!"); while( Sensor( IN_1 ) ) ; } TextOut( 0, LCD_LINE1, "---------"); while( !Sensor( IN_1 ) ) ; }}
NXC Motors
To use the built-in rotation sensors, you need to use the new motor commandsEasiest to use is RotateMotor()
RotateMotor
RotateMotor( port, speed, angle ); port is OUT_A, OUT_B, OUT_C, or
combinations such as OUT_AB, OUT_ABC
speed is a number -100 to 100 angle is the number of degrees you
want the motor to turn (positive or negative)
Mimicking a Servo Motor
Read the current motor angle Current =
MotorRotationCount( OUT_A );
Calculate how far you need to turn Delta = Target – Current;
Turn that amount RotateMotor( OUT_A, speed, Delta );
Displaying Text
The LCD display is useful for Debugging Setting parameters Runtime messages Graphics Games … and more
LCD display
The origin is the bottom leftSo TextOut( 0,0, “hi” ) will display in the bottom left cornerUse the LCD_LINEn macros if you like to make it easier
Text Example
y = 42;TextOut(0, LCD_LINE5, "Answer:" );NumOut( 8*6, LCD_LINE5, y );
// characters are 6 pixels wide
Graphics
There are also commands to draw lines, circles, rectangles, and set pointsYou can display bitmaps from a fileRIC files – contain drawing commandsOne problem is there isn’t an easy way to clear areas of the screen It’s easy to clear the whole screen You can display a 1x1 blank bitmap
Tasks and Subroutines
Multiple tasks are possible, but don’t work like you might expectScheduling is different – tasks start when a ‘dependant’ task finishes There is no easy way of stopping a
task
Use Precedes() or Follows() in a task to define task dependencies
Taskstask FooTask() { // will start executing when main() finishes}
task main() { // program starts here Precedes( FooTask );}
task BarTask() { Follows( main ); // will also start executing when main()
finishes}
Subroutines
Essentially a task that can be calledIt suspends the calling task until it returnsDon’t use task keyword to define theseCan pass in parameters or return a value
Subroutine Examplevoid TestSub( int x, int y, short i ) { x = y + i; }task main() { TestSub( 1, 2, 3 ); }