Declaració de variables i referència a elles:
Primer comentar que la memòria RAM de cada robot està composada de valors en coma flotant.
Per declarar una variable sola fem:
var nomvariable=5
Per referir-nos a ella en una instrucció posarem el nom de la variable on cal.
Per declarar un array:
var nomvariable=5,6,8,3
Aquí hem declarat un array i el punter de memòria amb la etiqueta 'nomvariable', apunta a la primera possició del array.
També es pot definir un array així:
var nomvariable=(10)
Aquí es crea un array de 10 posicions de memòria amb valor 0 en les 10 possicions.
Per fer referència a una variable de una posició cal especificar el nom de la variable.
Per exemple: add(suma,operador1,operador2) , especifica que sumi a la variable suma la variable operand1 amb operand2
Per fer referència a una variable en un array es pot fer: mov(variable[0],variable[index]) aquesta instrucció traspassa a la possició
de memòria definida per variable[0] (possició 0 de larray variable) el valor de la possició especificada per variable + index, sent index un altra variable.
Instruccions aritmètique i lògiques:
SUMA:add(operadorDesti,operador1,operador2)
RESTA:sub(operadorDesti,operador1,operador2)
MULTIPLICACIÓmul(operadorDesti,operador1,operador2)
DIVISSIÓdiv(operadorDesti,operador1,operador2)
MÒDUL:mod(operadorDesti,operador1,operador2)
NOMBRE ALEATORI:rnd(operadorDesti,operador_Interval_1,operador_Interval_2) el que fa és crear un nombre aleatori dins l'interval especificat per el segon i tercer operador inclossos.
FUNCIONS TRIGONOMÊTRIQUES (Treballen en angles i no en radiants):
sin(desti,nombre)
cos(desti,nombre)
tan(desti,nombre)
asin(desti,nombre)
acos(desti,nombre)
atan(desti,nombre)
ARREL QUADRADA: sqr(desti,nombre)
POTÊNCIES: sqr(desti,nombre,potencia)
VALOR ABSOLUT: abs(desti,nombre)
Lògica AND: and(desti,nombre1,nombre2)
Lògica OR: or(desti,nombre1,nombre2)
Comparació: (Compara dos nombres i si la comparació és verdadera posa un 1 al operador destí) cmp(desti,nombre1[comparador]nombre2)
Instruccions de salt i funcions:
Per fer un salt incondicional cap a una instrucció que està en una possició determinada cal especificar mitjançant la paraula lbl la etiqueta a la qual es vol saltar primer.
I amb l'instrucció: jump(etiqueta) es realitzarà el salt a aquella possició.
Els salts jump també poden fer-se si una comparació determinada es produeix: jump(etiqueta,variable<5)
Salts preprogramats (Bucle while i condicional if):
Hi han salts a instruccions que el compilador ja interpreta sol i agilitza la feina de programar.
El bucle WHILE:
Repeteix les instruccions de dins segons la condició posada entre parèntesi després de la paraula while.
Per tancar-lo es posa endwhile A continuació un exemple de bucle que mou un robot 5 cuadrants:
while(R0<5)
forward
add(R0,R0,1)
endwhile
El condicional IF:
Si es produeix la comparació simple entre parèntesi després de la paraula if, s'executen les seguents instruccions.
Si es posa un 'else', si no es produeix la comparació, s'executa el que hi ha entre el 'else' i el endif. El 'else' és optatiu.
Un exemple:
if (R0<4)
forward
else
left
endif
Sentencies PUSH i POP, definició de funcions i la seva crida
Les sentències 'push' i 'pop' còpien el valor del operador que porten en la pila de dades. La pila apila dades una darrera de l'altra amb la instrucció 'push' i les
recupera amb la instrucció 'pop' treient-les de la pila de manera que si faig:
push(R0)
pop(R1)
El que faig és posar a la pila el valor que contingui la possició de memòria R0 i treure de la pila aquest valor i dipossitar-lo en la possició R1.
Són molt útils per passar paràmetres a una funció i per retornar paràmetres per aquestes.
Les funcions es declaren amb el terme function seguit de la etiqueta que es vulgui. La seva crida es fa amb la instrucció 'call(etiqueta,[comparació optativa])'
Un exemple: Programa que crida una funció que avança tants cuadrants com se li passen com a paràmetre.El robot farà un cuadrat de 5 cuadrants de costat.
while(R0<4)
push(5)
call(endavant)
right
add(R0,R0,1)
endwhile
end
function endavant
pop(R1)
mov(R0,0)
while(R0< R1)
forward
add(R0,R0,1)
endwhile
return
Observem que usem la variable predefinida en el main i en la funció. Això podria donar efectes no dessitjats perque la funció altera cada vegada que se la crida
el seu valor però es que cada vegada que es crida una funció es salven les 10 variables predefinides (R0 a R9 ) en la pila i es tornen a recuperar
després en el return.
Observem que en el main sempre serà millor posar la instrucció 'end' per tal de acabar el programa perque si no, s'executaria la funció al acabar el bucle.
No hem de oblidar inicialitzar les variables que usem en la funció possant-les a 0 perque durant el bucle s'incrementa.
Instruccions de moviment i activitat del robot:
ENDAVANT: forward
GIRAR A LA DRETA: right
GIRAR A LA ESQUERRA left
AGAFAR BALISA grab
DESAR BALISA put
ACTIVAR PINZELL TERRE painton
DESACTIVAR PINZELL TERRE paintoff
Instruccions de detecció:
DETECCIÓ DEL NOMBRE DE CUADRANTS A UN OBJECTE: distance(variable,[-1 o 0 o 1]) el segon operador pot ser un valor entre -1 i 1 i representa la orientació del cap del robot en la que es fa la detecció. -1 és esquerra , 0 és en front i 1 és dreta.
DETECCIÓ DEL TIPUS D'OBJECTE I NOMBRE DE CUADRANTS: Detecta quin tipus de objecte es té al davant, mur (valor 1),balisa(valor 2) i robot (valor 3) i també la distància a la qual es troba.
object(variableTipusObjecte,variableDistanciaObjecte,orientacioCap)
POSICIÓ DEL ROBOT:position(variableX,variableY)
DIRECCIÓ DEL ROBOT:compass(variable) El terme variable és un nombre de 1 al 4. 1 és Nord, 2 Est, 3 Sud i 4 Oest.
ESTAT D'UN INTERRUPTOR DE TERRE:switchstate(variable_Estat[boleà], posicio_X,posicio_Y)
DETECCIO DEL COLOR BLANC EN TERRE FRONTAL:whiteinfront(variable_Es_Blanc[boleà])
Instruccions de comunicació entre robots:
La comunicació entre robots es fa mitjançant una ona de curt abast (cinc cuadrants). Si un robot envia un paquet de informació (una fracció de la seva memòria RAM)
els robots que estan en 5 cuadrants a la rodona rebrán aquest paquet.
Per enviar el paquet s'usa la instrucció send(posició_inici_RAM , nombre_posicions_a_transferir)
El paquet que s'envia es queda en un registre del o dels robots receptors que estan al seu abast. Aquest robots per llegir el paquet, han de executar la instrucció receive(posicio_memoriaRAM) La posició de memòria RAM que s'especifica és el punt en el que s'escriurà el paquet d'informació rebut.
El millor és fer un exemple:
El codi del robot que envia una fracció de la RAM:
var paquet=12,13,45,34
var confirmacio=0
send(paquet,4)
mov(R0,-1)
while(R0=-1)
receive(confirmacio)
endwhile
end
El codi del robot que rep el paquet:
var paquet=0,0,0,0
var ok=1
mov(R0,-1)
while(R0=-1)
receive(paquet)
endwhile
send(ok,1)
end
El primer codi envia un paquet amb els valors 12,13,45,34 i es queda en un bucle en espera de rebre una confirmació de que algun robot l'ha rebut.
El segon codi es queda en un bucle esperant rebre un paquet i envia llavors una confirmació al robot enviador.
És responsabilitat del programador crear el protocol de comunicació entre robots.
A més hi ha una instrucció auxiliar que el que fa és retornar un boleà si és possible enviar un paquet o no depenent de si el registre del robot receptor està ple o no.
Hem de tenir en compte que no es pot enviar dos paquet seguits a un mateix robot si aquest no ha executat la instrucció 'receive'.
Aquesta instrucció és cansend(variable_boleana)