Accueil

QUELQUES FONCTIONS UTILES du LANGAGE SPIN

 

Nous avons déja utilisé une dizaine de fonctions du langage SPIN, sans vouloir faire un liste détaillée des fonctions (il y a pour cela le manuel du Propeller , téléchargeable depuis Parallax.com) voyons de plus prés quelques fonctions qu'on utilise souvent.

REPEAT (noter que cette fonction est la plus utilisée dans nos programmes !)

elle repéte ce qui est écrit ensuite (il faut que les lignes a répéter soient décalées a droite , mais elle a de nombreuses variantes:

si on écrit REPEAT 10 la répétition se fera 10 fois

si on écrit REPEAT NFOIS la répétition dépendra de la valeur qui sera sztockée dans Nfois

si on écrit REPEAT index from 2 to 7 on répétera 6 fois

si on écrit REPEAT index from 0 to 8 step 2 la répétion se fera en fait 5 fois et index variera de 2 a chaque fois

si on écrit REPEAT WHILE X<10 on répétera tant que x<10

si on écrit REPEAT UNTIL X>9 on répétera jusqua ce que X soit > 9

CASE

permet de choisir d'exécuter tel ou tel méthode en fonction de la valeur d'une variable, par exemple si on reçoit par IR un code de commande

CASE code

1:avancer

2:reculer

....

CLKFREQ

clkfreq n'est pas une fonction c'est une variable qui renferme la fréquence actuelle de l'horloge du Propeller

son intéret essentiel est son utilisation pour donner des délais de durée d'une attente (par Waitcnt) qui ne dépenderont pas de changements éventuels de la vitesse de cette horloge

une duée d'attente égale a clkfreq "ticks" de l'horloge vaut toujours une seconde

WAITCNT

crée un délai par exemple pour laisser une patte sur ON , ou OFF pendant un certain temps

utilise un compteur interne du Propeller (cnt) pour compter les" ticks"

waitcnt(800_000 +cnt) : attend 800_000 ticks d'horloge , mais ce temps change si on change la vitesse d'horloge

waitcnt(clkfreq/50 + cnt) : on attendra toujours 20 millisecondes

IF...ELSEIF...OTHER

if condition1 : si la condition mentionnée est vraie on exécute la ligne suivante

elesif condition2 sinon on envisage la possibilité suivante

et on continue jusqu'a la ligne other : on exécute ce qui est écit ici si aucune des conditions précédentes n'est vraie (on peut ne rien mettre en face de "other:"

exemple :

if (obstacledroit =1)

tourner_a_gauche

elseif (obstaclegauche=1 tourner_a_droite

elseif (obstaclegauche=1) AND (obstacledroit =1)

reculer

other: ne_rien_faire (continuer a rouler en avant)

RESULT

une fonction renvoie toujours un résultat et ce résulat est dans la variable RESULT

mais on peut choisir un nomplus évocateur pour la valeur renvoyée en lui donnant un nom par exemple "resultat"

PUB mafonction: resultat

ici des calculs

résultat= bilan

RETURN

on a vu qu'une fonction renvoie toujours un résultat et ce résulat est dans la variable RESULT

on peut écrire en fin de fonction RETURN mais ça najoute rien: le Spin le fait automatiquement

par contre c'est utile si on prévoit de sortir éventuellement de la fonction avant sa derniére ligne si certains cas se oprésentent

exemple:

PUB diviser (dividende,diviseur)

if diviseur == 0

afficher _erreur_division_par_zero

return 0

return (dividende/diviseur)

AND

réunit deux conditions et ne renvoie vrai que si les deux sont vraies

if (température> 20) AND (chauffage=ON)

arreter_chauffage

OR

réunit deux conditions et renvoie vrai si au moins l'une des deux est vraie

if( obstacle_devant) OR (vide_devant)

faire_dei_tour

NOT

renvoie vrai si la condition est fausse

if NOT(nouveaucode)

attendre_un_nouveaucode

les fonctions de comparaison (souvent utilisées avec IF ):>, >,==,<>

on notera que la condition égal s'écrit == (l'attribution de valeur s'écrit varuiable:=valeur)

le <> veut dire différent de

#> supérieur a une limite

utile pour ne pas tomber en dessous drune limite lorsqu'un programme diminue progressivement une variable

impulsionservomoteur:= ancienneduree - offset #> 1450 'quand on freine progressivement un servomoteur en marche avant

#< inférieur a une limite

utile pour ne pas dépasser une limite lorsqu'un programme augmente progressivement une variable

impulsionservomoteur:= ancienneduree +offset #< 1650 'quand on accélére progressivement un servomoteur

les fonctions mathématiques courantes sur les nombres entiers

on peut utiliser : +, -, / , *

pour les nombre décimaux il y a des objets contenant les fonctions utiles