ITIS M. PLANCK ( LANCENIGO DI VILLORBA TV) CORSO SERALE ( Classe 5°/STE ) Area di progetto anno scolastico 2004/2005 Allievi: Silvio Strafella - Luigi Baù Tutor : Prof. Italo Zaniol Termostato automatico con impostazioni/lettura da locale o da remoto via pagina Web 1 Indice Introduzione Schema a blocchi del sistema Descrizione dello Schema a blocchi del sistema Pagina Web memorizzata nel siteplayer Schema elettrico del circuito di controllo Analisi dello schema elettrico e dei principali componenti - modulo siteplayer - Pic16F877 della Microchip - trasduttore di temperatura LM35 e circuito di condizionamento - Display LCD - Interfacciamento con i relè - Elenco componenti - Circuito di alimentazione - Costo dei principali componenti utilizzati Sviluppo del software -Programmazione del modulo siteplayer -Pagina web -File di definizione -Programmazione del PIC 16F877 Collaudo Software utilizzato 2 pag. 3 pag. 3 pag. 4 pag. 5 pag. 6 pag. 7 pag. 8 pag. 10 pag. 11 pag. 13 pag. 14 pag. 14 pag. 15 pag. 15 pag. 16 pag. 18 pag. 19 pag. 31 pag. 33 Introduzione A conclusione del corso di studi presso l’ITIS “M. PLANCK” di Lancenigo (TV), abbiamo pensato di realizzare un progetto che consentisse di unire le conoscenze sui microprocessori con quanto appreso nel corso di telecomunicazioni ed in particolare sulle reti. Utilizzando un modulo siteplayer, prodotto da Netmedia Inc., si è realizzato un Web Server vale a dire un sistema in grado di rispondere a delle chiamate da parte di un client fatte anche attraverso la più grande rete dati cioè Internet. Il modulo dispone di due porte di comunicazione una seriale e una Ethernet 10BaseT. Un circuito programmabile come il PIC 16F877 può comunicare al modulo i dati da visualizzare sulla pagina Web, che, attraverso la porta ethernet, può essere trasferita, su richiesta di un browser, ad un calcolatore. Come esempio applicativo abbiamo realizzato un termostato con la possibilità di impostare i parametri di controllo e la lettura della temperatura dell’ambiente sia localmente, cioè dove è fisicamente installato il dispositivo, sia da remoto mediante la visualizzazione/manipolazione di una pagina Web che può essere letta o modificata mediante un puntatore ottico ( mouse ). Schema a blocchi del sistema 3 Descrizione dello schema a blocchi Dall’analisi dello schema si possono identificare tre parti fondamentali: - il microcontrollore PIC 16F877 opportunamente interfacciato con periferiche di ingresso/uscita - il modulo Siteplayer che memorizza la pagina web - la rete rappresentata simbolicamente con reti locali (LAN), alcuni computer e dei router con il compito di instradare i pacchetti, a cui sono affidate le informazioni, che viaggiano nella rete. Il PIC 16F877 è interfacciato con le seguenti periferiche: - il modulo siteplayer - un sensore di temperatura - un tastierino a 5 pulsanti - un display LCD - due relè - due spie luminose o tramite il sensore il PIC è in grado di conoscere la temperatura dell’ambiente in modo da visualizzarla sul display e comandare opportunamente o il sistema di riscaldamento oppure il sistema di condizionamento o con i 5 pulsanti si impostano i parametri di controllo del sistema. SET+ e SET- consentono di selezionare il valore di temperatura desiderato nell’ambiente ( per default è diciotto gradi centigradi ) SET consente di attivare/disattivare la modalità di controllo del sistema cioè manuale o automatico AUX1 consente di attivare/disattivare il sistema di riscaldamento qualora la modalità di funzionamento dell’impianto sia quella manuale AUX2 consente di attivare/disattivare il sistema di condizionamento estivo qualora la modalità di funzionamento dell’impianto sia quella manuale. o il display LCD, a 2 righe per 16 colonne, visualizza il valore di temperatura dell’ambiente, il valore di temperatura impostato, la modalità di funzionamento dell’impianto ( manuale = OFF, automatica = ON). Qualora da remoto i parametri di controllo dovessero essere modificati, essi vengono aggiornati automaticamente sul display. o I due relè comandano il sistema di riscaldamento o di condizionamento o Le spie luminose a diodi led segnalano lo stato delle uscite a relè o Il modulo siteplayer e’ una interfaccia tra il microcontrollore e la rete. Mediante la porta seriale, il PIC comunica i dati al modulo che li inserirà sulla pagina. Qualora da remoto i parametri di funzionamento venissero modificati, il modulo li comunicherà al PIC. 4 Pagina Web memorizzata nel SitePlayer La pagina Web memorizzata nel siteplayer ha il formato di un pannello virtuale costituito da: - un display, del tipo a 7 segmenti, dove viene riportata la temperatura dell’ambiente ( decine, unità, decimi di grado ) - un display, sempre del tipo a 7 segmenti, dove viene visualizzata la temperatura impostata - una casella di selezione che consente di selezionare il valore di temperatura desiderato nell’ambiente. Cliccando sul pulsante ‘OK’, il valore selezionato sulla casella è inviato al siteplayer attraverso la rete e da questo al PIC tramite la porta seriale. - Un interruttore che consente di porre l’impianto negli stati ON/OFF. Il segnalatore luminoso VERDE/ROSSO sopra l’interruttore, segnala lo stato dell’impianto. - Due segnalatori luminosi indicano se è attivo il riscaldamento o il condizionatore o nessuno dei due. 5 Schema elettrico del circuito di controllo Realizzazione pratica 6 Analisi dello schema elettrico e dei principali componenti Il SitePlayer Interfacciamento tra PIC e modulo siteplayer Connessione alla rete Come accennato, il siteplayer e’ una interfaccia tra una rete di tipo ethernet ed il mondo esterno. L’estratto dallo schema elettrico evidenzia questo ruolo del modulo. Il collegamento alla rete avviene mediante un connettore RJ45 mentre il dialogo col mondo esterno si ha attraverso la porta seriale collegata alla UART del PIC ( pin 25 e 26) a 9600bit/sec. Si può notare che la linea IO1 del modulo ( usata come uscita ) è collegata al pin INT del PIC. Questa è una linea di controllo: quando, mediante un browser, si modifica la pagina memorizzata sul modulo ( e quindi i parametri del sistema ), su questa linea viene generato un impulso di tensione della durata di 5 microsecondi che avverte il PIC di quanto accaduto. Poiché l’impulso è di breve durata, la linea INT dovrà essere necessariamente configurata come sorgente di interrupt. Quindi il PIC, in seguito ad una interruzione su questa linea, andrà ad interrogare il modulo per conoscere i nuovi parametri del sistema modificati da remoto. Infine la linea link del modulo, collegata ad un diodo led, è utilizzata per segnalare il corretto collegamento alla rete ( tutte le schede di rete sono equipaggiate con una segnalazione simile). 7 Il modulo siteplayer sbriga il gravoso compito di gestire tutti i protocolli di rete da quello data link a quello del livello applicazione secondo gli standard ethernet a 10Mbit/sec e TCP/IP. Esso è fisicamente costituito da un microcontrollore , l’ 89C51 della Philips, programmato per gestire i protocolli di rete e da una memoria flash in grado di memorizzare la pagina Web della massima dimensione di 48Kbyte. I due componenti, in tecnologia SMD, insieme ad altri di supporto, sono montati su uno stampato che presenta 18 terminali su due file ai bordi dello stesso. Il connettore RJ45 è dotato al suo interno di opportuni filtri. Il connettore RJ45 Tutte le informazioni tecniche riguardanti il modulo non possono essere riportate in questa relazione; per la completa documentazione si consiglia di visitare il sito Netmedia.com. Pic16F877 della Microchip Nel corso di TDP del quarto e quinto anno abbiamo utilizzato i microcontrollori della Microchip in numerosi progetti per cui riassumeremo solo brevemente quali risorse sono state utilizzate in questo progetto: - linee digitali di I/O per interfacciarsi ai pulsanti, al display, ai relè - un ingresso analogico per convertire in formato numerico il segnale elettrico fornito dal trasduttore di temperatura - la porta seriale - due sorgenti di interrupt: o pin INT/RB0 collegato al siteplayer o contatore TMR0, che genera un interrupt ogni millesimo di secondo, per avere un orologio per la misura del tempo ( RTC ) Meritano un certo approfondimento la porta seriale e la conversione A/D. 8 Porta seriale Il PIC 16F877 dispone di una porta seriale che consente il dialogo tra microcontrollore e altri dispositivi pure dotati di porta seriale ( ad esempio un PC ). I pin sono RC7 che viene utilizzato come ingresso seriale e RC6 come uscita seriale. Il tipo di comunicazione può essere sincrona o asincrona. In questa analisi ci occupiamo della sola modalità asincrona. I registri dedicati ( ad esclusione di quelli di interrupt ), sono: PIR1, RCSTA, TXREG, TXSTA, SPBRG. - SPBRG ( banco1): il valore caricato in questo registro consente di stabilire la velocità di trasmissione. Riferirsi alle tabelle 10.4 e 10.5 ( pag. 108 e 109 del manuale ) per determinare il valore da caricare nel registro in base alla velocità di trasmissione desiderata. Il valore si può anche calcolare con la formula Vt = Fosc/ ( 64 ( X + 1 )) dove X è il valore da caricare in SPBRG e Fosc è la frequenza del clock del processore. Questa formula è valida quando il bit 2 del registro TXSTA è 0 ovvero è selezionato un Baud rate a bassa velocità. Se questo bit è 1, ovvero è selezionato un Baud rate ad alta velocità, la formula da usare è Vt = Fosc/ ( 16 ( X + 1 )). Esempio: sia Fosc = 4 MHz , Vt = 9600 bit/sec, Baud rate a bassa velocità. Dalla formula si ottiene X = Fosc/ (64 * Vt ) –1 = 5.51 Stabilito un valore 6 si ottiene Vt = 10.416.6 con un errore dato da (10417 – 9600)/9600 = 8.5% che è un errore non accettabile (NA) . Utilizzando un Baud rate ad alta velocità si ottiene: X = Fosc/ (16 * Vt ) –1 = 25.04. Stabilito un valore 25 si ottiene Vt = 9615.38 con un errore dato da (9615 – 9600)/9600 = 0.16 % che è un errore accettabile. - TXSTA (banco1): questo registro consente di configurare i parametri della porta di trasmissione e cioè: - comunicazione sincrona/asincrona - abilitare/disabilitare bit di parità - abilitare/disabilitare trasmissione - RCSTA ( banco0 ): questo registro consente di configurare i parametri della porta di ricezione e cioè: - abilitare/disabilitare porta seriale - abilitare/disabilitare ricezione del 9 bit ( bit di parità) - riconoscere errori di framing e di overrun - TXREG (banco 0): in questo registro si carica il valore a 8 bit da inviare - RCREG (banco 0): in questo registro si legge il valore ricevuto a 8 bit - PIR1 (banco 0 ): il bit 5 di questo registro si porta a 1 quando il registro RCREG contiene un dato pronto. CONVERSIONE A/D Il PIC 16F877 dispone di otto ingressi analogici che consentono di campionare e convertire in formato numerico segnali analogici. Il segnale analogico, prima di essere presentato su un ingresso, deve essere opportunamente filtrato per evitare distorsioni di aliasing. All’interno del PIC è previsto un multiplexer analogico, un campionatore, un circuito di memoria e un convertitore analogico digitale ad approssimazioni successive. Lo schema a blocchi è mostrato in figura. 9 - il multiplexer consente, mediante linee di selezione, di poter convertire in formato numerico più segnali analogici applicati ai vari ingressi ANi, disponendo di un unico convertitore A/D. - il circuito S/H ( sample and hold ) campiona il segnale e lo memorizza lasciando così tempo al convertitore di fare la conversione - il convertitore ad approssimazioni successive converte il segnale analogico in un numero a 10 bit. Per tutte le operazioni di conversione il PIC dispone di 4 registri dedicati. Per ben comprendere le modalità di programmazione è indispensabile consultare il manuale d’uso del PIC. Qui si riassumono brevemente le funzioni dei vari registri. - registro ADRESH ( banco 0 ): contiene la parte alta del risultato della conversione - registro ADRESL ( banco 1 ): contiene la parte bassa del risultato della conversione - registro ADCON1 ( banco 1 ). Consente di: o programmare come il risultato della conversione debba trovarsi nei due registri ADRESH e ADRESL. Infatti il risultato può essere giustificato a destra o a sinistra come mostrato in figura. ADRESH x X x x x x ADRESH 0 0 0 0 0 0 Risultato giustificato a sinistra ADRESL x x x x 0 0 0 0 0 0 x x x Risultato giustificato a destra ADRESL x x x x x x x ( x = valore di un bit risultato della conversione ) o selezionare quali ingressi del PIC siano quelli analogici e stabilire i valori di Vref+ e Vref- registro ADCON0 ( banco 0 ). Consente di: o selezionare il clock per l’ADC o indirizzare il multiplexer analogico o abilitare/disabilitare il convertitore o avviare la conversione ( SOC ) o sapere quando la conversione è terminata ( EOC ) Per quanto concerne la giustificazione del risultato, si può dire che, in generale, per semplificare l’elaborazione dello stesso, è conveniente quella a sinistra. Essa consente, trascurando i due bit meno significativi, di avere il risultato a 8 bit tra l’altro direttamente nel banco 0. Il sensore di temperatura LM35 ed il circuito di condizionamento Come sensore di temperatura abbiamo usato un LM35 con f.d.t. 10mV/°C e un errore di 0.5°C. In figura è riportata la piedinatura del componente, una tipica applicazione e alcune caratteristiche e prestazioni. 10 Poiché il trasduttore fornisce 10mV/°C, (250mV a 25°C ), mentre il convertitore del PIC ha un valore di fondo scala di 5V, si rende necessario un circuito di condizionamento che amplifichi il segnale fornito dal convertitore. Allo scopo si è utilizzato un amplificatore operazionale in connessione non invertente con guadagno circa 10. Nella rete di retroazione è presente un trimmer che consente di regolare il guadagno dell’amplificatore, operazione necessaria per la taratura. Si noti anche la presenza di un condensatore che introduce un certo filtraggio del segnale fornito dal trasduttore. Interfacciamento tra PIC e sensore di temperatura mediante circuito di condizionamento Display LCD Il display LCD viene utilizzato per comunicare all’utente la temperatura dell’ambiente, lo stato dell’impianto e inoltre la visualizzazione della temperatura desiderata. I display LCD, per poter essere utilizzati, devono essere opportunamente programmati. Come si può notare dallo schema elettrico, il display dispone di diverse linee, alcune di controllo, altre usate per inviare i dati. Queste ultime sono collegate al porto D mentre le linee di controllo ( E,RS ) sono collegate ai pin RC4 e RC5. Anche la linea RW è di controllo ma viene collegata a massa. Il significato di queste linee è il seguente: • • • R/W: quando il valore di questa linea è basso si possono inviare dati di configurazione o di scrittura, al contrario si possono leggere i dati in esso memorizzati . RS: quando questa linea è alta si possono inviare i codici ASCII per la visualizzazione di un carattere alfanumerico sul display; quando è bassa si possono inviare delle istruzioni. E : abilita l’acquisizione del dato o del comando presentato sul bus, con una transizione LH-L del segnale 11 Interfacciamento tra PIC e display LCD Per quanto concerne la programmazione del dispositivo, bisogna riferirsi alle caratteristiche fornite dal costruttore. In tempi non tanto remoti i vari costruttori utilizzavano modalità di programmazione differenti; ora, fortunatamente, si è ora imposto uno standard che è quello Hitachi leader in questo settore. Riassumiamo in tabella i vari comandi e modi di utilizzo del display. 12 Tabella di programmazione del display Interfacciamento con i relè Le due uscite digitali AUX1 e AUX2 sono a relè. Questi ultimi sono pilotati da due transistor BC337 di tipo NPN. Sul collettore dei due BJT sono collegati anche due led che sono nello stato ON ( accesi ) quando i BJT sono in conduzione e quindi i relè eccitati ed i contatti chiusi. Due diodi raddrizzatori in parallelo alle bobine dei relè, sono a protezione dei collettori dei BJT quando essi passano dallo stato ON ( saturazione ) a quello OFF (interdizione ). Interfacciamento tra PIC e relè 13 Elenco componenti R1 R2 R3 R4,R9,R10 R5,R6 R7 R8 Tutti i resistori sono da 1/4 W tolleranza 5% = 33KΩ = Trimmer 1KΩ = 3,3KΩ = 1KΩ = 3,3Ω = 10KΩ = Trimmer 10KΩ C1,C2,C5,C6,C7,C8 C3,C4 C9 C8 = 22pF = 100nF = 1µF = 470microF IC1 IC2 IC4 = PIC16F877 = TL082 = LM35 Sensore di temperatura T1,T2 Q1 D1,D2 D3 = BC 337 - NPN = quarzo 4 MHz = 1N4004 = 1N4148 N° 6 Pulsanti N° 4 Morsettiere a 2 terminali N° 2 Relè 5V N° 3 Led N° 1 Display LCD data image N° 1 Modulo Site Player N° 1 Connettore RJ45 LF1S Circuito di alimentazione Per alimentare la scheda, abbiamo realizzato un semplice alimentatore duale con uscite ±5V. La tensione duale è necessaria per alimentare l’amplificatore operazionale presente nel circuito di condizionamento. Schema elettrico dell’alimentatore 14 I +5V sono utilizzati per alimentare il PIC, il modulo Siteplayer, i relè ecc. Il trasformatore con presa centrale ha una tensione efficace sul secondario di 12V . Gli stabilizzatori utilizzati sono i classici 7805 e 7905. Costo dei principali componenti utilizzati I componenti utilizzati sono quasi tutti forniti dalla scuola e dopo una ricerca siamo risaliti al loro costo che, è importante sottolineare, è privo di sconti e si riferisce ad un singolo pezzo. Si può quindi pensare che i costi si riferiscano alla realizzazione di un prototipo: se il circuito dovesse essere prodotto in serie e con numero elevato di pezzi, il costo potrebbe essere ridotto di oltre il 50%. Modulo Siteplayer PIC 16F877 Connettore RJ45 Display LCD LM35 Trasformatore Stabilizzatori di tensione 35,00 euro 10,00 “ 7,00 “ 2,00 “ ( acquistato alla fiera dell’elettronica di Pordenone ) 2,50 “ 3,50 “ 2,70 “ Sviluppo del software Programmazione del modulo Siteplayer Per programmare il Siteplayer è necessario: a) costruire la pagina Web da memorizzare nel modulo utilizzando il linguaggio di programmazione HTML b) creare un file di definizione che sarà utilizzato per guidare un programma linker, scaricabile gratuitamente dal sito www.siteplayer.com , il cui compito è di tradurre in codice oggetto gli ordini elencati nel file di definizione e la pagina Web. c) Il file di definizione compilato, potrà essere trasferito sul modulo con l’ausilio del programma linker utilizzando la rete alla quale sarà collegato il modulo. Tendina per configurazione del programma linker E’ importante fornire l’indirizzo IP del modulo e l’eventuale password 15 Tendina per compilare e caricare il file nel modulo Pagina Web Il linguaggio html consente di preparare pagine ipertestuali e multimediali che possono essere: * visualizzate sul proprio computer * insediate su un server che le renderà visibili a tutto il mondo. * la visualizzazione è a carico del client (per mezzo di un browser) I browser attualmente disponibili sono in grado di visualizzare: * files html (.HTM, .html) * immagini (.GIF, .JPG,) * i contributi audio (.WAV, .AU, .AIF, ecc.) * le animazioni (.MPG, mpeg, .MOV, movie, .AVI, ecc.) * i testi formattati (.RTX, .WRI, .DOC, ecc.) Una pagina html è un semplice file di caratteri ASCII contenente: * il testo da visualizzare; * stringhe che cominciano con il carattere & per inserire accenti e caratteri speciali; * marcatori o tag o mark racchiusi tra i caratteri < > che: 1. modificano il formato dei caratteri e dei paragrafi 2. modificano i colori 3. organizzano tabelle 4. inseriscono immagini, suoni e animazioni 5. inseriscono i links (collegamenti) con le altre pagine. Produrre una pagina html consiste quindi in: * scrivere un file ASCII con qualunque editor, contenente particolari tag che svolgono funzioni differenti. Ogni tag è identificato da un nome racchiuso tra <> in modo che il browser possa distinguere tra testo e istruzioni HTML. Ogni segnale e terminato racchiudendo il nome tra </> * assegnare al file un nome con estensione .htm o .html * salvare il file in modalità: documento di testo * visualizzare il file con un browser e correggerlo fino ad ottenere l'effetto desiderato Il tag di seguito riportato definisce la riga di testo ITIS MAX PLANCK opportunamente formattata. <tr> <td colspan="3"><div align="center"><font size="3" face="Arial, Helvetica, sans-serif"> <strong>ITIS MAX PLANCK</strong></font></div></td> </tr> Il marcatore che svolge la funzione di inclusione di una immagine all'interno di un testo ha la seguente sintassi: <img src="file-grafico"> 16 Normalmente, per non complicare le cose, tutti i file che compongono una pagina Web risiedono nella stessa directory del file HTML; in caso contrario bisogna specificare l’indirizzo preciso. Facciamo un esempio pratico per chiarirci le idee. Immaginiamo che il file HTML sul quale stiamo lavorando (prova.htm) si trovi nella directory 'testi' e l'immagine da inserire (pippo.gif) in una directory 'immagini' contenuta all'interno di 'testi'. In una struttura come questa, la sintassi del comando <img> contenuto in prova.htm è: <img src="immagini/pippo.gif"> Il seguente tag visualizza all’interno della pagina il simbolo dell’istituto con opportune dimensioni. <tr> <td colspan="3"><div align="center"><img src="simb_planck.gif" width="37" height="37"></div></td> </tr> Esso è stato creato con un comune programma di grafica ( MGI PhotoSuite SE ). Si riportano altri simboli utilizzati di cui alcuni scaricati dal sito www.siteplayer.com . Display interruttore spie colore sfondo Si riporta di seguito il file completo che costituisce la pagina Web. <html> <head> <title>INDEX</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="refresh" content="10"> </head> <body bgcolor="#FFFFFF" background="sfondo.gif"> <table width="300" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#FFFFFF" bgcolor="#FFFFFF"> <tr> <td colspan="3"><div align="center"><img src="simb_planck.gif" width="37" height="37"></div></td> </tr> <tr> <td colspan="3"><div align="center"><font size="3" face="Arial, Helvetica, sans-serif"> <strong>ITIS MAX PLANCK</strong></font></div></td> </tr> <tr> <td colspan="3"><div align="center"><font color="#999999" size="1" face="Arial, Helvetica, sans-serif">WEB SERVER </font></div></td> </tr> <tr bgcolor="#333333"> <td width="130"><div align="center"><font color="#00FF00" size="2" face="Arial, Helvetica, sans-serif"><strong> Temperature &deg;C </strong></font></div></td> <td width="80"><div align="center"><font color="#00FF00" size="2" face="Arial, Helvetica, sans-serif"></font></div></td> <td width="150"><div align="center"><font color="#00FF00" size="2" face="Arial, Helvetica, sans-serif"><strong> Set Temperature</strong></font></div></td> <td>&nbsp;</td> </tr> <tr bgcolor="#333333"> <td width="129" bgcolor="#333333"> <div align="center"><img src="/^Cifra5:1_BLK.jpg"> <img src="/^Cifra4:1_BLK.jpg"> <img src="DP_BLK.jpg"> <img src="/^Cifra3:1_BLK.jpg"> </div></td> <td width="1" bgcolor="#333333"><div align="center"><font color="#00FF00" face="Arial, Helvetica, sans-serif"></font></div></td> <td width="150" bgcolor="#333333"> <div align="center"><img src="/^Cifra2:1_BLK.jpg"> <img src="/^Cifra1:1_BLK.jpg"> </div></td> <td>&nbsp;</td> </tr> <tr bgcolor="#333333" > <td width="100"bgcolor="#333333""><div align="center"><img src="lamp_^portc'0.gif" width="17" height="17"></font></div></td> <td width="30"><div align="center"><font color="#00FF00" size="2" face="Arial, Helvetica, sans-serif"></font></div></td> <td width="130"><div align="center"><font color="#00FF00" size="2" face="Arial, Helvetica, sans-serif"><form method="get" action="fi.spi" name="forminput"> <p align="center"> <select name="settemp" size="1"> <option value="^tempo">^tempo</option> 17 <option value=14>14</option> <option value=15>15 </option> <option value=16>16 </option> <option value=17>17 </option> <option value=18>18 </option> <option value=19>19 </option> <option value=20>20 </option> <option value=21>21 </option> <option value=22>22 </option> <option value=23>23 </option> <option value=24>24 </option> </select> <br> <br> <br> <input type="submit" name="OK2" value="OK"> </p> </form></font></div> </td> <td>&nbsp;</td> </tr> <tr bgcolor="#333333"> <td width="100"><div align="center"><font color="#00FF00" size="2" face="Arial, Helvetica, sans-serif"> <strong>ON</strong></font></div></td> <td width="20"><div align="center"><font color="#00FF00" size="2" face="Arial, Helvetica, sans-serif"> <strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cold</strong></font></div></td> <td width="150"><div align="center"><font color="#00FF00" size="2" face="Arial, Helvetica, sans-serif"> <strong>warm</strong></font></div></td> <td>&nbsp;</td> </tr> <tr bgcolor="#333333"> <td width="100"><div align="center"><a href="x.spi?portc=^portc~0"><img src="toggle_^portc'0.gif" width=16 height=36 name="OFF" border="0" alt="ON"></a></div></td> <td width="80"bgcolor="#333333""><div align="center"><img src="lamp_^portc'2.gif" width="17" height="17"></font></div></td> <td width="120"bgcolor="#333333""><div align="center"><img src="lamp_^portc'3.gif" width="17" height="17"></font></div></td> <td>&nbsp;</td> </tr> <tr bgcolor="#333333"> <td width="100"><div align="center"><font color="#00FF00" size="2" face="Arial, Helvetica, sans-serif"> <strong>OFF</strong></font></div></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr bgcolor="#333333"> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <tr> <tr bgcolor="#333333"> <td colspan="3"><div align="center"><img src="linea.gif" width="320" height="4"></div></td> </tr> <tr> <tr bgcolor="#333333"> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <tr> <tr bgcolor="#333333"> <td colspan="4"> <div align="center"> <font color="#999999" size="2" face="Arial, Helvetica, sans-serif"> Bau Luigi &nbsp;&nbsp;&nbsp; Strafella Silvio <br> Tutor Prof. Zaniol Italo &nbsp;&nbsp;&nbsp; &copy All rights reserved</font> </div></td> </tr> </table> </body> </html> Il seguente tag impone il rinfresco della pagina ogni 10 secondi. <meta http-equiv="refresh" content="10"> File di definizione Come detto in precedenza, questo file viene utilizzato per guidare il compilatore alla produzione del codice oggetto da caricare nel modulo siteplayer. Il file specifica: - un nome da dare al dispositivo 18 - - un indirizzo statico o dinamico al modulo ( nel nostro caso è stato assegnato un indirizzo statico ) una password per accedere al modulo l’indirizzo statico da memorizzare nel modulo. Nel nostro caso si è assegnato l’indirizzo privato di classe C "192.168.0.250" ampiamente utilizzato nelle reti locali di piccole dimensioni. Questo indirizzo dovrà essere fornito al linker per poter caricare nel modulo il programma. Per default questo è anche l’indirizzo fornito dal costruttore da utilizzare la prima volta che si programma il modulo. se generare un breve impulso di interrupt nel pin 11 collegato al pin RB0 del PIC gli indirizzi dei file che saranno utilizzati/generati dal linker gli indirizzi RAM degli oggetti che saranno utilizzati/modificati dal browser e dal PIC Si riporta di seguito il file completo di definizione. ; Initial receiver DEFINITIONS ; ;$Devicename sets the name or description of the device $Devicename "ITIS PLANCK" ;$DHCP on sets SitePlayer to find its IP address from a DHCP server $DHCP off ;$DownloadPassword sets password for downloading web pages and firmware $DownloadPassword "" ;$SitePassword sets password for browsing web pages $SitePassword "" ;$InitialIP sets SitePlayer’s IP address to use if no DHCP server is available $InitialIP "192.168.0.250" ;$PostIRQ on sets SitePlayer to generate a low level IRQ on pin 11 $PostIRQ on ;$Sitefile sets the binary image filename that will be created $Sitefile "C:\Site_Player\lan1\web_pag\in_out.spb" ;$Sitepath sets the root path of the web pages for this project $Sitepath "C:\Site_Player\lan1\web_pag\in_out\lan2" ; ; Receiver OBJECTS ; tempo Cifra5 Cifra4 Cifra3 Cifra2 Cifra1 portc set org 05h db db db db db db db db 0 0 0 0 0 0 0 0 ;visualizza selezione ;TRE BYTE VALORE TEMP ;DUE BYTE SET POINT ;STATO IMPIANTO ;VALORE SET POINT TRASMESSO DA HOST REMOTO La RAM utilizza 8 locazioni da 8 bit ognuna delle quali memorizza una variabile: il commento a fianco della dichiarazione delle variabili specifica la funzione desiderata. Le variabili sono tutte inizializzate a zero. Programmazione del PIC 16F877 Nonostante le apparenze la programmazione del processore è risulta abbastanza semplice in quanto sono state utilizzate le tecniche della programmazione TOP DOWN e sono state sfruttate le conoscenze acquisite in precedenti progetti. Analizzando il programma principale si nota infatti l’ampio uso di sottoprogrammi ( anche nidificati ): questo significa che il problema è stato suddiviso in tanti sottoproblemi ognuno risolto da un sottoprogramma. 19 Il compito del programma principale è quello di articolare secondo una opportuna sequenza tutte le routine progettate. È da dire che molte routine utilizzate sono state fornite dall’insegnante, in quanto di utilità generale, oppure sono state da noi studiate e messe a punto in precedenti progetti; il nostro compito è stato quello di adattarle al caso in oggetto senza dover riprogettare ogni singola routine e riscrivere tutto il software. Per la progettazione del programma ci siamo aiutati con diagrammi di flusso, non riportati nella relazione in quanto solo sottoforma di bozza, che sicuramente semplificano la ricerca degli algoritmi più opportuni alla soluzione di un problema specifico. Di seguito saranno analizzate alcune routine e, in parte, il programma principale; si demanda ai commenti una più completa analisi del software ( purtroppo per limiti di tempo i commenti non sempre risultano adeguati ). PROGRAMMA PRINCIPALE La prima parte del MAIN, che costituisce la maggior parte delle istruzioni, serve a configurare il PIC. Il programma di controllo vero e proprio inizia dalla etichetta LOOP1 ed è composto da sole undici istruzioni di cui sette sono chiamate a sottoprogrammi. La locazione di memoria denominata FLAG_SYTE è stata utilizzata come flag. Inizialmente posta a zero, essa viene portata a uno dalla routine di risposta all’interrupt “SYTE_PLAYER” da parte del siteplayer. Se il programma principale trova questo flag a 1, chiamerà in esecuzione la routine di risposta RISPONDI_SYTE che riporterà il flag a zero e procederà ad interrogare il modulo aggiornando i parametri di configurazione del sistema. Il loop, eseguito due volte al secondo, svolge i seguenti compiti affidati ai vari sottoprogrammi: - misura la temperatura ambiente - visualizza la temperatura sul display - analizza lo stato del sistema e controlla le uscite ( è stata stabilita una isteresi di un grado centigrado sull’impostazione desiderata della temperatura ). Se mediante i pulsanti viene modificato lo stato del sistema, i nuovi valori vengono visualizzati sul display. - Aggiorna il siteplayer - Controlla se il modulo ha generato un interrupt ROUTINE DISPLAY Questa è una tra le tante routine utilizzate per gestire il display LCD. Tutte queste routine sono state utilizzate in precedenti progetti e quindi ampiamente testate. La routine trasferisce il contenuto dell’accumulatore sul bus del display, porta l’impulso di abilitazione ( E ) a 1 per un microsecondo e poi di nuovo a 0, infine introduce un ritardo di almeno un millesimo di secondo come specificato dal costruttore ( il tempo minimo è di 43 microsecondi ). DISPLAY MOVWF BSF NOP BCF CALL RETURN PORTD PORTC,4 ;invia dato ;impulso di abilitazione a 1 PORTC,4 MS1 ;impulso di abilitazione a 0 ;ritardo 1ms ;ritorna al programma chiamante ROUTINE TEMPERATURA Questa routine si fa carico di acquisire il campione analogico di temperatura e di fornirlo in un formato adatto per essere convertito in codice BCD per essere visualizzato sul display e trasferito al modulo siteplayer. Ci occuperemo in particolare della elaborazione del dato acquisito dal convertitore. Tarato il circuito di condizionamento in modo che a 48 gradi centigradi corrisponda la tensione di fondo scala del convertitore, cioè 5V, si ha la seguente proporzione tra valore di temperatura e valore numerico a 8 bit fornito dal convertitore: 255 : 48 = N : T 20 dove N è il valore numerico fornito dal convertitore e T la temperatura. Elaborando la proporzione si ha T = N * 0.188 Da quanto appreso dal calcolo numerico si ha, con buona approssimazione, T = N/8 + N/16. Dunque, una volta acquisito il valore N, il programma dovrà calcolare T secondo l’espressione trovata. Il valore di T sarà poi utilizzato per il confronto con il set point cioè il valore di temperatura stabilito dall’utente. Per la visualizzazione della temperatura a tre cifre sul display ( in decimi ), la proporzione diventa: 255 : 480 = N : T Cioè T = N * 1.88 e T = N + N/8 + N/16. Allo scopo, siccome una locazione ad 8 bit contiene al massimo il valore 255, si dovrà utilizzare per l’elaborazione un formato a 16 bit sufficiente a contenere il valore 480. Le locazioni DATOH e DATOL sono usate per contenere il valore di temperatura in decimi che sarà poi convertito in codice BCD dalla routine BCD. Si ricorda che per dividere un numero per 2N, sono sufficienti N scorrimenti a destra del dato. Questo tipo di elaborazione è molto più semplice rispetto a complesse routine che eseguono la divisione. ROUTINE AGGIORNA_SYTE Per inviare dati al siteplayer è necessario utilizzare un protocollo di comunicazione specificato dal costruttore ( si demanda ai data sheet per una completa trattazione ). Qui riassumiamo brevemente come si deve procedere per inviare dati al modulo attraverso la porta seriale: - si invia un comando di scrittura costituito da un numero che si ricava secondo questa relazione: 128 + numero di byte da inviare – 1. Nel nostro caso si inviano sei byte cioè tre byte valore temperatura, due byte set point, un byte stato sistema e quindi il valore del numero vale 133. - Si invia l’indirizzo della RAM dove iniziare a scrivere i dati. Analizzando il file di definizione si deduce facilmente che l’indirizzo vale 6. - Si inviano i sei dati desiderati che andranno ad aggiornare la pagina web. - Nella trasmissione dei dati è necessario ogni volta introdurre un ritardo di almeno 5 microsecondi. ROUTINE RISPONDI_SYTE Anche per leggere i dati contenuti nel modulo bisogna rispettare un protocollo di comunicazione che consiste in: - inviare un commando di lettura corrispondente al codice 192 - inviare l’indirizzo della locazione di memoria. Nel nostro caso è la 12 che contiene il set point. - Attendere che il siteplayer invii il dato testando il bit 5 del registro PIR1 che si porta a 1 quando il buffer della seriale viene caricato con un dato. Una volta ricevuto il dato, il PIC controlla se esso è stato modificato. Se ciò è avvenuto esso provvederà a modificare il proprio set point e aggiornerà la pagina web alla locazione 5 che contiene il valore di selezione. Qualora il set point non sia stato modificato verrà letto alla locazione 11 il nuovo stato del sistema ( ON/OFF). ARRAY TABELLA A partire dalla locazione 5 della memoria programma del PIC, viene dichiarata una tabella di dati che contiene i codici ASCII dei 10 simboli del sistema di numerazione decimale. Questi simboli sono utilizzati per inviare al display LCD i codici che consentono di visualizzare il valore di temperatura ed il set point. Il puntatore viene passato alla tabella mediante l’accumulatore. Con l’istruzione ADDWF PCL viene sommato al contatore di programma l’offset fornito dall’accumulatore. Dopo la somma il contatore si porterà in una delle locazioni che contiene l’istruzione RETLW che caricherà in accumulatore il dato contenuto nella riga puntata e ritornerà al programma chiamante che recupererà dall’accumulatore il codice da inviare al display. 21 Di seguito viene riportato il codice sorgente completo. Codice sorgente ;**************************************************************************** ;*** SITE PLAYER *** ;**************************************************************************** #include <p16f877.inc> ;DIRETTIVA DI ASSEMBLAGGIO ;********************************DICHIARA LE LOCAZIONI RAM UTILIZZATE SAVE_W SAVE_S MS SEC DS DATO CONTA CONTA9 CONTA20 DATOL DATOH CENTINAIA DECINE UNITA SAVE FLAG FLAG1 MST SEC_U SEC_D UNITAAA DECINEAA CENTINAIAAA BINARIOAA BINARIO8 BINARIO32 TEMPCON AA SETFLAG SAVE1 BINARIOX2 BINARIOX4 BINARIOX8 BINARIOX10 FLAG_SYTE CONTAS TX MEM1 MEM_OUT MIGLIAIA DATOLL BINARIO MPORTC EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU ;************************************************* VETTORI ORG GOTO ORG GOTO 0 MAIN 4 INTERRUPT ;*************************************************TABELLA DATI TABELLA ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW 0X25 0X26 0X27 0X28 0X29 0X2A 0X2B 0X2C 0X2D 0X2E 0X4C 0X2F 0X30 0X31 0X32 0X33 0X34 0X35 0X36 0X37 0X38 0X39 0X3D 0X3A 0X3B 0X3C 0X3F 0X40 0X41 0X42 0X43 0X44 0X45 0X46 0X47 0X48 0X49 0X4A 0X4B 0X4D 0X4E 0X4F 0X50 ;VETTORE DI RESET ;VETTORE DI INTERRUPT PCL '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' ;*************************************************PROGRAMMA PRINCIPALE MAIN BSF STATUS,5 ;SELEZIONA BANCO1 PER CONFIGURARE PIC MOVLW B'00001110' ;RA0 E RA1 COME INGRESSI ANALOGICI 22 MOVWF MOVLW MOVWF LOOP1 CLRF BCF BCF BCF BCF MOVLW MOVWF MOVLW MOVWF BCF BCF BCF CLRF MOVLW MOVWF MOVLW MOVWF CALL CALL MOVLW MOVWF CALL CALL CALL CLRF CALL BSF CALL CALL CALL CALL CALL CALL MOVF BTFSS CALL GOTO ADCON1 B'00000001' OPTION_REG ;ABILITA PULL UP PORTB - SELEZIONA CLOCK PER TMR0 ;ASSEGNA PRESCALE A TMR0 - CONFIGURA ;PRESCALER PER 4MHz -INTERRUPT SU FRONTE DI DISCESA ;CONFIGURA PORTOD COME USCITA ;CONFIGURA LE USCITE DEL PORTOC TRISD TRISC,2 TRISC,3 TRISC,4 TRISC,5 D'25' ;BAUD RATE 9600 BIT/SEC CONFIGURA PORTA SERIALE SPBRG B'00100100' ;CONFIGURA TXSTA TXSTA STATUS,5 ;BANCO0 PORTC,2 ;USCITE OFF PORTC,3 FLAG_SYTE ;DISABILITA CHIAMATE DA SYTE PLAYER B'10010000' ;CONFIGURA RCSTA RCSTA B'10100000' ;ABILITA INTERRUZIONI INTCON SEC_1 ;ATTESA 1 SECONDO PER ASSESTAMENTO TENSIONE SU LCD CONFIGURA_LCD D'18' ;INIZIALIZZA SET POINT AA AN ;VISUALIZZA MESSAGGI PRIMA RIGA ANOFF SET_DISP ;VISUALIZZA SET POINT SETFLAG ;DISABILITA MODIFICA STATO SISTEMA INIT_SYTE ;INIZIALIZZA COLLEGAMENTO CON SYTE PLAYER INTCON,4 ;ABILITA INTERRUPT DA SYTE PLAYER TEMPERATURA ;ACQUISISCI TEMPERATURA VIS_TEMP ;VISUALIZZA TEMPERATURA CONTROLOFF ;VERIFICA SISTEMA ON/OFF E CONFRONTA LE TEMP. SETTEMP ;DI SET E DEL SENSORE SETT AGGIORNA_SYTE FLAG_SYTE ;CONTROLLA CHIAMATE WEB STATUS,2 RISPONDI_SYTE LOOP1 ;ROUTINE CHE VISUALIZZA TEMPERATURA******************************************** VIS_TEMP BCF PORTC,5 ;PREDISPONI PER INVIO ISTRUZIONE CALL MS1 MOVLW 0X8C ;CURSORE SULLA COLONNA 13 CALL DISPLAY BSF PORTC,5 ;PREDISPONI PER INVIO DATI MOVF CENTINAIA,0 CALL TABELLA CALL DISPLAY MOVF DECINE,0 CALL TABELLA CALL DISPLAY MOVLW '.' CALL DISPLAY MOVF UNITA,0 CALL TABELLA CALL DISPLAY RETURN ;*********************** ROUTINE CHE VISUALIZZANO SET POINT ********************** SET_DISP MOVF AA,0 MOVWF BINARIOAA CALL BCDAA CALL DISP_SET RETURN DISP_SET BCF CALL MOVLW CALL BSF MOVF CALL CALL MOVF CALL CALL RETURN PORTC,5 MS1 0xCE DISPLAY PORTC,5 DECINEAA,0 TABELLA DISPLAY UNITAAA,0 TABELLA DISPLAY ;DISPLAY SU SECONDA RIGA 23 ;**************************ROUTINE SET ON/ OFF******************************* SETT BTFSC PORTB,1 GOTO EXIT2 BCF PORTC,2 BCF PORTC,3 MOVF SETFLAG BTFSC STATUS,2 GOTO SETON GOTO SETOFF SETON CALL ANON MOVLW 1 MOVWF SETFLAG RETURN SETOFF CALL ANOFF MOVLW 0 MOVWF SETFLAG GOTO EXIT2 EXIT2 CALL RITARDO RETURN ;**************************SET TEMPERATURA******************************* SETTEMP MOVF SETFLAG BTFSC STATUS,2 GOTO SALTA LOOPPIU BTFSC PORTB,2 GOTO MENO GOTO PIU PIU INCF AA CALL SET_DISP CALL RITARDO GOTO LOOPPIU ;ATTENDI 0.5 SECONDI MENO BTFSC PORTB,3 GOTO SALTA DECF AA CALL SET_DISP CALL RITARDO ;ATTENDI 0.5 SECONDI GOTO MENO SALTA RETURN ;**********************ROUTINE CONTROLLO SISTEMA********************* CONTROLOFF MOVF SETFLAG BTFSS STATUS,2 GOTO CONTROLON BTFSC PORTB,4 GOTO AUX2 BSF PORTC,3 ; CALORE ON BCF PORTC,2 ; FREDDO OFF AUX2 EXIT1 CONTROLON FREDDO VERIFICA CALDO NORMALE BTFSC GOTO BCF BSF RETURN MOVF MOVWF MOVF SUBWF BTFSC GOTO BSF BCF CALL RETURN BTFSS GOTO GOTO BCF BSF CALL RETURN BCF BCF CALL RETURN PORTB,5 EXIT1 PORTC,3 ; CALORE OFF PORTC,2 ; FREDDO ON BINARIO,0 SAVE1 AA,0 SAVE1 STATUS,0 VERIFICA PORTC,3 PORTC,2 RITARDO STATUS,2 CALDO NORMALE PORTC,3 PORTC,2 RITARDO PORTC,3 PORTC,2 RITARDO ;**************** ROUTINE LEGGI TEMPERATURA TEMPERATURA MOVLW B'01000001' MOVWF ADCON0 CALL DELAY CALL CONVERSION ;clock AD: f=fosc/8 (bit7 e bit6), seleziona AN1 ;ADC OPERATIVO ;START CONV E ATTESA FINE CONVERSIONE 24 CLRF MOVF MOVWF MOVWF BCF RRF BCF RRF BCF RRF MOVF MOVWF BCF RRF BCF RRF MOVF ADDWF DATOH ADRESH,0 DATOL BINARIO STATUS,0 BINARIO STATUS,0 BINARIO STATUS,0 BINARIO BINARIO,0 BINARIO8 STATUS,0 BINARIO STATUS,0 BINARIO BINARIO8,0 BINARIO BCF RRF MOVF MOVWF BCF RRF BCF RRF BCF RRF MOVF ADDWF MOVF ADDWF BTFSC INCF CALL RETURN STATUS,0 DATOL DATOL,0 DATOLL STATUS,0 DATOL STATUS,0 DATOL STATUS,0 DATOL DATOLL,0 DATOL ADRESH,0 DATOL STATUS,0 DATOH BCD ;PREDISPONI PER ADATTAMENTO ;LEGGI CONVERSIONE ;SALVA DATO ACQUISITO ;CALCOLA TEMPERATURA A DUE CIFRE PER CONFRONTO ;DIVIDI PER 2 ;DIVIDI PER 4 ;DIVIDI PER 8 ;DIVIDI PER 16 ;DIVIDI PER 32 ;CALCOLA TEMPERATURA A TRE CIFRE PER VISUALIZZARE ;DIVIDI PER 2 ;SALVA N/2 ;DIVIDI PER 4 ;DIVIDI PER 8 ;DIVIDI PER 16 ;SOMMA N + N/2 + N/16 ;CONVERTI IN BCD ;**************************ROUTINE RITARDO CIRCA 17 MICROSECONDI PER STABILIZZARE TENSIONE SU HOLD DELAY NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP RETURN ;**********************ROUTINE START CONVERSIONE E FINE CONVERSIONE CONVERSION BSF ADCON0,2 EOC BTFSC ADCON0,2 ;FINITA CONVERSIONE? GOTO EOC RETURN ; ******************************** ROUTINE CONVERSIONE BINARIO - BCD ******************** BCD CLRF CENTINAIA ;INIZIALIZIA LOCAZIONE DI MEMORIA CLRF MIGLIAIA CLRF DECINE MOVF DATOL,0 MOVWF SAVE M0 MOVLW 4 ;CONTROLLA SE DATO DA CONVERTIRE >=1000 SUBWF DATOH,0 BTFSS STATUS,0 GOTO M1 INCF MIGLIAIA ;SE SI INCREMENTA MIGLIAIA E SOTTRAI 1000 25 M1 M2 LP_BCD1 LP_BCD2 LP_BCD3 MOVLW SUBWF BTFSS DECF MOVLW SUBWF GOTO MOVLW SUBWF BTFSS GOTO MOVLW SUBWF BTFSS GOTO INCF MOVLW SUBWF MOVLW SUBWF GOTO MOVF BTFSC GOTO MOVLW SUBWF BTFSS DECF INCF GOTO MOVF MOVWF MOVLW SUBWF BTFSS GOTO INCF SUBWF GOTO MOVF MOVWF MOVLW SUBWF BTFSS GOTO INCF SUBWF GOTO MOVF MOVWF RETURN 0XE8 DATOL STATUS,0 DATOH 3 DATOH M0 3 DATOH,0 STATUS,2 M2 0XE8 DATOL,0 STATUS,0 M2 MIGLIAIA 0XE8 DATOL 3 DATOH M2 DATOH STATUS,2 LP_BCD1 D'100' DATOL STATUS,0 DATOH CENTINAIA M2 DATOL,0 SAVE D'100' SAVE STATUS,0 LP_BCD2 CENTINAIA DATOL LP_BCD1 DATOL,0 SAVE D'10' SAVE STATUS,0 LP_BCD3 DECINE DATOL LP_BCD2 DATOL,0 UNITA ;CONTROLLA SE DATO DA CONVERTIRE >=1000 ;SE SI INCREMENTA MIGLIAIA E SOTTRAI 1000 ;CONTROLLA SE DATO PARZIALE >255 ;CALCOLA CENTINAIA ;CALCOLA CENTINAIA ;CALCOLA DECINE ;SALVA UNITA’ ; ******************************** ROUTINE CONVERSIONE BINARIO - BCD ******************** BCDAA CLRF CENTINAIAAA ;INIZIALIZZA ALCUNE VARIABILI CLRF DECINEAA CLRF UNITAAA MOVF BINARIOAA,0 MOVWF SAVE LPCAA MOVLW D'100' ;CALCOLA CENTINAIA SUBWF SAVE BTFSS STATUS,0 GOTO LPDAA INCF CENTINAIAAA SUBWF BINARIOAA GOTO LPCAA LPDAA MOVF BINARIOAA,0 ;CALCOLA DECINE MOVWF SAVE MOVLW D'10' SUBWF SAVE BTFSS STATUS,0 GOTO LPUAA INCF DECINEAA SUBWF BINARIOAA GOTO LPDAA LPUAA MOVF BINARIOAA,0 ;SALVA UNITA' MOVWF UNITAAA RETURN ;**********sottoprogramma configurazione LCD CONFIGURA_LCD BCF CALL MOVLW PORTC,5 MS1 0x38 ;RS=0 ;dati a 8 bits - 4 righe 26 CALL MOVLW CALL movlw CALL movlw CALL CALL movlw CALL CALL movlw CALL MOVLW CALL RETURN DISPLAY 0x0C DISPLAY 6 DISPLAY 1 DISPLAY MS1 2 DISPLAY MS1 0x40 DISPLAY 0X80 DISPLAY ;display on - cursore off - blinking off ;avanzamento cursore ;pulisci display ;cursore home ;indirizza cgram ;**********SOTTOPROGRAMMA INVIO DATI AL DISPLAY DISPLAY MOVWF PORTD BSF PORTC,4 NOP BCF PORTC,4 CALL MS1 RETURN ;invia dato ;impulso di abilitazione ;ritardo 1ms ;**********SOTTOPROGRAMMA CURSORE INIZIO RIGA 2 HOME2 BCF CALL MOVLW CALL RETURN PORTC,5 MS1 0xC0 DISPLAY ;********** SOTTOPROGRAMMA CURSORE INIZIO RIGA 1 HOME1 BCF CALL MOVLW CALL RETURN PORTC,5 MS1 0x80 DISPLAY ;**********RITARDI DI 1 MS MS1 LP_MS ;********ROUTINE RITARDO 0.5 SEC RITARDO LLL CLRF MOVLW SUBWF BTFSS GOTO RETURN MST 2 MST,0 STATUS,2 LP_MS CLRF CLRF MOVLW SUBWF BTFSS GOTO RETURN MS DS 5 DS,0 STATUS,2 LLL ;**********VISUALIZZAZIONE RIGA 1*************************** AN CALL HOME1 BSF PORTC,5 movlw 'T' CALL DISPLAY movlw 'E' CALL DISPLAY movlw 'M' CALL DISPLAY movlw 'P' CALL DISPLAY movlw 'E' CALL DISPLAY movlw 'R' CALL DISPLAY movlw 'A' CALL DISPLAY movlw 'T' CALL DISPLAY movlw 'U' CALL DISPLAY movlw 'R' CALL DISPLAY movlw 'E' CALL DISPLAY 27 ;display inizio seconda riga ;display inizio prima riga movlw ' ' CALL DISPLAY movlw ' ' CALL DISPLAY movlw ' ' CALL DISPLAY movlw ' ' CALL DISPLAY movlw ' ' CALL DISPLAY RETURN ;**********VISUALIZZAZIONE RIGA 2***************************** ANOFF CALL HOME2 BSF PORTC,5 movlw 'S' CALL DISPLAY movlw 'E' CALL DISPLAY movlw 'T' CALL DISPLAY movlw '.' CALL DISPLAY movlw 'T' CALL DISPLAY movlw 'E' CALL DISPLAY movlw 'M' CALL DISPLAY movlw 'P' CALL DISPLAY movlw '.' CALL DISPLAY movlw ' ' CALL DISPLAY movlw 'O' CALL DISPLAY movlw 'F' CALL DISPLAY movlw 'F' CALL DISPLAY movlw ' ' CALL DISPLAY RETURN ;***************************************ROUTINE CHE VISUALIZZA ON SULLA SECONDA RIGA ************* ANON CALL HOME2 BSF PORTC,5 movlw 'S' CALL DISPLAY movlw 'E' CALL DISPLAY movlw 'T' CALL DISPLAY movlw '.' CALL DISPLAY movlw 'T' CALL DISPLAY movlw 'E' CALL DISPLAY movlw 'M' CALL DISPLAY movlw 'P' CALL DISPLAY movlw '.' CALL DISPLAY movlw ' ' CALL DISPLAY movlw 'O' CALL DISPLAY movlw 'N' CALL DISPLAY movlw ' ' CALL DISPLAY movlw '' CALL DISPLAY CALL SET_DISP RETURN ;****************** ROUTINE RITARDO 52MICRO SEC ****************** RIT1 MOVLW D'16' MOVWF CONTA RIT11 DECFSZ CONTA 28 GOTO RIT11 RETURN ;****************** ROUTINE RITARDO 104 MICRO SEC ****************** RIT MOVLW D'33' MOVWF CONTA RIT_1 DECFSZ CONTA GOTO RIT_1 RETURN ;****************** ROUTINE RITARDO 50MS ****************** MS50 CLRF MS TSTTY MOVLW SUBWF BTFSS GOTO RETURN D'51' MS,0 STATUS,2 TSTTY ;****************** ROUTINE RITARDO 10MS ****************** MS_10 CLRF MS TSTP MOVLW D'11' SUBWF MS,0 BTFSS STATUS,2 GOTO TSTP RETURN ;****************** ROUTINE RITARDO 5MS ****************** MS5 CLRF MS TSTT MOVLW D'6' SUBWF MS,0 BTFSS STATUS,2 GOTO TSTT RETURN ;*****ROUTIN RITARDO 2 SECONDI********************************** SEC2 LP_SEC2 CLRF MS CLRF DS CLRF SEC_U MOVLW D'2' SUBWF SEC_U,0 BTFSS STATUS,2 GOTO LP_SEC2 RETURN ;AZZERA OROLOGIO ;CONTROLLA SE TRASCORSI 2 SEC ;****************** ROUTINE RITARDO 99MS ****************** MS_100 CLRF MS TSTC MOVLW D'99' SUBWF MS,0 BTFSS STATUS,2 GOTO TSTC RETURN ;****************** ROUTINE RITARDO 20MS ****************** MS20 CLRF MS TSTR MOVLW D'20' SUBWF MS,0 BTFSS STATUS,2 GOTO TSTR RETURN ;****************** ROUTINE RITARDO 1SECONDO ****************** SEC_1 CLRF MS CLRF DS CLRF SEC_U LP MOVF SEC_U BTFSC STATUS,2 GOTO LP RETURN ;********************* INIZIALIZZA COLLEGAMENTO CON SYTE PLAYER INIT_SYTE MOVLW D'20' MOVWF CONTAS LOOP CLRF TX MOVF TX,0 MOVWF TXREG CALL MS5 DECFSZ CONTAS GOTO LOOP CALL MS_100 CALL MS_100 29 ;AZZERA OROLOGIO ;TRASCORSO 1 SECONDO ? RETURN ;***********************ROUTINE RISPOSTA SYTE PLAYER RISPONDI_SYTE BCF INTCON,4 CLRF FLAG_SYTE MOVLW D'192' TEST_RX USCITE T_RX3 ONNN MOVWF CALL MOVLW MOVWF CALL BTFSS GOTO MOVF MOVWF SUBWF BTFSC GOTO MOVLW TXREG MS5 D'12' TXREG MS5 PIR1,5 TEST_RX RCREG,0 MEM1 AA,0 STATUS,2 USCITE D'128' MOVWF CALL MOVLW MOVWF CALL MOVF MOVWF CALL MOVF MOVWF CALL BSF RETURN MOVLW MOVWF CALL MOVLW MOVWF CALL BTFSS GOTO MOVF MOVWF MOVF BTFSC GOTO CLRF BCF BCF BSF CALL BSF RETURN MOVLW MOVWF CALL BSF RETURN TXREG MS5 5 TXREG MS5 MEM1,0 TXREG MS5 MEM1,0 AA SET_DISP INTCON,4 ;DISABILITA INTERRUPT SYTE ;DISABILITA CHIAMATE DA SYTE PLAYER ;RICHIEDI LETTURA DATO INDIRIZZO 12 PER SAPERE SE ;IMPOSTARE NUOVO SET POINT ;RICEVUTO DATO ? ;LEGGI DATO ;SALVALO ;E' DIVERSO DA QUELLO IMPOSTATO ;AGGIORNARE SET POINT ? ;NO ;RICHIEDI SCRITTURA DATO INDIRIZZO 5 PER ; ;AGGIORNARE SELEZ. ;INVIA ;AGGIORNA SET TEMP ;ABILITA INTERRUPT SYTE D'192' TXREG MS5 0X0B TXREG MS5 PIR1,5 T_RX3 RCREG,0 MEM_OUT SETFLAG STATUS,2 ONNN SETFLAG PORTC,2 PORTC,3 MPORTC,0 ANOFF INTCON,4 ;RICHIEDI LETTURA DATO AGGIORNAMENTO USCITE ;RICHIESTA LETTURA DATO INDIRIZZO 11 ;RICEVUTO STATO PERIFERICHE ? ;LEGGI DATO ;MODALITA’ ON/OFF ;ABILITA INTERRUPT SYTE 1 SETFLAG ANON INTCON,4 ;ATTIVA ON ;ABILITA INTERRUPT SYTE ;************ ROUTINE CHE AGGIORNA PAGINA WEB AGGIORNA_SYTE MOVLW D'133' MOVWF TXREG CALL MS5 MOVLW 6 MOVWF TXREG CALL MS5 MOVF CENTINAIA,0 MOVWF TXREG CALL MS5 MOVF DECINE,0 MOVWF TXREG CALL MS5 MOVF UNITA,0 MOVWF TXREG CALL MS5 MOVF DECINEAA,0 MOVWF TXREG CALL MS5 MOVF UNITAAA,0 ;RICHIEDI SCRITTURA DATO DA INDIRIZZO 6 IN 6 ;LOCAZIONI ;INVIA TEMPERATURA ( INDIRIZZI 6,7,8) ;INVIA SET_POINT ( INDIRIZZI 9,10 ) 30 MOVWF CALL MOVF MOVWF BTFSC BSF BTFSS BCF MOVLW XORWF MOVF MOVWF RETURN TXREG MS5 PORTC,0 MPORTC SETFLAG,0 MPORTC,0 SETFLAG,0 MPORTC,0 B'00001101' MPORTC MPORTC,0 TXREG ;SALVA IMMAGINE PORTC ;CONTROLLA STATO IMPIANTO ;NEGA 3 BIT STATO PERIFERICHE ;INVIA STATO PERIFERICHE ( INDIRIZZO 11) ;*********************************************************************** INTERRUPT MOVWF SAVE_W ;salva contesto ( accumulatore e registro di stato ) SWAPF STATUS,0 MOVWF SAVE_S BTFSS INTCON,2 ;INTERRUPT DA TIMER? GOTO SYTE_PLAYER MOVLW 9 ;REINDIRIZZA TRM0 MOVWF TMR0 INCF MS ;AGGIORNA MILLISECONDI INCF MST MOVLW D'100' SUBWF MS,0 BTFSS STATUS,2 GOTO EXIT INCF DS CLRF MS MOVLW D'10' SUBWF DS,0 BTFSS STATUS,2 GOTO EXIT INCF SEC_U EXIT BCF INTCON,2 ;AZZERA FLAG INTERUPT SWAPF SAVE_S,0 ;RIPRISTINA CONTESTO MOVWF STATUS SWAPF SAVE_W SWAPF SAVE_W,0 RETFIE ;***********************RISPOSTA INTERRUPT SYTE PLAYER SYTE_PLAYER MOVLW 1 MOVWF FLAG_SYTE BCF INTCON,1 SWAPF SAVE_S,0 MOVWF STATUS SWAPF SAVE_W SWAPF SAVE_W,0 RETFIE END ;AZZERA FLAG INTERRUPT DA SYTE PLAYER ;RIPRISTINA CONTESTO Collaudo Con un multimetro abbiamo collaudato l’alimentatore misurando le tensioni fornite di ±5V. Alimentata la scheda senza PIC e modulo siteplayer, abbiamo verificato il funzionamento del circuito di condizionamento misurando la tensione sul pin 2 dello zoccolo che corrisponde all’ingresso analogico del PIC. Toccando il sensore di temperatura abbiamo verificato se la tensione variava. Abbiamo poi proceduto ad una grossolana taratura del circuito di condizionamento; poiché, come detto in precedenza, a 48 gradi centigradi deve corrispondere una tensione in uscita di 5 volt, stimata la temperatura ambiente intorno ai 25 gradi, abbiamo agito sul trimmer fino ad avere una tensione di circa 2.5volt. Siamo poi passati alla programmazione del PIC e al suo inserimento nella scheda. Abbiamo così potuto verificare: a) se al reset le periferiche sono OFF e lo stato dell’impianto in condizioni di controllo manuale. b) Se il display visualizza i dati correttamente ( agendo anche sul trimmer della retro illuminazione ) 31 c) Agendo sul trimmer del circuito di condizionamento, e con l’ausilio di in termometro di precisione, si è potuto tarare in modo preciso il sistema di misura. d) Se la funzione dei vari pulsanti corrisponde alle specifiche richieste Naturalmente è stato necessario apportare numerose correzioni al software e quindi programmare diverse volte il PIC. Tutto ciò potrebbe essere evitato disponendo di un emulatore di cui la scuola non dispone. Una volta che la scheda funzionava correttamente abbiamo inserito il modulo e proceduto a caricare la pagina web secondo questa procedura: a) Tramite un cavo UTP incrociato, abbiamo collegato il connettore RJ45 del circuito realizzato, alla scheda di rete di un PC portatile opportunamente configurato nel protocollo TCP/IP vale a dire con indirizzo di rete di classe C (192.168.0.5 ) e subnet mask 255.255.255.0 . Naturalmente sul PC era stato caricato il programma linker. b) abbiamo verificato se collegando il cavo il diodo led segnalava il collegamento alla “rete”. c) Mediante il programma linker abbiamo scaricato nel modulo la pagina web. d) avviato il browser Internet Explorer , abbiamo digitato sulla barra URL l’indirizzo IP del server web verificando se il modulo inviava la pagina. e) Abbiamo poi proceduto alla verifica di tutte le specifiche richieste come ad esempio l’impostazione della temperatura agendo sulla casella di selezione, se agendo da locale la pagina veniva modificata ecc. Naturalmente anche in questo caso abbiamo dovuto correggere il programma e riprogrammare il PIC fino alla messa a punto definitiva del sistema. Infine abbiamo modificato l’indirizzo IP del modulo adattandolo a quello della rete interna della scuola ( indirizzo privato di classe B ) e collegato la scheda ad un cavo UTP dello switch del laboratorio di TDP1. Abbiamo così potuto verificare la possibilità di visualizzare la pagina Web da un qualsiasi PC del laboratorio. 32 Elenco del software utilizzato MPLAB PROGETTAZIONE SOFTWARE MICROCONTROLLORE PIC 16F877 SITELINKER LINKER PER MODULO SITEPLAYER EAGLE PROGETTAZIONE HARDWARE PSTARTER PROGETTAZIONE IMMAGINI PAGINA WEB WINWORD STESURA RELAZIONE WORDPAD PROGETTAZIONE PAGINA WEB Silvio Strafella _________________________ Luigi Baù ______________________________ Lancenigo di Villorba (TV) __________________________ 33