info-mindstorms

nxc tutorial



inleiding
het eerste programma
commentaar
constanten
repeat
variabelen
while
if-else
random
sensoren
nxt display
nxt knoppen
sub taken
meedere taken

meerdere taken


tot nu toe hebben we noch maar een task gebruikt, de task main, dit is de belangerijkste taak die er altijd moet zijn. maar soms is het handig om nog veel meer taken te hebben.


we gaan weer kijken naar het zelfde programma als de vorige keer, die had namenlijk een probleem. mischien is het je al opgevallen dat het beeldscherm in het vorige programma maar 1 keer per seconde vernieuwde, dit komt door dat er een wait en een until in stond, deze zetten het hele programma stil, we gaan het oplossen door meerdere taken te gebruiken.

we maken een taak voor het rijden, voor het beeldschem en voor de besturing van de knoppen.

#define afstand 25
int opstakels, ultrasoon_sensor, draairichting, snelheid, menu;
task rijden()
{
while(true)
{
if(SensorUS(IN_4)< afstand)
{
opstakels += 1;
if(draairichting==0)
{
OnFwd(OUT_B,snelheid);
OnRev(OUT_C,snelheid);
}
else if(draairichting==1)
{
OnFwd(OUT_C,snelheid);
OnRev(OUT_B,snelheid);
}
else if(draairichting==2)
{
if(Random(3)==0)
{
OnFwd(OUT_B,snelheid);
OnRev(OUT_C,snelheid);
}
else
{
OnFwd(OUT_C,snelheid);
OnRev(OUT_B,snelheid);
}
}
until(SensorUS(IN_4));
Wait(1000);
}
if(SensorUS(IN_4)>afstand)
{
OnFwd(OUT_BC,snelheid);
}
}
}
task display()
{
while(true)
{
ClearScreen();
TextOut(10, LCD_LINE1,"opstakels:");
NumOut(10, LCD_LINE2, opstakels);
TextOut(10, LCD_LINE3,"ultarasoon sensor:");
ultrasoon_sensor = SensorUS(IN_4);
NumOut(10, LCD_LINE4, ultrasoon_sensor);
TextOut(10, LCD_LINE5,"snelheid:");
NumOut(10, LCD_LINE6,snelheid);
TextOut(10, LCD_LINE7,"draairichting:");
NumOut(10, LCD_LINE8, draairichting);
NumOut(80,LCD_LINE1, menu);
if(draairichting==0)
{
TextOut(16, LCD_LINE8, "links");
}
if(draairichting==1)
{
TextOut(16, LCD_LINE8, "rechts");
}
if(draairichting==2)
{
TextOut(16, LCD_LINE8, "toeval");
}
Wait(500);
}
}
task knoppen()
{
while(true)
{
if(ButtonPressed(BTNCENTER,1))
{
menu += 1;
}
if(menu==0)
{
LineOut(1,25,4,25);
if(ButtonPressed(BTNLEFT,1))
{
snelheid -= 5;
}
if(ButtonPressed(BTNRIGHT,1))
{
snelheid += 5;
}
}
if(menu==1)
{
LineOut(1,10,4,10);
if(ButtonPressed(BTNLEFT,1 ))
{
draairichting -= 1;
}
if(ButtonPressed(BTNRIGHT,1))
{
draairichting += 1;
}
}
if(menu>=2)
{
menu = 0;
}
Wait(500);
}
}
task main()
{
Precedes(rijden,display,knoppen);
snelheid = 75;
SetSensorUltrasonic(IN_4);
}

de nxt opent altijd alleen de task main, in die task moet je zeggen dat de andere task ook geopend moet woorden, dit doen we metprecedes. tussen de haakjes zet je de andere tasks.

let op: de task main moet altijd als het laatst in het programma staan.