SYGEN.EXE

Brevi cenni sul linguaggio di programmazione

Riportiamo qui un estratto della documentazione preliminare relativa al compilatore sygen.exe scritto per il predecessore di Wirobo. Il testo contiene anche riferimenti a parti hardware previste ma non ancora realizzate. E’ stato scritto in Basic Microsoft e gira sotto Windows Xp.

Per facilitare le connessioni della matrice sinaptica anche da parte di chi preferisce la programmazione software a quella hardware, è stato creato questo piccolo linguaggio di programmazione prendendo spunto dal BASIC che è il linguaggio di programmazione più semplice esistente. Il programma va scritto su una applicazione standard come il Notepad di Windows o qualsiasi altro editor di testo che non aggiunga formattazione supplementare (non vanno bene Word e simili).

Il testo poi verrà compilato con sygen.exe che avrà come uscita un file di testo chiamato <nomeprogramma>.obj dovre verranno scritte le connessioni da effettuare con le sinapsi. Questo esempio serve per chiarire il concetto:

Programma sorgente:

I1 = bumper_sx
IF bumper_sx THEN motore_sx : REM inverte il motore di sinistra
END

 

Programma compilato:

S1 > B4

 

dove S1 è l’ingresso della matrice e B4 è l’uscita. Notare che il segno > indica che il diodo va collegato con anodo su S1 e catodo su B4. Attenzione che se il segno è < allora il diodo va collegato inversamente!

 

Istruzioni

Ingressi

Gli ingressi fanno capo al connettore Input Bus ed Extended Input Bus che sono i connettori di ingresso della Matrice Sinaptica. I primi sono denominati con la lettera “I” seguiti da un numero (I1, I2, …) mentre gli altri sono seguiti da un’altra lettera in minuscolo (Ia, Ib, …)

I1

I2

I3

I9

Ia

Ib

Ic

SEQUENCER1

SEQUENCERn

 

Assegnazioni

Servono per personalizzare le label standard con un nome che esplica la funzione di quell’ingresso o il tipo di sensore a cui viene attaccato. Ogni etichetta non può contenere spazi ma può contenere questi simboli tra parentesi ( _ – )

<ingresso> = <Label>

es:

I1 = Bumper_Sx

<Nx> = <label>

es:

Na = Allarme

 

Funzioni Logiche

Le funzioni logiche sono solo due

AND

OR

 

Statements

REM <commento>  (documentazione del listato)

; (salto riga per aumentare la leggibilità. Può servire per aggiungere un remark sulla stessa linea. Tutto quello che segue viene ignorato fino al prossimo Line Feed)

IF [<ingresso> | <Label>] THEN [<neurone>|<Label>]

IF [<neurone> | <Label>] THEN [<ingresso>|<Label>]

DELAY<n>  (n = 1,2,3 inteso come sequenze di tempo)

SOUND<n>  (n = 1,2,3 tipo di suono da generare)

END  (fine programma)

 

Azioni

Le Azioni fanno capo al Functions Bus e all’ Extended Function Bus che sono i connettori di uscita della Matrice Sinaptica. I primi sono denominati con la lettera “U” seguiti da un numero (U1, U2, …) mentre gli altri sono seguiti da un’altra lettera in minuscolo (Ua, Ub, …). Di questi soltato le label dell’ Extended Function Bus possono essere assegnate a delle label personalizzate come per gli Ingressi.

START (motori)

STOP (motori)

Inv_sx_short (N1 – Inversione motore sx temporizzata)

Inv_sx_long (N2 -Inversione motore sx temporizzata)

Inv_msx (N3 – Inversione motore sinistro)

Inib_sx (N4 – Inibizione motore sinistro)

Dis_sx (N5 – Disimpegno verso sinistra)

Dis_dx (N6 – Disimpegno verso destra)

Inib_dx (N7 – Inibizione motore destro)

Inv_dx_long (N8 – Inversione motore dx temporizzata)

Inv_dx_short (N9 – Inversione motore dx temporizzata)

Inv_mdx (N10 – Inversione motore destro)

Na (funzione a)

Nb (funzione b)

Nc (funzione c)

Nd (funzione d)

SOUND1 (suono n°1 – SG1)

SOUND2 (suono n°2 – SG2)

SOUND3 (suono n°3 – SG3)

DELAY1 (uscita sequencer n°1 – SU1)

DELAY2 (uscita sequencer n°2 – SU2)

DELAY3 (uscita sequencer n°3 – SU3)

 

Esempio di programma

Programma sorgente:

REM Dichiarazione risorse hardware
;
MATRIX (matrice sinaptica)
SEQUENCER1 (sequencer n°1)
SOUND (generatore di suoni)
;
REM assegnazione di ingressi e neuroni
;
S1 = bumper_sx
S2 = bumper_dx
S3 = bumper_centrale
S4 = sens_scale
S5 = suono
Sa = Low_Battery
Na = Alarm
;
REM programma
;
IF bumper_sx THEN motore_sx ; REM inverte il motore di sinistra
IF bumper_dx THEN motore_dx ; REM inverte il motore di destra
IF bumper_centrale THEN Inv_sx_short AND Inv_dx_long
IF sens_scale THEN Inv_dx_long
;
IF suono THEN STOP AND SEQUENCER1; REM si ferma e genera una seq. di toni
DELAY1.1 = SOUND1
DELAY1.2 = SOUND2
DELAY1.3 = SOUND3
;
REM Con il segnale di batteria scarica ferma i motori e attiva
REM l'allarme collegato al morsetto Na (extended output bus)
;
IF Low_Battery THEN STOP AND Alarm
;
END

 

Programma compilato:

Inizio compilazione del 03.07.2006
Disposizione delle sinapsi sulla matrice.
Il segno > determina il verso del diodo.
 
S1 > N3
S2 > N10
S3 > N1
S3 > N8
S4 > N8
S5 > X1
S5 > SI1
SU1 > SG1
SU2 > SG2
SU3 > SG3
Sa > stop
Sa > Na
 
Fine compilazione

 

Limitazioni attuali e caratteristiche della programmazione

La programmazione del robot ha delle limitazioni dovute alla sua struttura parallela particolare. Alcune di queste sono:

  • Non ci sono for-next perche non ci sono operazioni cicliche.

  • Le istruzioni AND e OR non sono “operatori booleani”. L’istruzione AND è applicabile solo in uscita mentre l’istruzione OR è applicabile solo in ingresso. Questa limitazione è legata alla logica DRL (Diode Resistor Logic).

  • Non possono essere messe istruzioni in sequenza perchè non è ancora disponibile il “sequencer”. In realtà anche se le istruzioni vengono scritte sequenzialmente nel listato, queste vengono eseguite in parallelo. Se non correttamente scritte potrebbero aversi dei funzionamenti inattesi a causa della sovrapposizione degli effetti, anche se il compilatore dovrebbe trovare gli errori più comuni.

  • Ogni riga di programma può finire con un LF+CR (return) o con un punto e virgola se è presente successivamente una riga di commento.

  • Spazi e TAB nelle righe di programma vengono ignorati durante la compilazione.

  • Le etichette (label) non possono contenere al loro interno gli spazi, ma possono contenere il segno meno (-) o il segno di sottolineatura (_). Es: etichetta_1 , label-2 .

 


 

Lascia un commento