corso F L O
WCOD
Flowcode permette
di apprendere in
maniera molto
intuitiva lo sviluppo
di software per
applicazioni
embedded, in
quanto il codice
viene scritto facendo
uso di oggetti
grafici, in luogo dei
classici linguaggi
di programmazione
come il C e
lAssembler.
Prima puntata.
corso di programmazione in
F L OWCODE
di Francesco Ficili e Daniele Defilippi
127
Fig. 1
Logo della Matrix
Multimedia.
Fig. 2
Esempio
di codice
Flowcode.
cors
o
F
L
O
W
CO
e 18 (8-bit),
Microchip dsPIC30F, dsPIC33F, dsPIC33E e PIC24 (E, H ed F),
Atmel AVR e piattaforma Arduino,
Atmel ARM.
DE
128
corso F L O
WCOD
Fig. 3
Sito Matrix
multimedia
per download
di FlowCode.
129
Fig. 8
Schermata
iniziale
installazione
driver per
E-block
EB006.
cors
o
F
L
O
W
CO
DE
130
corso F L O
WCOD
Fig. 9
Interfaccia
FlowCode.
131
Fig. 10
Barre degli
strumenti.
Fig. 11
Barre
delle
icone.
Fig. 12
Opzioni di progetto.
132
Fig. 13
Inserimento
descrizione
progetto.
DE
Creare un progetto
Per creare un progetto apriamo Flowcode
e premiamo sul pulsante Nuovo progetto
nella barra degli strumenti. Configureremo
questo progetto in modo da poterlo utilizzare negli esempi che vedremo in seguito.
Selezioniamo il microcontrollore scegliendo la famiglia 18 e successivamente
cors
o
F
L
O
W
CO
corso F L O
WCOD
Fig. 14
Impostazioni generali
nuovo progetto.
un blocco. Come prima operazione inseriamo il blocco di gestione delle uscite del
microcontrollore, trascinando allinterno
dellarea di progetto licona uscita, (presente nella barra delle icone) tra i blocchi
di INIZIO e FINE, gi presenti di default
allinterno del diagramma. Cliccando
con il tasto destro sul blocco che abbiamo
inserito appare la finestra a scomparsa di
Windows. Scegliamo lopzione Propriet
ed esaminiamo la finestra che si aperta,
riportata per comodit nella Fig. 16.
Possiamo ora impostare tutte le propriet disponibili per il blocco che abbiamo
selezionato. Il blocco utilizzato per
controllare lo stato delle uscite del nostro
microcontrollore. Nella lista a scorrimento Port possiamo selezionare la porta
della quale vogliamo modificare il valore
133
Fig. 15
Configurazione
specifica del
microcontrollore.
Fig. 16
Propriet
blocco uscita.
Fig. 17
Propriet
blocco
ritardo.
cors
o
F
L
O
W
CO
Fig. 18
Struttura
decisionale
binaria e
panello di
configurazione
del confronto.
DE
134
corso F L O
WCOD
Fig. 19
Struttura
di selezione
multipla.
135
Fig. 20
Ciclo
while
(Finch
vero).
nella cella a fianco dellimpostazione Numero cicli:. Il blocco fondamentale quando abbiamo bisogno che una porzione del
nostro diagramma di flusso venga eseguita
per un numero predefinito di volte.
Esempio pratico:
facciamo lampeggiare un LED
Ora che conosciamo i blocchi principali e le
possibili variazioni per il controllo di flusso, possiamo implementare un semplice
diagramma per far lampeggiare un LED.
Per realizzare questo esempio abbiamo
bisogno dei seguenti componenti:
- EB006 USB PICmicro multiprogram-
cors
o
F
L
O
W
CO
Fig. 23
Scheda EB006
a sinistra e
scheda
E-Blocks
EB004 a
destra.
DE
136
corso F L O
WCOD
Fig. 24
Metodo per la rimozione del
microcontrollore PIC.
mer board
- EB004 LED Board
- PIC18F4550
- Quarzo 12MHz
La scheda EB006 contiene il
microcontrollore e lhardware necessari
per interfacciarsi con le altre schede EBlocks e il PC dal quale lo programmiamo;
deve essere configurata per poter essere
utilizzata nel nostro esempio. I jumper di
selezione dellalimentazione devono essere
posizionati sul lato di sinistra, in modo
da far s che lalimentazione provenga
dallUSB. Il jumper di programmazione
deve anchesso essere settato su USB, in
modo da poterlo programmare direttamente da PC, senza lausilio del programmatore ICSP della Microchip. Sostituiamo
ora il microcontrollore che attualmente
montato sulla scheda con il PIC18F4550.
Questa operazione molto delicata, quindi dobbiamo prestare molta attenzione nel
rimuovere il microcontrollore senza danneggiare la scheda di sviluppo. Per evitare
danni aiutiamoci con il tappo di una biro
ed eseguiamo loperazione come indicato
nella sequenza di Fig. 24.
Facendo attenzione alla direzione dellalloggiamento a 40 pin, inseriamo il PIC18F4550, assicurandoci che tutti i piedini
entrino senza piegarsi, allinterno dello
zoccolo. Per piegare correttamente i piedini del PDIP40, possiamo aiutarci con il
piano della nostra scrivania, appoggiando
il PDIP di traverso e facendo leva sul case,
finch i piedini risultano paralleli al bordo.
A questo punto sostituiamo il quarzo
Fig. 25
Configurazione
selettori e jumper
scheda EB006.
Jumper selezione
alimentazione
Jumper selezione
Programmatore
Jumper selezione
funzione pin oscillatore
Selettore
oscillatore
137
Fig. 26
Configurazione
completa per la
realizzazione
dellesempio.
138
DE
Fig. 27
Diagramma di flusso per il
lampeggio del led collegato
alla porta A pin 0.
cors
o
F
L
O
W
CO
vedremmo a causa dei fenomeni fisici interni al nostro occhio il LED sempre
acceso, ma con unintensit
minore rispetto a quella massima. Per evitare
questo problema inseriamo
un blocco di ritardo dopo
il set a uno della porta e
un altro identico - dopo
il blocco di set a zero della
porta. Impostiamo il valore
del ritardo a 1 secondo per
entrambi i blocchi inseriti.
Se avete eseguito tutto
correttamente dovreste
ottenere un diagramma
di flusso simile a quello
riportato in Fig. 27.
Il nostro flusso ora pronto per essere caricato sulla
scheda. Salviamo il progetto premendo il pulsante
salva progetto nella barra
degli strumenti perch lo
riutilizzeremo in seguito
come base di partenza
per altri esempi. Premiamo il pulsante compila e
trasferisci per caricare il
programma allinterno del
microcontrollore presente sulla nostra scheda di
sviluppo. Attendiamo che
il programma esegua le
operazioni e al termine
del caricamento potremo
notare che il nostro primo
programma viene eseguito
sulla scheda con il LED che
si accende e si spegne ogni
g
secondo.
corso F L O
WCOD
Continuiamo il
nostro viaggio alla
scoperta di Flowcode,
linnovativo sistema
di sviluppo grafico
per microcontrollori
proposto da Matrix
Multimedia. Flowcode
permette di sviluppare
con facilit il software
per applicazioni
embedded in quanto
il codice viene scritto
facendo uso di oggetti
grafici, in luogo dei
classici linguaggi di
programmazione come
il C e lAssembler.
Seconda puntata.
corso di programmazione in
F L OWCODE
di Francesco Ficili e Daniele Defilippi
113
Fig. 1
Progetto
Flowcode
con pannello
esplora
progetto
visibile sulla
destra della
schermata.
114
Rimozione di
variabili/costanti
Qualora volessimo cancellare
una variabile o una costante
sufficiente selezionare con il
mouse lelemento desiderato
dal pannello esplora progetto,
allinterno della sezione Globali, e premere il pulsante
Canc. Al termine del progetto potrebbe risultare molto
utile rimuovere tutte quelle
variabili/costanti che risultano incluse nella lista, ma
non sono utilizzate allinterno
del nostro progetto. Per far
ci basta cliccare con il tasto
destro su Variabili o Costanti allinterno del pannello
Esplora progetto e scegliere
DE
Aggiungere costanti
Alla creazione di un nuovo
progetto sono gi presenti
due costanti pre-configurate:
false e true, rispettivamente ai valori 0 e 1. Per ag-
cors
o
F
L
O
W
CO
Aggiungere variabili
Per aggiungere una nuova
variabile dobbiamo posizionare il mouse sulletichetta
variabili e cliccare con
il tasto destro in modo da
poter scegliere dal menu a
tendina la casella aggiungi
nuovo, come mostrato in
Fig. 2.
Premendo sul pulsante Aggiungi nuovo viene aperta
la finestra di creazione di
una nuova variabile, come
evidenziato in Fig. 3.
I tipi di dati finora supportati spaziano da logici a
numerici, con o senza segno,
numeri a virgola mobile e
stringhe. Per configurare la
variabile dobbiamo inserire
il nome, il valore iniziale,
una breve descrizione e il
tipo. Premendo il pulsante
OK la variabile viene creata e aggiunta alla lista nella
finestra di esplorazione del
progetto.
corso F L O
WCOD
Fig. 5
Blocco di
ingresso e
finestra di
configurazione
115
Fig. 8
Finestra
propriet del
blocco calcolo.
Parentesi
= , <>
Uguale a, diverso da
+ , - , * , / , MOD
>>, <<
~,&,|,^
&& , || , !
byte = isinf(float)
byte = isnan(float)
int = random()
Fig. 9
Esempio di
calcolo per
conversione di
unit di misura
da pollici in
centimetri.
cors
o
F
L
O
W
CO
DE
116
corso F L O
WCOD
Fig. 10
Barra dei componenti.
Fig. 11
Principali
componenti
disponibili in
Flowcode.
117
Fig. 12
Inserire il
componente
LED
utilizzando
la Barra dei
componenti.
Fig. 13
Menu
connessioni
relativo al
componente.
cors
o
F
L
O
W
CO
DE
118
corso F L O
WCOD
Fig. 15
Macro
disponibili
per il
componente
LED.
Fig. 14
Esempio
di connessione per il
componente
LED.
119
Fig. 19
Finestra
connessioni
del componente
LED.
cors
o
F
L
O
W
CO
Fig. 18
Finestra
connessioni del
componente
keypad.
DE
120
corso F L O
WCOD
Fig. 20
Finestra di propriet
del componente.
Fig. 21
Creazione della
variabile di
LetturaKeypad.
Fig. 22
Schema a blocchi parziale
del progetto.
121
Fig. 23
Macro LED0.
cors
o
F
L
O
W
CO
Fig. 26
Schema a blocchi
complessivo.
Fig. 24
Propriet
del
componente
LED.
DE
122
corso F L O
WCOD
Continuiamo il
nostro viaggio alla
scoperta di Flowcode,
linnovativo sistema
di sviluppo grafico
per microcontrollori
proposto da Matrix
Multimedia. In questa
puntata ci occupiamo
dellimplementazione
degli interrupt in
Flowcode e iniziamo ad
analizzare i componenti.
Terza puntata.
corso di programmazione in
F L OWCODE
di Francesco Ficili e Daniele Defilippi
129
Fig. 1
Propriet
del blocco
interrupt.
DE
130
cors
o
F
L
O
W
CO
corso F L O
WCOD
Fig. 2
Propriet
interrupt
timer 2.
Fig. 3
Flowchart della macro LED.
131
Fig. 4
Finestra
connessioni del
componente
ADC.
Fig. 5
Propriet
extra del
componente
ADC.
Descrizione
LeggiComeByte
Il valore del canale selezionato acquisito e il risultato fornito con formato numerico e 8-bit di risoluzione.
LeggiComeIntero
Il valore del canale selezionato acquisito e il risultato fornito con formato numerico e 10-bit o 12-bit di
risoluzione (a seconda del convertitore).
LeggiComeTensione
Il valore del canale selezionato acquisito e il risultato fornito con formato in tensione (il valore deve
essere immagazzinato in una variabile di tipo float).
LeggiComeStringa
il valore del canale selezionato acquisito e il risultato fornito come stringa di caratteri (il valore deve
essere immagazzinato in un array di caratteri).
cors
o
F
L
O
W
CO
Il componente LCD
Passiamo ora allanalisi del componente
LCD, che ci permetter di aggiungere
un output visuale ai nostri progetti. Il
componente LCD permette di gestire un
display a cristalli liquidi con controller
Hitachi HD44780 (noto anche come Hitachi compatibile); questa interfaccia costituisce lo standard de facto per gli LCD alfanumerici monocromatici con interfaccia
parallela. In particolare, il componente
sfrutta la configurazione parallela a 4-bit,
in modo da poter impiegare una singola
porta per il controllo del dispositivo (oltre
ai 4 bit di dato vengono infatti utilizzati 2
segnali di controllo).
Il componente LCD pu essere inserito
dalla barra dei componenti, selezionando, sotto la voce uscite, il componente
LCD. Una volta eseguita questa operazione, allinterno del pannello verr
posizionata limmagine di un display
alfanumerico 16x2. Come per gli altri
componenti visti in precedenza, anche
per il componente LCD sono disponibili
le solite propriet connessioni e propriet extra. Se clicchiamo sulla voce
connessioni, comparir la finestra di Fig.
6, che ci permette di configurare le connessioni del display. Da questa finestra
DE
132
corso F L O
WCOD
Fig. 6
Connessioni del
componente
LCD.
Fig. 7
Propriet
extra del
componente
LCD.
Descrizione
Inizio
Inizializza il display.
Trasparente
VisualizzaASCII
Comando
Cursore
Posiziona il cursore alla posizione indicata dai due argomenti x e y (coordinate del cursore).
VisualizzaNumero
VisualizzaStringa
CancellaLinea
Scrivi_RAM
133
Fig. 8
Propriet
extra del
componente
EEPROM.
Tabella 3
Nome Macro
Descrizione
Read
Legge la locazione di memoria specificata con il parametro address e ritorna il valore letto nella variabile
di ritorno.
Write
cors
o
F
L
O
W
CO
Fig. 9
Collegamento E-Blocks
per la realizzazione del
progetto pratico.
DE
134
corso F L O
WCOD
Fig. 11
Connessioni
del
componente
ADC.
Fig. 10
Collegamento
LM335.
135
Fig. 12
Connessioni
display LCD.
Fig. 13
Creazione
della
variabile
Tensione.
Fig. 14
Macro
Inizializzazione.
cors
o
F
L
O
W
CO
DE
136
corso F L O
WCOD
Fig. 15
Flowchart della macro
Acquisisci LM335.
Fig. 16
Finestra
propriet
del blocco
Chiamata
Macro
Componente.
137
Fig. 17
Conversione
del dato in
tensione nel
corrispondete
valore di
temperatura.
Fig. 18
Flowchart della macro
VisualizzaTemperatura.
cors
o
F
L
O
W
CO
Fig. 19
Flowchart principale
dellesempio pratico
Termometro LCD.
DE
138
corso F L O
WCOD
Continuiamo il nostro
viaggio alla scoperta
di Flowcode, il sistema
di sviluppo grafico
per microcontrollori
proposto da Matrix
Multimedia, in cui il
codice viene scritto
facendo uso di oggetti
grafici.
Quarta puntata.
corso di programmazione in
F L OWCODE
di Francesco Ficili e Daniele Defilippi
113
Fig. 1
Pannello
SPI.
consigliabile sulle grandi distanze, in quanto richiederebbe molti fili e -per contrastare
il degrado del segnale- lamplificazione
per ciascuno di essi; per questa ragione
che sono state inventate le comunicazioni seriali, nelle quali il valore digitale da
trasmettere suddiviso in singoli bit, che
sono trasmessi in ordine sequenziale sullo
stesso canale di trasmissione, impiegando
quindi due soli fili. Possiamo suddividere
i sistemi di comunicazione in due grandi
famiglie, in base alla distanza che riescono
a coprire: quelli interni permettono la comunicazione tra sistemi vicini o comunque
appartenenti allo stesso sistema, mentre
quelli tra sistemi collegano apparati con
compiti solitamente differenti su distanze
anche molto ampie. Inizieremo parlando di
quelli interni ed in particolare di SPI, IC e
OneWire. Successivamente passeremo alla
descrizione della RS232, interfaccia con la
quale realizzeremo un progetto pratico.
Fig. 2
Pannello di
configurazione del
bus SPI.
cors
o
F
L
O
W
CO
DE
114
corso F L O
WCOD
Descrizione
Rappresenta la velocit di trasmissione dei dati. Deve obbligatoriamente essere minore di quella supportata
dal componente pi lento collegato al bus di comunicazione. Facciamo un semplice esempio supponendo
che il componente slave supporti una velocit massima di comunicazione di 300 kHz ed il microcontrollore
abbia una frequenza di oscillazione pari a 4 MHz.
SPI Clock
Dividendo la frequenza massima della comunicazione per la frequenza di oscillazione del microcontrollore,
otteniamo il rapporto massimo che vi pu essere tra le due grandezze e scegliamo il valore pi grande, tra
quelli disponibili nel menu a tendina, che risulta minore del risultato della frazione.
SPI Clock polarity
Serve per scegliere se il dato scritto durante il fronte di salita o discesa del segnale di clock.
Indica quando il dato deve essere campionato per poter effettuare una corretta trasmissione/ricezione del
dato da tutti i dispositivi collegati. In pratica, modifica il punto di campionamento del dato.
Descrizione
utilizzata per inizializzare le periferica di comunicazione SPI. Solitamente posta
ad inizio programma e viene chiamata una volta sola.
SPI_Send_Char
SPI_Get_String
SPI_Send_String
SPI_Get_Char
SPI_Unint
Descrizione
DAC_Send_Char
NVM_Send_Char
Invia un dato alla memoria EEPROM che verr caricato allinterno della cella selezionata.
NVM_Get_Char
FramOutput
EnableFRAM
DisableFRAM
115
Fig. 3
Pannello del
componente
I2C Master.
Descrizione
Attiva il controllo sullo slew-rate (velocit dei fronti) del segnale trasmesso sul bus.
Abilita lutilizzo del SMBus sulla connessione IC (modalit di compatibilit).
Baud rate
Imposta la frequenza con la quale vengono trasmessi i dati sul bus di comunicazione. Deve obbligatoriamente, come visto per il bus SPI, essere minore della velocit massima supportata dal componente pi
lento collegato al bus. Possono essere utilizzati i valori pre-configurati (preset), oppure dei valori custom
scelti utilizzando la barra a scorrimento.
IC2 hardware
Seleziona quale periferica, messa a disposizione dal microcontrollore, coinvolta nella trasmissione dei
dati. Qualora ve ne fossero pi di una disponibili, come mostrato in Fig. 4, possono essere inseriti due
componenti IC, ciascuno su un differente canale in modo da avere due bus distinti di comunicazione.
Fig. 4
Propriet del
componente
I2C master.
cors
o
F
L
O
W
CO
DE
116
corso F L O
WCOD
Descrizione
Inizializza la periferica interna di comunicazione IC. Deve essere chiamata uno volta prima di
eseguire le altre macro altrimenti non verrebbe trasmesso/ricevuto alcun byte.
Invia il segnale di start della comunicazione sul bus IC.
Invia il segnale di riavvio della comunicazione sul bus IC.
Invia il segnale di stop della comunicazione sul bus IC.
MI2C_Transmit_Byte
Trasmette un byte sul bus di comunicazione. Restituisce zero se rileva la ricezione di una
conferma di ricezione acknowledge.
MI2C_Receive_Byte
Riceve un byte dal bus di comunicazione. Necessita della valorizzazione del parametro che, se
posto a uno, indica che il byte da ricevere lultimo.
MI2C_Send_Byte_Transaction
MI2C_Receive_Byte_Transaction
Invia ad uno specifico dispositivo il valore che deve essere posto allindirizzo indicato.
Riceve da uno specifico dispositivo il valore caricato allindirizzo di memoria scelto.
La porta OneWire
Il bus OneWire stato realizzato da Dallas
Semiconductor per consentire comunicazioni tra due o pi dispositivi attraverso
un unico filo di interconnessione. Non
essendoci un filo dedicato per la trasmissione del segnale di sincronizzazione,
questultimo deve essere trasmesso assieme ai dati.
Per evitare problemi di cortocircuiti sulla
linea presente un pull-up, cio una
resistenza collegata tra la linea e lalimentazione, e tutti i dispositivi possono
imporre uno zero sulla linea attivando il
transistor/MOSFET di pilotaggio della
porta connessa. La velocit di comunicazione non elevatissima ( prefissata a 16
kbps), tuttavia permette comunicazioni tra
dispositivi in modo davvero semplice.
Si tratta di un bus di tipo Master/Slave,
dove ogni dispositivo ha un indirizzo
univoco e questo deve essere utilizzato dal
master per iniziare la comunicazione con
lo slave.
La codifica dei simboli differisce notevolmente dai casi esaminati in precedenza,
perch sono codificati in base alla lunghezza dellimpulso, come indicato in
Tabella 6.
Nel caso di ricezione, cio durante la
comunicazione di dati dallo slave verso il
master, lo slave mantiene la linea al valore
0 per 60 s qualora voglia inviare un valore logico zero mentre non fa nulla se intende inviare il valore logico uno a seguito di
ogni impulso generato dal master.
Reset
Valore logico uno
115 s linea a 0
60 s linea a 0
Fig. 5
Propriet del
componente
OneWire.
117
Descrizione
Invia un comando di reset e restituisce uno se nessun dispositivo risulta resettato oppure non vi sono
dispositivi collegati al bus.
oo_BusReset
oo_GetPadByte
Restituisce il dato letto dal dispositivo identificato dal parametro passato alla macro;
I dispositivi letti sono al massimo 9 ed il parametro pu variare da 0 a 8 se un dispositivo risulta resettato
oppure non vi sono dispositivi collegati al bus.
oo_Tx_Byte
oo_Rx_Byte
oo_ScanBus
Esegue una scansione del bus per lidentificazione del numero di dispositivi. Restituisce 1 se vi sono stati
dei problemi durante la scansione.
oo_Get_DeviceCount
Restituisce il numero di dispositivi rilevati sul bus dopo un comando di scansione del bus.
Legge il dispositivo identificato dal numero in ordine di scansione.
oo_ReadDevice
Descrizione
DS1820_Start_Conversion
Avvia la conversione del dato del dispositivo DS1820. Restituisce uno se il dispositivo entrato in
time-out senza terminare la conversione.
DS1820_Read_Scratchpad
Legge i valori dal dispositivo DS1820. Pu essere utilizzata unicamente qualora vi sia un unico
dispositivo collegato al bus altrimenti necessario utilizzare la macro oo_ReadDevice.
DS1820_Get_Temp
cors
o
F
L
O
W
CO
DE
118
corso F L O
WCOD
Descrizione
SendRS232Char
SendRS232String
ReceiveRS232Char
Riceve un carattere sulla seriale. La macro accetta come parametro il valore del tempo massimo di attesa del
dato e qualora non venga ricevuto entro il tempo massimo indicato restituisce il valore INVALID_RETURN (255).
ReceiveRS232String
ChangeHWBaud
Velocit
1200 bps
2400 bps
4800 bps
9600 bps
19200 bps
38400 bps
57600 bps
115200 bps
119
Fig. 8
Assemblaggio dei
moduli necessari
a pilotare una
batteria di rel
attraverso la
connessione
RS232.
Ora che abbiamo steso le direttive principali per realizzare il nostro progetto, passiamo allidentificazione dei componenti
necessari per la realizzazione, che sono:
Fig. 10 - Configurazione del componente LED array.
DE
120
cors
o
F
L
O
W
CO
corso F L O
WCOD
Fig. 11 - Main
del programma
di controllo.
-
EB006 USB PICmicromult
iprogrammerboard(PIC18F4580 e
quarzo 12 MHz);
-
EB038 Relay Board;
-
EB015 RS232 Board.
Colleghiamoli in modo da avere la scheda
EB038 sulla porta A e la EB015 sulla porta
C, come mostrato in Fig. 8.
Le schede devono essere alimentate per
poter funzionare correttamente, perch
attraverso il connettore DB9 passano solo le
connessioni dati ed il riferimento di massa
perci, utilizzando dei fili da prototipazione, colleghiamo tutti i morsetti con indicato
+V al corrispondente morsetto della scheda EB006. Posizioniamo, inoltre, i connettori di patch in posizione C e 2 per la scheda
EB038, e in posizione LOW per la scheda
EB015. Le altre configurazioni della scheda
121
Fig. 12
Macro
Controlla Comando.
Fig. 13
Macro
di Inizializzazione.
122
Stato Rel 1
Stato Rel 2
Stato Rel 3
Stato Rel 4
DE
cors
o
F
L
O
W
CO
Main
Il main contiene la chiamata alla macro di
inizializzazione, oltre ad un ciclo infinito
nel quale viene richiesta una lettura da
seriale ed analizzato il carattere ricevuto:
quindi, ogni volta che viene ricevuto un
carattere da seriale, esso viene analizzato.
Dopo la ricezione e lanalisi ci sono tre
possibilit:
il carattere <, allora viene azzerata la
stringa che contiene il carattere ricevuto;
il carattere >, allora la stringa di
comando stata ricevuta completamente
e quindi viene controllato il comando
attraverso la specifica macro; al termine
corso F L O
WCOD
Macro ControllaComando
Realizza il controllo del comando ricevuto
come parametro, lo esegue nel caso sia stato ricevuto correttamente e, in ogni caso,
invia una risposta sulla linea seriale. Nella
prima parte della macro vengono estrapolati dalla stringa il carattere di comando
ed il parametro associato. Viene fatto un
controllo sul valore del parametro (che nel
nostro caso deve essere compreso tra 1 e
4) e successivamente, in base al carattere
del comando, viene eseguita loperazione
di accensione, spegnimento o lettura del
rel. Gli stati del rel sono memorizzati in
un vettore globale di appoggio chiamato
StatoRele. Al termine dellesecuzione,
prima di ritornare il controllo alla funzione
chiamante, la macro invia la risposta utilizzando la macro SendRs232String.
Lintero diagramma visibile in Fig. 12.
Macro Inizializza
utilizzata per inizializzare lo stato dei
rel e le variabili di appoggio del programma. In questo caso lunica variabile
che deve essere azzerata il vettore con lo
stato dei rel StatoRele che, per essere concorde allo stato fisico, deve essere
impostato a zero. Il diagramma Flowcode
rappresentato nella Fig. 13.
Interfaccia Software
Per lutilizzo della scheda rel appena
realizzata stata sviluppata unapposita
interfaccia software, scritta in Labview
2010. Linterfaccia permette sia il controllo
manuale dei 4 rel, sia lesecuzione di sequenze automatizzate. Subito dopo lavvio
dellinterfaccia possiamo scegliere tra le due
modalit, mediante un radio button posto
in basso, sulla destra del pannello. Uno scre-
Fig. 16
Esempio di file
.cvs.
123
corso F L O
WCOD
Continuiamo il
nostro viaggio alla
scoperta del sistema
di sviluppo grafico
per microcontrollori
proposto da Matrix
Multimedia. In
questa puntata
iniziamo a lavorare
con le periferiche
di comunicazione
avanzate, partendo da
quella che ha riscosso
un notevole e crescente
successo negli ultimi
15 anni: il CAN-Bus.
Quinta puntata.
corso di programmazione in
F L OWCODE
di Francesco Ficili e Daniele Defilippi
127
125
500
250
250
500
100
cors
o
F
L
O
W
CO
DE
128
corso F L O
WCOD
129
Descrizione
Init
SendBuffer
Invia il messaggio contenuto allinterno del buffer di trasmissione (passato come parametro)
CheckRx
Controlla se ci sono messaggi ricevuti su un determinato buffer di ricezione (passato come parametro).
ShowLEDs
ReadSwitches
GetRxDataCount
Riceve il conteggio dei byte del messaggio contenuto in un determinato buffer (passato come parametro).
GetRxData
Estrae un determinato byte dal messaggio presente in un determinato buffer di ricezione. Riceve come parametro
sia il buffer che lindice del byte.
SetTxStdID
SetTxExtID
Modifica lextended ID di un determinato buffer di trasmissione (passato come parametro) come combinazione
dellID standard e dellID extended.
SetTxExtAsFull
GetRxStdID
Estrae un determinato byte di un determinato messaggio con ID standard. Vengono controllati tutti i buffer e viene
passato come parametro lindice del byte.
GetRxExtID
Estrae un determinato byte di un determinato messaggio con ID extended, visto come combinazione di un ID
standard e di un ID extended.. Vengono controllati tutti i buffer e viene passato come parametro lindice del byte.
GetRxExtIDAsFull
Estrae un determinato byte di un determinato messaggio con ID extended.. Vengono controllati tutti i buffer e
viene passato come parametro lindice del byte.
Nodo Sensore:
Interfacciamento con sensore ad
ultrasuoni SFR02, su bus IC;
Interfaccia CAN 2.0B a 500 kbaud;
Nodo Display:
Interfacciamento con display alfanumerico 16x2;
Interfaccia CAN 2.0B a 500 kbaud;
Lettura e visualizzazione dei dati sulla
distanza;
Lettura e visualizzazione dei dati diagnostici;
Gestione della modalit sleep tramite
pulsante.
Sebbene il CAN sia nativamente una rete
peer-to-peer, possibile forzare delle
relazioni di tipo master/slave, agendo a
livello dellapplicazione; ci che faremo
in questo esempio, dove il nodo display
agisce da nodo master (pu mettere a
dormire lo slave nodo sensore), inviando un messaggio apposito per forzare lo
stato di sleep, in modo da disabilitare il
sistema durante le fasi di guida ed abilitarlo in fase di parcheggio.
Per quanto riguarda la realizzazione
hardware, in questo progetto avremo
bisogno delle seguenti schede:
cors
o
F
L
O
W
CO
DE
130
corso F L O
WCOD
Fig. 3a
Prototipo del nodo sensore.
Fig. 3b
Prototipo del
nodo display.
131
0xC40A5
Type
Periodico
Tx
Nodo_Sensore
Rx
Nodo_Display
Periodo
250ms
Byte 0
Byte 1
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
DistHighByte
DistLowByte
DiagSts
Not Used
Not Used
Not Used
Not Used
Not Used
Distanza in cm
0 = No fail
1 = Battery fail
2 = IC fail
3 = Mult. fail
0xC40A4
Type
Ad evento
Tx
Nodo_Display
Rx
Nodo_Sensore
Periodo
NA
Byte 0
Byte 1
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
SystemSts
Not Used
Not Used
Not Used
Not Used
Not Used
Not Used
Not Used
0 = Sleep Mode
1 = Awake Mode
Task
Periodo [ms}
Descrizione
CanTxTask
250
CanRxTask
50
DiagTask
50
SensorRangingTask
10
Gestisce la comunicazione
con il sensore ad ultrasuoni
SRF02.
Fig. 4
Main del progetto
in Flowcode.
cors
o
F
L
O
W
CO
DE
132
corso F L O
WCOD
133
Accesso
in lettura
Accesso
in scrittura
Software Revision
Command Register
N/A
N/A
N/A
N/A
N/A
Descrizione
0x50
0x56
0x57
0x58
0x5C
Descrizione
Sensor_SendCommand
Sensor_RequestReadResult
Sensor_ReadResult
Legge i byte allindirizzo 2 (Range High Byte) e 3 (Range Low Byte) e chiude la transazione.
cors
o
F
L
O
W
CO
0x51
0x52
DE
134
corso F L O
WCOD
Fig. 8
Macro SensorRangingStateMachine.
135
Fig. 10
Propriet della macro SetTxData
del componente CAN.
cors
o
F
L
O
W
CO
Fig. 12
Codice grafico
per la ricezione del
messaggio CAN.
Fig. 11
Codice grafico per linvio del
messaggio CAN.
DE
136
corso F L O
WCOD
Tabella 8 - Periodicit e descrizione dei task del software del nodo display.
Task
Periodo [ms]
Descrizione
Riceve e decodifica il messaggio CAN proveniente dal nodo sensore.
CanRxTask
500
DisplayTask
500
SwitchTask
200
Legge lo stato del pulsante ed invia il relativo messaggio CAN ad evento per il nodo sensore.
da inviare (DLC) e gli 8 byte del messaggio. I dati da inviare sono le seguenti
variabili globali:
- SensorResultHighByte Byte 0;
- SensorResultLowByte Byte 1;
- SensorDiagStatus Byte 2.
Le prime due variabili sono ricavate
dalla macro SensorRangingStateMachine,
mentre la variabile SensorDiagStatus
calcolata (e codificata come indicato nella
mappa messaggi) dalla macro DiagnosticTask. In Fig. 10 riportata la finestra
di propriet della chiamata alla macro
componente.
Una volta riempito correttamente il messaggio in trasmissione, per inviare il messaggio sufficiente chiamare la macro
SendBuffer e passare il buffer di trasmissione. In Fig. 11 riportato il frammento
di codice grafico, cos come appare dopo
linserimento delle chiamate alle macro
del componente CAN.
A questo punto la nostra applicazione
lato nodo sensore quasi completa;
rimane da gestire lingresso/uscita dalla
modalit sleep controllata dal messaggio
CAN inviato dal nodo display. Analizzando la mappa messaggi, si vede che
il parametro che determina lo stato del
sistema (sleep o awake) viene impostato dal byte 0 del messaggio con ID
0xC40A4. Bisogna quindi gestire un task
di ricezione allinterno del quale viene
letto questo byte e viene aggiornata una
variabile che usiamo per identificare lo
stato del sistema. Il nostro scheduler ci
offre gi un entry point per la ricezione a
50ms; per completare il codice, introduciamo due chiamate a macro di componente, ed in particolare una CheckRx ed
una GetRxData, entrambe sul buffer 0. Il
risultato della GetRxData viene salvato
allinterno della variabile SystemStatus,
la quale, come abbiamo visto in prece-
137
Fig. 13
Codice grafico
che implementa il
task CanRxTask.
Conclusioni
Concludendo questa puntata, possiamo
dire che lapproccio al CAN con Flowcode permette di gestire diverse tipologie
di componenti e periferiche con relativa semplicit, oltre a generare codice
estremamente facile da comprendere e
mantenere.
Nelle prossime puntate esamineremo
altre periferiche complesse, come lUSB,
g
lo ZigBee e la porta Ethernet.
cors
o
F
L
O
W
CO
Fig. 14 - Tracciato CAN del sistema durante in funzionamento fino alla ricezione di una richiesta di sleep.
DE
138
corso F L O
WCOD
Proseguiamo il nostro
viaggio alla scoperta di
Flowcode, affrontando
la gestione dellUSB
e realizzando un
convertitore seriale
RS232-USB, oltre ad un
tastierino numerico e ad
un analizzatore di stati
logici, sempre su USB.
Sesta puntata.
corso di programmazione in
F L OWCODE
di Francesco Ficili e Daniele Defilippi
115
Fig. 1
Struttura
di un
pacchetto
trasmesso
sul bus
USB.
cors
o
F
L
O
W
CO
DE
116
corso F L O
WCOD
Fig. 3
Connessioni
progetto convertito
da seriale in USB.
Per far ci possiamo avvalerci del componente FT232BL fornito dalla FTDI Chip, che
si accoller tutte le procedure di gestione
del protocollo USB. In Fig. 2 mostrato lo
schema ed il pin-out.
Nel seguente progetto pratico esamineremo nel dettaglio come trasformare il
progetto realizzato nella 4 puntata per il
controllo di una batteria di rel rendendolo
utilizzabile anche su computer sprovvisti
di connettore DB9.
Progetto pratico:
convertire da RS232 a USB
Questo semplice esempio ci permetter di
capire in modo approfondito come dotare
di una pseudo-connessione USB un progetto basato unicamente su una connessione
RS232 senza dover modificare radicalmente
il codice sorgente.
117
Fig. 2
Piedinatura
e schema di
riferimento per
il componente
FT232BL
di FTDI.
Il componente USB-HID
contenuto allinterno della barra dei
componenti nel sotto-menu periferiche e
permette di gestire un dispositivo di tipo
Human interface device. Dopo aver inserito il componente allinterno del pannello
possiamo esaminare le propriet del componente. Essendo abbastanza complesso,
a differenza degli altri componenti pi
semplici, necessita di tre pagine di configurazione. Iniziamo ad analizzare la prima,
illustrata nella Fig. 5.
Il parametro VID il cosiddetto VendorIdentifier ed , in pratica, lidentificativo
univoco del venditore della periferica;
viene assegnato a fronte del pagamento
DE
118
cors
o
F
L
O
W
CO
Tabella 1
corso F L O
WCOD
Nome macro
Fig. 5
Descrizione
RetVal = Initialise_HID()
utilizzata per inizializzare il driver USB per la comunicazione ed attivare il servizio di enumerazione delle periferiche. Restituisce zero se la procedura termina senza errori.
SetDataByte(idx, value)
utilizzata per scrivere uno specifico byte sul vettore che verr inviato via USB. In ingresso
necessita dellindice del byte da scrivere ed il valore che si vuole scrivere. Questa macro non
invia fisicamente i dati ma li immagazzina nel buffer di trasmissione senza trasmetterli.
SendData()
Quando viene chiamata trasmette sul bus USB i dati che sono stati caricati nel buffer dalla
funzione SetDataByte.
SendDataDirect(String)
Invia i dati contenuti allinterno della stringa passata come parametro sul bus USB.
NumBytes =CheckRx()
Aggiorna i dati che sono stati ricevuti dal canale USB. Restituisce la lunghezza dei dati
presenti allinterno del buffer.
Value = ReceiveByte(idx)
utilizzata per leggere un byte indentificato dallindice passato come parametro dal buffer di
lettura dei dati ricevuti. Il primo dato identificato dellindice zero.
String =ReceiveString(NumBytes)
utilizzata per leggere lintera stringa ricevuta sul bus USB. Richiede che gli sia passato come
parametro il numero di byte da leggere e caricare sulla stringa restituita dalla funzione.
119
Fig. 6
Fig. 7
tastiere (HID);
Interface; utilizzata per definire la
classe del dispositivo.
Il tab HID Descriptor visibile in Fig. 7
permette di descrivere in modo dettagliato
la comunicazione ed il significato di ogni
singolo byte trasmesso. La descrizione dei
dispositivi standard quindi, qualora volessimo ad esempio realizzare un gamepad,
ci baster cercarne la sua descrizione su
Internet ed inserirla allinterno della nostra
finestra. In modo automatico, appena
connesso il dispositivo al calcolatore, verr
riconosciuto come tale senza bisogno di
altre configurazioni ed installazioni. Le
macro che Flowcode ci mette a disposizione
sono riassunte nella Tabella 1.
Grazie a queste semplici funzioni possiamo
realizzare qualsiasi tipo di dispositivo HID
ma per meglio capirne il funzionamento proviamo ora a mettere in pratica questi concetti
realizzando un tastierino USB.
Fig. 8
Configurazione
hardware per
realizzare il
tastierino
numerico.
cors
o
F
L
O
W
CO
Progetto pratico:
realizziamo un tastierino numerico USB
Il dispositivo che stiamo realizzando sar
riconosciuto in automatico dal PC al quale
verr collegato come una normale tastiera
USB. Per realizzarlo abbiamo bisogno dei
seguenti componenti:
EB006 USB PICmicromultiprogrammerboard (PIC18F4450 e quarzo 12 MHz);
EB014Keypadboard;
EB055USB interfaceboard.
DE
120
corso F L O
WCOD
121
Installiamo il driver
del componente FTDI
Per poter funzionare correttamente, il PC al quale
colleghiamo il convertitore FTDI, deve avere installati i driver necessari. Per far ci inseriamo il CD fornito assieme alla scheda EB001 a fronte della richiesta
del PC di installare il driver e indichiamo di volerlo
cercare nel computer (Fig. A); inseriamo lindirizzo
alla cartella \drivers\EB-O39 contenuta allinterno
del nostro lettore CD e procediamo premendo il
pulsante Avanti.
cors
o
F
L
O
W
CO
Il componente USB-Serial
Questo tipo di controllo permette di gestire
in modo molto semplice una connessione
USB perch vista sia lato PC che lato Sistema embedded come una comunicazione
di tipo seriale RS232. Il componente si trova
nella barra dei componenti allinterno del
menu periferiche dove avevamo precedentemente visto gli altri componenti USB.
Come possiamo osservare nella finestra di
dialogo visibile in Fig. 14, i parametri che
possiamo configurare sono gli stessi che
avevamo visto per il componente HID; il
DE
122
corso F L O
WCOD
Fig. 13
Diagramma
completo per la
realizzazione di
una tastiera USB.
stampa a video in modo da poterli analizzare semplicemente. Dato che la comunicazione USB non real-time, aggiungeremo
alla stringa inviata serialmente anche il
cosiddetto TimeStamp in modo che si
possa sapere quando i dati sono stati campionati. La sequenza trasmessa sar quindi: <xxxxxx-yyy> dove xxx rappresenta il
TimeStamp mentre y il valore della porta
B. Ogni 100ms verr inviato un dato sulla
comunicazione e quindi potremo avere una
risoluzione massima di 0.1 secondi sullasse
dei tempi. Il timestamp rappresentato in
decimi di secondo mentre il valore della
porta B in decimale. In questo modo anche
con un semplice terminale possibile interpretare il segnale. Se per esempio volessimo
trasmettere il valore 236 al tempo 1,5 secon-
123
Fig. 15 Configurazione
HW per analizzatore
di stati logici.
Fig. 14
Finestra delle
propriet del
componente
USB seriale.
tere che identifica lo zero mentre il secondo carica allinterno del valore di ritorno
il valore convertito mediante la funzione
Length$ con allineamento a destra come
mostrato in Fig. 17.
Ora che la nostra macro pronta possiamo
passare alla realizzazione del programma principale. Per prima cosa inseriamo
allinterno del pannello il componente
USB-Seriale e lo configuriamo come visto
nel paragrafo precedente. Come di routine
suddividiamo il programma in due parti
principali: linizializzazione del sistema
ed il ciclo principale. Nellinizializzazione
inseriamo lazzeramento delle variabili e
la macro Intitialize_Serial() per la connessione USB. Il ciclo principale si occupa invece della sequenza di lettura della
portaB, Conversione del valore letto e del
TimeStamp, generazione della stringa da
trasmettere e infine trasmissione del dato
su bus USB. Per fare in modo che i dati ven-
Send_Byte(Byte)
Send_String(String, Length)
Invia la stringa passata come parametro String. Il parametro Length deve contenere la lunghezza
dei caratteri da trasmettere contenuti nella stringa.
Read_Byte(timeout_ms)
Legge dal buffer di lettura un byte e lo restituisce come valore di ritorno. Il parametro timeout_ms serve per stabilire un timeout massimo, in millisecondi, per il quale la macro deve attendere in attesa di
un dato. Qualora venga posto al valore 255 lattesa non termina fino a quando un dato non disponibile nel buffer di ricezione. Nel caso nessun dato venga ricevuto entro il timeout il valore di ritorno 255.
Legge dal buffer di lettura una sequenza di caratteri la cui lunghezza fissata dal parametro Length e la restituisce come valore di ritorno della funzione. Come per la macro Read_Byte il parametro
timeout_ms serve per permettere alla macro di restituire il controllo alla funzione chiamante senza
che nessun dato sia stato ricevuto.
124
DE
Initialise_Serial()
cors
o
F
L
O
W
CO
Nome Macro
corso F L O
WCOD
Fig. 17 - Macro
ConvertiInStringaFissa
utilizzata allinterno
dellanalizzatore
di stati logici.
Fig. 18
Diagramma
del Main
dellanalizzatore
di stati logici.
125
corso F L O
WCOD
Continuiamo il
nostro viaggio alla
scoperta di Flowcode,
linnovativo sistema
di sviluppo grafico
per microcontrollori
proposto dalla Matrix
Multimedia. In questa
puntata analizzeremo
una periferica
wireless: ZigBee.
Settima puntata.
corso di programmazione in
F L OWCODE
di Francesco Ficili e Daniele Defilippi
129
Bluetooth 802.15.1
Wi-Fi 802.11b
GPRS/GSM 1XRTT/CDMA
Application Focus
Cable Replacement
System Resource
4KB-32KB
250KB+
1MB+
16MB+
100-1000+
1-7
1-5
1-7
255/65K+
30
1,000
Bandwidth (kbps)
20-250
720
11,000+
64-128
Range (meters)
1-75+
1-10+
1-100
1,000+
Key Attributes
Cost, Convenience
Speed, Flexibility
Reach, Quality
Fig. 1
Logo della
ZigBee
Alliance.
cors
o
F
L
O
W
CO
DE
130
corso F L O
WCOD
Fig. 3 - Esempio
di Mesh ZigBee.
Fig. 4
Applicazioni
tipiche del
protocollo
Zigbee.
Possibili applicazioni
Termoregolazione
Monitoraggio ambientale
Automazione industriale
Monitoraggio strutturale
Monitoraggio gallerie, Monitoraggio ponti, Monitoraggio dighe, Monitoraggio edifici a rilevanza storica o artistica
Domotica
131
Fig. 5 - Modulo
Xbee Serie 2.
Xbee PRO
100 m
Outdoor Range
100 m
1500 m
1 mW (0 dBm)
RF data rate
250 kbps
250 kbps
Receiver Sensitivit
- 92 dBm
- 100 dBm
Supply Voltage
2.8 3.4 V
2.8 3.4 V
Transmit Current
45 mA
270 mA
Receive Current
50 mA
55 mA
DE
132
Specification
Indoor/Urban Range
cors
o
F
L
O
W
CO
realizzazione di reti che vengono generalmente indicate come WSN (Wireless Sensor Network) ossia reti di sensori wireless
custom per applicazioni di monitoraggio
di vario tipo. La Fig. 4 illustra alcune delle applicazioni tipiche del protocollo.
La Tabella 2 elenca sinteticamente alcune
delle pi comuni applicazioni del protocollo. Tra i vari dispositivi ZigBee presenti al mondo hanno acquisito una certa
fama (specialmente nel mondo hobbistico) i dispositivi Xbee, prodotti dalla Digi/
Maxstream. Si tratta di una famiglia di
radiomodem con interfaccia seriale, il
cui esemplare riportato in Fig. 5. Tali
disposivi sono stati scelti anche dalla Matrix come modulo hardware ZigBee per i
dispositivi e-block.
Lhardware molto semplice, e consiste
in un piccolo PCB, allinterno del quale
trova posto tutta lelettronica necessaria
al funzionamento, inclusa lantenna che
pu essere a chip, a filo o con connettore
RPSMA. La Fig. 6 illustra le diverse possibili scelte per lantenna dei moduli Xbee.
Linterfacciamento verso lesterno
affidato a due file di 10 pin a passo 2 mm.
Linterfaccia di comunicazione una
seriale standard UART, con baud rate selezionabile da 1200 bps a 115200 bps, sicch il collegamento minimo richiesto per
il funzionamento dei moduli consiste nelle due linee della seriale, TX ed RX e nelle
due linee di alimentazione. Sono previste
corso F L O
WCOD
come pi volte abbiamo fatto in precedenza. Una volta posizionato il componente possiamo esaminarne le propriet
extra, cliccando con il tasto destro. La
finestra delle propriet extra del componente riportata in Fig. 7. Come si pu
vedere possibile scegliere che tipo di
componente si vuole implementare (Coordinator, Router, End node), impostare
la PAN id (random e impostata dallutente), impostare il numero massimo di
hops, i canali da includere allinterno
della procedura di scan ecc.
Come per gli altri componenti, sono
disponibili delle API che ne facilitano
lutilizzo, sinteticamente riportate in
Tabella 4.
Progetto pratico:
nodo wireless per controllo rel
Passiamo adesso al progetto pratico
relativo a questa puntata. Questa volta ci
proponiamo di realizzare una mesh ZigBee costituita da nodi in grado di controllare una batteria di 4 rel. Ogni nodo sar
identificato allinterno della mesh tramite
un indirizzo costituito da due cifre numeriche codificate ASCII. Sar possibile
modificare lindirizzo del nodo tramite
il canale wireless e sar inoltre possibile
intervenire su alcuni parametri di funzionamento. I vari parametri saranno memorizzati allinterno della EEPROM del
dispositivo, in modo che possano essere
recuperati anche nel caso in cui il nodo
venga privato della sorgente di alimentazione, in modo da non dover ripristinare
la configurazione in futuro.
Come gi fatto per gli altri progetti pratici, esaminiamo le specifiche di progetto,
elencate di seguito.
Controllo di ogni singolo nodo tramite
indirizzo in formato ASCII su due cifre.
Attivazione/disattivazione di 4 rel.
Gestione delle seguenti opzioni:
- abilitazione/disabilitazione LED
funzionamento;
- abilitazione/disabilitazione Eco
comando;
- selezione periodo lampeggio LED.
Memorizzazione delle opzioni di sistema su memoria EEPROM.
Il nostro progetto prevede quindi lutilizzo di un protocollo livello applicazione
che si appoggia sul protocollo ZigBee. La
definizione del protocollo di livello applicazione riportata di seguito.
La stringa di comando inviata dal
master una stringa ASCII composta
da 7 caratteri.
Descrizione
Init_Network
Inizializza il modulo Xbee e prova ad eseguire il setup della network (coordinator) oppure ad effettuare il join ad una
network eseistente (router o end device).
Restart_Network
Scan_Network
Connect_To_Address
Connect_To_Coordinator
Connettiti al coordinator.
Connect_To_All
Node_Configure_Sleep
Imposta la modalit sleep del nodo (applicabile solo agli end device). Prende in ingresso due parametri, la modalit
di sleep (1=Hibernate, 2=Doze, 4=Cyclic Sleep, 5=Cyclic Doze) e il timeout in ms.
Node_Wake
Get_Signal_Level
Send_Char
Receive_Char
133
Fig. 8
Connessione
E-Block per
progetto pratico.
cors
o
F
L
O
W
CO
DE
134
corso F L O
WCOD
Tabella 5 - Periodicit e descrizione dei task del software del nodo ZigBee slave.
Task
Periodo [ms]
Descrizione
RxTask
RelayTask
500
EepromTask
100
LedTask
Impostabile
- TSK_EepromTaskCounter;
- TSK_LedTaskCounter;
- TSK_RxTaskCounter.
Non potendo analizzare tutti i task implementati in quanto una singola puntata
non sarebbe sufficiente, ci soffermeremo
135
cors
o
F
L
O
W
CO
DE
136
corso F L O
WCOD
Function_Parameter2 = RxBuffer[.DEC_
PAR_2]
Il primo controllo effettuato sulla prima
parte del pacchetto, quella contenente
lindirizzo del nodo. Il controllo effettuato il seguente:
(NodeType = NODE_TYPE_SLAVE) &&
(Packet_IDMajor = EEP_Id_NodeMajor)
&& (Packet_IDMinor = EEP_Id_NodeMinor)
Quindi si controlla che il nodo sia uno
slave (S) e che lID corrisponda con I
valori caricati dalla memoria EEPROM.
137
Queste informazioni vengono poi utilizzate dal task RelayTask per il controllo
effettivo dei rel. Una parola a parte merita la gestione della memorizzazione dei
parametri in EEPROM (questo riguarda,
ad esempio, tutte le opzioni di configurazione). Tale gestione demandata al relativo task, ma, anche in questo caso, per
sapere se i parametri in memoria sono
cors
o
F
L
O
W
CO
RelayNumber = Function_Parameter1
RelayStatus = Function_Parameter2
EEP_Conf_EcoEnabled = Function_Parameter2
EepUpdateRequest = UPDATE_EEP_REQUEST
DE
138
corso F L O
WCOD
139
corso F L O
WCOD
Concludiamo il
nostro viaggio alla
scoperta di Flowcode,
linnovativo sistema
di sviluppo grafico
per microcontrollori
che consente di
scrivere il codice
facendo uso di oggetti
grafici. In questa
ottava ed ultima
puntata spiegheremo
come connettere
allethernet sistemi
embedded mediante
protocollo TCP/IP.
corso di programmazione in
F L OWCODE
di Francesco Ficili e Daniele Defilippi
129
cors
o
F
L
O
W
CO
Il protocollo TCP/IP
TCP/IP lacronimo di Transmission Control Protocol / Internet Protocol; il protocollo
corrispondente racchiude tutte le specifiche
necessarie per comunicare correttamente
attraverso la rete Internet. suddiviso in
strati detti Layer (Fig. 1). Ciascuno dei
layer dipende da quello che sta al di sotto
e pu comunicare solamente con quelli
confinanti; ognuno ha un compito differente e i pacchetti, durante il transito verso gli
strati inferiori, vengono sempre pi incapsulati e, viceversa, man mano che risalgono
vengono ripuliti dai dati di incapsulamento
non pi necessari. Questo tipo di architettura permette di poter trasferire in modo
sicuro i dati tra un calcolatore ed un altro.
Il protocollo IP si occupa della corretta
ricezione/trasmissione di dati; attualmente
esistono due versioni di IP: IPv4 e IPv6. La
differenza principale tra i due il numero
di byte utilizzati per codificare in modo univoco gli indirizzi di rete. Il protocollo TCP
invece incaricato del riordino dei pacchetti
e della ricomposizione del dato originale
senza perdita di dati. Ogni computer
identificato da un indirizzo IP che lo identifica in modo univoco allinterno della rete
internet. Lassegnazione di questo indirizzo
pu essere di tipo dinamico oppure statico;
solitamente possiamo decidere se assegnarne uno di un tipo oppure di un altro perch,
essendo collegati ad un ISP (Internet Service
Provider), lindirizzo effettivo visto dalla
rete sar quello dellISP e non quello scelto
da noi. Quando vogliamo raggiungere un
calcolatore collegato a Internet mediante
un browser, digitiamo un nome, ad esempio www.futuranet.it, e questo, mediante
il servizio di DNS, verr trasformato nel
corrispondente indirizzo IP utilizzabile
con il protocollo TCP/IP. Questo processo
permette cos di utilizzare dei nomi che
sono pi facili da ricordare rispetto ad una
sequenza di 4 o 6 numeri a tre cifre.
Fig. 1
Suddivisione
in Layer del
protocollo
TCP/IP.
DE
130
corso F L O
WCOD
Descrizione
Initialize
Create_MAC_Socket
Chiamando questa macro, viene creato un socket in grado di ricevere i dati trasmessi sulla rete ethernet. Impostando ad
uno il valore del parametro:
- Promiscuous mode per leggere tutto il traffico circolante sulla rete senza tener conto dellindirizzo MAC;
- Broadcast mode per leggere anche i pacchetti di tipo Broadcast;
- Error mode per ricevere anche i pacchetti che contengono errori.
Il valore di ritorno, se diverso da zero, indica che loperazione di configurazione andata a buon fine.
Create_UDP_Socket
Create_IP_Socket
Create_TCP_Socket
Crea un socket di tipo TCP. Necessita delle stesse configurazioni utilizzate con la macro Create_UDP_Socket.
Set_Destination
utilizzata con socket di tipo IP e UDP e serve per impostare lindirizzo IP e la porta verso il quale si vogliono trasmettere i
dati. Richiede come parametri il canale, lindirizzo IP e la porta di destinazione. Per connessioni di tipo IP non necessario
indicare la porta.
Set_My_IP
Questa macro utilizzata per modificare, durante lesecuzione, lindirizzo IP del dispositivo; non necessaria se si desidera
mantenere lindirizzo IP inserito nella finestra di configurazione del componente.
GetSocketStatus
La macro restituisce lo stato attuale del socket. I valori possibili sono diciannove, ma quelli principali sono i seguenti:
- 0 (SOCK_CLOSED) = il socket chiuso (non sono n trasmessi n ricevuti dati);
- 6 (SOCK_ESTABLISHED) = il socket pronto e la comunicazione attiva in modalit passiva;
- 7 (SOCK_CLOSE_WAIT) = il socket in fase di chiusura;
- 14 (SOCK_INIT) = il socket in fase di inizializzazione.
TCP_Listen
Imposta il canale scelto (indicato come parametro) in modalit passiva in modo che possa essere pronto a ricevere dei dati.
TCP_Connect
Imposta il canale scelto (indicato come parametro) in modalit attiva in modo che possa essere pronto per trasmettere dei
dati sul canale di comunicazione. Necessita come parametri il valore del canale, lindirizzo IP e la porta di destinazione. Se
il valore restituito differente da zero vuol dire che la comunicazione stata stabilita con successo e che possono quindi
essere trasmessi dei dati.
TCP_Close
Chiude la connessione TCP mediante unoperazione attiva e porta il socket in attesa di terminazione.
Tx_start
Avvia la trasmissione di dati sul canale specificato dai parametri ma, per funzionare correttamente necessita delle macro
successive (Tx_sendbyte, Tx_sendmymac, Tx_sendmymac e Tx_end) . La sequenza corretta inizia con un comando di Tx_start,
prosegue con sequenze di Tx_sendbyte, Tx_sendmymac, Tx_sendmymac nellordine prescelto (pu anche solo essere utilizzata una sola macro delle tre) e termina con Tx_end per effettuare linvio dei dati sul canale di comunicazione.
(segue)
131
Descrizione
Tx_sendbyte
Invia i dati al buffer di trasmissione per il canale specifico. Oltre al canale deve essere indicato il parametro di dato. Come
dato possono anche essere utilizzate stringhe.
Tx_sendmymac
Invia nel buffer di trasmissione, del canale selezionato, lindirizzo MAC attuale della scheda.
Tx_sendmyip
Invia nel buffer di trasmissione, del canale selezionato, lindirizzo IP impostato nella finestra di configurazione della scheda.
Tx_end
Rx_data_available
Controlla se vi sono dati disponibili nel buffer di ricezione del canale. Il valore di ritorno, se differente da zero, indica che vi
sono dati disponibili. Questa macro anche utilizzata per inizializzare il buffer per la ricezione dei dati qualora non lo fosse
gi. In pratica azzera lindice con il quale viene scandito il buffer con la macro Rx_data_size.
Rx_data_size
Macro utilizzata per sapere quanti byte sono disponibili allinterno del buffer di ricezione.
Rx_readheader
Rx_readbyte
Legge dal buffer di ricezione del canale scelto un byte che viene restituito come valore di ritorno.
Rx_skipbytes
Rx_match2bytes
Rx_match4bytes
Rx_match6bytes
Legge 2/4/6 byte dal buffer di ricezione e li confronta con quelle indicate nei parametri con la quale viene chiamata. Restituisce un valore differente da zero se i valori coincidono.
Rx_match_mymac
Legge 6 byte dal buffer di ricezione e li confronta con lindirizzo MAC con il quale stata configurata la scheda. Restituisce
un valore differente da zero se i valori coincidono.
Rx_match_myip
Legge 4 byte dal buffer di ricezione e li confronta con lindirizzo IP con il quale stata configurata la scheda. Restituisce un
valore differente da zero se i valori coincidono.
cors
o
F
L
O
W
CO
Il componente Webserver
La maniera pi immediata per poter
comunicare con sistemi remoti, anche a
migliaia di chilometri di distanza, quello
di utilizzare semplici pagine web, perch
necessitano unicamente che entrambi i
sistemi siano connessi alla rete Internet.
Lintero sistema veramente economico
ed molto intuitivo da utilizzare. Realizzare un Web Server su un calcolatore abbastanza semplice, ma su una piattaforma
embedded con potenza di calcolo limitata
diventa assai pi complesso. Per queste
ragioni, Flowcode ci viene in soccorso
fornendoci un componente specifico che
troviamo nella barra dei componenti nel
menu Periferiche con il nome Webserver.
Nelle puntate precedenti abbiamo visto
come periferiche o sistemi molto complessi possano essere realizzati in modo molto
semplice grazie allutilizzo del programma; cos anche in questo caso. Come
DE
132
corso F L O
WCOD
Descrizione
Initialize
Resetta ed inizializza la periferica Ethernet. Questa macro deve essere chiamata prima di ogni qualsiasi altra macro per la
gestione del Web Server.
CreateServerSocket
CheckSocketActivity
vediamo in Fig. 3, la finestra di configurazione del componente semplice e intuitiva: notiamo che esattamente identica al
componente TCP/IP e quindi pu essere
configurata allo stesso modo. Ci dovuto
al fatto che il componente webserver non
133
Listato 1
<!DOCTYPE html>
<HTML>
<HEAD><title>Esempio web-server</title>
<script language=JavaScript type=text/javascript>
var Temperature = new Array();
Temperature[0] = %BOO1% - 128;
Temperature[1] = %BOO2% - 128;
Temperature[2] = %BOO3% - 128;
Temperature[3] = %BOO4% - 128;
function Temp(x) {
if (x/20<=1) return Temperature[0];
else if (x/20<=2) return Temperature[1];
else if (x/20<=3) return Temperature[2];
else return Temperature[3];
}
Fig. 5
Connessione
delle schede
per realizzare
la centralina di
monitoraggio
temperatura.
// X axis
// Y axis
ctx.stroke();
ctx.beginPath();
ctx.lineWidth = 1;
ctx.strokeStyle = rgb(128,128,128);
for (var i=-20;i<=50;i= i + 10) {
yy = i*scale;
ctx.moveTo(xmin-5,y0-yy); ctx.lineTo(w,y0-yy);
ctx.font=15px Georgia;
ctx.strokeText(i + C,xmin-50,y0-yy+5);
192.168.0.10
SubnetMask
255.255.255.0
IP Address
192.168.0.5
HardwareAddress
0:8:220:0:0:0
cors
o
F
L
O
W
CO
(segue)
DE
134
corso F L O
WCOD
Listato 1 (seguito)
}
ctx.stroke();
ctx.beginPath();
ctx.lineWidth = 3;
ctx.strokeStyle = rgb(80,80,80);
yy = 0;
ctx.moveTo(xmin,y0-yy); ctx.lineTo(w,y0-yy);
ctx.stroke();
function draw() {
var canvas = document.getElementById(canvas);
if (null==canvas || !canvas.getContext) return;
// Imposta larea di disegno
var axes={}, ctx=canvas.getContext(2d);
axes.x0 = 50;
//.5 + .5*canvas.width; // x0 pixels from left to x=0
axes.y0 = 12/16*canvas.height;
//.5 + .5*canvas.height; // y0 pixels from top to y=0
axes.scale = 7;
// 7 pixels from x=0 to x=1
axes.doNegativeX = false
showAxes(ctx,axes);
funGraph(ctx,axes,Temp,rgb(66,44,255),4);
function clear(ctx) {
ctx.fillStyle = rgb(255,255,255);
ctx.fillRect(0, 0, 500, 500);
}
</script>
</HEAD>
<body onload=draw()>
<script>
</script>
<p><center>
<font face=Verdana size=+2>
Temperature misurate<br><br>
<canvas id=canvas width=600 height=400></canvas>
<br><font face=Verdana size=-2>Web Server by <br>
<a href=http://www.eletronicain.it/>ElettronicaIN</a></font>
</center><p>
</body></HTML>
135
Fig. 8 - Flusso
principale di
programma.
cors
o
F
L
O
W
CO
DE
136
corso F L O
WCOD
Il linguaggio HTML
Fig. 10
Pagina
inviata dal
Web Server.
<b>Testo Formattato</b>
La struttura base di un file Html raffigurata in
Figura 10. Partendo dalla testa del file, si ha una
descrizione del documento, alcune informazioni di
servizio ed il corpo del documento nel quale viene
formattato lintero contenuto della pagina.
Figura 10 - Struttura base di un file HTML
137
DE
138
cors
o
F
L
O
W
CO