Ecorso 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 l’Assembler. Prima puntata. 1 corso di programmazione in F L OWCODE di Francesco Ficili e Daniele Defilippi D al giorno dell’invenzione del primo transistor, avvenuta ormai nel 1947, l’elettronica è diventata parte integrante della nostra vita, e sarebbe impensabile ormai, credere di poter fare a meno di questo tassello fondamentale della storia dell’evoluzione umana. Una delle derivazioni più comuni di questa disciplina è sicuramente rappresentata dal mondo dei dispositivi embedded. Quando facciamo una telefonata, o navighiamo su internet usando il nostro smartphone, quando guidiamo la nostra auto, quando facciamo la spesa pagando con la nostra carta di credito, in ognuna di queste circostanze, diversi dispositivi elettronici dotati di intelligenza elaborano milioni di informazioni al secondo, semplificandoci la vita. Dietro tali dispositivi, veri e propri instancabili ed invisibili servitori dei nostri giorni, si cela comunque la mano dell’uomo: qualcuno ne ha ideato le funzionalità, li ha progettati elettronicamente e ne ha sviluppato la logica. Anche lo sviluppo dei sistemi embedded ha subito una sua evoluzione nel corso degli anni, e si è passati dai dispositivi totalmente analogici ai sistemi a microcontrollore che, per svolgere il compito specifico, devono essere opportunamente programmati, usando appositi linguaggi di programmazione. La programmazione, vero e proprio cuore dello sviluppo, è stata Elettronica In ~ Giugno 2013 127 Fig. 1 Logo della Matrix Multimedia. per anni appannaggio di poche aziende nel mondo, essendo di fatto inaccessibile alle aziende non specializzate ed ai privati, per via degli altissimi costi dei sistemi di sviluppo. Negli ultimi vent’anni, con l’avvento dei primi controllori basati su memorie FLASH (riprogrammabili elettricamente), il costo dei sistemi di sviluppo è calato vertiginosamente, rendendo questo tipo di tecnologie accessibili anche agli sviluppatori privati ed al mondo hobbistico. Sono così comparsi i primi ambienti di sviluppo software e compilatori (generalmente basati su linguaggi come il C e l’assembler) a basso costo. Tali ambienti hanno, comunque, continuato a mantenere caratteristiche di complessità d’uso ed i linguaggi utilizzati richiedono, per essere impiegati efficacemente, delle basi di programmazione non indifferenti. Così lo sviluppo su sistemi embedded è diventato più accessibile dal punto di vista economico, ma le difficoltà tecniche nell’uso dei tools sono rimaste comunque uno scoglio notevole da superare per i neofiti della programmazione software. Per ovviare a problematiche di questo tipo sta nascendo, in questi anni, una nuova generazione di ambienti di sviluppo, che ha lo scopo di astrarre le difficoltà intrinseche di un linguaggio di programmazione text-based, facendo uso di formalismi più comuni. Uno degli esponenti di spicco di questa nuova generazione di ambienti di sviluppo è Flowcode, prodotto da Matrix Multimedia, azienda leader nel settore della produzione di sistemi di sviluppo hardware/software per microcontrollori. Il concetto su cui si basa Flowcode è l’uso di una rappresentazione grafica basata su diagrammi di flusso (o flowchart, da cui il nome Flowcode) per lo sviluppo di un programma per target embedded. Questo approccio permette di rimpiazzare l’implementazione basata sulle keywords, tipica dei linguaggi di programmazione tradizionali. Un esempio di frammento di codice grafico scritto in Flowcode è riportato in Fig. 2. L’ambiente di sviluppo, oltre a generare l’eseguibile per la programmazione del chip (ed eventualmente anche la traduzione in codice sorgente C), integra un simulatore ed un ICD (in-circuit debugger) per eseguire il debugging del codice direttamente sul target. Una delle caratteristiche più interessanti di Flowcode è, come vedremo in dettaglio nelle prossime puntate, la disponibilità di una ricca libreria di componenti per l’utilizzo delle periferiche normalmente integrate nei microcontrollori. L’uso dei componenti semplifica notevolmente l’accesso alle periferiche, anche nel caso delle periferiche più complesse, come Fig. 2 Esempio di codice Flowcode. cors o F L O W CO Programmazione grafica con Flowcode L’ambiente di sviluppo Flowcode, giunto ormai alla versione 5, nasce per ovviare al problema della complessità degli ambienti di sviluppo tradizionali e per consentire lo sviluppo di applicazioni embedded complesse anche a chi ha una minima (se non nulla) conoscenza di linguaggi di programmazione. Flowcode è un completo IDE (Integrated Development Enviroment) per microcontrollori ad 8, 16 e 32-bit. Gli attuali target supportati sono: • Microchip PICmicro della serie 10, 12, 16 e 18 (8-bit), • Microchip dsPIC30F, dsPIC33F, dsPIC33E e PIC24 (E, H ed F), • Atmel AVR e piattaforma Arduino, • Atmel ARM. DE 128 Giugno 2013 ~ Elettronica In E corso F L O WCOD Fig. 3 Sito Matrix multimedia per download di FlowCode. ad esempio la porta USB, la porta Ethernet o altri sistemi di comunicazione e/o controllo. Una descrizione più dettagliata dei componenti sarà fatta in seguito, ma è importante sottolineare che la disponibilità di queste librerie consente di sviluppare applicazioni anche molto complesse con l’interconnessione di pochi semplici blocchi funzionali. Installazione e configurazione di Flowcode V5 Come primo argomento del corso illustriamo come installare e configurare l’IDE. Il pacchetto di installazione di Flowcode è scaricabile dal sito web della Matrix (www. matrixmultimedia.com) e, come già detto precedentemente, attualmente sono supportati diversi target, a cui corrispondono diverse versioni del software. Come versione base del corso è stata scelta la versione per i microcontrollori PIC della Microchip Technology. Dopo esserci collegati al sito web della Matrix, accediamo alla sezione download e scarichiamo la versione per PICmicro. Al termine del download eseguiamo il file FlowcodeV5 - PICMicro.exe e avviamo l’installazione del programma. Comparirà il wizard di installazione, la cui prima schermata è riportata in Fig. 4. Premiamo il pulsante Next per accedere alla schermata successiva, confermiamo di accettare la licenza d’uso e proseguiamo. Fig. 4 - Finestra iniziale di installazione di FlowCode. Fig. 5 - Accettazione della licenza d’uso. Elettronica In ~ Giugno 2013 129 Fig. 6 - Inserimento dati di installazione. Fig. 7 - Selezione codice attivazione prodotto. Installazione scheda di sviluppo EB006 A questo punto il nostro ambiente di Fig. 8 Schermata iniziale installazione driver per E-block EB006. cors o F L O W CO Inseriamo ora il nostro nome ed il nome nell’organizzazione (che in questo caso abbiamo indicato come “ElettronicaIn”), come illustrato in Fig. 6, e premiamo ancora una volta il pulsante Next. Selezioniamo la cartella di destinazione e procediamo alla schermata successiva. A questo punto il wizard ci chiede conferma di proseguire con l’installazione e dopo averla ricevuta inizierà il processo di copia dei file su disco. Al termine dell’operazione viene richiesto di attivare il prodotto mediante una chiave di attivazione, o di attivare una licenza free, come possiamo vedere in Fig. 7. La licenza free non ha limitazioni in termini di tempo, ma è attivato un set ridotto di componenti all’interno dell’ambiente. sviluppo è correttamente installato e possiamo procedere alla realizzazione delle nostre applicazioni. Come supporto hardware al corso verrà utilizzato un sistema modulare di schede di sviluppo, prodotte sempre dalla Matrix, che prende il nome di E-block. Il sistema è costituito da una scheda madre alla quale possono essere connessi diversi blocchi per espanderne le funzionalità. Ogni blocco offre le risorse hardware necessarie per implementare una specifica interfaccia, come, ad esempio, porte USB o Ethernet, display grafici, interfacce CAN, driver per motori passo-passo, etc. La scheda scelta come scheda madre per lo sviluppo delle applicazioni che saranno presentate lungo la durata del corso è la EB006. La scheda EB006 è corredata di un CD di installazione che serve per installare tutti i driver necessari per poter utilizzare correttamente il sistema di sviluppo. Inseriamolo all’interno del nostro lettore CD e posizioniamoci all’interno della cartella “drivers\ EB-006”. In base all’architettura del nostro PC scegliamo dpinst_amd64 (64 bit AMD o Intel), dpins_ia64 (64 bit itanium) oppure dpins_x86 (32bit) ed avviamo l’eseguibile. Comparirà la schermata di Fig. 8, che ci informa che premendo sul pulsante “Avanti” verrà avviata la procedura di installazione dei driver. Proseguiamo e, nel caso ci venga notificato da Windows che non è possibile verificare l’autenticità dei driver, scegliamo di proseguire con l’installazione. Al termine dell’operazione apparirà la DE 130 Giugno 2013 ~ Elettronica In le operazioni logiche e matematiche e altro ancora. i ritardi. ma verrà composto facendo uso solo di oggetti grafici. tramite un opportuno wizard di configurazione. che chiameremo “area di progetto” nel quale verrà implementato il diagramma di flusso. dalla quale è possibile scegliere quale blocco inserire all’interno del programma. come i blocchi decisionali. eventuali protezioni. Colleghiamo ora la scheda di sviluppo EB006 mediante il cavo USB (fornito in dotazione) al computer. L’interfaccia di FlowCode è suddivisa principalmente in barre e pannelli. Flowcode è un ambiente di sviluppo grafico: questo vuol dire che il programma non viene rappresentato. Nel caso di Flowcode la rappresentazione scelta è quella dei diagrammi di flusso (o flowchart). da un codice testuale. Elettronica In ~ Giugno 2013 131 Fig. 9 Interfaccia FlowCode. le impostazioni sulla memoria. etc. passiamo quindi alla descrizione dell’interfaccia di programmazione dell’IDE. Al centro dello schermo è presente un tab (che nel nostro caso si chiama “Main”). come avviene invece con i linguaggi di programmazione tradizionale. 10 Barre degli strumenti. come la frequenza del clock interno. In Fig. Interfaccia di Flowcode A questo punto anche il nostro hardware di sviluppo è configurato e pronto per essere utilizzato. le selezioni multiple. per semplificare la gestione della periferica. i cicli. Infine. segnalandoci che il debugger è attivo.E corso F L O WCOD Fig. 9 è rappresentata la schermata principale di Flowcode. Nella parte sinistra dello schermo è invece presente la barra delle icone. schermata che ci indica che l’installazione è stata eseguita correttamente. ognuno dei quali ha uno specifico compito che ora andremo ad analizzare. è possibile impostare la configurazione base del microcontrollore. è possibile aggiungerle dal menu “visualizza” semplicemente aggiungendo una spunta vicino al nome che le identifica. Per la gestione delle periferiche più complesse sono invece forniti una serie di componenti che non sono altro che dei contenitori che offrono delle funzioni predefinite. Come già detto nella parte introduttiva di questa puntata. . Per concludere l’installazione premiamo il pulsante “Fine”. Il sistema operativo installerà i driver aggiuntivi ed uno dei due led sulla scheda si accenderà. Gli elementi base del diagramma di flusso implementano le strutture di controllo fondamentali del programma. Qualora non tutte le barre siano visualizzate. Dal punto di vista della funzionalità del programma non cambia nulla se lasciamo vuoti questi campi ma. All’interno del tab “Operazioni Generali”. semplicemente inserendoli all’interno del pannello che è visibile in basso al centro della schermata del programma. 11. . e molto altro ancora. La casella “Velocità di clock del PIC” deve essere impostata a 48MHz e la casella “Configura componente” deve essere selezionata. visibile in Fig. 12 Opzioni di progetto. Per inserire un blocco è sufficiente trascinarlo all’interno del diagramma: una freccia gialla ci indicherà il punto esatto in cui lo stiamo inserendo e l’icona del mouse viene modificata prendendo la forma dell’oggetto che vogliamo inserire all’interno del nostro diagramma di flusso. 13 Inserimento descrizione progetto.Fig. controllo di motori brushless. debuggare. contiene tutti i possibili blocchi che possono essere aggiunti all’interno del diagramma di flusso. rappresentata in Fig. componenti complessi quali USB. che ci fornisce i comandi base per gestire il progetto. come indicato in Fig. Descriveremo nelle prossime puntate le altre barre e pannelli che non abbiamo approfondito in questa sezione. all’interno dei nostri progetti. Nel nostro caso abbiamo inserito il titolo e la descrizione del progetto che realizzeremo al termine di questa puntata: un semplice programma che fa lampeggiare un LED. Ethernet. Ora passiamo al tab “Descrizione progetto” e inseriamo una descrizione significativa. generare codice. sopra l’area di progetto troviamo la barra degli strumenti (illustrata in Fig. 14. DE Creare un progetto Per creare un progetto apriamo Flowcode e premiamo sul pulsante “Nuovo progetto” nella barra degli strumenti. 10). Tra la barra degli strumenti e l’area di progetto troviamo invece la barra dei componenti che ci consente di utilizzare. compilare e simulare il nostro progetto. configuriamo il progetto in modo che rispecchi l’implementazione hardware del sistema. 12. 11 Barre delle icone. Configureremo questo progetto in modo da poterlo utilizzare negli esempi che vedremo in seguito. La barra delle icone. Fig. per poter capire meglio che cosa realizza il nostro progetto. sarebbe buona norma inserirne almeno una breve descrizione. Selezioniamo il microcontrollore scegliendo la famiglia 18 e successivamente 18F4550. Passiamo ora a configurare i settaggi specifici del microcontrollore cliccando sul pulsante cors o F L O W CO In alto. 132 Giugno 2013 ~ Elettronica In Fig. che ci farà accedere a una schermata di configurazione come quella rappresentata in Fig. torniamo nell’area progetto per inserire blocchi del diagramma di flusso. copiarlo. già presenti di default all’interno del diagramma. Possiamo ora impostare tutte le proprietà disponibili per il blocco che abbiamo selezionato.fcf”. Come prima operazione inseriamo il blocco di gestione delle uscite del microcontrollore. 16. Il blocco è utilizzato per controllare lo stato delle uscite del nostro microcontrollore. trascinando all’interno dell’area di progetto l’icona uscita. Scegliamo l’opzione “Proprietà” ed esaminiamo la finestra che si è aperta. che potrà comunque essere approfondita leggendo il datasheet specifico del microcontrollore utilizzato. per tornare alla schermata di configurazione di progetto e nuovamente premiamo OK per iniziare a realizzare il diagramma di flusso. con il nome “ConfigurazioneBase. Nella lista a scorrimento “Port” possiamo selezionare la porta della quale vogliamo modificare il valore Elettronica In ~ Giugno 2013 133 Fig. premendo sul pulsante “Salva progetto” nella barra degli strumenti. Fig. Per poter utilizzare questa configurazione negli esempi successivi salviamo il progetto. Cliccando sul blocco con il tasto destro è possibile eseguire altre operazioni quali tagliarlo. Proviamo ora a esaminare le proprietà di un blocco. . 14 Impostazioni generali nuovo progetto. Dopo aver correttamente compilato ogni campo premiamo il pulsante OK. senza soffermarci sul perché di ogni scelta. Cliccando con il tasto destro sul blocco che abbiamo inserito appare la finestra a scomparsa di Windows. Una freccia gialla ci indicherà il punto esatto in cui lo stiamo inserendo. “Configura componente”. riportata per comodità nella Fig. 15. Per motivi di tempo ci limiteremo a settare ogni campo come indicato in figura. Per inserire un blocco basta trascinarlo dalla barra delle icone all’interno dell’area di progetto.E corso F L O WCOD Fig. 16 Proprietà blocco uscita. esaminarne le proprietà e altro ancora che vedremo nelle puntate successive. Per rimuovere un blocco basta selezionarlo e premere il tasto “Canc”. Aggiunta di blocchi nel diagramma di flusso Una volta completata la configurazione dell’hardware. 15 Configurazione specifica del microcontrollore. (presente nella barra delle icone) tra i blocchi di INIZIO e FINE. il numero 500. di uscita. È molto importante indicare per ogni blocco un’etichetta significativa perché. A questo punto accediamo alle proprietà del blocco. 17 Proprietà blocco ritardo. cioè senza virgola. durante la stesura di un codice realizzato in un qualsiasi linguaggio di programmazione. Ad esempio per aggiungere un ritardo del valore di 0. Selezionando “Intero Port” e selezionando la casella “Usa Maschera” è possibile selezionare quali bit devono essere impostati. con poche parole. presente sempre nella barra delle icone. mentre nella casella “Variabile o Valore” indichiamo il valore alla quale vogliamo impostare la porta selezionata. In questo modo è possibile lasciare invariati i valori dei pin della porta il cui bit non è contrassegnato nella maschera. ma possiamo comunque inserire ritardi minori del secondo passando all’unità di misura con risoluzione maggiore. cliccando con il tasto destro del mouse. come abbiamo fatto precedentemente. DE 134 Giugno 2013 ~ Elettronica In . 18 Struttura decisionale binaria e panello di configurazione del confronto. La casella di testo “Etichetta” permette di modificare il testo che verrà indicato sopra il blocco all’interno del diagramma. potrebbe esserci molto di aiuto avere a disposizione etichette che. Per far ciò ci viene in aiuto il pannello “Uscita a”.Fig. ma solo di uno o alcuni bit. Sono in pratica l’equivalente dei commenti scritti Le strutture di controllo flusso Passiamo ora ad analizzare alcune delle cors o F L O W CO Fig. Solitamente non vogliamo impostare il valore dell’intera porta di uscita. e trasciniamola all’interno del diagramma. posizionandola proprio sotto il blocco precedentemente inserito. Ricordiamoci che 1 millisecondo equivale a 1000 microsecondi e che 1 secondo equivale a 1000 millisecondi. Inseriamo adesso un ritardo software all’interno del nostro schema a blocchi. Se selezioniamo “Singolo bit” possiamo scegliere quale bit impostare lasciando invariato il valore degli altri pin della porta. qualora volessimo realizzare diagrammi complessi. mentre come unità indichiamo “millisecondi”. Il valore che possiamo inserire deve essere di tipo intero. Possiamo scegliere l’entità del ritardo da inserire indicandone il valore e l’unità di misura. il blocco permette di inserire un ritardo nell’esecuzione del flusso del programma. Per eseguire questa operazione selezioniamo l’icona del blocco di ritardo. anche se per progetti molto semplici può sembrarci inutile. 17. ci indichino che cosa implementa quel particolare blocco. Come è possibile vedere in Fig.5s basterà che inseriamo all’interno della casella “valore ritardo”. .Ripeti Il blocco implementa di default la struttura “Finché”. Selezione multipla Utilizzando l’icona selezione è possibile implementare la funzionalità di selezione multipla. Analizziamo le tre opzioni offerte: Ciclo “Finché” Fintanto che l’equazione di confronto risulta vera vengono eseguite le istruzioni all’interno del ciclo.finché . altrimenti eseguirà l’altro ramo. In pratica. È l’equivalente del costrutto “switch… case” di un programma implementato in linguaggio C. Il flusso di programma è deviato attraverso il ramo per il quale l’equazione di confronto soddisfa il valore indicato all’interno del caso specifico. In pratica se uno dei rami indicati ha come etichetta il valore che soddisfa l’equazione viene eseguito. ma per realizzare gli altri due costrutti basta modificarne le proprietà come visto per gli altri blocchi nelle sezioni precedenti.. Ciclo “Esegui…Finché” Impostando la proprietà del blocco “Testa il ciclo a:” al valore “Termine”. Il confronto è effettuato al primo ingresso nel blocco di ciclo ed ogni volta che vengono terminate tutte le istruzioni interne al ciclo. il programma eseguirà le istruzioni presenti nel ramo di default. altrimenti viene scartato.Finché . Icona ciclo L’icona Ciclo permette di realizzare tre differenti controlli di flusso: . il programma continuerà l’esecuzione dei blocchi presenti nel ramo identificato dall’etichetta “si”. il C. Qualora nessuno dei casi indicati soddisfi l’equazione di selezione. il codice interno al ciclo non viene eseguito neppure una volta e il programma continua la sua esecuzione ignorando le istruzioni contenute all’interno dei due blocchi di ciclo. Per coloro che conoscono il linguaggio C il blocco è l’equivalente dell’istruzione “if”. Decisione binaria Mediante l’icona decisione è possibile implementare la funzionalità di decisione binaria. In Flowcode possono essere utilizzate tutte le normali strutture di controllo presenti normalmente nei linguaggi di programmazione come. 19 Struttura di selezione multipla. Un esempio d’uso della struttura di selezione multipla è riportato in Fig. 20 Ciclo “while” (Finché vero). ma questo numero è più che sufficiente per realizzare la maggior parte dei possibili programmi. Solo uno dei rami può essere eseguito ed ognuno deve avere un valore di selezione differente dall’altro. a titolo di esempio. 19. Possono essere realizzate selezioni con massimo 10 differenti casi. Quando il confronto risulta falso le istruzioni interne non sono più eseguite e il programma continua attuando le istruzioni successive al ciclo. come in Elettronica In ~ Giugno 2013 135 Fig. se la condizione è verificata. in base al valore del confronto effettuato all’interno del blocco. Il blocco fa sì che il flusso di programma passi per il primo o il secondo ramo. Un esempio di ciclo di questo tipo è riportato in Fig..Esegui.E corso F L O WCOD Fig. 20. altre icone presenti nella “barra delle icone”. Nel caso in cui l’equazione di confronto risulti falsa al primo controllo. Il confronto è effettuato al termine del blocco. Fig. lo rendiamo equivalente al blocco realizzato in C con le istruzioni “Do While”. 22. Il blocco è fondamentale quando abbiamo bisogno che una porzione del nostro diagramma di flusso venga eseguita per un numero predefinito di volte. 22 . Ciclo “Ripeti” Selezionando la proprietà del blocco a “Numero cicli:”. 21. Esempio pratico: facciamo lampeggiare un LED… Ora che conosciamo i blocchi principali e le possibili variazioni per il controllo di flusso. Configurato in questo modo le istruzioni interne vengono eseguite un numero di volte pari al numero indicato nella cella a fianco dell’impostazione “Numero cicli:”.Ciclo “Ripeti”. possiamo implementare un semplice diagramma per far lampeggiare un LED. 23 Scheda EB006 a sinistra e scheda E-Blocks EB004 a destra. 21 .Finché”. Per realizzare questo esempio abbiamo bisogno dei seguenti componenti: - EB006 “USB PICmicro multiprogram- cors o F L O W CO Fig. In questo caso l’istruzione di confronto è eseguita al termine di ogni attuazione delle istruzioni contenute all’interno del ciclo. Il codice interno è quindi eseguito almeno una volta. come è stato fatto in Fig.Ciclo “Esegui . DE 136 Giugno 2013 ~ Elettronica In . Fig... il ciclo viene impostato per funzionare come un “for”.Fig. Per evitare danni aiutiamoci con il tappo di una biro ed eseguiamo l’operazione come indicato nella sequenza di Fig.. 24 Metodo per la rimozione del microcontrollore PIC. Premiamo sul pulsante “Apri progetto” nella barra degli strumenti e selezioniamo il file “ConfigurazioneBase. Dal menu scegliamo “File/Salva con nome. all’interno dello zoccolo. Jumper selezione alimentazione Jumper selezione Programmatore Jumper selezione funzione pin oscillatore Selettore oscillatore Elettronica In ~ Giugno 2013 137 . 26. inseriamo il PIC18F4550. assicurandoci che tutti i piedini entrino senza piegarsi. mer board” - EB004 “LED Board” - PIC18F4550 - Quarzo 12MHz La scheda EB006 contiene il microcontrollore e l’hardware necessari per interfacciarsi con le altre schede EBlocks e il PC dal quale lo programmiamo.” e indichiamo come nuovo nome “LampeggioLed.corso F L O WCOD E Fig.fcf”. I jumper di selezione dell’alimentazione devono essere posizionati sul lato di sinistra. come illustrato in Fig. dato che Flowcode durante alcune operazioni salva automaticamente il progetto. Questa operazione è molto delicata. deve essere configurata per poter essere utilizzata nel nostro esempio. Proviamo ora a pensare Fig. Per evitare di “sporcare” il file. in modo da far sì che l’alimentazione provenga dall’USB. quindi dobbiamo prestare molta attenzione nel rimuovere il microcontrollore senza danneggiare la scheda di sviluppo. Il jumper di programmazione deve anch‘esso essere settato su USB. 24. Apriamo Flowcode e carichiamo la configurazione di base che avevamo salvato durante la configurazione del nostro primo progetto. in modo da poterlo programmare direttamente da PC. 25 Configurazione selettori e jumper scheda EB006.. senza l’ausilio del programmatore ICSP della Microchip. finché i piedini risultano paralleli al bordo. Colleghiamo ora la scheda EB006 con la EBlocks EB004 utilizzando la PORT A. appoggiando il PDIP di traverso e facendo leva sul case. Un riassunto grafico dell’impostazione dei vari jumper è riportato in Fig. salviamo immediatamente il progetto con un nuovo nome. Per piegare correttamente i piedini del PDIP40. Facendo attenzione alla direzione dell’alloggiamento a 40 pin. 25.fcf”. A questo punto sostituiamo il quarzo L’hardware è ora pronto e possiamo dedicarci all’implementazione del programma. Sostituiamo ora il microcontrollore che è attualmente montato sulla scheda con il PIC18F4550. possiamo aiutarci con il piano della nostra scrivania. con uno a 12MHz e spostiamo il jumper di selezione della sorgente di clock su “OSC” e l’interruttore di selezione oscillazione su “XTAL“. Salviamo il progetto premendo il pulsante “salva progetto” nella “barra degli strumenti” perché lo riutilizzeremo in seguito come base di partenza per altri esempi. 26 Configurazione completa per la realizzazione dell’esempio. . 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. cors o F L O W CO alle operazioni che devono essere eseguite per fare in modo che si veda lampeggiare un LED sulla scheda.dopo il blocco di set a zero della porta. Inseriamo due blocchi all’interno del ciclo e impostiamoli in modo che il primo setti il bit 0 al valore 1 e il secondo il bit 0 al valore 0. Impostiamo il valore del ritardo a 1 secondo per entrambi i blocchi inseriti. 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. Se eseguissimo il flusso così com’è attualmente implementato. Abbiamo poi bisogno di qualcosa che ci permetta di modificare il valore di un pin del microcontrollore ed il blocco che fa al caso nostro è l’icona uscita.Fig. vedremmo a causa dei fenomeni fisici interni al nostro occhio il LED sempre acceso. Per evitare questo problema inseriamo un blocco di ritardo dopo il set a uno della porta e un altro – identico . 27 Diagramma di flusso per il lampeggio del led collegato alla porta A pin 0. Premiamo il pulsante “compila e trasferisci” per caricare il programma all’interno del microcontrollore presente sulla nostra scheda di sviluppo. Innanzitutto dobbiamo realizzare un ciclo infinito che il programma dovrà eseguire per tutto il tempo di attività e per questo scegliamo il blocco “Finché”. ma con un’intensità minore rispetto a quella massima. 138 Giugno 2013 ~ Elettronica In DE Fig. Impostiamo in modo che il ciclo venga sempre eseguito come descritto nella sezione precedente. l’innovativo sistema di sviluppo grafico per microcontrollori proposto da Matrix Multimedia. presentate le strutture di controllo ed è stato illustrato un primo esempio di programmazione. Successivamente verranno descritte due funzionalità molto potenti di flowcode: le macro e i componenti. È stato presentato l’ambiente grafico. delle costanti e descriveremo i blocchi ingresso e calcolo. Le variabili in Flowcode Nella puntata precedente abbiamo utilizzato unicamente periferiche di uscita e non abbiamo mai fatto uso di variabili. Flowcode permette di sviluppare con facilità il software per applicazioni embedded in quanto il codice viene scritto facendo uso di oggetti grafici. Elettronica In ~ Luglio / Agosto 2013 113 . sviluppato da Matrix Multimedia. Con le conoscenze acquisite realizzeremo il secondo progetto pratico: la gestione del modulo E-block LED tramite il modulo KeyPad. 2 corso di programmazione in F L OWCODE di Francesco Ficili e Daniele Defilippi N ella scorsa puntata del corso abbiamo iniziato a prendere confidenza con l’ambiente di sviluppo grafico FlowCode. In questa puntata spiegheremo l’uso delle variabili. come illustrato in Fig. Attraverso il menu principale di Flowcode “Visualizza->Esplora progetto”. usandone i rispettivi componenti software. apriamo il pannello aggiuntivo nel quale possiamo esaminare tutte le costanti e le variabili globali disponibili all’interno del nostro progetto. 1. Seconda puntata. in luogo dei classici linguaggi di programmazione come il C e l’Assembler. descritta dettagliatamente l’interfaccia.E corso F L O WCOD Continuiamo il nostro viaggio alla scoperta di Flowcode. che sono invece una parte molto importante della programmazione in quanto ci permettono di memorizzare dati ed effettuare calcoli. Fig. come mostrato in Fig. Luglio / Agosto 2013 ~ Elettronica In Rimozione di variabili/costanti Qualora volessimo cancellare una variabile o una costante è sufficiente selezionare con il mouse l’elemento desiderato dal pannello “esplora progetto”. giungere una nuova costante posizioniamo il mouse sull’etichetta “costanti”. Fig. 1 Progetto Flowcode con pannello esplora progetto visibile sulla destra della schermata. Per configurare la variabile dobbiamo inserire il nome. Nella finestra di configurazione. Premendo sul pulsante “Aggiungi nuovo” viene aperta la finestra di creazione di una nuova variabile. il suo valore e una breve descrizione. 3. cors o F L O W CO Aggiungere variabili Per aggiungere una nuova variabile dobbiamo posizionare il mouse sull’etichetta “variabili” e cliccare con il tasto destro in modo da poter scegliere dal menu a tendina la casella “aggiungi nuovo”. numeri a virgola mobile e stringhe. 4. e premere il pulsante “Canc”.Finestra di creazione/ configurazione variabile. con o senza segno. 4 . il valore iniziale. Premendo il pulsante “OK” la variabile viene creata e aggiunta alla lista nella finestra di esplorazione del progetto. Le costanti non necessitano dell’indicazione di tipo perché vengono trattate come delle “#define”. all’interno della sezione “Globali”. mostrata in Fig. Per far ciò basta cliccare con il tasto destro su “Variabili” o “Costanti” all’interno 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”. Per ag- Fig.Finestra di creazione/ configurazione costante. 2. 2 .Aggiunta variabile. . inseriamo il nome della costante. I tipi di dati finora supportati spaziano da logici a numerici. Al termine del progetto potrebbe risultare molto utile rimuovere tutte quelle variabili/costanti che risultano incluse nella lista. ma non sono utilizzate all’interno del nostro progetto. come evidenziato in Fig. 3 . clicchiamo con il tasto destro e scegliamo dal menu a tendina “Aggiungi nuovo”. una breve descrizione e il tipo. rispettivamente ai valori 0 e 1. 114 Fig. 6. Nella vaSelezionando dalla lista a scorrimento riabile “VariabileIngresso” avremo il valore “Port:”. 6 .Finestra di selezione operazioni. il blocco. Premendo sulla freccia a destra Blocco calcolo della casella di testo apriamo la finestra di Altro blocco di fondamentale importanza è Elettronica In ~ Luglio / Agosto 2013 115 . Siamo ancora state create. come mostrato in Blocco ingresso e calcolo Fig. per gli altri blocchi. utilizzare il blocco di ingresso presente nella lista. eseguendo un doppio Facciamo un esempio. Il blocco ingresso è il blocco Esattamente come per il duale del blocco uscita che pannello di configurazione abbiamo utilizzato nella delle uscite. 5 Blocco di ingresso e finestra di configurazione dal menu a tendina l’opzione “Cancella inutilizzati”. impostiamo la porta dalla quale vo. 7 la variabile assumemascheratura porta di ingresso. inserirla direttamente nella casella di testo di configuraBlocco ingresso zione del pannello. mostrata in Fig. Possiamo scegliere tra La scorsa puntata avevamo le variabili locali o tra quelle esaminato il blocco di output globali e. è possibile aprire la finestra PORTA abbia un valore pari a 9. selezione che può aiutarci a scegliere quale variabile utilizzare. possiamo quindi capaci di imporre crearle direttamente dalla il valore di una porta/pin finestra come abbiamo fatto di uscita e di attendere un in precedenza dal pannello tempo prefissato tra due “esplora progetto”. cioè 8. Come perché solo il pin 1 e 3 hanno la spunta. Nell’esempio Fig.8 mascherato con 0b00001010 che ha come gliamo effettuare la lettura e. qualora non fossero e quello di ritardo. che in di configurazione. Supponiamo che clic sull’icona. 5. 7 . nella casella risultato 0b00001001 AND 0b00001010 = di testo “Variabile:”. Per inserire in Fig.Esempio di microcontrollore. Impariamo ora a doppio clic su una variabile variabile. inseriamo il nome della 0b00001000.corso F L O WCOD E Fig. sono disponibili puntata precedente per le opzioni “Singolo Bit” e la controllare i pin di uscita del mascheratura. variabile nella quale vogliamo caricare il valore letto. Facendo Fig. possiamo e di calcolo. binario equivale a 0b00001001. trasciniamo dalla rà il valore di PORTA. ma “Barra delle icone” l’icona corriunicamente per il 2° e 4° bit spondente nel diagramma di flusso. OR. float) Moltiplica due numeri in notazione a virgola mobile float = fdiv(float. * . Creare una macro Per creare una macro entriamo nel menu “Macro” e premiamo su “Nuova. logici Tabella 2 . ma normalmente non è possibile implementare un intero flusso su un unico diagramma. float) Controlla se un numero in virgola mobile è maggiore dell’altro byte = float_le(float. <= . maggiore di. float) Differenza tra due numeri in notazione a virgola mobile float = fmul(float. maggiore o uguale a >>. Gli operatori logico/matematici che possiamo utilizzare sono rappresentati in Tabella 1. NOT. Per inserirlo basta scegliere l’icona calcolo dalla “Barra delle icone” e trascinarlo all’interno dell’area di progetto. In pratica ci permette di creare delle sottoparti di diagramma su aree di lavoro differenti e di poterle richiamare agevolmente.|. come mostrato in Fig. XOR NOT. 9 Esempio di calcolo per conversione di unità di misura da pollici in centimetri. ~. delle costanti e delle funzioni che Flowcode ci mette a disposizione.. sottrazione.&. OR. ! AND. mentre nella parte di destra è presente un pannello di selezione dal quale possiamo attingere i valori delle variabili. bit per bit NOT.) Parentesi = .bit per bit && . <> Uguale a.Funzioni utilizzabili in Flowcode. OR.Fig. Il frammento di codice necessario per svolgere questa semplice operazione è indicato in Fig. La finestra di configurazione ci permette di gestire e configurare tutte le caratteristiche salienti della macro. float) Divide due numeri in notazione a virgola mobile float = fmod(float. Per capirne meglio il funzionamento facciamo un semplice esempio. Le funzioni valide sono invece riportate in Tabella 2. << Spostamento a destra. OR . Il blocco macro ci è di ausilio in questo compito. 8.^ NOT. 9. float) Esegue il MODULO di due numeri in notazione a virgola mobile byte = isinf(float) Verifica se il numero in virgola mobile è infinito byte = isnan(float) Verifica se il numero in virgola mobile è un numero byte = float_eq(float.”. float) Controlla se un numero in virgola mobile è minore o uguale all’altro byte = float_lt(float. >= Minore di. minore o uguale a. quello che ci permette di svolgere i calcoli all’interno del nostro diagramma di flusso. (. float) Nella casella di testo “Calcoli” possono essere inserite le righe nelle quali specifichiamo i calcoli da effettuare. spostamento a sinistra. Somma due numeri in notazione a virgola mobile float = fsub(float. 8 Finestra proprietà del blocco calcolo. || . Le macro e i componenti software Gli esempi che abbiamo visto fino ad ora utilizzavano un numero limitato di blocchi per implementare la funzionalità. AND .. OR Esclusivo . AND. . convertire in centimetri all’interno della variabile “LunghezzaCm”. Facendo doppio clic sul blocco entriamo nella finestra di configurazione. OR Esclusivo. > .Operatori logico/matematici. Tabella 1 . float) Controlla se un numero in virgola mobile è maggiore o uguale all’altro byte = float_gt(float. float) Controlla se un numero in virgola mobile è minore dell’altro int = random() Genera un numero casuale tra -32768 e 32767 Fig. AND. moltiplicazione. divisione e modulo <. All’interno della casella “Nome della nuova macro” inseriamo il nome con il quale richiameremo la macro all’interno cors o F L O W CO float = fadd(float. float) Verifica l’uguaglianza di due numeri in virgola mobile byte = float_ge(float. / . diverso da + . MOD Addizione. Supponiamo di avere la variabile “LunghezzaInch” che contiene il valore di una lunghezza rappresentato in pollici e di volerla DE 116 Luglio / Agosto 2013 ~ Elettronica In . vedremo un esempio che ci aiuterà a comprendere come configurare e utilizzare una macro all’interno di un progetto Flowcode. I Fig. Trasmissioni Dati. 11 Principali componenti disponibili in Flowcode. tipo e nome delle variabili globali in modo che. Una volta creata. La barra dei componenti La libreria dei componenti di Flowcode è accessibile mediante la “barra dei componenti” mostrata in Fig. anche molto complessi. Wireless. anche se non è obbligatorio. 10 Barra dei componenti. Elettromeccanici. Possiamo trovare i seguenti principali raggruppamenti: Comuni. Uscite. esattamente come avviene per una classica funzione in linguaggio C. Il valore di ritorno è utilizzato quando si vuole restituire al diagramma chiamante un valore mentre le variabili globali possono essere utilizzate in tutti gli altri casi. la macro può essere istanziata nel diagramma di flusso usando l’icona “macro” e valorizzando opportunamente gli eventuali parametri. Una macro può comunicare con il diagramma che la istanzia facendo uso di parametri. nella descrizione della macro. Per il momento i gruppi e i componenti disponibili sono quelli che vi mostreremo durante il corso. Elettronica In ~ Luglio / Agosto 2013 117 . I blocchi disponibili sono organizzati per area tematica in modo da facilitarci nella ricerca. Questa potenzialità di Flowcode ci permette in pratica di creare una libreria di macro che possiamo incrementare ogni qualvolta creiamo una funzione che pensiamo possa essere utile e riutilizzabile in altri progetti. La macro scelta verrà quindi salvata in formato “*. è vivamente consigliato inserire dei commenti all’interno della casella “descrizione nuova macro” per facilitare in futuro la comprensione della funzionalità che svilupperemo all’interno. I componenti possono essere utilizzati per aiutarci nella realizzazione di sistemi. qualora si dovesse riutilizzare la macro in altri diagrammi.corso F L O WCOD E Fig. Periferiche.fcm” e potrà essere importata utilizzando lo stesso menu. mentre fondamentale è la possibilità di utilizzare i componenti. I parametri sono utilizzati quando è necessario passare dei valori dal diagramma chiamante alla macro. Ingressi. La libreria dei componenti è suddivisa in base alla tipologia. Moduli Miac e Varie. componenti sono stati realizzati da Matrix Multimedia per esserci di aiuto nello sviluppo di progetti complessi. 10. I componenti La possibilità di creare delle macro è molto importante. del nostro diagramma di flusso e. Quando una macro utilizza delle variabili globali sarebbe buona norma indicare. ma nelle versioni successive questa libreria sarà sicuramente più ampia e ricca di nuove funzionalità. Durante la spiegazione del progetto pratico di questa puntata. lasciandoci così concentrare sulla Esportare e importare una macro Mediante il menu “macro” nella barra principale di Flowcode è possibile esportare una macro in modo da renderla disponibile per altri progetti. permettendoci di trascurare l’implementazione effettiva del driver del componente. si possano ricreare tutte le variabili in modo corretto. di valori di ritorno e di variabili globali. Ora il componente è attivo all’interno del nostro progetto ma. deve avere le connessioni configurate opportunamente. come rappresentato in Fig.deve essere configurato utilizzando la propria interfaccia specifica. come in Fig. 12 Inserire il componente “LED” utilizzando la “Barra dei componenti”. Configuriamo le connessioni per collegare Fig. Aggiungere un componente software Per aggiungere un componente software basta cliccare sulla barra di libreria (nel nostro caso inseriamo un LED. 13 Menu connessioni relativo al componente. cors o F L O W CO DE 118 Luglio / Agosto 2013 ~ Elettronica In . A questo punto si apre un menu a tendina: premiamo su “Connessioni” in modo che si apra la finestra di settaggio come mostrato in Fig.dopo essere stato inserito . Nelle sezioni successive ne vedremo alcuni esempi. 13) e vedremo apparire nel pannello. per funzionare correttamente. un componente .Fig. il componente che abbiamo scelto. 13. Clicchiamo sul componente con il tasto destro del mouse. 14. funzionalità che vogliamo implementare. Per essere correttamente utilizzato. in basso. con lo stesso sistema. Fig. 17. pilotare dei relè. come mostrato in Fig. Elettronica In ~ Luglio / Agosto 2013 119 . Nel pannello relativo al componente LED è possibile impostarne la forma. come mostrato in Fig. 14 Esempio di connessione per il componente LED. Per ogni componente verrà aperta una finestra specifica con differenti caratteristiche configurabili. Progetto Pratico: gestione di 3 LED tramite Keypad Passiamo adesso alla realizzazione di un progetto che ci consenta di mettere in pratica alcuni dei concetti esposti in questa puntata e che ci aiuti a prendere maggior confidenza con i primi componenti di Flowcode. dove necessario. all’interno del nostro flusso di programma. Per far ciò basta inserire l’icona “macro componente”.corso F L O WCOD E Fig.Proprietà extra relative al componente LED. • alla pressione del tasto 2 del KeyPad accendere il LED2 e spegnere gli altri LED. avendo scelto il LED. Per poter funzionare correttamente. • alla pressione del tasto 3 del KeyPad accendere il LED3 e spegnere gli altri LED. accessibili mediante tasto destro sul componente. Più blocchi possono utilizzare lo stesso componente in modo da svolgere una o più attività all’interno del diagramma di flusso. 15 Macro disponibili per il componente LED. • alla pressione del tasto cancelletto del Keypad spegnere tutti i LED. abbiamo a disposizione due macro: quella per accendere il led “LEDOn” e quella per spegnerlo “LEDOff”. 16 . nel nostro caso LED(0). Vedremo così apparire nella parte di destra le macro che possono essere chiamate. il componente LED al pin 0 di PORTA. Fig. Per far ciò basta che con doppio clic entriamo nella finestra “Proprietà: Componente macro” e selezioniamo nella parte di sinistra il componente al quale deve far riferimento il blocco. In questo caso. Tutti i componenti hanno inoltre delle proprietà extra. Abbiamo utilizzato i LED per semplicità didattica ma avremmo potuto. Selezioniamo la funzionalità voluta e premiamo il pulsante “OK” per terminare la configurazione. Ora il componente software è configurato ed è possibile inserirlo. selezionando la voce “Proprietà extra”. 15. Quello che ci proponiamo di realizzare è un sistema di controllo che gestisca i dati in ingresso da un KeyPad a 12 tasti (il classico KeyPad telefonico) e che utilizzi le informazioni lette per gestire un gruppo di tre LED. delle elettrovalvole o altri carichi esterni. il colore e la polarità. selezionandola dalla “Barra delle icone” e trascinarla in posizione corretta all’interno del nostro diagramma. il blocco deve essere configurato. Le specifiche del nostro sistema sono le seguenti: • alla pressione del tasto 1 del KeyPad accendere il LED1 e spegnere gli altri LED. 1 e 2 e le quattro DE 120 Luglio / Agosto 2013 ~ Elettronica In . 17. dalla barra dei componenti inseriamo nel nostro progetto un componente “Keypad” e tre componenti “LED”. il componente comparirà nel pannello sotto l’area di progetto. che sono le periferiche che dovremo gestire. Per realizzare questo progetto abbiamo bisogno dei seguenti componenti: - EB006 “USB PICmicromultiprogrammerboard” (PIC18F4550 e Quarzo 12MHz) - EB004 “LED Board” - EB014 “Keypadboard” Colleghiamo ora le schede in modo da avere i LED su PORTA ed il tastierino sulla PORTB. In questo nuovo progetto faremo uso dei primi componenti. 18. 18 Finestra connessioni del componente keypad. colleghiamo le tre colonne e le quattro righe alla porta B (le tre colonne ai pin 0. Apriamo ora il progetto vuoto che avevamo creato con il nome “ConfigurazioneBase. Come evidenziato in figura. In questo modo il microcontrollore risulta già configurato per funzionare con l’hardware a nostra disposizione: possiamo così dedicarci alla realizzazione del diagramma di controllo del sistema. per inserire un componente bisogna selezionarlo dalla barra dei componenti. 17 . Comparirà la schermata di Fig. cominciando dal KeyPad.Collegamento E-Blocks per la realizzazione del progetto pratico. quindi. Dopo averlo selezionato. cors o F L O W CO Fig.fcf”.Fig. Eseguiamo un clic con il tasto destro sul componente keypad comparso sul pannello e selezioniamo l’opzione “connessioni”. come mostrato in Fig. A questo punto configuriamo le connessioni dei componenti. Fig. Come spiegato in precedenza. fcf” e salviamolo con il nome “SwitchLed. 19 Finestra connessioni del componente LED. 5. 21. Una volta realizzato il ciclo. collegandoli rispettivamente ai pin 0. 6 e 7). 20 Finestra di proprietà del componente. riportata per comodità in Fig. e chiamiamola LetturaKeypad (come tipo scegliamo un unsigned byte). Creiamo una variabile sfruttando il pulsante con il simbolo della freccia in basso presente sulla finestra attiva. Una volta eseguite le connessioni confermiamo premendo su “Fatto…”. inseriamo anche un blocco “Macro Componente” ed una struttura “Selezione”. Se avete eseguito tutto correttamente dovreste avere un risultato simile a Fig. righe ai pin 4. Fig. inserendo il classico ciclo principale.E corso F L O WCOD Fig. dotandola di quattro casi. A questo punto possiamo iniziare la stesura del blockdiagram. 19 è possibile vedere la configurazione del primo LED. ed esaminiamo la finestra che si apre. Selezioniamo il componente Keypad e la macro GetKeypadNumber che ci consentirà di rilevare il tasto premuto. 1 e 2 della porta A. Elettronica In ~ Luglio / Agosto 2013 121 . 21 Creazione della variabile di LetturaKeypad. all’interno del quale creeremo la nostra applicazione. A questo punto ci serve una variabile per immagazzinare il valore. In Fig. 22 Schema a blocchi parziale del progetto. Allo stesso modo configuriamo i tre LED. che poi utilizzeremo nella successiva struttura di selezione. A questo punto eseguiamo un doppio clic sul blocco “Macro Componente”. 21. Se abbiaflusso dovrebbe apparire come mo eseguito tutto correttamente quello riportato in Fig. 25. cors o F L O W CO Fig. 23. quello riportato in Fig. lori numerici 1. Fig. riportato in Fig. AssociaNella macro inseriamo tre mo alla selezione la variabile blocchi “Macro componente” con precedentemente creata e valoi quali gestiremo i componenti rizziamo i primi tre casi con i vaLED precedentemente creati. casi. dovrebbe accendere il le macro appena create. struttura di selezione. la descrizione. DE 122 Luglio / Agosto 2013 ~ Elettronica In . come riportato Passiamo ora alla gestione della in Fig. a questo punto non ci come abbiamo visto in precedenza nel resta che collegare opportunamente gli g paragrafo dedicato alle macro ed inseriamo E-block e testare quanto realizzato. Creiamo una nuoè concluso. otterremo uno schema come Abbiamo quasi finito: non ci quello riportato in Fig. che chiameremo appunto LED0. so. 24 Proprietà del componente LED. secondo selezione e chiamiamo opportunamente le nostre specifiche. 26. 25 resta che gestire correttamente Creiamo altre due macro analoSchema a blocchi della il pilotaggio delle uscite nei vari ghe per l’accensione dei LED 1 macro LED0. 2 e 3 ed il quarto Chiamiamo la funzione LEDOn con il valore 11 (cancelletto). Il nostro progetto LED0 e spegnere gli altri. il blockdiagram complessivo è va macro. 26 Schema a blocchi complessivo. Cominciamo dal Macro” nei quattro rami della struttura di caso corrispondente al tasto 1 che. 23 Macro LED0. 22. Fig. utilizziamo delle macro specifiche per Ora posizioniamo quattro blocchi “Chiamata il pilotaggio delle uscite. A per il LED0 e la funzione LEquesto punto il diagramma di DOff per i LED 1 e 2. Per evitare di rendere il e 2 ed una macro di spegnimenblockdiagram troppo complesto che chiameremo LEDOff.Fig. Per agevolare i lettori nella sperimentazione abbiamo generato un file di configurazione base anche per il PIC18F4580. Successivamente passeremo alla descrizione della gestione delle memorie non volatili. e continueremo l’analisi dei componenti (che sono uno dei principali valori aggiunti di Flowcode) descrivendo il componente ADC ed il componente LCD. descrivendone la struttura ed analizzando gli elementi di base come le strutture di controllo e le strutture dati. 3 corso di programmazione in F L OWCODE di Francesco Ficili e Daniele Defilippi N elle precedenti puntate abbiamo analizzato in dettaglio l’ambiente di sviluppo. descrivendo la gestione degli interrupt. Vedremo così quanto sia semplice. In questa puntata ci occupiamo dell’implementazione degli interrupt in Flowcode e iniziamo ad analizzare i componenti. analizzando il componente EEPROM. passando dal PIC18F4550 al PIC18F4580. Terza puntata. l’innovativo sistema di sviluppo grafico per microcontrollori proposto da Matrix Multimedia. così come avevamo fatto in precedenza.E corso F L O WCOD Continuiamo il nostro viaggio alla scoperta di Flowcode. In questa puntata completeremo l’analisi delle strutture di controllo. Per i progetti di questa puntata cambieremo microcontrollore. Gli interrupt Come tutti gli ambienti di sviluppo per Elettronica In ~ Settembre 2013 129 . gestendo i progetti con Flowcode. cambiare target senza risentire di problematiche di configurazione e faremo qualche esperimento con un PIC diverso. Sfruttando le nuove conoscenze acquisite realizzeremo un progetto prati- co più evoluto rispetto ai precedenti: un termometro con display LCD. potremo accedere alla finestra proprietà del blocco. la gestione del programma si arresta. In Flowcode esiste un blocco speciale. basati su linguaggi classici come. A questo punto. Un interrupt può provenire da una porta di comunicazione.Fig. che segnala una situazione particolare che richiede una gestione differente rispetto al resto del programma. fornendo la possibilità di chiamare un’opportuna macro creata in precedenza. che è funzione dell’interrupt stesso e dell’architettura specifica del microcontrollore. Settembre 2013 ~ Elettronica In DE 130 cors o F L O W CO microcontrollori. quando viene generato un interrupt. nominandola LED. Normalmente. Il ciclo ci serve solo per evitare che il pro- . sfruttando i ritardi software. presente all’interno della barra delle icone e denominato appunto “blocco interrupt”. valore iniziale false) ed un’altra che chiameremo Counter (byte. Eseguiamo i passi necessari come abbiamo visto nella puntata precedente e generiamo anche una variabile che chiameremo LedStatus (booleana. Cerchiamo di fissare questo concetto con un esempio. partendo dal template ConfigurazioneBase2. ma anziché generare il ritardo con dei cicli software vuoti. fornito insieme al materiale relativo a questa puntata. ritorna il controllo al programma principale. che può generare un interrupt quando il suo valore corrisponde a quello di un registro di confronto. proviamo a generare la temporizzazione con una risorsa hardware interna al microcontrollore. Tutto ciò non è molto diverso da quello che accade con altri sistemi di sviluppo. riproponendo il progetto pratico visto nella prima puntata con una gestione ad interrupt. vedremo che per il PIC18F4580. il C: in quel caso la ISR è generalmente una comune funzione scritta in linguaggio C. ad esempio. Analizzando questo menu. Il concetto di interrupt è abbastanza delicato in ambito di sviluppo embedded. all’interno del quale era stata salvata la posizione corrente ed il contesto). da una risorsa interna. una volta terminata. la posizione corrente del program counter ed il contesto di esecuzione vengono salvati nello stack e il programma salta a una locazione specifica. e cambiamo il nome del progetto in Interrupt. viene eseguita una funzione speciale (in genere denominata ISR. In un sistema embedded un interrupt (o interruzione) è un segnale asincrono rispetto all’esecuzione del programma principale. Interrupt Service Routine) che “serve” l’interrupt e che.fcf. a seconda dei casi. Per prima cosa creiamo la macro che useremo come ISR. 1 Proprietà del blocco interrupt. Da questa finestra è possibile selezionare la sorgente dell’interrupt che ci interessa. che serve ad implementare la gestione degli interrupt all’interno di un programma Flowcode. anche Flowcode prevede la gestione degli interrupt. Nella prima puntata avevamo fatto lampeggiare un LED alla frequenza di 1 Hz. accedendo al menu a tendina “Interrupt Attivi”. Procediamo quindi creando un nuovo progetto Flowcode. eccetera. Se inseriamo questo blocco all’interno di uno schema Flowcode e clicchiamo due volte con il tasto sinistro. e a seguire un blocco ciclo. bisognerà indicare anche la relativa ISR. Proviamo adesso a fare la stessa cosa. proveniente da una specifica periferica. inseriamo un blocco interrupt. valore iniziale 0). come riportato in Fig. in quanto gli interrupt sono largamente utilizzati nella gestione dell’hardware e sono di fondamentale importanza man mano che i sistemi sviluppati si fanno più complessi. da un timer. sono disponibili diversi interrupt sui timer. 1. sulla ricezione della porta UART e altro ancora. Per farlo ci serviamo del Timer 2. sugli ingressi della porta B. che ha però la particolarità di essere chiamata quando viene generato il relativo interrupt. che ricomincia dal punto in cui era stato interrotto (recuperando tutte le informazioni necessarie dallo stack. A questo punto passiamo sullo schema a blocchi principale. Flowcode gestisce questo aspetto. Una volta selezionata la sorgente dell’interrupt. “dimenticandoci” della gestione ad interrupt. In questo ramo del flowchart si controlla il valore della variabile LedStatus. Una volta inserito. lo possiamo quindi considerare come la nostra “applicazione principale”. Infatti. invertendolo. A questo punto non ci rimane altro da fare che completare la macro precedentemente creata. sotto la voce “ingressi”. che non viene disturbata dall’esecuzione del main (in quanto asincrona rispetto a quest’ultimo). sfruttando il convertitore integrato nel microcontrollore. Se il valore è inferiore al valore della costante timeout (che abbiamo impostato pari a 50) non succede nulla. anche se non fa nulla. anche intervenendo sui vari pre e post-scaler non c’è modo di generare un interrupt a 1Hz. alla voce “interrupt attivi” selezioniamo TMR2 e clicchiamo su proprietà. per ottenere un interrupt a circa 50 Hz. Partendo da questa base tempi ci basterà semplicemente utilizzare un contatore di servizio per generare la frequenza di 1Hz che ci serve per pilotare opportunamente il nostro LED. di volta in volta. Completiamo la configurazione tornando sulla finestra precedente e selezionando la macro LED alla voce “verrà chiamata la macro”. Otterremo la finestra di Fig. Questo componente permette di configurare e gestire in maniera semplice un canale analogico di ingresso. Il componente ADC Passiamo ora all’analisi di uno dei componenti che utilizzeremo nel prossimo progetto pratico: il componente ADC. Funzionando a 12 MHz. Notate che questo esempio non è puramente didattico. ad ogni chiamata della macro viene incrementato il contatore “Counter”. 2. 3 Flowchart della macro LED. cambiato e che ora il pin controllato è D0) e vedrete lo stesso effetto ottenuto nel caso dell’oscillazione generata con i ritardi software. A questo punto provate a “flashare” il microcontrollore con il flowchart fornito come esempio (notate che il micro è Fig. ci basterebbe inserire i relativi blocchi sul ciclo principale che attualmente è vuoto. Come abbiamo già visto nella Elettronica In ~ Settembre 2013 131 . che ci permette di configurare l’interrupt sul Timer 2. A questo punto configuriamo il blocco interrupt. se volessimo aggiungere funzionalità a questo programma. Il componente ADC può essere inserito selezionandolo dalla barra dei componenti. Per vedere come abbiamo fatto ci serviamo della Fig. rispetto al suo stato attuale e pilotando di conseguenza il LED. nel pannello comparirà una manopola del tutto simile a quella che si trova nei pannelli frontali della strumentazione da laboratorio. altrimenti si passa alla gestione effettiva del LED. mentre la stessa cosa non si potrebbe dire per la versione fatta con i ritardi software. Configuriamo quindi l’interrupt con i valori riportati in figura. 2 Proprietà interrupt timer 2.E corso F L O WCOD Fig. Nel menu a tendina. 3. gramma termini e riparta dal principio. Come si può vedere dallo schema a blocchi. Questo fa sì che ad ogni interruzione generata dal timer 2 venga chiamata la nostra macro. 6. anche per il componente LCD sono disponibili le solite proprietà “connessioni” e “proprietà extra”. Il componente LCD può essere inserito dalla barra dei componenti. Per quanto riguarda invece le macro che il componete ADC può sfruttare. In particolare. ma al momento non le prenderemo in considerazione in quanto non strettamente necessarie. la velocità di conversione e altro ancora. È possibile accedere a questi due menu cliccando con il tasto destro sull’icona del componente presente sul pannello. 5 Proprietà extra del componente ADC. questa interfaccia costituisce lo standard de facto per gli LCD alfanumerici monocromatici con interfaccia parallela. 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). Da questa finestra è DE 132 Settembre 2013 ~ Elettronica In . 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). basta selezionare la relativa voce nel menu che compare sempre cliccando con il tasto destro sull’icona del pannello. anche il componente ADC è dotato di “connessioni” e di “proprietà extra”. come la tensione di riferimento (Vref) . ne impostazioni base del componente. in Tabella 1 sono elencate le principali macro disponibili. 5.sono disponibili alcu- Il componente LCD Passiamo ora all’analisi del componente LCD. 4. che permette di impostare il pin del micrcocontrollore da utilizzare come ingresso analogico (nell’esempio An0). Cliccando sulla voce “connessioni” comparirà la finestra di Fig. comparirà la finestra di Fig. Per accedere alle “proprietà extra”. che ci permette di configurare le connessioni del display. 4 Finestra connessioni del componente ADC. che ci permetterà di aggiungere un output visuale ai nostri progetti.Principali macro disponibili per il componente ADC. Fig. Una volta eseguita questa operazione. Se clicchiamo sulla voce connessioni. all’interno del pannello verrà posizionata l’immagine di un display alfanumerico 16x2. cors o F L O W CO puntata precedente per il componente LED. il componente “LCD”.Fig. Come per gli altri componenti visti in precedenza. Il componente dispone anche di macro più specifiche. Il componente LCD permette di gestire un display a cristalli liquidi con controller Hitachi HD44780 (noto anche come Hitachi compatibile). sotto la voce “uscite”. Nome Macro Descrizione LeggiComeByte Il valore del canale selezionato è acquisito e il risultato è fornito con formato numerico e 8-bit di risoluzione. il componente sfrutta la configurazione parallela a 4-bit.impostazioni dell’icona a parte . 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). 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). Com‘è possibile vedere . selezionando. Tabella 1 . La finestra proprietà extra del componente ADC è riportata in Fig. VisualizzaStringa Visualizza la stringa passata come argomento CancellaLinea Cancella la linea passata come argomento. Diamo ora uno sguardo alle macro disponibili per questo componente. più altre caratteristiche che comunque sono utili più ai fini della simulazione che altro. 20x4…). In Tabella 2 sono indicate le macro disponibili per il componente LCD corredate della relativa descrizione. Nome Macro Descrizione Inizio Inizializza il display. 7. sarà possibile configurare la dimensione del display (16x1. stri progetti. 6 Connessioni del componente LCD. Comando Invia il comando passato come argomento. Per il componente EEPROM non sono presenti le connessioni. 16x4.E corso F L O WCOD possibile impostare le 6 linee necessarie all’interfacciamento del componente con il microcontrollore. Una volta inserito il componente vedrete comparire nel pannello un array bidimensionale che mostra la locazione di memoria e il suo contenuto. È disponibile invece l’opzione Fig. per capire come poterlo gestire efficacemente nei no- Fig. VisualizzaNumero Visualizza il numero passato come argomento già convertito in ASCII. Se apriamo invece la finestra “proprietà extra”. Le memorie non volatili Come sappiamo. Cursore Posiziona il cursore alla posizione indicata dai due argomenti x e y (coordinate del cursore). questa può essere utilizzata per l’immagazzinamento di dati che non devono essere persi dopo uno spegnimento del sistema. Scrivi_RAM Scrive nella RAM del controller i dati passati come argomento. VisualizzaASCII Visualizza il carattere ASCII corrispondente al byte passato come argomento. garantiti per circa un milione di cicli di scrittura e con una ritenzione di più di 40 anni. Il componente EEPROM Flowcode dispone di un componente apposito per la gestione della EEPROM interna. 7 Proprietà extra del componente LCD. Elettronica In ~ Settembre 2013 133 . in quanto questo componente non è collegato esternamente in quanto il bus per la gestione della memoria è interno al chip. diversi PIC dispongono al loro interno di un certo quantitativo di memoria non volatile di tipo EEPROM (Electrical Erasable and Programmable Read Only Memory). perché in questo caso non è necessario ricorrere all’uso di una memoria esterna I2C o SPI. Una on-board EEPROM può essere un grande vantaggio nel caso in cui si debba sviluppare un sistema embedded che ha esigenze di memorizzazione permanente di alcuni dati. 16x2. Il PIC18F4580 dispone di 256 byte di on-board EEPROM. rappresentata in Fig. Tale componente può essere inserito dalla barra dei componenti. Trasparente Cancella tutte le righe del display. Tabella 2 . selezionando sotto la voce “varie” il componente “EEPROM”.Principali macro disponibili per il componente LCD. 8 Proprietà extra del componente EEPROM. Sono disponibili più che altro proprietà relative alla simulazione ed è possibile settare a mano la dimensione della EEPROM. cors o F L O W CO Fig. che può essere selezionata sempre premendo il tasto destro sull’icona del componente presente sul pannello. Il sorgente Flowcode EepromTest. Per testare la EEPROM è stato realizzato un flowchart di prova che scrive in tutte le 256 locazioni di memoria un numero crescente da 0 a 256. Le specifiche del nostro progetto sono: • Lettura del termometro digitale sul canale analogico AN0. La finestra delle proprietà è visibile in Fig. 8. Write Scrive la variabile specificata con il parametro data all’interno della locazione specificata con il parametro address. “proprietà extra”. In Tabella 3 sono riportate le macro disponibili per il componente che sono tutte molto semplici.fcf è reperibile all’interno del materiale di supporto. altrimenti l’ambiente imposta quella massima relativa al chip utilizzato. per garantire il tempo necessario al completamento dell’operazione. Ciò che ci proponiamo di realizzare è un termometro digitale che impiega un LM335 ed un display LCD Hitachi compatibile. 9 Collegamento E-Blocks per la realizzazione del progetto pratico. L’unica accortezza da utilizzare è quella di lasciare un intervallo di almeno 200 microsecondi tra una scrittura e la successiva. DE 134 Settembre 2013 ~ Elettronica In . 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. Progetto Pratico: Termometro LCD Passiamo ora alla descrizione del progetto pratico relativo a questa puntata.Fig. nello sviluppo del quale metteremo in pratica le nuove conoscenze acquisite. Per la realizzazione del progetto utilizzeremo i seguenti componenti: - EB006 “USB PICmicro multiprogrammer board” (PIC18F4580 e Quarzo 12MHz). Viste le specifiche. Non abbiamo da memorizzare informazioni permanenti. Per farlo preleviamo riferimento e tensione di alimentazione dalla scheda madre (presenti sulla morsettiera J10) e li portiamo alle morsettiere a vite J1 della EB005 e J3 della EB016. • Visualizzazione continua della temperatura sul display. possiamo procedere allo sviluppo delle componenti software. non ci resta che distribuire anche le alimentazioni ai vari E-Block. Una volta completato il progetto. Procediamo trascinando i componenti sul pannello. Per questo progetto impostiamo: - Tempo di conversione: 50 cicli - Velocità di conversione: Fosc/16 - Opzioni Vref: Vdd Per quanto riguarda la voce “Tensione Elettronica In ~ Settembre 2013 135 . Per prima cosa preoccupiamoci di inserire e collegare opportunamente tutti i componenti che utilizzeremo nel progetto. Per farlo abbiamo fatto riferimento al datasheet dell’LM335. 10. La nostra scelta è caduta sul sensore con circuito di calibrazione. - EB005 “LCD board”. - EB016 “Prototype board”. Ora che i collegamenti di segnale sono ultimati. A questo punto procediamo alla realizzazione del circuito sulla breadboard e colleghiamo l’uscita del sensore all’ingresso analogico AN0 del microcontrollore. Prima di andare avanti. più o meno evolute. Ora che l’hardware è pronto. in quanto si utilizza un potenziometro per calibrare il sensore. bisogna realizzare il circuito di acquisizione della temperatura sulla scheda di prototipazione. 11 Connessioni del componente ADC. • Conversione del dato di temperatura in gradi Celsius. occupiamoci delle proprietà extra del convertitore analogico-digitale. • EB005 collegata alla porta C della EB006. I collegamenti sono illustrati in Fig. che riporta alcuni esempi di circuiti. ci occorre sicuramente un componente ADC ed un componete LCD. Questo circuito ci consente di avere una misura più precisa della temperatura. 11. come illustrato in Fig. Naturalmente Matrix dispone di alcune schede con sensori di temperatura. quindi effettuiamo la connessione con quel canale. quindi in questo progetto non avremo bisogno del componente EEPROM. A questo punto effettuiamo le connessioni. Colleghiamo le schede come segue: • EB016 collegata alla porta A ed alla porta B della EB006. ma volevamo mostrare ai lettori come sia possibile interfacciare qualsiasi tipo di sensore usando la scheda di prototipazione. il cui schema è riportato in Fig. Completate le connessioni.corso F L O WCOD E Fig. Useremo la EB016 per la realizzazione del circuito di acquisizione della temperatura tramite l’LM335. Il componente ADC dovrà leggere il canale analogico 0 (AN0). 10 Collegamento LM335. 9. Fig. potremo eseguire la calibrazione semplicemente agendo sul potenziometro ed utilizzando un termometro calibrato per ottenere la temperatura di riferimento. che troviamo disponibile sulla strip montata a ridosso del connettore J1 sulla EB016. In ogni caso potremo aggiustare in seguito la misura. Ricordiamo che l’interfaccia del display è parallela a 4-bit e utilizza due ulteriori segnali: RS ed Enable. Assicuriamoci di avere la finestra delle connessioni del display configurata come quella in Fig. cors o F L O W CO Vref” possiamo impostare 4. Non ci sono proprietà extra rilevanti per il display. Creiamo anche una ulteriore variabile. Passiamo ora alla realizzazione dello schema a blocchi che sarà composto da un flowchart principale e da tre macro: - Inizializzazione del sistema. 13 Creazione della variabile “Tensione”. collegato sulla porta C. chiamandola “Temperatura”. 12 e di avere il jumper della EB005 posizionato su “default”. usando il circuito di calibrazione che ci siamo preparati in precedenza. 13) con la quale immagazzineremo il valore di tensione letto sul canale AN0. A questo punto passiamo alle connessioni del display LCD.5V se alimentiamo il sistema tramite la porta USB (è la tensione tipica) o 5V se alimentiamo dall’esterno con un regolatore stabilizzato. componente ADC di Flowcode ci offre la possibilità di acquisire la lettura del canale analogico considerato direttamente in tensione. ritornando un float. Prima di passare all’analisi del flowcart ci serve ancora la definizione della struttura dati sulla quale andremo a lavorare. Il DE 136 Settembre 2013 ~ Elettronica In . Fig. Questa caratteristica risulta molto comoda perché così sarà più facile effettuare la conversione in temperatura. quindi per quanto riguarda la configurazione dei componenti e delle connessioni abbiamo concluso. 12.Fig. 12 Connessioni display LCD. In virtù di queste considerazioni creiamo una variabile di tipo “virgola mobile” e chiamiamola “Tensione” (come illustrato in Fig. all’interno della quale immagazzineremo il corrispondente valore di temperatura. come illustrato in Fig. 14 Macro Inizializzazione. - Lettura del sensore di temperatura. Fig. sempre di tipo “virgola mobile”. - Visualizzazione della lettura. Molto semplice. ritardo di 1 secondo. A questo punto bisogna convertire il dato letto in un dato di temperatura. L’LM335 ha un segnale in uscita proporzionale alla temperatura con fattore di proporzionalità di 10mV/Kelvin. Fatto questo si visualizza la stringa “Temperatura:”. come riportato in Fig. associabile ad una variabile di tipo float (virgola mobile). che permette di acquisire un canale analogico riportando direttamente il dato in tensione (in Volt). in modo che non rimangano porzioni di stringe scritte in precedenza. 18. Come si vede. 15. Questa macro è il cuore del programma. Per prima cosa si pulisce il display. lo si pulisce. Il dato immagazzinato all’interno della variabile “Temperatura” è già correttamente convertito in gradi Celsius. Il compito da eseguire è quello di acquisire il dato in tensione ed effettuare la conversione in temperatura. In questo flowchart usiamo solo chiamate a macro di componeti. si utilizzando tre blocchi “Chiamata Macro Componente”. 16 è riportata la finestra di proprietà del blocco “Chiamata Macro Componente” che realizza l’operazione. Ora anche la seconda macro è completata.E corso F L O WCOD Fig. A questo punto passiamo alla macro di lettura del sensore di temperatura. che abbiamo chiamato “AcquisisciLM335”. il cui flowchart è riportato in Fig. 17 Conversione del dato in tensione nel corrispondete valore di temperatura. A questo punto si usa la funzione “Cursore” per muoversi sulla seconda riga. Noi associamo il valore di ritorno alla variabile “Tensione”. un blocco “Calcolo” e un blocco “Ritardo”. 14. il cui flowchart è riportato in Fig. In Fig. 17. 15 Flowchart della macro “Acquisisci LM335”. si visualizza la stringa “Init System…”. quindi basterà convertirlo in codifica ASCII per ottenere la visualizzazione corretta. in modo che possa poi essere facilmente visualizzata dal display. Per introdurre questa formula nel codice usiamo un blocco calcolo. sfruttando le funzioni a corredo del componente LCD nonché le stringhe di contorno. 16 Finestra proprietà del blocco “Chiamata Macro Componente”. In sequenza le operazione eseguite sono le seguenti: si inizializza il display. Partiamo dalla macro di inizializzazione. che chiameremo “VisualizzaTemperatura”. si inizializzano le variabili e si genera un Fig. Per prima cosa si sfrutta la macro “LeggiCo- meTensione” del componente ADC. la macro di visualizzazione. Passiamo all’ultima macro da realizzare. in quanto il dato è già pronto e l’unica cosa che dobbiamo fare è scriverlo correttamente sul display. eppure la potenza di Flowcode ci permette di ridurla a due soli blocchi. che ha lo scopo di inizializzare il display e le variabili e di scrivere una prima riga di testo per informare l’utente. che verrà usa- Elettronica In ~ Settembre 2013 137 Fig. come stringa di intestazione. Invertiamo la formula. Il flowchart della macro di inizializzazione è riportato in Fig. . scaliamo il valore di tensione da V a mV e sottraiamo 273 per ottenere la temperatura in gradi Celsius. che avevamo creato in precedenza. inserendo i componenti appositi e collegando pochi blocchi. Il flowchart principale è riportato in Fig. Nella prossima puntata continueremo questo percorso. se abbiamo eseguito tutto correttamente. esaminando in dettaglio le interfacce di comunicazione che ci permettono di realizzare sistemi più complessi. realizzando un primo programma di un certo peso (un dispositivo che ha una reale funzione). 19 Flowchart principale dell’esempio pratico Termometro LCD. Come potete vedere è stata chiamata prima di tutto la macro “Inizializzazione”. è stato inserito un ritardo software di un secondo. possiamo agire sul potenziometro del circuito di calibrazione per regolarla. sono state inserite le due chiamate alle macro “AcquisisciLM335” e “VisualizzaTemperatura”. come abbiamo visto prima. Qui possiamo usare la macro “VisualizzaNumero” per visualizzare su display il valore immagazzinato nella variabile “Temperatura” che. 18 Flowchart della macro “VisualizzaTemperatura”. In questa puntata abbiamo iniziato a prendere confidenza con i componenti di Flowcode. all’interno di un ciclo while infinito. Ora abbiamo le tre macro pronte all’uso. e abbiamo cominciato a renderci conto di come. 19. vedremo comparire il valore della temperatura letta dal sensore sul display. interfacciati a periferiche esterg ne più intelligenti. l’ultima operazione da fare è metterle insieme sul flowchart principale e lanciare la compilazione. sia possibile implementare in breve tempo anche funzioni di una certa complessità. Ora non ci rimane altro da fare che visualizzare il carattere “C” per indicare che la temperatura è in gradi Celsius e riportare il cursore alla posizione di partenza: la nostra terza macro è così pronta. contiene il valore della temperatura in gradi Celsius. cors o F L O W CO ta per visualizzare il dato.Fig. Se la lettura non fosse corretta. DE 138 Settembre 2013 ~ Elettronica In . che li visualizza sul display LCD. Possiamo ora procedere con la compilazione e l’esecuzione del programma. La prima macro acquisisce il valore di tensione proveniente dal sensore di temperatura e passa i dati alla seconda. Per evitare un eccessivo effetto “Refresh” sul display Fig. Poi. Una volta programmato il micro. In questa puntata parleremo delle principali interfacce di comunicazione seriali a disposizione dei microcontrollori di bassa gamma: l’UART (o RS232). 4 corso di programmazione in F L OWCODE di Francesco Ficili e Daniele Defilippi N elle scorse puntate abbiamo spiegato la gestione degli interrupt in Flowcode e insegnato a utilizzare i componenti ADC. Con l’avvento dell’era digitale. ed uno o più segnali trasportano l’informazione del clock. il sistema di comunicazione maggiormente utilizzato è stato quello “parallelo”. Le periferiche di comunicazione di base I sistemi che abbiamo trattato finora erano in grado di gestire solo sistemi chiusi. Quarta puntata. il sistema di sviluppo grafico per microcontrollori proposto da Matrix Multimedia. dove i dati sono scambiati a pacchetti. LCD e la memoria EEPROM interna. che sono le interfacce di comunicazione. solitamente di 8 bit. Facciamo un piccolo passo indietro ed analizziamo brevemente le interfacce di comunicazione che sono state utilizzate in questi ultimi decenni. SPI e l’OneWire.E corso F L O WCOD Continuiamo il nostro viaggio alla scoperta di Flowcode. Termineremo con un progetto pratico nel quale svilupperemo un controllo di una batteria di relé comandata tramite porta seriale. in cui il codice viene scritto facendo uso di oggetti grafici. Il trasporto dei dati in parallelo non è Elettronica In ~ Ottobre 2013 113 . cioè non potevano interfacciarsi con piattaforme esterne. I bus di comunicazione sono in continua evoluzione ed oggigiorno ve ne sono di moltissime tipologie. l’I²C. Parleremo ora di altri componenti fondamentali di un microcontrollore. 2 Pannello di configurazione del bus SPI. Inizieremo parlando di quelli interni ed in particolare di SPI. I²C e OneWire. è divenuta il sistema di comunicazione comunemente utilizzato da memorie. Successivamente passeremo alla descrizione della RS232. mostrata in Fig. nelle quali il valore digitale da trasmettere è suddiviso in singoli bit. per questa ragione che sono state inventate le comunicazioni seriali. 1 Pannello SPI. ma. consigliabile sulle grandi distanze. Fig. All’interno della barra dei componenti nel menu Trasmissione dati troviamo il componente SPI. Possiamo suddividere i sistemi di comunicazione in due grandi famiglie. mentre quelli “tra sistemi” collegano apparati con compiti solitamente differenti su distanze anche molto ampie. La comunicazione mediante porta SPI necessita di tre collegamenti: • SDO/MOSI (Serial Data Output) dal quale i dati vengono inviati. quelli ricevuti e in basso i caratteri in coda. in base alla distanza che riescono a coprire: quelli “interni” permettono la comunicazione tra sistemi vicini o comunque appartenenti allo stesso sistema. devono essere valorizzati esaminando il data-sheet del componente che vogliamo collegare esternamente. è necessario configurarlo in modo che possa comunicare correttamente con le periferiche. • SCK/SCLK (Serial Data Clock) su cui viene trasmesso il segnale di clock. ADC e DAC esterni al microcontrollore. come mostrato in Fig. per queste ragioni. se lo inseriamo nel nostro progetto mediante un clic sulla relativa icona. Il box in cui si può indicare se trasmettere byte o caratteri non influenza la modalità DE 114 Ottobre 2013 ~ Elettronica In . impiegando quindi due soli fili. come una finestra suddivisa in tre parti. 2. • SDI/MISO (Serial Data Input) dal quale i dati vengono ricevuti. perché Flowcode mette a disposizione una potentissima libreria di componenti che ci permette di utilizzarla e gestirla in modo ancora più semplice. in modo che tutto possa funzionare correttamente. la comunicazione è detta di tipo full-duplex. cors o F L O W CO Serial peripheral interface (SPI) L’interfaccia SPI (acronimo di Serial Peripheral Interface) è semplice da utilizzare ed affidabile e. in quanto richiederebbe molti fili e -per contrastare il degrado del segnale. mentre tutte le altre sono di tipo “slave”.Fig. per questa ragione. 1. Più periferiche possono essere collegate allo stesso bus di comunicazione. Ora che il componente è stato inserito nel progetto. solo una di esse è di tipo “master”. nel pannello. I campi della finestra delle proprietà.l’amplificazione per ciascuno di essi. Partendo dall’alto verso il basso possiamo così esaminare i caratteri inviati. che sono trasmessi in ordine sequenziale sullo stesso canale di trasmissione. I dati trasmessi e ricevuti passano su due connessioni differenti e. Per poter utilizzare questo sistema di comunicazione non è comunque necessaria una conoscenza approfondita del livello fisico e di protocollo. notiamo che appare. interfaccia con la quale realizzeremo un progetto pratico. in questo caso. SPI_Get_Char SPI_Unint È utilizzata per ricevere un carattere. tra quelli disponibili nel menu a tendina.Parametri di configurazione del bus SPI. Per poter utilizzare questi componenti è inoltre necessario configurare le connessioni esterne dei piedini di abilitazione. entrambi su bus SPI. FramOutput Invia un valore alla memoria FRAM. Nome Macro Descrizione DAC_Send_Char Invia un carattere/byte al convertitore digitale/analogico che lo trasformerà direttamente in un valore analogico visibile sui morsetti esterni. Elettronica In ~ Ottobre 2013 115 . otteniamo il rapporto massimo che vi può essere tra le due grandezze e scegliamo il valore più grande. SPI Clock Edge Serve per scegliere se il dato è scritto durante il fronte di salita o discesa del segnale di clock. Tabella 3 . ma unicamente la loro visualizzazione sul componente nel pannello di Flowcode. In pratica. Al termine della configurazione possiamo inserire le macro gestite del componente dal menu delle icone. che contiene al suo interno una memoria FRAM (rimpiazzabile con una memoria EEPROM) ed un convertitore digitale/analogico.Macro supplementari per componenti specifici su bus SPI. come fatto per il componente KeyPad e per l’ADC esaminati nelle puntate precedenti. DisableFRAM Disabilita la memoria FRAM/EEPROM in modo da poter comunicare con altri dispositivi collegati sullo stesso bus SPI.Macro disponibili per il controllo del bus SPI. Qualora il componente scelto non appartenesse a questa lista o non Tabella 2 . Vi sono altre macro specifiche. è necessario abilitarla altrimenti tutti i comandi verrebbero ignorati. SPI Sample bit Indica quando il dato deve essere campionato per poter effettuare una corretta trasmissione/ricezione del dato da tutti i dispositivi collegati. 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. Deve obbligatoriamente essere minore di quella supportata dal componente più lento collegato al bus di comunicazione. È utilizzata per rimuovere le inizializzazioni della connessione SPI e poter quindi utilizzare i pin del microcontrollore come normali bit della porta di I/O. Prima di ogni comando verso la memoria. EnableFRAM Abilita la memoria FRAM/EEPROM. che risulta minore del risultato della frazione. Solitamente è posta ad inizio programma e viene chiamata una volta sola. SPI Clock Dividendo la frequenza massima della comunicazione per la frequenza di oscillazione del microcontrollore. modifica il punto di campionamento del dato. NVM_Get_Char Legge il valore memorizzato all’interno della cella di memoria indicata. Utilizzando queste semplici macro è quindi possibile utilizzare una memoria EEPROM/ FRAM od un DAC in modo davvero semplice ed intuitivo. di trasmissione/ricezione dei dati sul bus di comunicazione. SPI_Send_Char È utilizzata per inviare un carattere.E corso F L O WCOD Tabella 1 . SPI_Send_String È utilizzata per inviare una stringa di caratteri. SPI_Get_String È utilizzata per ricevere una stringa di caratteri. Parametro Descrizione Rappresenta la velocità di trasmissione dei dati. mostrate in Tabella 3. SPI Clock polarity È utilizzato per definire lo stato di inattività (idle) del segnale di clock. In questo caso le principali macro a nostra disposizione sono quelle elencate nella Tabella 2. Nome Macro SPI_Init Descrizione È utilizzata per inizializzare le periferica di comunicazione SPI. NVM_Send_Char Invia un dato alla memoria EEPROM che verrà caricato all’interno della cella selezionata. che ci possono essere di aiuto nel caso volessimo utilizzare la scheda EB013. All’interno della barra dei componenti possiamo selezionare il controller per il bus I²C ed inserirlo all’interno del pannello di Flowcode. passiamo al bus con il minor numero di connessioni possibili: una connessione unica per la trasmissione/ricezione di dati e segnale di sincronizzazione: il bus OneWire. Invece le macro a disposizione sono riassunte in Tabella 5.Parametri di configurazione componente I2C. 4. come mostrato in Fig. come visto per il bus SPI. in sequenza. La porta I²C Passiamo ora a descrivere il bus di comunicazione I²C. mediante una stringa che contiene un bit di start.Fig. Continuando nel nostro percorso di descrizione di bus di comunicazione. ma i parametri da settare sono differenti. Abilita l’utilizzo del SMBus sulla connessione I²C (modalità di compatibilità). fosse compatibile. i dati veri e propri. il cui protocollo richiede unicamente due linee di comunicazione: • SDA (Serial Data Line) per la trasmissione/ricezione dei dati . Enable SMBus Inputs Baud rate Imposta la frequenza con la quale vengono trasmessi i dati sul bus di comunicazione. Tabella 4 . Per utilizzare il componente è necessario configurarlo come abbiamo fatto precedentemente con il bus SPI. Qualora ve ne fossero più di una disponibili. A differenza dell’SPI. basterà semplicemente utilizzare le macro generiche in modo da realizzare il protocollo corretto. 3 Pannello del componente I2C Master. Parametro Descrizione Enableslew rate control Attiva il controllo sullo slew-rate (velocità dei fronti) del segnale trasmesso sul bus. Fig. Deve obbligatoriamente. inoltre. Il pannello appare come in Fig. IC2 hardware Seleziona quale periferica. 3 e ci permette di visualizzare le comunicazioni presenti sul bus e poter interagire aggiungendo byte nella comunicazione in modo da rendere la simulazione interattiva. essi sono quelli elencati nella Tabella 4. la comunicazione può essere iniziata solo dal master. è coinvolta nella trasmissione dei dati. possono essere inseriti due componenti I²C. Il bus SPI è di tipo half-duplex perché solo un componente alla volta può trasmettere i dati. cors o F L O W CO Sullo stesso bus possono essere collegati fino a 112 dispositivi differenti. • SCL (Serial Clock Line) per la trasmissione del clock di sincronizzazione. ciascuno su un differente canale in modo da avere due bus distinti di comunicazione. DE 116 Ottobre 2013 ~ Elettronica In . nel caso del bus I²C. oppure dei valori custom scelti utilizzando la barra a scorrimento. essere minore della velocità massima supportata dal componente più lento collegato al bus. sia i dati in trasmissione che quelli in ricezione viaggiano sulla stessa connessione fisica. Possono essere utilizzati i valori pre-configurati (preset). l’indirizzo dello slave con il quale vuole comunicare e un bit che indica se è richiesta una risposta. iniziando sempre dal bit più significativo. 4 Proprietà del componente I2C master. messa a disposizione dal microcontrollore. Successivamente vengono inviati. Per evitare problemi di cortocircuiti sulla linea è presente un pull-up. MI2C_Send_Byte_Transaction MI2C_Receive_Byte_Transaction Invia ad uno specifico dispositivo il valore che deve essere posto all’indirizzo indicato. Prima di poter utilizzare il componente è Fig. cioè una resistenza collegata tra la linea e l’alimentazione. tuttavia permette comunicazioni tra dispositivi in modo davvero semplice. In Tabella 8 sono riportate altre macro che potrebbero risultare utili qualora si volesse utilizzare il dispositivo DS1820. Invia il segnale di start della comunicazione sul bus I²C. Tabella 6 . Deve essere chiamata uno volta prima di eseguire le altre macro altrimenti non verrebbe trasmesso/ricevuto alcun byte. Invia il segnale di riavvio della comunicazione sul bus I²C. Non essendoci un filo dedicato per la trasmissione del segnale di sincronizzazione. MI2C_Transmit_Byte Trasmette un byte sul bus di comunicazione. indica che il byte da ricevere è l’ultimo. mostrata in Fig. Nel caso di ricezione. Le macro disponibili in Flowcode per gestire questa porta sono riassunte nella Tabella 7. come indicato in Tabella 6. perché sono codificati in base alla lunghezza dell’impulso. quest’ultimo deve essere trasmesso assieme ai dati. Si tratta di un bus di tipo Master/Slave. La codifica dei simboli differisce notevolmente dai casi esaminati in precedenza. 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. Riceve da uno specifico dispositivo il valore caricato all’indirizzo di memoria scelto. Nome Macro MI2C_Init MI2C_Start MI2C_Restart MI2C_Stop Descrizione Inizializza la periferica interna di comunicazione I²C. MI2C_Receive_Byte Riceve un byte dal bus di comunicazione. 5.Macro disponibili per la gestione della connessione I2C master. Restituisce zero se rileva la ricezione di una conferma di ricezione “acknowledge”. se posto a uno. La velocità di comunicazione non è elevatissima (è prefissata a 16 kbps). 5 Proprietà del componente OneWire. è presente il controllo mediante CRC a 8 bit che è trasmesso come primo byte.E corso F L O WCOD Tabella 5 . possiamo unicamente scegliere se utilizzare o no il controllo CRC. e tutti i dispositivi possono imporre uno zero sulla linea attivando il transistor/MOSFET di pilotaggio della porta connessa. Linea a 0 per almeno 480 µs Reset Valore logico uno 1÷15 µs linea a 0 Valore logico zero 60 µs linea a 0 Per accertarsi che il pacchetto di dati sia stato correttamente ricevuto/inviato. Elettronica In ~ Ottobre 2013 117 . 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. Nella finestra di configurazione del componente. cioè durante la comunicazione di dati dallo slave verso il master. Invia il segnale di stop della comunicazione sul bus I²C. Necessita della valorizzazione del parametro che. dove ogni dispositivo ha un indirizzo univoco e questo deve essere utilizzato dal master per iniziare la comunicazione con lo slave.Tempi di impulso per la trasmissione dei dati su bus OneWire. necessario configurare il piedino che sarà utilizzato per trasmettere/ricevere i dati. oo_Tx_Byte Trasmette un byte sul bus. quindi permette di far comunicare tra loro solo due dispositivi. oo_BusReset oo_GetPadByte Restituisce il dato letto dal dispositivo identificato dal parametro passato alla macro.Macro disponibili per la gestione del bus OneWire. ma generato in modo autonomo da entrambe le periferiche collegate. Restituisce 1 se vi sono stati dei problemi durante la scansione. che è una tra le più usate e semplici interfacce seriali. La Porta RS232 La RS232 è una linea di comunicazione asincrona. 7: con l’utilizzo di soli quattro blocchi possiamo comunicare con il componente dimenticandoci completamente tutte le problematiche inerenti al livello fisico e del protocollo di comunicazione. Legge il dispositivo identificato dal numero in ordine di scansione. DE 118 Ottobre 2013 ~ Elettronica In . 6. in quanto il segnale di temporizzazione non viene trasmesso. DS1820_Get_Temp Legge la temperatura del dispositivo DS1820. 7 . passiamo a descrivere la porta RS232. oo_Rx_Byte Riceve un byte dal bus.0625°C. 6 .Esempio di flusso di controllo per il componente DS1820. oo_ScanBus Esegue una scansione del bus per l’identificazione del numero di dispositivi. come indicato in Fig. oo_Get_DeviceCount Restituisce il numero di dispositivi rilevati sul bus dopo un comando di scansione del bus. oo_ReadDevice Tabella 8 . Un semplice esempio di diagramma di flusso per il controllo del bus OneWire per la gestione del componente DS1820 è raffigurato in Fig. Ora che abbiamo esaminato tre esempi di bus di comunicazione interni.Macro per la gestione del componente DS1820 su bus OneWire. Può essere utilizzata unicamente qualora vi sia un unico dispositivo collegato al bus altrimenti è necessario utilizzare la macro oo_ReadDevice. 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.Configurazione connessioni bus OneWire.Tabella 7 . cors o F L O W CO Fig. Restituisce uno se il dispositivo è entrato in time-out senza terminare la conversione. DS1820_Read_Scratchpad Legge i valori dal dispositivo DS1820. Il valore letto è rappresentato su un intero con risoluzione di 0. Nome Macro Descrizione Invia un comando di reset e restituisce uno se nessun dispositivo risulta resettato oppure non vi sono dispositivi collegati al bus. La connessione è di tipo punto-punto. Fig. Nome Macro Descrizione DS1820_Start_Conversion Avvia la conversione del dato del dispositivo DS1820. ReceiveRS232String È simile alla ReceiveRS232Char ma legge una stringa di caratteri la cui lunghezza è indicata dal parametro Length. • Comunica via RS232 bidirezionale tra PC e scheda di controllo a relé. - “R”: Leggi stato relé. Non ci soffermeremo sui dettagli di ogni singola configurazione. Flowcode dispone di un componente specifico per la gestione della RS2332. Parametro Velocità 0 1200 bps 1 2400 bps 2 4800 bps 3 9600 bps 4 19200 bps 5 38400 bps 6 57600 bps 7 115200 bps Gestione di una scheda a relé tramite interfaccia RS-232 Nella realizzazione di questo semplice progetto tralasceremo i passaggi base che abbiamo già spiegato nelle puntate precedenti e ci soffermeremo maggiormente sui nuovi concetti. perché potrebbe. è sempre possibile utilizzare l’help di Flowcode. ad esempio. • La sintassi delle risposte ai comandi è la Elettronica In ~ Ottobre 2013 119 . Per poter utilizzare il componente dobbiamo configurarlo (come fatto per gli altri visti in precedenza) attraverso la finestra di configurazione. qualora si volessero approfondire alcune caratteristiche e funzionalità. soprattutto all’inizio. le cui macro sono riassunte in Tabella 9.Valori disponibili per la modifica al volo della velocità di connessione. • La sintassi dei comandi è <xp>. che ci permetterà di gestire una batteria di relé tramite l’interfaccia seriale del PC. mentre p identifica il relé controllato. - “D”: Disattiva relé. quest’ultima deve essere uguale per entrambi i dispositivi. dove x identifica il codice del comando (che può essere uno dei tre comandi visti al punto precedente). passiamo ora alla realizzazione di un semplice progetto pratico. Per comprenderne meglio le potenzialità. Quindi. Tabella 10 . ed è rappresentato da un numero con codifica ASCII. Accetta un valore numerico intero compreso tra 0 e 7 codificato come nella Tabella 10. qui abbiamo a disposizione i controlli per impostare la velocità di comunicazione (baud-rate). ChangeHWBaud Modifica la velocità di trasmissione dei dati. Questo tipo di connessione è molto semplice da utilizzare e permette comunicazioni con dispositivi anche molto complessi come ricevitori GPS o display grafici. 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). ReceiveRS232Char Riceve un carattere sulla seriale. • Deve supportare i seguenti comandi: - “A”: Attiva relé.E corso F L O WCOD Tabella 9 . perché il nostro obiettivo è dare a tutti le nozioni base per utilizzare i componenti trattati in modo rapido e efficace. affinché tutto funzioni correttamente. Nome Macro Descrizione SendRS232Char Invia un dato a 8-bit sulla seriale. in pacchetti da 8-9 bit racchiusi tra un bit di start ed uno di stop. per spegnere il relé 2 inviamo “<D2>” mentre per leggere lo stato del relé 1 inviamo il comando “<R1>”.Macro disponibili per la gestione della connessione RS232. Il nostro sistema presenta le caratteristiche seguenti. il numero di bit del frame. SendRS232String Invia una stringa di caratteri sulla seriale. La durata di ogni bit dipende dalla velocità di comunicazione. nonché la possibilità di utilizzare le connessioni per il controllo di flusso. che consigliamo di tenere sempre sottomano. permettervi di imparare molto. per attivare il relé 3 inviamo il comando “<A3>”. accessibile dal menu a tendina del componente nel pannello. I dati vengono trasmessi in modo seriale. In essa. . la risposta sarà <R2-1>. Fig. passiamo all’identificazione dei componenti necessari per la realizzazione. come risposta al comando di attivazione del relé 1 con esito positivo.Configurazione del componente LED array. mentre v è il valore o l’esito del comando. 9 . v avrà valore “K” mentre nel caso vi siano errori avrà valore “N”. nel caso che il relé 2 sia attivo e ne venga chiesta la lettura. Ad esempio. Ottobre 2013 ~ Elettronica In DE 120 cors o F L O W CO Fig. Qualora il comando non richieda un valore di ritorno e sia stato eseguito correttamente. Ad esempio. 10 . che sono: Fig. si avrà <A1-K>.Configurazione del componente RS232. x e p hanno lo stesso significato assunto al punto precedente. Ora che abbiamo steso le direttive principali per realizzare il nostro progetto. Nella risposta al comando di lettura.seguente: <xp-v>. mentre se l’esito fosse stato negativo la risposta sarà <A1-N>. 8 Assemblaggio dei moduli necessari a pilotare una batteria di relé attraverso la connessione RS232. v vale 1 o 0 in base al valore letto. quindi utilizzeremo il componente LED array per controllare la nostra batteria di relé. utilizzando dei fili da prototipazione.600 bps. utilizzando le macro. Posizioniamo. Colleghiamoli in modo da avere la scheda EB038 sulla porta A e la EB015 sulla porta C. 11 . Le schede devono essere alimentate per poter funzionare correttamente. inoltre. prendendoli dalla barra dei componenti. e in posizione LOW per la scheda EB015. perché attraverso il connettore DB9 passano solo le connessioni dati ed il riferimento di massa perciò. colleghiamo tutti i morsetti con indicato “+V” al corrispondente morsetto della scheda EB006. possiamo dedicarci alla stesura del diagramma di flusso. i connettori di patch in posizione C e 2 per la scheda EB038. Flowcode non dispone di un componente Relé Array. il componente RS232 ed il LED array. come mostrato in Fig. Per ottimizzare l’uso di Flowcode possiamo pensare di suddividere. • ControllaComando = esegue il controllo Elettronica In ~ Ottobre 2013 121 . Quindi scegliamo i pin al quale sono collegati mediante il menu a scomparsa “Connessioni” ed assegniamoli alla porta A dal pin 0 al pin 4. - EB015 “RS232 Board”. dal punto di vista del comando.Main del programma di controllo. Apriamo il progetto “ConfigurazioneBase2. Impostiamo la RS232 mediante il menu a scomparsa “Proprietà extra” in modo da avere una velocità di comunicazione pari a 9. Le altre configurazioni della scheda array seguendo la stessa procedura come indicato in Fig.E corso F L O WCOD EB006 sono quelle già utilizzate nella scorsa puntata. ma il funzionamento di un relé. Configuriamo anche il componente LED Fig. l’intero programma in tre parti principali: • Inizializzazione = inizializza tutto ciò che deve essere preimpostato prima che il ciclo principale inizi. legge i caratteri ricevuti da seriale e li aggrega in un’unica stringa in modo da esaminarla mediante un semplice controllo di correttezza. - EB038 “Relay Board”. 9. - EB006 “USB PICmicromult iprogrammerboard”(PIC18F4580 e quarzo 12 MHz). è del tutto simile a quello di un LED. 10. • Main = chiama l’inizializzazione del sistema. 8. Ora che è tutto pronto. il “timeout” indicato in millisecondi e scegliamo la porta UART1 come indicato in Fig. fcf” ed inseriamo. esso viene analizzato. sulla correttezza del comando ricevuto. ogni volta che viene ricevuto un carattere da seriale. 11. allora viene azzerata la stringa che contiene il carattere ricevuto.Formato del file . 13 Macro di Inizializzazione. esegue il comando ed invia la risposta. al termine . Fig. il carattere viene aggiunto alla stringa di comando. • in tutti gli altri casi. • il carattere è “>”. 12 Macro Controlla Comando. il comando viene resettato in modo da abilitare la ricezione di nuovi comandi.del controllo.cvs. Fig. 122 Stato Relé 1 Ottobre 2013 ~ Elettronica In Stato Relé 2 Stato Relé 3 Stato Relé 4 DE Tempo di esecuzione [ms] cors o F L O W CO Main Il main contiene la chiamata alla macro di inizializzazione. L’intero flusso in Flowcode è rappresentato nella Fig. Dopo la ricezione e l’analisi ci sono tre possibilità: • il carattere è “<”. oltre ad un ciclo infinito nel quale viene richiesta una lettura da seriale ed è analizzato il carattere ricevuto: quindi. Tabella 11 . allora la stringa di comando è stata ricevuta completamente e quindi viene controllato il comando attraverso la specifica macro. L’interfaccia permette sia il controllo manuale dei 4 relé. in base al carattere del comando. scritta in Labview 2010. spegnimento o lettura del relé. dall’automazione alla domotica. che rappresentano lo stato dei 4 relé (0 o 1). Per impostare le sequenze automatizzate è sufficiente generare un file . il primo campo indica il tempo (in ms) al quale verranno inviate le istruzioni presenti nei 4 campi successivi. Per la modalità di controllo manuale sono presenti 4 pulsanti. Elettronica In ~ Ottobre 2013 123 . Uno scre- Fig. Viene fatto un controllo sul valore del parametro (che nel nostro caso deve essere compreso tra 1 e 4) e successivamente. in ogni caso. è possibile impostare sequenze di controllo che possono essere impiegate per le più svariate necessità. sulla destra del pannello. 12. 16. con i quali è possibile controllare lo stato dei relé. Macro “Inizializza” È utilizzata per inizializzare lo stato dei relé e le variabili di appoggio del programma. viene eseguita l’operazione di accensione.cvs con la formattazione indicata nella Tabella 11. è possibile selezionare la porta RS-232 (COM1 o COM2). deve essere impostato a zero. enshoot dell’interfaccia software è visibile in Fig. contenenti i comandi specifici per le due modalità. al controllo g di macchinari.E corso F L O WCOD Fig. sia l’esecuzione di sequenze automatizzate. 13. prima di ritornare il controllo alla funzione chiamante. selezionare il baud-rate (l’impostazione predefinita è 9600) mentre sono presenti due tab. Due parole in più merita la sezione automatica. Fig. mediante un radio button posto in basso. 15 riportiamo uno screenshoot. “Manual Control” e “Automatic Control”. della quale in Fig. Nella prima parte della macro vengono estrapolati dalla stringa il carattere di comando ed il parametro associato. Gli stati del relé sono memorizzati in un vettore globale di appoggio chiamato “StatoRele”. Tale sezione permette di automatizzare il controllo della scheda da PC. 16 Esempio di file . la macro invia la risposta utilizzando la macro SendRs232String. Un esempio di file . Interfaccia Software Per l’utilizzo della scheda relé appena realizzata è stata sviluppata un’apposita interfaccia software. per essere concorde allo stato fisico. Come si può vedere. Subito dopo l’avvio dell’interfaccia possiamo scegliere tra le due modalità. 14. Al termine dell’esecuzione. L’intero diagramma è visibile in Fig.cvs è riportato in Fig. 14 . impostando sequenze di controllo temporizzate. Macro “ControllaComando” Realizza il controllo del comando ricevuto come parametro. invia una risposta sulla linea seriale. Come si può notare. Tramite questa modalità.Sezione “Automatic Control” dell’interfaccia sw. 15 . lo esegue nel caso sia stato ricevuto correttamente e.Sezione “Manual Control” dell’interfaccia sw. In questo caso l’unica variabile che deve essere azzerata è il vettore con lo stato dei relé “StatoRele” che.cvs. Il diagramma Flowcode è rappresentato nella Fig. partendo da quella che ha riscosso un notevole e crescente successo negli ultimi 15 anni: il CAN-Bus. che permette di creare reti anche piuttosto complesse e largamente utilizzata ai giorni nostri. che oggi costituisce lo standard de facto per le reti di comunicazione delle automobili e si sta espandendo anche ad applicazioni industriali e custom. dotato di elevata immunità ai disturbi. basso costo ed elevata affidabilità. Controller Area Network (CAN) Il protocollo CAN nasce negli anni ’80 del secolo scorso dalla Robert Bosch GmbH.E corso F L O WCOD Continuiamo il nostro viaggio alla scoperta del sistema di sviluppo grafico per microcontrollori proposto da Matrix Multimedia. che aveva l’esigenza di sviluppare uno standard per le comunicazioni seriali a corto raggio tra diverse unità elettroniche di controllo. alla relativa sempli- cità rispetto a soluzioni simili e ai costi ridotti dei componenti. In questa puntata iniziamo a lavorare con le periferiche di comunicazione avanzate. arricchiremo il tutto con un progetto pratico: realizzeremo un prototipo di sensore di parcheggio per autoveicoli. imparando ad utilizzare le porte di comunicazione UART. specialmente nel settore automotive: stiamo parlando della porta CAN (Controller Area Network). Come fatto nelle puntate precedenti. Lo standard im- Elettronica In ~ Novembre 2013 127 . Quinta puntata. SPI e OneWire. 5 corso di programmazione in F L OWCODE di Francesco Ficili e Daniele Defilippi I l mese scorso abbiamo illustrato l’uso delle periferiche di comunicazione di base. grazie alla sua robustezza. In questa puntata introduciamo una periferica di comunicazione decisamente più avanzata. I²C. di tipo multicast. • Extended frame format. Con questa tecnica. durante una trasmissione. noi utilizzeremo il transceiver della Microchip. quindi ad esso è demandata la gestione delle principali logiche del bus. Durante la trasmissione. trasmesso da un qualsiasi nodo che ha rilevato un errore. ogni nodo che sta trasmettendo verifica lo stato del bus e confronta il bit ricevuto con il bit trasmesso: se viene rilevato un bit dominante quando ne viene trasmesso uno recessivo. MCP2551. Il CAN base permette 211=2048 tipi di messaggi diversi. è oggi il formato più diffuso nelle varie applicazioni che utilizzano questo standard.912 tipi di messaggi.Data-rate riferito all’estensione della rete CAN. ma da specifiche Bosch se ne possono usare solo 2031. Nella versione extended si possono avere fino a 229=536. • Remote frame. Accontentandosi di velocità inferiori è possibile coprire distanze maggiori (ad esempio con 125 kbit/s si arriva a 500 m). La tecnica trasmissiva del CAN usa un modello basato su bit “dominanti” e “recessivi”. finché uno dei due non rileva un errore di trasmissione. Il protocollo CAN è centralizzato sui messaggi. allora il bit dominante “vince” fra i due. Un’applicazione che faccia uso del protocollo CAN necessita di almeno un paio di componenti elettronici aggiuntivi: un controller ed un transceiver. allora il nodo che ha rilevato l’errore interrompe la comunicazione. in cui i bit dominanti sono gli 0 logici ed i bit recessivi sono gli 1 logici. il nodo B invia un bit recessivo. con estensione massima della rete di circa 100 m. • Error frame. Se. quest’ultimo è l’elemento che si occupa dell’interfacciamento a livello fisico con il bus.Tabella 1 . a seconda della versione dello standard CAN presa in considerazione: • Base frame format. ID ad 11 bit (versione 2.0B). frame che introduce un ritardo fra data frame e/o remote frame. il nodo A invia un bit dominante e. un approccio di questo tipo è definito CSMA/BA (Carrier Sense Multiple Access/Bitwise Arbitration). Si interfaccia direttamente con il controller. che sono chiamati in genere anche frames. Ogni nodo gestisce uno o più frame in ricezione e/o trasmissione. svincolando l’utilizzatore dalla gestione di problematiche di arbi- cors o F L O W CO piega come mezzo trasmissivo una linea differenziale bilanciata (i due terminali sono indicati come CANH e CANL). a seconda dell’architettura della network. I Data frame sono quelli cui è affidata l’effettiva trasmissione dei dati e possono essere di due tipi. essi si contendono l’uso esclusivo del bus (arbitraggio) trasmettendo i propri dati. Nella teoria delle reti di comunicazione. detto anche CAN esteso. DE 128 Novembre 2013 ~ Elettronica In . Il massimo bit rate raggiungibile è di 1Mbit/s. autoescludendosi (si dice che il nodo in questione perde l’arbitraggio) dal bus. L’extended frame format. esattamente come nel caso dell’RS485. Data-rate(kbps) Estensione massima (m) 125 500 250 250 500 100 I frame possono essere di quattro tipi: • Data frame. • Overload frame. identificati per mezzo di un ID. richiede la trasmissione di un determinato identificatore. In Tabella 1 sono riportati alcuni esempi di estensioni massime della rete rispetto alla velocità trasmissiva. È quindi responsabile della corretta traslazione e dell’adattamento dei livelli logici delle linee. se due nodi iniziano una trasmissione contemporaneamente. ID a 29 bit (versione 2.870. Il controller è l’elemento che si occupa dell’implementazione del livello data link (livello 2 dello stack OSI). contemporaneamente. I dispositivi standard CAN devono riconoscere il formato base frame e possono riconoscere (ma devono comunque tollerarlo) il formato extended frame format.0A). frame contenente i dati che il nodo trasmette. Ci sono diverse aziende al mondo che producono transceiver CAN. bit dopo bit. Per configurare il componente clicchiamo con il tasto destro sulla relativa icona e selezioniamo la voce “Proprietà Extra”. la prima scelta da fare sarà quella relativa al tipo di formato. esistono diverse aziende produttrici al mondo. il pin di CS è il pin 6 della porta C. 1. i controller interni sono supportati solo dal componente che supporta il base format. In questa puntata ci occuperemo del componente CAN Extended. vedremo un esempio di configurazione dei buffer. Il controller dispone anche di buffer di trasmissione. ed a questo punto possiamo configurarlo per adattarlo alle esigenze del progetto specifico. e quindi utilizzeremo il controller MCP2515 nelle nostre applicazioni. cliccando sulla voce Extended CAN. I tab successivi permettono di configurare i vari buffer di ricezione e trasmissione. 2. Nella versione attuale dell’ambiente. Nel progetto pratico. che nel caso di questo componente si riducono al pin di CS del controller CAN (che è un SPI slave). l’icona relativa al componente comparirà sul pannello. di politiche di ritrasmissione. nel nostro caso noi faremo uso del controller della Microchip MCP2515. Il componente CAN in Flowcode Analizziamo adesso il componente Flowcode che ci permette di semplificare la gestione di un’interfaccia CAN nelle nostre applicazioni. se non c’è l’esigenza di cambiarlo (ad esempio nel caso in cui venga utilizzato l’E-block CAN) può essere mantenuto così. quindi se usiamo il componente extended saremo vincolati all’uso di un controller SPI esterno. che permettono di configurare il set di messaggi in ricezione e trasmissione. 2 . Per prima cosa analizziamo le connessioni. ecc. Dalla prima scheda di questa finestra è possibile selezionare le principali opzioni di configurazione del bus. come il baud-rate.E corso F L O WCOD Fig. di ricezione e di maschere. Per impostazione predefinita. Flowcode dispone di due componenti CAN.Connessioni del componente Extended CAN. uno per la gestione del base frame format (che si chiama semplicemente CAN) e uno per la gestione dell’extended format (chiamato Extended CAN) quindi. di gestione degli errori. zioniamo il componente dalla barra dei componenti. sele- Fig. Apparirà la finestra rappresentata in Fig. Per inserire il componente CAN all’interno del nostro progetto Flowcode. 1 . il sample point ed altri ancora. traggio. Comparirà la finestra di Fig. Una volta inserito. ecc. Possiamo accedere alle connessioni cliccando con il tasto destro sull’icona del componente e selezionando la voce “Connessioni”. riducendo l’overhead della CPU del microcontrollore a cui è interfacciato.Proprietà extra del componente Extended CAN. Elettronica In ~ Novembre 2013 129 . Questi parametri dipendono a loro volta dalle caratteristiche proprie della rete. il numero di nodi. il bus load. Anche per i controller. come la sua estensione. se decidiamo di sviluppare un’applicazione CAN. in questo caso raggruppate per nodo. Nodo Display: • Interfacciamento con display alfanumerico 16x2. GetRxExtIDAsFull Estrae un determinato byte di un determinato messaggio con ID extended. Ora.Tabella 2 . dove il nodo display agisce da nodo master (può mettere “a dormire” lo slave nodo sensore). ShowLEDs Controlla lo stato dei LED della EB018. GetRxExtID Estrae un determinato byte di un determinato messaggio con ID extended. • Interfaccia CAN 2. che utilizzeremo per generare gli eseguibili binari con cui programmare le due schede. GetRxStdID Estrae un determinato byte di un determinato messaggio con ID standard. su bus I²C.. come di consueto. SetTxStdID Modifica lo standard ID di un determinato buffer di trasmissione (passato come parametro). Vengono controllati tutti i buffer e viene passato come parametro l’indice del byte. Nel caso specifico ci cimentiamo nella realizzazione di un prototipo di sensore di parcheggio per auto. Come abbiamo già accennato. collegati tra di loro tramite bus CAN. • Gestione della modalità sleep tramite pulsante. SendBuffer Invia il messaggio contenuto all’interno del buffer di trasmissione (passato come parametro) CheckRx Controlla se ci sono messaggi ricevuti su un determinato buffer di ricezione (passato come parametro). Sebbene il CAN sia nativamente una rete peer-to-peer.0B a 500 kbaud. Vengono controllati tutti i buffer e viene passato come parametro l’indice del byte. • Lettura e visualizzazione dei dati diagnostici. visto come combinazione di un ID standard e di un ID extended. Quindi realizzeremo due progetti Flowcode distinti.0B a 500 kbaud. Riceve come parametro sia il buffer che l’indice del byte. è possibile forzare delle relazioni di tipo master/slave. DE 130 Novembre 2013 ~ Elettronica In . SetTxExtID Modifica l’extended ID di un determinato buffer di trasmissione (passato come parametro) come combinazione dell’ID standard e dell’ID extended.Macro disponibili per il componente CAN.. procediamo con l’analisi delle macro messe a disposizione da questo componente. inviando un messaggio apposito per forzare lo stato di sleep. Per quanto riguarda la realizzazione hardware. abbiamo pensato di realizzare un progetto pratico un po’ più impegnativo. GetRxDataCount Riceve il conteggio dei byte del messaggio contenuto in un determinato buffer (passato come parametro). • Invio dati sulla distanza espressa in cm. Come di consueto. ReadSwitches Legge lo stato degli switch della EB018. GetRxData Estrae un determinato byte dal messaggio presente in un determinato buffer di ricezione. • Interfaccia CAN 2. SetTxExtAsFull Modifica l’extended ID di un determinato buffer di trasmissione (passato come parametro). Nodo Sensore: • Interfacciamento con sensore ad ultrasuoni SFR02. • Autodiagnosi su stato batteria e stato link I2C con il sensore. che trovate riepilogate nella Tabella 2. è ciò che faremo in questo esempio. Nome Macro Descrizione Init Inizializza il componente CAN. in questo progetto avremo bisogno delle seguenti schede: cors o F L O W CO Progetto pratico: sensore di parcheggio Passiamo adesso al progetto pratico relativo a questa puntata. • Lettura e visualizzazione dei dati sulla distanza. che permette la realizzazione di progetti anche piuttosto complessi in tempi ridottissimi e con un ottimo risultato finale. proprio per evidenziare le potenzialità di rapid development offerte da flowcode. costituito da due nodi: un nodo sensore ed un nodo display. analizziamo le specifiche di progetto. in modo da disabilitare il sistema durante le fasi di guida ed abilitarlo in fase di parcheggio. Vengono controllati tutti i buffer e viene passato come parametro l’indice del byte. agendo a livello dell’applicazione. • Modalità sleep attivabile tramite messaggio da nodo display. - 1x EB016 “Prototypeboard”. Elettronica In ~ Novembre 2013 131 . in modo da terminare la linea da entrambi i lati e collegare i cavetti per l’alimentazione. Non disponendo di un e-block specifico. e quindi usiamo RB0 ed RB1. per interfacciare l’MCP2515 usiamo la MSSP in modalità SPI). Poi. - 1x EB005 “LCD board”. l’impostazione dei jumper della EB018 è la seguente: • J4 su A. Fig.E corso F L O WCOD Fig. emuliamo il collegamento I2C a livello software. sulla EB016 dobbiamo posizionare anche un partitore di tensione con rapporto di partizione 1:4. 3a Prototipo del nodo sensore. Posizioniamo l’SRF02 sulla breadboard e colleghiamo i terminali di alimentazione e quelli di comunicazione SDA ed SCK del bus. rispettivamente per SCK ed SDA. assicuriamoci di chiudere su entrambe le schede J8. Oltre all’SRF02. Per il nodo display. allo scopo di leggere lo stato della batteria. 3b Prototipo del nodo display. Non potendo utilizzare la porta hardware I²C (perché. Completiamo il nodo sensore collegando la EB018 sulla porta C. per interfacciare l’SRF02 ci serviremo. che colleghiamo all’ingresso analogico An0. • J6 e J7 disinseriti. colleghiamo la EB018 sulla porta C e la EB005 sulla porta B. che colleghiamo sulle porte A e B. • J5 inserito. - 2x EB018 “CAN bus Board”. come già fatto in passato. - 2x EB006 “USB PICmicro multiprogrammer board” (PIC18F4580 e quarzo da 12MHz). Per entrambi i nodi. della EB016. DiagTask 50 Gestisce la diagnostica del sistema. SensorRangingTask 10 Gestisce la comunicazione con il sensore ad ultrasuoni SRF02. Passiamo ora alla descrizione dell’implementazione software. questo nodo deve acquisire i dati relativi alla distanza dal sensore ad ultrasuoni. In Tabella 3a e Tabella 3b sono riporta- te le caratteristiche dei due messaggi. data la complessità del progetto. CanRxTask 50 Gestisce la ricezione del messaggio CAN dal nodo display. Nodo Sensore Secondo le specifiche. Task Periodo [ms} Descrizione CanTxTask 250 Gestisce la trasmissione del messaggio CAN del nodo sensore.Tabella 3a .Caratteristiche messaggio 0xC40A4. 3b. 4 Main del progetto in Flowcode. abbiamo un totale di due messaggi. la descrizione di alcune parti non fondamentali verrà omessa o sarà trattata solo marginalmente. cors o F L O W CO Tabella 4 . Fig.Caratteristiche messaggio 0xC40A5. essa è il documento che descrive le principali caratteristiche dei messaggi che si scambiano i vari nodi all’interno della network. uno trasmesso dal nodo sensore e ricevuto dal nodo display. effettuare l’autodiagnosi su livello batteria e stato del bus I²C e comunicare queste informazioni al nodo master tramite messaggio CAN. con la premessa che. DE 132 Novembre 2013 ~ Elettronica In . ID 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 = I²C fail 3 = Mult. Mappa Messaggi Prima di passare ai dettagli software analizziamo un punto fondamentale di ogni rete basata su protocollo CAN. 3a e Fig. ed uno che transita nel verso opposto. Nel nostro caso. il significato dei byte che li compongono. In questo documento sono indicati le tipologie dei messaggi. quali nodi trasmettono e quali sono i destinatari di ogni singolo messaggio. ID 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 La configurazione hardware dei due nodi è riportata nelle Fig.Periodicità e descrizione dei task del software del nodo sensore. fail Tabella 3b . i relativi indirizzi. ossia la mappa messaggi: in un CAN Bus. Per cominciare. Il firmware in questione ha diversi task da eseguire in maniera simultanea.Configurazione dell’interrupt del timer2. 7 .System scheduler. 4 (nello schema a blocchi è già stata effettuata la chiamata alla funzione di inizializzazione per i componenti utilizzati). come visibile in Fig. Deve inoltre essere gestita una modalità sleep. e tra le sorgenti del menu a tendina selezioniamo la voce “TMR2”. inseriamo la macro Fig. Decidiamo di generare uno scheduler con un tick a 10ms e di generare le altre periodicità attraverso dei contatori incrementati ad ogni tick di sistema. Fig. Poi. Per configurare l’interrupt clicchiamo due volte all’interno del blocco. nella sezione “Verrà chiamata la macro”. in modo da accedere alle finestre di configurazione. su richiesta del nodo master. 5 .Impostazione dei registri del timer 2. Elettronica In ~ Novembre 2013 133 . 5. In questa finestra selezioniamo l’opzione “Abilita Interrupt”. ci serviamo di un interrupt sul timer 2. scegliamo quindi di servirci di uno scheduler per gestire le chiamate ai vari task. riportata in Fig.E corso F L O WCOD Fig. esaminiamo l’impostazione dell’architettura di base del sistema. 6 . Per la generazione del tick base di sistema (sul quale è basato il funzionamento dello scheduler). Come detto nella seconda puntata di questo corso. per inserire un blocco interrupt trasciniamo dalla barra delle icone un blocco interrupt all’interno del nostro main. In Tabella 4 sono riportati i task gestiti con le descrizioni e le relative periodicità. Registri interni del sensore SRF02 in modalità I2C. l’SRF02 ha la capacità di utilizzare sia l’interfaccia seriale che l’I2C.”. Ora abbiamo il nostro tick di sistema configurato. Esecuzione di un ranging – risultato in microsecondi. in quanto il periodo di chiamata di questo task è proprio 10ms. ciò che rimane da fare è generare il codice dello scheduler in modo da avere le periodicità elencate in Tabella 3 (a e b). Analizziamo adesso come è stata implementata la lettura del sensore ad ultrasuoni: per interfacciarsi con il dispositivo che lo utilizza. Tabella 7 . 0x56 Esecuzione di un fake ranging – risultato in pollici. selezioniamo un prescaler di 16. Per implementare tale caratteristica creiamo una variabile globale che chiamiamo SystemStatus (essa può assumere due valori: SYSTEM_ACTIVE e SYSTEM_NOT_ACTIVE). clicchiamo sul tasto “Proprietà.Macro scritte per la gestione dell’SRF02. una delle condizioni di attivazione della chiamata al task. I contatori sono incrementati ad ogni ciclo e le condizioni di attivazione dei vari task (all’interno dei blocchi decisione) sono: - CanRx → CanRxTaskCounter >= TASK_CAN_RX_TIMEOUT. 6. usato per consentire il risveglio del sistema da messaggio CAN. 0x57 Esecuzione di un fake ranging – risultato in cm. che sarà.Tabella 5 . un postscaler di 8 e un rollover di 234. Esecuzione di un ranging – risultato in cm. Ricordiamoci che alcuni task sono vincolati ad andare in sleep su richiesta del nodo master. Come si può vedere. Per avere un interrupt ogni 10ms occorre generare una frequenza di circa 100Hz. per ottenere la quale.Low Byte N/A MainScheduler (che possiamo creare al momento o aver già creato in precedenza). il task CanRx non è vincolato alla variabile SystemStatus per garantire la possibilità di risvegliare il sistema tramite messaggio CAN. - CanTx → (CanTxTaskCounter >= TASK_CAN_TX_TIMEOUT) && (SystemStatus = SYSTEM_ACTIVE). Non ci rimane che impostare il timer per avere il tick di sistema a 10ms. allo scopo. 0x58 Esecuzione di un fake ranging – risultato in microsecondi.Set di comandi dell’SRF02. insieme alla periodicità. L’implementazione dello scheduler (senza le chiamate ai task per il momento) è descritta nella Fig. Comando (Hex) Descrizione 0x50 Esecuzione di un ranging – risultato in pollici. ad ogni occorrenza dell’interrupt verremo indirizzati alla macro contenente lo scheduler di sistema. Sensor_ReadResult Legge i byte all’indirizzo 2 (Range High Byte) e 3 (Range Low Byte) e chiude la transazione. con un sistema che gira a 12MHz. Si aprirà la finestra di Fig.High Byte N/A 5 Autotune Minimum . Locazione di memoria Accesso in lettura Accesso in scrittura 0 Software Revision Command Register 1 Unused (reads 0x80) N/A 2 Range High Byte N/A 3 Range Low Byte N/A 4 Autotune Minimum . Nel nostro caso. Nome Macro Descrizione Sensor_SendCommand Invia al dispositivo con indirizzo 0xE0 il comando 0x51 in scrittura. L’unico task che non è controllato da questa variabile è CanRx. cors o F L O W CO 0x51 0x52 dal tick base di sistema. ossia CanRxTaskCounter. - SensorRanging → SystemStatus = SYSTEM_ACTIVE. CanTxTaskCounter e DiagTxTaskCounter. ed il task SensorRanging non ha un contatore per la periodicità. generiamo tre variabili globali. In questo modo. quindi in questa condizione non devono essere eseguiti. 0x5C Trasmissione di 8 cicli a 40kHz (ultrasonic burst). DE 134 Novembre 2013 ~ Elettronica In . Per farlo. Clicchiamo su OK e procediamo. come interfaccia di comunicazione abbiamo scelto l’I2C. - Diag → (DiagTxTaskCounter >= TASK_DIAG_TIMEOUT) && (SystemStatus = SYSTEM_ACTIVE). Sensor_RequestReadResult Invia al dispositivo con indirizzo 0xE0 la richiesta di lettura a partire dall’indirizzo 2.. che utilizzeremo come contatori per determinare le periodicità dei task a partire Tabella 6 . 7. 3) ricezione dei due byte del registro contenente il risultato. Quindi. Fig. In Fig. La procedura per ottenere il dato sulla distanza è la seguente: 1) invio del comando 0x51 in scrittura (ri- Fig. l’SRF02 funziona in modo molto simile ad una memoria EEPROM della famiglia 24xx: il dispositivo si presenta come un set di registri con accesso in lettura o in scrittura. per ogni trasmissione viene inviato un totale di due byte. dai quali può successivamente essere recuperato con un’operazione di lettura.Tab rx buffer 0 della finestra di configurazione del componente CAN. Oltre al comando. che viene chiamata dallo scheduler principale e che fornisce. 2) invio dell’indirizzo del registro contenente il risultato in lettura. Per farlo. 8 Macro SensorRangingStateMachine. che eseguono sia l’operazione di invio del burst ad ultrasuoni che la successiva rilevazione del tempo di volo dell’eco ed il conseguente calcolo della distanza. Queste macro sono utilizzate dalla macro SensorRangingStateMachine. in modo da ottenere il risultato del ranging. L’accesso in scrittura alla locazione 0 permette di eseguire una delle operazioni riportate in Tabella 6 (sono riportati solo i comandi principali). incrementato ad ogni ciclo (ricordiamo che la macro è chiamata direttamente dallo scheduler principale. Fig. In questo caso il risultato del ranging viene salvato nei registri 2 e 3 (Range High Byte e Range Low Byte). Questo flowchart implementa una macchina a stati che esegue in sequenza e con le corrette temporizzazioni le tre macro riportate in Tabella 6. come output per il resto del sistema. riportate nella Tabella 7. Nel nostro caso utilizziamo i comandi di ranging.E corso F L O WCOD Fig. chiesta di ranging con risultato in cm). 9C . Elettronica In ~ Novembre 2013 135 . Nel caso di interfacciamento di tipo I2C. sul bus deve essere inviato l’indirizzo del dispositivo (quello predefinito in caso di interfaccia I2C è 0xE0) ed il bit di read/write. 9b . 8 è riportato il diagramma a blocchi Flowcode della macro SensorRangingStateMachine.Tab tx buffer 0 della finestra di configurazione del componente CAN.Tab general della finestra di configurazione del componente CAN. Per realizzare queste tre operazione sono state scritte tre macro. la variabile globale SensorResult più alcune informazioni sulla diagnostica del collegamento I²C. viene utilizzato il contatore SensorRangingCounter. come riassunto dalla Tabella 5. 9a . quindi ha un tempo di chiamata di 10ms). Passiamo adesso al tab TX Buffer 0. 10 Proprietà della macro SetTxData del componente CAN. DE 136 Novembre 2013 ~ Elettronica In . esaminiamo come vengono inviati i dati al nodo master tramite il bus CAN.Fig. riportata per comodità in Fig. 9 (a. Infine passiamo sul tab RX Buffer 0 e impostiamo un filtro in ricezione. per riempire correttamente il messaggio in trasmissione. tramite la macro Sensor_ReadResult (contatore uguale a TIMING_READ_RESULT. Fig. 11 Codice grafico per l’invio del messaggio CAN. un sample point dell’80% e SJW pari a 1. La seconda chiamata avviene dopo 250ms (ossia quando il contatore raggiunge il valore della constante TIMING_REQ_READ. come riportato nella mappa messaggi. 12 Codice grafico per la ricezione del messaggio CAN. A questo punto possiamo inserire. nella sezione frame Identifier. dopo altri 150ms la macchina a stati si resetta (semplicemente resettando il contatore) e il ciclo ricomincia dal punto di partenza. Il ritardo di 250ms serve a fare in modo che l’SRF02 riceva l’eco del burst ad ultrasuoni inviato in seguito alla ricezione del comando 0x51 e faccia i necessari calcoli. selezionando un bau-rate di 500kB. La configurazione. quindi accediamo alla finestra delle proprietà extra. selezionando la spunta “Message ID 0” ed inserendo il seguente ID nella relativa casella “Full ID”: 0xC40A4. tale macro prende come parametri il buffer di trasmissione utilizzato. Ora che abbiamo compreso la gestione del sensore ad ultrasuoni. Per prima cosa dobbiamo configurare correttamente il componente. pari a 35). il numero di byte cors o F L O W CO Fig. Infine. all’interno del nostro scheduler. Nel tab principale inseriamo i settaggi principali. In questo modo si ottiene un aggiornamento della posizione ogni 500ms circa. L’invio si compone di due macro componente: per prima cosa usiamo la macro SetTxData. selezioniamo “Extended Frame” ed inseriamo nella casella “Full ID” l’indirizzo 0xC40A5. il codice Flowcode per l’invio del messaggio contente i dati di distanza e di diagnosi (ID 0xC40A5). dove. A questo punto. La prima macro chiamata è la Sensor_ SendCommand (dopo 10ms dall’avvio della macchina a stati). dopo altri 100ms viene letto il contenuto dei registri contenenti il risultato. b e c) è così completata. pari a 25) e viene chiamata la macro Sensor_RequestReadResult. - SensorDiagStatus → Byte 2. elencati in Tabella 8.Periodicità e descrizione dei task del software del nodo display. come ad esempio lo scheduler (che è praticamente identico). entrambe sul buffer 0. controlla l’esecuzione di tutti i task (ad eccezione proprio del task CanRx). per inviare il messaggio è sufficiente chiamare la macro SendBuffer e passare il buffer di trasmissione. introduciamo due chiamate a macro di componente. 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. Il risultato della GetRxData viene salvato all’interno della variabile SystemStatus. tramite il seguente codice inserito in un blocco calcolo: Elettronica In ~ Novembre 2013 137 . Infine. Bisogna quindi gestire un task di ricezione all’interno del quale viene letto questo byte e viene aggiornata una variabile che usiamo per identificare lo stato del sistema. Per prima cosa è stato configurato il componente CAN in maniera analoga a quanto fatto per il nodo sensore. 12. SwitchTask 200 Legge lo stato del pulsante ed invia il relativo messaggio CAN ad evento per il nodo sensore. A questo punto la nostra applicazione lato nodo sensore è quasi completa. passiamo adesso al nodo display.E corso F L O WCOD Tabella 8 . da inviare (DLC) e gli 8 byte del messaggio. descriviamo come viene implementato il task CanRxTask. I dati da inviare sono le seguenti variabili globali: - SensorResultHighByte → Byte 0. Task Periodo [ms] Descrizione Riceve e decodifica il messaggio CAN proveniente dal nodo sensore. Il nostro scheduler ci offre già un entry point per la ricezione a 50ms. A titolo di esempio. il byte 0 ed il byte 1 del messaggio vengono compattati in una word. questo task ha il compito di ricevere e decodificare il messaggio con ID 0xC40A5. rilevando la pressione di un tasto sulla EB018. per acquisire i due byte di dati che costituiscono l’informazione sulla distanza ed il byte contenente le informazioni diagnostiche. per completare il codice. La filosofia di gestione del sistema è molto simile a quanto visto per il nodo precedente. La ricezione avviene in maniera analoga a quanto visto nel caso precedente. La funzione del nodo display è ricevere il messaggio periodico inviato dal nodo sensore e visualizzare le relative informazioni sul display LCD. proveniente dal nodo sensore. ed in particolare una CheckRx ed una GetRxData. viene chiamata la CheckRx e per tre volte la GetRxData. rimane da gestire l’ingresso/uscita dalla modalità sleep controllata dal messaggio CAN inviato dal nodo display. la quale. come abbiamo visto in prece- denza. con la differenza che l’ID del messaggio in trasmissione in questo caso è 0xC40A4. Inoltre è il nodo che può mandare in sleep o risvegliare l’interno sistema. In Fig. Nodo Display La descrizione del software del nodo sensore è ultimata. mentre il filtro di ricezione viene impostato sull’ID 0xC40A5. mentre la variabile SensorDiagStatus è calcolata (e codificata come indicato nella mappa messaggi) dalla macro DiagnosticTask. In Fig. 11 è riportato il frammento di codice grafico. 10 è riportata la finestra di proprietà della chiamata alla macro componente. così come appare dopo l’inserimento delle chiamate alle macro del componente CAN. Il software del nodo display è composto da tre task principali. - SensorResultLowByte → Byte 1. Una volta riempito correttamente il messaggio in trasmissione. Il frammento di codice grafico che realizza quanto descritto è riportato in Fig. che eredita molti concetti del nodo sensore. in particolare. Le prime due variabili sono ricavate dalla macro SensorRangingStateMachine. CanRxTask 500 DisplayTask 500 Visualizza i dati decodificati dal task CanRxTask. cors o F L O W CO Fig. SensorData = ((SensorDataHigh << 8) | SensorDataLow) Lo schema a blocchi che implementa quanto descritto in precedenza è riportato in Fig. DE 138 Novembre 2013 ~ Elettronica In . come esercizio. Come si può vedere.Fig.Tracciato CAN del sistema durante in funzionamento fino alla ricezione di una richiesta di sleep. oltre a generare codice estremamente facile da comprendere e mantenere. come l’USB. In Fig. ad analizzare il progetto Flowcode e cercare di capirne il funzionamento. 14 . A questo punto possiamo anche testare il nostro sistema. 13 Codice grafico che implementa il task CanRxTask. g lo ZigBee e la porta Ethernet. 13. collegando tra di loro i due nodi con un doppino intrecciato ed alimentando il sistema con una tensione di circa 12V. vi invitiamo. possiamo dire che l’approccio al CAN con Flowcode permette di gestire diverse tipologie di componenti e periferiche con relativa semplicità. Conclusioni Concludendo questa puntata. eseguito usando il CAN Analyzer Microchip. I task per la gestione del display e per la lettura del tasto di sleep non presentano particolarità implementative di rilievo e non saranno trattati nel dettaglio in questa puntata. il sistema interrompe la trasmissione. il messaggio del nodo sensore invia sul bus una distanza rilevata di circa 317 cm (byte 0-1 pari a 0x13D) ed una diagnosi senza fault attivi (byte 2 pari a 0x00). Sul nodo display vedremo apparire le informazioni sulla distanza dal sensore ad ultrasuoni ricevute dal nodo sensore. Nelle prossime puntate esamineremo altre periferiche complesse. 14 è riportato un tracciato CAN dell’interscambio di messaggi tra i due nodi. Alla ricezione della richiesta di sleep (byte 0 del messaggio 0xC40A4 pari a 0). E corso F L O WCOD Proseguiamo il nostro viaggio alla scoperta di Flowcode. 6 corso di programmazione in F L OWCODE di Francesco Ficili e Daniele Defilippi N elle scorse puntate abbiamo parlato del bus di comunicazione avanzato CAN ed imparato a gestirlo in modo semplice e intuitivo grazie a Flowcode. oltre ad un tastierino numerico e ad un analizzatore di stati logici. Esso ha sostituito praticamente tutte le altre precedenti interfacce sia seriali che parallele perché permette di trasferire dati ad una velocità molto elevata e collegare molti dispositivi (teoricamente fino a 127) ad un’unica porta. Sesta puntata. La porta USB L’interfaccia maggiormente utilizzata oggigiorno per la comunicazione tra Personal Computer e periferiche è il bus USB. affrontando la gestione dell’USB e realizzando un convertitore seriale RS232-USB. qualora richiedano correnti superiori a 500 mA (il limite erogabile da una porta USB. sempre su USB. In questa puntata faremo altrettanto con il bus USB. ovvero una tastiera numerica per il PC e un analizzatore di stati logici. I dispositivi collegati possono essere alimentati direttamente dal bus o. se si connetto- Elettronica In ~ Dicembre 2013 / Gennaio 2014 115 . il che fa del bus un vero Plug&Play. in che modo si possa convertire un progetto RS232 in una periferica USB in pochi semplici passi e realizzeremo due tipi differenti di periferiche. Altra caratteristica fondamentale dell’USB è la possibilità di collegare e rimuovere i dispositivi senza dover riavviare il computer. spiegando come funziona la comunicazione. mediante uno o più hub eventualmente disposti in cascata. nel connettore di tipo A è collegato a GND per fare in modo che il dispositivo collegato alla porta mini/micro debba funzionare da periferica. quale dei due dispositivi è il master e quale lo slave.Fig. dato +. cors o F L O W CO no più dispositivi. Nel caso di pacchetti più grandi la sequenza di sincronizzazione è di 32bit. Lo standard USB prevede la classificazione delle periferiche in “classi” in modo da facilitare la gestione ed identificazione dei necessari driver. la 2.ha come valore l’opposto della linea D+.0 la connessione è rimasta invariata (quattro contatti) con la 3. la connessione rimane comunque compatibile con le vecchie. Il segnale di clock è trasmesso in modo implicito durante l’invio dei dati perciò. per evitare che il bus stia fermo allo stesso valore per troppo tempo. • GND. In Fig.0 nacque nel 1996 e consentiva una velocità di connessione pari a 1. La comunicazione fisica è suddivisa in tre parti principali: • Pacchetto di start: Viene inviata la sequenza di sincronizzazione 00000001. da 1 a 1024 byte. dato -. I dati sono trasmessi in modo pseudo-differenziale perché la linea D. è la massa di riferimento per i segnali e l’alimentazione. all’atto della connessione. • D-. permette di alimentare le periferiche erogando 5V stabilizzati e una corrente massima di 500mA. devono avere una connessione di alimentazione a parte. Vediamo ora quali connessioni sono disponibili su un connettore USBmini/micro: • VBUS. la codifica è di tipo NRZ ed il valore zero provoca l’inversione del valore logico trasmesso.5 Mbit/s.1 permette di raggiungere i 12 Mbit/s). Lo standard USB 1. Mentre dalla prima versione alla 2. tastiere e memorie. • Pacchetto di Stop: Viene trasmessa una sequenza non differenziale in cui entrambi i segnali restano al valore logico basso per due cicli e poi il segnale D+ torna al valore logico alto. Lo standard 3. la codifica NRZ ed il frame di stop. mini e micro.0 permette una velocità massima di 4. 1 è mostrato un esempio di trasmissione dati sul bus USB nel quale possiamo identificare le tre parti principali nel quale è suddiviso. Questo accorgimento fa in modo. devono spartirsi questa corrente). • D+. • ID: identifica se il dispositivo funziona da controllore (master) o periferica (slave).0 prevede il raddoppio delle connessioni dati in modo da poter avere due linee per la ricezione dei dati ad altrettante dedicate unicamente alla trasmissione. in quanto una fila di contatti tocca quelli dello spinotto tradizionale.0 è stato introdotto un nuovo connettore che ha i contatti sdoppiati e di fatto prevede un doppio canale dati. DE 116 Dicembre 2013 / Gennaio 2014 ~ Elettronica In . B. 1 Struttura di un pacchetto trasmesso sul bus USB. Nell’USB. Dal 2011 il connettore micro-USB è diventato la porta standard di comunicazione con tutti i sistemi cellulari. le successive versioni offrono velocità di comunicazione maggiori: per esempio la 1.8 Gbit/s. • Pacchetto di dato: La lunghezza dipende dal tipo di connessione. ma ciò non è vero nel caso dell’identificatore del termine pacchetto. La soluzione al problema si chiama USB-On-The-Go e permette di impostare. che uno smartphone possa essere visto come uno slave se connesso ad un PC o come master nel caso sia connesso ad una periferica di archiviazione di massa come un hard-disk. in questo modo i dispositivi standard come mouse. non richiedono l’installazione di driver e sono quindi subito pronti all’uso.0 i 480 Mbit/s e la più recente 3. ed il primo bit trasmesso è quello meno significativo. dopo 6 bit consecutivi di valore 1 viene trasmesso un bit aggiuntivo di valore zero. Esistono differenti connettori fisici che permettono la connessione al bus USB: A. ad esempio. ma con l’avvento degli smartphone è sorta la necessità di sviluppare un protocollo che permetta di decidere all’atto della connessione quale dispositivo diventa il master e quale lo slave. 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. 3 Connessioni progetto convertito da seriale in USB. 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. Il chip FT232BL Il metodo probabilmente più semplice per gestire periferiche è usare la porta seriale: ciò.E corso F L O WCOD Passiamo ora a scoprire come dotare un nostro progetto di una connessione USB in modo molto semplice e rapido senza neppure dover rigenerare il codice del microcontrollore. 2 Piedinatura e schema di riferimento per il componente FT232BL di FTDI. che si accollerà tutte le procedure di gestione del protocollo USB. 2 è mostrato lo schema ed il pin-out. Per questa ragione possiamo realizzare la periferica gestendo unicamente la connessione RS232 ed utilizzando un componente che si occupi della conversione di protocollo da RS232 ad USB. Questa metodologia di lavoro è molto funzionale ed utilizzata soprattutto per la rigenerazione di vecchi progetti perché non richiede la modifica del codice sorgente. Il problema è che attualmente pochi PC hanno ancora il connettore DB9 della COM e i notebook non l’hanno più da tempo. In questo Fig. In Fig. modo vedremo dal punto di vista del PC una seriale che potremo gestire normalmente con il microcontrollore che riceverà i dati attraverso la seriale senza doversi occupare della complessa gestione del bus USB. Per far ciò possiamo avvalerci del componente FT232BL fornito dalla FTDI Chip. Elettronica In ~ Dicembre 2013 / Gennaio 2014 117 Fig. . sia per la semplicità del firmware da caricare nel micro che governa la periferica. sia per il software di gestione lato personal computer. necessita di tre pagine di configurazione. • Slave. La più semplice e intuitiva da utilizzare è quella di tipo seriale perché è vista dal calcolatore come una semplice porta COM. • EB039“USB232 Board”. l’identificativo univoco del venditore della periferica. Vediamo dunque come realizzare il nostro progetto passo passo: apriamo il progetto “RS232. • HID. a differenza degli altri componenti più semplici. ecc. permette di creare un dispositivo di tipo “Human interface device”come ad esempio un mouse. il sistema operativo rileverà un nuovo hardware.fcf”. 5. Per questa variante del progetto è stata aggiornata l’interfaccia software presentata a corredo della 4° puntata . Il funzionamento rimane sostanzialmente invariato. ed i comandi che abbiamo a disposizione dal punto di vista del microcontrollore sono quelli standard di una comunicazione seriale limitandosi all’invio e alla ricezione di caratteri e stringhe. I componenti necessari per la realizzazione sono i seguenti: • EB006 “USB PICmicromultiprogrammerboard” (PIC18F4580 e quarzo 12MHz). con la differenza che ora la selezione della porta di comunicazione viene fatta tramite una combo box che rileva Il componente USB in Flowcode Flowcode permette di utilizzare principalmente tre tipi di configurazione per il bus USB: • Serial.600 baud. . Il parametro VID è il cosiddetto “VendorIdentifier” ed è. 3) ed al posto della connessione di uscita su DB9 è presente la porta USB di tipo B. in pratica. illustrata nella Fig. corrispondente al componente FTDI. La connessione RS232 deve essere impostata a 9. cors o F L O W CO La scheda EB039 sostituisce la EB015 sulla porta C (Fig. 4 .. mediante un cavo. al connettore USB tipo A del nostro PC. permette di creare un dispositivo custom. Dopo aver inserito il componente all’interno del pannello possiamo esaminare le proprietà del componente. 8bit e il controllo di flusso deve essere gestito mediante il pin RTS sulla porta C0 e il pin CTS sulla porta C4. sono davvero poche. che avevamo salvato al termine della 4^ puntata. come per il caso del chip della FTDI che abbiamo precedentemente utilizzato. permettendone l’utilizzo anche con una porta COM virtuale. Collegando il connettore USB tipo B. Iniziamo ad analizzare la prima. in modo da poterlo utilizzare senza dover installare alcun driver aggiuntivo mentre negli altri casi dovremmo avvalerci del tipo slave. Essendo abbastanza complesso. Dicembre 2013 / Gennaio 2014 ~ Elettronica In Il componente USB-HID È contenuto all’interno della barra dei componenti nel sotto-menu “periferiche” e permette di gestire un dispositivo di tipo “Human interface device”. una tastiera.Nuova configurazione componente RS232. Le modifiche. Ricompiliamo il progetto e ricarichiamo il tutto sulla scheda di sviluppo. a parte quelle all’hardware. automaticamente le seriali virtuali eventualmente connesse al PC. e modifichiamo le impostazioni del componente RS232 come mostrato in Fig.Fig. per vederne i risultati. • EB038 “Relay Board”. Se volessimo realizzare un mouse o comunque un dispositivo standard di input dovremmo scegliere il tipo HID. viene assegnato a fronte del pagamento DE 118 La scelta di uno tra i sopraelencati tipi dipende dalla funzionalità che la nostra periferica implementa. permette di gestire la porta USB come se fosse una normale connessione seriale. del quale dovremo installare il driver come indicato nel box “installiamo il driver del componente FTDI”. 4. un joystick. Coloro che producono in grandi quantità dispositivi USB hanno un loro VID. 6 vediamo le altre configurazioni specifiche al dispositivo che intendiamo realizzare. numero di millisecondi che intercorrono tra due trasmissioni di dati. String =ReceiveString(NumBytes) É utilizzata per leggere l’intera stringa ricevuta sul bus USB. All’interno del campo Name e Manufacturer possiamo inserire il nome della nostra applicazione ed il nostro nome mentre come versione indichiamo 1.com. SendData() Quando viene chiamata trasmette sul bus USB i dati che sono stati caricati nel buffer dalla funzione SetDataByte. • Subclass.Tabella 1 corso F L O WCOD E Nome macro Fig. NumBytes =CheckRx() Aggiorna i dati che sono stati ricevuti dal canale USB. Il parametro PID è l’identificativo del dispositivo realizzato. 6 . • Receivepacketsize. Se volessimo vendere piccole/medie quantità di dispositivi USB potremmo domandare alla Microchip. Richiede che gli sia passato come parametro il numero di byte da leggere e caricare sulla stringa restituita dalla funzione. microchip. è la sottoclasse dei dispositivi USB ed è valida unicamente per mouse e Elettronica In ~ Dicembre 2013 / Gennaio 2014 119 Fig.535 differenti prodotti. Per l’uso personale del dispositivo realizzato. Restituisce la lunghezza dei dati presenti all’interno del buffer. 5 Descrizione RetVal = Initialise_HID() È utilizzata per inizializzare il driver USB per la comunicazione ed attivare il servizio di enumerazione delle periferiche. dimensione dei pacchetti trasmessi al computer dal dispositivo durante l’interrupt sul bus. l’autorizzazione ad utilizzarne uno.0. che nel nostro caso è quello della Microchip. numero di millisecondi che intercorrono tra due ricezioni di dati. In Fig. Restituisce zero se la procedura termina senza errori. SetDataByte(idx. • Transmitpacketsize. della quota associativa al consorzio USB. Value = ReceiveByte(idx) È utilizzata per leggere un byte indentificato dall’indice passato come parametro dal buffer di lettura dei dati ricevuti. dimensione dei pacchetti ricevuti dal dispositivo durante l’interrupt del bus. I parametri principali che dobbiamo impostare sono: • Maximum current. mentre le piccole aziende e gli hobbisti possono utilizzare il VID del costruttore del chip. SendDataDirect(String) Invia i dati contenuti all’interno della stringa passata come parametro sul bus USB. non è necessario avere un VID valido. mediante un particolare richiesta scritta disponibile sul sito www. corrente massima che il dispositivo è abilitato ad assorbire tramite la tensione di alimentazione dell’USB. value) È utilizzata per scrivere uno specifico byte sul vettore che verrà inviato via USB. In ingresso necessita dell’indice del byte da scrivere ed il valore che si vuole scrivere. A fronte dell’acquisto di un VID possiamo quindi avere a disposizione 65. Questa macro non invia fisicamente i dati ma li immagazzina nel buffer di trasmissione senza trasmetterli. • Receivepacketperiod. Il primo dato è identificato dell’indice zero. • Transmitpacketperiod. Analizzandoli. 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. 9. Le macro che Flowcode ci mette a disposizione sono riassunte nella Tabella 1. riusciamo a capire cosa viene trasmesso e cosa è ricevuto. ma le periferiche interne lavorano a 24 MHz in modo da poter supportare la connessione USB Low-Speed. • EB055“USB interfaceboard”. Ogni volta che è necessario gestire un bus a frequenza fissa bisogna stare molto attenti nel configurare correttamente tutti i parametri.pdf”. Per poter utilizzare il componente senza doverlo alimentare esternamente. 8. come le normali tastiere USB. verrà riconosciuto come tale senza bisogno di altre configurazioni ed installazioni. Sempre nel file. In Fig. qualora volessimo ad esempio realizzare un gamepad. 10 sono riassunti i dati trasmessi tra PC e tastiera USB. Il tab “HID Descriptor” visibile in Fig. È inoltre necessario. configurare la scheda in modo da avere la frequenza adatta per poter utilizzare correttamente il bus USB. come mostrato in Fig.Fig. La frequenza di oscillazione del PLL è quindi 96 MHz. 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. è utilizzata per definire la classe del dispositivo. 8. • Interface. Ora che l’hardware è pronto. • EB014“Keypadboard”. 7 tastiere (HID). appena connesso il dispositivo al calcolatore. Per realizzarlo abbiamo bisogno dei seguenti componenti: • EB006 “USB PICmicromultiprogrammerboard” (PIC18F4450 e quarzo 12 MHz). la EB055 alla porta C. In modo automatico. La connessione è effettuata mediante il filo giallo mostrato nella stessa Fig. La descrizione dei dispositivi è standard quindi. Colleghiamo la scheda EB014 alla porta D e Fig. basta collegare il morsetto V+ della scheda EB006 al morsetto +5 della scheda EB055. troveremo la codifica DE 120 Dicembre 2013 / Gennaio 2014 ~ Elettronica In . possiamo dedicarci alla realizzazione del software di controllo: per prima cosa dobbiamo capire quali dati vengono scambiati tra PC e tastiera in modo da poterla emulare. 8 Configurazione hardware per realizzare il tastierino numerico. possiamo andare sul sito ufficiale USB e scaricare i file “Hut1_12v2. nel nostro caso la configurazione è mostrata in Fig.pdf” e “HID1_11. ci basterà cercarne la sua descrizione su Internet ed inserirla all’interno della nostra finestra. In questo modo il microcontrollore viene alimentato direttamente dalla porta USB. come visto nelle precedenti puntate. allo scopo. 7 permette di descrivere in modo dettagliato la comunicazione ed il significato di ogni singolo byte trasmesso. • Keypad_precedente : è utilizzata per memorizzare lo stato precedente letto sul keypad ed è di tipo byte. Per ovviare a problemi di inizializzazione è stato aggiunto un ritardo di inizializzazione pari a 100 ms. Se nessun tasto è premuto. Per questa ragione ci basterà valorizzare unicamente il byte 2. qualora il tasto premuto risulti sempre lo stesso. viene trasmesso il valore 0x00 altrimenti il codice relativo al tasto. 9 .Riassunto dati scambiati con la tastiera USB. 12. ma il diagramma di controllo risulta semplice e non richiede neppure di realizzare macro di supporto. Elettronica In ~ Dicembre 2013 / Gennaio 2014 121 . le informazioni sul tasto premuto. Come primo passo è necessario inizializzare la periferiche HID e successivamente. Il componente Keypad richiede una corretta configurazione delle connessioni. Per evitare di sovraccaricare il bus di dati non utili.E corso F L O WCOD Fig. Per quanto riguarda la configurazione del componente HID. dei caratteri da trasmettere perché questi non seguono la normale tabella ASCII.Configurazione del microcontrollore per la realizzazione del tastierino numerico. Le variabili utilizzate sono le seguenti: • DatiUSB[8]: è un vettore di 8 byte nel quale vengono memorizzati i dati da trasmettere sul bus. In questo semplice esempio trasmetteremo unicamente un carattere per volta e non saranno quindi possibili combinazioni di tasti premuti in contemporanea. 11. I valori numerici dall’uno al 9 partono dal valore esadecimale 0x1E mentre lo zero ha codifica 0x27. lasciando gli altri al valore predefinito 0x00. mediante un ciclo infinito. per il fatto che utilizza il bus USB. 10 . Fig. scandire il tastierino numerico e trasmettere periodicamente. Nel nostro caso dovranno essere impostate come mostrato in Fig. • EsitoInizializzazione : variabile byte che serve per memorizzare l’esito dell’inizializzazione della periferica USB. i dati vengono trasmessi unicamente a seguito di una variazione del tasto premuto ed il tempo minimo di ritardo tra una trasmissione e l’altra è di 10 ms. 13. mediante la macro di aggiornamento della periferica HID. L’applicazione potrebbe sembrare complessa. è necessario scegliere nella pagina HID descriptors l’opzione Keyboard mentre configurare il tab HID options come indicato in Fig. Il flusso di programma completo è mostrato in Fig. Ora che abbiamo tutte le informazioni necessarie possiamo trascinare nel pannello il componente Keypad ed il componente USBHID. • Keypad : memorizza il valore letto dal Keypad in una variabile di tipo byte. 11 . inseriamo l’indirizzo alla cartella “\drivers\EB-O39” contenuta all’interno del nostro lettore CD e procediamo premendo il pulsante “Avanti”. È necessario rigenerare il driver ogni qualvolta. il PC al quale colleghiamo il convertitore FTDI. 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. Fig. Al termine della procedura di installazione otterremo l’indicazione che il driver è stato aggiornato ed è quindi pronto all’uso come indicato in Fig. 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. Con queste semplici macro possiamo realizzare qualsiasi tipo di periferica USB che emuli una comunicazione seriale. Per meglio capirne il funzionamento passiamo ora alla realizzazione di un semplice analizzatore di stati logici. modifichiamo i parametri di configurazione. il DE 122 Dicembre 2013 / Gennaio 2014 ~ Elettronica In . Fig.inf che viene richiesto quando colleghiamo la periferica ad un PC per l’installazione del driver.Configurazione USB-HID. deve avere installati i driver necessari. pulsante “Generate Driver File” che si trova in essa serve per generare il file . A). 12 .Configurazione Keypad. B. Fig. B – Installazione driver completata con successo. 14. A – indicazione del percorso di ricerca del driver USB. Le macro a disposizione sono elencate in Tabella 2. i parametri che possiamo configurare sono gli stessi che avevamo visto per il componente HID. Come possiamo osservare nella finestra di dialogo visibile in Fig. Il componente si trova nella barra dei componenti all’interno del menu “periferiche” dove avevamo precedentemente visto gli altri componenti USB. nella finestra di dialogo.Installiamo il driver del componente FTDI Per poter funzionare correttamente. Fig. In pratica il sistema embedded legge il valore della porta B e lo invia in modo seriale.5 secon- Elettronica In ~ Dicembre 2013 / Gennaio 2014 123 . Per poter funzionare correttamente.1 secondi sull’asse dei tempi. Progetto pratico: realizziamo un analizzatore di stati logici Un analizzatore di stati logici permette di visualizzare gli stati di una serie di connessioni in modo da poter debuggare sistemi digitali. 13 Diagramma completo per la realizzazione di una tastiera USB. Ogni 100ms verrà inviato un dato sulla comunicazione e quindi potremo avere una risoluzione massima di 0. Il timestamp è rappresentato in decimi di secondo mentre il valore della porta B in decimale. Se per esempio volessimo trasmettere il valore 236 al tempo 1. Dato che la comunicazione USB non è “real-time”. La sequenza trasmessa sarà quindi: <xxxxxx-yyy> dove xxx rappresenta il TimeStamp mentre y è il valore della porta B. Dal lato PC è possibile realizzare un programma terminale che legge i dati e li stampa a video in modo da poterli analizzare semplicemente. aggiungeremo alla stringa inviata serialmente anche il cosiddetto “TimeStamp” in modo che si possa sapere quando i dati sono stati campionati. Il materiale di cui abbiamo bisogno è il seguente: • EB006 “USB PICmicromultiprogrammerboard” (PIC18F4550 e quarzo 12MHz) • EB055 “USB interfaceboard” • EB016“Prototypeboad” In Fig.E corso F L O WCOD Fig. La scheda EB055 è connessa alla porta C mentre la EB016 alla porta A e B. È molto utile per la lettura di comunicazioni su bus paralleli. 15 sono visibili le interconnessioni tra le schede della MatrixMultimedia per la realizzazione del progetto. 16 in modo da poter operare a una frequenza di clock di 48 MHz. il microcontrollore deve esse configurato come mostrato in Fig. In questo modo anche con un semplice terminale è possibile interpretare il segnale. Per questa ragione realizzeremo una macro che avrà il compito di convertire un numero e di portarlo a lunghezza fissa. generazione della stringa da trasmettere e infine trasmissione del dato su bus USB. Length) Invia la stringa passata come parametro “String”. Generare la stringa a lunghezza fissa. Ora che la nostra macro è pronta possiamo passare alla realizzazione del programma principale. si ha la ripetizione del valore di TimeStamp. • LunghezzaFissa: è la lunghezza della stringa in uscita. Qualora venga posto al valore 255 l’attesa non termina fino a quando un dato non è disponibile nel buffer di ricezione. La macro si chiama “ConvertiInStringaFissa” e necessita dei seguenti parametri: • ValoreNumerico: è il valore che vogliamo convertire.9 secondi (27. è probabilmente la parte più difficile di tutto il progetto perché il comando per la conversione da numero a stringa inserisce unicamente le cifre significative. Descrizione É utilizzata per inizializzare la comunicazione USB avviando il servizio di enumerazione in modo che il PC possa identificare il dispositivo. Restituisce come valore di ritorno 0 qualora venga eseguita correttamente mentre 255 in caso di errore. Fig. Send_Byte(Byte) Trasmette il byte passato come parametro inserendolo nel buffer di scrittura. Nel caso nessun dato venga ricevuto entro il timeout il valore di ritorno è 255. Il parametro “Length” deve contenere la lunghezza dei caratteri da trasmettere contenuti nella stringa. in millisecondi. Nell’inizializzazione inseriamo l’azzeramento delle variabili e la macro “Intitialize_Serial()” per la connessione USB. 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. Read_String(timeout_ms. Come di routine suddividiamo il programma in due parti principali: l’inizializzazione del sistema ed il ciclo principale. Il primo ciclo si occupa della formattazione della stringa mediante l’aggiunta del carat- tere che identifica lo zero mentre il secondo carica all’interno del valore di ritorno il valore convertito mediante la funzione Length$ con allineamento a destra come mostrato in Fig. Conversione del valore letto e del TimeStamp. Read_Byte(timeout_ms) Legge dal buffer di lettura un byte e lo restituisce come valore di ritorno.7 giorni) dopo il quale. Per fare in modo che i dati ven- Tabella 2 . di invieremo la stringa “<000015-236>. 124 Dicembre 2013 / Gennaio 2014 ~ Elettronica In DE Initialise_Serial() cors o F L O W CO Nome Macro .Fig. per il quale la macro deve attendere in attesa di un dato. 17.Macro disponibili per la gestione della connessione USB-Seriale. 15 – Configurazione HW per analizzatore di stati logici. Per prima cosa inseriamo all’interno del pannello il componente USB-Seriale e lo configuriamo come visto nel paragrafo precedente. String. Send_String(String. Length) 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. Il parametro “timeout_ms” serve per stabilire un timeout massimo. cioè con l’aggiunta dello zero per mantenere la lunghezza fissa. 14 Finestra delle proprietà del componente USB seriale. Il tempo massimo è di 99999. Il ciclo principale si occupa invece della sequenza di lettura della portaB. Il ciclo principale è. Per ovviare a questa problematica è comunque sufficiente utilizzare un timer.E corso F L O WCOD Fig. Fig. racchiuso all’interno di un ciclo infinito per evitare che il programma termini dopo il primo invio di dati. come sempre. Bene. 18 Diagramma del “Main” dell’analizzatore di stati logici. In questo esempio è stato scelto di non utilizzarlo unicamente per poterci soffermare maggiormente sull’impiego del bus di comunicazione piuttosto che sulle altre problematiche di contorno che. a questo punto del corso. I più esperti nella realizzazione di sistemi embedded si saranno sicuramente accorti del fatto che utilizzare un delay per cadenzare una misurazione per periodi così lunghi porta ad un accumulo dell’errore sul timestamp. anche con questa puntata abbiamo concluso. Elettronica In ~ Dicembre 2013 / Gennaio 2014 125 . 17 . 18 è mostrato il diagramma principale per la realizzazione dell’analizzatore di stati logici. 16 – Configurazione microcontrollore per analizzatore di stati logici. dovreste essere già in grado di risolvere in modo autonomo. Fig. In Fig. Nelle prossime conosceremo altri componenti forniti da Flowcode. tra i quali g lo ZigBee e l’Ethernet. Per testare il programma possiamo utilizzare un qualsiasi terminale per porte COM che supporti le comunicazioni seriali virtuali. gano campionati e trasmessi ogni 100ms è necessario inserire un ritardo di 100ms.Macro ConvertiInStringaFissa utilizzata all’interno dell’analizzatore di stati logici. Settima puntata. mentre la ZigBee Alliance è stata incaricata di arrivare alla definizione delle specifiche di alto livello (livelli Network e Application).11 e WiFi e tra 802. giorno in cui la ZigBee Alliance (consorzio di aziende che si occupano dello sviluppo e dell’aggiornamento dello standard e della promozione della tecnologia su di esso basata) rilascia le specifiche 1.15.0. La relazione che esiste tra 802. 7 corso di programmazione in F L OWCODE di Francesco Ficili e Daniele Defilippi N elle puntate precedenti ci siamo occupati di diverse periferiche di comunicazione. ossia quella di essere tutte periferiche di comunicazione cablate.15. Analizziamo adesso l’implementazione Flowcode di una periferica wireless.4 (parte del work group IEEE 802. Come era già avvenuto in passato per la definizione di altri standard. Al task group IEEE 802. Non bisogna quindi confondere le Elettronica In ~ Febbraio 2014 129 .1 e Bluetooth.15) è stato assegnato il compito di definire le specifiche relative al livello fisico e MAC dello standard. il lavoro relativo allo standard ZigBee è stato diviso in due tronconi. l’innovativo sistema di sviluppo grafico per microcontrollori proposto dalla Matrix Multimedia.15.4 e ZigBee è la stessa che esiste tra 802.E corso F L O WCOD Continuiamo il nostro viaggio alla scoperta di Flowcode. Il Protocollo ZigBee Il protocollo ZigBee nasce ufficialmente il 14 dicembre 2004. In questa puntata analizzeremo una periferica wireless: ZigBee. che avevano una caratteristica comune. ossia interfacciamo il nostro microcontrollore con una periferica ZigBee. • Router. Flexibility Reach.1 Wi-Fi™ 802.15. come potrebbe invece essere per il WiFi.Confronto tra tecnologie wireless in funzione di portata trasmissiva e data-rate.4 con lo standard ZigBee: con il primo ci si riferisce ad un insieme di specifiche di basso livello sulle quali si basa il secondo per la definizione di uno standard più complesso. Data System Resource 4KB-32KB 250KB+ 1MB+ 16MB+ Battery Life (days) 100-1000+ 1-7 1-5 1-7 Nodes Per Network 255/65K+ 7 30 1.4 Bluetooth™ 802. La portata dipende dal dispositivo considerato. Sulle specifiche indicate dallo standard ZigBee si basano i costruttori per la realizzazione del silicio. specifiche dello standard IEEE 802. Low Power.000+ 64-128 Range (meters) 1-75+ 1-10+ 1-100 1. non possono trasmettere dati provenienti da altri dispositivi.15. come ad esempio la creazione della rete stessa. ZigBee™ 802. 2 è riportato un grafico che mette a confronto diverse tecnologie wireless in funzione del range trasmissivo e del data rate (in Mbps). agisce come router intermedio. dall’antenna e dalla potenza irradiata in trasmissione: valori tipici sono compresi tra le decine e le centinaia di metri. I dispositivi facenti parte di una PAN ZigBee si chiamano nodi.Tabella 1 . • End Device. DE 130 Febbraio 2014 ~ Elettronica In . passando i dati da e verso altri dispositivi. li ingloba in un sistema più complesso. Quality Fig. Cost Effective Cost. Video. i nodi non sono tutti uguali ma lo standard ZigBee ne prevede tre tipi: • Coordinator. 2 .000 Bandwidth (kbps) 20-250 720 11. Voice.Confronto tra le più diffuse tecnologie wireless. caratteristico dell’applicazione finale vera e propria. ne può esistere al massimo uno per rete e può fungere da ponte tra reti diverse (è anche chiamato Gateway). include le funzionalità minime per dialogare con il loro nodo padre (Coordinator o Router).11b GPRS/GSM 1XRTT/CDMA Application Focus Monitoring & Control Cable Replacement Web. In Fig. tale parametro non sempre si trova nei data-sheet dei dispositivi. Come si vede Bluetooth e ZigBee occupano zone molto vicine nel grafico. Come è stato già accennato nell’introduzione il protocollo ZigBee è un protocollo wireless caratterizzato da bassi consumi energetici. la velocità di comunicazione è relativamente bassa. mentre il data rate dell’interfaccia può assumere valori che variano da 1. Email WAN. semplicità nell’implementazione del codice (generalmente indicata come consumo approssimativo di memoria programma per la realizzazione di un nodo) ed elevato numero di nodi costituenti la rete. ma mentre il primo cors o F L O W CO Fig. in quanto lo ZigBee non è stato specificamente studiato per lo scambio di grosse moli di dati. è il nodo centrale della rete e ad esso sono demandate le funzioni più importanti. il quale aggiunge un ulteriore strato a livello applicativo.200 bps. Convenience Speed. l’assegnazione degli indirizzi.200 a 115. la scelta del canale RF ed altro ancora. La Tabella 1 mette a confronto lo standard ZigBee con alcune tra le più diffuse tecnologie wireless esistenti.15.000+ Key Attributes Reliable. Il data-rate tipico dichiarato sul canale radio è 250 kbps. Chi a sua volta acquista i chip dai produttori. 1 Logo della ZigBee Alliance. Su questa frequenza sono disponibili ben 16 canali e quindi. qualità aria. lo standard sfrutta le frequenze assegnate nella banda ISM (Industrial. Automazione industriale Accelerometri. qualità acqua. all’associazione del dispositivo con un’altra rete. ma riscrivibile. controllo umidità Monitoraggio ambientale Terra. La gestione di reti Mesh è una prerogativa del protocollo. Viene memorizzato in un’area di memoria protetta. Medical). Scientific. Spostamenti Monitoraggio strutturale Monitoraggio gallerie. Monitoraggio edifici a rilevanza storica o artistica Domotica Sistemi di sicurezza e controllo Elettronica In ~ Febbraio 2014 131 . Questa interessante caratteristica viene generalmente indicata come Mesh Networking. Si va dalla building automation al controllo industriale. il secondo la sacrifica in funzione di una maggiore portata trasmissiva. Per quanto riguarda le bande radio utilizzate. univoco per ogni dispositivo prodotto al mondo. un indirizzo denominato MAC ed uno denominato Short. Vibrazioni. Gli indirizzi Short sono assegnati dal Coordinator all’atto della creazione della rete. oltre ad un efficiente sistema di indirizzamento dei dispositivi. che in questo caso fungono da routers. ad esempio. 3 . Tabella 2 . che viene implementata adottando i più recenti algoritmi di routing. controllo temperatura. ZigBee presenta una interessante caratteristica che lo differenzia da Bluetooth e da altri protocolli wireless. Pressione.4 GHz praticamente in tutto il mondo. e gli permette di estendere il suo range utile a valori molto superiori rispetto alla portata di un singolo dispositivo. questa risulta essere la scelta più frequente dei costruttori. Le caratteristiche intrinseche di ZigBee rendono questo standard la scelta ideale per un gran numero di applicazioni.Applicazioni del protocollo ZigBee. 3. privilegia la velocità in trasmissione.E corso F L O WCOD Fig. quindi può cambiare.Esempio di Mesh ZigBee. Invece lo Short è un codice identificativo a 16 bit (2 byte) che permette di identificare univocamente un dispositivo all’interno di una rete ZigBee. In particolare può usufruire delle frequenze radio a 433MHz e 868 MHz in Europa e a 315 MHz e 915 MHz negli USA. Settore di applicazione Possibili applicazioni Termoregolazione HVAC. che si avvale di due indirizzi. Infatti lo standard permette di mettere in comunicazione due nodi qualsiasi anche se non posti in collegamento radio diretto. Un importante segmento è sicuramente costituito dalla Fig. Inoltre può usufruire della banda radio a 2. Monitoraggio dighe. a meno di casi particolari. una cui rappresentazione grafica è riportata in Fig. che variano a seconda del paese considerato. Il MAC è un codice identificativo a 64 bit (8 byte). Oltre a ciò. è sufficiente che tra i due nodi in questione esista almeno un percorso costituito da nodi intermedi. Tale codice è memorizzato all’interno di un’apposita memoria ROM e non può essere modificato. in seguito. dalle periferiche wireless per PC (come tastiere e mouse) ad applicazioni wireless di sicurezza. 4 Applicazioni tipiche del protocollo Zigbee. Monitoraggio ponti. 4 V 2. prodotti dalla Digi/ Maxstream. Si tratta di una famiglia di radiomodem con interfaccia seriale. con baud rate selezionabile da 1200 bps a 115200 bps.92 dBm . Fig. L’interfaccia di comunicazione è una seriale standard UART. divisi per funzione. Tra i vari dispositivi ZigBee presenti al mondo hanno acquisito una certa fama (specialmente nel mondo hobbistico) i dispositivi Xbee. la gestione dei pacchetti è decisamente più complicata. lunghezza campo dati. Tali disposivi sono stati scelti anche dalla Matrix come modulo hardware ZigBee per i dispositivi e-block. sicchè il collegamento minimo richiesto per il funzionamento dei moduli consiste nelle due linee della seriale. Nei data-sheet sono definiti una serie di frame utilizzabili. La Tabella 2 elenca sinteticamente alcune delle più comuni applicazioni del protocollo. il cui esemplare è riportato in Fig. all’interno della barra dei componenti. Per inserirlo nel nostro progetto è sufficiente trascinarlo sul pannello. La Fig.Fig. TX ed RX e nelle due linee di alimentazione. .8 – 3. e caratterizzati da differente numero di byte.8 – 3. e consiste in un piccolo PCB.Caratteristiche moduli Standard e PR. 5. In modalità trasparente tutto ciò che viene inviato sulla seriale del modulo viene ritrasmesso sul canale radio e viene successivamente ritrasmesso in uscita sulla porta seriale del modulo ricevente. Tabella 3 . etc. 6 illustra le diverse possibili scelte per l’antenna dei moduli Xbee. Sono previste due modalità di funzionamento. ecco perché la modalità viene definita “trasparente”. L’interfacciamento verso l’esterno è affidato a due file di 10 pin a passo 2 mm. I radiomodem aggiungono alla sorgente e tolgono alla destinazione tutto l’header necessario alla comunicazione. 6 . inclusa l’antenna che può essere a chip. che contiene informazioni quali indirizzo destinazione. codice identificativo ed altro ancora. Xbee 30 m Xbee PRO 100 m Outdoor Range 100 m 1500 m Transmit Power Output 1 mW (0 dBm) 100 mW (20 dBm) RF data rate 250 kbps 250 kbps Interface Data Rate 1200 – 115200 bps 1200 – 115200 bps Receiver Sensitività . In modalità API. checksum. all’interno del quale trova posto tutta l’elettronica necessaria al funzionamento. La Fig.4 V Transmit Current 45 mA 270 mA Receive Current 50 mA 55 mA Febbraio 2014 ~ Elettronica In 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. 5 . 4 illustra alcune delle applicazioni tipiche del protocollo. Il componente ZigBee in Flowcode Analizziamo adesso il componente ZigBee integrato in Flowcode. Il componente si trova sotto il gruppo dei componenti wireless. Non è possibile intervenire sull’header.Modulo Xbee Serie 2.100 dBm Supply Voltage 2. modalità trasparente (denominata normalmente modalità AT) e modalità API. invece. L’hardware è molto semplice.Possibili scelte per l’antenna dei moduli Xbee. a filo o con connettore RPSMA. impostare la PAN id (random e impostata dall’utente). sinteticamente riportate in Tabella 4.Macro del componente ZigBee Flowcode. • Controllo di ogni singolo nodo tramite indirizzo in formato ASCII su due cifre. la modalità di sleep (1=Hibernate. La finestra delle proprietà extra del componente è riportata in Fig. • La stringa di comando inviata dal master è una stringa ASCII composta da 7 caratteri. Questa volta ci proponiamo di realizzare una mesh ZigBee costituita da nodi in grado di controllare una batteria di 4 relé. Come per gli altri componenti. Elettronica In ~ Febbraio 2014 133 . Come già fatto per gli altri progetti pratici. impostare il numero massimo di hops. Scan_Network Esegui uno scan per individuare una rete associabile. 2=Doze. Sarà possibile modificare l’indirizzo del nodo tramite il canale wireless e sarà inoltre possibile intervenire su alcuni parametri di funzionamento. Prende in ingresso due parametri. - selezione periodo lampeggio LED. 7 – Proprietà extra. in modo da non dover ripristinare la configurazione in futuro. Ogni nodo sarà identificato all’interno della mesh tramite un indirizzo costituito da due cifre numeriche codificate ASCII. esaminiamo le specifiche di progetto. Nome Macro 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). i canali da includere all’interno della procedura di scan ecc. 4=Cyclic Sleep. Router. I vari parametri saranno memorizzati all’interno della EEPROM del dispositivo. elencate di seguito. Connect_To_Coordinator Connettiti al coordinator. in modo che possano essere recuperati anche nel caso in cui il nodo venga privato della sorgente di alimentazione. 7.corso F L O WCOD E Fig. 5=Cyclic Doze) e il timeout in ms. Connect_To_All Connettiti a tutti i nodi (trasmissione broadcast) Node_Configure_Sleep Imposta la modalità sleep del nodo (applicabile solo agli end device). Tabella 4 . sono disponibili delle API che ne facilitano l’utilizzo. Restart_Network Re-inizializza la network Zigbee. End node). Node_Wake Risveglia i nodi figli dallo sleep mode. • Attivazione/disattivazione di 4 relé. Il nostro progetto prevede quindi l’utilizzo di un protocollo livello applicazione che si appoggia sul protocollo ZigBee. cliccando con il tasto destro. - abilitazione/disabilitazione Eco comando. Get_Signal_Level Leggi il livello del segnale radio Send_Char Invia un byte sul canale radio. Progetto pratico: nodo wireless per controllo relé Passiamo adesso al progetto pratico relativo a questa puntata. come più volte abbiamo fatto in precedenza. Come si può vedere è possibile scegliere che tipo di componente si vuole implementare (Coordinator. Connect_To_Address Connette il modulo ad uno specifico indirizzo all’interno della network. • Gestione delle seguenti opzioni: - abilitazione/disabilitazione LED funzionamento. Receive_Char Restituisci il carattere ricevuto dal canale radio. La definizione del protocollo di livello applicazione è riportata di seguito. Una volta posizionato il componente possiamo esaminarne le proprietà extra. • Memorizzazione delle opzioni di sistema su memoria EEPROM. una sezione di identificazione ed una sezione di controllo. • La sezione di controllo è divisa in 3 sottofunzioni: - sottofunzione “R”. vamente. Quindi per identificare il nodo 01. come ad esempio la “Xbee explorer USB”. • 1x EB004 “LED board”. In questa sottofunzione la lettera “R” è seguita da un carattere numerico ASCII da 1 a 4. La lista degli e-block necessari per la realizzazione di un nodo slave è riportata di seguito: • 1x EB006 “USB PICmicro multiprogrammer board” (PIC18F4580 e quarzo a 12 MHz). usata per il controllo diretto dei relé. possiamo utilizzare una delle tante board di interfacciamento per nodi Xbee. Quanto alle connessioni. per abilitare/disabilitare il relé (ad esempio per abilitare il relé 1 sul nodo 15 si userà la stringa S15R1a). - sottofunzione “C” . separate dal carattere ASCII “-“. dovremo collegare la EB051 sulla porta C (in modo da poter utilizzare la porta USART hardware per cors o F L O W CO DE 134 Febbraio 2014 ~ Elettronica In . • La sezione di identificazione serve ad indirizzare il nodo che si vuole controllare. - sottofunzione “I”. si invierà la stringa “S01”. usata per impostare un nuovo indirizzo del nodo. usata per impostare la configurazione del sistema. per cambiare l’indirizzo del nodo 0 in 35 si userà la stringa S00I35).• La stringa di comandi è divisa in due sezioni. • 1x EB051 “ZigBee board” (configurazione Router/End Node). che costituiscono la nuova coppia di valori per l’indirizzo del nodo(Es. • 1x EB030 “Relay board”. In questa sottofunzione. distribuita da Futura Elettronica. Le opzioni di configurazione attualmente disponibili permettono di abilitare/disabilitare il working LED e selezionarne il periodo di lampeggio ed abilitare/disabilitare l’eco. rispetti- Fig. la lettera “I” è seguita da due caratteri numerici da “0” a “9”. È composta da 3 caratteri ASCII: un primo carattere S (Slave) seguito da due caratteri numerici ASCII da “0” a “9”. usato per identificare il relé e dai caratteri “a” e “d” usati. Per quanto riguarda il nodo Coordinator. 8 Connessione E-Block per progetto pratico. Infine colleghiamo la EB004 sulla porta A. con la differenza che questa volta è stato impostato un interrupt sul timer 2 con periodo di 1ms. insieme alle relative periodicità. In Fig. LedTask Impostabile Gestisce il working LED. Elettronica In ~ Febbraio 2014 135 .Periodicità e descrizione dei task del software del nodo ZigBee slave. ed un totale di 4 task. L’implementazione del main scheduler è riportata in Fig. naturalmente. riportati per completezza in Tabella 5. Si è quindi deciso di diminuire l’intervallo tra le chiamate quando non ci sono dati in transito sul canale wireless ed aumentarla al massimo durante la fase di ricezione attiva. L’implementazione dello scheduler di sistema è del tutto simile a quella vista nella puntata 5. RelayTask 500 Attua lo stato dei relé impostato dai comando wireless. ci soffermeremo Fig. in modo da avere la granularità richiesta. Si noti la differenza di tempistiche del task RxTask. 9. prevedere una gestione della memoria non volatile. 9 . 8 sono rappresentati i collegamenti hardware dei vari E-block. - TSK_RxTaskCounter. Non dimentichiamo che sia la EB051 che la EB030 necessitano anche dei collegamenti di alimentazione. e la EB030 sulla porta D. L’architettura utilizzata per l’implementazione del nodo prevede l’utilizzo di uno scheduler ad 1 ms. Secondo le specifiche che ci siamo forniti. le chiamate ai vari task sono scandite dallo stato delle 4 variabili: - TSK_RelayTaskCounter. parlare con il modulo Xbee). Analizzeremo in seguito il meccanismo software implementato per ottenere questo comportamento. Implementazione software A questo punto possiamo iniziare ad esaminare i dettagli implementativi del software del nodo slave. Task Periodo [ms] Descrizione RxTask 1 (attivo).E corso F L O WCOD Tabella 5 . Non potendo analizzare tutti i task implementati in quanto una singola puntata non sarebbe sufficiente. e quello che occupa maggiori risorse. il nodo slave deve essere in grado di gestire i 4 relé. gestire il “working” LED (LED che segnala che il nodo è connesso alla rete ed operativo) e. 1000 (riposo) Riceve e decodifica i dati sul canale wireless. Come si può vedere. - TSK_LedTaskCounter. gestire il protocollo applicazione che abbiamo descritto in precedenza. EepromTask 100 Aggiorna i parametri su memoria non volatile. Questo è il task più delicato dell’intero sistema. - TSK_EepromTaskCounter.System scheduler. Prendiamo ad esempio il task RxTask. anche senza pacchetti in arrivo. ossia la decodifica del pacchetto dati inviato dal Coordinator. Normalmente il valore è NO_INCOMING_PACKET. che esegue uno dei compiti più importanti del sistema. in caso di assenza di attività RF il task esegue una volta al secondo. Dopo 200ms si resetta tutto e si ricomincia daccapo. noteremo che essa vale: (TSK_RxTaskCounter >= TASK_RX_TIMEOUT) || (IncomingPacket = NEW_ INCOMING_PACKET) Ossia. il task RxTask lo forza al valore NEW_INCOMING_PACKET fino al termine della ricezione. Infine. che può avere due valori: NEW_INCOMING_PACKET e NO_INCOMING_PACKET. PACKET. Se andiamo a controllare la condizione di chiamata del task RxTask sullo scheduler. Dopo aver ricevuto il byte su un buffer di servizio. Come si può vedere dallo schema a blocchi. Poiché questo task risulta essere piuttosto pesante per la CPU durante l’esecuzione. se c’è un byte in ricezione sul canale. se il valore di IncomingPacket è diverso da NEW_INCOMING_PACKET (situazione di attesa). si è scelto di dargli una periodicità differente in caso di ricezione dati e non. quindi la sua esecuzione non è cors o F L O W CO solo sui task più importanti. ma in caso di inizio di una procedura di ricezione. Contestualmente viene attivato un timer (PacketCheckTime) che rimane attivo per tutta la fase di trasmissione. messa a disposizione dal componente ZigBee. Questo tipo di comportamento è stato realizzato gestendo un flag globale denominato “IncomingPacket”. Scopo del timer è evitare che pacchetti tronchi blocchino il task in attesa di una parte del pacchetto. il tempo di esecuzione passa ad 1ms. 10. 10 – Task RxTask. il task viene eseguito con la sua periodicità classica (TASK_ RX_TIMEOUT). La RxDecodeFn è una funzione (non un task.Fig. quando il pacchetto è ricevuto completamente si resettano contatori e flag e viene chiamata la funzione di decodifica (RxDecodeFn). lo si acquisisce facendo uso della macro Receive_Char(). mentre se c’è attività sul canale radio. lo si sposta sul buffer di ricezione (e si aumenta l’indice associato al buffer) e si setta il flag IncomingPacket al valore NEW_INCOMING_ DE 136 Febbraio 2014 ~ Elettronica In . In sostanza. altrimenti si passa ad una esecuzione veloce ad ogni chiamata dello scheduler stesso (ossia una volta al ms). in modo da decodificare immediatamente il pacchetto e passare nuovamente allo stato di attesa (con conseguente sovraccarico minimo della CPU). Lo schema a blocchi del task RxTask è riportato in Fig. 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 l’ID corrisponda con I valori caricati dalla memoria EEPROM. in caso positivo. Prima di farlo però. Fig. altrimenti il pacchetto viene scartato. in maniera da agevolare la fase succes- Function_Parameter2 = RxBuffer[. siva.DEC_ID_ MIN] Function_MainFunction = RxBuffer[. 11.E corso F L O WCOD periodica ma event tiggered) che ha il solo scopo di decodificare il pacchetto in ricezione e impostare correttamente il valore delle variabili globali affinchè gli altri task compiano correttamente i loro compiti. impostando adeguatamente le variabili globali utilizzate dagli Elettronica In ~ Febbraio 2014 137 . si trasmette l’eco del pacchetto ricevuto. si controlla se l’opzione Eco è attiva (EEP_Conf_EcoEnabled = ECO_ENABLED?) e.DEC_ PAR_2] Il primo controllo effettuato è sulla prima parte del pacchetto.DEC_ID_ MAJ] Packet_IDMinor = RxBuffer[. Dopo aver effettuato questo check preliminare si passa alla decodifica dell’istruzione vera e propria del pacchetto. Lo schema a blocchi della RxDecodeFn è riportato in Fig. Nello specifico viene utilizzato un blocco calcolo che esegue le seguenti assegnazioni: NodeType = RxBuffer[. In pratica la prima operazione eseguita è l’assegnamento dei vari byte del pacchetto a delle specifiche variabili.Schema a blocchi della funzione RxDecodeFn. Successivamente.DEC_NODE_TYPE] Packet_IDMajor = RxBuffer[.DEC_ PAR_1] Se il controllo ha esito positivo si prosegue. 11 .DEC_ MAIN_FUNCT] Function_Parameter1 = RxBuffer[. Descriviamo brevemente l’implementazione. quella contenente l’indirizzo del nodo. un blocco selezione multipla decodifica il campo dati effettivo del pacchetto. che risulterà di semplice comprensione.Fig. per aggiornare il parametro di configurazione relativo all’abilitazione dell’eco.Schema a blocchi del task EepromTask. la sezione relativa al controllo dei relé. tutte le opzioni di configurazione). 12 – Schema a blocchi del task RelayTask. 13 . In particolare. ad esempio. anche in questo caso. Fig. ma. mentre il flag EepUpdateRequest segnala al task EepromTask che deve essere eseguito un aggiornamento dei parametri in memoria. Lo cors o F L O W CO RelayNumber = Function_Parameter1 RelayStatus = Function_Parameter2 EEP_Conf_EcoEnabled = Function_Parameter2 EepUpdateRequest = UPDATE_EEP_REQUEST DE 138 Febbraio 2014 ~ Elettronica In . Passiamo ora ad esaminare il task di controllo dei relé. ora che è stata esaminata la logica di comunicazione tra i task. una volta verificato che il byte Function_MainFunction corrisponda al valore ASCII “R”. per sapere se i parametri in memoria sono EEP_Conf_EcoEnabled contiene il valore del parametro. effettua le seguenti assegnazioni: da aggiornare. Tale gestione è demandata al relativo task. Una parola a parte merita la gestione della memorizzazione dei parametri in EEPROM (questo riguarda. si utilizza una variabile globale. altri task per l’esecuzione delle azioni specifiche. ad esempio. Così. il relativo blocco calcolo imposta: Queste informazioni vengono poi utilizzate dal task RelayTask per il controllo effettivo dei relé. Con quest’ultima analisi i task più significativi sono stati analizzati. che copia il contenuto della EEPROM all’interno delle variabili “mirror”. se la procedura è attiva. quindi la tralasciamo. mentre la seconda ne indica lo stato.Esempio di comunicazione. al prezzo di un tempo complessivo maggiore per eseguire l’intera operazione. elemento fondamentale nel funzionamento del sistema. Quindi il blocco EEPROM all’interno di questo progetto è costituito da due parti distinte. ed in particolare dalla RxDecodeFn. che ci ha permesso di fissare alcuni importanti concetti visti nelle puntate precedenti. 12. Per evitare di gravare troppo sulla CPU i dati non sono copiati tutti insieme.E corso F L O WCOD Fig. Ci sono diversi modi di gestire una memoria EEPROM in un progetto embedded. ma è stata costruita una sequenza che copia un dato per ciclo di schedu- ling. schema a blocchi del task RelayTask è riportato in Fig. Nella prossima e ultima puntata analizzeremo (e proveremo con un progetto pratico) i componenti g TCP/IP e il Webserver. Se durante la vita operativa del sistema. e la scelta della modalità non è mai una questione banale. i dati immagazzinati nella memoria EEPROM sono copiati in opportune locazioni di memoria RAM all’avvio del sistema (mirror della EEPROM). Come abbiamo potuto esaminare in precedenza. Esaminiamo invece il task. Al termine della sequenza viene resettato anche il flag EepUpdateRequest (EepUpdateRequest = UPDATE_EEP_ COMPLETE). In questo progetto si è deciso di utilizzare una gestione di tipo mirror. Una volta determinato il relé da controllare ed il suo stato si agisce opportunamente sulla porta D tramite dei blocchi di uscita. In questo modo riduciamo al minimo indispensabile il carico di lavoro in fase di aggiornamento dei dati in EEPROM. quando necessario. La funzione di inizializzazione non è particolarmente complessa. 14 è possibile vedere uno screenshot di comunicazione nel quale era stata precedentemente attivata la funzione eco (vengono attivati e poi disattivati in sequenza i quattro relé). il cui schema a blocchi è riportato in Fig. uno per ciclo. Questo task gira a 500ms e non fa altro che monitorare lo stato delle due variabili globali RelayNumber e RelayStatus. usando un qualsiasi programma terminale per comunicare con il coordinator. Vediamo adesso come viene gestita la memoria non volatile. In questo modo. L’implementazione è molto semplice: all’inizio il task controlla se c’è stata una richiesta di aggiornamento della memoria non volatile (EepUpdateRequest = UPDATE_EEP_REQUEST?). Elettronica In ~ Febbraio 2014 139 . La sequenza è stata realizzata facendo uso di un blocco selezione multipla e di una variabile globale (EepromUpdateSequence). 14 . uno di questi parametri cambia. Una funzione di inizializzazione. Ossia. In questa settima puntata abbiamo analizzato in dettaglio il componente ZigBee. il compito del task è quello di aggiornare i dati in EEPROM copiandovi il contenuto delle rispettive variabili “mirror”. In Fig. al successivo riavvio verranno caricati i dati aggiornati. queste variabili sono impostate dal task RxTask. dato che contiene l’indirizzo del nodo ed anche i parametri di configurazione. 13. In caso affermativo viene avviata la procedura e i dati sono salvati in sequenza. Per eseguire i nostri test abbiamo utilizzato X-CTU. il software fornito dalla Digi per lo configurazione dei radiomodem Xbee. oltre a presentare un progetto pratico di una certa complessità. La prima dice qual è il relé da controllare. ed un task run time che si occupa dell’aggiornamento. Possiamo adesso testare il nostro sistema. viene avviata una procedura che aggiorna la EEPROM (il mirror viene ricopiato sulla EEPROM). Come abbiamo spiegato in precedenza. Ora. in grado di gestire protocolli complessi come quello TCP/IP.E corso F L O WCOD Concludiamo il nostro viaggio alla scoperta di Flowcode. Mediante i componenti TCP/IP. In questa ottava ed ultima puntata spiegheremo come connettere all’ethernet sistemi embedded mediante protocollo TCP/IP. UDP e WebServer possiamo realizzare praticamente qualsiasi applicazione che contempli una comunicazione ethernet senza costringerci ad approfondir- Elettronica In ~ Marzo 2014 129 . ed illustrato la relativa implementazione in flowcode. parleremo di come realizzare sistemi embedded connessi alla rete ethernet. l’innovativo sistema di sviluppo grafico per microcontrollori che consente di scrivere il codice facendo uso di oggetti grafici. 8 corso di programmazione in F L OWCODE di Francesco Ficili e Daniele Defilippi N ella scorsa puntata abbiamo introdotto la periferica wireless che consente la comunicazione secondo lo standard ZigBee. a conclusione del corso. Sviluppo di applicazioni Internet con Flowcode Gestire sistemi integrati connessi alla rete Ethernet è molto complesso ed implica una profonda conoscenza di molteplici protocolli di comunicazione. Inizieremo il nostro percorso parlando del protocollo TCP/IP e al termine della puntata realizzeremo in pochi semplici passi un Web Server integrato in grado di inviare dati dinamici sulla rete. ma Flowcode ci mette a disposizione i componenti necessari per risolvere questo problema in modo semplice e intuitivo. Questo tema ci apre le porte alla gestione e alla realizzazione di sistemi domotici che oggigiorno tendono ad essere sempre più connessi alla rete globale del world wide web. e questo. ognuno ha un compito differente e i pacchetti. 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. Ciascuno dei layer dipende da quello che sta al di sotto e può comunicare solamente con quelli confinanti.ne tutte le problematiche. Tornando al livello più alto. 1).futuranet. In Fig. è necessario basarsi su un qualcosa di fisso ed immutabile che possa identificare un sistema connesso sulla rete. Il protocollo IP si occupa della corretta ricezione/trasmissione di dati. DE 130 Marzo 2014 ~ Elettronica In . essendo collegati ad un ISP (Internet Service Provider). digitiamo un nome. 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 all’interno della rete internet. durante il transito verso gli strati inferiori. Ogni porta è adibita ad un particolare tipo di protocollo ma è possibile utilizzarle anche in modo differente. UDP e MAC. verrà trasformato nel corrispondente indirizzo IP utilizzabile con il protocollo TCP/IP. cors o F L O W CO Il protocollo TCP/IP TCP/IP è l’acronimo di “Transmission Control Protocol / Internet Protocol”. solitamente possiamo decidere se assegnarne uno di un tipo oppure di un altro perché. troviamo facilmente questa indicazione sulla scheda che abbiamo acquistato (se stiamo realizzando una scheda custom. grazie al quale ci si può connettere direttamente alla Ethernet. usata per la comunicazione http. Come punto di partenza iniziamo ad esaminare il protocollo TCP/IP. la deduciamo dal componente utilizzato). Fig. Dato che l’indirizzo IP può cambiare in modo dinamico. Il componente TCP/IP per Flowcode Nella barra dei componenti nel menu “Periferiche” troviamo il componente TCP/IP che ci permette di gestire i protocolli TCP/ IP. vengono sempre più incapsulati e. 1 Suddivisione in Layer del protocollo TCP/IP. La differenza principale tra i due è il numero di byte utilizzati per codificare in modo univoco gli indirizzi di rete. È ora necessario inserire le informazioni riguardanti la connessione di rete. Per poterlo utilizzare è sufficiente inserirlo nel pannello e successivamente procedere alla configurazione. attualmente esistono due versioni di IP: IPv4 e IPv6. ma ve ne sono altre come la 20. possiamo trovare un ulteriore livello di astrazione: le cosiddette “porte” di comunicazione.it. man mano che risalgono vengono ripuliti dai dati di incapsulamento non più necessari. Quando vogliamo raggiungere un calcolatore collegato a Internet mediante un browser. È suddiviso in strati detti “Layer” (Fig. UDP e MAC. viceversa.21 per l’FTP. il protocollo corrispondente racchiude tutte le specifiche necessarie per comunicare correttamente attraverso la rete Internet. Innanzitutto dobbiamo scegliere quale versione della scheda EB023 abbiamo a disposizione. 2 è mostrata l’unica pagina di configurazione delle proprietà del componente. quella più nota e comunemente utilizzata è la 80. Per questa ragione è utilizzato l’indirizzo MAC: esso è univoco per ogni scheda in grado di collegarsi alla rete ed è perciò fissato in fase di produzione della scheda ed assegnato in modo automatico a fine linea. la 53 per il DNS e molte altre ancora. I componenti in libreria ci permettono di gestire l’integrato W5100. Con queste nozioni basilari possiamo ora accingerci ad esaminare il componente che Flowcode ci mette a disposizione per gestire il protocollo TCP/IP. L’assegnazione di questo indirizzo può essere di tipo dinamico oppure statico. mediante il servizio di DNS. ad esempio www. Questo tipo di architettura permette di poter trasferire in modo “sicuro” i dati tra un calcolatore ed un altro. l’indirizzo effettivo visto dalla rete sarà quello dell’ISP e non quello scelto da noi. - l’indirizzo della porta sorgente suddiviso in src_port_hi e src_port_lo. Questa configurazione varierà in base a come colleghiamo la scheda alla nostra piattaforma oppure su come realizziamo il PCB in caso di progetti Custom. indica che l’operazione di configurazione è andata a buon fine. Set_My_IP Questa macro è utilizzata per modificare. Ulteriore passo è la configurazione delle connessioni. (segue) In base alla tipologia di rete impostiamo l’indirizzo IP. Tx_start Avvia la trasmissione di dati sul canale specificato dai parametri ma. Se il valore restituito è differente da zero vuol dire che la comunicazione è stata stabilita con successo e che possono quindi essere trasmessi dei dati. Per fare delle prove all’interno della rete LAN possiamo impostarlo ad un valore qualsiasi: basta che differisca da quello di tutte le altre schede di rete wireless ed ethernet affacciate su di essa. Create_IP_Socket Crea un socket per la ricetrasmissione di dati mediante il protocollo IP. almeno se vogliamo inviare pacchetti al di fuori della rete LAN. per funzionare correttamente necessita delle macro successive (Tx_sendbyte. Necessita come parametri il valore del canale. La sequenza corretta inizia con un comando di Tx_start. Tx_sendmymac e Tx_end) . per poter funzionare correttamente è necessario impostare i pin sul quale vengono mappati il piedino di interrupt ed il c. UDP e TCP/IP. Richiede come parametri il canale. Tx_sendmymac. Il valore di ritorno. Create_MAC_Socket Chiamando questa macro.s. se diverso da zero. Il settaggio dell’indirizzo MAC (Hardware Address) è la parte più delicata: tale valore dovrebbe essere univoco sull’intera rete Internet. Nella Tabella 1 sono descritte le principali. che deve essere di tipo statico. prosegue con sequenze di Tx_sendbyte. TCP_Listen Imposta il canale scelto (indicato come parametro) in modalità passiva in modo che possa essere pronto a ricevere dei dati. Tx_sendmymac nell’ordine prescelto (può anche solo essere utilizzata una sola macro delle tre) e termina con Tx_end per effettuare l’invio dei dati sul canale di comunicazione. ossia il canale scelto per la comunicazione (da 0 a 3). È necessario indicare il canale scelto (channel) e il protocollo che si intende realizzare mediante il set dei due parametri interni alla macro. TCP_Close Chiude la connessione TCP mediante un’operazione attiva e porta il socket in attesa di terminazione. non è necessaria se si desidera mantenere l’indirizzo IP inserito nella finestra di configurazione del componente. I valori possibili sono diciannove. Tx_sendmymac. Set_Destination É utilizzata con socket di tipo IP e UDP e serve per impostare l’indirizzo IP e la porta verso il quale si vogliono trasmettere i dati. Per utilizzarlo su Internet bisogna essere certi di assegnare un indirizzo che non corrisponda ad alcuna periferica ethernet affacciata al momento su Internet nel mondo. Il valore di ritorno. e la Subnet Mask. - Error mode per ricevere anche i pacchetti che contengono errori. se diverso da zero. Create_TCP_Socket Crea un socket di tipo TCP. GetSocketStatus La macro restituisce lo stato attuale del socket. Per connessioni di tipo IP non è necessario indicare la porta. così si è certi che il relativo IP non sia attivo. ma quelli principali sono i seguenti: - 0 (SOCK_CLOSED) = il socket è chiuso (non sono né trasmessi né ricevuti dati). Il gateway Address deve essere impostato uguale all’indirizzo del “router” o del modem con il quale si accede a Internet. - 6 (SOCK_ESTABLISHED) = il socket è pronto e la comunicazione è attiva in modalità passiva. è possibile utilizzare contemporaneamente canali configurati in modo differente fin ad un massimo di quattro. Il componente TCP/IP è quello che ci permette di gestire i principali protocol- Elettronica In ~ Marzo 2014 131 . non sarebbe possibile comunicare con computer non direttamente collegati a Intranet. l’indirizzo IP e la porta di destinazione. viene creato un socket in grado di ricevere i dati trasmessi sulla rete ethernet. durante l’esecuzione. Il valore di ritorno. Queste macro permettono di gestire in modo molto semplice comunicazioni sulla rete ethernet utilizzando socket a differenti livelli: MAC. 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. se diverso da zero. Passiamo ora ad esaminare le macro che Flowcode ci mette a disposizione per gestire le comunicazioni su rete ethernet. Create_UDP_Socket La macro crea un socket per la ricetrasmissione di dati mediante il protocollo UDP. - 7 (SOCK_CLOSE_WAIT) = il socket è in fase di chiusura. indica che l’operazione di configurazione è andata a buon fine. l’indirizzo IP del dispositivo. - Broadcast mode per leggere anche i pacchetti di tipo Broadcast. - 14 (SOCK_INIT) = il socket è in fase di inizializzazione.Macro utilizzabili con il componente TCP/IP Nome macro Descrizione Initialize Resetta ed inizializza la periferica Ethernet. indica che l’operazione di configurazione è andata a buon fine.corso F L O WCOD E Tabella 1 . Necessita delle stesse configurazioni utilizzate con la macro Create_UDP_Socket. qualora questo indirizzo fosse sbagliato. l’indirizzo IP e la porta di destinazione. É necessario indicare come parametri: - Channel. il modo migliore per fare ciò è prendere l’indirizzo di una scheda di rete attualmente non utilizzata. Impostando ad uno il valore del parametro: - Promiscuous mode per leggere tutto il traffico circolante sulla rete senza tener conto dell’indirizzo MAC. tuttavia per realizzare un Web Server in modo ancora più semplice abbiamo a disposizione un componente specifico. Restituisce un valore differente da zero se i valori coincidono.Finestra delle proprietà del componente TCP/IP. ● Idx 0 . l’indirizzo IP impostato nella finestra di configurazione della scheda. 2 . anche a migliaia di chilometri di distanza. ma su una piattaforma embedded con potenza di calcolo limitata diventa assai più complesso. In pratica azzera l’indice con il quale viene scandito il buffer con la macro Rx_data_size.5: Indirizzo IP sorgente (MSB idx=2). perché necessitano unicamente che entrambi i sistemi siano connessi alla rete Internet. Rx_data_size Macro utilizzata per sapere quanti byte sono disponibili all’interno del buffer di ricezione. Restituisce un valore differente da zero se i valori coincidono.Tabella 1 . è quello di utilizzare semplici pagine web. - MAC mode ● Header size = 3. Per queste ragioni. Rx_readbyte Legge dal buffer di ricezione del canale scelto un byte che viene restituito come valore di ritorno. Questa macro è anche utilizzata per inizializzare il buffer per la ricezione dei dati qualora non lo fosse già. ■ Bit 4 = 1 indica che il pacchetto contiene degli errori. cors o F L O W CO Fig. ● Idx 2 . Rx_data_available Controlla se vi sono dati disponibili nel buffer di ricezione del canale.1: Dimensione del pacchetto (MSB idx=0). 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. tale componente. - IP mode ● Header size = 6. Rx_readheader Macro utilizzata per leggere l’header dei dati ricevuti. Tx_sendmymac Invia nel buffer di trasmissione. ● Idx 0 . Rx_match_mymac Legge 6 byte dal buffer di ricezione e li confronta con l’indirizzo MAC con il quale è stata configurata la scheda. Oltre al canale deve essere indicato il parametro di dato. In base al tipo di comunicazione utilizzata sul canale scelto si possono avere le informazioni seguenti. ● Idx 6 . Realizzare un Web Server su un calcolatore è abbastanza semplice. Tx_end È la macro che permette di inviare fisicamente I dati sulla linea di comunicazione. - UDP mode ● Idx 0 . Rx_match_myip Legge 4 byte dal buffer di ricezione e li confronta con l’indirizzo IP con il quale è stata configurata la scheda. se differente da zero. l’indirizzo MAC attuale della scheda.5: Indirizzo IP sorgente (MSB idx=2). Rx_skipbytes Permette di “saltare” dei dati dal buffer di ricezione. del canale selezionato. Tx_sendmyip Invia nel buffer di trasmissione. li di comunicazione su rete ethernet. Come dato possono anche essere utilizzate stringhe.1: Dimensione del pacchetto (MSB idx=0).7: indirizzo della porta (MSB idx=7). ci permette di realizzare il Web Server in modo ancora più semplice e intuitivo. è così anche in questo caso.Macro utilizzabili con il componente TCP/IP (seguito) Nome macro Descrizione Tx_sendbyte Invia i dati al buffer di trasmissione per il canale specifico. Il valore di ritorno. ● Idx 2: Stato del pacchetto ricevuto: ■ Bit 7 = 1 indica che il MAC di destinazione equivale all’indirizzo della scheda. a patto di sottostare ad alcune limitazioni. del canale selezionato. ● Idx 2 . Flowcode ci viene in soccorso fornendoci un componente specifico che troviamo nella barra dei componenti nel menu “Periferiche” con il nome Webserver. Richiede come parametri di ingresso il canale di comunicazione e l’indice idx del byte che si vuole leggere. Nelle puntate precedenti abbiamo visto come periferiche o sistemi molto complessi possano essere realizzati in modo molto semplice grazie all’utilizzo del programma. Restituisce un valore differente da zero se i valori coincidono. L’intero sistema è veramente economico ed è molto intuitivo da utilizzare. Come DE 132 Marzo 2014 ~ Elettronica In . ■ Bit 5 = 1 indica che l’indirizzo è di tipo broadcast.1: Dimensione del pacchetto (MSB idx=0). Il componente Webserver La maniera più immediata per poter comunicare con sistemi remoti. indica che vi sono dati disponibili. E corso F L O WCOD Tabella 2 - Macro utilizzabili con il componente WebServer Nome macro 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 La macro crea un socket per la ricetrasmissione di dati su Web Server. É necessario indicare come parametri: - Channel il canale scelto per la comunicazione (da 0 a 3); è possibile utilizzare contemporaneamente canali configurati in modo differente fin ad un massimo di quattro; - l’indirizzo della porta dal quale trasmettere e ricevere i dati suddiviso in src_port_hi e src_port_lo. Il valore di ritorno, se diverso da zero, indica che l’operazione di configurazione è andata a buon fine. CheckSocketActivity Richiede in ingresso il canale sul quale si vuole effettuare il controllo di attività. Deve periodicamente essere richiamata in modo da permettere la gestione delle richieste entranti. 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 Fig. 3 - Proprietà del componente Webserver. Fig. 4 - Proprietà del componente Webserver per la descrizione delle pagine HTML. è altro che un gestore preconfigurato di pagine web basato su TCP/IP. Le differenze risiedono nei successivi tab di configurazione, mostrati in Fig. 4. In alto dobbiamo inserire il nome delle pagine, mentre nello spazio centrale è necessario editare il codice che intendiamo visualizzare sulla pagina richiesta da remoto. Il codice deve essere compatibile con lo standard HTML, ma ciò non vieta di inserire comandi JavaScript o altri linguaggi interpretati dal browser remoto. La caratteristica fondamentale del componente Webserver è la possibilità, che offre, di inserire nel codice HTML il valore dinamico di alcune variabili; in questo modo è possibile monitorare da remoto le variabili volute (al massimo quattro). Allo scopo basta fare riferimento, all’interno del codice HTML, al nome della variabile, inserendolo tra %. I nomi delle variabili utilizzabili sono quindi B001, B002, B003 e B004. Vi sono alcune limitazioni sulla tipologia delle variabili scelte perché non possono essere di tipo stringa o virgola mobile. Nell’esempio pratico utilizzeremo questo semplice stratagemma allo scopo di realizzare una centralina per il monitoraggio della temperatura. Progetto Pratico: Centralina per il monitoraggio della temperatura mediante Web Server Il Web Server integrato che realizzeremo ci permetterà di monitorare da remoto, tramite una connessione a Internet, le ultime quattro temperature misurate dal nostro sistema. Per realizzare il progetto abbiamo bisogno dei seguenti componenti: - EB006 “USB PICmicromultiprogrammerboard” (PIC18F4685 e quarzo 19,6608 MHz); - EB023 “Internet board”; - EB016 “Prototype board”; - sensore di temperatura LM35. Colleghiamo le schede come mostrato in Fig. 5 posizionando la scheda EB023 sulla porta C e la scheda di prototipazione EB016 sulle porte A e B. Alimentiamo il sensore, come indicato nella seconda Elettronica In ~ Marzo 2014 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. function funGraph (ctx,axes,func,color,thick) { var xx, yy, dx=1, x0=axes.x0, y0=axes.y0, scale=axes.scale; var iMax = Math.round((ctx.canvas.width-x0)/dx); var iMin = axes.doNegativeX ? Math.round(-x0/dx) : 0; ctx.beginPath(); ctx.lineWidth = thick; ctx.strokeStyle = color; for (var i=iMin;i<=iMax;i++) { xx = dx*i; yy = scale*func(xx/scale); if (i==iMin) ctx.moveTo(x0+xx,y0-yy); else ctx.lineTo(x0+xx,y0-yy); } ctx.stroke(); } // Disegna gli assi function showAxes(ctx,axes) { var x0=axes.x0,w=ctx.canvas.width; scale=axes.scale; var y0=axes.y0, h=ctx.canvas.height; var xmin = axes.doNegativeX ? 0 : x0; var Hline = 0; ctx.beginPath(); ctx.strokeStyle = “rgb(128,128,128)”; ctx.moveTo(xmin,y0); ctx.lineTo(w,y0); ctx.moveTo(x0,0); ctx.lineTo(x0,h); // 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); puntata per la realizzazione del termometro LCD, e colleghiamo l’uscita alla porta A piedino numero 2 in modo da stimolare il canale analogico An2 del microcontrollore. Configuriamo il progetto in modo da ottenere una frequenza di clock del PIC pari a 19.660.800 Hz, impostando i parametri come mostrato in Fig. 6. Ora che l’hardware è pronto possiamo Tabella 3 - Dati di configurazione componente WebServer GatewayAddress 192.168.0.10 SubnetMask 255.255.255.0 IP Address 192.168.0.5 HardwareAddress 0:8:220:0:0:0 Maximum number of WebPages 1 dedicarci alla stesura del diagramma di controllo. Inseriamo quindi dalla barra dei componenti il componente Webserver e il componente ADC configurato in modo che legga l’ingresso An2 collegato al sensore di temperatura LM35. Passiamo ora ad impostare il componente Webserver: indichiamo i seguenti valori all’interno dei parametri (Tabella 3). Il codice html che verrà visualizzato sulla cors o F L O W CO (segue) Fig. 6 - Configurazione del componente. DE 134 Marzo 2014 ~ Elettronica In E 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 l’area 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> pagina deve essere indicato nel tab Web page 1 con il titolo index.htm. Il testo del codice html che ci permette di visualizzare le ultime quattro temperature e plottarne il grafico è contenuto nel Listato 1; per poterlo utilizzare ci basterà inserirlo (mediante copia/incolla) all’interno della finestra di configurazione della pagina. Dato che abbiamo da svolgere due task principali, possiamo dividere il nostro flusso di programma in due macro. La prima, il main in Fig. 8, si occuperà di inizializzare il sistema e controllare le richieste del socket al quale è collegato il webserver, mentre la seconda macro in Fig. 7, chiamata dall’interrupt del timer, si occuperà della lettura periodica del sensore di temperatura e dell’aggiornamento dell’array di temperature da visualizzare in remoto. Le variabili utilizzate sono quelle descritte qui di seguito. - ContatoreTimer di tipo Grande+ inizializzato a -1 in modo da forzare la lettura della temperatura all’accensione del sistema. - ADC_Temp di tipo Virgola mobile per poter leggere la tensione del sensore LM35. - Temperatura_1 / Temperatura_4 di tipo intero per la memorizzazione delle temperature. - B001 / B004 di tipo intero per la visualizzazione sulla pagina HTML dei valori di temperatura. Sono state inoltre utilizzate due costanti globali per la conversione degli impulsi del timer in valori di tempo: - IMPULSI_OGNI_SECONDO vale 75 perché la frequenza di interrupt del timer0 è prefissata a 75 Hz (questo valore è dovuto al fatto che il prescaler del Elettronica In ~ Marzo 2014 135 tuito, con alcune limitazioni, è fornito ad esempio da www.dyndns.it. Basterà quindi configurare il modem in modo da comunicare correttamente con uno di questi server, scegliere l’acronimo con il quale verrà identificato il nostro sistema embedded ed il gioco è fatto: abbiamo reso accessibili, da qualsiasi parte del mondo, i dati forniti dalla nostra scheda embedded. Utilizzare MPLAB per integrare il codice generato da Flowcode Utilizzare Flowcode per realizzare progetti sempre più complessi porta ad un incremento della difficoltà del debug del codice generato soprattutto se vi sono blocchi con all’interno del codice C. Il Debugger classico di Flowcode ci permette di monitorare le variabili e gli stati del sistema ma non è possibile, in alcun modo, Fig. 7 - Macro per la lettura della temperatura ogni quattro ore. timer è fissato a 256 e l’oscillatore è configurato per lavorare a 19.660.800 Hz; - SECONDI_OGNI_ORA vale 3600 ed è la costante che permette di sapere quanti secondi vi sono per ogni ora. Fig. 8 - Flusso principale di programma. cors o F L O W CO Per poter effettuare un semplice test, possiamo collegare il sistema mediante il cavo ethernet al router con il quale ci connettiamo in rete e dal browser del nostro computer e digitare l’indirizzo del Web Server, che in questo caso è 192.168.0.5. La pagina che si aprirà è mostrata in Fig. 9. Permettere l’accesso del web server dall’esterno della nostra rete locale è più complicato, perché implica l’ottenimento di un IP fisso oppure poter avere a disposizione un modem in grado di utilizzare servizi di DNS dinamico. Un servizio gra- DE 136 Marzo 2014 ~ Elettronica In Non può essere considerato un linguaggio di programmazione perché non possono essere definite alcune variabili e cicli di controllo ma unicamente un linguaggio di formattazione testuale. scegliamo il microcontrollore che avevamo scelto in Flowcode (il PIC18F4580). 11 è necessario scegliere la cartella dove è stato installato MPLAB IDE e fare clic sul pulsante “Integrate”. Ad esempio. mentre con la versione PRO. acronimo di HyperText Markup Language. Per queste operazioni. alcune informazioni di servizio ed il corpo del documento nel quale viene formattato l’intero contenuto della pagina. Project->Project Wizard per creare un nuovo progetto. Figura 10 . impostiamo come compilatore il BoostC per i pic della famiglia 18 ed aggiungiamo il file Rs232. se non già presente. È basato sull’utilizzo di Tag che permettono di formattare il testo nel modo desiderato. 10 Pagina inviata dal Web Server.c generato da Flowcode. video o script in altri linguaggio di programmazione come ad esempio il JavaScript. solo in questo modo sarà possibile scegliere dall’IDE il compilatore BoostC. 13. non vi sono limitazioni di alcun tipo. 12 e Fig. Prendiamo come esempio il diagramma che abbiamo realizzato nella puntata 4 per pilotare dei relé tramite RS232. In questo caso. nel caso il browser sia Firefox. Sono entrambi scaricabili da Internet in versione free rispettivamente all’indirizzo www. <b>Testo Formattato</b> La struttura base di un file Html è raffigurata in Figura 10. Partendo dalla testa del file. Elettronica In ~ Marzo 2014 137 . correttamente le informazioni sul compilatore. Per ovviare a questa limitazione è però possibile inserire all’interno della pagina dei contenuti esterni come immagini. MPLAB IDE. Impostare anche gli altri indirizzi per il “BoostC Compiler for PIC18” per poterlo utilizzare anche su microcontrollori della famiglia 18. microchip. seguendo attentamente la procedura.corso F L O WCOD E Il linguaggio HTML Fig. per inserire il testo “Testo formattato” in grassetto dovremo scrivere: Fig. possiamo avvalerci di MPLAB e del compilatore C BoostC.sourceboost. I tag sono racchiusi tra parentesi angolate ed ogni volta che un tag viene aperto deve poi anche essere chiuso inserendo prima del nome la barra.exe.Struttura base di un file HTML Per vedere alcuni esempi di codice HTML basta che apriamo una pagina web e. acquistabile dal produttore. come indicato in Fig. Al passo in cui viene visualizzata l’immagine in Fig.com e www. quindi il compilatore BoostC. si ha una descrizione del documento. è il linguaggio base con le quali vengono realizzate le pagine web. che potrebbero risultare complesse per un principiante.Pagina inviata dal Web Server. Apriamo MPLAB IDE e dal menu scegliamo il Il linguaggio HTML.com. Utilizzando la versione gratuita di BoostC si possono compilare solo progetti che non superino i limiti di memoria RAM e ROM. cliccare con il tasto destro sull’area centrale e scegliere dal menu “Visualizza sorgente pagina”. Al termine dell’installazione è necessario aprire MPLAB IDE e impostare. Per integrare i due sistemi è necessario prestare molta attenzione ai passi con il quale viene istallato il compilatore: per prima cosa occorre installare. 9 . visualizzare direttamente i registri del microcontrollore. bisogna scegliere il boostc_pic18. dal menu Project->Set Language Tool Locations. ma che sono essenziali per un utilizzatore esperto. Fig. . In questo caso sono float.pic18. avviamo la compilazione e se abbiamo svolto tutte le operazioni correttamente l’esito sarà positivo.Fig. apriamo la cartella Lib e scegliamo i file . Marzo 2014 ~ Elettronica In Ora che il codice è compilato non ci resta che scegliere il debugger dal menu “Debugger”. Con la scorciatoia da tastiera CTRL+F10. in modo che.Configurazione eseguibile compilatore BoostC per PIC16. che nel nostro caso è in “C:\Program Files\SourceBoost”. 13 . per la risoluzione dei problemi.lib e libc.Configurazione del progetto di debug. 12 .lib. ma in progetti più complessi potrebbero esserne necessari altri per supportare tutte le funzioni richieste dal codice. cors o F L O W CO Fig. Qualora vengano trovati errori o imperfezioni è consigliabile effettuare le dovute correzioni su Flowcode. uno strumento completo e g dettagliato come MPLAB.Configurazione eseguibile liker BoostC per PIC16. DE 138 Fig. avendo però a disposizione. ad una successiva generazione di codice.pic18. 11 . Per poter completare il progetto dobbiamo ancora aggiungere le librerie che utilizziamo all’interno di Flowcode: allo scopo entriamo nella cartella del compilatore.lib che sono necessari per questo progetto. vengano automaticamente corretti gli errori e non si debba ritoccare a mano il codice. 14 . 14. Questo semplice stratagemma ci permette di utilizzare tutte le potenzialità di Flowcode anche in progetti molto complessi.Indicazione cartella Microchip MPLAB. come indicato in Fig. Con il Drag&Drop portiamoli all’interno di MPLAB nell’albero di progetto. e non direttamente sul codice. programmare il dispositivo ed eseguire i test in MPLAB come se avessimo scritto a mano il codice.