NXC Kurzreferenz

Werbung
NXC Kurzreferenz
Variablen und
Konstanten
int x
#define TEST 270
sind(x), cosd(x)
Ablauf des Programms
steuern
Wait (sec)
repeat (n)
while (bedingung)
do {Block1} while(Bdg)
for-Schleife
if (Bdg.1)
{block1}
else
{block2}
Eine Variable mit
Namen x vom Typ
Integer wird angelegt
Konstanten werden
groß geschrieben und
bekommen einen festen
Wert (hier 260)
zugewiesen. Ohne
Semikolon am Ende!!!!
Berechnet sin und cos in
Grad (sin(x) berechnet
im Bogenmaß)
int test = 0;
Watet sec Anzahl von
Millisekunden
Ein Block von
Anweisungen wird n
mal wiederholt
Wait (4000);
Solange die Bedingung
erfüllt ist (True liefert)
wird die Schleife immer
wieder durchlaufen
Die Schleife wird auf
jeden Fall 1 Mal
durchlaufen, da die
Bedingung erst am Ende
überprüft wird. Solange
sie True ergibt, wird sie
immer wieder
durchlaufen.
Schleife wird exakt nach
Anweisung durchlaufen:
von x=1 bis x<11 und in
jedem Durchlauf wird x
um eins erhöht
Verzweigung durch
Abfrage von
Bedingungen. Ist Bedg.1
erfüllt (True), so wird
der erste Block von
Anweisungen
ausgeführt, sonst (else)
der zweite Block.
sind(90)=1
repeat (4){
…
…
}
while (x<0){
…
…
}
do{
….
…..
}
while(x<0)
for(x=1; x<11; x=x+1)
{
OutNum(0,LCD_LINE1,x);
Wait(500);
}
if (x<0) {
…
….
}
else{
…
}
TextOut(x,y,text, bool);
NumOut(x,y,zahl, bool)
ClearScreen();
ResetScreen();
Gibt den Text text auf
dem Display in Zeile y
und Spalte x aus. True,
wenn der Text, der
vorher im Dislpay war
gelöscht werden soll.
Sonst false
Gibt eine Zahl zahl auf
dem Display aus in Zeile
y und Spalte x. True,
wenn der Text, der
vorher im Dislpay war
gelöscht werden soll.
Sonst false
Löscht vorhergehende
Inhalte auf Display
Erneuert die Werte auf
dem Display
TextOut(1,2,“HALLO“, false);
Überprüft, ob ein
Button gedrückt wurde
am NXT
Button Exit = 0
Button right = 1
Button left = 2
Button center = 3
Und wieder losgelassen
(release = true)
x= ButtonPressed(2, true);
NumOut(1,2, 5, true);
Buttons auf NXT
bool
ButtonPressed(Button,
release)
Abbrechen
abort();
Stop(bedingung);
Timer
long time = CurrentTick();
Motorensteuerung
OnFwd(Ausgang,
Leistung)
OnRev(Ausgang,
Leistung)
Bricht das Programm ab
Bricht Programm ab,
wenn Bedingung erfüllt
also True liefert
Stop(x==0);
CurrentTick ist ein
Zähler, der in 1/1000
Sekunde zählt.
Time= CurrentTick()*1000;
Bewegt den Motor am
Ausgang x mit einer
Leistung von l in %
vorwärts (Werte von 100 bis 100 sind
möglich)
Bewegt den Motor am
Ausgang x mit einer
Leistung von l in %
rückwärts
OnFwd(OUT_A, 75);
OnFwd(OUT_AC, 75);
#Motor an Ausgang A und C werden mit 75%
vorwärts bewegt
OnRev(OUT_A, 75);
OnRev(OUT_AC, 75);
//Motor an Ausgang A und C werden mit 75%
rückwärts bewegt
Off(Ausgang)
RotateMotor(Ausgang,
Leistung, Drehwinkel)
MotorTachoCount(
Ausgang)
MotorRotationCount(
Ausgang);
ResetRotationCount(A
usgänge)
Float (Ausgang)
OnFwdReg(‘ports',‘spe
ed',‘regmode')
Motoren am Ausgang x
werden ausgeschaltet
Wie OnFwd nur wird
der Drehwinkel
angegeben
Gibt den Tachostand
zurück ->geht nicht, ist
irgendetwas für interne
Zwecke. Benutze
MotorRotationCount
Liefert als Wert den
insgesammt
zurückgelegten
Winkelwert zurück (also
360 wäre genau eine
Umdrehung)
Setzt den Zähler wieder
auf 0 (man muss aber
alle bewegten Ausgänge
wieder resetten. Wurde
also mit OUT_AB
gefahren, so muss
OUT_AB einen Reset
bekommen.
Motoren auschalten
und nicht abbremsen
(wie bei Off(Ausgang)
Geregelte Bewegungen
mit den Motoren
ausführen.
Es gibt 3 reg-modes:
Off(OUT_AC);
RotateMotor(OUT_AB, 75, 270);
MotorTachoCount(OUT_A);
X = MotorRotationCount(OUT_A);
ResetRotationCount(OUT_AB);
Float(Out_AB);
OnFwdReg(Out_AB, 50,
OUT_REGMODE_SYNC);
OUT_REGMODE_IDLE, �
keine PID-Reglung
OUT_REGMODE_SPEED �
die/der Motor wird über
die Geschwindigkeit
reguliert
OUT_REGMODE_SYNC. �
zwei Motoren werden mit
einander synchronisiert
Sensoren
Berührungssensor
SetSensorTouch(Port)
;
Sensor(Port);
Sensor am Port i
(i=1,..,4) initialisieren
und die Art des an dem
Port angeschlossenen
Sensors festlegen.
Man fragt den Zustand
des Touch Sensors ab.
Wenn Touch Sensor,
dann == 1 entspricht
„wurde gedrückt“
SetSensorTouch(S1);
x=Sensor(S1);
if (x ==1){
….
}
Lichtsensor
SetSensorLight(Port);
Sensor(Port);
Sensor am Port i
(i=1,..,4) initialisieren
und die Art des an dem
Port angeschlossenen
Sensors festlegen.
Man fragt den Zustand
des Licht Sensors ab.
Werte 0 bis 100 sind
möglich.
Sensor(Port);
PlayTone(a,b);
PlayToneEx(frequency,
duration, volume, loop);
Ultraschall Sensor
SetSensorLowspeed(Port
);
SensorUS(Port)
x=Sensor(S1);
if (x <30){
….
}
SetSensorType(S3,IN_TYPE_LIGHT_INACTIV
E);
SetSensorMode(S3,IN_MODE_PCTFULLSCALE)
;
ResetSensor(S3);
Lichtsensor klaibrieren
Soundsensor
SetSensorSound(Port);
SetSensorLight(S2);
Sensor am Port i
(i=1,..,4) initialisieren
und die Art des an dem
Port angeschlossenen
Sensors festlegen.
Man fragt den Zustand
des Geräusch Sensors
ab. Werte 0 bis 100 sind
möglich
Spielt einen Ton der
Frequenz a in der Zeit
von b msec
Genauerer Befehl zu
PlayTone
SetSensorSound(S3);
Sensor am Port i
(i=1,..,4) initialisieren
und die Art des an dem
Port angeschlossenen
Sensors festlegen.
SetSensorLowspeed(S4);
Wenn der Wert, den der
Ultraschallsensor
zurückliefert kleiner als
Wert ist, soll ein Block
ausgeführt werden
if(SensorUS(S4)<wert){
…
…}
else{
…
}
x=Sensor(S1);
if (x <30){
….
}
PlayTone(200,300);
Wait(400); //während des Tons nichts weiter
tun
PlayToneEx(200,500,50,2);
Subroutinen
sub name(int x…){…}
inline int name(int x…){
…
return x*x;
}
Parallele Tasks
mutex name
Precedes(task1, task2,…)
Oder start task1;
Acquire(name);
Release(name);
stop(name);
Eine Subroutine mit
dem Namen name wird
angelegt. Um Code, der
immer wieder
ausgeführt werden
muss nicht doppelt zu
schreiben und das
Programm
übersichtlicher zu
machen
Ähnlich einer
Subroutine, es kann
aber einen
Rückgabewert geben.
sub test(int x){
…..
}
Variable, auf die die
parallelen Prozesse
zugreifen können. Sie
wird aquiriert, dann
kann kein anderer Task
loslegen, erst wenn sie
wieder freigeb´geben
wurde. „Mutual
exchange“
Startet die Tasks in der
angegebenen
Reihenfolge und
Priorität
Wenn die
entsprechende mutex
variable frei ist, also
kein anderer Task sie
belegt, wird sie von dem
ausfrufenden task
belegt, solange, bis sie
explizit wieder
freigegeben wird
Freigeben der mutex
Variablen
Task beenden
mutex motor;
inline int Name( Args )
{
//body;
return x*y;
}
Precedes(turn1, turn2);
start turn3;
//beachte das Fehlen der Klammern der
Tasks
Acquire(motor);
Release(motor);
stop(turn1);
Zugehörige Unterlagen
Herunterladen